This file is a merged representation of the entire codebase, combined into a single document by Repomix.
The content has been processed where content has been compressed (code blocks are separated by ⋮---- delimiter).

# File Summary

## Purpose
This file contains a packed representation of the entire repository's contents.
It is designed to be easily consumable by AI systems for analysis, code review,
or other automated processes.

## File Format
The content is organized as follows:
1. This summary section
2. Repository information
3. Directory structure
4. Repository files (if enabled)
5. Multiple file entries, each consisting of:
  a. A header with the file path (## File: path/to/file)
  b. The full contents of the file in a code block

## Usage Guidelines
- This file should be treated as read-only. Any changes should be made to the
  original repository files, not this packed version.
- When processing this file, use the file path to distinguish
  between different files in the repository.
- Be aware that this file may contain sensitive information. Handle it with
  the same level of security as you would the original repository.

## Notes
- Some files may have been excluded based on .gitignore rules and Repomix's configuration
- Binary files are not included in this packed representation. Please refer to the Repository Structure section for a complete list of file paths, including binary files
- Files matching patterns in .gitignore are excluded
- Files matching default ignore patterns are excluded
- Content has been compressed - code blocks are separated by ⋮---- delimiter
- Files are sorted by Git change count (files with more changes are at the bottom)

# Directory Structure
```
.claude/
  skills/
    audit-extractor/
      SKILL.md
    integration-test-writer/
      SKILL.md
    interface-lint/
      SKILL.md
    unit-test-writer/
      SKILL.md
.devcontainer/
  devcontainer.json
  Dockerfile
  install.sh
.github/
  configs/
    solhint.json
    storage-diff.json
    typos-cli.toml
  ISSUE_TEMPLATE/
    bug_report.md
    design.md
    feature_request.md
    implement.md
    research.md
    task.md
    test_implementation.md
  workflows/
    automation.yml
    certora-prover.yml
    checks.yml
    claude-code-review.yml
    foundry-post-merge.yml
    foundry.yml
    remove-stale-branches.yml
    validate-deployment-scripts.yml
  labeler.yml
  pull_request_template.md
bin/
  compile-bindings.sh
  install-deps.sh
  pre-commit.sh
  source-env.sh
  storage-diff.sh
  storage-report.sh
certora/
  .bin/
    verify.sh
  confs/
    core/
      AllocationManager.conf
      AllocationManagerOverslashing.conf
      AllocationManagerSanity.conf
      AllocationManagerValidState.conf
      DelegationManager.conf
      DelegationManagerValidState.conf
      StrategyManager.conf
    multichain/
      BaseConfForInheritance.conf
      BN254CertificateVerifier.conf
      CrossChainRegistry.conf
      ECDSACertificateVerifier.conf
      KeyRegistrar.conf
      OperatorTableUpdater.conf
    permissions/
      Pausable.conf
    pods/
      EigenPod.conf
      EigenPodManagerRules.conf
    strategies/
      StrategyBase.conf
  harnesses/
    AllocationManagerHarness.sol
    CrossChainRegistryHarness.sol
    DelegationManagerHarness.sol
    EigenPodHarness.sol
    EigenPodManagerHarness.sol
    KeyRegistrarHarness.sol
    OperatorSetHelper.sol
    OperatorTableUpdaterHarness.sol
    PausableHarness.sol
    ShortStringsUpgradeableHarness.sol
    StrategyManagerHarness.sol
    StructuredLinkedListHarness.sol
  mocks/
    CertoraAVSRegistrar.sol
  patches/
    AllocationManager.patch
    SplitContractMixin.patch
  scripts/
    patches/
      patch.sh
      unpatch.sh
    pods/
      verifyEigenPod.sh
      verifyEigenPodManager.sh
  specs/
    core/
      AllocationManagerRules.spec
      AllocationManagerSanity.spec
      AllocationManagerValidState.spec
      DelegationManager.spec
      DelegationManagerValidState.spec
      Slasher.spec
      StrategyManager.spec
    libraries/
      BN254-nondet.spec
      SlashingLib.spec
      StructuredLinkedList.spec
    multichain/
      BN254CertificateVerifier.spec
      CrossChainRegistry.spec
      ECDSACertificateVerifier.spec
      EnumerableSet.spec
      OperatorTableUpdater.spec
    permissions/
      KeyRegistrar.spec
      Pausable.spec
    pods/
      EigenPod.spec
      EigenPodManager.spec
      EigenPodManagerRules.spec
    strategies/
      StrategyBase.spec
    erc20cvl.spec
    Merkle.spec
    optimizations.spec
    ptaHelpers.spec
CHANGELOG/
  CHANGELOG-1.5.0.md
  CHANGELOG-1.6.0.md
  CHANGELOG-1.6.1.md
  CHANGELOG-1.7.0.md
  CHANGELOG-1.8.0-all.md
  CHANGELOG-1.8.0.md
  CHANGELOG-1.8.1.md
  CHANGELOG-1.9.0.md
  CHANGELOG-template.md
docs/
  avs/
    task/
      TaskMailbox.md
  core/
    accounting/
      DualSlashingEdgeCase.md
      SharesAccounting.md
      SharesAccountingEdgeCases.md
      StrategyBaseAccounting.md
    libraries/
      Merkle.md
    AllocationManager.md
    AVSDirectory.md
    DelegationManager.md
    DurationVaultStrategy.md
    EigenPod.md
    EigenPodManager.md
    ProtocolRegistry.md
    ReleaseManager.md
    RewardsCoordinator.md
    StrategyManager.md
  experimental/
    AVS-Guide.md
  images/
    Staker Flow Diagrams/
      diagrams.excalidraw
  multichain/
    destination/
      CertificateVerifier.md
      OperatorTableUpdater.md
    source/
      CrossChainRegistry.md
    README.md
  permissions/
    KeyRegistrar.md
    PermissionController.md
  README.md
pkg/
  bindings/
    AllocationManager/
      binding.go
    AllocationManagerStorage/
      binding.go
    AllocationManagerView/
      binding.go
    AVSDirectory/
      binding.go
    AVSDirectoryStorage/
      binding.go
    BackingEigen/
      binding.go
    BeaconChainProofs/
      binding.go
    BN254/
      binding.go
    BN254CertificateVerifier/
      binding.go
    BN254CertificateVerifierStorage/
      binding.go
    BN254SignatureVerifier/
      binding.go
    BytesLib/
      binding.go
    CrossChainRegistry/
      binding.go
    CrossChainRegistryStorage/
      binding.go
    DelegationManager/
      binding.go
    DelegationManagerStorage/
      binding.go
    Deprecated_OwnableUpgradeable/
      binding.go
    DurationVaultStrategy/
      binding.go
    DurationVaultStrategyStorage/
      binding.go
    ECDSACertificateVerifier/
      binding.go
    ECDSACertificateVerifierStorage/
      binding.go
    Eigen/
      binding.go
    EigenPod/
      binding.go
    EigenPodManager/
      binding.go
    EigenPodManagerStorage/
      binding.go
    EigenPodPausingConstants/
      binding.go
    EigenPodStorage/
      binding.go
    EigenStrategy/
      binding.go
    EmissionsController/
      binding.go
    EmissionsControllerStorage/
      binding.go
    Endian/
      binding.go
    IAllocationManager/
      binding.go
    IAVSDirectory/
      binding.go
    IAVSRegistrar/
      binding.go
    IAVSTaskHook/
      binding.go
    IBackingEigen/
      binding.go
    IBaseCertificateVerifier/
      binding.go
    IBN254CertificateVerifier/
      binding.go
    ICrossChainRegistry/
      binding.go
    IDelegationManager/
      binding.go
    IDurationVaultStrategy/
      binding.go
    IECDSACertificateVerifier/
      binding.go
    IEigen/
      binding.go
    IEigenPod/
      binding.go
    IEigenPodManager/
      binding.go
    IEmissionsController/
      binding.go
    IETHPOSDeposit/
      binding.go
    IKeyRegistrar/
      binding.go
    IOperatorTableCalculator/
      binding.go
    IOperatorTableUpdater/
      binding.go
    IPausable/
      binding.go
    IPauserRegistry/
      binding.go
    IPermissionController/
      binding.go
    IProtocolRegistry/
      binding.go
    IProxyAdmin/
      binding.go
    IReleaseManager/
      binding.go
    IRewardsCoordinator/
      binding.go
    ISemVerMixin/
      binding.go
    IShareManager/
      binding.go
    ISignatureUtils/
      binding.go
    ISignatureUtilsMixin/
      binding.go
    ISlashEscrow/
      binding.go
    ISlashEscrowFactory/
      binding.go
    IStrategy/
      binding.go
    IStrategyFactory/
      binding.go
    IStrategyManager/
      binding.go
    ITaskMailbox/
      binding.go
    KeyRegistrar/
      binding.go
    KeyRegistrarStorage/
      binding.go
    LeafCalculatorMixin/
      binding.go
    Merkle/
      binding.go
    OperatorSetLib/
      binding.go
    OperatorTableUpdater/
      binding.go
    OperatorTableUpdaterStorage/
      binding.go
    Pausable/
      binding.go
    PauserRegistry/
      binding.go
    PermissionController/
      binding.go
    PermissionControllerMixin/
      binding.go
    PermissionControllerStorage/
      binding.go
    ProtocolRegistry/
      binding.go
    ProtocolRegistryStorage/
      binding.go
    ReleaseManager/
      binding.go
    ReleaseManagerStorage/
      binding.go
    RewardsCoordinator/
      binding.go
    RewardsCoordinatorStorage/
      binding.go
    SemVerMixin/
      binding.go
    SignatureUtils/
      binding.go
    SignatureUtilsMixin/
      binding.go
    SlashEscrow/
      binding.go
    SlashEscrowFactory/
      binding.go
    SlashEscrowFactoryStorage/
      binding.go
    SlashingLib/
      binding.go
    SplitContractMixin/
      binding.go
    StrategyBase/
      binding.go
    StrategyBaseTVLLimits/
      binding.go
    StrategyFactory/
      binding.go
    StrategyFactoryStorage/
      binding.go
    StrategyManager/
      binding.go
    StrategyManagerStorage/
      binding.go
    TaskMailbox/
      binding.go
    TaskMailboxStorage/
      binding.go
script/
  configs/
    devnet/
      deploy_from_scratch.anvil.config.json
      deploy_from_scratch.holesky.config.json
      deploy_from_scratch.holesky.slashing.config.json
    local/
      deploy_from_scratch.slashing.anvil.config.json
    mainnet/
      mainnet-addresses.config.json
    mainnet.json
    zipzoop.json
  deploy/
    devnet/
      deploy_from_scratch.s.sol
    local/
      deploy_from_scratch.slashing.s.sol
    multichain/
      .gitignore
      create_generator_config.s.sol
      deploy_generator.s.sol.sol
  interfaces/
    IUpgradeableBeacon.sol
  operations/
    e2e/
      ClaimRewards.s.sol
      DurationVaultHoodiE2E.s.sol
      MockAVSRegistrar.sol
      README.md
    update-generator/
      1-updateGenerator.s.sol
      README.md
      upgrade.json
    README.md
  releases/
    v1.12.0-incentive-council/
      1-deployImplementations.s.sol
      2-queueUpgrade.s.sol
      3-completeUpgrade.s.sol
      upgrade.json
    CoreContractsDeployer.sol
    CoreUpgradeQueueBuilder.sol
    CrosschainDeployLib.sol
    Env.sol
    README.md
    TestUtils.sol
  tasks/
    allocate_operatorSet.s.sol
    complete_withdrawal_from_strategy.s.sol
    deposit_into_strategy.s.sol
    README.md
    register_as_operator.s.sol
    register_operator_to_operatorSet.s.sol
    run.sh
    slash_operatorSet.s.sol
    unpause_avsDirectory.s.sol
    withdraw_from_strategy.s.sol
  utils/
    validateStorage/
      README.md
      validateStorage.ts
      validateUpgrade.sh
    ExistingDeploymentParser.sol
    multisend_tx_parser.py
  .gitignore
src/
  contracts/
    avs/
      task/
        TaskMailbox.sol
        TaskMailboxStorage.sol
    core/
      storage/
        AllocationManagerStorage.sol
        AVSDirectoryStorage.sol
        DelegationManagerStorage.sol
        EmissionsControllerStorage.sol
        ProtocolRegistryStorage.sol
        ReleaseManagerStorage.sol
        RewardsCoordinatorStorage.sol
        StrategyManagerStorage.sol
      AllocationManager.sol
      AllocationManagerView.sol
      AVSDirectory.sol
      DelegationManager.sol
      EmissionsController.sol
      ProtocolRegistry.sol
      ReleaseManager.sol
      RewardsCoordinator.sol
      StrategyManager.sol
    interfaces/
      IAllocationManager.sol
      IAVSDirectory.sol
      IAVSRegistrar.sol
      IAVSTaskHook.sol
      IBackingEigen.sol
      IBaseCertificateVerifier.sol
      IBN254CertificateVerifier.sol
      ICrossChainRegistry.sol
      IDelegationManager.sol
      IDurationVaultStrategy.sol
      IECDSACertificateVerifier.sol
      IEigen.sol
      IEigenPod.sol
      IEigenPodManager.sol
      IEmissionsController.sol
      IETHPOSDeposit.sol
      IKeyRegistrar.sol
      IOperatorTableCalculator.sol
      IOperatorTableUpdater.sol
      IPausable.sol
      IPauserRegistry.sol
      IPermissionController.sol
      IProtocolRegistry.sol
      IProxyAdmin.sol
      IReleaseManager.sol
      IRewardsCoordinator.sol
      ISemVerMixin.sol
      IShareManager.sol
      ISignatureUtilsMixin.sol
      IStrategy.sol
      IStrategyFactory.sol
      IStrategyManager.sol
      ITaskMailbox.sol
    libraries/
      BeaconChainProofs.sol
      BN254.sol
      BN254SignatureVerifier.sol
      Endian.sol
      Merkle.sol
      OperatorSetLib.sol
      SlashingLib.sol
      Snapshots.sol
    mixins/
      Deprecated_OwnableUpgradeable.sol
      LeafCalculatorMixin.sol
      PermissionControllerMixin.sol
      SemVerMixin.sol
      SignatureUtilsMixin.sol
      SplitContractMixin.sol
    multichain/
      BN254CertificateVerifier.sol
      BN254CertificateVerifierStorage.sol
      CrossChainRegistry.sol
      CrossChainRegistryStorage.sol
      ECDSACertificateVerifier.sol
      ECDSACertificateVerifierStorage.sol
      OperatorTableUpdater.sol
      OperatorTableUpdaterStorage.sol
    permissions/
      KeyRegistrar.sol
      KeyRegistrarStorage.sol
      Pausable.sol
      PauserRegistry.sol
      PermissionController.sol
      PermissionControllerStorage.sol
    pods/
      EigenPod.sol
      EigenPodManager.sol
      EigenPodManagerStorage.sol
      EigenPodPausingConstants.sol
      EigenPodStorage.sol
    strategies/
      DurationVaultStrategy.sol
      DurationVaultStrategyStorage.sol
      EigenStrategy.sol
      StrategyBase.sol
      StrategyBaseTVLLimits.sol
      StrategyFactory.sol
      StrategyFactoryStorage.sol
    token/
      BackingEigen.sol
      Eigen.sol
  test/
    harnesses/
      AllocationManagerHarness.sol
      DelegationManagerHarness.sol
      EigenHarness.sol
      EigenPodHarness.sol
      EigenPodManagerWrapper.sol
      PausableHarness.sol
    integration/
      deprecatedInterfaces/
        mainnet/
          BeaconChainProofs.sol
          IAllocationManager.sol
          IBeaconChainOracle.sol
          IDelayedWithdrawalRouter.sol
          IDelegationManager.sol
          IEigenPod.sol
          IEigenPodManager.sol
          IStrategyManager.sol
      mocks/
        BeaconChainMock_Deneb.t.sol
        BeaconChainMock.t.sol
        EIP_4788_Oracle_Mock.t.sol
        EIP_7002_Mock.t.sol
        EIP_7251_Mock.t.sol
        LibProofGen.t.sol
        LibValidator.t.sol
      tests/
        eigenpod/
          FullySlashed_EigenPod.t.sol
          Pectra_Features.t.sol
          Register_Allocate_Slash_VerifyWC_.t.sol
          SlashBC_OneBCSF.t.sol
          Slashed_Eigenpod_BC.t.sol
          VerifyWC_StartCP_CompleteCP.t.sol
        upgrade/
          AllocationManagerUpgrade.t.sol
          README.md
          SlasherMigration.t.sol
          StrategyManagerHooksUpgrade.t.sol
          ZeroRegistrationDelay.t.sol
        ALM_Multi.t.sol
        ALM_RegisterAndModify.t.sol
        CrosschainDeployLib.t.sol
        Delegate_Deposit_Queue_Complete.t.sol
        Deposit_Delegate_Allocate_Slash_Queue_Redeposit.t.sol
        Deposit_Delegate_Queue_Complete.t.sol
        Deposit_Delegate_Redelegate_Complete.t.sol
        Deposit_Delegate_Undelegate_Complete.t.sol
        Deposit_Delegate_UpdateBalance.t.sol
        Deposit_Queue_Complete.t.sol
        Deposit_Register_QueueWithdrawal_Complete.t.sol
        DualSlashing.t.sol
        DurationVaultIntegration.t.sol
        EmissionsController_ReentrancyGrief.t.sol
        EmissionsController.t.sol
        FullySlashed_Operator.t.sol
        HighDSF_Multiple_Deposits.t.sol
        Multichain_Full_Flow.t.sol
        Multichain_Generation_Reservation_Removal.t.sol
        Multichain_Timing_Tests.t.sol
        Slashed_Eigenpod_AVS.t.sol
        SlashingWithdrawals.t.sol
        Timing.t.sol
      users/
        AVS.t.sol
        IncentiveCouncil.t.sol
        User.t.sol
      IntegrationBase.t.sol
      IntegrationChecks.t.sol
      IntegrationDeployer.t.sol
      MultichainIntegrationBase.t.sol
      MultichainIntegrationChecks.t.sol
      README.md
      TimeMachine.t.sol
      TypeImporter.t.sol
      UpgradeTest.t.sol
    mocks/
      AllocationManagerMock.sol
      AVSDirectoryMock.sol
      AVSTaskHookReentrantAttacker.sol
      BackingEigenMock.sol
      BN254CertificateVerifierMock.sol
      CrossChainRegistryMock.sol
      DelegationManagerMock.sol
      Dummy.sol
      ECDSACertificateVerifierMock.sol
      EigenMock.sol
      EigenPodManagerMock.sol
      EigenPodMock.sol
      EmptyContract.sol
      ERC20_OneWeiFeeOnTransfer.sol
      ERC20_SetTransferReverting_Mock.sol
      ERC20Mock.sol
      ETHDepositMock.sol
      LiquidStakingToken.sol
      MockAVSRegistrar.sol
      MockAVSTaskHook.sol
      MockBN254CertificateVerifier.sol
      MockBN254CertificateVerifierFailure.sol
      MockDecimals.sol
      MockECDSACertificateVerifier.sol
      MockECDSACertificateVerifierFailure.sol
      MockERC20.sol
      MockSimpleERC20.sol
      OperatorTableCalculatorMock.sol
      OperatorTableUpdaterMock.sol
      OwnableMock.sol
      Reenterer.sol
      Reverter.sol
      RewardsCoordinatorMock.sol
      StrategyFactoryMock.sol
      StrategyManagerMock.sol
    test-data/
      rewardsCoordinator/
        processClaim_Preprod_Test.json
        processClaimProofs_MaxEarnerAndLeafIndices.json
        processClaimProofs_Root1.json
        processClaimProofs_Root2.json
        processClaimProofs_Root3.json
        processClaimProofs_SingleEarnerLeaf.json
        processClaimProofs_SingleTokenLeaf.json
      slashedProofs/
        balanceUpdateProof_notOvercommitted_61511_incrementedBlockBy100.json
        balanceUpdateProof_notOvercommitted_61511.json
        balanceUpdateProof_Overcommitted_61511.json
      balanceUpdateProof_balance28ETH_302913.json
      balanceUpdateProof_notOverCommitted_302913_incrementedBlockBy100.json
      balanceUpdateProof_notOverCommitted_302913.json
      balanceUpdateProof_updated_to_0ETH_302913.json
      balanceUpdateProof_updated_to_30ETH_302913.json
      fullWithdrawalCapellaAgainstDenebRoot.json
      fullWithdrawalDeneb.json
      fullWithdrawalProof_Latest_1SlotAdvanced.json
      fullWithdrawalProof_Latest_28ETH.json
      fullWithdrawalProof_Latest.json
      operators.json
      owners.json
      partialWithdrawalProof_Latest.json
      reputedOwners.json
      withdrawal_credential_proof_302913_30ETHBalance.json
      withdrawal_credential_proof_302913_exited.json
      withdrawal_credential_proof_302913.json
      withdrawal_credential_proof_510257.json
      withdrawalCredentialAndBalanceProof_61068.json
      withdrawalCredentialAndBalanceProof_61336.json
    token/
      bEIGEN.t.sol
      EigenTransferRestrictions.t.sol
      EigenWrapping.t.sol
    tree/
      AllocationManagerUnit.tree
      BN254CertificateVerifier.tree
      CrossChainRegistry.tree
      DelegationManagerUnit.tree
      ECDSACertificateVerifierUnit.tree
      EigenPodManagerUnit.tree
      EigenPodUnit.tree
      KeyRegistrar.tree
      OperatorTableUpdaterUnit.tree
      PermissionControllerUnit.tree
      StrategyManagerUnit.tree
    unit/
      libraries/
        BytesLibUnit.t.sol
        SlashingLibUnit.t.sol
        SnapshotsUnit.t.sol
      mixins/
        SemVerMixin.t.sol
        SignatureUtilsUnit.t.sol
      AllocationManagerUnit.t.sol
      AVSDirectoryUnit.t.sol
      BN254CertificateVerifierUnit.t.sol
      CrossChainRegistryUnit.t.sol
      DelegationUnit.t.sol
      DeployFromScratch.t.sol
      DurationVaultStrategyUnit.t.sol
      ECDSACertificateVerifierUnit.t.sol
      EigenPodManagerUnit.t.sol
      EigenPodUnit.t.sol
      EmissionsControllerUnit.t.sol
      KeyRegistrarUnit.t.sol
      OperatorTableUpdaterUnit.t.sol
      PausableUnit.t.sol
      PauserRegistryUnit.t.sol
      PermissionControllerUnit.t.sol
      ProtocolRegistryUnit.t.sol
      ReleaseManagerUnit.t.sol
      RewardsCoordinatorUnit.t.sol
      SplitContractMixin.t.sol
      StrategyBaseTVLLimitsUnit.sol
      StrategyBaseUnit.t.sol
      StrategyFactoryUnit.t.sol
      StrategyManagerDurationUnit.t.sol
      StrategyManagerUnit.t.sol
      TaskMailboxUnit.t.sol
    utils/
      ArrayLib.sol
      BN256G2.sol
      BytesLib.sol
      EigenLayerMultichainUnitTestSetup.sol
      EigenLayerUnitTestSetup.sol
      EigenPodUser.t.sol
      g2mul.go
      Logger.t.sol
      OperatorWalletLib.sol
      ProofParsing.sol
      Random.sol
    DevnetLifecycle.t.sol
    TestConstants.sol
.dockerignore
.env.example
.gitattributes
.gitignore
.gitmodules
.zeus
CLAUDE.md
CONTRIBUTING.md
Dockerfile
foundry.toml
go.mod
LICENSE
MAINTENANCE.md
Makefile
mythril.config.json
package.json
README.md
slither.config.json
```

# Files

## File: .claude/skills/audit-extractor/SKILL.md
````markdown
---
name: audit-extractor
description: Extract findings from PDF audit reports and convert them to a markdown checklist. Use when the user asks to process an audit report, extract audit findings, or create an audit action items list. (project)
allowed-tools: Read, Write
---

# Audit Extractor

Extract findings from PDF security audit reports and convert them to a structured markdown checklist for tracking remediation.

## Overview

This skill processes PDF audit reports (from firms like Certora, Sigma Prime, Cantina, etc.) and extracts:
- Finding ID (e.g., C-01, H-01, M-01, L-01, I-01)
- Title/Description
- Severity (Critical, High, Medium, Low, Informational)
- Status (Fixed, Partially fixed, Awaiting Fix, Acknowledged, Disregarded, Pending)
- Impact and Likelihood (when available)
- Detailed descriptions and recommendations

## How to Extract Findings

### Step 1: Read the PDF directly

Use the Read tool to read the PDF file. Claude can natively read and understand PDF documents:

```
Read the PDF file at: <pdf_path>
```

### Step 2: Parse the audit content

After reading the PDF, manually extract findings by looking for:

1. **Summary/Findings Table** - Usually contains:
   - Finding IDs (patterns like C-01, H-01, M-01, L-01, I-01)
   - Titles
   - Severity levels
   - Status

2. **Detailed Finding Sections** - Usually organized by PR or category, containing:
   - Full descriptions
   - Code snippets
   - Exploit scenarios
   - Recommendations
   - Customer response / Fix review status

3. **Severity Information** - Look for:
   - Impact (High, Medium, Low)
   - Likelihood (High, Medium, Low)

### Step 3: Generate the markdown output

Create a markdown file with the following structure:

```markdown
# Audit Findings: [Audit Name]

**Auditor:** [Auditor Name]
**Date:** [Date]
**Status:** [Draft/Final]
**Total findings:** [Count]

## Summary

| Severity | Discovered | Confirmed | Fixed |
|----------|------------|-----------|-------|
| Critical | X | | |
| High | X | | |
| Medium | X | | |
| Low | X | | |
| Informational | X | | |
| **Total** | **X** | | |

## Action Required (X items pending)

- [ ] **M-01** (Medium): [Title]
- [ ] **L-01** (Low): [Title]

---

## All Findings

### ([PR/Category Name])

#### [ID]. [Title]
| Severity | Impact | Likelihood | Status |
|----------|--------|------------|--------|
| [Severity] | [Impact] | [Likelihood] | [Status] |

**Files:** `[filename.sol]`

**Description:** [Full description]

**Recommendation:** [Recommendation text]

---
```

### Step 4: Save the output

Use the Write tool to save the markdown file:
- Save to `audits/[Audit-Name]-Findings.md`

## Output Format Guidelines

### Severity Levels
- **Critical** - Direct loss of funds or complete protocol compromise
- **High** - Significant impact on protocol security or functionality
- **Medium** - Moderate impact, potential for exploitation under certain conditions
- **Low** - Minor issues, best practice violations
- **Informational** - Code quality, gas optimizations, documentation

### Status Values
- **Fixed** - Issue has been resolved
- **Partially fixed** - Issue has been partially addressed
- **Awaiting Fix** - Issue acknowledged, fix pending
- **Acknowledged** - Issue acknowledged, may not be fixed
- **Pending** - Awaiting customer response
- **Disregarded** - Issue will not be fixed (by design)

### Checklist Rules
- Use `[ ]` for unresolved items (Pending, Awaiting Fix, Partially fixed)
- Use `[x]` for resolved items (Fixed, Acknowledged, Disregarded)

## Audit Files Location

Audit reports are typically stored in: `audits/`

## Example Extraction

Given a PDF with findings like:

```
M-01 MigrateSlashers may assign incompatible slasher | Medium | Pending
L-01 Instant slasher setting leaves stale field | Low | Pending
I-01 getSlasher is implemented twice | Informational | Pending
```

Generate:

```markdown
# Audit Findings: EigenLayer - Slashing UX Improvements

**Auditor:** Certora
**Date:** December 2025
**Total findings:** 3

## Summary

| Severity | Count |
|----------|-------|
| Medium | 1 |
| Low | 1 |
| Informational | 1 |

## Action Required (2 items)

- [ ] **M-01** (Medium): MigrateSlashers may assign incompatible slasher
- [ ] **L-01** (Low): Instant slasher setting leaves stale field

## All Findings

### Medium (1)

#### M-01. MigrateSlashers may assign an incompatible slasher address
| Severity | Impact | Likelihood | Status |
|----------|--------|------------|--------|
| Medium | High | Low | Pending |

**Description:** [Full description from PDF]

**Recommendation:** [Recommendation from PDF]

---

### Low (1)

#### L-01. Instant slasher setting leaves stale slasher field in storage
| Severity | Impact | Likelihood | Status |
|----------|--------|------------|--------|
| Low | Low | Low | Pending |

**Description:** [Full description from PDF]

**Recommendation:** [Recommendation from PDF]

---

### Informational (1)

#### I-01. getSlasher is implemented twice
| Severity | Status |
|----------|--------|
| Informational | Pending |

**Description:** [Full description from PDF]

**Recommendation:** [Recommendation from PDF]
```

## Troubleshooting

### PDF won't read
- Ensure the file path is correct and the file exists
- Check if the PDF is password protected (not supported)

### Missing findings
- Some PDFs have findings spread across multiple sections
- Check the Table of Contents for finding locations
- Look for "Detailed Findings" or similar sections

### Inconsistent formatting
- Different audit firms use different formats
- Adapt the markdown structure to match the source format
- Preserve all relevant information even if structure differs
````

## File: .claude/skills/integration-test-writer/SKILL.md
````markdown
---
name: integration-test-writer
description: Write Solidity integration tests for EigenLayer contracts. Use when the user asks to write integration tests, test user flows, test cross-contract interactions, or test upgrade scenarios. Follows project conventions with User/AVS actors and numbered action steps.
allowed-tools: Read, Glob, Grep, Edit, Write, Bash(forge:*)
---

# Integration Test Writer

Write comprehensive integration tests for EigenLayer Solidity contracts following the project's established conventions.

## Overview

Integration tests orchestrate the deployment of all EigenLayer core contracts to test high-level user flows across multiple contracts. There are three test modes:

1. **Local Integration Tests** - Deploy fresh contracts and test user flows
2. **Fork Tests** - Fork mainnet, upgrade all contracts to latest implementations, then run the integration test suite
3. **Upgrade Tests** - Fork mainnet, perform actions on OLD contracts, then upgrade and verify compatibility

## Test Function Signature

**All integration test functions MUST:**
1. Be named `testFuzz_action1_action2_...` describing the flow
2. Take `uint24 _random` (or `_r`) as the only parameter - this seeds randomness
3. Use the `rand(_random)` modifier to initialize the random seed

```solidity
function testFuzz_deposit_delegate_queue_complete(uint24 _random) public rand(_random) {
    // Test implementation
}
```

The `rand()` modifier initializes the test's random seed, which is used by helper functions like `_newRandomStaker()` to generate deterministic random values for reproducible tests.

## Test File Locations

| Type | Location |
|------|----------|
| Normal integration tests | `src/test/integration/tests/` |
| Upgrade tests | `src/test/integration/tests/upgrade/` |
| Check functions | `src/test/integration/IntegrationChecks.t.sol` |
| Multichain checks | `src/test/integration/MultichainIntegrationChecks.t.sol` |

## Core Principles

### 1. All Actions Must Be Called Through User Contracts

Never call contracts directly. Use the `User` or `AVS` actor contracts:

```solidity
// ✅ CORRECT - Actions through User/AVS
staker.depositIntoEigenlayer(strategies, tokenBalances);
operator.delegateTo(operator);
avs.createOperatorSet(strategies);

// ❌ WRONG - Direct contract calls
strategyManager.depositIntoStrategy(...);
delegationManager.delegateTo(...);
```

### 2. Every Action Must Be Followed By a Check

After each numbered action, verify state changes using `check_*` functions from `IntegrationChecks.t.sol`:

```solidity
// 1. Deposit Into Strategies
staker.depositIntoEigenlayer(strategies, tokenBalances);
check_Deposit_State(staker, strategies, shares);

// 2. Delegate to an operator
staker.delegateTo(operator);
check_Delegation_State(staker, operator, strategies, shares);
```

### 3. Actions Must Be Numbered

Use comments to number each action step for clarity:

```solidity
// 1. Deposit Into Strategies
staker.depositIntoEigenlayer(strategies, tokenBalances);
check_Deposit_State(staker, strategies, shares);

// 2. Delegate to an operator
staker.delegateTo(operator);
check_Delegation_State(staker, operator, strategies, shares);

// 3. Queue Withdrawals
Withdrawal[] memory withdrawals = staker.queueWithdrawals(strategies, shares);
check_QueuedWithdrawal_State(staker, operator, strategies, shares, withdrawableShares, withdrawals, withdrawalRoots);
```

## User Types

### `User` (Staker/Operator)

Located in `src/test/integration/users/User.t.sol`. A `User` can act as both a staker AND an operator.

**Key methods:**
- `depositIntoEigenlayer(strategies, tokenBalances)` - Deposit tokens
- `delegateTo(operator)` - Delegate to an operator
- `registerAsOperator()` - Register as an operator
- `queueWithdrawals(strategies, shares)` - Queue withdrawals
- `completeWithdrawalAsTokens(withdrawal)` / `completeWithdrawalAsShares(withdrawal)` - Complete withdrawals
- `registerForOperatorSet(operatorSet)` - Register for an operator set
- `modifyAllocations(params)` - Allocate magnitude to operator sets
- `startValidators()` / `verifyWithdrawalCredentials(validators)` - Native ETH staking
- `startCheckpoint()` / `completeCheckpoint()` - Checkpoint EigenPod

### `AVS`

Located in `src/test/integration/users/AVS.t.sol`. Represents an AVS that creates operator sets and slashes operators.

**Key methods:**
- `createOperatorSet(strategies)` - Create an operator set
- `createRedistributingOperatorSets(strategies, recipients)` - Create redistributing operator sets
- `slashOperator(params)` - Slash an operator
- `updateSlasher(operatorSetId, slasher)` - Update the slasher for an operator set

## Test Structure

### Normal Integration Test

```solidity
// SPDX-License-Identifier: BUSL-1.1
pragma solidity ^0.8.27;

import "src/test/integration/IntegrationChecks.t.sol";

/// @notice Base contract for shared setup across test variants
contract Integration_FlowName_Base is IntegrationCheckUtils {
    using ArrayLib for *;

    // Declare state used across tests
    AVS avs;
    OperatorSet operatorSet;
    User operator;
    User staker;
    IStrategy[] strategies;
    uint[] initTokenBalances;
    uint[] initDepositShares;

    /// @dev Setup state used across all test functions
    function _init() internal virtual override {
        _configAssetTypes(HOLDS_LST | HOLDS_ETH); // Configure asset types

        // Create actors
        (staker, strategies, initTokenBalances) = _newRandomStaker();
        (operator,,) = _newRandomOperator();
        (avs,) = _newRandomAVS();

        // 1. Deposit into strategies
        staker.depositIntoEigenlayer(strategies, initTokenBalances);
        initDepositShares = _calculateExpectedShares(strategies, initTokenBalances);
        check_Deposit_State(staker, strategies, initDepositShares);

        // 2. Delegate staker to operator
        staker.delegateTo(operator);
        check_Delegation_State(staker, operator, strategies, initDepositShares);

        // 3. Create operator set and register
        operatorSet = avs.createOperatorSet(strategies);
        operator.registerForOperatorSet(operatorSet);
        check_Registration_State_NoAllocation(operator, operatorSet, allStrats);
    }
}

/// @notice Test contract for specific flow variant
contract Integration_FlowName_Variant is Integration_FlowName_Base {
    /// @dev All test functions must:
    /// 1. Be named testFuzz_action1_action2_...
    /// 2. Take uint24 _r as parameter (seeds randomness)
    /// 3. Use rand(_r) modifier
    function testFuzz_action1_action2(uint24 _r) public rand(_r) {
        // 4. Next action
        // ... action ...
        // ... check ...

        // 5. Another action
        // ... action ...
        // ... check ...
    }
}
```

### Upgrade Test

Upgrade tests verify that upgrades correctly handle pre-upgrade state.

```solidity
// SPDX-License-Identifier: BUSL-1.1
pragma solidity ^0.8.27;

import "src/test/integration/UpgradeTest.t.sol";

contract Integration_Upgrade_FeatureName is UpgradeTest {
    User staker;
    IStrategy[] strategies;
    uint[] tokenBalances;

    function _init() internal override {
        // Pre-upgrade setup - NO check_ functions here!
        (staker, strategies, tokenBalances) = _newRandomStaker();
        staker.depositIntoEigenlayer(strategies, tokenBalances);
        // ... more pre-upgrade actions WITHOUT checks
    }

    function testFuzz_upgrade_scenario(uint24 _r) public rand(_r) {
        /// Pre-upgrade actions (no checks - old contracts)
        Withdrawal[] memory withdrawals = staker.queueWithdrawals(strategies, shares);

        /// Upgrade to new contracts
        _upgradeEigenLayerContracts();

        /// Post-upgrade actions WITH checks
        _rollBlocksForCompleteWithdrawals(withdrawals);
        for (uint i = 0; i < withdrawals.length; i++) {
            staker.completeWithdrawalAsShares(withdrawals[i]);
            check_Withdrawal_AsShares_State(staker, operator, withdrawals[i], strategies, shares);
        }
    }
}
```

**Important for Upgrade Tests:**
- Pre-upgrade actions should NOT have `check_*` functions (old contracts have different invariants)
- Call `_upgradeEigenLayerContracts()` to upgrade to new contracts
- Post-upgrade actions SHOULD have `check_*` functions
- Only run on mainnet forks: `env FOUNDRY_PROFILE=forktest forge t --mc Integration_Upgrade`

## Check Functions

All state verification should be in `IntegrationChecks.t.sol`. There are two types:

### 1. `check_*` Functions

High-level state checks that verify multiple invariants after an action:

```solidity
check_Deposit_State(staker, strategies, shares);
check_Delegation_State(staker, operator, strategies, shares);
check_QueuedWithdrawal_State(staker, operator, strategies, shares, withdrawableShares, withdrawals, withdrawalRoots);
check_Withdrawal_AsTokens_State(staker, operator, withdrawal, strategies, shares, tokens, expectedTokens);
```

### 2. `assert_Snap_*` Functions

Time-machine assertions that compare state before/after an action:

```solidity
assert_Snap_Added_Staker_DepositShares(staker, strategy, amount, "error message");
assert_Snap_Removed_Staker_WithdrawableShares(staker, strategy, amount, "error message");
assert_Snap_Unchanged_Staker_DepositShares(staker, "error message");
```

### Adding New Checks

If a check doesn't exist, add it to `IntegrationChecks.t.sol`:

```solidity
function check_NewAction_State(
    User staker,
    IStrategy[] memory strategies,
    uint[] memory expectedValues
) internal {
    // Use assert_Snap_* for before/after comparisons
    assert_Snap_Added_Staker_DepositShares(
        staker, strategies[0], expectedValues[0], "should have added shares"
    );
    
    // Or use regular assertions for absolute checks
    assertEq(
        someContract.getValue(address(staker)),
        expectedValue,
        "value should match expected"
    );
}
```

## Randomness and Configuration

### The `rand(_r)` Modifier

Every test function takes a `uint24 _r` parameter and uses the `rand(_r)` modifier:

```solidity
function testFuzz_deposit_delegate(uint24 _r) public rand(_r) {
    // _r seeds all random generation in this test
    // This makes tests reproducible - same _r = same test execution
}
```

The `rand()` modifier initializes the random seed used by all `_newRandom*` helper functions. This ensures:
- **Reproducibility**: Same seed produces same random values
- **Fuzz coverage**: Foundry automatically runs with many different seeds

### Asset and User Type Configuration

Use `_configRand` or `_configAssetTypes` to control what types of users/assets are created:

```solidity
function testFuzz_example(uint24 _r) public rand(_r) {
    // Full configuration
    _configRand({
        _randomSeed: _r,
        _assetTypes: HOLDS_LST | HOLDS_ETH,
        _userTypes: DEFAULT | ALT_METHODS
    });
    
    // Or just configure asset types (simpler)
    _configAssetTypes(HOLDS_LST);
    
    // Create users - will use the configured randomization
    (User staker, IStrategy[] memory strategies, uint[] memory tokenBalances) = _newRandomStaker();
}
```

**Asset Types:**
- `HOLDS_LST` - User holds liquid staking tokens
- `HOLDS_ETH` - User holds native ETH (beacon chain)
- `HOLDS_ALL` - User holds both

**User Types:**
- `DEFAULT` - Standard User contract
- `ALT_METHODS` - User that uses alternative method signatures

## Helper Functions

Common helpers available in `IntegrationBase`:

```solidity
// Create actors
(User staker, IStrategy[] memory strategies, uint[] memory tokenBalances) = _newRandomStaker();
(User operator, IStrategy[] memory strategies, uint[] memory tokenBalances) = _newRandomOperator();
User operator = _newRandomOperator_NoAssets();
(AVS avs, OperatorSet[] memory operatorSets) = _newRandomAVS();

// Calculate expected values
uint[] memory shares = _calculateExpectedShares(strategies, tokenBalances);
uint[] memory tokens = _calculateExpectedTokens(strategies, shares);
uint[] memory withdrawableShares = _getStakerWithdrawableShares(staker, strategies);

// Generate params
AllocateParams memory params = _genAllocation_AllAvailable(operator, operatorSet);
SlashingParams memory slashParams = _genSlashing_Rand(operator, operatorSet);

// Time advancement
_rollBlocksForCompleteWithdrawals(withdrawals);
_rollBlocksForCompleteAllocation(operator, operatorSet, strategies);
_rollForward_AllocationConfigurationDelay();

// Get state
bytes32[] memory withdrawalRoots = _getWithdrawalHashes(withdrawals);
IERC20[] memory tokens = _getUnderlyingTokens(strategies);
```

## Running Tests

```bash
# Run all integration tests locally (fresh contract deployment)
forge t --mc Integration

# Run mainnet fork tests (upgrades mainnet contracts to latest, then runs tests)
# Requires RPC_MAINNET environment variable
env FOUNDRY_PROFILE=forktest forge t --mc Integration

# Run upgrade tests only (tests upgrade compatibility)
env FOUNDRY_PROFILE=forktest forge t --mc Integration_Upgrade

# Run specific test
forge t --match-test testFuzz_deposit_delegate

# Run with verbosity
forge t --mc Integration -vvv
```

### Fork Tests vs Local Tests

| Mode | Command | What Happens |
|------|---------|--------------|
| Local | `forge t --mc Integration` | Deploys fresh contracts, runs tests |
| Fork | `env FOUNDRY_PROFILE=forktest forge t --mc Integration` | Forks mainnet, upgrades ALL contracts to latest repo implementations, runs tests |
| Upgrade | `env FOUNDRY_PROFILE=forktest forge t --mc Integration_Upgrade` | Forks mainnet, runs pre-upgrade actions on OLD contracts, then upgrades and tests compatibility |

**Fork tests** ensure that the latest contract code works correctly when upgrading from the current mainnet state. The test framework automatically upgrades all proxy contracts to the latest implementations before running tests.

## Naming Conventions

### Contract Names

| Pattern | Purpose |
|---------|---------|
| `Integration_FlowName_Base` | Base contract with shared `_init()` setup |
| `Integration_FlowName_Variant` | Test contract for specific flow variant |
| `Integration_Upgrade_FeatureName` | Upgrade test for a feature |

### Test Function Names

All test functions follow the pattern: `testFuzz_action1_action2_...(uint24 _random) public rand(_random)`

| Example | Description |
|---------|-------------|
| `testFuzz_deposit_delegate_queue_completeAsTokens` | Deposit → Delegate → Queue → Complete as tokens |
| `testFuzz_deposit_delegate_undelegate` | Deposit → Delegate → Undelegate |
| `testFuzz_verifyWC_checkpoint_slash` | Verify withdrawal credentials → Checkpoint → Slash |
| `testFuzz_upgrade_migrate_slash` | Upgrade contracts → Migrate → Slash |

### Check/Assert Names

| Pattern | Purpose |
|---------|---------|
| `check_ActionName_State` | High-level check function in IntegrationChecks |
| `assert_Snap_Added_*` | Assert value increased from snapshot |
| `assert_Snap_Removed_*` | Assert value decreased from snapshot |
| `assert_Snap_Unchanged_*` | Assert value unchanged from snapshot |

## Checklist Before Writing Tests

1. Identify the user flow to test
2. Determine if it's a normal test or upgrade test
3. Identify all actors needed (stakers, operators, AVSs)
4. Plan the numbered action steps
5. Identify which `check_*` functions to use after each action
6. If checks don't exist, add them to `IntegrationChecks.t.sol`
7. Use appropriate asset/user type configuration

## Example: Complete Integration Test

Reference: `src/test/integration/tests/DualSlashing.t.sol`

This file demonstrates:
- Base contract with `_init()` for shared setup
- Multiple test contracts inheriting from base
- Numbered action steps
- `check_*` after every action
- Using both `User` and `AVS` actors
- Slashing and checkpoint flows
````

## File: .claude/skills/interface-lint/SKILL.md
````markdown
---
name: interface-lint
description: Format and lint Solidity interface files following EigenLayer conventions. Use when the user asks to format an interface, add documentation to an interface, or create a new interface. Ensures proper organization with Errors/Events/Types sub-interfaces.
allowed-tools: Read, Glob, Grep, Edit, Write, Bash(cast:*)
---

# Interface Lint

Format Solidity interface files following EigenLayer's established conventions for organization, documentation, and error code generation.

## Interface Structure

Every interface file should contain four interface contracts in this order:

1. **`I{ContractName}Errors`** - All custom errors
2. **`I{ContractName}Types`** - All structs and enums
3. **`I{ContractName}Events`** - All events (inherits Types for struct access)
4. **`I{ContractName}`** - Main interface (inherits Errors and Events)

```solidity
// SPDX-License-Identifier: BUSL-1.1
pragma solidity ^0.8.27;

// Imports

interface I{ContractName}Errors {
    // All errors with error codes
}

interface I{ContractName}Types {
    // All structs and enums
}

interface I{ContractName}Events is I{ContractName}Types {
    // All events
}

interface I{ContractName} is I{ContractName}Errors, I{ContractName}Events {
    // All function declarations
}
```

## Error Documentation

Each error MUST include:
1. `@notice` describing when the error is thrown
2. `@dev Error code: 0x...` with the 4-byte selector from `cast sig`

### Generating Error Codes

Use `cast sig` to generate the error code:

```bash
cast sig "InvalidOperatorSet()"
# Output: 0x7ec5c154
```

### Error Format

```solidity
interface IContractNameErrors {
    /// @notice Thrown when the operator set is not valid
    /// @dev Error code: 0x7ec5c154
    error InvalidOperatorSet();

    /// @notice Thrown when the chainId is invalid
    /// @dev Error code: 0x7a47c9a2
    error InvalidChainId();

    /// @notice Thrown when the key type is not set for the operatorSet
    /// @dev Error code: 0xe57cacbd
    /// @dev Additional context about why this is required
    error KeyTypeNotSet();
}
```

## Types Documentation

Each struct/enum MUST include:
1. `@notice` with a brief description
2. `@param` for each field in structs

```solidity
interface IContractNameTypes {
    /// @notice A per-operatorSet configuration struct
    /// @param owner the permissioned owner of the OperatorSet
    /// @param maxStalenessPeriod the maximum staleness period in seconds
    struct OperatorSetConfig {
        address owner;
        uint32 maxStalenessPeriod;
    }

    /// @notice Represents the status of an operator's registration
    /// @param registered Whether the operator is currently registered
    /// @param slashableUntil Block until which the operator remains slashable
    struct RegistrationStatus {
        bool registered;
        uint32 slashableUntil;
    }
}
```

## Event Documentation

Each event MUST include a singular `@notice` describing when the event is emitted:

```solidity
interface IContractNameEvents is IContractNameTypes {
    /// @notice Emitted when a generation reservation is created
    event GenerationReservationCreated(OperatorSet operatorSet);

    /// @notice Emitted when an operator set config is set
    event OperatorSetConfigSet(OperatorSet operatorSet, OperatorSetConfig config);

    /// @notice Emitted when a chainID is added to the whitelist
    event ChainIDAddedToWhitelist(uint256 chainID, address operatorTableUpdater);
}
```

## Function Documentation

Each function in the main interface MUST include:

1. `@notice` - What the function does
2. `@param` - Description for each parameter
3. `@return` - Description for each return value (for view functions)
4. `@dev` - Additional context (optional, but include caller requirements)
5. `@dev Reverts for:` - List ALL revert conditions
6. `@dev Emits the following events:` - List ALL events emitted

### Function Documentation Format

```solidity
interface IContractName is IContractNameErrors, IContractNameEvents {
    /// @notice Creates a generation reservation for cross-chain transport
    /// @param operatorSet the operatorSet to make a reservation for
    /// @param operatorTableCalculator the calculator contract address
    /// @param config the config containing owner and staleness period
    /// @dev msg.sender must be an authorized caller for operatorSet.avs
    /// @dev Reverts for:
    ///      - CurrentlyPaused: Generation reservations are paused
    ///      - InvalidPermissions: Caller is not authorized
    ///      - InvalidOperatorSet: The operatorSet does not exist
    ///      - GenerationReservationAlreadyExists: Reservation already exists
    ///      - InvalidStalenessPeriod: The maxStalenessPeriod is invalid
    /// @dev Emits the following events:
    ///      - GenerationReservationCreated: When the reservation is created
    ///      - OperatorTableCalculatorSet: When the calculator is set
    ///      - OperatorSetConfigSet: When the config is set
    function createGenerationReservation(
        OperatorSet calldata operatorSet,
        IOperatorTableCalculator operatorTableCalculator,
        OperatorSetConfig calldata config
    ) external;

    /// @notice Gets the operator set config
    /// @param operatorSet the operatorSet to query
    /// @return The OperatorSetConfig for the given operatorSet
    /// @dev You should check if an operatorSet has an active reservation first
    function getOperatorSetConfig(
        OperatorSet memory operatorSet
    ) external view returns (OperatorSetConfig memory);
}
```

## Revert Conditions Format

List each revert condition with the error name and when it occurs:

```solidity
/// @dev Reverts for:
///      - CurrentlyPaused: Generation reservations are paused
///      - InvalidPermissions: Caller is not an authorized caller for operatorSet.avs
///      - InvalidOperatorSet: The operatorSet does not exist in the AllocationManager
///      - GenerationReservationAlreadyExists: A generation reservation already exists
```

For Ownable errors, use the string format:
```solidity
/// @dev Reverts for:
///      - "Ownable: caller is not the owner": Caller is not the owner
```

## Events Emitted Format

List each event with a brief description of when it's emitted:

```solidity
/// @dev Emits the following events:
///      - GenerationReservationCreated: When the reservation is successfully created
///      - OperatorTableCalculatorSet: When the calculator is set for the operatorSet
///      - OperatorSetConfigSet: When the config is set for the operatorSet
```

## View Functions

View functions typically don't revert (except for input validation) and don't emit events. Document them simpler:

```solidity
/// @notice Gets the active generation reservations
/// @return An array of operatorSets with active generationReservations
function getActiveGenerationReservations() external view returns (OperatorSet[] memory);

/// @notice Gets reservations by range for pagination
/// @param startIndex the start index of the range, inclusive
/// @param endIndex the end index of the range, exclusive
/// @return An array of operatorSets in the specified range
/// @dev Reverts for:
///      - InvalidRange: startIndex is greater than endIndex
///      - InvalidEndIndex: endIndex exceeds array length
function getActiveGenerationReservationsByRange(
    uint256 startIndex,
    uint256 endIndex
) external view returns (OperatorSet[] memory);
```

## Complete Example

Reference: `src/contracts/interfaces/ICrossChainRegistry.sol`

This file demonstrates the full pattern with:
- Errors interface with `cast sig` error codes
- Types interface with documented structs
- Events interface inheriting Types
- Main interface with full function documentation

## Checklist for Linting an Interface

1. ☐ Split into Errors, Types, Events, and main interface contracts
2. ☐ Errors have `@notice` and `@dev Error code: 0x...` (use `cast sig`)
3. ☐ Types have `@notice` and `@param` for each field
4. ☐ Events have singular `@notice` describing when emitted
5. ☐ Events interface inherits Types interface
6. ☐ Main interface inherits Errors and Events interfaces
7. ☐ Functions have `@notice`, `@param`, and `@return` (for views)
8. ☐ Functions list ALL revert conditions under `@dev Reverts for:`
9. ☐ Functions list ALL events under `@dev Emits the following events:`
10. ☐ View functions document reverts only when they can revert

## Generating All Error Codes

To generate error codes for an entire interface:

```bash
# For each error in the interface, run:
cast sig "ErrorName()"
cast sig "ErrorName(uint256)"  # Include params if error has them

# Example output:
# 0x7ec5c154  # InvalidOperatorSet()
# 0x7a47c9a2  # InvalidChainId()
```

## Common Error Patterns

| Error | Typical Code | Usage |
|-------|--------------|-------|
| `InvalidOperatorSet()` | `0x7ec5c154` | OperatorSet doesn't exist |
| `InvalidPermissions()` | varies | Caller not authorized |
| `InvalidCaller()` | varies | Wrong msg.sender |
| `ArrayLengthMismatch()` | `0xa24a13a6` | Input arrays have different lengths |
````

## File: .claude/skills/unit-test-writer/SKILL.md
````markdown
---
name: unit-test-writer
description: Write Solidity unit tests for EigenLayer contracts. Use when the user asks to write tests, add test coverage, create unit tests, or test a function. Follows project conventions with per-function test contracts and mock dependencies.
allowed-tools: Read, Glob, Grep, Edit, Write, Bash(forge:*)
---

# Unit Test Writer

Write comprehensive unit tests for EigenLayer Solidity contracts following the project's established conventions.

## Test File Structure

Each test file follows this structure:

```solidity
// SPDX-License-Identifier: BUSL-1.1
pragma solidity ^0.8.27;

// Import the contract under test
import "src/contracts/path/to/ContractUnderTest.sol";
// Import the appropriate test setup
import "src/test/utils/EigenLayerUnitTestSetup.sol";
// Import any required mocks
import "src/test/mocks/SomeMock.sol";

/// @title ContractUnderTestUnitTests
/// @notice Base contract for all ContractUnderTest unit tests
contract ContractUnderTestUnitTests is EigenLayerUnitTestSetup, IContractErrors, IContractEvents, IContractTypes {
    // Test state variables
    ContractUnderTest contractUnderTest;

    function setUp() public virtual override {
        EigenLayerUnitTestSetup.setUp();
        // Deploy and initialize contract under test
        // Set up default test values
        // Configure mocks
    }

    // Helper functions
}

/// @title ContractUnderTestUnitTests_functionName
/// @notice Unit tests for ContractUnderTest.functionName
contract ContractUnderTestUnitTests_functionName is ContractUnderTestUnitTests {
    function setUp() public override {
        super.setUp();
        // Function-specific setup
    }

    // Revert tests
    function test_Revert_Paused() public { }
    function test_Revert_NotPermissioned() public { }
    function test_Revert_InvalidInput() public { }

    // Success tests
    function test_functionName_Success() public { }

    // Fuzz tests
    function testFuzz_functionName_VariableName(uint256 value) public { }
}
```

## Test Contract Naming Convention

- **Base contract**: `{ContractName}UnitTests`
- **Per-function contracts**: `{ContractName}UnitTests_{functionName}`

## Test Function Naming Convention

| Pattern | Purpose |
|---------|---------|
| `test_Revert_Paused` | Test function reverts when paused |
| `test_Revert_NotPermissioned` | Test function reverts for unauthorized callers |
| `test_Revert_NotOwner` | Test function reverts for non-owner |
| `test_Revert_Invalid{Thing}` | Test function reverts for invalid inputs |
| `test_Revert_{ErrorName}` | Test function reverts with specific error |
| `test_{functionName}_Success` | Test successful execution (happy path) |
| `test_{functionName}_{Scenario}` | Test specific scenario |
| `testFuzz_{functionName}_{Scenario}` | Fuzz test with bounded variable |

## Coverage Requirements

For each function, ensure:

### 1. Revert Cases (Branch Coverage)
- **Pausable functions**: Test `CurrentlyPaused` revert
- **Permissioned functions**: Test `InvalidPermissions` or `NotOwner` revert
- **Input validation**: Test each require/revert condition
- **State checks**: Test precondition failures

### 2. Happy Path (Line Coverage)
- Call function with valid inputs
- Verify emitted events with `cheats.expectEmit(true, true, true, true, address(contract))`
- Verify state changes with assertions

### 3. Fuzz Tests
- Use `bound()` to constrain fuzz inputs to valid ranges
- Test edge cases and variable inputs
- For complex tests or when standard fuzz inputs are too slow, use the `Randomness` type from `src/test/utils/Random.sol` 

## Using Mocks

External contract calls should use mocks from `src/test/mocks/`:

```solidity
// In setUp()
allocationManagerMock.setIsOperatorSet(operatorSet, true);

// Mock pattern: Mocks expose setters to control return values
mock.setSomeValue(expectedValue);
// Then the contract under test calls mock.getSomeValue() and gets expectedValue
```

### Creating New Mock Contracts

If a mock doesn't exist in `src/test/mocks/`, create one following this pattern:

**Location**: `src/test/mocks/{ContractName}Mock.sol`

**Structure**:

```solidity
// SPDX-License-Identifier: BUSL-1.1
pragma solidity ^0.8.27;

import "forge-std/Test.sol";

import "src/contracts/interfaces/IContractName.sol";

contract ContractNameMock is Test {
    receive() external payable {}
    fallback() external payable {}

    // Storage for mock return values
    mapping(bytes32 => bool) public _someMapping;

    // Setter to configure mock behavior
    function setSomeValue(bytes32 key, bool value) external {
        _someMapping[key] = value;
    }

    // Interface method that returns configured value
    function someValue(bytes32 key) external view returns (bool) {
        return _someMapping[key];
    }
}
```

**Key principles**:
1. **Inherit from `Test`** - Gives access to cheatcodes if needed
2. **Include `receive()` and `fallback()`** - Allows the mock to receive ETH and handle unknown calls gracefully
3. **Only implement what's needed** - Add functions on a need-to-implement basis as tests require them
4. **Prefix storage with `_`** - Use `_variableName` for internal mock storage to distinguish from interface getters
5. **Create setters for each value** - Pattern: `setX()` to configure, `getX()` or `x()` to return the configured value 

## Test Setup Inheritance

Choose the appropriate base setup:
- `EigenLayerUnitTestSetup` - Standard core contract tests
- `EigenLayerMultichainUnitTestSetup` - Multichain/cross-chain tests

## Event Verification

```solidity
// Expect event emission BEFORE the call
cheats.expectEmit(true, true, true, true, address(contractUnderTest));
emit SomeEvent(param1, param2);

// Make the call
contractUnderTest.someFunction(param1, param2);
```

## State Verification

```solidity
// After the call, verify state
assertEq(contract.getValue(), expectedValue, "Value mismatch");
assertTrue(contract.isEnabled(), "Should be enabled");
assertFalse(contract.isDisabled(), "Should not be disabled");
```

## Fuzz Test Patterns

### Standard Fuzz Tests (using `bound()`)

```solidity
function testFuzz_functionName_Amount(uint256 amount) public {
    // Bound to valid range
    amount = bound(amount, 1, type(uint128).max);

    // Or for uint8
    uint8 smallValue = uint8(bound(value, 1, 100));

    // Test with bounded value
    contractUnderTest.functionName(amount);

    // Verify
    assertEq(contractUnderTest.getAmount(), amount, "Amount mismatch");
}
```

### Randomness generation for Fuzz Tests

For tests that need multiple random values or complex random data structures, use the `Randomness` type from `src/test/utils/Random.sol`. This is preferred when:
- You need multiple correlated random values
- Standard fuzz inputs reject too many cases
- You need random arrays or complex types (addresses, bytes32, OperatorSets, etc.)

**Setup**: The base test contract must have the `rand` modifier and `random()` helper (already in `EigenLayerUnitTestSetup`):

```solidity
modifier rand(Randomness r) {
    r.set();
    _;
}

function random() internal returns (Randomness) {
    return Randomness.wrap(Random.SEED).shuffle();
}
```

**Usage Pattern**:

```solidity
function testFuzz_functionName_ComplexScenario(Randomness r) public rand(r) {
    // Generate random values using r.Type() or r.Type(min, max)
    address staker = r.Address();
    bytes32 salt = r.Bytes32();
    uint256 shares = r.Uint256(1, MAX_SHARES);
    uint64 magnitude = r.Uint64(1, WAD);
    uint32 count = r.Uint32(1, 32);
    bool flag = r.Boolean();

    // Use random values in test
    contractUnderTest.someFunction(staker, shares);

    // Verify behavior
    assertEq(contractUnderTest.getShares(staker), shares);
}
```

**Available Random Methods**:

| Method | Description |
|--------|-------------|
| `r.Uint256()` | Random uint256 |
| `r.Uint256(min, max)` | Random uint256 in range [min, max) |
| `r.Uint128()`, `r.Uint64()`, `r.Uint32()` | Smaller uint types |
| `r.Int256()`, `r.Int128()`, etc. | Signed integers |
| `r.Address()` | Random non-zero address |
| `r.Bytes32()` | Random bytes32 |
| `r.Boolean()` | Random true/false |
| `r.StrategyArray(len)` | Array of random strategy addresses |
| `r.StakerArray(len)` | Array of random staker addresses |
| `r.Uint256Array(len, min, max)` | Array of random uint256 values |

**Helper Functions for Complex Random Data**:

When you need multiple correlated random values (e.g., deposit/withdrawal amounts), create helper functions:

```solidity
/// @notice Generate correlated random amounts for deposits and withdrawals
function _fuzzDepositWithdrawalAmounts(Randomness r, uint32 numStrategies)
    internal
    returns (uint[] memory depositAmounts, uint[] memory withdrawalAmounts)
{
    depositAmounts = new uint[](numStrategies);
    withdrawalAmounts = new uint[](numStrategies);
    for (uint i = 0; i < numStrategies; i++) {
        depositAmounts[i] = r.Uint256(1, MAX_STRATEGY_SHARES);
        // Withdrawal must be <= deposit
        withdrawalAmounts[i] = r.Uint256(1, depositAmounts[i]);
    }
}

// Usage in test:
function testFuzz_queueWithdrawals(Randomness r) public rand(r) {
    uint32 numStrategies = r.Uint32(1, 5);
    (uint[] memory deposits, uint[] memory withdrawals) = 
        _fuzzDepositWithdrawalAmounts(r, numStrategies);
    // ... rest of test
}
```

## Example: Complete Test Contract

Reference: `src/test/unit/CrossChainRegistryUnit.t.sol`

This file demonstrates:
- Base test contract with setUp and helpers
- Per-function test contracts
- Comprehensive revert testing
- Event verification
- State verification
- Fuzz testing

## Checklist Before Writing Tests

1. Read the contract under test to understand all functions
2. Identify all external dependencies (need mocks)
3. Identify all revert conditions (modifiers, requires)
4. Identify all events emitted
5. Identify all state changes
6. Check if similar tests exist

## Running Tests

```bash
# Run all unit tests
forge test --no-match-contract Integration

# Run specific test file
forge test --match-path src/test/unit/ContractUnit.t.sol

# Run specific test
forge test --match-test test_functionName_Success

# Run with verbosity
forge test --match-path src/test/unit/ContractUnit.t.sol -vvv

# Check coverage
forge coverage --match-path src/test/unit/ContractUnit.t.sol
```
````

## File: .devcontainer/devcontainer.json
````json
// For format details, see https://aka.ms/devcontainer.json. For config options, see the README at:
// https://github.com/microsoft/vscode-dev-containers/tree/v0.245.2/containers/go
{
	"name": "Ubuntu",
	"build": {
		"dockerfile": "Dockerfile",
	},
	// Configure tool-specific properties.
	"customizations": {
		// Configure access control to other repositories
		"codespaces": {
			"repositories": {
				"Layr-Labs/*": {
					"permissions": "write-all"
				}
			}
		},
		// Configure properties specific to VS Code.
		"vscode": {
			// Add the IDs of extensions you want installed when the container is created.
			"extensions": [
				"NomicFoundation.hardhat-solidity",
				"GitHub.copilot"
			]
		}
	},
	"containerEnv": {
		"PRIVATE_KEY": "${localEnv:PRIVATE_KEY}",
		"PUBLIC_KEY": "${localEnv:PUBLIC_KEY}",
		"RPC_MAINNET": "${localEnv:RPC_MAINNET}",
	},
	// Use 'forwardPorts' to make a list of ports inside the container available locally.
	// "forwardPorts": [],
	// Use 'postCreateCommand' to run commands after the container is created.
	"postCreateCommand": "chmod +x ./.devcontainer/install.sh && bash ./.devcontainer/install.sh",
	// Comment out to connect as root instead. More info: https://aka.ms/vscode-remote/containers/non-root.
	"remoteUser": "vscode"
}
````

## File: .devcontainer/Dockerfile
````
# [Choice] Ubuntu version (use ubuntu-22.04 or ubuntu-18.04 on local arm64/Apple Silicon): ubuntu-22.04, ubuntu-20.04, ubuntu-18.04
ARG VARIANT=ubuntu-22.04
FROM mcr.microsoft.com/vscode/devcontainers/base:0-${VARIANT}

# [Optional] Uncomment this section to install additional OS packages.
RUN apt-get update && export DEBIAN_FRONTEND=noninteractive \
    && apt-get -y install --no-install-recommends libssl-dev \
    ripgrep python3-pip python3-venv python3
````

## File: .devcontainer/install.sh
````bash
#!/usr/bin/env bash

set -e

NVM_DIR=${HOME}/.nvm
NODE_VERSION=v22.3.0

# Install node
function npm_install {
    mkdir -p ${NVM_DIR}/etc
    curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.40.0/install.sh | bash
    bash -c ". ${NVM_DIR}/nvm.sh && nvm install ${NODE_VERSION} && nvm alias default ${NODE_VERSION} && nvm use default"

    NVM_NODE_PATH=${NVM_DIR}/versions/node/${NODE_VERSION}
    NODE_PATH=${NVM_NODE_PATH}/lib/node_modules
    PATH=${NVM_NODE_PATH}/bin:$PATH

    npm install npm -g
    npm install yarn -g
}

# Install foundry
function foundry_install {
    curl -L https://foundry.paradigm.xyz | bash
    ~/.foundry/bin/foundryup
}

npm_install
foundry_install

export NVM_NODE_PATH=${NVM_DIR}/versions/node/${NODE_VERSION}
export NODE_PATH=${NVM_NODE_PATH}/lib/node_modules
export PATH=${PATH}:${NVM_NODE_PATH}/bin:
````

## File: .github/configs/solhint.json
````json
{
  "extends": "solhint:recommended",
  "rules": {
    "max-line-length": "off",
    "no-inline-assembly": "off",
    "reason-string": ["warn",{"maxLength":160}],
    "func-visibility": ["warn",{"ignoreConstructors":true}],
    "explicit-types": ["warn","explicit"],
    "quotes": ["warn","double"],
    "const-name-snakecase": "off",
    "not-rely-on-time": "off",
    "avoid-low-level-calls": "off",
    "contract-name-camelcase": "off",
    "func-name-mixedcase": "off",
    "var-name-mixedcase": "off",
    "compiler-version": "off",
    "custom-errors": "off",
    "no-global-import": "off",
    "immutable-vars-naming": "off",
    "no-console": "off"
  }
}
````

## File: .github/configs/storage-diff.json
````json
{
    "contracts": [
      {
        "name": "AllocationManager",
        "address": "0x948a420b8CC1d6BFd0B6087C2E7c344a2CD0bc39"
      },
      {
        "name": "AVSDirectory",
        "address": "0x135dda560e946695d6f155dacafc6f1f25c1f5af"
      },
      {
        "name": "DelegationManager",
        "address": "0x39053D51B77DC0d36036Fc1fCc8Cb819df8Ef37A"
      },
      {
        "name": "RewardsCoordinator",
        "address": "0x7750d328b314EfFa365A0402CcfD489B80B0adda"
      },
      {
        "name": "StrategyManager",
        "address": "0x858646372CC42E1A627fcE94aa7A7033e7CF075A"
      },
      {
        "name": "StrategyFactory",
        "address": "0x5e4C39Ad7A3E881585e383dB9827EB4811f6F647"
      },
      {
        "name": "EigenPodManager",
        "address": "0x91E677b07F7AF907ec9a428aafA9fc14a0d3A338"
      },
      {
        "name": "EigenPod",
        "address": "0xd4018Ce9A041a9c110A9d0383d2b5E1c66Ae1513"
      },
      {
        "name": "stETH Strategy",
        "address": "0x93c4b944D05dfe6df7645A86cd2206016c51564D"
      },
      {
        "name": "EigenStrategy",
        "address": "0xaCB55C530Acdb2849e6d4f36992Cd8c9D50ED8F7"
      },
      {
        "name": "StrategyBase",
        "address": "0x6c6E8aF98a49bBaBCc17ca1dbA6b95c5D58A2ccb"
      }
    ]
}
````

## File: .github/configs/typos-cli.toml
````toml
[files]
extend-exclude = [
    "**/lib/**",
    "**/docs/images/**",
    # Not present locally, but is in remote (github).
    "**/doc/**",
    # Ignore Certora patches
    "**/certora/**/*.patch"
]
ignore-hidden = true
ignore-files = true
ignore-dot = true
ignore-vcs = true
ignore-global = true
ignore-parent = true

[default]
binary = false
check-filename = true
check-file = true
unicode = true
ignore-hex = true
identifier-leading-digits = false
locale = "en"
extend-ignore-identifiers-re = []
extend-ignore-words-re = []
extend-ignore-re = []

[default.extend-identifiers]

# Weird syntax, but this how you ignore corrections for certain words.
[default.extend-words]
strat = "strat"
froms = "froms"

[type.go]
extend-glob = []
extend-ignore-identifiers-re = []
extend-ignore-words-re = []
extend-ignore-re = []

[type.go.extend-identifiers]
flate = "flate"

[type.go.extend-words]

[type.sh]
extend-glob = []
extend-ignore-identifiers-re = []
extend-ignore-words-re = []
extend-ignore-re = []

[type.sh.extend-identifiers]
ot = "ot"
stap = "stap"

[type.sh.extend-words]

[type.py]
extend-glob = []
extend-ignore-identifiers-re = []
extend-ignore-words-re = []
extend-ignore-re = []

[type.py.extend-identifiers]
NDArray = "NDArray"
arange = "arange"
EOFError = "EOFError"

[type.py.extend-words]
````

## File: .github/ISSUE_TEMPLATE/bug_report.md
````markdown
---
name: Bug
about: Create a report to help us improve
title: 'Bug: Title'
labels: bug

---

**Describe the bug**
A clear and concise description of what the bug is.

**To Reproduce**
Steps to reproduce the behavior:
1. Go to '...'
2. Click on '....'
3. Scroll down to '....'
4. See error

**Expected behavior**
A clear and concise description of what you expected to happen.

**Screenshots**
If applicable, add screenshots to help explain your problem.

**Environment**
Enter important environment info needed to reproduce the bug. 
 - [e.g. chrome, safari]
 - [e.g. version]

**Don't Forget To**
* Assign this to a project (our default is [eigenlayer](https://github.com/orgs/Layr-Labs/projects/3/))
* Add priority + size estimate
* Set status to New
````

## File: .github/ISSUE_TEMPLATE/design.md
````markdown
---
name: Design
about: Design
title: 'Design: Title'
labels: design

---

## Description
Add a summary and description. What are we trying to do and why?

### Action Items
- [ ] Come up with scheme for...
- [ ] Spec it in a HackMD or Google Doc that is linked here
- [ ] Get @ to review design
- [ ] Discuss design and tradeoffs with @
- [ ] Finalize the doc, and come to consensus
- [ ] Create ticket for implementation and link the doc to it

### Blocking Issues
Is anything blocking for this? (Does this depend on other unfinished designs or pending changes?)
Please link blocking issues here. If something is blocking and doesn't have an issue yet, create it!

### Don't Forget To
* Assign this to a project (our default is [eigenlayer](https://github.com/orgs/Layr-Labs/projects/3/))
* Add priority + size estimate
* Set status to New
````

## File: .github/ISSUE_TEMPLATE/feature_request.md
````markdown
---
name: Feature
about: Suggest an idea for this project
title: 'Feature: Title'
labels: feature

---

**User story**
User stories are often expressed in a simple sentence, structured as follows: 'As a PERSONA, I want to GOAL_DESCRIPTION, so that CUSTOMER_VALUE_DESCRIPTION.' Alternatively for 

**Actions**
- [ ] An action item list describing the work to be done
- [ ] Link to all of the related tasks needed to complete the feature. See the [tasks](https://github.com/Layr-Labs/eigenlayer-contracts/tree/master/.github/ISSUE_TEMPLATE/task.md) template.
- [ ] Include everything in the definition of done e.g. unit tests and documentation

**Acceptance criteria**
Acceptance criteria are the requirements that need to be met in order to mark a user story as complete. For example, if your user story is, "As a New Relic customer, I want to know how to interpret AI anomalies in order to monitor my site and protect myself against incidents," then the acceptance criteria would be: "A complete and published doc describing AI anomalies," and all related quality checks. 

**Don't Forget To**
* Assign this to a project (our default is [eigenlayer](https://github.com/orgs/Layr-Labs/projects/3/))
* Add priority + size estimate
* Set status to New
````

## File: .github/ISSUE_TEMPLATE/implement.md
````markdown
---
name: Implementation
about: Implementation
title: 'Implement: Title'
labels: implement

---

## Description
If we already have a design doc then link it [here]().
Otherwise at least add a summary and description.

### Action Items
- [ ] Implement changes to the contracts on a separate branch
- [ ] Update tests and scripts as necessary
- [ ] Update documentation to reflect changes
- [ ] Get PR reviewed
- [ ] Respond to review / make any further changes
- [ ] Create ticket for tests
- [ ] Merge PR

### Blocking Issues
Is anything blocking for this? (Do we need to design and/or build something first?)
Please link blocking issues here. If something is blocking and doesn't have an issue yet, create it!

### Don't Forget To
* Assign this to a project (our default is [eigenlayer](https://github.com/orgs/Layr-Labs/projects/3/))
* Add priority + size estimate
* Set status to New
````

## File: .github/ISSUE_TEMPLATE/research.md
````markdown
---
name: Research
about: Research
title: 'Research: Title'
labels: research

---

## Description
Add a summary and description. What do we need any why? Any preliminary notion of options + what we want out of them?

### Action Items
- [ ] Create a list of options to evaluate
- [ ] Do research, summarize findings into a doc or here
- [ ] Present research, discuss next steps
- [ ] Write up next steps + create new issue(s) for them

### Blocking Issues
Is anything blocking for this? (Should we make another decision or scope something first?)
Please link blocking issues here. If something is blocking and doesn't have an issue yet, create it!

### Don't Forget To
* Assign this to a project (our default is [eigenlayer](https://github.com/orgs/Layr-Labs/projects/3/))
* Add priority + size estimate
* Set status to New
````

## File: .github/ISSUE_TEMPLATE/task.md
````markdown
---
name: Task
about: Task
title: 'Task: Title'
labels: task

---

## Description
Add a summary and description. Link to any parent [feature requests](https://github.com/Layr-Labs/eigenlayer-contracts/blob/master/.github/ISSUE_TEMPLATE/feature_request.md) or [bug reports](https://github.com/Layr-Labs/eigenlayer-contracts/blob/master/.github/ISSUE_TEMPLATE/bug_report.md). 

### Action Items
- [ ] An action item list describing the work to be done
- [ ] Include everything in the definition of done e.g. unit tests and documentation

### Blocking Issues
Is anything else clearly blocking for this? (Do we need to fix something else first?)
Please link blocking issues here. If something is blocking and doesn't have an issue yet, create it!

### Don't Forget To
* Assign this to a project (our default is [eigenlayer](https://github.com/orgs/Layr-Labs/projects/3/))
* Add priority + size estimate
* Set status to New
````

## File: .github/ISSUE_TEMPLATE/test_implementation.md
````markdown
---
name: Test
about: Test
title: 'Test: Title'
labels: test

---

## Description
Add a summary and description. What are we trying to do and why?

### Action Items
- [ ] Discuss scoping for tests with the team
- [ ] List possible test cases in this issue
- [ ] Get @ to review design
- [ ] Implement tests

### Blocking Issues
Is anything blocking for this? (Does this depend on other unfinished designs or pending changes?)
Please link blocking issues here. If something is blocking and doesn't have an issue yet, create it!

### Don't Forget To
* Assign this to a project (our default is [eigenlayer](https://github.com/orgs/Layr-Labs/projects/3/))
* Add priority + size estimate
* Set status to New
````

## File: .github/workflows/automation.yml
````yaml
name: PR

on:
  pull_request:
    types: [opened, edited, synchronize]

permissions:
  contents: read
  pull-requests: read

jobs:
  # triage:
  #   runs-on: protocol-x64-16core
  #   name: Labels
  #   permissions:
  #     contents: read
  #     pull-requests: write
    
  #   steps:
  #     - name: Checkout code
  #       uses: actions/checkout@v4
        
  #     - uses: actions/labeler@v5
  #       with:
  #         repo-token: "${{ secrets.GITHUB_TOKEN }}"
  #         sync-labels: true

  lint-pr-title:
    runs-on: ubuntu-latest
    name: Title
    steps:
      - name: Fetch PR Title
        run: |
          PR_TITLE=$(jq -r '.pull_request.title' "$GITHUB_EVENT_PATH")
          echo "PR title: $PR_TITLE"

          # Define the valid pattern (supports conventional commit format)
          if [[ ! "$PR_TITLE" =~ ^(release|feat|fix|chore|docs|refactor|test|style|ci|perf)(\(.*?\))?:\ .* ]]; then
            echo "❌ Invalid PR title: '$PR_TITLE'"
            echo "Expected format: 'type: description' or 'type(scope): description'"
            echo "Allowed types: release, feat, fix, chore, docs, refactor, test, style, ci, perf."
            exit 1
          fi

          echo "✅ PR title is valid"
````

## File: .github/workflows/certora-prover.yml
````yaml
on:
  # Run when PRs are merged into main and touch relevant code paths
  pull_request:
    types: [closed]
    branches:
      - main
    paths:
      - 'src/contracts/**'
      - 'script/**'
      - 'certora/**'

  # Run on any pushes to certora/* branches
  push:
    branches:
      - 'certora/**'

  # Biweekly schedule (1st and 15th of each month at midnight UTC)
  schedule:
    - cron: '0 0 1,15 * *'

  # Manual trigger
  workflow_dispatch:

jobs:
  # Compile the contracts and run verification
  compile_and_verify:
    name: Compile and verify
    # Run if it meets one of these conditions:
    # 1. It's a merged PR into main (with matching paths)
    # 2. It's a push to a certora/* branch
    # 3. It's a scheduled run
    # 4. It's a manually triggered run
    if: |
      (github.event_name == 'pull_request' && github.event.pull_request.merged == true) ||
      (github.event_name == 'push' && startsWith(github.ref, 'refs/heads/certora/')) ||
      github.event_name == 'schedule' ||
      github.event_name == 'workflow_dispatch'

    runs-on: ubuntu-latest
    permissions:
      contents: read
      statuses: write
      pull-requests: write
      id-token: write
    steps:
      - uses: step-security/harden-runner@ec9f2d5744a09debf3a187a3f4f675c53b671911
        with:
          egress-policy: audit

      # Checkout the repository with submodules
      - uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683
        with:
          submodules: recursive
          # Use Main branch for scheduled runs, otherwise use the branch that triggered the workflow
          ref: ${{ github.event_name == 'schedule' && 'main' || github.ref }}

      # Apply patches to the code
      - name: Patch code
        run: ./certora/scripts/patches/patch.sh

      # Run Certora compilation and verification
      - name: Run Certora compilation and verification
        uses: Certora/certora-run-action@11979c68d2ffab0b1b2fe6c72ec9d7a38855822d
        with:
          # List of configuration files for different contracts to verify
          configurations: |-
            certora/confs/multichain/CrossChainRegistry.conf
            certora/confs/multichain/KeyRegistrar.conf
            certora/confs/multichain/OperatorTableUpdater.conf
            certora/confs/multichain/ECDSACertificateVerifier.conf
            certora/confs/multichain/BN254CertificateVerifier.conf
            certora/confs/core/AllocationManager.conf
            certora/confs/core/AllocationManagerOverslashing.conf
            certora/confs/core/AllocationManagerValidState.conf
            certora/confs/core/AllocationManagerSanity.conf
            certora/confs/core/DelegationManager.conf
            certora/confs/core/DelegationManagerValidState.conf
            certora/confs/core/StrategyManager.conf
            certora/confs/permissions/Pausable.conf
            certora/confs/pods/EigenPodManagerRules.conf
            certora/confs/strategies/StrategyBase.conf
          solc-versions: 0.8.30
          job-name: "Verified Rules"
          certora-key: ${{ secrets.CERTORAKEY }}
        env:
          GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
````

## File: .github/workflows/checks.yml
````yaml
name: Check

on:
  push:
  workflow_dispatch: {}

permissions:
  contents: read
  pull-requests: read

env:
  CLICOLOR: 1

jobs:
  typos:
    name: Typo Linting
    runs-on: ubuntu-latest
    steps:
      - name: Harden Runner
        uses: step-security/harden-runner@ec9f2d5744a09debf3a187a3f4f675c53b671911 # v2.13.0
        with:
          egress-policy: block
          allowed-endpoints: >
            github.com:443
            release-assets.githubusercontent.com:443
            objects.githubusercontent.com:443
            release-assets.githubusercontent.com:443

      - uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683
      - uses: crate-ci/typos@717cd03663352cbd05e4d28c01366e571ff5f2ed
        with:
          config: .github/configs/typos-cli.toml

  go-bindings:
    name: Bindings
    runs-on: ubuntu-latest
    steps:
      - name: Harden Runner
        uses: step-security/harden-runner@ec9f2d5744a09debf3a187a3f4f675c53b671911 # v2.13.0
        with:
          egress-policy: block
          allowed-endpoints: >
            archive.ubuntu.com:80
            auth.docker.io:443
            binaries.soliditylang.org:443
            foundry.paradigm.xyz:443
            gethstore.blob.core.windows.net:443
            github.com:443
            production.cloudflare.docker.com:443
            raw.githubusercontent.com:443
            registry-1.docker.io:443
            release-assets.githubusercontent.com:443
            security.ubuntu.com:80
            objects.githubusercontent.com:443

      - uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683
        with:
          fetch-depth: 0
      - name: Build and validate
        if: github.event_name == 'push'
        run: |
          make docker
          docker run -v `pwd`:/build -w /build --rm -i eigenlayer-contracts:latest bash -c "make gha"
          if [ ! -z "$(git status --porcelain)" ]; then git diff; git status; exit 1; fi
````

## File: .github/workflows/claude-code-review.yml
````yaml
# Claude Code Review Workflow
# - Auto-reviews PRs targeting main (excludes drafts and forks)
# - Responds to @claude mentions from org members only
# - Uses OIDC auth with Claude GitHub App (id-token: write)

name: Claude review

on:
  # Trigger: new/updated PRs to main
  # pull_request:
  #   types: [opened, synchronize, ready_for_review, reopened]
  #   branches:
  #     - main

  # Trigger: @claude mentions in comments
  issue_comment:
    types: [created]
  pull_request_review_comment:
    types: [created]
  pull_request_review:
    types: [submitted]

jobs:
  # Job 1: Auto-review on PR open/update (no forks, no drafts)
  # auto-review:
  #   if: |
  #     github.event_name == 'pull_request' &&
  #     !github.event.pull_request.draft &&
  #     !github.event.pull_request.head.repo.fork
  #   runs-on: ubuntu-latest
  #   timeout-minutes: 15
  #   permissions:
  #     contents: read
  #     pull-requests: write
  #     id-token: write
  #     actions: read
  #   steps:
  #     # Checkout base branch (trusted) - Claude reads PR diff via gh pr diff
  #     # This avoids CodeQL "checkout of untrusted code in trusted context" warning
  #     - uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4
  #       with:
  #         fetch-depth: 20
  #
  #     - name: Apply PR diff to workspace
  #       id: apply_diff
  #       env:
  #         GH_TOKEN: ${{ github.token }}
  #         PR_NUMBER: ${{ github.event.pull_request.number }}
  #         REPO: ${{ github.repository }}
  #       run: |
  #         set -euo pipefail
  #         base_sha="$(gh pr view "$PR_NUMBER" --repo "$REPO" --json baseRefOid -q '.baseRefOid')"
  #         git fetch --depth=1 origin "$base_sha"
  #         git checkout --detach "$base_sha"
  #         gh pr diff "$PR_NUMBER" > pr.diff
  #         if ! git apply --3way --whitespace=nowarn pr.diff; then
  #           rm -f pr.diff
  #           echo "apply_ok=false" >> "$GITHUB_OUTPUT"
  #           exit 0
  #         fi
  #         rm pr.diff
  #         echo "apply_ok=true" >> "$GITHUB_OUTPUT"
  #
  #     - name: Comment when diff apply fails
  #       if: steps.apply_diff.outputs.apply_ok == 'false'
  #       env:
  #         GH_TOKEN: ${{ github.token }}
  #         PR_NUMBER: ${{ github.event.pull_request.number }}
  #       run: |
  #         gh pr comment "$PR_NUMBER" --repo "${{ github.repository }}" \
  #           --body "<!-- claude-apply-fail -->Skipped: PR diff failed to apply. Rebase and re-push."
  #
  #     - uses: anthropics/claude-code-action@70e16deb18402428bd09e08d1ec3662a872e3c72 # v1
  #       if: steps.apply_diff.outputs.apply_ok != 'false'
  #       with:
  #         anthropic_api_key: ${{ secrets.ORG_ANTHROPIC_API_KEY }}
  #         additional_permissions: "actions: read"
  #         track_progress: true
  #         use_sticky_comment: true
  #         prompt: |
  #           Follow CLAUDE.md for project context and conventions.
  #           For contract details, read the relevant docs in /docs folder.
  #
  #           REPO: ${{ github.repository }}
  #           PR NUMBER: ${{ github.event.pull_request.number }}
  #
  #           First, identify the PR type from the title (feat|fix|docs|test|refactor|ci|perf|style|chore|release):
  #           - **feat/fix**: Full review - correctness, security, edge cases, gas, events, test coverage
  #           - **perf**: Focus on gas optimization correctness and no functional regressions
  #           - **test**: Check assertions are correct, edge cases covered, no false positives
  #           - **docs**: Check accuracy against actual code behavior
  #           - **style/refactor**: No functional changes - verify behavior is preserved
  #           - **chore/ci/release**: Light review - check for unintended side effects
  #
  #           For Solidity changes, check:
  #           1. **Correctness**: Does it work? Edge cases handled? Invariants preserved?
  #           2. **Security**: Access control, reentrancy, overflow, unsafe external calls
  #           3. **Integration**: How do changes affect other contracts that interact with this one?
  #
  #           For each issue found:
  #           - Use inline comment on the specific line
  #           - Explain the problem
  #           - Provide a suggested fix as a diff block:
  #           ```diff
  #           - old code
  #           + new code
  #           ```
  #
  #           Use top-level comment for summary only.
  #
  #         claude_args: |
  #           --allowedTools "Read,Glob,Grep,mcp__github_inline_comment__create_inline_comment,Bash(git fetch:*),Bash(gh pr comment:*),Bash(gh pr diff:*),Bash(gh pr view:*),Bash(gh pr checks:*),Bash(gh run list:*),Bash(gh run view:*)"
  #           --system-prompt "If you inspect CI logs, never paste raw logs. Summarize likely cause only. Redact tokens, keys, credentials, or URLs with credentials. If unsure, say log may contain sensitive data and stop."
  #           --max-turns 15

  # Job 2: @claude mentions in any PR comment (members only)
  # - issue_comment: PR conversation comments (no fork info available, member-check is sufficient)
  # - pull_request_review_comment: inline review comments (fork check added)
  # - pull_request_review: review submissions (fork check added)
  mention-response:
    if: |
      (
        github.event_name == 'issue_comment' &&
        github.event.issue.pull_request &&
        contains(github.event.comment.body, '@claude') &&
        (
          github.event.comment.author_association == 'MEMBER' ||
          github.event.comment.author_association == 'COLLABORATOR' ||
          github.event.comment.author_association == 'OWNER'
        )
      ) ||
      (
        github.event_name == 'pull_request_review_comment' &&
        contains(github.event.comment.body, '@claude') &&
        (
          github.event.comment.author_association == 'MEMBER' ||
          github.event.comment.author_association == 'COLLABORATOR' ||
          github.event.comment.author_association == 'OWNER'
        )
      ) ||
      (
        github.event_name == 'pull_request_review' &&
        contains(github.event.review.body, '@claude') &&
        (
          github.event.review.author_association == 'MEMBER' ||
          github.event.review.author_association == 'COLLABORATOR' ||
          github.event.review.author_association == 'OWNER'
        )
      )
    runs-on: ubuntu-latest
    timeout-minutes: 10
    permissions:
      contents: read
      pull-requests: write
      issues: write
      id-token: write
      actions: read
    steps:
      # Checkout base (trusted) for mention triggers
      - uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4
        with:
          fetch-depth: 20

      - name: Resolve PR metadata
        id: prmeta
        env:
          GH_TOKEN: ${{ github.token }}
          EVENT_NAME: ${{ github.event_name }}
          ISSUE_NUMBER: ${{ github.event.issue.number }}
          PR_NUMBER: ${{ github.event.pull_request.number }}
          REPO: ${{ github.repository }}
        run: |
          set -euo pipefail

          if [ "$EVENT_NAME" = "issue_comment" ]; then
            PR_NUM="$ISSUE_NUMBER"
          else
            PR_NUM="$PR_NUMBER"
          fi

          pr_json="$(gh pr view "$PR_NUM" --repo "$REPO" --json isCrossRepository,baseRefOid)"
          echo "pr_num=$PR_NUM" >> "$GITHUB_OUTPUT"
          echo "is_fork=$(printf '%s' "$pr_json" | jq -r '.isCrossRepository')" >> "$GITHUB_OUTPUT"
          echo "base_sha=$(printf '%s' "$pr_json" | jq -r '.baseRefOid')" >> "$GITHUB_OUTPUT"

      - name: Apply PR diff to workspace
        id: apply_diff
        if: steps.prmeta.outputs.is_fork != 'true'
        env:
          GH_TOKEN: ${{ github.token }}
          PR_NUMBER: ${{ steps.prmeta.outputs.pr_num }}
          BASE_SHA: ${{ steps.prmeta.outputs.base_sha }}
        run: |
          set -euo pipefail
          git fetch --depth=1 origin "$BASE_SHA"
          git checkout --detach "$BASE_SHA"
          gh pr diff "$PR_NUMBER" > pr.diff
          if ! git apply --3way --whitespace=nowarn pr.diff; then
            rm -f pr.diff
            echo "apply_ok=false" >> "$GITHUB_OUTPUT"
            exit 0
          fi
          rm pr.diff
          echo "apply_ok=true" >> "$GITHUB_OUTPUT"

      # If this is a fork PR, leave a friendly note explaining why Claude doesn't run.
      # Avoid duplicates by checking for a marker we include in the comment body.
      - name: Explain fork PR limitation (issue_comment)
        if: github.event_name == 'issue_comment' && steps.prmeta.outputs.is_fork == 'true'
        env:
          GH_TOKEN: ${{ github.token }}
          PR_NUMBER: ${{ steps.prmeta.outputs.pr_num }}
          REPO: ${{ github.repository }}
        run: |
          set -euo pipefail

          MARKER="<!-- claude-fork-skip -->"

          # Check existing PR (issue) comments for the marker to avoid posting duplicates.
          if gh api "repos/$REPO/issues/$PR_NUMBER/comments" --paginate --jq '.[].body' | grep -Fq "$MARKER"; then
            echo "Fork explanation already posted; skipping."
            exit 0
          fi

          gh pr comment "$PR_NUMBER" --repo "$REPO" \
            --body "${MARKER}Skipped: fork PRs are not supported. Push the branch to this repo and re-open."

      - name: Comment when diff apply fails
        if: steps.apply_diff.outputs.apply_ok == 'false'
        env:
          GH_TOKEN: ${{ github.token }}
          PR_NUMBER: ${{ steps.prmeta.outputs.pr_num }}
        run: |
          gh pr comment "$PR_NUMBER" --repo "${{ github.repository }}" \
            --body "<!-- claude-apply-fail -->Skipped: PR diff failed to apply. Rebase and re-push."

      - uses: anthropics/claude-code-action@70e16deb18402428bd09e08d1ec3662a872e3c72 # v1
        # Skip Claude entirely on fork PRs or when diff apply fails.
        if: steps.prmeta.outputs.is_fork != 'true' && steps.apply_diff.outputs.apply_ok != 'false'
        with:
          anthropic_api_key: ${{ secrets.ORG_ANTHROPIC_API_KEY }}
          additional_permissions: "actions: read"
          track_progress: true
          prompt: |
            Follow CLAUDE.md for project context and conventions.
            For contract details, read the relevant docs in /docs folder.

            REPO: ${{ github.repository }}
            PR NUMBER: ${{ steps.prmeta.outputs.pr_num }}

            For Solidity changes, check:
            1. **Correctness**: Does it work? Edge cases handled? Invariants preserved?
            2. **Security**: Access control, reentrancy, overflow, unsafe external calls
            3. **Integration**: How do changes affect other contracts that interact with this one?

            For each issue found:
            - Use inline comment on the specific line
            - Explain the problem
            - Provide a suggested fix as a diff block:
            ```diff
            - old code
            + new code
            ```

            Use top-level comment for summary only.

          claude_args: |
            --allowedTools "Read,Glob,Grep,mcp__github_inline_comment__create_inline_comment,Bash(git fetch:*),Bash(gh pr comment:*),Bash(gh pr diff:*),Bash(gh pr view:*),Bash(gh pr checks:*),Bash(gh run list:*),Bash(gh run view:*)"
            --system-prompt "If you inspect CI logs, never paste raw logs. Summarize likely cause only. Redact tokens, keys, credentials, or URLs with credentials. If unsure, say log may contain sensitive data and stop."
            --max-turns 10
````

## File: .github/workflows/foundry-post-merge.yml
````yaml
name: Foundry Post Merge

on:
  workflow_dispatch:
  push:
    branches:
      - main
    paths:
      - '.github/workflows/foundry-post-merge.yml'
      - 'src/**'
      - 'lib/**'
      - 'foundry.toml'
      - '**/*.sol'

permissions:
  contents: read
  pull-requests: read

env:
  FOUNDRY_PROFILE: medium

jobs:
  # -----------------------------------------------------------------------
  # Forge Test (Intense)
  # -----------------------------------------------------------------------

  continuous-fuzzing:
    name: Test (Intense)
    runs-on: protocol-x64-16core
    strategy:
      fail-fast: true
    steps:
      - uses: step-security/harden-runner@ec9f2d5744a09debf3a187a3f4f675c53b671911
        with:
          egress-policy: block
          allowed-endpoints: >
            binaries.soliditylang.org:443
            github.com:443
            release-assets.githubusercontent.com:443
            eth-mainnet.g.alchemy.com:443

      # Check out repository with all submodules for complete codebase access.
      - uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683
        with:
          submodules: recursive

      # Restore Forge cache
      - name: Cache Forge Build
        uses: actions/cache@5a3ec84eff668545956fd18022155c47e93e2684
        with:
          path: |
            cache/
            out/
          key: ${{ runner.os }}-forge-${{ hashFiles('**/foundry.toml', '**/remappings.txt', 'src/**/*.sol', 'lib/**/*.sol') }}
          restore-keys: |
            ${{ runner.os }}-forge-

      # Install the Foundry toolchain.
      - name: "Install Foundry"
        uses: foundry-rs/foundry-toolchain@82dee4ba654bd2146511f85f0d013af94670c4de
        with:
          version: stable

      # Build the project and display contract sizes.
      - name: "Forge Build"
        run: |
          forge --version
          forge build --sizes
        id: build

      # Run Forge Test (Intense)
      - name: Forge Test (Intense)
        run: |
          echo -e "\033[1;33mWarning: This workflow may take several hours to complete.\033[0m"
          echo -e "\033[1;33mThis intense fuzzing workflow is optional but helps catch edge cases through extended testing.\033[0m"
          FOUNDRY_PROFILE=intense forge test -vvv
````

## File: .github/workflows/foundry.yml
````yaml
name: Foundry

on:
  workflow_dispatch:
  pull_request:
  push:
    branches:
      - main

permissions:
  contents: read
  pull-requests: read

env:
  FOUNDRY_PROFILE: medium

jobs:
  # -----------------------------------------------------------------------
  # Forge Test
  # -----------------------------------------------------------------------

  test-suite:
    name: Test
    runs-on: protocol-x64-16core
    strategy:
      matrix:
        suite: [Unit, Integration, Fork]
    
    steps:
      - uses: step-security/harden-runner@ec9f2d5744a09debf3a187a3f4f675c53b671911
        with:
          egress-policy: block
          allowed-endpoints: >
            binaries.soliditylang.org:443
            github.com:443
            release-assets.githubusercontent.com:443
            eth-mainnet.g.alchemy.com:443
            fabled-wispy-ensemble.ethereum-hoodi.quiknode.pro:443
            objects.githubusercontent.com:443

      # Check out repository with all submodules for complete codebase access.
      - uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683
        with:
          submodules: recursive

      # Restore Forge cache
      - name: Cache Forge Build
        uses: actions/cache@5a3ec84eff668545956fd18022155c47e93e2684
        with:
          path: |
            cache/
            out/
          key: ${{ runner.os }}-forge-${{ hashFiles('**/foundry.toml', '**/remappings.txt', 'src/**/*.sol', 'lib/**/*.sol') }}
          restore-keys: |
            ${{ runner.os }}-forge-

      # Install the Foundry toolchain.
      - name: Install Foundry
        uses: foundry-rs/foundry-toolchain@82dee4ba654bd2146511f85f0d013af94670c4de
        with:
          version: v1.5.0

      # Run Forge's formatting checker to ensure consistent code style.
      - name: "Forge Fmt"
        run: |
          forge fmt --check
          FOUNDRY_PROFILE=test forge fmt --check
        id: fmt

      # Build the project and display contract sizes.
      - name: Forge Build
        run: |
          forge --version
          forge build --sizes

      # Run the test suite in parallel based on the matrix configuration.
      - name: Run ${{ matrix.suite }} tests
        run: |
          case "${{ matrix.suite }}" in
            Unit) forge test --no-match-contract Integration -vvv ;;
            Integration) forge test --match-contract Integration -vvv ;;
            Fork) forge test --match-contract Integration -vvv ;;
          esac
        env:
          FOUNDRY_PROFILE: ${{ matrix.suite == 'Fork' && 'forktest' || 'medium' }}
          RPC_MAINNET: ${{ secrets.RPC_MAINNET }}
          RPC_HOODI: ${{ secrets.RPC_HOODI }}

  # -----------------------------------------------------------------------
  # Forge Storage Diff
  # -----------------------------------------------------------------------

  storage-diff:
    name: Test (Storage)
    runs-on: protocol-x64-16core
    steps:
      - uses: step-security/harden-runner@ec9f2d5744a09debf3a187a3f4f675c53b671911
        with:
          egress-policy: block
          allowed-endpoints: >
            api.etherscan.io:443
            binaries.soliditylang.org:443
            eth-mainnet.g.alchemy.com:443
            github.com:443
            release-assets.githubusercontent.com:443
      # Check out repository with all submodules for complete codebase access.
      - uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683
        with:
          submodules: recursive

      # Restore Forge cache
      - name: Cache Forge Build
        uses: actions/cache@5a3ec84eff668545956fd18022155c47e93e2684
        with:
          path: |
            cache/
            out/
          key: ${{ runner.os }}-forge-${{ hashFiles('**/foundry.toml', '**/remappings.txt', 'src/**/*.sol', 'lib/**/*.sol') }}
          restore-keys: |
            ${{ runner.os }}-forge-

      # Install the Foundry toolchain.
      - name: "Install Foundry"
        uses: foundry-rs/foundry-toolchain@82dee4ba654bd2146511f85f0d013af94670c4de
        with:
          version: v1.5.0

      # Run storage diff check to detect storage layout incompatibilities.
      - name: "Mainnet Storage Diff"
        run: |
          bash bin/storage-diff.sh --rpc-url ${{ secrets.RPC_MAINNET }} --etherscan-key ${{ secrets.ETHERSCAN_API_KEY }} --input .github/configs/storage-diff.json
        id: storage-diff

  # -----------------------------------------------------------------------
  # Forge Coverage
  # -----------------------------------------------------------------------

  run-coverage:
    name: Coverage
    runs-on: protocol-x64-16core
    steps:

      - uses: step-security/harden-runner@ec9f2d5744a09debf3a187a3f4f675c53b671911
        with:
          egress-policy: block
          allowed-endpoints: >
            binaries.soliditylang.org:443
            github.com:443
            release-assets.githubusercontent.com:443
            
      # Check out repository with all submodules for complete codebase access.
      - uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683
        with:
          submodules: recursive

      # Restore Foundry and Forge cache
      - name: Cache Foundry Dependencies
        uses: actions/cache@5a3ec84eff668545956fd18022155c47e93e2684
        with:
          path: |
            ~/.cargo
            ~/.foundry
            out/
            cache/
          key: ${{ runner.os }}-forge-${{ hashFiles('**/foundry.toml', '**/remappings.txt', 'src/**/*.sol', 'lib/**/*.sol', '**/Cargo.lock') }}
          restore-keys: |
            ${{ runner.os }}-foundry-
        
      # Install the Foundry toolchain.
      - name: "Install Foundry"
        uses: foundry-rs/foundry-toolchain@82dee4ba654bd2146511f85f0d013af94670c4de
        with:
          version: v1.5.0

      # Install LCOV for coverage report generation.
      - name: Install LCOV (Prebuilt)
        run: |
          curl -L https://github.com/linux-test-project/lcov/releases/download/v1.16/lcov-1.16.tar.gz | tar xz
          sudo cp lcov-1.16/bin/* /usr/local/bin/
          sudo cp -r lcov-1.16/man/* /usr/share/man/

      # Build the project and display contract sizes.
      - name: "Forge Build"
        run: |
          forge --version
          forge build --sizes
        id: build

      # Run Forge coverage with LCOV report format, excluding test and script files
      - name: Forge Coverage
        run: |
          FOUNDRY_DENY_WARNINGS=false \
          FOUNDRY_PROFILE=coverage \
          FOUNDRY_CACHE=true \
          FOUNDRY_CACHE_PATH=cache \
          forge coverage --report lcov --report summary --no-match-coverage "script|test" -j $(nproc)  --no-match-test test_noCoverage
          genhtml -q -o report ./lcov.info

      # Upload coverage report as artifact before potential failure
      - name: Upload Coverage Report
        uses: actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02
        with:
          name: code-coverage-report
          path: report/*
          if-no-files-found: error

      # Check coverage threshold after uploading report
      - name: Check Coverage Threshold
        run: |
          LINES_PCT=$(lcov --summary lcov.info | grep "lines" | cut -d ':' -f 2 | cut -d '%' -f 1 | tr -d '[:space:]')
          FUNCTIONS_PCT=$(lcov --summary lcov.info | grep "functions" | cut -d ':' -f 2 | cut -d '%' -f 1 | tr -d '[:space:]')          
          FAILED=0
          
          if (( $(echo "$LINES_PCT < 90" | bc -l) )); then
            echo -e "\033[1;31m❌ Lines coverage ($LINES_PCT%) is below minimum threshold of 90%\033[0m"
            FAILED=1
          else
            echo -e "\033[1;32m✅ Lines coverage ($LINES_PCT%) meets minimum threshold of 90%\033[0m"
          fi
          
          if (( $(echo "$FUNCTIONS_PCT < 90" | bc -l) )); then
            echo -e "\033[1;31m❌ Functions coverage ($FUNCTIONS_PCT%) is below minimum threshold of 90%\033[0m"
            FAILED=1
          else
            echo -e "\033[1;32m✅ Functions coverage ($FUNCTIONS_PCT%) meets minimum threshold of 90%\033[0m"
          fi
          
          if [ $FAILED -eq 1 ]; then
            exit 1
          fi

  # -----------------------------------------------------------------------
  # Forge Size Diff
  # -----------------------------------------------------------------------

  compare-contract-sizes:
    name: Size Diff
    runs-on: protocol-x64-16core
    steps:
      - uses: step-security/harden-runner@ec9f2d5744a09debf3a187a3f4f675c53b671911
        with:
          egress-policy: block
          allowed-endpoints: >
            *.blob.core.windows.net:443
            binaries.soliditylang.org:443
            github.com:443
            objects.githubusercontent.com:443
            release-assets.githubusercontent.com:443
            
      # Check out repository with all submodules for complete codebase access.
      - uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683
        with:
          submodules: recursive

      # Install the Foundry toolchain.
      - name: "Install Foundry"
        uses: foundry-rs/foundry-toolchain@82dee4ba654bd2146511f85f0d013af94670c4de
        with:
          version: v1.5.0

      - name: Build contracts on PR branch
        run: |
          forge build --json --sizes | jq '.' > pr_sizes.json

      - name: Checkout target branch
        run: |
          git fetch origin ${{ github.base_ref }}
          git checkout ${{ github.base_ref }}

      - name: Build contracts on target branch
        run: |
          forge build --json --sizes | jq '.' > target_sizes.json

      - name: Compare contract sizes using Bash
        run: |
          # Extract contract names
          contracts=$(jq -r 'keys[]' pr_sizes.json)

          # Track if there are any differences
          has_differences=0

          echo -e "\n📊 \033[1;34mContract Size Comparison Report\033[0m 📊\n"

          # Iterate through contracts and compare sizes
          for contract in $contracts; do
            pr_runtime=$(jq -r --arg contract "$contract" '.[$contract].runtime_size // 0' pr_sizes.json)
            pr_init=$(jq -r --arg contract "$contract" '.[$contract].init_size // 0' pr_sizes.json)

            target_runtime=$(jq -r --arg contract "$contract" '.[$contract].runtime_size // 0' target_sizes.json)
            target_init=$(jq -r --arg contract "$contract" '.[$contract].init_size // 0' target_sizes.json)

            runtime_diff=$((pr_runtime - target_runtime))
            init_diff=$((pr_init - target_init))

            if [ "$runtime_diff" -ne 0 ] || [ "$init_diff" -ne 0 ]; then
              echo -e "\033[1;36m📝 $contract:\033[0m"
              if [ "$runtime_diff" -ne 0 ]; then
                if [ "$runtime_diff" -gt 0 ]; then
                  echo -e "   Runtime: \033[1;31m+$runtime_diff bytes\033[0m 📈"
                else
                  echo -e "   Runtime: \033[1;32m$runtime_diff bytes\033[0m 📉"
                fi
              fi
              if [ "$init_diff" -ne 0 ]; then
                if [ "$init_diff" -gt 0 ]; then
                  echo -e "   Init:    \033[1;31m+$init_diff bytes\033[0m 📈"
                else
                  echo -e "   Init:    \033[1;32m$init_diff bytes\033[0m 📉"
                fi
              fi
              has_differences=1
            fi
          done

          if [ "$has_differences" -eq 0 ]; then
            echo -e "\033[1;32m✨ No contract size changes detected ✨\033[0m"
          fi
````

## File: .github/workflows/remove-stale-branches.yml
````yaml
name: Remove Stale Branches

on:
  schedule:
    - cron: "0 0 * * *" # Everday at midnight
  workflow_dispatch:     # Allows manual trigger from GitHub UI

permissions:
  contents: write

jobs:
  remove-stale-branches:
    runs-on: ubuntu-latest
    steps:
      - uses: fpicalausa/remove-stale-branches@v1.6.0
        with:
          dry-run: false # Check out the console output before setting this to false
          exempt-authors-regex: "^dependabot"
          days-before-branch-stale: 90
          days-before-branch-delete: 7
          operations-per-run: 100
          exempt-branches-regex: "^(main|release-dev/.*|v[0-9]+\\.[0-9]+\\.[0-9]+)$"
          ignore-unknown-authors: true
          default-recipient: "bowenli86"
````

## File: .github/workflows/validate-deployment-scripts.yml
````yaml
name: Validate Deployment Scripts

on:
  workflow_dispatch:
  pull_request:
    paths:
      - 'script/**'
      - '.github/workflows/validate-deployment-scripts.yml'

permissions:
  contents: read
  pull-requests: read

jobs:

  test:
    runs-on: protocol-x64-16core
    strategy:
      fail-fast: false
      matrix:
        env: [mainnet, testnet-sepolia, testnet-hoodi, testnet-base-sepolia, base, preprod-hoodi]

    steps:
      - uses: step-security/harden-runner@ec9f2d5744a09debf3a187a3f4f675c53b671911
        with:
          egress-policy: audit

      # Check out repository with all submodules for complete codebase access.
      - uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683
        with:
          submodules: recursive

      - name: Install Zeus
        run: npm install -g @layr-labs/zeus --ignore-scripts
      
        # Restore Forge cache
      - name: Cache Forge Build
        uses: actions/cache@5a3ec84eff668545956fd18022155c47e93e2684
        with:
          path: |
            cache/
            out/
          key: ${{ runner.os }}-forge-${{ hashFiles('**/foundry.toml', '**/remappings.txt', 'src/**/*.sol', 'lib/**/*.sol') }}
          restore-keys: |
            ${{ runner.os }}-forge-

      # Install the Foundry toolchain.
      - name: Install Foundry
        uses: foundry-rs/foundry-toolchain@82dee4ba654bd2146511f85f0d013af94670c4de
        with:
          version: v1.5.0

      # Run Forge's formatting checker to ensure consistent code style.
      - name: "Forge Fmt"
        run: |
          forge fmt --check
          FOUNDRY_PROFILE=test forge fmt --check
        id: fmt

      # Build the project and display contract sizes.
      - name: Forge Build
        run: |
          forge --version
          forge build --sizes

      - name: Validate Solidity Scripts
        run: |
          # Find all .sol files under /script/releases
          RELEASE_FILES=$(find script/releases -type f -name "*.sol" ! -name "Env.sol" ! -name "CrosschainDeployLib.sol" ! -name "TestUtils.sol"  ! -name "CoreContractsDeployer.sol" ! -name "CoreUpgradeQueueBuilder.sol" 2>/dev/null || echo "")
          
          # Combine file lists
          FILES="$RELEASE_FILES"
          
          # Trim leading/trailing whitespace
          FILES=$(echo "$FILES" | xargs)
          
          # Exit with success if no files are found
          if [ -z "$FILES" ]; then
            echo "No .sol files found under /script/releases directories"
            exit 0
          fi
          
          # Set RPC URL based on environment
          if [ "${{ matrix.env }}" = "testnet-hoodi" ]; then
            RPC_URL="${{ secrets.RPC_HOODI }}"
          elif [ "${{ matrix.env }}" = "testnet-sepolia" ]; then
            RPC_URL="${{ secrets.RPC_SEPOLIA }}"
          elif [ "${{ matrix.env }}" = "testnet-base-sepolia" ]; then
            RPC_URL="${{ secrets.RPC_BASE_SEPOLIA }}"
          elif [ "${{ matrix.env }}" = "mainnet" ]; then
            RPC_URL="${{ secrets.RPC_MAINNET }}"
          elif [ "${{ matrix.env }}" = "base" ]; then
            RPC_URL="${{ secrets.RPC_BASE }}"
          elif [ "${{ matrix.env }}" = "preprod-hoodi" ]; then
            RPC_URL="${{ secrets.RPC_HOODI }}"
          fi
          
          # Run zeus test on each file with the specified environment and RPC URL
          for file in $FILES; do
            echo "Testing $file in ${{ matrix.env }} environment with RPC $RPC_URL..."
            zeus test --env ${{ matrix.env }} --rpcUrl "$RPC_URL" "$file" 
          done
````

## File: .github/labeler.yml
````yaml
# Cannot move to .github/configs/ for some reason... this should do for now.

# Applies when PR branch name contains "bug" or "fix"
'🐞 Bug':
  - head-branch: ['bug']

# Applies when PR branch name contains "chore"
'📜 Chore':
  - head-branch: ['chore']
  - changed-files:
    - any-glob-to-any-file: ['.github/**/*', '.vscode/**/*', '.devcontainer/**/*', '.*', '.*rc', '.*ignore', '.env*']

# Applies when PR branch name contains "docs" or "documentation" or changes markdown files
'📖 Documentation':
  - head-branch: ['docs', 'documentation']
  - changed-files:
    - any-glob-to-any-file: ['**/*.md']

# Applies when PR branch name contains "feat", "feature", or "enhance" or changes contract files
'✨ Enhancement':
  - head-branch: ['feat', 'feature', 'enhance']
  - changed-files:
    - any-glob-to-any-file: ['src/contracts/**/*']

# Applies when PR branch name contains "fix", "bug", or "patch"
'🔧 Fix':
  - head-branch: ['fix', 'patch']

# Applies when PR branch name contains "optimize" or "perf"
'⚡ Optimization':
  - head-branch: ['optimize', 'perf']

# Applies when PR branch name contains "refactor"
'♻️ Refactor':
  - head-branch: ['refactor']

# Applies when PR changes script files
'📜 Script':
  - changed-files:
    - any-glob-to-any-file: ['script/**/*', 'bin/**/*']

# Applies when PR targets the slashing integration testing branch
'🗡️ Slashing Release':
  - base-branch: ['slashing','test/slashing-integration-testing']

# Applies when PR changes test files
'🧪 Test':
  - changed-files:
    - any-glob-to-any-file: ['src/test/**/*']
````

## File: .github/pull_request_template.md
````markdown
<!-- 
    🚨 ATTENTION! 🚨 
    
    This PR template is REQUIRED. PRs not following this format will be closed without review.
    
    Requirements:
    - PR title must follow commit conventions: https://www.conventionalcommits.org/en/v1.0.0/
    - Label your PR with the correct type (e.g., 🐛 Bug, ✨ Enhancement, 🧪 Test, etc.)
    - Provide clear and specific details in each section
-->

**Motivation:**

*Explain here the context, and why you're making that change. What is the problem you're trying to solve.*

**Modifications:**

*Describe the modifications you've done.*

**Result:**

*After your change, what will change.*
````

## File: bin/compile-bindings.sh
````bash
#!/bin/bash

BINDING_DIR=./pkg/bindings
JSON_DIR=./out

function create_binding {
    contract_name=$1

    mkdir -p $BINDING_DIR/${contract_name}

    contract_json_path="${JSON_DIR}/${contract_name}.sol/${contract_name}.json"

    binding_out_dir="${BINDING_DIR}/${contract_name}"
    mkdir -p $binding_out_dir || true

    cat $contract_json_path | jq -r '.abi' > $binding_out_dir/tmp.abi
    cat $contract_json_path | jq -r '.bytecode.object' > $binding_out_dir/tmp.bin

    abigen \
        --bin=$binding_out_dir/tmp.bin \
        --abi=$binding_out_dir/tmp.abi \
        --pkg="${contract_name}" \
        --out=$BINDING_DIR/$contract_name/binding.go \
        > /dev/null 2>&1

    if [[ $? == "1" ]];
    then
        echo "Failed to generate binding for $contract_json_path"
    fi
    rm $binding_out_dir/tmp.abi
    rm $binding_out_dir/tmp.bin
}

contracts=$(find src/contracts -type f -name "*.sol" )
IFS=$'\n'

for contract_name in $contracts; do
	contract_name=$(basename $contract_name .sol)
	create_binding $contract_name
done
````

## File: bin/install-deps.sh
````bash
#!/usr/bin/env bash

OS=$(uname -s | tr '[:upper:]' '[:lower:]')
ARCH=$(uname -a | tr '[:upper:]' '[:lower:]')

linuxAmd64="https://gethstore.blob.core.windows.net/builds/geth-alltools-linux-amd64-1.14.6-aadddf3a.tar.gz"
linuxArm64="https://gethstore.blob.core.windows.net/builds/geth-alltools-linux-arm64-1.14.5-0dd173a7.tar.gz"


if [[ "$OS" == "linux" ]]; then
    sudo apt-get update
    sudo apt-get install -y make curl git software-properties-common jq

    if [[ $ARCH == *"x86_64"* ]]; then
        curl -L $linuxAmd64 | tar -xz
    elif [[ $ARCH == *"aarch64"* ]]; then
        curl -L $linuxArm64 | tar -xz
    else
        echo "Unsupported architecture: $ARCH"
        exit 1
    fi
elif [[ "$OS" == "darwin" ]]; then
    brew tap ethereum/ethereum
    brew install libusb ethereum@1.14.5
else
    echo "Unsupported OS: $OS"
    exit 1
fi

curl -L https://foundry.paradigm.xyz | bash

cp -R /root/.foundry/bin/* /usr/local/bin/

foundryup

cp -R /root/.foundry/bin/* /usr/local/bin/
````

## File: bin/pre-commit.sh
````bash
#!/bin/sh

make bindings
````

## File: bin/source-env.sh
````bash
#!/bin/bash

# Check for arguments
if [ "$#" -ne 1 ]; then
    echo "Usage: $0 [local]"
    return 1
fi

case $1 in
    local)
        CHAIN_ID=31337
        FOUNDRY_FUZZ_RUNS=256
        ;;
    *)
        echo "Invalid argument. Usage: $0 [local]"
        return 1
        ;;
esac

# Export environment variables
export CHAIN_ID=$CHAIN_ID
export EXECUTOR_MULTISIG=$EXECUTOR_MULTISIG
export FOUNDRY_FUZZ_RUNS=$FOUNDRY_FUZZ_RUNS

# Print environment variables
echo "Environment variables set:"
echo "CHAIN_ID: $CHAIN_ID"
echo "EXECUTOR_MULTISIG: $EXECUTOR_MULTISIG"
echo "FOUNDRY_FUZZ_RUNS: $FOUNDRY_FUZZ_RUNS"
````

## File: bin/storage-diff.sh
````bash
#!/bin/bash

# Default values
RPC_URL="https://eth.llamarpc.com"
ETHERSCAN_API_KEY="1234567890123456789012345678901234567890"
INPUT_FILE="contracts.json"
QUIET=false
TOTAL_ISSUES=0
TOTAL_ERRORS=0

# Help message
usage() {
    cat << EOF
Usage: bash $0 --rpc-url $RPC_URL --etherscan-key $ETHERSCAN_API_KEY --input $INPUT_FILE [--quiet] [--help]

Detects storage layout incompatibilities that could cause issues during upgrades.

Required:
    -r, --rpc-url <url>         RPC endpoint URL for the target network (default: https://eth.llamarpc.com).
    -e, --etherscan-key <key>   API key for Etherscan to fetch contract data.

Options:
    -i, --input <file>          JSON file containing contract details, see format below (default: contracts.json).
                                If not provided, reads from stdin.
    -q, --quiet                 Suppress informational output.
    -h, --help                  Show this help message.


Input JSON format:
{
  "contracts": [
    {
      "name": "AVSDirectory",
      "address": "0x135dda560e946695d6f155dacafc6f1f25c1f5af"
    },
    {
      "name": "DelegationManager",
      "address": "0x39053D51B77DC0d36036Fc1fCc8Cb819df8Ef37A"
    }
  ]
}
EOF
    exit 1
}

# Process command line arguments using a while loop and case statement.
while [[ $# -gt 0 ]]; do
    case $1 in
        -r|--rpc-url)
            RPC_URL="$2"
            shift 2
            ;;
        -e|--etherscan-key)
            ETHERSCAN_API_KEY="$2"
            shift 2
            ;;
        -i|--input)
            INPUT_FILE="$2"
            shift 2
            ;;
        -q|--quiet)
            QUIET=true
            shift
            ;;
        -h|--help)
            usage
            ;;
        *)
            echo "Unknown option: $1"
            usage
            ;;
    esac
done

# Validate required arguments
if [ -z "$RPC_URL" ] || [ -z "$ETHERSCAN_API_KEY" ]; then
    echo "Error: RPC URL and Etherscan API key are required"
    usage
fi

# Read JSON input
if [ -n "$INPUT_FILE" ]; then
    if [ ! -f "$INPUT_FILE" ]; then
        echo "Error: Input file not found: $INPUT_FILE"
        exit 1
    fi
    json_input=$(cat "$INPUT_FILE")
else
    json_input=$(cat)
fi

# Parse JSON values using jq
CONTRACTS=$(echo "$json_input" | jq -c '.contracts[]')

# Verify contracts are specified
if [ -z "$CONTRACTS" ]; then
    echo "Error: No contracts specified in JSON input"
    exit 1
fi

# Function to calculate number of slots a variable type occupies
calculate_slots() {
    local var_type=$1

    # Handle basic types
    case $var_type in
        *"uint256"*|*"int256"*|*"bytes32"*|*"address"*)
            echo 1
            ;;
        *"mapping"*)
            echo 1  # Mappings use 1 slot for the starting position
            ;;
        *"bytes"*|*"string"*)
            echo 1  # Dynamic types use 1 slot for length/pointer
            ;;
        *"array"*)
            echo 1  # Arrays use 1 slot for length/pointer, need to figure out how to parse slots consumed.
            ;;
        *)
            # Default to 1 slot if unknown
            echo 1
            ;;
    esac
}

# Function to analyze storage changes
analyze_storage_changes() {
    local onchain_file=$1
    local local_file=$2
    local contract_name=$3
    local TOTAL_ERRORS=0  # Changed from issues_found to TOTAL_ERRORS
    local warnings_found=0  # New counter for non-critical changes

    # Get the storage layouts as arrays
    local onchain_slots=$(jq -r '.storage[] | "\(.slot)|\(.label)|\(.offset)|\(.type)"' "$onchain_file")
    local local_slots=$(jq -r '.storage[] | "\(.slot)|\(.label)|\(.offset)|\(.type)"' "$local_file")

    echo "Storage Layout Analysis for $contract_name:"
    echo "----------------------------------------"

    # Create temporary files for our data structures
    local onchain_map_file=$(mktemp)
    local local_map_file=$(mktemp)
    local processed_slots_file=$(mktemp)
    local renamed_vars_file=$(mktemp)

    # Parse onchain slots
    echo "$onchain_slots" | while IFS='|' read -r slot label offset type; do
        if [[ -n "$slot" ]]; then
            echo "${slot}|${label}|${offset}|${type}" >> "$onchain_map_file"
        fi
    done

    # Parse local slots
    echo "$local_slots" | while IFS='|' read -r slot label offset type; do
        if [[ -n "$slot" ]]; then
            echo "${slot}|${label}|${offset}|${type}" >> "$local_map_file"
        fi
    done

    # First pass: Check for renames (same slot, same type, different name)
    while IFS='|' read -r slot local_label local_offset local_type; do
        if [[ -z "$slot" ]]; then continue; fi

        onchain_line=$(grep "^${slot}|" "$onchain_map_file")
        if [[ -n "$onchain_line" ]]; then
            IFS='|' read -r _ onchain_label onchain_offset onchain_type <<< "$onchain_line"

            if [[ "$local_label" != "$onchain_label" && "$local_type" == "$onchain_type" && "$local_offset" == "$onchain_offset" ]]; then
                echo "${slot}|${onchain_label}|${local_label}|${local_type}" >> "$renamed_vars_file"
                echo "$slot" >> "$processed_slots_file"
                warnings_found=$((warnings_found + 1))  # Renames are just warnings
            fi
        fi
    done < "$local_map_file"

    # Print renames first
    while IFS='|' read -r slot old_name new_name type; do
        if [[ -n "$slot" ]]; then
            echo -e "\033[36m📝 Variable renamed at slot $slot:\033[0m"
            echo -e "\033[36m   $old_name -> $new_name ($type)\033[0m"
        fi
    done < "$renamed_vars_file"

    # Analyze other differences
    while IFS='|' read -r slot local_label local_offset local_type; do
        if [[ -z "$slot" ]]; then continue; fi

        if grep -q "^${slot}$" "$processed_slots_file"; then
            continue
        fi

        onchain_line=$(grep "^${slot}|" "$onchain_map_file")
        if [[ -z "$onchain_line" ]]; then
            # New variable added - just a warning
            slots_needed=$(calculate_slots "$local_type")
            echo -e "\033[32m✨ New variable added: $local_label ($local_type) at slot $slot\033[0m"
            warnings_found=$((warnings_found + 1))
            if [ "$slots_needed" -gt 1 ]; then
                echo -e "\033[33m   📦 This variable occupies $slots_needed slots\033[0m"
            fi
        else
            IFS='|' read -r _ onchain_label onchain_offset onchain_type <<< "$onchain_line"

            if [[ "$local_label" != "$onchain_label" ]]; then
                # Only treat as critical error if we're not overriding a gap variable
                if [[ "$onchain_label" != "__gap" ]]; then
                    # Storage slot override is a critical error
                    echo -e "\033[31m🚨 CRITICAL: Storage slot override detected at slot $slot:\033[0m"
                    echo -e "\033[31m   Previous: $onchain_label ($onchain_type)\033[0m"
                    echo -e "\033[32m   New: $local_label ($local_type)\033[0m"
                    TOTAL_ERRORS=$((TOTAL_ERRORS + 1))

                    old_slots=$(calculate_slots "$onchain_type")
                    new_slots=$(calculate_slots "$local_type")
                    slot_diff=$((new_slots - old_slots))

                    if [ "$slot_diff" -gt 0 ]; then
                        echo -e "\033[31m   ⚠️ CRITICAL: This change will shift subsequent storage slots by +$slot_diff positions\033[0m"
                    elif [ "$slot_diff" -lt 0 ]; then
                        echo -e "\033[31m   ⚠️ CRITICAL: This change will shift subsequent storage slots by $slot_diff positions\033[0m"
                    fi
                else
                    # Just a warning for gap overrides
                    echo -e "\033[33m📝 Gap variable override at slot $slot:\033[0m"
                    echo -e "\033[33m   Previous: $onchain_label ($onchain_type)\033[0m"
                    echo -e "\033[33m   New: $local_label ($local_type)\033[0m"
                    warnings_found=$((warnings_found + 1))
                fi
            elif [[ "$local_type" != "$onchain_type" ]]; then
                # Type changes are critical errors
                echo -e "\033[31m🔄 CRITICAL: Type change detected for $local_label at slot $slot:\033[0m"
                echo -e "\033[31m   Previous: $onchain_type\033[0m"
                echo -e "\033[31m   New: $local_type\033[0m"
                TOTAL_ERRORS=$((TOTAL_ERRORS + 1))
            fi
        fi
        echo "$slot" >> "$processed_slots_file"
    done < "$local_map_file"

    # Check for removed variables
    while IFS='|' read -r slot onchain_label onchain_offset onchain_type; do
        if [[ -z "$slot" ]]; then continue; fi

        if grep -q "^${slot}$" "$processed_slots_file"; then
            continue
        fi

        if ! grep -q "^${slot}|" "$local_map_file"; then
            # Variable removal is a critical error
            echo -e "\033[31m➖ CRITICAL: Variable removed: $onchain_label ($onchain_type) from slot $slot\033[0m"
            TOTAL_ERRORS=$((TOTAL_ERRORS + 1))
        fi
    done < "$onchain_map_file"

    # Cleanup temporary files
    rm -f "$onchain_map_file" "$local_map_file" "$processed_slots_file" "$renamed_vars_file"

    if [ "$TOTAL_ERRORS" -gt 0 ]; then
        echo -e "\033[31mCritical storage layout errors found in $contract_name: $TOTAL_ERRORS\033[0m"
    else
        echo -e "\033[32mNo critical storage layout errors in $contract_name\033[0m"
    fi
    if [ "$warnings_found" -gt 0 ]; then
        echo "Non-critical changes found: $warnings_found"
    fi
    
    return $TOTAL_ERRORS  # Only return critical errors
}

# Function to process a single contract
process_contract() {
    local contract_name=$1
    local contract_address=$2
    local issues_found=0

    # Create directories for storing layouts and diffs
    mkdir -p "storage-report/layouts" "storage-report/diffs"
    local local_file="storage-report/layouts/${contract_name}_local.json"
    local onchain_file="storage-report/layouts/${contract_name}_onchain.json"
    local diff_file="storage-report/diffs/${contract_name}.diff"

    # Generate storage layouts
    if ! forge inspect "$contract_name" storage --json > "$local_file" 2>/dev/null; then
        echo "Error: forge inspect failed for contract: $contract_name"
        return 1
    fi

    if ! cast storage "$contract_address" --rpc-url "$RPC_URL" --etherscan-api-key "$ETHERSCAN_API_KEY" --json > "$onchain_file" 2>/dev/null; then
        echo "Error: cast storage failed for address: $contract_address"
        return 1
    fi

    # Delete the first line of $onchain_file
    sed '1d' "$onchain_file" > "$onchain_file.tmp" && mv "$onchain_file.tmp" "$onchain_file"

    # Filter out astId and contract fields from local and onchain files, and normalize type identifiers
    jq 'del(.types, .values, .storage[].astId, .storage[].contract) | .storage[].type |= gsub("\\([^)]+\\)[0-9]+"; "")' "$local_file" > "${local_file}.tmp" && mv "${local_file}.tmp" "$local_file"
    jq 'del(.types, .values, .storage[].astId, .storage[].contract) | .storage[].type |= gsub("\\([^)]+\\)[0-9]+"; "")' "$onchain_file" > "${onchain_file}.tmp" && mv "${onchain_file}.tmp" "$onchain_file"

    if [ "$QUIET" = false ]; then
        echo "----------------------------------------"
        echo "Local contract:  $contract_name"
        echo "Chain address:   $contract_address"
        echo "Network RPC:     $RPC_URL"
        echo "JSON files stored in: storage-report/layouts/"
        echo "Diffs stored in: storage-report/diffs/"
        echo "----------------------------------------"
    fi

    # Generate and store diff
    diff -u "$onchain_file" "$local_file" > "$diff_file" 2>/dev/null || true

    # Analyze storage changes
    analyze_storage_changes "$onchain_file" "$local_file" "$contract_name"
    issues_found=$?
    TOTAL_ERRORS=$((TOTAL_ERRORS + issues_found))

    return $issues_found
}

# Process each contract from the JSON input
while IFS= read -r contract; do
    contract_name=$(echo "$contract" | jq -r '.name')
    contract_address=$(echo "$contract" | jq -r '.address')

    if [ -z "$contract_name" ] || [ -z "$contract_address" ]; then
        echo "Error: Each contract must specify both name and address"
        continue
    fi

    if [ "$QUIET" = false ]; then
        echo "Processing contract: $contract_name at $contract_address"
    fi
    process_contract "$contract_name" "$contract_address"
    TOTAL_ISSUES=$((TOTAL_ISSUES + $?))
done <<< "$CONTRACTS"

if [ "$TOTAL_ERRORS" -gt 0 ]; then
    echo -e "\n\033[31m🚨 Total critical storage layout errors found: $TOTAL_ERRORS\033[0m"
    exit 1
else
    echo -e "\n\033[32m✅ No critical storage layout errors found\033[0m"
fi

exit 0
````

## File: bin/storage-report.sh
````bash
#!/bin/sh

# Default output directory
OUTPUT_DIR=${1:-docs/storage-report}

# Function to print messages
log() {
    echo "$(date '+%Y-%m-%d %H:%M:%S') [INFO] $1"
}

# Function to print error messages
error() {
    echo "$(date '+%Y-%m-%d %H:%M:%S') [ERROR] $1" >&2
}

log "Starting the storage report generation."

# Create the output directory if it doesn't exist
if ! mkdir -p "$OUTPUT_DIR"; then
    error "Failed to create output directory: $OUTPUT_DIR"
    exit 1
fi

log "Output directory is set to: $OUTPUT_DIR"

# Loop through Solidity files and generate storage report
# NOTE: Ignores `src/contracts/interfaces` & `src/contracts/libraries` since they "should" not contain storage logic.
for file in $(find src/contracts -name "*.sol" ! -path "src/contracts/interfaces/*" ! -path "src/contracts/libraries/*"); do
    contract_name=$(basename "$file" .sol)
    
    # Check if the file exists and is readable
    if [ ! -r "$file" ]; then
        error "Cannot read file: $file"
        continue
    fi
    
    log "Processing contract: $contract_name"

    # Run forge inspect and capture errors
    if ! forge inspect "$contract_name" storage --pretty > "$OUTPUT_DIR/$contract_name.md"; then
        error "Failed to generate storage report for contract: $contract_name"
    else
        log "Storage report generated for contract: $contract_name"
    fi
done
````

## File: certora/.bin/verify.sh
````bash
#!/bin/bash
#
# This script should not be run directly but instead through a link
#

usage="$0 [-hd] [-f '<fun1> <fun2> ...'] [-l <bytes>] [<msg>] [<rule>]"

usage_long="\
Script for verifying contracts.\n\
\n\
 -h|--help        Print this message and exit\n\
 -d|--dev         Use dev mode: send to staging and run on master using
                  certoraRun.py\n\
 -f|--functions   Verify the listed functions only (for parametric rules)\n\
 -l|--hash-length hash bound length in bytes\n\
"

script=$0

scriptDir=$(cd $(dirname $script); pwd)
scriptName=$(basename $0 .sh)
contractName=$(echo $scriptName |sed 's/^verify//g')
module=$(basename $scriptDir)
projectBase=$scriptDir/../../..
confDir=$projectBase/certora/confs/$module

devFlags=""
certoraRun="certoraRun"

while [ $# -gt 0 ]; do
    case $1 in
        -h|--help)
            printf -- "${usage_long}\nIn summary:\n\n  $usage\n\n"
            exit 1
            ;;
        -d|--dev)
            devFlags="--server staging --commit_sha1 d6b1d13a2e01dda0b070d7c12a94f3d4bf27885c" # 7.25.2
            certoraRun=certoraRun.py
            ;;
        -f|--functions)
            methods=$2;
            shift
            ;;
        -l|--hash-length)
            hashLength=$2;
            shift
            ;;
        -*)
            echo "Error: invalid option '$1'"
            exit 1
            ;;
        *)
            break
    esac
    shift;
done

ARGS=

if [[ "$2" ]]; then
    ARGS+="--rule $2"
fi

if [[ $methods ]]; then
    ARGS+=" --method $methods"
fi

if [[ $hashLength ]]; then
    ARGS+=" --hashing_length_bound $hashLength"
fi

(
  cd $projectBase
  $certoraRun $confDir/$contractName.conf $ARGS --msg "$contractName $1 $2" $devFlags
)
````

## File: certora/confs/core/AllocationManager.conf
````
{
	"assert_autofinder_success": true,
	"build_cache": true,
	"files": [
		"certora/harnesses/AllocationManagerHarness.sol",
		"src/contracts/core/AllocationManagerView.sol",
		"src/contracts/permissions/PauserRegistry.sol",
		"src/contracts/permissions/PermissionController.sol",
		"certora/harnesses/DelegationManagerHarness.sol",
		"src/contracts/pods/EigenPodManager.sol",
		"src/contracts/core/StrategyManager.sol",
		"src/contracts/strategies/StrategyBase.sol",
		"certora/mocks/CertoraAVSRegistrar.sol",
		"lib/openzeppelin-contracts-v4.9.0/contracts/token/ERC20/ERC20.sol",
		"src/contracts/libraries/OperatorSetLib.sol",
		"certora/harnesses/ShortStringsUpgradeableHarness.sol"
	],
	"java_args": [],
	"link": [
		"AllocationManagerHarness:pauserRegistry=PauserRegistry",
		"DelegationManagerHarness:permissionController=PermissionController",
		"DelegationManagerHarness:allocationManager=AllocationManagerHarness",
		"AllocationManagerHarness:permissionController=PermissionController",
		"DelegationManagerHarness:strategyManager=StrategyManager",
		"AllocationManagerHarness:delegation=DelegationManagerHarness",
		"AllocationManagerHarness:viewImplementation=AllocationManagerView",
		"EigenPodManager:delegationManager=DelegationManagerHarness",
		"DelegationManagerHarness:eigenPodManager=EigenPodManager"
	],
	"loop_iter": "1",
	"msg": "AllocationManager",
	"optimistic_fallback": true,
	"optimistic_loop": true,
	"packages": [
		"@openzeppelin-upgrades=lib/openzeppelin-contracts-upgradeable-v4.9.0",
		"@openzeppelin=lib/openzeppelin-contracts-v4.9.0"
	],
	"parametric_contracts": [
		"AllocationManagerHarness"
	],
    "rule": [
        "pendingDiffStateTransitions",
        "pendingDiffStateTransitionModifyAllocations",
        "redistributionRecipientCannotBeDeadAddress"
    ],
	"process": "emv",
	"prover_args": [
		"-recursionErrorAsAssert false -recursionEntryLimit 3",
		"-splitParallel true",
		"-dontStopAtFirstSplitTimeout true",

		// To avoid "expanded to too many commands" error, and "too many blocks.."
        "-maxDecompiledCommandCount 10000000",
        "-maxBlockCount 200000"
	],
	"rule_sanity": "basic",
	"server": "production",
    "solc_via_ir": true,
	"solc_optimize": "1",
	"disable_solc_optimizers": ["cse", "peephole", "inliner", "deduplicate"],
	"verify": "AllocationManagerHarness:certora/specs/core/AllocationManagerRules.spec",
	"wait_for_results": "none",
}
````

## File: certora/confs/core/AllocationManagerOverslashing.conf
````
{
	"build_cache": true,
	"files": [
		"certora/harnesses/AllocationManagerHarness.sol",
		"certora/harnesses/DelegationManagerHarness.sol",
		"src/contracts/permissions/PauserRegistry.sol",
		"src/contracts/permissions/PermissionController.sol",
		"src/contracts/pods/EigenPodManager.sol",
		"src/contracts/core/StrategyManager.sol",
		"src/contracts/strategies/StrategyBase.sol",
		"certora/mocks/CertoraAVSRegistrar.sol",
		"lib/openzeppelin-contracts-v4.9.0/contracts/token/ERC20/ERC20.sol",
		"src/contracts/libraries/OperatorSetLib.sol",
		"certora/harnesses/ShortStringsUpgradeableHarness.sol",
		"src/contracts/core/AllocationManagerView.sol"
	],
	"java_args": [],
	"link": [
		"AllocationManagerHarness:pauserRegistry=PauserRegistry",
		"DelegationManagerHarness:permissionController=PermissionController",
		"DelegationManagerHarness:allocationManager=AllocationManagerHarness",
		"AllocationManagerHarness:permissionController=PermissionController",
		"DelegationManagerHarness:strategyManager=StrategyManager",
		"AllocationManagerHarness:delegation=DelegationManagerHarness",
		"EigenPodManager:delegationManager=DelegationManagerHarness",
		"DelegationManagerHarness:eigenPodManager=EigenPodManager",
		"AllocationManagerHarness:viewImplementation=AllocationManagerView"
	],
	"loop_iter": "1",
	"msg": "AllocationManager No Overslashing",
	"optimistic_fallback": true,
	"optimistic_loop": true,
	"packages": [
		"@openzeppelin-upgrades=lib/openzeppelin-contracts-upgradeable-v4.9.0",
		"@openzeppelin=lib/openzeppelin-contracts-v4.9.0"
	],
	"parametric_contracts": [
		"AllocationManagerHarness"
	],
    "rule": [
        "noOverslashingOfShares",
		"noOverslashingOfOperatorShares",
		"overslashingOfSharesAtMostOne",
    ],
	"process": "emv",
	"prover_args": [
		"-recursionErrorAsAssert",
		"false",
		"-recursionEntryLimit",
		"3",
		// "-dontStopAtFirstSplitTimeout",
		// "true",
		// "-split",
		// "false"
	],
	"smt_timeout": "7200",
	"rule_sanity": "basic",
	"server": "production",
    "solc_via_ir": true,
	"solc_optimize": "1",
	"disable_solc_optimizers": ["cse", "peephole", "inliner", "deduplicate"],
	"verify": "AllocationManagerHarness:certora/specs/core/AllocationManagerRules.spec",
	"wait_for_results": "none"
}
````

## File: certora/confs/core/AllocationManagerSanity.conf
````
{
    "assert_autofinder_success": true,
    "files": [
        "src/contracts/core/AllocationManager.sol",
        "src/contracts/permissions/PauserRegistry.sol",
        "src/contracts/permissions/PermissionController.sol",
        "src/contracts/core/DelegationManager.sol",
        "src/contracts/pods/EigenPodManager.sol",
        "src/contracts/core/StrategyManager.sol",
        "src/contracts/strategies/StrategyBase.sol",
        "certora/mocks/CertoraAVSRegistrar.sol",
        "lib/openzeppelin-contracts-v4.9.0/contracts/token/ERC20/ERC20.sol",
        "src/contracts/libraries/OperatorSetLib.sol"
    ],
    "java_args": [],
    "link": [
        "AllocationManager:pauserRegistry=PauserRegistry",
        "DelegationManager:permissionController=PermissionController",
        "DelegationManager:allocationManager=AllocationManager",
        "AllocationManager:permissionController=PermissionController",
        "DelegationManager:strategyManager=StrategyManager",
        "AllocationManager:delegation=DelegationManager",
        "EigenPodManager:delegationManager=DelegationManager",
        "DelegationManager:eigenPodManager=EigenPodManager"
    ],
    "loop_iter": "2",
    "optimistic_fallback": true,
    "optimistic_loop": true,
    "packages": [
        "@openzeppelin-upgrades=lib/openzeppelin-contracts-upgradeable-v4.9.0",
        "@openzeppelin=lib/openzeppelin-contracts-v4.9.0"
    ],
    "parametric_contracts": [
        "AllocationManager"
    ],
    "process": "emv",
    "prover_args": [
        " -recursionErrorAsAssert false -recursionEntryLimit 3"
    ],
    "solc_optimize": "1",
    "solc_via_ir": true,
    "disable_solc_optimizers": ["cse", "peephole", "inliner", "deduplicate"],
    "verify": "AllocationManager:certora/specs/core/AllocationManagerSanity.spec"
}
````

## File: certora/confs/core/AllocationManagerValidState.conf
````
{
	"files": [
		"certora/harnesses/AllocationManagerHarness.sol",
		"src/contracts/permissions/PauserRegistry.sol",
		"src/contracts/permissions/PermissionController.sol",
		"src/contracts/core/DelegationManager.sol",
		"src/contracts/pods/EigenPodManager.sol",
		"src/contracts/core/StrategyManager.sol",
		"src/contracts/strategies/StrategyBase.sol",
		"certora/mocks/CertoraAVSRegistrar.sol",
		"lib/openzeppelin-contracts-v4.9.0/contracts/token/ERC20/ERC20.sol",
		"src/contracts/libraries/OperatorSetLib.sol",
        "certora/harnesses/ShortStringsUpgradeableHarness.sol",
		"src/contracts/core/AllocationManagerView.sol"
	],
	"java_args": [],
	"link": [
		"AllocationManagerHarness:pauserRegistry=PauserRegistry",
		"DelegationManager:permissionController=PermissionController",
		"DelegationManager:allocationManager=AllocationManagerHarness",
		"AllocationManagerHarness:permissionController=PermissionController",
		"DelegationManager:strategyManager=StrategyManager",
		"AllocationManagerHarness:delegation=DelegationManager",
		"EigenPodManager:delegationManager=DelegationManager",
		"DelegationManager:eigenPodManager=EigenPodManager",
		"AllocationManagerHarness:viewImplementation=AllocationManagerView"
	],
	"loop_iter": "1",
	"msg": "AllocationManagerValidState",
	"optimistic_fallback": true,
	"optimistic_loop": true,
	"packages": [
		"@openzeppelin-upgrades=lib/openzeppelin-contracts-upgradeable-v4.9.0",
		"@openzeppelin=lib/openzeppelin-contracts-v4.9.0"
	],
	"parametric_contracts": [
		"AllocationManagerHarness"
	],
	"process": "emv",
	"prover_args": [
		" -recursionErrorAsAssert false -recursionEntryLimit 3"
	],
	"split_rules": [
		"EndGreaterThenBegin",
		"SetInRegisteredIFFStatusIsTrue",
		"allocatedSetsInvariant",
		"currentMagnitudeLeqWAD",
		"deallocationQueueDataOutOfBoundsAreNullified",
		"deallocationQueueDataUniqueness",
		"deallocationQueueEffectBlocLessThanCurrBlockNumberPlushDelayPlusOne",
		"deallocationQueueEffectBlockAscendingOrder",
		"effectBlockZeroHasNoPendingDiff",
		"encumberedMagnitudeEqSumOfCurrentMagnitudesAndPositivePending",
		"encumberedMagnitudeLeqWAD",
		"maxMagnitudeGECurrentMagnitude",
		"maxMagnitudeGEencumberedMagnitude",
		"maxMagnitudeHistoryKeysLessThanCurrentBlock",
		"maxMagnitudeHistoryKeysMonotonicInc",
		"maxMagnitudeHistoryPastLengthNullified",
		"maxMagnitudeLeqWAD",
		"maxMagnitudeMonotonicallyDecreasing",
		"negativePendingDiffAtMostCurrentMagnitude",
		"noPositivePendingDiffInDeallocationQ",
		"noZeroKeyInDealocationQ",
		"operatorSetsInvariant",
		"registeredSetsInvariant",
		"sumOfPendingDiffCurrentMagnitudeRespectsWAD"
	],
	"rule_sanity": "basic",
	"server": "production",
	"solc_optimize": "1",
    "solc_via_ir": true,
    "build_cache": true,
	"verify": "AllocationManagerHarness:certora/specs/core/AllocationManagerValidState.spec",
	"disable_solc_optimizers": ["cse", "peephole", "inliner", "deduplicate"],
	"wait_for_results": "none"
}
````

## File: certora/confs/core/DelegationManager.conf
````
{
    "files": [
        "certora/harnesses/DelegationManagerHarness.sol",
        "certora/harnesses/ShortStringsUpgradeableHarness.sol",
        "lib/openzeppelin-contracts-v4.9.0/contracts/token/ERC20/ERC20.sol",
        "lib/openzeppelin-contracts-v4.9.0/contracts/mocks/ERC1271WalletMock.sol",
        "src/contracts/pods/EigenPodManager.sol",
        "src/contracts/pods/EigenPod.sol",
        "src/contracts/strategies/StrategyBase.sol",
        "src/contracts/core/StrategyManager.sol",
        "src/contracts/permissions/PauserRegistry.sol",
        "src/contracts/core/DelegationManager.sol",
        "src/contracts/permissions/PermissionController.sol",
        "src/contracts/core/AllocationManager.sol",
        "src/contracts/core/AllocationManagerView.sol"
    ],
    "link": [
        "AllocationManager:delegation=DelegationManagerHarness",
        "AllocationManager:viewImplementation=AllocationManagerView",
        "DelegationManagerHarness:permissionController=PermissionController",
        "DelegationManagerHarness:allocationManager=AllocationManager",
        "AllocationManager:permissionController=PermissionController",
        "DelegationManagerHarness:strategyManager=StrategyManager",
        "EigenPodManager:delegationManager=DelegationManagerHarness",
        "DelegationManagerHarness:eigenPodManager=EigenPodManager"
    ],
    "loop_iter": "2",
    "optimistic_fallback": true,
    "optimistic_hashing": true,
    "hashing_length_bound": "320",
    "optimistic_loop": true,
    "prover_args": [
        "-destructiveOptimizations twostage",
        "-mediumTimeout 20",
        "-lowTimeout 20",
        "-tinyTimeout 20",
        "-depth 20"
    ],
    "packages": [
        "@openzeppelin-upgrades=lib/openzeppelin-contracts-upgradeable-v4.9.0",
        "@openzeppelin=lib/openzeppelin-contracts-v4.9.0"
    ],
    "parametric_contracts": [
        "DelegationManagerHarness"
    ],
    "rule_sanity": "basic",
    "process": "emv",
    "solc_optimize": "1",
    "solc_via_ir": true,
    "verify": "DelegationManagerHarness:certora/specs/core/DelegationManager.spec"
}
````

## File: certora/confs/core/DelegationManagerValidState.conf
````
{
    "files": [
        "certora/harnesses/DelegationManagerHarness.sol",
        "certora/harnesses/ShortStringsUpgradeableHarness.sol",
        "lib/openzeppelin-contracts-v4.9.0/contracts/token/ERC20/ERC20.sol",
        "lib/openzeppelin-contracts-v4.9.0/contracts/mocks/ERC1271WalletMock.sol",
        "src/contracts/pods/EigenPodManager.sol",
        "src/contracts/pods/EigenPod.sol",
        "src/contracts/strategies/StrategyBase.sol",
        "src/contracts/core/StrategyManager.sol",
        "src/contracts/permissions/PauserRegistry.sol",
        "src/contracts/core/DelegationManager.sol",
        "src/contracts/permissions/PermissionController.sol",
        "src/contracts/core/AllocationManager.sol",
        "src/contracts/core/AllocationManagerView.sol"
    ],
    "link": [
        "AllocationManager:delegation=DelegationManagerHarness",
        "DelegationManagerHarness:permissionController=PermissionController",
        "DelegationManagerHarness:allocationManager=AllocationManager",
        "AllocationManager:permissionController=PermissionController",
        "DelegationManagerHarness:strategyManager=StrategyManager",
        "EigenPodManager:delegationManager=DelegationManagerHarness",
        "DelegationManagerHarness:eigenPodManager=EigenPodManager",
        "AllocationManager:viewImplementation=AllocationManagerView"
    ],
    "loop_iter": "1",
    "optimistic_fallback": true,
    "optimistic_hashing": true,
    "hashing_length_bound": "320",
    "optimistic_loop": true,
    "packages": [
        "@openzeppelin-upgrades=lib/openzeppelin-contracts-upgradeable-v4.9.0",
        "@openzeppelin=lib/openzeppelin-contracts-v4.9.0"
    ],
    "parametric_contracts": [
        "DelegationManagerHarness"
    ],
    "rule_sanity": "basic",
    "process": "emv",
    "solc_optimize": "1",
    "solc_via_ir": true,
    "verify": "DelegationManagerHarness:certora/specs/core/DelegationManagerValidState.spec"
}
````

## File: certora/confs/core/StrategyManager.conf
````
{
    "files": [
        "certora/harnesses/ShortStringsUpgradeableHarness.sol",
        "certora/harnesses/StrategyManagerHarness.sol",
        "lib/openzeppelin-contracts-v4.9.0/contracts/token/ERC20/ERC20.sol",
        "lib/openzeppelin-contracts-v4.9.0/contracts/mocks/ERC1271WalletMock.sol",
        "src/contracts/pods/EigenPodManager.sol",
        "src/contracts/pods/EigenPod.sol",
        "src/contracts/strategies/StrategyBase.sol",
        "src/contracts/core/DelegationManager.sol",
        "src/contracts/permissions/PauserRegistry.sol",
        "src/contracts/core/AllocationManager.sol",
        "src/contracts/core/AllocationManagerView.sol"

    ],
    "link": [
        "DelegationManager:allocationManager=AllocationManager",
        "DelegationManager:eigenPodManager=EigenPodManager",
        "StrategyManagerHarness:delegation=DelegationManager", 
        "StrategyManagerHarness:allocationManager=AllocationManager",
        "AllocationManager:viewImplementation=AllocationManagerView"
    ],
    "loop_iter": "2",
    "optimistic_fallback": true,
    "optimistic_hashing": true,
    "hashing_length_bound": "320",
    "optimistic_loop": true,
    "packages": [
        "@openzeppelin-upgrades=lib/openzeppelin-contracts-upgradeable-v4.9.0",
        "@openzeppelin=lib/openzeppelin-contracts-v4.9.0"
    ],
    "parametric_contracts": [
        "StrategyManagerHarness"
    ],
    "process": "emv",
    "solc_optimize": "1",
    "solc_via_ir": true,
    "verify": "StrategyManagerHarness:certora/specs/core/StrategyManager.spec",
    "rule_sanity": "basic", 
    "server": "production"
}
````

## File: certora/confs/multichain/BaseConfForInheritance.conf
````
{
  "assert_autofinder_success": true,
  "global_timeout": "7200",
  "loop_iter": "2",
  "optimistic_loop": true,
  "solc": "solc",
  "solc_optimize": "200",
  "solc_via_ir": false,
  "server": "production",
  "packages": [
    "husky=node_modules/husky",
    "@commitlint/cli=node_modules/@commitlint/cli",
    "@commitlint/config-conventional=node_modules/@commitlint/config-conventional",
    "forge-std=lib/forge-std/src",
    "ds-test=lib/ds-test/src",
    "@openzeppelin=lib/openzeppelin-contracts-v4.9.0",
    "@openzeppelin-upgrades=lib/openzeppelin-contracts-upgradeable-v4.9.0",
    "openzeppelin-contracts-upgradeable=lib/openzeppelin-contracts-upgradeable-v4.9.0"
  ],
  "prover_args": [
    "-verifyCache",
    "-verifyTACDumps",
    "-testMode",
    "-checkRuleDigest",
    "-callTraceHardFail on",
    "-allowArrayLengthUpdates true",
    "-linearInvariantBound 4"
  ],
  "build_cache": true
}
````

## File: certora/confs/multichain/BN254CertificateVerifier.conf
````
{
    "files": [
        "src/contracts/multichain/BN254CertificateVerifier.sol",
        "src/contracts/multichain/OperatorTableUpdater.sol",
        "certora/harnesses/OperatorSetHelper.sol"
    ],
    "link": [
        "BN254CertificateVerifier:operatorTableUpdater=OperatorTableUpdater"
    ],
    "msg": "BN254CertificateVerifier",
    "verify": "BN254CertificateVerifier:certora/specs/multichain/BN254CertificateVerifier.spec",
    "override_base_config": "certora/confs/multichain/BaseConfForInheritance.conf",
    "prover_args": [
        "-verifyCache",
        "-verifyTACDumps",
        "-testMode",
        "-checkRuleDigest",
        "-callTraceHardFail on",
        "-allowArrayLengthUpdates true",
        "-linearInvariantBound 4",
        "-assumeFPStrictlyMonotonic false"
    ],
    "optimistic_hashing": true
}
````

## File: certora/confs/multichain/CrossChainRegistry.conf
````
{
    "files": [
        "certora/harnesses/CrossChainRegistryHarness.sol",
        "src/contracts/permissions/PauserRegistry.sol",
        "src/contracts/core/AllocationManager.sol",
        "src/contracts/permissions/KeyRegistrar.sol",
        "src/contracts/permissions/PermissionController.sol",
        "src/test/mocks/OperatorTableCalculatorMock.sol",
        "certora/harnesses/OperatorSetHelper.sol",
        "src/contracts/core/AllocationManagerView.sol"
    ],
    "link": [
        "CrossChainRegistryHarness:pauserRegistry=PauserRegistry",
        "CrossChainRegistryHarness:allocationManager=AllocationManager",
        "CrossChainRegistryHarness:keyRegistrar=KeyRegistrar",
        "CrossChainRegistryHarness:permissionController=PermissionController",
        "AllocationManager:viewImplementation=AllocationManagerView"
    ],
    "msg": "CrossChainRegistry Rules",
    "mutations": {
        "gambit": [
            {
                "filename": "src/contracts/multichain/CrossChainRegistryHarness.sol",
                "num_mutants": 5
            }
        ]
    },
    "packages": [
        "husky=node_modules/husky",
        "@commitlint/cli=node_modules/@commitlint/cli",
        "@commitlint/config-conventional=node_modules/@commitlint/config-conventional",
        "forge-std=lib/forge-std/src",
        "ds-test=lib/ds-test/src",
        "@openzeppelin=lib/openzeppelin-contracts-v4.9.0",
        "@openzeppelin-upgrades=lib/openzeppelin-contracts-upgradeable-v4.9.0"
    ],
    "parametric_contracts": [
        "CrossChainRegistryHarness"
    ],
    "optimistic_contract_recursion": true,
    "contract_recursion_limit": "2",
    "optimistic_summary_recursion": true,
    "summary_recursion_limit": "2",
    "verify": "CrossChainRegistryHarness:certora/specs/multichain/CrossChainRegistry.spec",
    "override_base_config": "certora/confs/multichain/BaseConfForInheritance.conf"
}
````

## File: certora/confs/multichain/ECDSACertificateVerifier.conf
````
{
    "files": [
        "src/contracts/multichain/ECDSACertificateVerifier.sol",
        "src/contracts/multichain/OperatorTableUpdater.sol",
        "lib/openzeppelin-contracts-upgradeable-v4.9.0/contracts/mocks/ERC1271WalletMockUpgradeable.sol",
        "certora/harnesses/OperatorSetHelper.sol"
    ],
    "link": [
        "ECDSACertificateVerifier:operatorTableUpdater=OperatorTableUpdater"
    ],
    "msg": "ECDSACertificateVerifier",
    "mutations": {
        "gambit": [
            {
                "filename": "src/contracts/multichain/ECDSACertificateVerifier.sol",
                "num_mutants": 5
            }
        ]
    },
    "verify": "ECDSACertificateVerifier:certora/specs/multichain/ECDSACertificateVerifier.spec",
    "override_base_config": "certora/confs/multichain/BaseConfForInheritance.conf"
}
````

## File: certora/confs/multichain/KeyRegistrar.conf
````
{
    "files": [
        "certora/harnesses/KeyRegistrarHarness.sol",
        "certora/mocks/CertoraAVSRegistrar.sol",
        "src/contracts/core/AllocationManager.sol",
        "src/contracts/core/DelegationManager.sol",
        "src/contracts/permissions/PermissionController.sol",
        "src/contracts/libraries/OperatorSetLib.sol",
        "src/contracts/pods/EigenPodManager.sol",
        "src/contracts/core/StrategyManager.sol",
        "src/contracts/permissions/PauserRegistry.sol",
        "src/contracts/strategies/StrategyBase.sol"
    ],
    "link": [
        "KeyRegistrarHarness:allocationManager=AllocationManager",
        "KeyRegistrarHarness:permissionController=PermissionController",
        "AllocationManager:delegation=DelegationManager",
        "AllocationManager:pauserRegistry=PauserRegistry",
        "DelegationManager:permissionController=PermissionController",
        "DelegationManager:allocationManager=AllocationManager",
        "AllocationManager:permissionController=PermissionController",
        "DelegationManager:strategyManager=StrategyManager",
        "EigenPodManager:delegationManager=DelegationManager",
        "DelegationManager:eigenPodManager=EigenPodManager"
    ],
    "parametric_contracts": [
        "KeyRegistrarHarness"
    ],
    "msg": "KeyRegistrar",
    "verify": "KeyRegistrarHarness:certora/specs/permissions/KeyRegistrar.spec",
    "override_base_config": "certora/confs/multichain/BaseConfForInheritance.conf",
    "optimistic_hashing": true,
    "build_cache": true
}
````

## File: certora/confs/multichain/OperatorTableUpdater.conf
````
{
    "files": [
        "src/contracts/multichain/BN254CertificateVerifier.sol",
        "src/contracts/multichain/ECDSACertificateVerifier.sol",
        "src/contracts/permissions/PauserRegistry.sol",
        "certora/harnesses/OperatorTableUpdaterHarness.sol"
    ],
    "link": [
        "OperatorTableUpdaterHarness:bn254CertificateVerifier=BN254CertificateVerifier",
        "OperatorTableUpdaterHarness:ecdsaCertificateVerifier=ECDSACertificateVerifier",
        "OperatorTableUpdaterHarness:pauserRegistry=PauserRegistry",
        "BN254CertificateVerifier:operatorTableUpdater=OperatorTableUpdaterHarness"
    ],
    "msg": "OperatorTableUpdater",
    "verify": "OperatorTableUpdaterHarness:certora/specs/multichain/OperatorTableUpdater.spec",
    "override_base_config": "certora/confs/multichain/BaseConfForInheritance.conf",
    "prover_args": [
        "-verifyCache",
        "-verifyTACDumps",
        "-testMode",
        "-checkRuleDigest",
        "-callTraceHardFail on",
        "-allowArrayLengthUpdates true",
        "-linearInvariantBound 4"
    ],
    "optimistic_hashing": true
}
````

## File: certora/confs/permissions/Pausable.conf
````
{
    "files": [
        "certora/harnesses/PausableHarness.sol",
        "src/contracts/permissions/PauserRegistry.sol"
    ],
    "link": [
        "PausableHarness:pauserRegistry=PauserRegistry"
    ],
    "loop_iter": "3",
    "optimistic_fallback": true,
    "optimistic_loop": true,
    "process": "emv",
    "prover_args": [
        " -recursionErrorAsAssert false -recursionEntryLimit 3"
    ],
    "solc_optimize": "1",
    "solc_via_ir": true,
    "verify": "PausableHarness:certora/specs/permissions/Pausable.spec"
}
````

## File: certora/confs/pods/EigenPod.conf
````
{
    "assert_autofinder_success": true,
    "auto_dispatcher": true,
    "optimistic_summary_recursion": true,
    "summary_recursion_limit": "1",
    "optimistic_contract_recursion": true,
    "contract_recursion_limit": "1",
    "files": [
        "src/contracts/pods/EigenPodManager.sol",
        "src/contracts/core/DelegationManager.sol",
        "src/contracts/permissions/PermissionController.sol",
        "src/contracts/core/AllocationManager.sol",
        "src/contracts/core/StrategyManager.sol",
        "src/contracts/permissions/PauserRegistry.sol",
        "src/contracts/pods/EigenPod.sol",
        "src/test/mocks/ETHDepositMock.sol:ETHPOSDepositMock",
        "lib/openzeppelin-contracts-v4.9.0/contracts/utils/Create2.sol"
    ],
    "java_args": [],
    "link": [
        "EigenPodManager:delegationManager=DelegationManager",
        "AllocationManager:pauserRegistry=PauserRegistry",
        "DelegationManager:permissionController=PermissionController",
        "DelegationManager:allocationManager=AllocationManager",
        "AllocationManager:permissionController=PermissionController",
        "DelegationManager:strategyManager=StrategyManager",
        "AllocationManager:delegation=DelegationManager",
        "DelegationManager:eigenPodManager=EigenPodManager"
    ],
    "loop_iter": "3",
    "optimistic_fallback": true,
    "optimistic_loop": true,
    "packages": [
        "@openzeppelin-upgrades=lib/openzeppelin-contracts-upgradeable-v4.9.0",
        "@openzeppelin=lib/openzeppelin-contracts-v4.9.0"
    ],
    "parametric_contracts": [
        "EigenPod"
    ],
    "process": "emv",
    "prover_args": [
        " -recursionErrorAsAssert false -recursionEntryLimit 3"
    ],
    "solc_optimize": "1",
    "solc_via_ir": true,
    "verify": "EigenPod:certora/specs/pods/EigenPod.spec",
    "server": "production",
    "rule_sanity": "basic"
}
````

## File: certora/confs/pods/EigenPodManagerRules.conf
````
{
    "assert_autofinder_success": true,
    "auto_dispatcher": true,
    "optimistic_summary_recursion": true,
    "summary_recursion_limit": "1",
    "optimistic_contract_recursion": true,
    "contract_recursion_limit": "1",
    "files": [
        "src/contracts/pods/EigenPodManager.sol",
        "src/contracts/core/DelegationManager.sol",
        "src/contracts/permissions/PermissionController.sol",
        "src/contracts/core/AllocationManager.sol",
        "src/contracts/core/StrategyManager.sol",
        "src/contracts/permissions/PauserRegistry.sol",
        "src/contracts/pods/EigenPod.sol",
        "src/test/mocks/ETHDepositMock.sol:ETHPOSDepositMock",
        "lib/openzeppelin-contracts-v4.9.0/contracts/utils/Create2.sol",
        "src/contracts/core/AllocationManagerView.sol"
    ],
    "java_args": [],
    "link": [
        "EigenPodManager:delegationManager=DelegationManager",
        "AllocationManager:pauserRegistry=PauserRegistry",
        "DelegationManager:permissionController=PermissionController",
        "DelegationManager:allocationManager=AllocationManager",
        "AllocationManager:permissionController=PermissionController",
        "DelegationManager:strategyManager=StrategyManager",
        "AllocationManager:delegation=DelegationManager",
        "DelegationManager:eigenPodManager=EigenPodManager",
        "AllocationManager:viewImplementation=AllocationManagerView"
    ],
    "loop_iter": "3",
    "optimistic_fallback": true,
    "optimistic_loop": true,
    "packages": [
        "@openzeppelin-upgrades=lib/openzeppelin-contracts-upgradeable-v4.9.0",
        "@openzeppelin=lib/openzeppelin-contracts-v4.9.0"
    ],
    "parametric_contracts": [
        "EigenPodManager"
    ],
    "process": "emv",
    "prover_args": [
        " -recursionErrorAsAssert false -recursionEntryLimit 3"
    ],
    "solc_optimize": "1",
    "solc_via_ir": true,
    "verify": "EigenPodManager:certora/specs/pods/EigenPodManagerRules.spec",
    "server": "production",
    "rule_sanity": "basic"
}
````

## File: certora/confs/strategies/StrategyBase.conf
````
{
    "files": [
        "src/contracts/strategies/StrategyBase.sol",
        "lib/openzeppelin-contracts-v4.9.0/contracts/token/ERC20/ERC20.sol",
        "src/contracts/core/StrategyManager.sol",
        "src/contracts/permissions/PauserRegistry.sol"
    ],
    "link": [
        "StrategyBase:strategyManager=StrategyManager"
    ],
    "loop_iter": "3",
    "optimistic_fallback": true,
    "optimistic_loop": true,
    "packages": [
        "@openzeppelin-upgrades=lib/openzeppelin-contracts-upgradeable-v4.9.0",
        "@openzeppelin=lib/openzeppelin-contracts-v4.9.0"
    ],
    "parametric_contracts": [
        "StrategyBase"
    ],
    "process": "emv",
    "prover_args": [],
    "solc_optimize": "1",
    "solc_via_ir": true,
    "verify": "StrategyBase:certora/specs/strategies/StrategyBase.spec"
}
````

## File: certora/harnesses/AllocationManagerHarness.sol
````
// SPDX-License-Identifier: BUSL-1.1
⋮----
import "../../src/contracts/core/AllocationManager.sol";
contract AllocationManagerHarness is AllocationManager {
⋮----
function getOperatorKey(address avs, uint32 operatorSetId) external view returns (bytes32) {
⋮----
function getOperatorSetFromKey(bytes32 key) external view returns (OperatorSet memory) {
⋮----
function getOperatorKeyFromSet(OperatorSet calldata os) external view returns (bytes32) {
````

## File: certora/harnesses/CrossChainRegistryHarness.sol
````
// SPDX-License-Identifier: BUSL-1.1
⋮----
import "../../src/contracts/multichain/CrossChainRegistry.sol";
⋮----
/**
 * @title CrossChainRegistryWrapper
 * @notice Exposes internal checkCanCall logic as an external function
 */
contract CrossChainRegistryHarness is CrossChainRegistry {
⋮----
/**
     * @dev Constructor that passes required parameters to the CrossChainRegistry base constructor
     * @param _allocationManager Address of the allocation manager contract
     * @param _keyRegistrar Address of the key registrar contract
     * @param _permissionController Address of the permission controller contract
     * @param _pauserRegistry Address of the pauser registry contract
     */
⋮----
/**
     * @notice External function to check whether a given address can call privileged functions
     * @param caller The address to check permissions for
     */
function canCall(address caller, address sender, uint32 selector) external returns (bool) {
````

## File: certora/harnesses/DelegationManagerHarness.sol
````
// SPDX-License-Identifier: BUSL-1.1
⋮----
import "../../src/contracts/core/DelegationManager.sol";
⋮----
contract DelegationManagerHarness is DelegationManager {
⋮----
function getSlashableSharesInQueueWithMag(address operator, IStrategy strategy, uint64 prevMaxMagnitude, uint64 maxMagnitude) public view returns (uint256) {
⋮----
// Return amount of slashable scaled shares remaining
⋮----
function get_operatorShares(address operator, IStrategy strategy) public view returns (uint256) {
⋮----
function get_stakerDelegateableShares(address staker, IStrategy strategy) public view returns (uint256) {
// this is the address of the virtual 'beaconChainETH' strategy
⋮----
function get_min_withdrawal_delay_blocks() public view returns (uint32) {
⋮----
function canCall(address account, address caller, address target, uint32 selector) external returns (bool) {
````

## File: certora/harnesses/EigenPodHarness.sol
````
// SPDX-License-Identifier: BUSL-1.1
⋮----
import "../../src/contracts/pods/EigenPod.sol";
⋮----
contract EigenPodHarness is EigenPod {
⋮----
function get_validatorIndex(bytes32 pubkeyHash) public view returns (uint64) {
⋮----
function get_restakedBalanceGwei(bytes32 pubkeyHash) public view returns (uint64) {
⋮----
function get_mostRecentBalanceUpdateTimestamp(bytes32 pubkeyHash) public view returns (uint64) {
⋮----
function get_podOwnerShares() public view returns (int256) {
⋮----
function get_withdrawableRestakedExecutionLayerGwei() public view returns (uint256) {
⋮----
function get_ETH_Balance() public view returns (uint256) {
````

## File: certora/harnesses/EigenPodManagerHarness.sol
````
// SPDX-License-Identifier: BUSL-1.1
⋮----
import "../../src/contracts/pods/EigenPodManager.sol";
⋮----
contract EigenPodManagerHarness is EigenPodManager {
⋮----
function get_podOwnerShares(address podOwner) public view returns (int256) {
⋮----
function get_podByOwner(address podOwner) public view returns (IEigenPod) {
````

## File: certora/harnesses/KeyRegistrarHarness.sol
````
// SPDX-License-Identifier: BUSL-1.1
⋮----
import "src/contracts/permissions/KeyRegistrar.sol";
⋮----
contract KeyRegistrarHarness is KeyRegistrar {
⋮----
/// @notice Returns the operatorSet key derived from avs and id
function getOperatorSetKey(OperatorSet calldata os) external pure returns (bytes32) {
return os.key(); // calls OperatorSetLib.key()
⋮----
function getOperatorKeyDataHash(bytes32 key, address operator) external view returns (bytes32) {
````

## File: certora/harnesses/OperatorSetHelper.sol
````
// SPDX-License-Identifier: BUSL-1.1
⋮----
import "src/contracts/libraries/OperatorSetLib.sol";
⋮----
contract OperatorSetHelper {
⋮----
/// @notice Returns the operatorSet key derived from avs and id
function getOperatorSetKey(OperatorSet calldata os) external pure returns (bytes32) {
return os.key(); // calls OperatorSetLib.key()
````

## File: certora/harnesses/OperatorTableUpdaterHarness.sol
````
// SPDX-License-Identifier: BUSL-1.1
⋮----
import "src/contracts/multichain/OperatorTableUpdater.sol";
import "src/contracts/interfaces/IKeyRegistrar.sol";
import "src/contracts/interfaces/IBaseCertificateVerifier.sol";
⋮----
contract OperatorTableUpdaterHarness is OperatorTableUpdater {
⋮----
/// @notice Decodes operator table bytes and returns the latest reference timestamp
///         for the operator set in the corresponding certificate verifier.
function latestTsForOperatorTableBytes(bytes calldata operatorTableBytes)
⋮----
function isReferenceTimestampSet(bytes calldata operatorTableBytes, uint32 referenceTimestamp) external view returns (bool){
⋮----
function validCurvetype (bytes calldata operatorTableBytes) external view returns (bool){
````

## File: certora/harnesses/PausableHarness.sol
````
// SPDX-License-Identifier: BUSL-1.1
⋮----
import "../../src/contracts/permissions/Pausable.sol";
⋮----
contract PausableHarness is Pausable {
⋮----
// getters
function isPauser(address pauser) external view returns (bool) {
⋮----
function unpauser() external view returns (address) {
⋮----
// bitwise operations
function bitwise_not(uint256 input) external pure returns (uint256) {
⋮----
function bitwise_and(uint256 input_1, uint256 input_2) external pure returns (uint256) {
````

## File: certora/harnesses/ShortStringsUpgradeableHarness.sol
````
import "@openzeppelin-upgrades/contracts/utils/ShortStringsUpgradeable.sol";
⋮----
contract ShortStringsUpgradeableHarness {
⋮----
function toStringHarness(ShortString sstr) external pure returns (string memory) {
// Get the length of the string
⋮----
// Create a bytes array of the correct length
⋮----
// Copy each byte directly from the ShortString to bytesArray
⋮----
// Convert bytes to string
````

## File: certora/harnesses/StrategyManagerHarness.sol
````
// SPDX-License-Identifier: BUSL-1.1
⋮----
import "../../src/contracts/core/StrategyManager.sol";
⋮----
contract StrategyManagerHarness is StrategyManager {
⋮----
function strategy_is_in_stakers_array(address staker, IStrategy strategy) public view returns (bool) {
⋮----
function num_times_strategy_is_in_stakers_array(address staker, IStrategy strategy) public view returns (uint256) {
⋮----
// checks that stakerStrategyList[staker] contains no duplicates and that all strategies in array have nonzero shares
function array_exhibits_properties(address staker) public view returns (bool) {
⋮----
// loop for each strategy in array
⋮----
// check that staker's shares in strategy are nonzero
⋮----
// check that strategy is not duplicated in array
⋮----
function totalShares(address strategy) public view returns (uint256) {
⋮----
function get_stakerDepositShares(address staker, IStrategy strategy) public view returns (uint256) {
⋮----
function sharesToUnderlyingView(address strategy, uint256 shares) public returns (uint256) {
````

## File: certora/harnesses/StructuredLinkedListHarness.sol
````
// SPDX-License-Identifier: MIT
⋮----
import "../../src/contracts/libraries/StructuredLinkedList.sol";
⋮----
/**
 * @title StructuredLinkedList
 * @author Vittorio Minacori (https://github.com/vittominacori)
 * @dev An utility library for using sorted linked list data structures in your Solidity project.
 * @notice Adapted from https://github.com/vittominacori/solidity-linked-list/blob/master/contracts/StructuredLinkedList.sol
 */
contract StructuredLinkedListHarness {
⋮----
/// Getters with single value returns.
function getAdjacentStrict(uint256 _node, bool _direction) public view returns (uint256 adj) {
⋮----
// Generic setters that cover all use cases
function insert(uint256 _node, uint256 _new, bool _dir) public {
⋮----
function remove(uint256 _node) public {
⋮----
/// View functions made public.
⋮----
function listExists() public view returns (bool) {
⋮----
function nodeExists(uint256 _node) public view returns (bool) {
⋮----
function sizeOf() public view returns (uint256) {
⋮----
function getHead() public view returns (uint256) {
⋮----
function getNode(uint256 _node) public view returns (bool, uint256, uint256) {
⋮----
function getAdjacent(uint256 _node, bool _direction) public view returns (bool, uint256) {
⋮----
function getNextNode(uint256 _node) public view returns (bool, uint256) {
⋮----
function getPreviousNode(uint256 _node) public view returns (bool, uint256) {
⋮----
/// Setters made public that don't add extra functionality
/* commented out as some invariants require a specific preserve block for each function and creating one for each of these functions is redundant
    function insertAfter(uint256 _node, uint256 _new) public returns (bool) {
        return listStorage.insertAfter(_node, _new);
    }

    function insertBefore(uint256 _node, uint256 _new) public returns (bool) {
        return listStorage.insertBefore(_node, _new);
    }

    function pushFront(uint256 _node) internal returns (bool) {
        return listStorage.pushFront(_node);
    }

    function pushBack(uint256 _node) public returns (bool) {
        return listStorage.pushBack(_node);
    }

    function popFront() public returns (uint256) {
        return listStorage.popFront();
    }

    function popBack() public returns (uint256) {
        return listStorage.popBack();
    }
    */
````

## File: certora/mocks/CertoraAVSRegistrar.sol
````
// SPDX-License-Identifier: UNLICENSED
⋮----
import "src/contracts/interfaces/IAVSRegistrar.sol";
⋮----
contract CertoraAVSRegistrar is IAVSRegistrar {
function registerOperator(address, address, uint32[] calldata, bytes calldata) external {}
function deregisterOperator(address, address, uint32[] calldata) external {}
⋮----
function supportsAVS(
````

## File: certora/patches/AllocationManager.patch
````
diff --git a/src/contracts/core/AllocationManager.sol b/src/contracts/core/AllocationManager.sol
index 92726b91..8c4ba446 100644
--- a/src/contracts/core/AllocationManager.sol
+++ b/src/contracts/core/AllocationManager.sol
@@ -10,6 +10,7 @@ import "../permissions/Pausable.sol";
 import "../libraries/SlashingLib.sol";
 import "../libraries/OperatorSetLib.sol";
 import "./storage/AllocationManagerStorage.sol";
+import "./AllocationManagerView.sol";
 
 contract AllocationManager is
     Initializable,
@@ -872,206 +873,274 @@ contract AllocationManager is
 
     /// @inheritdoc IAllocationManagerView
     function getOperatorSetCount(
-        address
-    ) external view returns (uint256 count) {
-        _delegateView(viewImplementation);
-        count;
+        address avs
+    ) external returns (uint256) {
+        (bool success, bytes memory returnData) = viewImplementation.delegatecall(
+            abi.encodeWithSignature("getOperatorSetCount_view(address)", avs)
+        );
+        require(success, "delegatecall failed");
+        return abi.decode(returnData, (uint256));
     }
 
     /// @inheritdoc IAllocationManagerView
     function getAllocatedSets(
-        address
-    ) external view returns (OperatorSet[] memory operatorSets) {
-        _delegateView(viewImplementation);
-        operatorSets;
+        address operator
+    ) external returns (OperatorSet[] memory) {
+        (bool success, bytes memory returnData) = viewImplementation.delegatecall(
+            abi.encodeWithSignature("getAllocatedSets_view(address)", operator)
+        );
+        require(success, "delegatecall failed");
+        return abi.decode(returnData, (OperatorSet[]));
     }
 
     /// @inheritdoc IAllocationManagerView
     function getAllocatedStrategies(
-        address,
-        OperatorSet memory
-    ) external view returns (IStrategy[] memory strategies) {
-        _delegateView(viewImplementation);
-        strategies;
+        address operator,
+        OperatorSet memory operatorSet
+    ) external returns (IStrategy[] memory) {
+        (bool success, bytes memory returnData) = viewImplementation.delegatecall(
+            abi.encodeWithSignature("getAllocatedStrategies_view(address,(address,uint32))", operator, operatorSet)
+        );
+        require(success, "delegatecall failed");
+        return abi.decode(returnData, (IStrategy[]));
     }
 
     /// @inheritdoc IAllocationManagerView
     function getAllocation(
-        address,
-        OperatorSet memory,
-        IStrategy
-    ) external view returns (Allocation memory allocation) {
-        _delegateView(viewImplementation);
-        allocation;
+        address operator,
+        OperatorSet memory operatorSet,
+        IStrategy strategy
+    ) external returns (Allocation memory) {
+        (bool success, bytes memory returnData) = viewImplementation.delegatecall(
+            abi.encodeWithSignature("getAllocation_view(address,(address,uint32),address)", operator, operatorSet, strategy)
+        );
+        require(success, "delegatecall failed");
+        return abi.decode(returnData, (Allocation));
     }
 
     /// @inheritdoc IAllocationManagerView
     function getAllocations(
-        address[] memory,
-        OperatorSet memory,
-        IStrategy
-    ) external view returns (Allocation[] memory allocations) {
-        _delegateView(viewImplementation);
-        allocations;
+        address[] memory operators,
+        OperatorSet memory operatorSet,
+        IStrategy strategy
+    ) external returns (Allocation[] memory) {
+        (bool success, bytes memory returnData) = viewImplementation.delegatecall(
+            abi.encodeWithSignature("getAllocations_view(address[],(address,uint32),address)", operators, operatorSet, strategy)
+        );
+        require(success, "delegatecall failed");
+        return abi.decode(returnData, (Allocation[]));
     }
 
     /// @inheritdoc IAllocationManagerView
     function getStrategyAllocations(
-        address,
-        IStrategy
-    ) external view returns (OperatorSet[] memory operatorSets, Allocation[] memory allocations) {
-        _delegateView(viewImplementation);
-        operatorSets;
-        allocations;
+        address operator,
+        IStrategy strategy
+    ) external returns (OperatorSet[] memory, Allocation[] memory) {
+        (bool success, bytes memory returnData) = viewImplementation.delegatecall(
+            abi.encodeWithSignature("getStrategyAllocations_view(address,address)", operator, strategy)
+        );
+        require(success, "delegatecall failed");
+        return abi.decode(returnData, (OperatorSet[], Allocation[]));
     }
 
     /// @inheritdoc IAllocationManagerView
     function getEncumberedMagnitude(
-        address,
-        IStrategy
-    ) external view returns (uint64 encumberedMagnitude) {
-        _delegateView(viewImplementation);
-        encumberedMagnitude;
+        address operator,
+        IStrategy strategy
+    ) external returns (uint64) {
+        (bool success, bytes memory returnData) = viewImplementation.delegatecall(
+            abi.encodeWithSignature("getEncumberedMagnitude_view(address,address)", operator, strategy)
+        );
+        require(success, "delegatecall failed");
+        return abi.decode(returnData, (uint64));
     }
 
     /// @inheritdoc IAllocationManagerView
     function getAllocatableMagnitude(
-        address,
-        IStrategy
-    ) external view returns (uint64 allocatableMagnitude) {
-        _delegateView(viewImplementation);
-        allocatableMagnitude;
+        address operator,
+        IStrategy strategy
+    ) external returns (uint64) {
+        (bool success, bytes memory returnData) = viewImplementation.delegatecall(
+            abi.encodeWithSignature("getAllocatableMagnitude_view(address,address)", operator, strategy)
+        );
+        require(success, "delegatecall failed");
+        return abi.decode(returnData, (uint64));
     }
 
     /// @inheritdoc IAllocationManagerView
     function getMaxMagnitude(
-        address,
-        IStrategy
-    ) external view returns (uint64 maxMagnitude) {
-        _delegateView(viewImplementation);
-        maxMagnitude;
+        address operator,
+        IStrategy strategy
+    ) external returns (uint64) {
+        (bool success, bytes memory returnData) = viewImplementation.delegatecall(
+            abi.encodeWithSignature("getMaxMagnitude_view(address,address)", operator, strategy)
+        );
+        require(success, "delegatecall failed");
+        return abi.decode(returnData, (uint64));
     }
 
     /// @inheritdoc IAllocationManagerView
     function getMaxMagnitudes(
-        address,
-        IStrategy[] calldata
-    ) external view returns (uint64[] memory maxMagnitudes) {
-        _delegateView(viewImplementation);
-        maxMagnitudes;
+        address operator,
+        IStrategy[] calldata strategies
+    ) external returns (uint64[] memory) {
+        (bool success, bytes memory returnData) = viewImplementation.delegatecall(
+            abi.encodeWithSignature("getMaxMagnitudes_view2(address,address[])", operator, strategies)
+        );
+        require(success, "delegatecall failed");
+        return abi.decode(returnData, (uint64[]));
     }
 
     /// @inheritdoc IAllocationManagerView
     function getMaxMagnitudes(
-        address[] calldata,
-        IStrategy
-    ) external view returns (uint64[] memory maxMagnitudes) {
-        _delegateView(viewImplementation);
-        maxMagnitudes;
+        address[] calldata addr,
+        IStrategy addr1
+    ) external returns (uint64[] memory maxMagnitudes) {
+        // Explicitly delegatecall to renamed function in AllocationManagerView to avoid Certora recursion
+        (bool success, bytes memory returnData) = viewImplementation.delegatecall(
+            abi.encodeWithSignature("getMaxMagnitudes_view(address[],address)", addr, addr1)
+        );
+        require(success, "delegatecall failed");
+        return abi.decode(returnData, (uint64[]));
     }
 
     /// @inheritdoc IAllocationManagerView
     function getMaxMagnitudesAtBlock(
-        address,
-        IStrategy[] calldata,
-        uint32
-    ) external view returns (uint64[] memory maxMagnitudes) {
-        _delegateView(viewImplementation);
-        maxMagnitudes;
+        address operator,
+        IStrategy[] calldata strategies,
+        uint32 blockNumber
+    ) external returns (uint64[] memory) {
+        (bool success, bytes memory returnData) = viewImplementation.delegatecall(
+            abi.encodeWithSignature("getMaxMagnitudesAtBlock_view(address,address[],uint32)", operator, strategies, blockNumber)
+        );
+        require(success, "delegatecall failed");
+        return abi.decode(returnData, (uint64[]));
     }
 
     /// @inheritdoc IAllocationManagerView
     function getRegisteredSets(
-        address
-    ) external view returns (OperatorSet[] memory operatorSets) {
-        _delegateView(viewImplementation);
-        operatorSets;
+        address operator
+    ) external returns (OperatorSet[] memory) {
+        (bool success, bytes memory returnData) = viewImplementation.delegatecall(
+            abi.encodeWithSignature("getRegisteredSets_view(address)", operator)
+        );
+        require(success, "delegatecall failed");
+        return abi.decode(returnData, (OperatorSet[]));
     }
 
     /// @inheritdoc IAllocationManagerView
     function isMemberOfOperatorSet(
-        address,
-        OperatorSet memory
-    ) external view returns (bool result) {
-        _delegateView(viewImplementation);
-        result;
+        address operator,
+        OperatorSet memory operatorSet
+    ) external returns (bool) {
+        (bool success, bytes memory returnData) = viewImplementation.delegatecall(
+            abi.encodeWithSignature("isMemberOfOperatorSet_view(address,(address,uint32))", operator, operatorSet)
+        );
+        require(success, "delegatecall failed");
+        return abi.decode(returnData, (bool));
     }
 
     /// @inheritdoc IAllocationManagerView
     function isOperatorSet(
-        OperatorSet memory
-    ) external view returns (bool result) {
-        _delegateView(viewImplementation);
-        result;
+        OperatorSet memory operatorSet
+    ) external returns (bool) {
+        (bool success, bytes memory returnData) = viewImplementation.delegatecall(
+            abi.encodeWithSignature("isOperatorSet_view((address,uint32))", operatorSet)
+        );
+        require(success, "delegatecall failed");
+        return abi.decode(returnData, (bool));
     }
 
     /// @inheritdoc IAllocationManagerView
     function getMembers(
-        OperatorSet memory
-    ) external view returns (address[] memory operators) {
-        _delegateView(viewImplementation);
-        operators;
+        OperatorSet memory operatorSet
+    ) external returns (address[] memory) {
+        (bool success, bytes memory returnData) = viewImplementation.delegatecall(
+            abi.encodeWithSignature("getMembers_view((address,uint32))", operatorSet)
+        );
+        require(success, "delegatecall failed");
+        return abi.decode(returnData, (address[]));
     }
 
     /// @inheritdoc IAllocationManagerView
     function getMemberCount(
-        OperatorSet memory
-    ) external view returns (uint256 memberCount) {
-        _delegateView(viewImplementation);
-        memberCount;
+        OperatorSet memory operatorSet
+    ) external returns (uint256) {
+        (bool success, bytes memory returnData) = viewImplementation.delegatecall(
+            abi.encodeWithSignature("getMemberCount_view((address,uint32))", operatorSet)
+        );
+        require(success, "delegatecall failed");
+        return abi.decode(returnData, (uint256));
     }
 
     /// @inheritdoc IAllocationManagerView
     function getStrategiesInOperatorSet(
-        OperatorSet memory
-    ) external view returns (IStrategy[] memory strategies) {
-        _delegateView(viewImplementation);
-        strategies;
+        OperatorSet memory operatorSet
+    ) external returns (IStrategy[] memory) {
+        (bool success, bytes memory returnData) = viewImplementation.delegatecall(
+            abi.encodeWithSignature("getStrategiesInOperatorSet_view((address,uint32))", operatorSet)
+        );
+        require(success, "delegatecall failed");
+        return abi.decode(returnData, (IStrategy[]));
     }
 
     /// @inheritdoc IAllocationManagerView
     function getMinimumSlashableStake(
-        OperatorSet memory,
-        address[] memory,
-        IStrategy[] memory,
-        uint32
-    ) external view returns (uint256[][] memory slashableStake) {
-        _delegateView(viewImplementation);
-        slashableStake;
+        OperatorSet memory operatorSet,
+        address[] memory operators,
+        IStrategy[] memory strategies,
+        uint32 futureBlock
+    ) external returns (uint256[][] memory) {
+        (bool success, bytes memory returnData) = viewImplementation.delegatecall(
+            abi.encodeWithSignature("getMinimumSlashableStake_view((address,uint32),address[],address[],uint32)", operatorSet, operators, strategies, futureBlock)
+        );
+        require(success, "delegatecall failed");
+        return abi.decode(returnData, (uint256[][]));
     }
 
     /// @inheritdoc IAllocationManagerView
     function getAllocatedStake(
-        OperatorSet memory,
-        address[] memory,
-        IStrategy[] memory
-    ) external view returns (uint256[][] memory slashableStake) {
-        _delegateView(viewImplementation);
-        slashableStake;
+        OperatorSet memory operatorSet,
+        address[] memory operators,
+        IStrategy[] memory strategies
+    ) external returns (uint256[][] memory) {
+        (bool success, bytes memory returnData) = viewImplementation.delegatecall(
+            abi.encodeWithSignature("getAllocatedStake_view((address,uint32),address[],address[])", operatorSet, operators, strategies)
+        );
+        require(success, "delegatecall failed");
+        return abi.decode(returnData, (uint256[][]));
     }
 
     /// @inheritdoc IAllocationManagerView
     function getPendingSlasher(
-        OperatorSet memory
-    ) external view returns (address pendingSlasher, uint32 effectBlock) {
-        _delegateView(viewImplementation);
-        pendingSlasher;
-        effectBlock;
+        OperatorSet memory operatorSet
+    ) external returns (address pendingSlasher, uint32 effectBlock) {
+        (bool success, bytes memory returnData) = viewImplementation.delegatecall(
+            abi.encodeWithSignature("getPendingSlasher_view((address,uint32))", operatorSet)
+        );
+        require(success, "delegatecall failed");
+        return abi.decode(returnData, (address, uint32));
     }
 
     /// @inheritdoc IAllocationManagerView
     function getSlashCount(
-        OperatorSet memory
-    ) external view returns (uint256 slashCount) {
-        _delegateView(viewImplementation);
-        slashCount;
+        OperatorSet memory operatorSet
+    ) external returns (uint256 slashCount) {
+        (bool success, bytes memory returnData) = viewImplementation.delegatecall(
+            abi.encodeWithSignature("getSlashCount_view((address,uint32))", operatorSet)
+        );
+        require(success, "delegatecall failed");
+        return abi.decode(returnData, (uint256));
     }
 
     /// @inheritdoc IAllocationManagerView
     function isOperatorRedistributable(
-        address
-    ) external view returns (bool result) {
-        _delegateView(viewImplementation);
-        result;
+        address operator
+    ) external returns (bool result) {
+        (bool success, bytes memory returnData) = viewImplementation.delegatecall(
+            abi.encodeWithSignature("isOperatorRedistributable_view(address)", operator)
+        );
+        require(success, "delegatecall failed");
+        return abi.decode(returnData, (bool));
     }
 }
diff --git a/src/contracts/core/AllocationManagerView.sol b/src/contracts/core/AllocationManagerView.sol
index deb4e62c..32c14b1d 100644
--- a/src/contracts/core/AllocationManagerView.sol
+++ b/src/contracts/core/AllocationManagerView.sol
@@ -16,7 +16,7 @@ import "./storage/AllocationManagerStorage.sol";
 ///      Since `AllocationManagerView` only needs access to the storage variables from
 ///      `AllocationManagerStorage` (without the other mixins), it uses `layout at 151` to
 ///      align its storage layout with the main `AllocationManager` contract.
-contract AllocationManagerView layout at 151 is IAllocationManagerView, AllocationManagerStorage {
+contract AllocationManagerView layout at 151 is AllocationManagerStorage {
     using DoubleEndedQueue for DoubleEndedQueue.Bytes32Deque;
     using Snapshots for Snapshots.DefaultWadHistory;
     using OperatorSetLib for OperatorSet;
@@ -107,7 +107,7 @@ contract AllocationManagerView layout at 151 is IAllocationManagerView, Allocati
                     continue;
                 }
 
-                Allocation memory alloc = getAllocation(operator, operatorSet, strategy);
+                Allocation memory alloc = getAllocation_view(operator, operatorSet, strategy);
 
                 // If the pending change takes effect before `futureBlock`, include it in `currentMagnitude`
                 // However, ONLY include the pending change if it is a deallocation, since this method
@@ -139,7 +139,7 @@ contract AllocationManagerView layout at 151 is IAllocationManagerView, Allocati
         OperatorSet[] memory operatorSets
     ) internal view returns (bool) {
         for (uint256 i = 0; i < operatorSets.length; ++i) {
-            if (isOperatorSlashable(operator, operatorSets[i]) && isRedistributingOperatorSet(operatorSets[i])) {
+            if (isOperatorSlashable_view(operator, operatorSets[i]) && isRedistributingOperatorSet_view(operatorSets[i])) {
                 return true;
             }
         }
@@ -150,15 +150,15 @@ contract AllocationManagerView layout at 151 is IAllocationManagerView, Allocati
     ///                         VIEW FUNCTIONS
     ///
 
-    /// @inheritdoc IAllocationManagerView
-    function getOperatorSetCount(
+    // /// @inheritdoc IAllocationManagerView
+    function getOperatorSetCount_view(
         address avs
     ) external view returns (uint256) {
         return _operatorSets[avs].length();
     }
 
-    /// @inheritdoc IAllocationManagerView
-    function getAllocatedSets(
+    // /// @inheritdoc IAllocationManagerView
+    function getAllocatedSets_view(
         address operator
     ) public view returns (OperatorSet[] memory) {
         uint256 length = allocatedSets[operator].length();
@@ -171,8 +171,8 @@ contract AllocationManagerView layout at 151 is IAllocationManagerView, Allocati
         return operatorSets;
     }
 
-    /// @inheritdoc IAllocationManagerView
-    function getAllocatedStrategies(
+    // /// @inheritdoc IAllocationManagerView
+    function getAllocatedStrategies_view(
         address operator,
         OperatorSet memory operatorSet
     ) external view returns (IStrategy[] memory) {
@@ -186,8 +186,8 @@ contract AllocationManagerView layout at 151 is IAllocationManagerView, Allocati
         return strategies;
     }
 
-    /// @inheritdoc IAllocationManagerView
-    function getAllocation(
+    // /// @inheritdoc IAllocationManagerView
+    function getAllocation_view(
         address operator,
         OperatorSet memory operatorSet,
         IStrategy strategy
@@ -197,8 +197,8 @@ contract AllocationManagerView layout at 151 is IAllocationManagerView, Allocati
         return allocation;
     }
 
-    /// @inheritdoc IAllocationManagerView
-    function getAllocations(
+    // /// @inheritdoc IAllocationManagerView
+    function getAllocations_view(
         address[] memory operators,
         OperatorSet memory operatorSet,
         IStrategy strategy
@@ -206,14 +206,14 @@ contract AllocationManagerView layout at 151 is IAllocationManagerView, Allocati
         Allocation[] memory _allocations = new Allocation[](operators.length);
 
         for (uint256 i = 0; i < operators.length; i++) {
-            _allocations[i] = getAllocation(operators[i], operatorSet, strategy);
+            _allocations[i] = getAllocation_view(operators[i], operatorSet, strategy);
         }
 
         return _allocations;
     }
 
-    /// @inheritdoc IAllocationManagerView
-    function getStrategyAllocations(
+    // /// @inheritdoc IAllocationManagerView
+    function getStrategyAllocations_view(
         address operator,
         IStrategy strategy
     ) external view returns (OperatorSet[] memory, Allocation[] memory) {
@@ -226,14 +226,14 @@ contract AllocationManagerView layout at 151 is IAllocationManagerView, Allocati
             OperatorSet memory operatorSet = OperatorSetLib.decode(allocatedSets[operator].at(i));
 
             operatorSets[i] = operatorSet;
-            _allocations[i] = getAllocation(operator, operatorSet, strategy);
+            _allocations[i] = getAllocation_view(operator, operatorSet, strategy);
         }
 
         return (operatorSets, _allocations);
     }
 
-    /// @inheritdoc IAllocationManagerView
-    function getEncumberedMagnitude(
+    // /// @inheritdoc IAllocationManagerView
+    function getEncumberedMagnitude_view(
         address operator,
         IStrategy strategy
     ) external view returns (uint64) {
@@ -241,8 +241,8 @@ contract AllocationManagerView layout at 151 is IAllocationManagerView, Allocati
         return curEncumberedMagnitude;
     }
 
-    /// @inheritdoc IAllocationManagerView
-    function getAllocatableMagnitude(
+    // /// @inheritdoc IAllocationManagerView
+    function getAllocatableMagnitude_view(
         address operator,
         IStrategy strategy
     ) external view returns (uint64) {
@@ -286,44 +286,45 @@ contract AllocationManagerView layout at 151 is IAllocationManagerView, Allocati
         return (curEncumberedMagnitude, curAllocatableMagnitude);
     }
 
-    /// @inheritdoc IAllocationManagerView
-    function getMaxMagnitude(
+    // /// @inheritdoc IAllocationManagerView
+    function getMaxMagnitude_view(
         address operator,
         IStrategy strategy
     ) public view returns (uint64) {
         return _maxMagnitudeHistory[operator][strategy].latest();
     }
 
-    /// @inheritdoc IAllocationManagerView
-    function getMaxMagnitudes(
+    // /// @inheritdoc IAllocationManagerView
+    function getMaxMagnitudes_view2(
         address operator,
         IStrategy[] memory strategies
     ) external view returns (uint64[] memory) {
         uint64[] memory maxMagnitudes = new uint64[](strategies.length);
 
         for (uint256 i = 0; i < strategies.length; ++i) {
-            maxMagnitudes[i] = getMaxMagnitude(operator, strategies[i]);
+            maxMagnitudes[i] = getMaxMagnitude_view(operator, strategies[i]);
         }
 
         return maxMagnitudes;
     }
 
-    /// @inheritdoc IAllocationManagerView
-    function getMaxMagnitudes(
+    // /// @inheritdoc IAllocationManagerView
+    // Renamed to avoid recursion in Certora - called via explicit delegatecall from AllocationManager
+    function getMaxMagnitudes_view(
         address[] memory operators,
         IStrategy strategy
     ) external view returns (uint64[] memory) {
         uint64[] memory maxMagnitudes = new uint64[](operators.length);
 
         for (uint256 i = 0; i < operators.length; ++i) {
-            maxMagnitudes[i] = getMaxMagnitude(operators[i], strategy);
+            maxMagnitudes[i] = getMaxMagnitude_view(operators[i], strategy);
         }
 
         return maxMagnitudes;
     }
 
-    /// @inheritdoc IAllocationManagerView
-    function getMaxMagnitudesAtBlock(
+    // /// @inheritdoc IAllocationManagerView
+    function getMaxMagnitudesAtBlock_view(
         address operator,
         IStrategy[] memory strategies,
         uint32 blockNumber
@@ -337,7 +338,7 @@ contract AllocationManagerView layout at 151 is IAllocationManagerView, Allocati
         return maxMagnitudes;
     }
 
-    /// @inheritdoc IAllocationManagerView
+    // /// @inheritdoc IAllocationManagerView
     function getAllocationDelay(
         address operator
     ) public view returns (bool, uint32) {
@@ -355,8 +356,8 @@ contract AllocationManagerView layout at 151 is IAllocationManagerView, Allocati
         return (isSet, delay);
     }
 
-    /// @inheritdoc IAllocationManagerView
-    function getRegisteredSets(
+    // /// @inheritdoc IAllocationManagerView
+    function getRegisteredSets_view(
         address operator
     ) public view returns (OperatorSet[] memory) {
         uint256 length = registeredSets[operator].length();
@@ -369,36 +370,36 @@ contract AllocationManagerView layout at 151 is IAllocationManagerView, Allocati
         return operatorSets;
     }
 
-    /// @inheritdoc IAllocationManagerView
-    function isMemberOfOperatorSet(
+    // /// @inheritdoc IAllocationManagerView
+    function isMemberOfOperatorSet_view(
         address operator,
         OperatorSet memory operatorSet
     ) public view returns (bool) {
         return _operatorSetMembers[operatorSet.key()].contains(operator);
     }
 
-    /// @inheritdoc IAllocationManagerView
-    function isOperatorSet(
+    // /// @inheritdoc IAllocationManagerView
+    function isOperatorSet_view(
         OperatorSet memory operatorSet
     ) external view returns (bool) {
         return _operatorSets[operatorSet.avs].contains(operatorSet.id);
     }
 
-    /// @inheritdoc IAllocationManagerView
-    function getMembers(
+    // /// @inheritdoc IAllocationManagerView
+    function getMembers_view(
         OperatorSet memory operatorSet
     ) external view returns (address[] memory) {
         return _operatorSetMembers[operatorSet.key()].values();
     }
 
-    /// @inheritdoc IAllocationManagerView
-    function getMemberCount(
+    // /// @inheritdoc IAllocationManagerView
+    function getMemberCount_view(
         OperatorSet memory operatorSet
     ) external view returns (uint256) {
         return _operatorSetMembers[operatorSet.key()].length();
     }
 
-    /// @inheritdoc IAllocationManagerView
+    // /// @inheritdoc IAllocationManagerView
     function getAVSRegistrar(
         address avs
     ) public view returns (IAVSRegistrar) {
@@ -407,8 +408,8 @@ contract AllocationManagerView layout at 151 is IAllocationManagerView, Allocati
         return address(registrar) == address(0) ? IAVSRegistrar(avs) : registrar;
     }
 
-    /// @inheritdoc IAllocationManagerView
-    function getStrategiesInOperatorSet(
+    // /// @inheritdoc IAllocationManagerView
+    function getStrategiesInOperatorSet_view(
         OperatorSet memory operatorSet
     ) external view returns (IStrategy[] memory) {
         address[] memory values = _operatorSetStrategies[operatorSet.key()].values();
@@ -421,8 +422,8 @@ contract AllocationManagerView layout at 151 is IAllocationManagerView, Allocati
         return strategies;
     }
 
-    /// @inheritdoc IAllocationManagerView
-    function getMinimumSlashableStake(
+    // /// @inheritdoc IAllocationManagerView
+    function getMinimumSlashableStake_view(
         OperatorSet memory operatorSet,
         address[] memory operators,
         IStrategy[] memory strategies,
@@ -432,7 +433,7 @@ contract AllocationManagerView layout at 151 is IAllocationManagerView, Allocati
 
         for (uint256 i = 0; i < operators.length; i++) {
             // If the operator is not slashable by the opSet, all strategies should have a slashable stake of 0
-            if (!isOperatorSlashable(operators[i], operatorSet)) {
+            if (!isOperatorSlashable_view(operators[i], operatorSet)) {
                 for (uint256 j = 0; j < strategies.length; j++) {
                     slashableStake[i][j] = 0;
                 }
@@ -440,8 +441,8 @@ contract AllocationManagerView layout at 151 is IAllocationManagerView, Allocati
         }
     }
 
-    /// @inheritdoc IAllocationManagerView
-    function getAllocatedStake(
+    // /// @inheritdoc IAllocationManagerView
+    function getAllocatedStake_view(
         OperatorSet memory operatorSet,
         address[] memory operators,
         IStrategy[] memory strategies
@@ -451,8 +452,8 @@ contract AllocationManagerView layout at 151 is IAllocationManagerView, Allocati
         return _getMinimumAllocatedStake(operatorSet, operators, strategies, uint32(block.number));
     }
 
-    /// @inheritdoc IAllocationManagerView
-    function isOperatorSlashable(
+    // /// @inheritdoc IAllocationManagerView
+    function isOperatorSlashable_view(
         address operator,
         OperatorSet memory operatorSet
     ) public view returns (bool) {
@@ -463,8 +464,8 @@ contract AllocationManagerView layout at 151 is IAllocationManagerView, Allocati
         return status.registered || block.number <= status.slashableUntil;
     }
 
-    /// @inheritdoc IAllocationManagerView
-    function getRedistributionRecipient(
+    // /// @inheritdoc IAllocationManagerView
+    function getRedistributionRecipient_view(
         OperatorSet memory operatorSet
     ) public view returns (address) {
         // Load the redistribution recipient and return it if set, otherwise return the default burn address.
@@ -472,39 +473,39 @@ contract AllocationManagerView layout at 151 is IAllocationManagerView, Allocati
         return redistributionRecipient == address(0) ? DEFAULT_BURN_ADDRESS : redistributionRecipient;
     }
 
-    /// @inheritdoc IAllocationManagerView
-    function isRedistributingOperatorSet(
+    // /// @inheritdoc IAllocationManagerView
+    function isRedistributingOperatorSet_view(
         OperatorSet memory operatorSet
     ) public view returns (bool) {
-        return getRedistributionRecipient(operatorSet) != DEFAULT_BURN_ADDRESS;
+        return getRedistributionRecipient_view(operatorSet) != DEFAULT_BURN_ADDRESS;
     }
 
-    /// @inheritdoc IAllocationManagerView
-    function getSlashCount(
+    // /// @inheritdoc IAllocationManagerView
+    function getSlashCount_view(
         OperatorSet memory operatorSet
     ) external view returns (uint256) {
         return _slashIds[operatorSet.key()];
     }
 
-    /// @inheritdoc IAllocationManagerView
-    function isOperatorRedistributable(
+    // /// @inheritdoc IAllocationManagerView
+    function isOperatorRedistributable_view(
         address operator
     ) external view returns (bool) {
         // Get the registered and allocated sets for the operator.
         // We get both sets, since:
         //    - Upon registration the operator allocation will be pending to a redistributing operator set, and as such not yet in RegisteredSets.
         //    - Upon deregistration the operator is removed from RegisteredSets, but is still allocated.
-        OperatorSet[] memory registeredSets = getRegisteredSets(operator);
-        OperatorSet[] memory allocatedSets = getAllocatedSets(operator);
+        OperatorSet[] memory registeredSets = getRegisteredSets_view(operator);
+        OperatorSet[] memory allocatedSets = getAllocatedSets_view(operator);
 
         // Check if the operator is redistributable from any of the registered or allocated sets
         return
             _isOperatorRedistributable(operator, registeredSets) || _isOperatorRedistributable(operator, allocatedSets);
     }
 
-    /// @inheritdoc IAllocationManagerView
+    // /// @inheritdoc IAllocationManagerView
     /// @dev Returns (address(0), 0) for non-existent operator sets or when no pending slasher change exists.
-    function getPendingSlasher(
+    function getPendingSlasher_view(
         OperatorSet memory operatorSet
     ) external view returns (address, uint32) {
         // Initialize the pending slasher and effect block to the address(0) and 0 respectively
@@ -521,9 +522,9 @@ contract AllocationManagerView layout at 151 is IAllocationManagerView, Allocati
         return (pendingSlasher, effectBlock);
     }
 
-    /// @inheritdoc IAllocationManagerView
+    // /// @inheritdoc IAllocationManagerView
     /// @dev Returns address(0) for non-existent operator sets.
-    function getSlasher(
+    function getSlasher_view(
         OperatorSet memory operatorSet
     ) public view returns (address) {
         SlasherParams memory params = _slashers[operatorSet.key()];
diff --git a/src/contracts/core/DelegationManager.sol b/src/contracts/core/DelegationManager.sol
index e873eb5d..923b95cc 100644
--- a/src/contracts/core/DelegationManager.sol
+++ b/src/contracts/core/DelegationManager.sol
@@ -719,7 +719,7 @@ contract DelegationManager is
         address staker,
         address operator,
         IStrategy[] memory strategies
-    ) internal view returns (uint256[] memory) {
+    ) internal returns (uint256[] memory) {
         uint256[] memory slashingFactors = new uint256[](strategies.length);
         uint64[] memory maxMagnitudes = allocationManager.getMaxMagnitudes(operator, strategies);
 
@@ -737,7 +737,7 @@ contract DelegationManager is
         address operator,
         IStrategy[] memory strategies,
         uint32 blockNumber
-    ) internal view returns (uint256[] memory) {
+    ) internal returns (uint256[] memory) {
         uint256[] memory slashingFactors = new uint256[](strategies.length);
         uint64[] memory maxMagnitudes = allocationManager.getMaxMagnitudesAtBlock({
             operator: operator,
@@ -821,7 +821,7 @@ contract DelegationManager is
     /// @dev Get the shares from a queued withdrawal.
     function _getSharesByWithdrawalRoot(
         bytes32 withdrawalRoot
-    ) internal view returns (Withdrawal memory withdrawal, uint256[] memory shares) {
+    ) internal returns (Withdrawal memory withdrawal, uint256[] memory shares) {
         withdrawal = _queuedWithdrawals[withdrawalRoot];
         shares = new uint256[](withdrawal.strategies.length);
 
@@ -922,7 +922,7 @@ contract DelegationManager is
     function getSlashableSharesInQueue(
         address operator,
         IStrategy strategy
-    ) public view returns (uint256) {
+    ) public returns (uint256) {
         uint64 maxMagnitude = allocationManager.getMaxMagnitude(operator, strategy);
 
         // Return amount of slashable scaled shares remaining
@@ -938,7 +938,7 @@ contract DelegationManager is
     function getWithdrawableShares(
         address staker,
         IStrategy[] memory strategies
-    ) public view returns (uint256[] memory withdrawableShares, uint256[] memory depositShares) {
+    ) public returns (uint256[] memory withdrawableShares, uint256[] memory depositShares) {
         withdrawableShares = new uint256[](strategies.length);
         depositShares = new uint256[](strategies.length);
 
@@ -997,14 +997,14 @@ contract DelegationManager is
     /// @inheritdoc IDelegationManager
     function getQueuedWithdrawal(
         bytes32 withdrawalRoot
-    ) external view returns (Withdrawal memory withdrawal, uint256[] memory shares) {
+    ) external returns (Withdrawal memory withdrawal, uint256[] memory shares) {
         (withdrawal, shares) = _getSharesByWithdrawalRoot(withdrawalRoot);
     }
 
     /// @inheritdoc IDelegationManager
     function getQueuedWithdrawals(
         address staker
-    ) external view returns (Withdrawal[] memory withdrawals, uint256[][] memory shares) {
+    ) external returns (Withdrawal[] memory withdrawals, uint256[][] memory shares) {
         bytes32[] memory withdrawalRoots = getQueuedWithdrawalRoots(staker);
 
         uint256 totalQueued = withdrawalRoots.length;
@@ -1028,7 +1028,7 @@ contract DelegationManager is
         address staker,
         IStrategy[] memory strategies,
         uint256[] memory withdrawableShares
-    ) external view returns (uint256[] memory) {
+    ) external returns (uint256[] memory) {
         // Get the slashing factors for the staker/operator/strategies
         address operator = delegatedTo[staker];
         uint256[] memory slashingFactors = _getSlashingFactors(staker, operator, strategies);
diff --git a/src/contracts/interfaces/IAllocationManager.sol b/src/contracts/interfaces/IAllocationManager.sol
index 40c172ab..f32cf836 100644
--- a/src/contracts/interfaces/IAllocationManager.sol
+++ b/src/contracts/interfaces/IAllocationManager.sol
@@ -513,14 +513,14 @@ interface IAllocationManagerView is IAllocationManagerErrors, IAllocationManager
     /// @param avs the AVS to query
     function getOperatorSetCount(
         address avs
-    ) external view returns (uint256);
+    ) external returns (uint256);
 
     /// @notice Returns the list of operator sets the operator has current or pending allocations/deallocations in
     /// @param operator the operator to query
     /// @return the list of operator sets the operator has current or pending allocations/deallocations in
     function getAllocatedSets(
         address operator
-    ) external view returns (OperatorSet[] memory);
+    ) external returns (OperatorSet[] memory);
 
     /// @notice Returns the list of strategies an operator has current or pending allocations/deallocations from
     /// given a specific operator set.
@@ -530,7 +530,7 @@ interface IAllocationManagerView is IAllocationManagerErrors, IAllocationManager
     function getAllocatedStrategies(
         address operator,
         OperatorSet memory operatorSet
-    ) external view returns (IStrategy[] memory);
+    ) external returns (IStrategy[] memory);
 
     /// @notice Returns the current/pending stake allocation an operator has from a strategy to an operator set
     /// @param operator the operator to query
@@ -541,7 +541,7 @@ interface IAllocationManagerView is IAllocationManagerErrors, IAllocationManager
         address operator,
         OperatorSet memory operatorSet,
         IStrategy strategy
-    ) external view returns (Allocation memory);
+    ) external returns (Allocation memory);
 
     /// @notice Returns the current/pending stake allocations for multiple operators from a strategy to an operator set
     /// @param operators the operators to query
@@ -552,7 +552,7 @@ interface IAllocationManagerView is IAllocationManagerErrors, IAllocationManager
         address[] memory operators,
         OperatorSet memory operatorSet,
         IStrategy strategy
-    ) external view returns (Allocation[] memory);
+    ) external returns (Allocation[] memory);
 
     /// @notice Given a strategy, returns a list of operator sets and corresponding stake allocations.
     /// @dev Note that this returns a list of ALL operator sets the operator has allocations in. This means
@@ -564,7 +564,7 @@ interface IAllocationManagerView is IAllocationManagerErrors, IAllocationManager
     function getStrategyAllocations(
         address operator,
         IStrategy strategy
-    ) external view returns (OperatorSet[] memory, Allocation[] memory);
+    ) external returns (OperatorSet[] memory, Allocation[] memory);
 
     /// @notice For a strategy, get the amount of magnitude that is allocated across one or more operator sets
     /// @param operator the operator to query
@@ -573,7 +573,7 @@ interface IAllocationManagerView is IAllocationManagerErrors, IAllocationManager
     function getEncumberedMagnitude(
         address operator,
         IStrategy strategy
-    ) external view returns (uint64);
+    ) external returns (uint64);
 
     /// @notice For a strategy, get the amount of magnitude not currently allocated to any operator set
     /// @param operator the operator to query
@@ -582,7 +582,7 @@ interface IAllocationManagerView is IAllocationManagerErrors, IAllocationManager
     function getAllocatableMagnitude(
         address operator,
         IStrategy strategy
-    ) external view returns (uint64);
+    ) external returns (uint64);
 
     /// @notice Returns the maximum magnitude an operator can allocate for the given strategy
     /// @dev The max magnitude of an operator starts at WAD (1e18), and is decreased anytime
@@ -593,7 +593,7 @@ interface IAllocationManagerView is IAllocationManagerErrors, IAllocationManager
     function getMaxMagnitude(
         address operator,
         IStrategy strategy
-    ) external view returns (uint64);
+    ) external returns (uint64);
 
     /// @notice Returns the maximum magnitude an operator can allocate for the given strategies
     /// @dev The max magnitude of an operator starts at WAD (1e18), and is decreased anytime
@@ -604,7 +604,7 @@ interface IAllocationManagerView is IAllocationManagerErrors, IAllocationManager
     function getMaxMagnitudes(
         address operator,
         IStrategy[] calldata strategies
-    ) external view returns (uint64[] memory);
+    ) external returns (uint64[] memory);
 
     /// @notice Returns the maximum magnitudes each operator can allocate for the given strategy
     /// @dev The max magnitude of an operator starts at WAD (1e18), and is decreased anytime
@@ -615,7 +615,7 @@ interface IAllocationManagerView is IAllocationManagerErrors, IAllocationManager
     function getMaxMagnitudes(
         address[] calldata operators,
         IStrategy strategy
-    ) external view returns (uint64[] memory);
+    ) external returns (uint64[] memory);
 
     /// @notice Returns the maximum magnitude an operator can allocate for the given strategies
     /// at a given block number
@@ -629,7 +629,7 @@ interface IAllocationManagerView is IAllocationManagerErrors, IAllocationManager
         address operator,
         IStrategy[] calldata strategies,
         uint32 blockNumber
-    ) external view returns (uint64[] memory);
+    ) external returns (uint64[] memory);
 
     /// @notice Returns the time in blocks between an operator allocating slashable magnitude
     /// and the magnitude becoming slashable. If the delay has not been set, `isSet` will be false.
@@ -639,13 +639,13 @@ interface IAllocationManagerView is IAllocationManagerErrors, IAllocationManager
     /// @return delay The time in blocks between allocating magnitude and magnitude becoming slashable
     function getAllocationDelay(
         address operator
-    ) external view returns (bool isSet, uint32 delay);
+    ) external returns (bool isSet, uint32 delay);
 
     /// @notice Returns a list of all operator sets the operator is registered for
     /// @param operator The operator address to query.
     function getRegisteredSets(
         address operator
-    ) external view returns (OperatorSet[] memory operatorSets);
+    ) external returns (OperatorSet[] memory operatorSets);
 
     /// @notice Returns whether the operator is registered for the operator set
     /// @param operator The operator to query
@@ -653,24 +653,24 @@ interface IAllocationManagerView is IAllocationManagerErrors, IAllocationManager
     function isMemberOfOperatorSet(
         address operator,
         OperatorSet memory operatorSet
-    ) external view returns (bool);
+    ) external returns (bool);
 
     /// @notice Returns whether the operator set exists
     function isOperatorSet(
         OperatorSet memory operatorSet
-    ) external view returns (bool);
+    ) external returns (bool);
 
     /// @notice Returns all the operators registered to an operator set
     /// @param operatorSet The operatorSet to query.
     function getMembers(
         OperatorSet memory operatorSet
-    ) external view returns (address[] memory operators);
+    ) external returns (address[] memory operators);
 
     /// @notice Returns the number of operators registered to an operatorSet.
     /// @param operatorSet The operatorSet to get the member count for
     function getMemberCount(
         OperatorSet memory operatorSet
-    ) external view returns (uint256);
+    ) external returns (uint256);
 
     /// @notice Returns the address that handles registration/deregistration for the AVS
     /// If not set, defaults to the input address (`avs`)
@@ -682,7 +682,7 @@ interface IAllocationManagerView is IAllocationManagerErrors, IAllocationManager
     /// @param operatorSet The operatorSet to query.
     function getStrategiesInOperatorSet(
         OperatorSet memory operatorSet
-    ) external view returns (IStrategy[] memory strategies);
+    ) external returns (IStrategy[] memory strategies);
 
     /// @notice Returns the minimum amount of stake that will be slashable as of some future block,
     /// according to each operator's allocation from each strategy to the operator set. Note that this function
@@ -705,7 +705,7 @@ interface IAllocationManagerView is IAllocationManagerErrors, IAllocationManager
         address[] memory operators,
         IStrategy[] memory strategies,
         uint32 futureBlock
-    ) external view returns (uint256[][] memory slashableStake);
+    ) external returns (uint256[][] memory slashableStake);
 
     /// @notice Returns the current allocated stake, irrespective of the operator's slashable status for the operatorSet.
     /// @param operatorSet the operator set to query
@@ -715,7 +715,7 @@ interface IAllocationManagerView is IAllocationManagerErrors, IAllocationManager
         OperatorSet memory operatorSet,
         address[] memory operators,
         IStrategy[] memory strategies
-    ) external view returns (uint256[][] memory slashableStake);
+    ) external returns (uint256[][] memory slashableStake);
 
     /// @notice Returns whether an operator is slashable by an operator set.
     /// This returns true if the operator is registered or their slashableUntil block has not passed.
@@ -741,7 +741,7 @@ interface IAllocationManagerView is IAllocationManagerErrors, IAllocationManager
     /// @return effectBlock The block at which the pending slasher will take effect. Returns `0` if there is no pending slasher or the operator set doesn't exist.
     function getPendingSlasher(
         OperatorSet memory operatorSet
-    ) external view returns (address pendingSlasher, uint32 effectBlock);
+    ) external returns (address pendingSlasher, uint32 effectBlock);
 
     /// @notice Returns the address where slashed funds will be sent for a given operator set.
     /// @param operatorSet The Operator Set to query.
@@ -765,13 +765,13 @@ interface IAllocationManagerView is IAllocationManagerErrors, IAllocationManager
     /// @return The number of slashes for the operator set.
     function getSlashCount(
         OperatorSet memory operatorSet
-    ) external view returns (uint256);
+    ) external returns (uint256);
 
     /// @notice Returns whether an operator is slashable by a redistributing operator set.
     /// @param operator The operator to query.
     function isOperatorRedistributable(
         address operator
-    ) external view returns (bool);
+    ) external returns (bool);
 }
 
 interface IAllocationManager is IAllocationManagerActions, IAllocationManagerView, IPausable {}
diff --git a/src/contracts/interfaces/IDelegationManager.sol b/src/contracts/interfaces/IDelegationManager.sol
index ef2eef48..beb6ef74 100644
--- a/src/contracts/interfaces/IDelegationManager.sol
+++ b/src/contracts/interfaces/IDelegationManager.sol
@@ -408,7 +408,7 @@ interface IDelegationManager is ISignatureUtilsMixin, IDelegationManagerErrors,
     function getSlashableSharesInQueue(
         address operator,
         IStrategy strategy
-    ) external view returns (uint256);
+    ) external returns (uint256);
 
     /// @notice Given a staker and a set of strategies, return the shares they can queue for withdrawal and the
     /// corresponding depositShares.
@@ -418,7 +418,7 @@ interface IDelegationManager is ISignatureUtilsMixin, IDelegationManagerErrors,
     function getWithdrawableShares(
         address staker,
         IStrategy[] memory strategies
-    ) external view returns (uint256[] memory withdrawableShares, uint256[] memory depositShares);
+    ) external returns (uint256[] memory withdrawableShares, uint256[] memory depositShares);
 
     /// @notice Returns the number of shares in storage for a staker and all their strategies
     function getDepositedShares(
@@ -446,7 +446,7 @@ interface IDelegationManager is ISignatureUtilsMixin, IDelegationManagerErrors,
     /// @dev Withdrawals queued before the slashing release cannot be queried with this method
     function getQueuedWithdrawal(
         bytes32 withdrawalRoot
-    ) external view returns (Withdrawal memory withdrawal, uint256[] memory shares);
+    ) external returns (Withdrawal memory withdrawal, uint256[] memory shares);
 
     /// @notice Returns all queued withdrawals and their corresponding shares for a staker.
     /// @param staker The address of the staker to query withdrawals for.
@@ -455,7 +455,7 @@ interface IDelegationManager is ISignatureUtilsMixin, IDelegationManagerErrors,
     /// @dev The shares are what a user would receive from completing a queued withdrawal, assuming all slashings are applied.
     function getQueuedWithdrawals(
         address staker
-    ) external view returns (Withdrawal[] memory withdrawals, uint256[][] memory shares);
+    ) external returns (Withdrawal[] memory withdrawals, uint256[][] memory shares);
 
     /// @notice Returns a list of queued withdrawal roots for the `staker`.
     /// NOTE that this only returns withdrawals queued AFTER the slashing release.
@@ -474,7 +474,7 @@ interface IDelegationManager is ISignatureUtilsMixin, IDelegationManagerErrors,
         address staker,
         IStrategy[] memory strategies,
         uint256[] memory withdrawableShares
-    ) external view returns (uint256[] memory);
+    ) external returns (uint256[] memory);
 
     /// @notice Returns the keccak256 hash of `withdrawal`.
     function calculateWithdrawalRoot(
````

## File: certora/patches/SplitContractMixin.patch
````
diff --git a/src/contracts/mixins/SplitContractMixin.sol b/src/contracts/mixins/SplitContractMixin.sol
index ad99732a..c102f33e 100644
--- a/src/contracts/mixins/SplitContractMixin.sol
+++ b/src/contracts/mixins/SplitContractMixin.sol
@@ -20,22 +20,23 @@ abstract contract SplitContractMixin {
         address implementation
     ) internal virtual {
         assembly {
+            let fp := mload(64)
             // Copy msg.data. We take full control of memory in this inline assembly
             // block because it will not return to Solidity code. We overwrite the
             // Solidity scratch pad at memory position 0.
-            calldatacopy(0, 0, calldatasize())
+            calldatacopy(fp, 0, calldatasize())
 
             // Call the implementation.
             // out and outsize are 0 because we don't know the size yet.
-            let result := delegatecall(gas(), implementation, 0, calldatasize(), 0, 0)
+            let result := delegatecall(gas(), implementation, fp, calldatasize(), 0, 0)
 
             // Copy the returned data.
-            returndatacopy(0, 0, returndatasize())
+            returndatacopy(fp, 0, returndatasize())
 
             switch result
             // delegatecall returns 0 on error.
-            case 0 { revert(0, returndatasize()) }
-            default { return(0, returndatasize()) }
+            case 0 { revert(fp, returndatasize()) }
+            default { return(fp, returndatasize()) }
         }
     }
````

## File: certora/scripts/patches/patch.sh
````bash
#!/bin/bash

# Apply the patch to the contracts directory
echo "Applying the patch for SplitContractMixin"
git apply certora/patches/SplitContractMixin.patch

echo "Applying the patch for AllocationManager"
git apply certora/patches/AllocationManager.patch
````

## File: certora/scripts/patches/unpatch.sh
````bash
#!/bin/bash

# Unapply the patch to the contracts directory
echo "Unapplying the patch for SplitContractMixin"
git apply -R certora/patches/SplitContractMixin.patch

echo "Unapplying the patch for AllocationManager"
git apply -R certora/patches/AllocationManager.patch
````

## File: certora/scripts/pods/verifyEigenPod.sh
````bash
if [[ "$2" ]]
then
    RULE="--rule $2"
fi

# solc-select use 0.8.27

# certoraRun certora/harnesses/EigenPodHarness.sol \
#     src/contracts/core/DelegationManager.sol src/contracts/pods/EigenPodManager.sol \
#     src/contracts/permissions/PauserRegistry.sol \
#     src/contracts/core/StrategyManager.sol \
#     src/contracts/strategies/StrategyBase.sol \
#     lib/openzeppelin-contracts-v4.9.0/contracts/token/ERC20/ERC20.sol \
#     lib/openzeppelin-contracts-v4.9.0/contracts/mocks/ERC1271WalletMock.sol \
#     --verify EigenPodHarness:certora/specs/pods/EigenPod.spec \
#     --optimistic_loop \
#     --prover_args '-recursionEntryLimit 3' \
#     --optimistic_hashing \
#     --parametric_contracts EigenPodHarness \
#     $RULE \
#     --loop_iter 1 \
#     --packages @openzeppelin=lib/openzeppelin-contracts-v4.9.0 @openzeppelin-upgrades=lib/openzeppelin-contracts-upgradeable-v4.9.0 \
#     --msg "EigenPod $1 $2" \
````

## File: certora/scripts/pods/verifyEigenPodManager.sh
````bash
if [[ "$2" ]]
then
    RULE="--rule $2"
fi

# solc-select use 0.8.27

# certoraRun certora/harnesses/EigenPodManagerHarness.sol \
#     src/contracts/core/DelegationManager.sol src/contracts/pods/EigenPod.sol src/contracts/strategies/StrategyBase.sol src/contracts/core/StrategyManager.sol \
#     src/contracts/permissions/PauserRegistry.sol \
#     --verify EigenPodManagerHarness:certora/specs/pods/EigenPodManager.spec \
#     --optimistic_loop \
#     --optimistic_fallback \
#     --optimistic_hashing \
#     --parametric_contracts EigenPodManagerHarness \
#     $RULE \
#     --loop_iter 3 \
#     --packages @openzeppelin=lib/openzeppelin-contracts-v4.9.0 @openzeppelin-upgrades=lib/openzeppelin-contracts-upgradeable-v4.9.0 \
#     --msg "EigenPodManager $1 $2" \
````

## File: certora/specs/core/AllocationManagerRules.spec
````
import "./AllocationManagerValidState.spec";
using DelegationManagerHarness as DelegationManager;

definition DEFAULT_BURN_ADDRESS() returns address = 0x00000000000000000000000000000000000E16E4;

/*
This rule applies to all methods except modifyAllocation because this function makes valid transitions, 
but only at the memory level. first, it loads allocation from memory, makes several valid transitions, 
and then stores it in the storage again, which can lead to an overall violation.
*/
/// @title pendingDiff can transition from 0 to negative or positive, from positive zero only, from negative to negative or to zero.
/// @property pendingDiffs state transitions
rule pendingDiffStateTransitions(method f, address operator, bytes32 setKey, address strategy)
filtered {f -> f.selector != sig:modifyAllocations(address,IAllocationManagerTypes.AllocateParams[]).selector} {
    env e;
    calldataarg args;
    requireValidState();

    require didMakeInvalidPendingDiffTransition == false;

        f(e, args);

    assert didMakeInvalidPendingDiffTransition == false;
}

rule pendingDiffStateTransitionsTest_TOREMOVE(address[] operators, address strategy)  {
    env e;
    requireValidState();

    require didMakeInvalidPendingDiffTransition == false;

    getMaxMagnitudes(e, operators, strategy);

    satisfy true;
}

// this rule is for modifyAllocations where when all the effectblock are in the future, this function cannot make more than one transition at a time.
rule pendingDiffStateTransitionModifyAllocations(method f)
filtered {f -> f.selector == sig:modifyAllocations(address,IAllocationManagerTypes.AllocateParams[]).selector} {
    env e;
    calldataarg args;
    requireValidState();
    require forall address operator . forall bytes32 setKey . forall address strategy . allocationsEffectBlock[operator][setKey][strategy] > e.block.number;

    require didMakeInvalidPendingDiffTransition == false;

        f(e, args);

    assert didMakeInvalidPendingDiffTransition == false;
}

/*
slashedMagnitude / currentMagnitudeBefore >= totalDepositSharesToSlash / (operatorSharesBefore + sharesInQueueBefore)
If this is false, it implies an AVS can “overslash” an operator, i.e. they can remove a larger percentage of funds.
We prove the mathematical equivalent:
slashedMagnitude * (totalShares + sharesInQueue)  >= totalDepositSharesToSlash * currentMagnitude
*/
rule noOverslashingOfOperatorShares(env e, address avs, IAllocationManagerTypes.SlashingParams params){

    bytes32 operatorKey = getOperatorKey(avs, params.operatorSetId);

    // Assume some already proven invariants
    requireValidState();
    requireNoOverflow(e);
    requireInvariant maxMagnitudeLeqWAD(e, params.operator, params.strategies[0]);
    requireInvariant currentMagnitudeLeqWAD(operatorKey, params.operator, params.strategies[0]);
    requireInvariant encumberedMagnitudeLeqWAD(e, params.operator, params.strategies[0]);
    requireInvariant maxMagnitudeGEencumberedMagnitude(e,params.operator, params.strategies[0]);
    requireInvariant sumOfPendingDiffCurrentMagnitudeRespectsWAD(operatorKey, params.operator, params.strategies[0]);
    requireInvariant maxMagnitudeGECurrentMagnitude(e, operatorKey, params.operator, params.strategies[0]);
    
    require (e.block.number < currentContract.allocations[params.operator][operatorKey][params.strategies[0]].effectBlock, "require to not trigger a change of values throughout computation by _getUpdatedAllocation()");

    // cannot allocate type IAllocationManagerTypes.Allocation in CVL directly but can access fields of primitive types
    uint64 currentMagnitudeBefore = currentContract.allocations[params.operator][operatorKey][params.strategies[0]].currentMagnitude;
    int128 pendingDiffBefore = currentContract.allocations[params.operator][operatorKey][params.strategies[0]].pendingDiff;
    require (pendingDiffBefore == 0, "prove an underapproximation assuming no pendingDiff, as pendingDiff changes currentMagnitude throughout the computation of slashOperator in _getUpdatedAllocation()");
    uint64 maxMagnitudeBefore = getMaxMagnitude(e, params.operator, params.strategies[0]);

    uint256 operatorSharesBefore = DelegationManager.operatorShares[params.operator][params.strategies[0]];
    uint256 queuedSharesBefore = DelegationManager.getSlashableSharesInQueue(e, params.operator, params.strategies[0]);
    // Note: the totalDepositSharesToSlash usually also account for slashableSharesInQueue that have been removed
    // Due to known rounding issues in the computation of DelegationManager.getSlashableSharesInQueue() 
    // we underapproximate and assume no slashableSharesInQueue but check no overslashing for operatorShares only
    require queuedSharesBefore == 0; 
    require (operatorSharesBefore > 1, "1 share is an edge case that will always fail due to mulWadUp" );

    slashOperator(e, avs, params);

    uint64 currentMagnitudeAfter = currentContract.allocations[params.operator][operatorKey][params.strategies[0]].currentMagnitude;
    uint64 maxMagnitudeAfter = getMaxMagnitude(e, params.operator, params.strategies[0]);

    uint256 operatorSharesAfter = DelegationManager.operatorShares[params.operator][params.strategies[0]];

    // currentMagnitude should not increase from a slash
    assert(currentMagnitudeBefore >= currentMagnitudeAfter);
    // operatorShares should not increase from a slash
    assert(operatorSharesBefore >= operatorSharesAfter);
    
    uint64 slashedMagnitude = require_uint64(currentMagnitudeBefore - currentMagnitudeAfter);
    uint256 totalDepositSharesToSlash = require_uint256(operatorSharesBefore - operatorSharesAfter);

    // assert slashedMagnitude / currentMagnitude >= totalDepositSharesToSlash / (operatorSharesBefore + queuedSharesBefore);
    assert slashedMagnitude != 0 => slashedMagnitude * operatorSharesBefore >= totalDepositSharesToSlash * currentMagnitudeBefore;
}


/*
slashedMagnitude / currentMagnitudeBefore >= totalDepositSharesToSlash / (operatorSharesBefore + sharesInQueueBefore)
If this is false, it implies an AVS can “overslash” an operator, i.e. they can remove a larger percentage of funds.
We prove the mathematical equivalent:
slashedMagnitude * (totalShares + sharesInQueue)  >= totalDepositSharesToSlash * currentMagnitude
*/
rule noOverslashingOfShares(env e, address avs, IAllocationManagerTypes.SlashingParams params){

    bytes32 operatorKey = getOperatorKey(avs, params.operatorSetId);

    // Assume some already proven invariants
    requireValidState();
    requireNoOverflow(e);
    requireInvariant maxMagnitudeLeqWAD(e, params.operator, params.strategies[0]);
    requireInvariant currentMagnitudeLeqWAD(operatorKey, params.operator, params.strategies[0]);
    requireInvariant encumberedMagnitudeLeqWAD(e, params.operator, params.strategies[0]);
    requireInvariant maxMagnitudeGEencumberedMagnitude(e, params.operator, params.strategies[0]);
    requireInvariant sumOfPendingDiffCurrentMagnitudeRespectsWAD(operatorKey, params.operator, params.strategies[0]);
    requireInvariant maxMagnitudeGECurrentMagnitude(e, operatorKey, params.operator, params.strategies[0]);
    
    require (e.block.number < currentContract.allocations[params.operator][operatorKey][params.strategies[0]].effectBlock, "require to not trigger a change of values throughout computation by _getUpdatedAllocation()");

    // cannot allocate type IAllocationManagerTypes.Allocation in CVL directly but can access fields of primitive types
    uint64 currentMagnitudeBefore = currentContract.allocations[params.operator][operatorKey][params.strategies[0]].currentMagnitude;
    int128 pendingDiffBefore = currentContract.allocations[params.operator][operatorKey][params.strategies[0]].pendingDiff;
    require (pendingDiffBefore == 0, "prove an underapproximation assuming no pendingDiff, as pendingDiff changes currentMagnitude throughout the computation of slashOperator in _getUpdatedAllocation()");
    uint64 maxMagnitudeBefore = getMaxMagnitude(e, params.operator, params.strategies[0]);

    uint256 operatorSharesBefore = DelegationManager.operatorShares[params.operator][params.strategies[0]];
    uint256 queuedSharesBefore = DelegationManager.getSlashableSharesInQueue(e, params.operator, params.strategies[0]);
    // Note: the totalDepositSharesToSlash usually also account for slashableSharesInQueue that have been removed
    // Due to known rounding issues in the computation of DelegationManager.getSlashableSharesInQueue() 
    // we underapproximate and assume no slashableSharesInQueue but check no overslashing for operatorShares only
    require (operatorSharesBefore + queuedSharesBefore >= 1, "+" );

    slashOperator(e, avs, params);

    uint64 currentMagnitudeAfter = currentContract.allocations[params.operator][operatorKey][params.strategies[0]].currentMagnitude;
    uint64 maxMagnitudeAfter = getMaxMagnitude(e, params.operator, params.strategies[0]);

    uint256 operatorSharesAfter = DelegationManager.operatorShares[params.operator][params.strategies[0]];
 
    // remove the same amount of shares from the original shares in queue as a are burnt throughout the slashing process
    uint256 queuedSharesAfter = assert_uint256(queuedSharesBefore - DelegationManager.getSlashableSharesInQueueWithMag(e, params.operator, params.strategies[0], maxMagnitudeBefore, maxMagnitudeAfter));

    // currentMagnitude should not increase from a slash
    assert(currentMagnitudeBefore >= currentMagnitudeAfter);
    // operatorShares should not increase from a slash
    assert(operatorSharesBefore >= operatorSharesAfter);
    
    uint64 slashedMagnitude = require_uint64(currentMagnitudeBefore - currentMagnitudeAfter);
    uint256 totalDepositSharesToSlash = require_uint256(operatorSharesBefore - operatorSharesAfter + queuedSharesBefore - queuedSharesAfter);

    // assert slashedMagnitude / currentMagnitude >= totalDepositSharesToSlash / (operatorSharesBefore + queuedSharesBefore);
    assert slashedMagnitude != 0 => assert_uint256(slashedMagnitude / currentMagnitudeBefore) >= assert_uint256(totalDepositSharesToSlash / (operatorSharesBefore + queuedSharesBefore));
}

/*
slashedMagnitude / currentMagnitudeBefore >= totalDepositSharesToSlash / (operatorSharesBefore + sharesInQueueBefore)
If this is false, it implies an AVS can “overslash” an operator, i.e. they can remove a larger percentage of funds.
We prove the mathematical equivalent:
slashedMagnitude * (totalShares + sharesInQueue)  >= totalDepositSharesToSlash * currentMagnitude
*/
rule overslashingOfSharesAtMostOne(env e, address avs, IAllocationManagerTypes.SlashingParams params){

    bytes32 operatorKey = getOperatorKey(avs, params.operatorSetId);

    // Assume some already proven invariants
    requireValidState();
    requireNoOverflow(e);
    requireInvariant maxMagnitudeLeqWAD(e, params.operator, params.strategies[0]);
    requireInvariant currentMagnitudeLeqWAD(operatorKey, params.operator, params.strategies[0]);
    requireInvariant encumberedMagnitudeLeqWAD(e, params.operator, params.strategies[0]);
    requireInvariant maxMagnitudeGEencumberedMagnitude(e, params.operator, params.strategies[0]);
    requireInvariant sumOfPendingDiffCurrentMagnitudeRespectsWAD(operatorKey, params.operator, params.strategies[0]);
    requireInvariant maxMagnitudeGECurrentMagnitude(e, operatorKey, params.operator, params.strategies[0]);
    
    require (e.block.number < currentContract.allocations[params.operator][operatorKey][params.strategies[0]].effectBlock, "require to not trigger a change of values throughout computation by _getUpdatedAllocation()");

    // cannot allocate type IAllocationManagerTypes.Allocation in CVL directly but can access fields of primitive types
    uint64 currentMagnitudeBefore = currentContract.allocations[params.operator][operatorKey][params.strategies[0]].currentMagnitude;
    int128 pendingDiffBefore = currentContract.allocations[params.operator][operatorKey][params.strategies[0]].pendingDiff;
    require (pendingDiffBefore == 0, "prove an underapproximation assuming no pendingDiff, as pendingDiff changes currentMagnitude throughout the computation of slashOperator in _getUpdatedAllocation()");
    uint64 maxMagnitudeBefore = getMaxMagnitude(e, params.operator, params.strategies[0]);

    uint256 operatorSharesBefore = DelegationManager.operatorShares[params.operator][params.strategies[0]];
    uint256 queuedSharesBefore = DelegationManager.getSlashableSharesInQueue(e, params.operator, params.strategies[0]);
    // Note: the totalDepositSharesToSlash usually also account for slashableSharesInQueue that have been removed
    // Due to known rounding issues in the computation of DelegationManager.getSlashableSharesInQueue() 
    // we underapproximate and assume no slashableSharesInQueue but check no overslashing for operatorShares only
    require (operatorSharesBefore + queuedSharesBefore >= 1, "+" );

    slashOperator(e, avs, params);

    uint64 currentMagnitudeAfter = currentContract.allocations[params.operator][operatorKey][params.strategies[0]].currentMagnitude;
    uint64 maxMagnitudeAfter = getMaxMagnitude(e, params.operator, params.strategies[0]);

    uint256 operatorSharesAfter = DelegationManager.operatorShares[params.operator][params.strategies[0]];
    uint256 queuedSharesAfter = DelegationManager.getSlashableSharesInQueue(e, params.operator, params.strategies[0]);

    // currentMagnitude should not increase from a slash
    assert(currentMagnitudeBefore >= currentMagnitudeAfter);
    // operatorShares should not increase from a slash
    assert(operatorSharesBefore >= operatorSharesAfter);
    
    uint64 slashedMagnitude = require_uint64(currentMagnitudeBefore - currentMagnitudeAfter);
    uint256 totalDepositSharesToSlash = require_uint256(operatorSharesBefore - operatorSharesAfter + queuedSharesBefore - queuedSharesAfter);

    // assert slashedMagnitude / currentMagnitude >= totalDepositSharesToSlash / (operatorSharesBefore + queuedSharesBefore);
    assert slashedMagnitude != 0 => assert_uint256(slashedMagnitude / currentMagnitudeBefore) + 1 >= assert_uint256(totalDepositSharesToSlash / (operatorSharesBefore + queuedSharesBefore));
}


/// @title redistributionRecipient should not be dead address after a successful run
rule redistributionRecipientCannotBeDeadAddress(AllocationManager.OperatorSet operatorSet) {
    env e;
  
    IAllocationManagerTypes.CreateSetParams[] params;
    require (params[0].operatorSetId == operatorSet.id, "assume we're setting the recipient for the fixed operatorSet");

    address[] recipients;
    createRedistributingOperatorSets(e, operatorSet.avs, params, recipients);
    
    address finalRecipient = getRedistributionRecipient(e, operatorSet);
       
    assert params.length != 0 => finalRecipient != DEFAULT_BURN_ADDRESS();
}
````

## File: certora/specs/core/AllocationManagerSanity.spec
````
import "../optimizations.spec";

using AllocationManager as AllocationManager;
methods {
    function AllocationManager.DEALLOCATION_DELAY() external returns(uint32) envfree;

    // external calls to AVSRegistrar.  Note that the source does not have a proper implementation, the one available always reverts
    function _.registerOperator(address,address,uint32[],bytes) external => DISPATCHER(true);
    function _.deregisterOperator(address,address,uint32[]) external => DISPATCHER(true);
    function _.supportsAVS(address) external => DISPATCHER(true);

    // external calls to Strategy contracts
    function _.underlyingToken() external => DISPATCHER(true);
    function _.withdraw(address,address,uint256) external => DISPATCHER(true);

    // external calls to ERC20
    function _.balanceOf(address) external => DISPATCHER(true);
    function _.transfer(address,uint256) external => DISPATCHER(true);

    function OperatorSetLib.key(OperatorSetLib.OperatorSet memory os) internal returns (bytes32) => returnOperatorSetKey(os); // expect (bytes32); // return unique bytes32 that is not zero.

    // internal math summary to avoid overflows from the tool;
    // function AllocationManager._addInt128(uint64 a, int128 b) internal returns (uint64) => cvlAddInt128(a, b);
}

function cvlAddInt128(uint64 a, int128 b) returns uint64 {
    require(b >= 0 || to_mathint(a) > to_mathint(-b)); // Prevent underflow
    require(b <= 0 || a < to_mathint(max_uint64) -to_mathint(b)); // Prevent overflow
    return require_uint64(to_mathint(a) + to_mathint(b));
}

function returnOperatorSetKey(OperatorSetLib.OperatorSet os) returns bytes32 {
    return idToKey[os.id];
}

ghost mapping(uint32 => bytes32) idToKey {
    axiom forall uint32 id1 . forall uint32 id2 . (idToKey[id1] != to_bytes32(0) && idToKey[id2] != to_bytes32(0)) &&
        (id1 != id2 => idToKey[id1] != idToKey[id2]);
}

use builtin rule sanity;
````

## File: certora/specs/core/AllocationManagerValidState.spec
````
import "../optimizations.spec";
import "../ptaHelpers.spec";

using AllocationManagerHarness as AllocationManager;
using AllocationManagerView as AllocationManagerView;

methods {

    //harnessed
    function getOperatorKey(address, uint32) external returns (bytes32) envfree;
    function getOperatorSetFromKey(bytes32) external returns (AllocationManagerHarness.OperatorSet) envfree;

    function AllocationManager.DEALLOCATION_DELAY() external returns(uint32) envfree;
    function _.getMaxMagnitude(address,address) external => DISPATCHER(true);
    function _.getStrategyAllocations(address,address) external => DISPATCHER(true);
    function _.getAllocatableMagnitude(address,address) external => DISPATCHER(true);
    function _.getEncumberedMagnitude(address,address) external => DISPATCHER(true);
    function _.getAllocation(address,OperatorSetLib.OperatorSet,address) external => DISPATCHER(true);
    function _.getOperatorSetCount(address) external => DISPATCHER(true); 
    function _.getRegisteredSets(address) external => DISPATCHER(true);
    function _.isOperatorRedistributable(address) external => DISPATCHER(true);
    function _.getMemberCount(OperatorSetLib.OperatorSet) external => DISPATCHER(true);
    function _.getAllocatedSets(address) external => DISPATCHER(true);
    function _.getAllocatedStrategies(address,OperatorSetLib.OperatorSet) external => DISPATCHER(true);
    function _.getSlashCount(OperatorSetLib.OperatorSet) external => DISPATCHER(true);
    function _.getPendingSlasher(OperatorSetLib.OperatorSet) external => DISPATCHER(true);
    function _.isMemberOfOperatorSet(address,OperatorSetLib.OperatorSet) external => DISPATCHER(true);
    function _.isOperatorSet(OperatorSetLib.OperatorSet) external => DISPATCHER(true);
    function _.getMembers(OperatorSetLib.OperatorSet) external => DISPATCHER(true);
    function _.getStrategiesInOperatorSet(OperatorSetLib.OperatorSet) external => DISPATCHER(true);

    // external calls to AVSRegistrar.  Note that the source does not have a proper implementation, the one available always reverts
    function _.registerOperator(address,address,uint32[],bytes) external => DISPATCHER(true);
    function _.deregisterOperator(address,address,uint32[]) external => DISPATCHER(true);
    function _.supportsAVS(address) external => DISPATCHER(true);

    // external calls to Strategy contracts
    function _.underlyingToken() external => DISPATCHER(true);
    function _.withdraw(address,address,uint256) external => DISPATCHER(true);

    // external calls to ERC20
    function _.balanceOf(address) external => DISPATCHER(true);
    function _.transfer(address,uint256) external => DISPATCHER(true);

    function OperatorSetLib.key(OperatorSetLib.OperatorSet memory os) internal returns (bytes32) => returnOperatorSetKey(os); // expect (bytes32); // return unique bytes32 that is not zero.

    // internal math summary to avoid overflows from the tool;
    // function AllocationManager._addInt128(uint64 a, int128 b) internal returns (uint64) => cvlAddInt128(a, b);
}

function requireNoOverflow(env e){
    requireInvariant maxMagnitudeHistoryKeysLessThanCurrentBlock(e);
    requireInvariant deallocationQueueEffectBlocLessThanCurrBlockNumberPlushDelayPlusOne(e);
    requireInvariant deallocationQueueEffectBlockAscendingOrder(e);
    // prevent overflows in deallocationQueue
    require (forall address _operator. forall address _strategy. (currentContract.deallocationQueue[_operator][_strategy]._end < max_uint64 - 1), "reasonable length of deallocationQueue");
    // assuming deallocation block indices dont overflow
    require (forall address _operator . forall address _strategy . (deallocationQueueEndGhost[_operator][_strategy] < max_uint64 - 1), "reasonable length of deallocationQueue");
    // would happen around the year 2833 to get block number equal to half of max_uint32
    require (e.block.number < max_uint32 + AllocationManager.DEALLOCATION_DELAY + 1, "reasonable block numbers");  
    require (e.block.number > 0, "reasonable block numbers");
    // prevent overflows for loop iter = 2
    require (forall address operator_. forall address strategy_. maxMagnitudeHistoryLengths[operator_][strategy_] < max_uint256 - 1, "reasonable length of snapshots");
    require (forall address operator_. forall address strategy_. currentContract._maxMagnitudeHistory[operator_][strategy_]._snapshots.length < max_uint256 - 1, "reasonable length of snapshots");

}
function cvlAddInt128(uint64 a, int128 b) returns uint64 {
    require(b >= 0 || to_mathint(a) > to_mathint(-b)); // Prevent underflow
    require(b <= 0 || a < to_mathint(max_uint64) -to_mathint(b)); // Prevent overflow
    return require_uint64(to_mathint(a) + to_mathint(b));
}

function returnOperatorSetKey(OperatorSetLib.OperatorSet os) returns bytes32 {
    return idToKey[os.id];
}

ghost mapping(uint32 => bytes32) idToKey {
    axiom forall uint32 id1 . forall uint32 id2 . (idToKey[id1] != to_bytes32(0) && idToKey[id2] != to_bytes32(0)) &&
        (id1 != id2 => idToKey[id1] != idToKey[id2]);
}

// -----------------------------------------
// Constants and Definitions
// -----------------------------------------

definition WAD() returns uint64 = 1000000000000000000; // definition uint64 WAD = 1e18

definition inRegisteredSets(address operator, bytes32 value) returns bool = (registeredSetsIndexes[operator][value] != 0);

definition inAllocatedSets(address operator, bytes32 value) returns bool = (allocatedSetsIndexes[operator][value] != 0);

// checks if a given index is within the dealocationQ bounds for a given operator and strategy.
definition inBound(address operator, address strategy, int128 index) returns bool = 
    index >= deallocationQueueBeginGhost[operator][strategy] && index < deallocationQueueEndGhost[operator][strategy];

// -----------------------------------------
// Ghost Mappings and Mirroring
// -----------------------------------------

// Mirrors `_maxMagnitudeHistory` keys
ghost mapping(address => mapping(address => mapping(uint256 => uint32))) maxMagnitudeHistoryKeys {
    init_state axiom forall address operator . forall address strategy . forall uint256 index . maxMagnitudeHistoryKeys[operator][strategy][index] == 0;
}
// Mirrors `_maxMagnitudeHistory` values
ghost mapping(address => mapping(address => mapping(mathint => uint224))) maxMagnitudeHistoryValues {
    init_state axiom forall address operator . forall address strategy . forall mathint index . maxMagnitudeHistoryValues[operator][strategy][index] == 0;
}
// Mirrors `_maxMagnitudeHistory` lengths
ghost mapping(address => mapping(address => uint256)) maxMagnitudeHistoryLengths {
    init_state axiom forall address operator . forall address strategy . maxMagnitudeHistoryLengths[operator][strategy] == 0;
}

// Mirrors `_operatorSets` values
ghost mapping(address => mapping(uint256 => bytes32)) operatorSetsValues {
    init_state axiom forall address avs . forall uint256 index . operatorSetsValues[avs][index] == to_bytes32(0);
}
// Mirrors `_operatorSets` indexes
ghost mapping(address => mapping(bytes32 => uint256)) operatorSetsIndexes {
    init_state axiom forall address avs . forall bytes32 value . operatorSetsIndexes[avs][value] == 0;
}
// Mirrors `_operatorSets` lengths
ghost mapping(address => uint256) ghostOperatorSetsLengths {
    init_state axiom forall address avs . ghostOperatorSetsLengths[avs] == 0;
    axiom forall address avs . ghostOperatorSetsLengths[avs] < 0xffffffffffffffffffffffffffffffff;
}

// Mirrors `registeredSets` values
ghost mapping(address => mapping(uint256 => bytes32)) registeredSetsValues {
    init_state axiom forall address operator . forall uint256 index . registeredSetsValues[operator][index] == to_bytes32(0);
}
// Mirrors `registeredSets` indexes
ghost mapping(address => mapping(bytes32 => uint256)) registeredSetsIndexes {
    init_state axiom forall address operator . forall bytes32 value . registeredSetsIndexes[operator][value] == 0;
}
// Mirrors `registeredSets` lengths
ghost mapping(address => uint256) ghostLengths {
    init_state axiom forall address operator . ghostLengths[operator] == 0;
    axiom forall address operator . ghostLengths[operator] < 0xffffffffffffffffffffffffffffffff;
}

// Mirrors `registrationStatus` registered
ghost mapping(address => mapping(bytes32 => bool)) registrationStatusRegistered {
    init_state axiom forall address operator . forall bytes32 operatorSetKey . registrationStatusRegistered[operator][operatorSetKey] == false;
}
// Mirrors `registrationStatus` slashableUntil
ghost mapping(address => mapping(bytes32 => uint32)) registrationStatusSlashableUntil {
    init_state axiom forall address operator . forall bytes32 operatorSetKey . registrationStatusSlashableUntil[operator][operatorSetKey] == 0;
}

// Mirrors `allocatedSets` values
ghost mapping(address => mapping(uint256 => bytes32)) allocatedSetsValues {
    init_state axiom forall address operator . forall uint256 index . allocatedSetsValues[operator][index] == to_bytes32(0);
}
// Mirrors `allocatedSets` indexes
ghost mapping(address => mapping(bytes32 => uint256)) allocatedSetsIndexes {
    init_state axiom forall address operator . forall bytes32 value . allocatedSetsIndexes[operator][value] == 0;
}
// Mirrors `allocatedSets` lengths
ghost mapping(address => uint256) allocatedSetsGhostLengths {
    init_state axiom forall address operator . allocatedSetsGhostLengths[operator] == 0;
    axiom forall address operator . allocatedSetsGhostLengths[operator] < 0xffffffffffffffffffffffffffffffff;
}

// Mirrors `deallocationQueue` data
ghost mapping(address => mapping(address => mapping(int128 => bytes32))) deallocationQueueDataGhost {
    init_state axiom forall address operator . forall address strategy . forall int128 index . deallocationQueueDataGhost[operator][strategy][index] == to_bytes32(0);
}
 // Mirrors `deallocationQueue` begin
ghost mapping(address => mapping(address => int128)) deallocationQueueBeginGhost {
    init_state axiom forall address operator . forall address strategy . deallocationQueueBeginGhost[operator][strategy] == 0;
}
// Mirrors `deallocationQueue` end
ghost mapping(address => mapping(address => int128)) deallocationQueueEndGhost {
    init_state axiom forall address operator . forall address strategy . deallocationQueueEndGhost[operator][strategy] == 0;
}

// mirroring mapping(address operator => mapping(bytes32 operatorSetKey => mapping(IStrategy strategy => Allocation))) allocations;
// Mirrors `allocations` currentMagnitude
ghost mapping(address => mapping(bytes32 => mapping(address => uint64))) allocationsCurrentMagnitude {
    init_state axiom forall address operator . forall bytes32 setKey . forall address strategy . allocationsCurrentMagnitude[operator][setKey][strategy] == 0;
}
// Holds the sum of all current magnitudes per operator and strategy (across setKeys)
ghost mapping(address => mapping(address => mathint)) sumAllocationsCurrentMagnitude {
    init_state axiom forall address operator . forall address strategy . sumAllocationsCurrentMagnitude[operator][strategy] == 0;
}
/// The initial value is being updated as we access the allocations current magnitudes one-by-one.
/// Should only be used as an initial value, never post-action!
ghost mapping(address => mapping(address => mathint)) sumAllocationsCurrentMagnitude_init {
    init_state axiom forall address operator . forall address strategy . sumAllocationsCurrentMagnitude_init[operator][strategy] == 0;
}

ghost mapping(address => mapping(bytes32 => mapping(address => bool))) didAccessOpAndStrategy;

function SumTrackingSetup() {
    require forall address operator . forall address strategy . sumAllocationsCurrentMagnitude[operator][strategy] == 
        sumAllocationsCurrentMagnitude_init[operator][strategy] + sumAllocationsPendindDiff_init[operator][strategy];
    require forall address operator . forall bytes32 key . forall address strategy . !didAccessOpAndStrategy[operator][key][strategy];
    require forall address operator . forall bytes32 key . forall address strategy . !didAccessOpAndStrategyDiff[operator][key][strategy];
}

// Mirrors `allocations` pendingDiff
ghost mapping(address => mapping(bytes32 => mapping(address => int128))) allocationsPendingDiff {
    init_state axiom forall address operator . forall bytes32 setKey . forall address strategy . allocationsPendingDiff[operator][setKey][strategy] == 0;
}
// Holds the sum of all pendingDiffs per operator and strategy (across setKeys)
ghost mapping(address => mapping(address => mathint)) sumAllocationsPendindDiff { // only positive
    init_state axiom forall address operator . forall address strategy . sumAllocationsPendindDiff[operator][strategy] == 0;
}
/// The initial value is being updated as we access the allocations pending diffs one-by-one.
/// Should only be used as an initial value, never post-action!
ghost mapping(address => mapping(address => mathint)) sumAllocationsPendindDiff_init { // only positive
    init_state axiom forall address operator . forall address strategy . sumAllocationsPendindDiff_init[operator][strategy] == 0;
}

ghost mapping(address => mapping(bytes32 => mapping(address => bool))) didAccessOpAndStrategyDiff;

// Mirrors `allocations` effectBlock
ghost mapping(address => mapping(bytes32 => mapping(address => uint32))) allocationsEffectBlock {
    init_state axiom forall address operator . forall bytes32 setKey . forall address strategy . allocationsEffectBlock[operator][setKey][strategy] == 0;
}

// Mirrors `encumberedMagnitude`
ghost mapping(address => mapping(address => uint64)) encumberedMagnitudeMirror {
    init_state axiom forall address operator . forall address strategy . encumberedMagnitudeMirror[operator][strategy] == 0;
}

// -----------------------------------------
// Hooks for Synchronizing Ghost Mappings
// -----------------------------------------

// Sync keys when `_maxMagnitudeHistory` is updated
hook Sstore AllocationManager._maxMagnitudeHistory[KEY address operator][KEY address strategy]._snapshots[INDEX uint256 index]._key uint32 newKey (uint32 oldKey) {
    require oldKey == maxMagnitudeHistoryKeys[operator][strategy][index];
    maxMagnitudeHistoryKeys[operator][strategy][index] = newKey;
}
// Sync values when `_maxMagnitudeHistory` is updated
hook Sstore AllocationManager._maxMagnitudeHistory[KEY address operator][KEY address strategy]._snapshots[INDEX uint256 index]._value uint224 newValue (uint224 oldValue) {
    require oldValue == maxMagnitudeHistoryValues[operator][strategy][index];
    maxMagnitudeHistoryValues[operator][strategy][index] = newValue;
}
// Sync lengths when `_maxMagnitudeHistory` is updated
hook Sstore AllocationManager._maxMagnitudeHistory[KEY address operator][KEY address strategy]._snapshots.length uint256 newLength (uint256 oldLength) {
    require oldLength == maxMagnitudeHistoryLengths[operator][strategy];
    maxMagnitudeHistoryLengths[operator][strategy] = newLength;
}
// Validate snapshot length, keys and values during access
hook Sload uint256 length AllocationManager._maxMagnitudeHistory[KEY address operator][KEY address strategy]._snapshots.length {
    require length == maxMagnitudeHistoryLengths[operator][strategy];
}

hook Sload uint32 key AllocationManager._maxMagnitudeHistory[KEY address operator][KEY address strategy]._snapshots[INDEX uint256 index]._key {
    require key == maxMagnitudeHistoryKeys[operator][strategy][index];
}

hook Sload uint224 value AllocationManager._maxMagnitudeHistory[KEY address operator][KEY address strategy]._snapshots[INDEX uint256 index]._value {
    require value == maxMagnitudeHistoryValues[operator][strategy][index];
}

// Sync lengths when `_operatorSets` is updated
hook Sstore AllocationManager._operatorSets[KEY address operator].(offset 0) uint256 newLength {
    ghostOperatorSetsLengths[operator] = newLength;
}
// Sync values when `_operatorSets` is updated
hook Sstore AllocationManager._operatorSets[KEY address operator]._inner._values[INDEX uint256 index] bytes32 newValue {
    operatorSetsValues[operator][index] = newValue;
}
// Sync indexes when `_operatorSets` is updated
hook Sstore AllocationManager._operatorSets[KEY address operator]._inner._indexes[KEY bytes32 value] uint256 newIndex {
    operatorSetsIndexes[operator][value] = newIndex;
}
// Validate length, indexes and values during access
hook Sload uint256 length AllocationManager._operatorSets[KEY address operator].(offset 0) {
    require ghostOperatorSetsLengths[operator] == length;
}

hook Sload bytes32 value AllocationManager._operatorSets[KEY address operator]._inner._values[INDEX uint256 index] {
    require operatorSetsValues[operator][index] == value;
}

hook Sload uint256 index AllocationManager._operatorSets[KEY address operator]._inner._indexes[KEY bytes32 value] {
    require operatorSetsIndexes[operator][value] == index;
}

// Sync lengths when `registeredSets` is updated
hook Sstore AllocationManager.registeredSets[KEY address operator].(offset 0) uint256 newLength {
    ghostLengths[operator] = newLength;
}
// Sync values when `registeredSets` is updated
hook Sstore AllocationManager.registeredSets[KEY address operator]._inner._values[INDEX uint256 index] bytes32 newValue {
    registeredSetsValues[operator][index] = newValue;
}
// Sync indexes when `registeredSets` is updated
hook Sstore AllocationManager.registeredSets[KEY address operator]._inner._indexes[KEY bytes32 value] uint256 newIndex {
    registeredSetsIndexes[operator][value] = newIndex;
}
// Validate length, indexes and values during access
hook Sload uint256 length AllocationManager.registeredSets[KEY address operator].(offset 0) {
    require ghostLengths[operator] == length;
}

hook Sload bytes32 value AllocationManager.registeredSets[KEY address operator]._inner._values[INDEX uint256 index] {
    require registeredSetsValues[operator][index] == value;
}

hook Sload uint256 index AllocationManager.registeredSets[KEY address operator]._inner._indexes[KEY bytes32 value] {
    require registeredSetsIndexes[operator][value] == index;
}

// Sync registered when `registrationStatus` is updated
hook Sstore AllocationManager.registrationStatus[KEY address operator][KEY bytes32 operatorSetKey].registered bool newRegistered {
    registrationStatusRegistered[operator][operatorSetKey] = newRegistered;
}
// Sync slashableUntil when `registrationStatus` is updated
hook Sstore AllocationManager.registrationStatus[KEY address operator][KEY bytes32 operatorSetKey].slashableUntil uint32 newSlashableUntil {
    registrationStatusSlashableUntil[operator][operatorSetKey] = newSlashableUntil;
}
// Validate slashableUntil and registered during access
hook Sload bool registered AllocationManager.registrationStatus[KEY address operator][KEY bytes32 operatorSetKey].registered {
    require registrationStatusRegistered[operator][operatorSetKey] == registered;
}

hook Sload uint32 slashableUntil AllocationManager.registrationStatus[KEY address operator][KEY bytes32 operatorSetKey].slashableUntil {
    require registrationStatusSlashableUntil[operator][operatorSetKey] == slashableUntil;
}

// Sync lengths when `allocatedSets` is updated
hook Sstore AllocationManager.allocatedSets[KEY address operator].(offset 0) uint256 newLength {
    allocatedSetsGhostLengths[operator] = newLength;
}
// Sync values when `allocatedSets` is updated
hook Sstore AllocationManager.allocatedSets[KEY address operator]._inner._values[INDEX uint256 index] bytes32 newValue {
    allocatedSetsValues[operator][index] = newValue;
}
// Sync indexes when `allocatedSets` is updated
hook Sstore AllocationManager.allocatedSets[KEY address operator]._inner._indexes[KEY bytes32 value] uint256 newIndex {
    allocatedSetsIndexes[operator][value] = newIndex;
}
// Validate length, indexes and values during access
hook Sload uint256 length AllocationManager.allocatedSets[KEY address operator].(offset 0) {
    require allocatedSetsGhostLengths[operator] == length;
}

hook Sload bytes32 value AllocationManager.allocatedSets[KEY address operator]._inner._values[INDEX uint256 index] {
    require allocatedSetsValues[operator][index] == value;
}

hook Sload uint256 index AllocationManager.allocatedSets[KEY address operator]._inner._indexes[KEY bytes32 value] {
    require allocatedSetsIndexes[operator][value] == index;
}

// Sync data when `deallocationQueue` is updated
hook Sstore AllocationManager.deallocationQueue[KEY address operator][KEY address strategy]._data[KEY int128 index] bytes32 newValue (bytes32 oldValue) {
    require oldValue == deallocationQueueDataGhost[operator][strategy][index];
    deallocationQueueDataGhost[operator][strategy][index] = newValue;
}
hook Sload bytes32 value AllocationManager.deallocationQueue[KEY address operator][KEY address strategy]._data[KEY int128 index] {
    require value == deallocationQueueDataGhost[operator][strategy][index];
}

// Sync begin when `deallocationQueue` is updated
hook Sstore AllocationManager.deallocationQueue[KEY address operator][KEY address strategy]._begin int128 newBegin (int128 oldBegin) {
    require oldBegin ==  deallocationQueueBeginGhost[operator][strategy];
    deallocationQueueBeginGhost[operator][strategy] = newBegin;
}
hook Sload int128 begin AllocationManager.deallocationQueue[KEY address operator][KEY address strategy]._begin {
    require begin == deallocationQueueBeginGhost[operator][strategy];
}

// Sync end when `deallocationQueue` is updated
hook Sstore AllocationManager.deallocationQueue[KEY address operator][KEY address strategy]._end int128 newEnd (int128 oldEnd) {
    require oldEnd == deallocationQueueEndGhost[operator][strategy];
    deallocationQueueEndGhost[operator][strategy] = newEnd;
}
hook Sload int128 end AllocationManager.deallocationQueue[KEY address operator][KEY address strategy]._end {
    require end == deallocationQueueEndGhost[operator][strategy];
}

// Sync currentMagnitude when `allocations` is updated
hook Sstore AllocationManager.allocations[KEY address operator][KEY bytes32 setKey][KEY address strategy].currentMagnitude uint64 newCurMag (uint64 oldCurMag) {
    require oldCurMag == allocationsCurrentMagnitude[operator][setKey][strategy];
    if (!didAccessOpAndStrategy[operator][setKey][strategy]){
        didAccessOpAndStrategy[operator][setKey][strategy] = true;
        sumAllocationsCurrentMagnitude_init[operator][strategy] = sumAllocationsCurrentMagnitude_init[operator][strategy] - oldCurMag;
        require sumAllocationsCurrentMagnitude_init[operator][strategy] >= 0;
    }
    sumAllocationsCurrentMagnitude[operator][strategy] = sumAllocationsCurrentMagnitude[operator][strategy] + newCurMag - oldCurMag;
    allocationsCurrentMagnitude[operator][setKey][strategy] = newCurMag;
}
hook Sload uint64 curMag AllocationManager.allocations[KEY address operator][KEY bytes32 setKey][KEY address strategy].currentMagnitude {
    require curMag == allocationsCurrentMagnitude[operator][setKey][strategy];
    if (!didAccessOpAndStrategy[operator][setKey][strategy]){
        didAccessOpAndStrategy[operator][setKey][strategy] = true;
        sumAllocationsCurrentMagnitude_init[operator][strategy] = sumAllocationsCurrentMagnitude_init[operator][strategy] - curMag;
        require sumAllocationsCurrentMagnitude_init[operator][strategy] >= 0;
    }
}

// keep track of pendingDiff valid state transition. if true, then an invalid state transition occurred.
ghost bool didMakeInvalidPendingDiffTransition;

// Sync pendingDiff when `allocations` is updated
hook Sstore AllocationManager.allocations[KEY address operator][KEY bytes32 setKey][KEY address strategy].pendingDiff int128 newPenDiff (int128 oldPenDiff) {
    require oldPenDiff == allocationsPendingDiff[operator][setKey][strategy];
    // summing only positive diff (as negative doesnt count until the slashing is enforced).
    // this sum is correct because of pendingDiffStateTransformation.
    /*
    For every storage load of the pendingDiff for some operator, setKey and strategy for the first time, 
    we deduct the storage amount from the initial value and require that the result is non-negative. 

    Example:
    Suppose that at first the initial sum of pendingDiffs that are going to be accessed in the flow is x.
    sumAllocationsPendindDiff_init[operator][strategy] = x.
    The function flow is going to access:
        allocations[operator][setKey1][strategy].pendingDiff = 1
        allocations[operator][setKey2][strategy].pendingDiff = 2
        allocations[operator][setKey3][strategy].pendingDiff = 3

    x(0) = x
    At first access [0x1]:    
        x(1) -> x(0) - 1 = x - 1 ; require x - 1 >=0
    At second access [0x2]:    
        x(2) -> x(1) - 2 = x - 3 ; require x - 3 >=0
    At third access [0x3]:
        x(3) -> x(2) - 3 = x - 6 ; require x - 6 >=0

    The result is that x = sumAllocationsPendindDiff_init[operator][strategy] >= 6 = 1 + 2 + 3, as expected.
    */
    if (newPenDiff >= 0) {
        if (oldPenDiff >= 0) {
            if (!didAccessOpAndStrategyDiff[operator][setKey][strategy]){
                didAccessOpAndStrategyDiff[operator][setKey][strategy] = true;
                sumAllocationsPendindDiff_init[operator][strategy] = sumAllocationsPendindDiff_init[operator][strategy] - oldPenDiff;
                require sumAllocationsPendindDiff_init[operator][strategy] >= 0;
            }
            sumAllocationsPendindDiff[operator][strategy] = sumAllocationsPendindDiff[operator][strategy] + newPenDiff - oldPenDiff;
        } else {
            if (!didAccessOpAndStrategyDiff[operator][setKey][strategy]){
                didAccessOpAndStrategyDiff[operator][setKey][strategy] = true;
                require sumAllocationsPendindDiff_init[operator][strategy] >= 0;
            }
            sumAllocationsPendindDiff[operator][strategy] = sumAllocationsPendindDiff[operator][strategy] + newPenDiff;
        }
    } else {
         if (oldPenDiff >= 0) {
            if (!didAccessOpAndStrategyDiff[operator][setKey][strategy]){
                didAccessOpAndStrategyDiff[operator][setKey][strategy] = true;
                sumAllocationsPendindDiff_init[operator][strategy] = sumAllocationsPendindDiff_init[operator][strategy] - oldPenDiff;
                require sumAllocationsPendindDiff_init[operator][strategy] >= 0;
            }
            sumAllocationsPendindDiff[operator][strategy] = sumAllocationsPendindDiff[operator][strategy] - oldPenDiff;
        } 
    }
    // keep track of pendingDiff valid state transition:
    // allocation.pendingDiff state transformation - from 0 to negative or positive, from positive zero only, from negative to negative or to zero.
    if (oldPenDiff > 0) {
        didMakeInvalidPendingDiffTransition = !(newPenDiff == 0 || oldPenDiff == newPenDiff) || didMakeInvalidPendingDiffTransition;
    } else if (oldPenDiff < 0) {
        didMakeInvalidPendingDiffTransition = newPenDiff > 0 || didMakeInvalidPendingDiffTransition;
    }
    allocationsPendingDiff[operator][setKey][strategy] = newPenDiff;
}
hook Sload int128 penDiff AllocationManager.allocations[KEY address operator][KEY bytes32 setKey][KEY address strategy].pendingDiff {
    require penDiff == allocationsPendingDiff[operator][setKey][strategy];
    if (!didAccessOpAndStrategyDiff[operator][setKey][strategy]){
        didAccessOpAndStrategyDiff[operator][setKey][strategy] = true;
        sumAllocationsPendindDiff_init[operator][strategy] = sumAllocationsPendindDiff_init[operator][strategy] - penDiff;
        require sumAllocationsPendindDiff_init[operator][strategy] >= 0;
    }
}

// Sync effectBlock when `allocations` is updated
hook Sstore AllocationManager.allocations[KEY address operator][KEY bytes32 setKey][KEY address strategy].effectBlock uint32 newEffectBlock (uint32 oldEffectBlock) {
    require oldEffectBlock == allocationsEffectBlock[operator][setKey][strategy];
    allocationsEffectBlock[operator][setKey][strategy] = newEffectBlock;
}
hook Sload uint32 effectBlock AllocationManager.allocations[KEY address operator][KEY bytes32 setKey][KEY address strategy].effectBlock {
    require effectBlock == allocationsEffectBlock[operator][setKey][strategy];
}

// Sync when `encumberedMagnitude` is updated
hook Sstore AllocationManager.encumberedMagnitude[KEY address operator][KEY address strategy] uint64 newEncumberedMagnitude (uint64 oldEncumberedMagnitude) {
    require oldEncumberedMagnitude == encumberedMagnitudeMirror[operator][strategy];
    encumberedMagnitudeMirror[operator][strategy] = newEncumberedMagnitude;
}
hook Sload uint64 encumberedMagnitude AllocationManager.encumberedMagnitude[KEY address operator][KEY address strategy] {
    require encumberedMagnitudeMirror[operator][strategy] == encumberedMagnitude;
}

// -----------------------------------------
// Invariants for Protocol Rules
// -----------------------------------------

function requireValidState() {
    requireInvariant maxMagnitudeHistoryKeysMonotonicInc();
    requireInvariant SetInRegisteredIFFStatusIsTrue();
    requireInvariant registeredSetsInvariant();
    requireInvariant allocatedSetsInvariant();
    requireInvariant operatorSetsInvariant();
    requireInvariant maxMagnitudeMonotonicallyDecreasing();
    requireInvariant maxMagnitudeHistoryPastLengthNullified();
    requireInvariant encumberedMagnitudeEqSumOfCurrentMagnitudesAndPositivePending();
    requireInvariant negativePendingDiffAtMostCurrentMagnitude();
    requireInvariant noZeroKeyInDealocationQ();
    requireInvariant EndGreaterThenBegin();
    requireInvariant deallocationQueueDataOutOfBoundsAreNullified();
    requireInvariant noPositivePendingDiffInDeallocationQ();
    requireInvariant effectBlockZeroHasNoPendingDiff();
    requireInvariant deallocationQueueDataUniqueness();
}

// Ensures consistency and correctness of the `registeredSets` mapping:
// 1. `registeredSetsIndexes` must correctly map to `registeredSetsValues`.
// 2. Non-zero indexes must lie within [1, ghostLengths[operator]].
// 3. Zero index indicates the value is not in the set.
invariant registeredSetsInvariant()
    (forall address operator . forall uint256 index. 0 <= index && index < ghostLengths[operator] => to_mathint(registeredSetsIndexes[operator][registeredSetsValues[operator][index]]) == index + 1)
    && (forall address operator . forall bytes32 value. registeredSetsIndexes[operator][value] == 0 || 
         ((forall uint256 tmp. to_mathint(tmp) == (registeredSetsIndexes[operator][value] - 1) => registeredSetsValues[operator][tmp] == value)
          && registeredSetsIndexes[operator][value] >= 1 && registeredSetsIndexes[operator][value] <= ghostLengths[operator]));

// Ensures consistency and correctness of the `allocatedSets` mapping:
// 1. `allocatedSetsIndexes` must correctly map to `allocatedSetsValues`.
// 2. Non-zero indexes must lie within [1, allocatedSetsGhostLengths[operator]].
// 3. Zero index indicates the value is not in the set.
invariant allocatedSetsInvariant()
    (forall address operator . forall uint256 index. 0 <= index && index < allocatedSetsGhostLengths[operator] => to_mathint(allocatedSetsIndexes[operator][allocatedSetsValues[operator][index]]) == index + 1)
    && (forall address operator . forall bytes32 value. allocatedSetsIndexes[operator][value] == 0 || 
         ((forall uint256 tmp. to_mathint(tmp) == (allocatedSetsIndexes[operator][value] - 1) => allocatedSetsValues[operator][tmp] == value)
          && allocatedSetsIndexes[operator][value] >= 1 && allocatedSetsIndexes[operator][value] <= allocatedSetsGhostLengths[operator]));

// Ensures consistency and correctness of the `_operatorSets` mapping:
// 1. `operatorSetsIndexes` must correctly map to `operatorSetsValues`.
// 2. Non-zero indexes must lie within [1, ghostOperatorSetsLengths[operator]].
// 3. Zero index indicates the value is not in the set.
invariant operatorSetsInvariant() // needed for deallocationQueueDataUniqueness
    (forall address avs . forall uint256 index. 0 <= index && index < ghostOperatorSetsLengths[avs] => to_mathint(operatorSetsIndexes[avs][operatorSetsValues[avs][index]]) == index + 1)
    && (forall address avs . forall bytes32 value. operatorSetsIndexes[avs][value] == 0 || 
         ((forall uint256 tmp. to_mathint(tmp) == (operatorSetsIndexes[avs][value] - 1) => operatorSetsValues[avs][tmp] == value)
          && operatorSetsIndexes[avs][value] >= 1 && operatorSetsIndexes[avs][value] <= ghostOperatorSetsLengths[avs]));

/// @title _maxMagnitudeHistory.keys are monotonic increasing
/// @property MagnitudeHistory Keys are valid - Snapshots' timestamps are sorted in increasing order.
// _maxMagnitudeHistory.key are the block number at the update time, should be monotonic increasing
invariant maxMagnitudeHistoryKeysMonotonicInc()
    forall address operator . forall address strategy . forall uint256 index1 . forall uint256 index2 .
        index1 < maxMagnitudeHistoryLengths[operator][strategy] && index2 <= index1 =>
        maxMagnitudeHistoryKeys[operator][strategy][index2] <= maxMagnitudeHistoryKeys[operator][strategy][index1];

// Ensures that entries beyond `maxMagnitudeHistoryLengths` are nullified:
// 1. For each operator and strategy, all keys and values at indices >= `maxMagnitudeHistoryLengths` must be zero.
invariant maxMagnitudeHistoryPastLengthNullified()
    forall address operator . forall address strategy . forall uint256 index . index >= maxMagnitudeHistoryLengths[operator][strategy] =>
        (maxMagnitudeHistoryKeys[operator][strategy][index] == 0 && maxMagnitudeHistoryValues[operator][strategy][index] == 0)
        {
            preserved {
                // prevent overflows for loop iter = 2
                require forall address operator . forall address strategy . maxMagnitudeHistoryLengths[operator][strategy] < max_uint256 - 1;
            }
        }

/// @title  Ensures all keys in `maxMagnitudeHistoryKeys` are less than or equal to the current block number.
/// @property MagnitudeHistory Keys are valid
invariant maxMagnitudeHistoryKeysLessThanCurrentBlock(env e)
    forall address operator . forall address strategy . forall uint256 index . index < maxMagnitudeHistoryLengths[operator][strategy] =>
        maxMagnitudeHistoryKeys[operator][strategy][index] <= e.block.number 
        {
            preserved with (env e1) {
                require e1.block.number == e.block.number;
                requireInvariant registeredSetsInvariant();
                requireInvariant allocatedSetsInvariant();
            }
        }

/// @title maxMagnitude is monotonically decreasing
/// @property maxMagnitude is monotonically decreasing
invariant maxMagnitudeMonotonicallyDecreasing()
    forall address operator . forall address strategy . forall uint256 index1 . forall uint256 index2 . (index1 >= index2 =>
        maxMagnitudeHistoryValues[operator][strategy][index1] <= maxMagnitudeHistoryValues[operator][strategy][index2]) 
        && (maxMagnitudeHistoryLengths[operator][strategy] > 0 => maxMagnitudeHistoryValues[operator][strategy][0] <= WAD())
    {
        preserved with (env e) {
            requireInvariant maxMagnitudeHistoryKeysMonotonicInc();
            requireInvariant registeredSetsInvariant();
            requireInvariant allocatedSetsInvariant();
            requireInvariant maxMagnitudeHistoryPastLengthNullified();
            requireInvariant maxMagnitudeHistoryKeysLessThanCurrentBlock(e);
        }
    }

/// @title All setKeys in registeredSets should have registrationStatus as true per operator and vice versa
/// @property Ensure consistency between registered sets and their registration statuses
invariant SetInRegisteredIFFStatusIsTrue()
    forall address operator . forall bytes32 operatorSetKey . inRegisteredSets(operator, operatorSetKey) <=> registrationStatusRegistered[operator][operatorSetKey] 
    {
        preserved {
            requireInvariant registeredSetsInvariant();
        }
    }

// encumberedMagnitude per strategy S = sum all allocation.current magnitude per strategy S + sum all allocation.pending per strategy S if pending > 0;
/// @title encumberedMagnitude equals the sum of currentMagnitudes and positive pendingDiffs.
/// @property Magnitudes Solvency
invariant encumberedMagnitudeEqSumOfCurrentMagnitudesAndPositivePending() 
    forall address operator . forall address strategy. encumberedMagnitudeMirror[operator][strategy] == 
        sumAllocationsCurrentMagnitude[operator][strategy] + sumAllocationsPendindDiff[operator][strategy]
        {
             preserved {
                SumTrackingSetup();
                requireInvariant registeredSetsInvariant();
                requireInvariant allocatedSetsInvariant();
            }
        }

/// @title For each operator and strategy tuple, max magnitude is greater or equal to the encumbered magnitude.
/// @property Magnitudes Solvency
invariant maxMagnitudeGEencumberedMagnitude(env eInv, address operator, address strategy)
   getMaxMagnitude(eInv, operator, strategy) >= encumberedMagnitudeMirror[operator][strategy] 
        {
            preserved with (env e) {
                requireValidState();
                SumTrackingSetup();
                requireInvariant maxMagnitudeHistoryKeysLessThanCurrentBlock(e);
                // assuming deallocation block indices dont overflow
                require forall address _operator . forall address _strategy . (deallocationQueueEndGhost[_operator][_strategy] < max_uint64 - 1);
                // would happen around the year 2833 to get block number equal to half of max_uint32
                require e.block.number < max_uint32 + AllocationManager.DEALLOCATION_DELAY + 1;  
                require e.block.number > 0;
                // prevent overflows for loop iter = 2
                require forall address operator_ . forall address strategy_ . maxMagnitudeHistoryLengths[operator_][strategy_] < max_uint256 - 1;
            }
        }

/// @title Cant have a neggative pendingDiff that is greater than the current magnitude. 
/// @property Magnitudes solvency
invariant negativePendingDiffAtMostCurrentMagnitude()
    forall address operator . forall bytes32 key. forall address strategy . allocationsPendingDiff[operator][key][strategy] < 0 => 
        -allocationsPendingDiff[operator][key][strategy] <= allocationsCurrentMagnitude[operator][key][strategy]
    {
        preserved with (env e) {
            requireValidState();
        } 
    }

/// @title At most 1 pending allocation/deallocation can be queued for a given (Operator, OperatorSet, Strategy) tuple
/// @property DeallocationQueue allocations uniqueness
invariant deallocationQueueDataUniqueness()
    forall address operator . forall address strategy . forall int128 index1 . forall int128 index2 .
        (index1 != index2) && inBound(operator, strategy, index1) && inBound(operator, strategy, index2) => 
            deallocationQueueDataGhost[operator][strategy][index1] != deallocationQueueDataGhost[operator][strategy][index2]
    {
        preserved with (env e) {
            requireValidState();
            requireInvariant maxMagnitudeHistoryKeysLessThanCurrentBlock(e);
            requireInvariant deallocationQueueEffectBlocLessThanCurrBlockNumberPlushDelayPlusOne(e);
            // assuming deallocation block indices dont overflow
            require forall address _operator . forall address _strategy . (deallocationQueueEndGhost[_operator][_strategy] < max_uint64 - 1);
            // would happen around the year 2833 to get block number equal to half of max_uint32
            require e.block.number < max_uint32 - AllocationManager.DEALLOCATION_DELAY - 1;  
            require e.block.number > 0;
            requireInvariant deallocationQueueEffectBlockAscendingOrder(e);
        } 
    }

// Out-of-Bounds Deallocation Queue Data Nullification Invariant - helper Lemma
invariant deallocationQueueDataOutOfBoundsAreNullified() 
    forall address operator . forall address strategy . forall int128 index . (!inBound(operator, strategy, index)) <=> deallocationQueueDataGhost[operator][strategy][index] == to_bytes32(0)
    {
        preserved {
            // assuming deallocation block indices dont overflow
            require forall address operator . forall address strategy . (deallocationQueueEndGhost[operator][strategy] < max_uint64 - 1);
        }
    }

// Deallocation Queue Ordering: End Index ≥ Begin Index Invariant - helper Lemma
invariant EndGreaterThenBegin()
    forall address operator . forall address strategy . deallocationQueueBeginGhost[operator][strategy] <= deallocationQueueEndGhost[operator][strategy]
    {
        preserved {
            // assuming deallocation block indices dont overflow
            require forall address operator . forall address strategy . (deallocationQueueEndGhost[operator][strategy] < max_uint64 - 1);
        }
    }

/// @title Non-Zero Keys in Deallocation Queue Invariant
/// @property DeallocationQueue allocations uniqueness
invariant noZeroKeyInDealocationQ()
    forall address operator . forall address strategy . forall int128 index . inBound(operator, strategy, index) => deallocationQueueDataGhost[operator][strategy][index] != to_bytes32(0);

/// @title Allocations in the deallocation queue have their effect blocks equal at most the latest block number + DEALLOCATION_DELAY + 1.
/// @property Deallocation Queue Effect Block Timing Bound Invariant.
invariant deallocationQueueEffectBlocLessThanCurrBlockNumberPlushDelayPlusOne(env e)
    forall address operator . forall address strategy . forall int128 index . 
        inBound(operator, strategy, index) => (allocationsEffectBlock[operator][deallocationQueueDataGhost[operator][strategy][index]][strategy] <= e.block.number + AllocationManager.DEALLOCATION_DELAY + 1) 
        {
            preserved with (env e1) {
                requireValidState();
                SumTrackingSetup();
                requireInvariant maxMagnitudeHistoryKeysLessThanCurrentBlock(e);
                // assuming deallocation block indices dont overflow
                require forall address _operator . forall address _strategy . (deallocationQueueEndGhost[_operator][_strategy] < max_uint64 - 1);
                require e1.block.number == e.block.number;
                // would happen around the year 2833 to get block number equal to half of max_uint32
                require e1.block.number < max_uint32 - AllocationManager.DEALLOCATION_DELAY - 1;
                require e1.block.number > 0;  

                // assuming deallocation block indices dont overflow
                require forall address operator . forall address strategy . (deallocationQueueEndGhost[operator][strategy] < max_uint64 - 1);
                requireInvariant deallocationQueueEffectBlockAscendingOrder(e1);
            }
        }

/// @title 
/*
Ensures that effect blocks in the deallocation queue are sorted in ascending order, 
except when an effect block is zero, which must have been less than or equal to the current block number before. 
This prevents out-of-order deallocations and ensures a valid execution sequence.
*/
/// @property Deallocation Queue Effect Block Ascending Order Invariant
invariant deallocationQueueEffectBlockAscendingOrder(env e1)
    forall address operator . forall address strategy . forall int128 index1 . forall int128 index2 .
        (index1 <= index2) && inBound(operator, strategy, index1) && inBound(operator, strategy, index2) => 
            ((allocationsEffectBlock[operator][deallocationQueueDataGhost[operator][strategy][index1]][strategy] <= 
            allocationsEffectBlock[operator][deallocationQueueDataGhost[operator][strategy][index2]][strategy]) || 
            (allocationsEffectBlock[operator][deallocationQueueDataGhost[operator][strategy][index2]][strategy] == 0 &&
            allocationsEffectBlock[operator][deallocationQueueDataGhost[operator][strategy][index1]][strategy] <= e1.block.number))
    {
        preserved with (env e) {
            requireValidState();
            SumTrackingSetup();
            requireInvariant maxMagnitudeHistoryKeysLessThanCurrentBlock(e);
            // requireInvariant deallocationQueueDataOutOfBoundsAreNullified();
            requireInvariant deallocationQueueEffectBlocLessThanCurrBlockNumberPlushDelayPlusOne(e);
            // assuming deallocation block indices dont overflow
            require forall address _operator . forall address _strategy . (deallocationQueueEndGhost[_operator][_strategy] < max_uint64 - 1);
            // would happen around the year 2833 to get block number equal to half of max_uint32
            require e.block.number < max_uint32 - AllocationManager.DEALLOCATION_DELAY - 1;  
            require e.block.number > 0;
            require e.block.number == e1.block.number;
        }
    }

/// @title Ensures that if an allocation's effectBlock is zero, its pendingDiff must also be zero, preventing invalid pending modifications for inactive allocations.
/// @property No Pending Diff for Zero Effect Block
invariant effectBlockZeroHasNoPendingDiff()
    forall address operator . forall bytes32 setKey . forall address strategy .
        allocationsEffectBlock[operator][setKey][strategy] == 0 => allocationsPendingDiff[operator][setKey][strategy] == 0
    {
        preserved with (env e) {
            requireValidState();
            requireInvariant maxMagnitudeHistoryKeysLessThanCurrentBlock(e);
            // requireInvariant deallocationQueueDataOutOfBoundsAreNullified();
            requireInvariant deallocationQueueEffectBlocLessThanCurrBlockNumberPlushDelayPlusOne(e);
            // assuming deallocation block indices dont overflow
            require forall address _operator . forall address _strategy . (deallocationQueueEndGhost[_operator][_strategy] < max_uint64 - 1);
            // would happen around the year 2833 to get block number equal to half of max_uint32
            require e.block.number < max_uint32 - AllocationManager.DEALLOCATION_DELAY - 1;  
            require e.block.number > 0;
        }
    }

/// @title Ensures that all allocations in the deallocation queue have a pendingDiff value that is zero or negative, preventing improper positive adjustments during deallocation.
/// @property No Positive Pending Diff in Deallocation Queue
invariant noPositivePendingDiffInDeallocationQ() 
    forall address operator . forall address strategy . forall int128 index . 
        inBound(operator, strategy, index) => (allocationsPendingDiff[operator][deallocationQueueDataGhost[operator][strategy][index]][strategy] <= 0)
    {
        preserved with (env e) {
            requireValidState();
            requireInvariant maxMagnitudeHistoryKeysLessThanCurrentBlock(e);
            // requireInvariant deallocationQueueDataOutOfBoundsAreNullified();
            requireInvariant deallocationQueueEffectBlocLessThanCurrBlockNumberPlushDelayPlusOne(e);
            // assuming deallocation block indices dont overflow
            require forall address _operator . forall address _strategy . (deallocationQueueEndGhost[_operator][_strategy] < max_uint64 - 1);
            // would happen around the year 2833 to get block number equal to half of max_uint32
            require e.block.number < max_uint32 - AllocationManager.DEALLOCATION_DELAY - 1;  
            require e.block.number > 0;
            requireInvariant deallocationQueueEffectBlockAscendingOrder(e);
        }
    }

invariant maxMagnitudeGECurrentMagnitude(env eInv, bytes32 operatorKey, address operator, address strategy)
    currentContract.allocations[operator][operatorKey][strategy].currentMagnitude <= getMaxMagnitude(eInv, operator, strategy)
    {
        preserved with (env e) {
            requireValidState();
            SumTrackingSetup();
            requireNoOverflow(e);
            // magnitudes cannot go beyond 1e18
            requireInvariant maxMagnitudeLeqWAD(e, operator, strategy);
            requireInvariant currentMagnitudeLeqWAD(operatorKey, operator, strategy);
            requireInvariant encumberedMagnitudeLeqWAD(e, operator, strategy);
            requireInvariant sumOfPendingDiffCurrentMagnitudeRespectsWAD(operatorKey, operator, strategy);
            requireInvariant maxMagnitudeGEencumberedMagnitude(e, operator, strategy);
            require (e.block.number < currentContract.allocations[operator][operatorKey][strategy].effectBlock, "require to not trigger a change of values throughout computation by _getUpdatedAllocation()");
        }
        preserved slashOperator(
            address avs2, 
            IAllocationManagerTypes.SlashingParams params
        ) with (env e) {
            bytes32 opKey = getOperatorKey(avs2, params.operatorSetId);
            require (opKey == operatorKey, "need to ensure that the parameter opKey is the same operatorKey as used in the invariant"); 

            requireValidState();
            SumTrackingSetup();
            requireNoOverflow(e);
            // magnitudes cannot go beyond 1e18
            requireInvariant maxMagnitudeLeqWAD(e, operator, strategy);
            requireInvariant currentMagnitudeLeqWAD(operatorKey, operator, strategy);
            requireInvariant encumberedMagnitudeLeqWAD(e, operator, strategy);
            requireInvariant sumOfPendingDiffCurrentMagnitudeRespectsWAD(operatorKey, operator, strategy);

            requireInvariant maxMagnitudeGEencumberedMagnitude(e, operator, strategy);
            require (e.block.number < currentContract.allocations[operator][operatorKey][strategy].effectBlock, "require to not trigger a change of values throughout computation by _getUpdatedAllocation()");
        } 
    }

invariant maxMagnitudeLeqWAD(env eInv, address operator, address strategy)
    getMaxMagnitude(eInv, operator, strategy) <= WAD();

invariant currentMagnitudeLeqWAD(bytes32 operatorKey, address operator, address strategy)
    currentContract.allocations[operator][operatorKey][strategy].currentMagnitude <= WAD() {
        preserved with (env e) {
            SumTrackingSetup();
            requireValidState();
            requireNoOverflow(e);
            requireInvariant maxMagnitudeLeqWAD(e, operator, strategy);
            requireInvariant encumberedMagnitudeLeqWAD(e, operator, strategy);
            requireInvariant maxMagnitudeGEencumberedMagnitude(e, operator, strategy);
            requireInvariant sumOfPendingDiffCurrentMagnitudeRespectsWAD(operatorKey, operator, strategy);
            require (e.block.number < currentContract.allocations[operator][operatorKey][strategy].effectBlock, "require to not trigger a change of values throughout computation by _getUpdatedAllocation()");
        }
    }

invariant encumberedMagnitudeLeqWAD(env e, address operator, address strategy)
    getEncumberedMagnitude(e, operator, strategy) <= WAD() {
        preserved {
            requireInvariant maxMagnitudeGEencumberedMagnitude(e, operator, strategy);
            SumTrackingSetup();
            requireValidState();
            requireNoOverflow(e);
            requireInvariant maxMagnitudeLeqWAD(e, operator, strategy);
        }
    }

invariant sumOfPendingDiffCurrentMagnitudeRespectsWAD(bytes32 operatorKey, address operator, address strategy)
     currentContract.allocations[operator][operatorKey][strategy].currentMagnitude + currentContract.allocations[operator][operatorKey][strategy].pendingDiff <= WAD() {
            preserved with (env e) {
                SumTrackingSetup();
                requireValidState();
                requireNoOverflow(e);
                requireInvariant maxMagnitudeLeqWAD(e, operator, strategy);
                requireInvariant encumberedMagnitudeLeqWAD(e, operator, strategy);
                requireInvariant maxMagnitudeGEencumberedMagnitude(e, operator, strategy);
            }
            preserved modifyAllocations(
                address op,
                IAllocationManagerTypes.AllocateParams[] params
            ) with (env e) {
                // require (forall uint256 i. forall uint256 j. params[i].newMagnitudes[j] <= WAD(), "assume new magnitudes respect WAD()");

                // AllocationManager.OperatorSet opSet = getOperatorSetFromKey(operatorKey);
                // require (forall uint256 i. forall uint256 j. params[i].operatorSet.avs == opSet.avs => 
                // params[i].newMagnitudes[j] + currentContract.allocations[operator][operatorKey][strategy].pendingDiff <= WAD(), "assume new magnitude + current pending diff respect WAD()");
                
                require (e.block.number < currentContract.allocations[operator][operatorKey][strategy].effectBlock, "require to not trigger a change of values throughout computation by _getUpdatedAllocation()");

                SumTrackingSetup();
                requireValidState();
                requireNoOverflow(e);
                requireInvariant maxMagnitudeLeqWAD(e,operator, strategy);
                requireInvariant encumberedMagnitudeLeqWAD(e, operator, strategy);
                requireInvariant maxMagnitudeGEencumberedMagnitude(e, operator, strategy);
            }
        }
````

## File: certora/specs/core/DelegationManager.spec
````
import "../ptaHelpers.spec";

using DelegationManager as DelegationManager;

methods {
    //// External Calls
	// external calls to DelegationManager 
    function undelegate(address) external;
    function decreaseDelegatedShares(address,address,uint256) external;
	function increaseDelegatedShares(address,address,uint256) external;

    // external calls from DelegationManager to ServiceManager
    function _.updateStakes(address[]) external => NONDET;

	// external calls to StrategyManager
    function _.getDeposits(address) external => DISPATCHER(true);
    function _.withdrawSharesAsTokens(address,address,address,uint256) external => DISPATCHER(true);

	// external calls to EigenPodManager
    function _.addShares(address,address,uint256) external => DISPATCHER(true);
    // function _.withdrawSharesAsTokens(address,address,address,uint256) external => DISPATCHER(true); // Already summarized in section for StrategyManager
    function _.podOwnerShares(address) external => NONDET;

    // external calls to EigenPod
	function _.withdrawRestakedBeaconChainETH(address,uint256) external => DISPATCHER(true);

    // external calls to PauserRegistry
    function _.isPauser(address) external => DISPATCHER(true);
	function _.unpauser() external => DISPATCHER(true);

    // external calls to Strategy contracts
    function _.withdraw(address,address,uint256) external => DISPATCHER(true);
    function _.deposit(address,uint256) external => DISPATCHER(true);
    function _.underlyingToken() external => DISPATCHER(true);

    // external calls to ERC20
    function _.balanceOf(address) external => DISPATCHER(true);
    function _.transfer(address, uint256) external => DISPATCHER(true);
    function _.transferFrom(address, address, uint256) external => DISPATCHER(true);

    // external calls to ERC1271 (can import OpenZeppelin mock implementation)
    // isValidSignature(bytes32 hash, bytes memory signature) returns (bytes4 magicValue) => DISPATCHER(true)
    function _.isValidSignature(bytes32, bytes) external => DISPATCHER(true);
    function SignatureCheckerUpgradeable.isValidERC1271SignatureNow(address,bytes32,bytes memory) internal returns (bool) => NONDET;

    //// Harnessed Functions
    // Harnessed getters
    function get_operatorShares(address,address) external returns (uint256) envfree;
    function get_stakerDelegateableShares(address,address) external returns (uint256) envfree;
    function get_min_withdrawal_delay_blocks() external returns (uint32) envfree;
    function canCall(address,address,address,uint32) external returns (bool) envfree;

    //envfree functions
    function delegatedTo(address) external returns (address) envfree;
    function delegationApprover(address operator) external returns (address) envfree;
    function operatorShares(address operator, address strategy) external returns (uint256) envfree;
    function isDelegated(address staker) external returns (bool) envfree;
    function isOperator(address operator) external returns (bool) envfree;
    function delegationApproverSaltIsSpent(address delegationApprover, bytes32 salt) external returns (bool) envfree;
    function strategyManager() external returns (address) envfree;
    function eigenPodManager() external returns (address) envfree;
    function calculateWithdrawalRoot(IDelegationManagerTypes.Withdrawal) external returns (bytes32) envfree;
    function pendingWithdrawals(bytes32) external returns (bool) envfree;

}

/*
LEGAL STATE TRANSITIONS:
1)
FROM not delegated -- defined as delegatedTo(staker) == address(0), likewise returned by !isDelegated(staker)--
AND not registered as an operator -- defined as isOperator(operator) == false, or equivalently, delegationTerms(operator) == 0,
TO delegated but not an operator
in this case, the end state is that:
isOperator(staker) == false,
delegatedTo(staker) != staker && delegatedTo(staker) != 0,
and isDelegated(staker) == true (redundant with above)
-only allowed when calling `delegateTo`

2)
FROM not delegated AND not registered as an operator
TO an operator
in this case, the end state is that:
isOperator(staker) == true,
delegatedTo(staker) == staker,
and isDelegated(staker) == true (redundant with above)
-only allowed when calling `registerAsOperator`

3)
FROM not registered as an operator AND delegated
TO not delegated (and still *not* registered as an operator)
in this case, the end state is that:
isOperator(staker) == false,
delegatedTo(staker) == 0,
and isDelegated(staker) == false (redundant with above)

ILLEGAL STATE TRANSITIONS:
A)
FROM registered as an operator
TO not registered as an operator

B) 
FROM registered as an operator (implies they are also delegated to themselves)
TO not delegated to themselves

C)
FROM delegated to an operator
TO delegated to another operator
(without undelegating in-between)

FORBIDDEN STATES:
-an address cannot be simultaneously (classified as an operator) and (not delegated to themselves)
-an address cannot be (delegated to themselves) and (not classified as an operator)
Combining the above, an address can be (classified as an operator) *iff* they are (delegated to themselves).
The exception is the zero address, since by default an address is 'delegated to the zero address' when they are not delegated at all
*/
//definition notDelegated -- defined as delegatedTo(staker) == address(0), likewise returned by !isDelegated(staker)--

// Mirrors `_operatorDetails[operator].delegationApprover`
ghost mapping(address => address) operatorDetailsDelegationApproversMirror {
    init_state axiom forall address operator . operatorDetailsDelegationApproversMirror[operator] == 0;
}

// -----------------------------------------
// Hooks for Synchronizing Ghost Mappings
// -----------------------------------------

// Sync when `_operatorDetails[operator].delegationApprover` is updated
hook Sstore DelegationManager._operatorDetails[KEY address operator].delegationApprover address newDelegationApprover (address oldDelegationApprover) {
    require oldDelegationApprover == operatorDetailsDelegationApproversMirror[operator];
    operatorDetailsDelegationApproversMirror[operator] = newDelegationApprover;
}
hook Sload address delegationApprover DelegationManager._operatorDetails[KEY address operator].delegationApprover {
    require delegationApprover == operatorDetailsDelegationApproversMirror[operator];
}

// verify that anyone who is registered as an operator is also always delegated to themselves
// the zero address is an exception to this rule, since it is always "delegated to itself" but not an operator
/// @title Verifies that operators delegates to themselves.
/// @property Operators delegates to themselves
invariant operatorsAlwaysDelegatedToSelf(address operator)
    operatorDetailsDelegationApproversMirror[operator] != 0 => DelegationManager.delegatedTo[operator] == operator;

// verify that once registered as an operator, a person cannot 'unregister' from being an operator
// proving this rule in concert with 'operatorsAlwaysDelegatedToSelf' proves that an operator can never change their delegation
// Certora: The prover does not need the precondition `operatorsAlwaysDelegatedToSelf` to prove the rule.
rule operatorCannotUnregister(address operator) {
    // assume `operator` starts in a state of being registered as an operator
    require(isOperator(operator) && operator != 0);
    // perform arbitrary function call
    method f;
    env e;
    calldataarg arg;
    f(e,arg);
    // verify that `operator` is still registered as an operator
    assert(isOperator(operator), "operator was able to deregister!");
}

// verifies that in order for an address to change who they are delegated to, `undelegate` must be called
rule cannotChangeDelegationWithoutUndelegating(address staker) {
    // assume the staker is delegated to begin with
    require(isDelegated(staker));
    address delegatedToBefore = delegatedTo(staker);
    // perform arbitrary function call
    method f;
    env e;
    // the only way the staker can become undelegated is an appropriate function is called
    if (f.selector == sig:undelegate(address).selector) {
        address toUndelegate;
        undelegate(e, toUndelegate);
        // either the `staker` address was an input to `undelegate` AND the caller was allowed to call the function
        if (
            toUndelegate == staker &&
            delegatedToBefore != staker &&
            (
                e.msg.sender == staker ||
                e.msg.sender == delegatedToBefore ||
                e.msg.sender == delegationApprover(delegatedToBefore) ||
                canCall(delegatedToBefore, e.msg.sender, currentContract, sig:undelegate(address).selector)
            )
        )
        {
            assert (delegatedTo(staker) == 0, "undelegation did not result in delegation to zero address");
        }
        // or the staker's delegation should have remained the same
        else {
            address delegatedToAfter = delegatedTo(staker);
            assert (delegatedToAfter == delegatedToBefore, "delegation changed without undelegating -- problem in undelegate permissions?");
        }
        assert(true);
    } else if (f.selector == sig:redelegate(address,ISignatureUtilsMixinTypes.SignatureWithExpiry,bytes32).selector) {
        address newOperator;
        ISignatureUtilsMixinTypes.SignatureWithExpiry approverSignatureAndExpiry;
        bytes32 salt;
        redelegate(e, newOperator, approverSignatureAndExpiry, salt);
        if (e.msg.sender == staker) {
            assert (delegatedTo(staker) == newOperator, "redelegate did not result in delegation to new operator");
        } else {
            address delegatedToAfter = delegatedTo(staker);
            assert (delegatedToAfter == delegatedToBefore, "delegation changed without redelegating -- problem in redelegate permissions?");
        }
        assert(true);
    }
    else {
        calldataarg arg;
        f(e,arg);
        address delegatedToAfter = delegatedTo(staker);
        assert (delegatedToAfter == delegatedToBefore, "delegation changed without undelegating");
    }
}

// verifies that an undelegated address can only delegate when calling `delegateTo` or `registerAsOperator`
rule canOnlyDelegateWithSpecificFunctions(address staker) {
    // assume the staker begins as undelegated
    require(!isDelegated(staker) && staker != 0);
    // perform arbitrary function call
    method f;
    env e;
    if (f.selector == sig:delegateTo(address, ISignatureUtilsMixinTypes.SignatureWithExpiry, bytes32).selector) {
        address operator;
        require(operator != 0);
        ISignatureUtilsMixinTypes.SignatureWithExpiry approverSignatureAndExpiry;
        bytes32 salt;
        delegateTo(e, operator, approverSignatureAndExpiry, salt);
        // we check against operator being the zero address here, since we view being delegated to the zero address as *not* being delegated
        if (e.msg.sender == staker && isOperator(operator) && operator != 0) {
            assert (isDelegated(staker) && delegatedTo(staker) == operator, "failure in delegateTo");
        } else {
            assert (!isDelegated(staker), "staker delegated to inappropriate address?");
        }
    } else if (f.selector == sig:registerAsOperator(address,uint32,string).selector) {
        address operator;
        uint32 allocationDelay;
        string metadataURI;
        registerAsOperator(e, operator, allocationDelay, metadataURI);
        if (e.msg.sender == staker) {
            assert (isOperator(staker));
        } else {
            assert(!isDelegated(staker));
        }
    } else {
        calldataarg arg;
        f(e,arg);
        assert (!isDelegated(staker), "staker became delegated through inappropriate function call");
    }
}

rule sharesBecomeDelegatedWhenStakerDelegates(address operator, address staker, address strategy) {
    // filter out zero address (not a valid operator)
    require(operator != 0);
    // assume the staker begins as undelegated
    require(!isDelegated(staker));
    mathint stakerDelegateableSharesInStrategy = get_stakerDelegateableShares(staker, strategy);
    mathint operatorSharesBefore = get_operatorShares(operator, strategy);
    // perform arbitrary function call
    method f;
    env e;
    calldataarg arg;
    // Certora: The rule does not hold if uncommented
//    f(e, arg);
    mathint operatorSharesAfter = get_operatorShares(operator, strategy);
    if (delegatedTo(staker) == operator) {
        assert(operatorSharesAfter == operatorSharesBefore + stakerDelegateableSharesInStrategy, "operator shares did not increase appropriately");
    } else {
        assert(operatorSharesAfter == operatorSharesBefore, "operator shares changed inappropriately");
    }
}

rule sharesBecomeUndelegatedWhenStakerUndelegates(address operator, address staker, address strategy) {
    // filter out zero address (not a valid operator)
    require(operator != 0);
    // assume the staker begins as delegated to the operator
    require(delegatedTo(staker) == operator);
    mathint stakerDelegateableSharesInStrategy = get_stakerDelegateableShares(staker, strategy);
    mathint operatorSharesBefore = get_operatorShares(operator, strategy);
    // perform arbitrary function call
    method f;
    env e;
    calldataarg arg;
    // Certora: The rule does not hold if uncommented
//    f(e, arg);
    mathint operatorSharesAfter = get_operatorShares(operator, strategy);
    if (!isDelegated(staker)) {
        assert(operatorSharesAfter == operatorSharesBefore - stakerDelegateableSharesInStrategy, "operator shares did not decrease appropriately");
    } else {
        assert(operatorSharesAfter == operatorSharesBefore, "operator shares changed inappropriately");
    }
}

rule newWithdrawalsHaveCorrectStartBlock() {
    IDelegationManagerTypes.Withdrawal queuedWithdrawal;
    bytes32 withdrawalRoot = calculateWithdrawalRoot(queuedWithdrawal);
    require(!pendingWithdrawals(withdrawalRoot));

    // perform arbitrary function call
    method f;
    env e;
    calldataarg arg;
    f(e, arg);
    assert(
        !pendingWithdrawals(withdrawalRoot)
        || (queuedWithdrawal.startBlock == assert_uint32(e.block.number)),
        "withdrawal start block set incorrectly"
    );
}

rule withdrawalDelayIsEnforced() {
    IDelegationManagerTypes.Withdrawal queuedWithdrawal;
    address[] tokens;
    uint256 middlewareTimesIndex;
    bool receiveAsTokens;
    env e;
    completeQueuedWithdrawal@withrevert(e, queuedWithdrawal, tokens, receiveAsTokens);
    bool callReverted = lastReverted;
    assert(
        callReverted
        || (assert_uint256(queuedWithdrawal.startBlock + get_min_withdrawal_delay_blocks()) <= e.block.number),
        "withdrawal delay not properly enforced"
    );
}

/*
rule batchEquivalence {
    env e;
    storage initial = lastStorage;
    address staker;
    address strategy1;
    address strategy2;
    uint256 share1;
    uint256 share2;

    mathint _operatorSharesStrategy1 = get_operatorShares(staker, strategy1);
    mathint _operatorSharesStrategy2 = get_operatorShares(staker, strategy2);

    decreaseDelegatedShares(e,staker,strategy1,strategy2,share1,share2);

    mathint operatorSharesStrategy1_batch = get_operatorShares(staker, strategy1);
    mathint operatorSharesStrategy2_batch = get_operatorShares(staker, strategy2);

    decreaseDelegatedShares(e,staker,strategy1,share1) at initial;
    decreaseDelegatedShares(e,staker,strategy2,share2);

    mathint operatorSharesStrategy1_single = get_operatorShares(staker, strategy1);
    mathint operatorSharesStrategy2_single = get_operatorShares(staker, strategy2);

    assert operatorSharesStrategy1_single == operatorSharesStrategy1_batch 
        && operatorSharesStrategy2_single == operatorSharesStrategy2_batch, 
        "operatorShares must be affected in the same way";
}
*/
/*
invariant zeroAddrHasNoShares(address strategy)
    get_operatorShares(0,strategy) == 0
*/
````

## File: certora/specs/core/DelegationManagerValidState.spec
````
import "../ptaHelpers.spec";

using DelegationManager as DelegationManager;

methods {
    //// External Calls
	// external calls to DelegationManager 
    function undelegate(address) external;
    function decreaseDelegatedShares(address,address,uint256) external;
	function increaseDelegatedShares(address,address,uint256) external;
    function getWithdrawableShares(address, address[]) external;

    // external calls from DelegationManager to ServiceManager
    function _.updateStakes(address[]) external => NONDET;

	// external calls to StrategyManager
    function _.getDeposits(address) external => DISPATCHER(true);
    function _.withdrawSharesAsTokens(address,address,address,uint256) external => DISPATCHER(true);

	// external calls to EigenPodManager
    function _.addShares(address,address,uint256) external => DISPATCHER(true);
    // function _.withdrawSharesAsTokens(address,address,address,uint256) external => DISPATCHER(true); // Already summarized in section for StrategyManager
    function _.podOwnerShares(address) external => NONDET;

    // external calls to EigenPod
	function _.withdrawRestakedBeaconChainETH(address,uint256) external => DISPATCHER(true);

    // external calls to PauserRegistry
    function _.isPauser(address) external => DISPATCHER(true);
	function _.unpauser() external => DISPATCHER(true);

    // external calls to Strategy contracts
    function _.withdraw(address,address,uint256) external => DISPATCHER(true);
    function _.deposit(address,uint256) external => DISPATCHER(true);
    function _.underlyingToken() external => DISPATCHER(true);

    // external calls to ERC20
    function _.balanceOf(address) external => DISPATCHER(true);
    function _.transfer(address, uint256) external => DISPATCHER(true);
    function _.transferFrom(address, address, uint256) external => DISPATCHER(true);

    // external calls to ERC1271 (can import OpenZeppelin mock implementation)
    // isValidSignature(bytes32 hash, bytes memory signature) returns (bytes4 magicValue) => DISPATCHER(true)
    function _.isValidSignature(bytes32, bytes) external => DISPATCHER(true);

    //// Harnessed Functions
    // Harnessed getters
    function get_operatorShares(address,address) external returns (uint256) envfree;
    function get_stakerDelegateableShares(address,address) external returns (uint256) envfree;
    function get_min_withdrawal_delay_blocks() external returns (uint32) envfree;

    //envfree functions
    function delegatedTo(address) external returns (address) envfree;
    function delegationApprover(address operator) external returns (address) envfree;
    function operatorShares(address operator, address strategy) external returns (uint256) envfree;
    function isDelegated(address staker) external returns (bool) envfree;
    function isOperator(address operator) external returns (bool) envfree;
    function delegationApproverSaltIsSpent(address delegationApprover, bytes32 salt) external returns (bool) envfree;
    function strategyManager() external returns (address) envfree;
    function eigenPodManager() external returns (address) envfree;
    function calculateWithdrawalRoot(IDelegationManagerTypes.Withdrawal) external returns (bytes32) envfree;
    function pendingWithdrawals(bytes32) external returns (bool) envfree;
    function depositScalingFactor(address, address) external returns (uint256) envfree;

    function _.beaconChainSlashingFactor(address staker) external => beaconChainSlashingFactorSummary(staker) expect uint64;
}

// -----------------------------------------
// External Calls Summary
// -----------------------------------------

ghost mapping(address => uint64) beaconChainSlashingFactorGhost {
    init_state axiom forall address staker . beaconChainSlashingFactorGhost[staker] == 0;
    // The following is proven for the eigenpod manager (beaconChainSlashingFactor is at most one WAD):
    axiom forall address staker . beaconChainSlashingFactorGhost[staker] <= WAD();
}

function beaconChainSlashingFactorSummary(address staker) returns uint64 {
    return beaconChainSlashingFactorGhost[staker];
}

// -----------------------------------------
// Constants and Definitions
// -----------------------------------------

definition WAD() returns uint64 = 1000000000000000000; // definition uint64 WAD = 1e18

definition inRootsSets(address staker, bytes32 value) returns bool = (stakerQueuedWithdrawalRootsSetsIndexes[staker][value] != 0);

// ----------------------------------------- 
// Ghost Mappings and Mirroring
// ----------------------------------------- 

// Mirrors `_cumulativeScaledSharesHistory` keys
ghost mapping(address => mapping(address => mapping(uint256 => uint32))) cumulativeScaledSharesHistoryKeys {
    init_state axiom forall address operator . forall address strategy . forall uint256 index . cumulativeScaledSharesHistoryKeys[operator][strategy][index] == 0;
}
// Mirrors `_cumulativeScaledSharesHistory` values
ghost mapping(address => mapping(address => mapping(mathint => uint224))) cumulativeScaledSharesHistoryValues {
    init_state axiom forall address operator . forall address strategy . forall mathint index . cumulativeScaledSharesHistoryValues[operator][strategy][index] == 0;
}
// Mirrors `_cumulativeScaledSharesHistory` lengths
ghost mapping(address => mapping(address => uint256)) cumulativeScaledSharesHistoryLengths {
    init_state axiom forall address operator . forall address strategy . cumulativeScaledSharesHistoryLengths[operator][strategy] == 0;
}

// Mirrors `operatorShares`
ghost mapping(address => mapping(address => uint256)) operatorSharesGhost {
    init_state axiom forall address operator . forall address strategy . operatorSharesGhost[operator][strategy] == 0;
}

// Mirror `_depositScalingFactor`
ghost mapping(address => mapping(address => uint256)) scalingFactorsGhost {
    init_state axiom forall address staker . forall address strategy . scalingFactorsGhost[staker][strategy] == 0;
}

// Mirrors `_stakerQueuedWithdrawalRoots` values
ghost mapping(address => mapping(uint256 => bytes32)) stakerQueuedWithdrawalRootsSetsValues {
    init_state axiom forall address staker . forall uint256 index . stakerQueuedWithdrawalRootsSetsValues[staker][index] == to_bytes32(0);
}
// Mirrors `_stakerQueuedWithdrawalRoots` indexes
ghost mapping(address => mapping(bytes32 => uint256)) stakerQueuedWithdrawalRootsSetsIndexes {
    init_state axiom forall address staker . forall bytes32 value . stakerQueuedWithdrawalRootsSetsIndexes[staker][value] == 0;
}
// Mirrors `_stakerQueuedWithdrawalRoots` lengths
ghost mapping(address => uint256) stakerQueuedWithdrawalRootsGhostLengths {
    init_state axiom forall address staker . stakerQueuedWithdrawalRootsGhostLengths[staker] == 0;
    axiom forall address staker . stakerQueuedWithdrawalRootsGhostLengths[staker] < 0xffffffffffffffffffffffffffffffff;
}

// Mirror `pendingWithdrawals`
ghost mapping(bytes32 => bool) pendingWithdrawalsMirror {
    init_state axiom forall bytes32 root . pendingWithdrawalsMirror[root] == false;
}

// Mirrors `queuedWithdrawals[root].staker`
ghost mapping(bytes32 => address) queuedWithdrawalsStakesrGhost {
    init_state axiom forall bytes32 root . queuedWithdrawalsStakesrGhost[root] == 0;
}

// Mirrors `_operatorDetails[operator].delegationApprover`
ghost mapping(address => address) operatorDetailsDelegationApproversMirror {
    init_state axiom forall address operator . operatorDetailsDelegationApproversMirror[operator] == 0;
}

// -----------------------------------------
// Hooks for Synchronizing Ghost Mappings
// -----------------------------------------

// Sync when `_operatorDetails[operator].delegationApprover` is updated
hook Sstore DelegationManager._operatorDetails[KEY address operator].delegationApprover address newDelegationApprover (address oldDelegationApprover) {
    require oldDelegationApprover == operatorDetailsDelegationApproversMirror[operator];
    operatorDetailsDelegationApproversMirror[operator] = newDelegationApprover;
}
hook Sload address delegationApprover DelegationManager._operatorDetails[KEY address operator].delegationApprover {
    require delegationApprover == operatorDetailsDelegationApproversMirror[operator];
}

// Sync when `queuedWithdrawals[root].staker` is updated
hook Sstore DelegationManager._queuedWithdrawals[KEY bytes32 root].staker address newStaker (address oldStaker) {
    require oldStaker == queuedWithdrawalsStakesrGhost[root];
    queuedWithdrawalsStakesrGhost[root] = newStaker;
}
hook Sload address staker DelegationManager._queuedWithdrawals[KEY bytes32 root].staker {
    require staker == queuedWithdrawalsStakesrGhost[root];
}

// Sync keys when `_cumulativeScaledSharesHistory` is updated
hook Sstore DelegationManager._cumulativeScaledSharesHistory[KEY address operator][KEY address strategy]._snapshots[INDEX uint256 index]._key uint32 newKey (uint32 oldKey) {
    require oldKey == cumulativeScaledSharesHistoryKeys[operator][strategy][index];
    cumulativeScaledSharesHistoryKeys[operator][strategy][index] = newKey;
}
// Sync values when `_cumulativeScaledSharesHistory` is updated
hook Sstore DelegationManager._cumulativeScaledSharesHistory[KEY address operator][KEY address strategy]._snapshots[INDEX uint256 index]._value uint224 newValue (uint224 oldValue) {
    require oldValue == cumulativeScaledSharesHistoryValues[operator][strategy][index];
    cumulativeScaledSharesHistoryValues[operator][strategy][index] = newValue;
}
// Sync lengths when `_cumulativeScaledSharesHistory` is updated
hook Sstore DelegationManager._cumulativeScaledSharesHistory[KEY address operator][KEY address strategy]._snapshots.length uint256 newLength (uint256 oldLength) {
    require oldLength == cumulativeScaledSharesHistoryLengths[operator][strategy];
    cumulativeScaledSharesHistoryLengths[operator][strategy] = newLength;
}
// Validate snapshot length, keys and values during access
hook Sload uint256 length DelegationManager._cumulativeScaledSharesHistory[KEY address operator][KEY address strategy]._snapshots.length {
    require length == cumulativeScaledSharesHistoryLengths[operator][strategy];
}

hook Sload uint32 key DelegationManager._cumulativeScaledSharesHistory[KEY address operator][KEY address strategy]._snapshots[INDEX uint256 index]._key {
    require key == cumulativeScaledSharesHistoryKeys[operator][strategy][index];
}

hook Sload uint224 value DelegationManager._cumulativeScaledSharesHistory[KEY address operator][KEY address strategy]._snapshots[INDEX uint256 index]._value {
    require value == cumulativeScaledSharesHistoryValues[operator][strategy][index];
}

// Sync data when `operatorShares` is updated
hook Sstore DelegationManager.operatorShares[KEY address operator][KEY address strategy] uint256 newShares (uint256 oldShares) {
    require oldShares == operatorSharesGhost[operator][strategy];
    operatorSharesGhost[operator][strategy] = newShares;
}
hook Sload uint256 shares DelegationManager.operatorShares[KEY address operator][KEY address strategy] {
    require shares == operatorSharesGhost[operator][strategy];
}

// Sync when `pendingWithdrawals` is updated
hook Sstore DelegationManager.pendingWithdrawals[KEY bytes32 root] bool newPending (bool oldPending) {
    require oldPending == pendingWithdrawalsMirror[root];
    pendingWithdrawalsMirror[root] = newPending;
}
hook Sload bool pending DelegationManager.pendingWithdrawals[KEY bytes32 root] {
    require pending == pendingWithdrawalsMirror[root];
}

// Sync scalingFactor when `_depositScalingFactor` is updated
hook Sstore DelegationManager._depositScalingFactor[KEY address operator][KEY address strategy]._scalingFactor uint256 newScalingFactor (uint256 oldScalingFactor) {
    require oldScalingFactor == scalingFactorsGhost[operator][strategy];
    scalingFactorsGhost[operator][strategy] = newScalingFactor;
}
hook Sload uint256 scalingFactor DelegationManager._depositScalingFactor[KEY address operator][KEY address strategy]._scalingFactor {
    require scalingFactor == scalingFactorsGhost[operator][strategy];
}

// Sync lengths when `_stakerQueuedWithdrawalRoots` is updated
hook Sstore DelegationManager._stakerQueuedWithdrawalRoots[KEY address operator].(offset 0) uint256 newLength {
    stakerQueuedWithdrawalRootsGhostLengths[operator] = newLength;
}
// Sync values when `_stakerQueuedWithdrawalRoots` is updated
hook Sstore DelegationManager._stakerQueuedWithdrawalRoots[KEY address operator]._inner._values[INDEX uint256 index] bytes32 newValue {
    stakerQueuedWithdrawalRootsSetsValues[operator][index] = newValue;
}
// Sync indexes when `_stakerQueuedWithdrawalRoots` is updated
hook Sstore DelegationManager._stakerQueuedWithdrawalRoots[KEY address operator]._inner._indexes[KEY bytes32 value] uint256 newIndex {
    stakerQueuedWithdrawalRootsSetsIndexes[operator][value] = newIndex;
}
// Validate length, indexes and values during access
hook Sload uint256 length DelegationManager._stakerQueuedWithdrawalRoots[KEY address operator].(offset 0) {
    require stakerQueuedWithdrawalRootsGhostLengths[operator] == length;
}

hook Sload bytes32 value DelegationManager._stakerQueuedWithdrawalRoots[KEY address operator]._inner._values[INDEX uint256 index] {
    require stakerQueuedWithdrawalRootsSetsValues[operator][index] == value;
}

hook Sload uint256 index DelegationManager._stakerQueuedWithdrawalRoots[KEY address operator]._inner._indexes[KEY bytes32 value] {
    require stakerQueuedWithdrawalRootsSetsIndexes[operator][value] == index;
}

// -----------------------------------------
// Invariants for Protocol Rules
// -----------------------------------------

function requireDelegationManagerValidState() {
    requireInvariant operatorDelegatesToThemselves();
    requireInvariant stakerQueuedWithdrawalRootsInvariant();
    requireInvariant cumulativeScaledSharesHistoryKeysMonotonicInc();
    requireInvariant cumulativeScaledSharesHistoryPastLengthNullified();
    requireInvariant cumulativeScaledSharesMonotonicallyIncreasing();
    requireInvariant queuedWithdrawalsCorrect();
}

/// @title 
/* 
Ensures consistency and correctness of the `stakerQueuedWithdrawalRoots` mapping:
1. `stakerQueuedWithdrawalRootsSetsIndexes` must correctly map to `stakerQueuedWithdrawalRootsSetsValues`.
2. Non-zero indexes must lie within [1, stakerQueuedWithdrawalRootsGhostLengths[operator]].
3. Zero index indicates the value is not in the set.
*/
/// @property Staker Queued Withdrawal Roots Consistency
invariant stakerQueuedWithdrawalRootsInvariant()
    (forall address operator . forall uint256 index. 0 <= index && index < stakerQueuedWithdrawalRootsGhostLengths[operator] => 
    to_mathint(stakerQueuedWithdrawalRootsSetsIndexes[operator][stakerQueuedWithdrawalRootsSetsValues[operator][index]]) == index + 1)
    && (forall address operator . forall bytes32 value. stakerQueuedWithdrawalRootsSetsIndexes[operator][value] == 0 || 
         ((forall uint256 tmp. to_mathint(tmp) == (stakerQueuedWithdrawalRootsSetsIndexes[operator][value] - 1) => stakerQueuedWithdrawalRootsSetsValues[operator][tmp] == value)
          && stakerQueuedWithdrawalRootsSetsIndexes[operator][value] >= 1 && stakerQueuedWithdrawalRootsSetsIndexes[operator][value] <= stakerQueuedWithdrawalRootsGhostLengths[operator]));

/// @title _cumulativeScaledSharesHistory.keys are monotonic increasing
/// @property CumulativeScaledSharesHistory Keys are valid - Snapshots' timestamps are sorted in increasing order.
// _cumulativeScaledSharesHistory.key are the block number at the update time, should be monotonic increasing
invariant cumulativeScaledSharesHistoryKeysMonotonicInc()
    forall address operator . forall address strategy . forall uint256 index1 . forall uint256 index2 .
        index1 < cumulativeScaledSharesHistoryLengths[operator][strategy] && index2 <= index1 =>
        cumulativeScaledSharesHistoryKeys[operator][strategy][index2] <= cumulativeScaledSharesHistoryKeys[operator][strategy][index1];

// Ensures that entries beyond `cumulativeScaledSharesHistoryLengths` are nullified:
// 1. For each operator and strategy, all keys and values at indices >= `cumulativeScaledSharesHistoryLengths` must be zero.
invariant cumulativeScaledSharesHistoryPastLengthNullified()
    forall address operator . forall address strategy . forall uint256 index . index >= cumulativeScaledSharesHistoryLengths[operator][strategy] =>
        (cumulativeScaledSharesHistoryKeys[operator][strategy][index] == 0 && cumulativeScaledSharesHistoryValues[operator][strategy][index] == 0);

/// @title  Ensures all keys in `cumulativeScaledSharesHistoryKeys` are less than or equal to the current block number.
/// @property CumulativeScaledSharesHistory Keys are valid
invariant CumulativeScaledSharesHistoryKeysLessThanCurrentBlock(env e)
    forall address operator . forall address strategy . forall uint256 index . index < cumulativeScaledSharesHistoryLengths[operator][strategy] =>
        cumulativeScaledSharesHistoryKeys[operator][strategy][index] <= e.block.number 
        {
            preserved with (env e1) {
                require e1.block.number == e.block.number;
            }
        }

/// @title CumulativeScaledShares is monotonically increasing
/// @property CumulativeScaledShares is monotonically increasing
invariant cumulativeScaledSharesMonotonicallyIncreasing()
    forall address operator . forall address strategy . forall uint256 index1 . forall uint256 index2 . (index1 >= index2 =>
        cumulativeScaledSharesHistoryValues[operator][strategy][index1] >= cumulativeScaledSharesHistoryValues[operator][strategy][index2])
    {
        preserved with (env e) {
            requireInvariant cumulativeScaledSharesHistoryKeysMonotonicInc();
            requireInvariant cumulativeScaledSharesHistoryPastLengthNullified();
            requireInvariant CumulativeScaledSharesHistoryKeysLessThanCurrentBlock(e);
        }
    }

/// @title
/*
For a given staker, all roots existing in _stakerQueuedWithdrawalRoots also exists in storage:
_queuedWithdrawals[withdrawalRoot] returns the Withdrawal struct / staker != address(0)
pendingWithdrawals[withdrawalRoot] returns True
*/
/// @property Queued Withdrawal Registration Consistency Invariant
invariant queuedWithdrawalsCorrect()
    forall address staker . forall bytes32 root . inRootsSets(staker, root) => 
                pendingWithdrawalsMirror[root] && queuedWithdrawalsStakesrGhost[root] != 0
    {
        preserved {
            requireInvariant stakerQueuedWithdrawalRootsInvariant();
        }
    }

/// @title Verifies that operators delegates to themselves.
/// @property Operators delegates to themselves
invariant operatorDelegatesToThemselves()
    forall address operator . operatorDetailsDelegationApproversMirror[operator] != 0 => DelegationManager.delegatedTo[operator] == operator;


/// @title Operator Cannot Deregister
/// @property Operator Cannot Deregister
rule operatorCannotDeregister(method f, address account)
filtered{f -> !f.isView}
{
    env e;
    calldataarg args;

    require account != 0;

    address delegatedToPre = delegatedTo(account);

        f(e, args);

    address delegatedToPost = delegatedTo(account);    

    assert delegatedToPre == account => delegatedToPost == account;
}

/// @title depositScalingFactor is initialized as WAD and only increases on further deposits.
/// @property depositScalingFactor Monotonic Increasing
rule depositScalingFactorMonotonicInc(method f, address staker, address strategy) 
filtered{f -> !f.isView}
{
    env e;
    calldataarg args;

    uint256 depositScalingFactorPre = scalingFactorsGhost[staker][strategy];
    require depositScalingFactorPre >= WAD();

        f(e, args);

    uint256 depositScalingFactorPost = scalingFactorsGhost[staker][strategy];

    assert depositScalingFactorPost >= depositScalingFactorPre;
}

// /// @title For a given (Staker, Strategy), withdrawableShares <= depositShares.
// /// @property Withdrawable Shares Cannot Exceed Deposited Shares.
// rule withdrawableSharesGrEqDepositShares(method f, address staker, address strategy) {
//     env e;
//     calldataarg args;

//     address[] strategies = [strategy];
//     require strategy != 0;
//     require scalingFactorsGhost[staker][strategy] >=  WAD(); // safe assumption - was proved

//     uint256[] withdrawableSharesPre; 
//     uint256[] depositSharesPre;
//     uint256[] withdrawableSharesPost; 
//     uint256[] depositSharesPost;

//     withdrawableSharesPre, depositSharesPre = getWithdrawableShares(e, staker, strategies);

//     require withdrawableSharesPre[0] <= depositSharesPre[0];

//     f(e,args);

//     withdrawableSharesPost, depositSharesPost = getWithdrawableShares(e, staker, strategies);

//     assert withdrawableSharesPost[0] <= depositSharesPost[0];
// }

/// @title
/*
depositScalingFactor gets updated for a staker on every added deposit even if the staker is not delegated. Added shares deposits occur through
1. increaseDelegatedShares called by deposits through the StrategyManager/EigenPodManager
2. delegateTo
3. completeQueuedWithdrawals as shares
*/
/// @property Authorized Methods for Deposit Scaling Factor Modification Invariant
rule whoCanChangeDepositScalingFactor(method f, address staker, address strategy) 
filtered{f -> !f.isView}
{
    env e;
    calldataarg args;

    uint256 depositScalingFactorPre = scalingFactorsGhost[staker][strategy];

        f(e, args);

    uint256 depositScalingFactorPost = scalingFactorsGhost[staker][strategy];

    assert depositScalingFactorPost != depositScalingFactorPre =>
        f.selector == sig:increaseDelegatedShares(address, address, uint256, uint256).selector ||
        f.selector == sig:delegateTo(address, ISignatureUtilsMixinTypes.SignatureWithExpiry, bytes32).selector ||
        f.selector == sig:completeQueuedWithdrawals(IDelegationManagerTypes.Withdrawal[], address[][], bool[]).selector;
}
````

## File: certora/specs/core/Slasher.spec
````
methods {
	//// External Calls
	// external calls to DelegationManager 
    function _.undelegate(address) external => DISPATCHER(true);
    function _.isDelegated(address) external => DISPATCHER(true);
    function _.delegatedTo(address) external => DISPATCHER(true);
	function _.decreaseDelegatedShares(address,address,uint256) external => DISPATCHER(true);
	function _.increaseDelegatedShares(address,address,uint256) external => DISPATCHER(true);

	// external calls to Slasher
    function isFrozen(address) external returns (bool) envfree;
	function canWithdraw(address,uint32,uint256) external returns (bool);

	// external calls to StrategyManager
    function _.getDeposits(address) external => DISPATCHER(true);
    function _.slasher() external => DISPATCHER(true);
    function _.addShares(address,address,uint256) external => DISPATCHER(true);
    function _.removeShares(address,address,uint256) external => DISPATCHER(true);
    function _.withdrawSharesAsTokens(address, address, uint256, address) external => DISPATCHER(true);

	// external calls to EigenPodManager
    function _.addShares(address,uint256) external => DISPATCHER(true);
    function _.removeShares(address,uint256) external => DISPATCHER(true);
    function _.withdrawSharesAsTokens(address, address, uint256) external => DISPATCHER(true);

    // external calls to EigenPod
	function _.withdrawRestakedBeaconChainETH(address,uint256) external => DISPATCHER(true);

    // external calls to PauserRegistry
    function _.isPauser(address) external => DISPATCHER(true);
	function _.unpauser() external => DISPATCHER(true);
	
    //// Harnessed Functions
    // Harnessed calls
    // Harnessed getters
	function get_is_operator(address) external returns (bool) envfree;
	function get_is_delegated(address) external returns (bool) envfree;
	function get_list_exists(address) external returns (bool) envfree;
	function get_next_node_exists(address, uint256) external returns (bool) envfree;
	function get_next_node(address, uint256) external returns (uint256) envfree;
	function get_previous_node_exists(address, uint256) external returns (bool) envfree;
	function get_previous_node(address, uint256) external returns (uint256) envfree;
	function get_list_head(address) external returns (uint256) envfree;
	function get_latest_update_block_at_node(address, uint256) external returns (uint256) envfree;
	function get_latest_update_block_at_head(address) external returns (uint256) envfree;
	function get_linked_list_entry(address operator, uint256 node, bool direction) external returns (uint256) envfree;

	// nodeDoesExist(address operator, uint256 node) returns (bool) envfree
	//function nodeIsWellLinked(address operator, uint256 node) external returns (bool) envfree;
	
	//// Normal Functions
	function owner() external returns(address) envfree;
	function contractCanSlashOperatorUntilBlock(address, address) external returns (uint32) envfree;
	function paused(uint8) external returns (bool) envfree;
}

// uses that _HEAD = 0. Similar to StructuredLinkedList.nodeExists but slightly better defined
definition nodeDoesExist(address operator, uint256 node) returns bool =
	(get_next_node(operator, node) == 0 && get_previous_node(operator, node) == 0) 
		=> (get_next_node(operator, 0) == node && get_previous_node(operator, 0) == node);

definition nodeIsWellLinked(address operator, uint256 node) returns bool =
	// node is not linked to itself
	get_previous_node(operator, node) != node && get_next_node(operator, node) != node
	// node is the previous node's next node and the next node's previous node
	&& get_linked_list_entry(operator, get_previous_node(operator, node), true) == node
	&& get_linked_list_entry(operator, get_next_node(operator, node), false) == node;

/*
TODO: sort out if `isFrozen` can also be marked as envfree -- currently this is failing with the error
could not type expression "isFrozen(staker)", message: Could not find an overloading of method isFrozen that matches
the given arguments: address. Method is not envfree; did you forget to provide the environment as the first function argument?
rule cantBeUnfrozen(method f) {
	address staker;

	bool _frozen = isFrozen(staker);
	require _frozen;

	env e; calldataarg args;
	require e.msg.sender != owner();
	f(e,args);

	bool frozen_ = isFrozen(staker);
	assert frozen_, "frozen stakers must stay frozen";
}

/*
verifies that `contractCanSlashOperatorUntil[operator][contractAddress]` only changes when either:
the `operator` themselves calls `allowToSlash`
rule or
the `contractAddress` calls `recordLastStakeUpdateAndRevokeSlashingAbility`
*/
rule canOnlyChangecontractCanSlashOperatorUntilWithSpecificFunctions(address operator, address contractAddress) {
	uint256 valueBefore = contractCanSlashOperatorUntilBlock(operator, contractAddress);
    // perform arbitrary function call
    method f;
    env e;
    if (f.selector == sig:recordLastStakeUpdateAndRevokeSlashingAbility(address, uint32).selector) {
        address operator2;
		uint32 serveUntil;
        recordLastStakeUpdateAndRevokeSlashingAbility(e, operator2, serveUntil);
		uint256 valueAfter = contractCanSlashOperatorUntilBlock(operator, contractAddress);
        if (e.msg.sender == contractAddress && operator2 == operator/* TODO: proper check */) {
			/* TODO: proper check */
            assert (true, "failure in recordLastStakeUpdateAndRevokeSlashingAbility");
        } else {
            assert (valueBefore == valueAfter, "bad permissions on recordLastStakeUpdateAndRevokeSlashingAbility?");
        }
	} else if (f.selector == sig:optIntoSlashing(address).selector) {
		address arbitraryContract;
		optIntoSlashing(e, arbitraryContract);
		uint256 valueAfter = contractCanSlashOperatorUntilBlock(operator, contractAddress);
		// uses that the `PAUSED_OPT_INTO_SLASHING` index is 0, as an input to the `paused` function
		if (e.msg.sender == operator && arbitraryContract == contractAddress && get_is_operator(operator) && !paused(0)) {
			// uses that `MAX_CAN_SLASH_UNTIL` is equal to max_uint32
			assert(valueAfter == max_uint32, "MAX_CAN_SLASH_UNTIL different than max_uint32?");
		} else {
            assert(valueBefore == valueAfter, "bad permissions on optIntoSlashing?");
		}
	} else {
		calldataarg arg;
		f(e, arg);
		uint256 valueAfter = contractCanSlashOperatorUntilBlock(operator, contractAddress);
        assert(valueBefore == valueAfter, "bondedAfter value changed when it shouldn't have!");
	}
}

/*
checks that the entry in the linked list _whitelistedContractDetails[operator] with the **smallest** value of 'latestUpdateBlock'
is always at the 'HEAD' position in the linked list
*/
/* TODO: modify rule so it works! This seems to make too broad assumptions about initial state (i.e. isn't strict enough)
invariant listHeadHasSmallestValueOfLatestUpdateBlock(address operator, uint256 node)
	(
	get_list_exists(operator) && get_next_node_exists(operator, get_list_head(operator)) => 
		get_latest_update_block_at_head(operator) <= get_latest_update_block_at_node(operator, get_next_node(operator, get_list_head(operator)))
	)
*/

/*
TODO: rule doesn't pass. We've got separate rules for checking the LinkedList lib properties.
key properties seem to be that
1) `StructuredLinkedList._createLink` creates only two-way links
2) `StructuredLinkedList.remove` removes both links from a node, and stitches together its existing links (which it breaks)
3) `StructuredLinkedList._insert` similarly inserts a new node 'between' nodes, ensuring that the new node is well-linked
invariant consistentListStructure(address operator, uint256 node1)
	(
	// either node1 doesn't exist
	!nodeDoesExist(operator, node1)
	// or node1 is consistently two-way linked
	||
	nodeIsWellLinked(operator, node1)
	)
*/

/* TODO: assess if this rule is salvageable. seems to have poor storage assumptions due to the way 'node existence' is defined
rule cannotAddSameContractTwice(address operator, address contractAddress) {
	bool nodeExistsBefore = get_node_exists(operator, contractAddress);
	env e;
	uint32 serveUntil;
	recordFirstStakeUpdate(e, operator, serveUntil);
	if (nodeExistsBefore) {
		bool callReverted = lastReverted;
		assert (callReverted, "recordFirstStakeUpdate didn't revert!");
	} else {
		bool nodeExistsAfter = get_node_exists(operator, contractAddress);
		if (e.msg.sender == contractAddress) {
			assert(nodeExistsAfter, "node not added correctly");
		} else {
			assert(!nodeExistsAfter, "node added incorrectly");
		}
	}
}
*/
/*
## Slashing

- slashing happens if and only if a provably malicious action by an operator took place
- operator may be slashed only if allowToSlash() for that particular contract was called
- slashing cannot happen after contractCanSlashOperatorUntil[operator][contractAddress] timestamp
- contractCanSlashOperatorUntil[operator][contractAddress] changed  => allowToSlash() or recordLastStakeUpdateAndRevokeSlashingAbility() was called
- recordLastStakeUpdateAndRevokeSlashingAbility() should only be callable when contractCanSlashOperatorUntil[operator][contractAddress] == MAX_CAN_SLASH_UNTIL, and only by the contractAddress
- Any contractAddress for which contractCanSlashOperatorUntil[operator][contractAddress] > current time can call freezeOperator(operator).
- frozen operator cannot make deposits/withdrawals, cannot complete queued withdrawals
- slashing and unfreezing is performed by the StrategyManager contract owner (is it permanent or configurable?)
- frozenStatus[operator] changed => freezeOperator() or resetFrozenStatus() were called
*/
````

## File: certora/specs/core/StrategyManager.spec
````
import "../erc20cvl.spec";
import "../ptaHelpers.spec";

using StrategyBase as StrategyBase;

methods {
    //// External Calls
	// external calls to DelegationManager 
    function _.undelegate(address) external => DISPATCHER(true);
    function _.isDelegated(address) external => DISPATCHER(true);
    function _.delegatedTo(address) external => DISPATCHER(true);
	function _.decreaseDelegatedShares(address,uint256,uint64) external => DISPATCHER(true);
	function _.increaseDelegatedShares(address,address,uint256,uint256) external => DISPATCHER(true);

    // external calls from DelegationManager to ServiceManager
    function _.updateStakes(address[]) external => NONDET;

	// external calls to StrategyManager
    function _.getDeposits(address) external => DISPATCHER(true);
    function _.addShares(address,address,uint256) external => DISPATCHER(true);
    function _.withdrawSharesAsTokens(address, address, address, uint256) external => DISPATCHER(true);
    function _.underlyingToken() external => DISPATCHER(true);

	// external calls to EigenPodManager
//    function EigenPodManager.addShares(address,address,address,uint256) external => DISPATCHER(true); //summarized under StrategyManager
//    function _.withdrawSharesAsTokens(address, address,address,uint256) external => DISPATCHER(true); //summarized under StrategyManager

    // external calls to EigenPod
	function _.withdrawRestakedBeaconChainETH(address,uint256) external => DISPATCHER(true);

    // external calls to PauserRegistry
    function _.isPauser(address) external => DISPATCHER(true);
	function _.unpauser() external => DISPATCHER(true);

    // external calls to Strategy contracts
    function _.withdraw(address,address,uint256) external => DISPATCHER(true);
    function _.deposit(address,uint256) external => DISPATCHER(true);

    // external calls to ERC1271 (can import OpenZeppelin mock implementation)
    // isValidSignature(bytes32 hash, bytes memory signature) returns (bytes4 magicValue) => DISPATCHER(true)
    function _.isValidSignature(bytes32, bytes) external => DISPATCHER(true);

    function StrategyBase.sharesToUnderlyingView(uint256) external returns (uint256) envfree;

    function _.sharesToUnderlyingView(uint256 shares) external => cvlSharesToUnderlyingView(shares) expect uint256;
    //// Harnessed Functions
    // Harnessed calls
    function _.totalShares() external => DISPATCHER(true);
    // Harnessed getters
    function strategy_is_in_stakers_array(address, address) external returns (bool) envfree;
    function num_times_strategy_is_in_stakers_array(address, address) external returns (uint256) envfree;
    function totalShares(address) external returns (uint256) envfree;
    function get_stakerDepositShares(address, address) external returns (uint256) envfree;
    function sharesToUnderlyingView(address, uint256) external returns (uint256) envfree;

	//// Normal Functions
	function stakerStrategyListLength(address) external returns (uint256) envfree;
    function stakerStrategyList(address, uint256) external returns (address) envfree;
    function stakerDepositShares(address, address) external returns (uint256) envfree;
    function array_exhibits_properties(address) external returns (bool) envfree;
    function getBurnableShares(address) external returns (uint256) envfree;

    //// Normal getters
    function DEFAULT_BURN_ADDRESS() external returns (address) envfree;
}

function cvlSharesToUnderlyingView(uint256 shares) returns uint256 {
    return StrategyBase.sharesToUnderlyingView(shares);
}

invariant stakerStrategyListLengthLessThanOrEqualToMax(address staker)
	stakerStrategyListLength(staker) <= 32;

// verifies that strategies in the staker's array of strategies are not duplicated, and that the staker has nonzero shares in each one
invariant arrayExhibitsProperties(address staker)
    array_exhibits_properties(staker) == true
        {
            preserved
            {
                requireInvariant stakerStrategyListLengthLessThanOrEqualToMax(staker);
            }
        }

// if a strategy is *not* in staker's array of strategies, then the staker should have precisely zero shares in that strategy
// The proof of this invariant uses only solidity semantics hardcoded to the prover.  If the index is out of bounds,
// solidity will revert so the statement is vacuously true ([Accessing an array past its end causes a failing assertion](https://docs.soliditylang.org/en/latest/types.html#arrays))
//invariant strategiesNotInArrayHaveZeroShares(address staker, uint256 index)
//    (index >= stakerStrategyListLength(staker)) => (stakerDepositShares(staker, stakerStrategyList(staker, index)) == 0);

/**
* a staker's amount of shares in a strategy (i.e. `stakerDepositShares[staker][strategy]`) should only increase when
* `depositIntoStrategy`, `depositIntoStrategyWithSignature`,
* `withdrawSharesAsTokens`, or `addShares` is called.
*/
definition methodCanIncreaseShares(method f) returns bool =
    f.selector == sig:depositIntoStrategy(address,address,uint256).selector
    || f.selector == sig:depositIntoStrategyWithSignature(address,address,uint256,address,uint256,bytes).selector
    || f.selector == sig:withdrawSharesAsTokens(address,address,address,uint256).selector
    || f.selector == sig:addShares(address,address,uint256).selector;

/**
* a staker's amount of shares in a strategy (i.e. `stakerDepositShares[staker][strategy]`) should only decrease when
`removeDepositShares` is called
*/
definition methodCanDecreaseShares(method f) returns bool =
    f.selector == sig:removeDepositShares(address,address,uint256).selector;

rule sharesAmountsChangeOnlyWhenAppropriateFunctionsCalled(address staker, address strategy) {
    uint256 sharesBefore = stakerDepositShares(staker, strategy);
    method f;
    env e;
    calldataarg args;
    f(e,args);
    uint256 sharesAfter = stakerDepositShares(staker, strategy);
    assert(sharesAfter > sharesBefore => methodCanIncreaseShares(f));
    assert(sharesAfter < sharesBefore => methodCanDecreaseShares(f));
}

/**
* Verifies that the `totalShares` returned by a Strategy increases appropriately when new Strategy shares are issued by the StrategyManager
* contract (specifically as a result of a call to `StrategyManager.depositIntoStrategy` or `StrategyManager.depositIntoStrategyWithSignature`).
* This rule excludes the `addShares` function, since this is called only by the DelegationManager, and do not
* "create new shares", but rather represent existing shares being "moved into a withdrawal".
* for the `addShares` case, we instead check that the totalShares value does not change as a result of the call
*/
rule newSharesIncreaseTotalShares(address strategy) {
    method f;
    env e;
    uint256 stakerDepositSharesBefore = get_stakerDepositShares(e.msg.sender, strategy);
    uint256 totalSharesBefore = totalShares(strategy);
    if (
        f.selector == sig:addShares(address, address, uint256).selector
    ) {
        uint256 totalSharesAfter = totalShares(strategy);
        assert(totalSharesAfter == totalSharesBefore, "total shares changed unexpectedly");
    } else {
        uint256 stakerDepositSharesAfter = get_stakerDepositShares(e.msg.sender, strategy);
        uint256 totalSharesAfter = totalShares(strategy);
        assert(stakerDepositSharesAfter - stakerDepositSharesBefore == totalSharesAfter - totalSharesBefore, "diffs don't match");
    }
}

/**
 * Verifies that ERC20 tokens are transferred out of the account only of the msg.sender.
 * Called 'safeApprovalUse' since approval-related vulnerabilities in general allow a caller to transfer tokens out of a different account.
 * This behavior is not always unsafe, but since we don't ever use it (at present) we can do a blanket-check against it.
 */
rule safeApprovalUse(address user) {
    address token;
    uint256 tokenBalanceBefore = balanceOfCVL(token, user);
    method f;
    env e;
    // special case logic, to handle an edge case
    if (f.selector == sig:withdrawSharesAsTokens(address,address,address,uint256).selector) {
        address recipient;
        address strategy;
        uint256 shares;
        // filter out case where the 'user' is the strategy itself
        require(user != strategy);
        uint256 sharesInTokens = sharesToUnderlyingView(strategy, shares);
        require tokenBalanceBefore + sharesInTokens <= max_uint256; // Require no overflows on balances as valid env assumption
        withdrawSharesAsTokens(e, recipient, strategy, token, shares);
    } else if (f.selector == sig:burnShares(address).selector) {
        address strategy;
        require user != strategy;
        // Using simple overflow check does not work since we have token (the underlying) and shares which might be worth more than one token
        uint256 burnableShares = getBurnableShares(strategy);
        uint256 burnableInTokens = sharesToUnderlyingView(strategy, burnableShares);
        require burnableInTokens + tokenBalanceBefore <= max_uint256; // Require no overflows on balances as valid env assumption
        burnShares(e, strategy); // Anybody can burn strategy's slashed shares
    } else if (f.selector == sig:depositIntoStrategy(address,address,uint256).selector) {
        address strategy;
        uint256 amount;
        require balanceOfCVL(token, strategy) + amount <= max_uint256; // Require no overflows on balances as valid env assumption
        depositIntoStrategy(e, strategy, token, amount);
    } else if (f.selector == sig:depositIntoStrategyWithSignature(address,address,uint256,address,uint256,bytes).selector) {
        address strategy;
        uint256 amount;
        address staker;
        uint256 expiry;
        bytes signature;
        require balanceOfCVL(token, strategy) + amount <= max_uint256; // Require no overflows on balances as valid env assumption
        depositIntoStrategyWithSignature(e, strategy, token, amount, staker, expiry, signature);
    } else if (f.selector == sig:clearBurnOrRedistributableSharesByStrategy(StrategyManager.OperatorSet,uint256,address).selector) {
        StrategyManager.OperatorSet operatorSet;
        uint256 slashId;
        address strategy;

        // User is not the target strategy.
        // (This withrdraws from that strategy)
        require user != strategy;

        clearBurnOrRedistributableSharesByStrategy(e, operatorSet, slashId, strategy);

    } else if (f.selector == sig:clearBurnOrRedistributableShares(StrategyManager.OperatorSet,uint256).selector) {
        StrategyManager.OperatorSet operatorSet;
        uint256 slashId;

        // User is not one of the strategies.
        // (This withrdraws from zero or more strategies)
        require user != StrategyBase;
        require user != currentContract;

        clearBurnOrRedistributableShares(e, operatorSet, slashId);
    // otherwise just perform an arbitrary function call 
    } else {
        calldataarg args;
        f(e,args);
    }
    uint256 tokenBalanceAfter = balanceOfCVL(token, user);
    if (tokenBalanceAfter < tokenBalanceBefore) {
        assert(e.msg.sender == user, "unsafeApprovalUse?");
    }
    assert true;
}
````

## File: certora/specs/libraries/BN254-nondet.spec
````
methods {
    // BN254 implements elliptic curve operations, let's NONDET all of them
    function BN254.plus(BN254.G1Point memory a, BN254.G1Point memory b) internal returns (BN254.G1Point memory) => CVL_randomPoint();
    function BN254.pairing(BN254.G1Point memory a1, BN254.G2Point memory a2, BN254.G1Point memory b1, BN254.G2Point memory b2) internal returns (bool) => NONDET;
    function BN254.safePairing(BN254.G1Point memory a, BN254.G2Point memory b, BN254.G1Point memory c, BN254.G2Point memory d, uint256) internal returns (bool,bool) => NONDET;
    function BN254.scalar_mul(BN254.G1Point memory p, uint256 s) internal returns (BN254.G1Point memory) => CVL_randomPoint();

    function BN254.expMod(uint256 b, uint256 e, uint256 m) internal returns (uint256) => CVL_expMod(b,e,m);
    function BN254.hashToG1(bytes32 _x) internal returns (BN254.G1Point memory) => CVL_randomPoint();
}

function CVL_plus(BN254.G1Point a, BN254.G1Point b) returns BN254.G1Point {
    BN254.G1Point res;
    return res;
}

function CVL_randomPoint() returns BN254.G1Point {
    BN254.G1Point res;
    return res;
}

function CVL_expMod(uint256 b, uint256 e, uint256 m) returns uint256 {
    return require_uint256((b^e) % m);
}
````

## File: certora/specs/libraries/SlashingLib.spec
````
import "../optimizations.spec";

methods {
    function SlashingLib.mulWad(uint256 x, uint256 y) internal returns (uint256) => cvlMulDiv(x, y, WAD());
    function SlashingLib.divWad(uint256 x, uint256 y) internal returns (uint256) => cvlMulDiv(x, WAD(), y);
    function SlashingLib.mulWadRoundUp(uint256 x, uint256 y) internal returns (uint256) => cvlMulDivDirectional(x, y, WAD(), Math.Rounding.Up);
}
````

## File: certora/specs/libraries/StructuredLinkedList.spec
````
methods {
    function listExists() external returns (bool) envfree;
    function nodeExists(uint256) external returns (bool) envfree;
    function sizeOf() external returns (uint256) envfree;
    function getHead() external returns (uint256) envfree;
    function getNode(uint256) external returns (bool, uint256, uint256) envfree;
    function getAdjacent(uint256,bool) external returns (bool, uint256) envfree;
    function getAdjacentStrict(uint256,bool) external returns (uint256) envfree;
    function getNextNode(uint256) external returns (bool, uint256) envfree;
    function getPreviousNode(uint256) external returns (bool, uint256) envfree;
    function insert(uint256,uint256,bool) external envfree;
    function remove(uint256) external envfree;
}

ghost mapping(uint256 => bool) connectsToHead {
    init_state axiom connectsToHead[0] == true;
}

hook Sstore currentContract.listStorage.list[KEY uint256 node][KEY bool direction] uint256 link (uint256 old_link) {
    connectsToHead[link] = connectsToHead[node];
    connectsToHead[old_link] = old_link == 0;
}

definition isNodeDoubleLinked(uint256 node) returns bool =
    node == getAdjacentStrict(getAdjacentStrict(node, true), false)
    && node == getAdjacentStrict(getAdjacentStrict(node, false), true);

definition doesNodePointToSelf(uint256 node) returns bool =
    getAdjacentStrict(node, true) == node || getAdjacentStrict(node, false) == node;

// if node x points at node y, node y must point back at node x
// ==?
// only two way links exist.
invariant alwaysDoubleLinked(uint256 node)
    nodeExists(node) => isNodeDoubleLinked(node)
    {
        preserved {
            requireInvariant noSelfPoint(node);
            requireInvariant alwaysDoubleLinked(0);
        }
        preserved insert(uint256 _node, uint256 _new, bool _dir) {
            requireInvariant alwaysDoubleLinked(_node);
        }
        preserved remove(uint256 _node) {
            requireInvariant alwaysDoubleLinked(_node);
            requireInvariant alwaysDoubleLinked(0);           
        }
    }

/// Nonhead node can't point to itself.
/// @title noSelfPoint
invariant noSelfPoint(uint256 node)
    node != 0 => !doesNodePointToSelf(node)
    {
        preserved remove(uint256 _node) {
            requireInvariant alwaysDoubleLinked(_node);
            requireInvariant zeroRequiredInCircle(node, _node);
        }
    }

/// A node can not point to 0 if 0 does not point back.
/// @title noDeadEnds
invariant noDeadEnds(uint256 node, uint256 lost, bool dir)
    getAdjacentStrict(node, dir) == 0 
        => getAdjacentStrict(0, !dir) == node 
        || (getAdjacentStrict(lost, dir) != node && getAdjacentStrict(lost, !dir) != node)
    {
        preserved insert(uint256 _node, uint256 _new, bool _dir) {
            requireInvariant alwaysDoubleLinked(_node);
        }
        preserved remove(uint256 _node) {
            requireInvariant alwaysDoubleLinked(_node);
            requireInvariant alwaysDoubleLinked(node);
            requireInvariant alwaysDoubleLinked(0);
        }
    }

/// 0 must point to itself in both directions or not at all.
invariant allOrNothing()
    getAdjacentStrict(0, true) == 0 <=> getAdjacentStrict(0, false) == 0
    {
        preserved insert(uint256 _node, uint256 _new, bool _dir) {
            requireInvariant alwaysDoubleLinked(_node);
        }
        preserved remove(uint256 _node) {
            requireInvariant alwaysDoubleLinked(_node);
        }
    }

/// No loop without o
invariant zeroRequiredInCircle(uint256 node1, uint256 node2)
    node1 != node2 && getAdjacentStrict(node1, true) == node2
        && getAdjacentStrict(node1, false) == node2
        && getAdjacentStrict(node2, true) == node1
        && getAdjacentStrict(node2, false) == node1
        => node1 == 0 || node2 == 0
    {
        preserved remove(uint256 _node) {
            require !((getAdjacentStrict(_node, true) == node1 
                || getAdjacentStrict(_node, false) == node1
                && getAdjacentStrict(_node, true) == node2 ||
                getAdjacentStrict(_node, false) == node2)
                && ((getAdjacentStrict(node1, true) == node2 
                || getAdjacentStrict(node1, false) == node2)
                && (getAdjacentStrict(node2, true) == node1 
                || getAdjacentStrict(node2, false) == node1)));
        }
    }

/* commented out while failing (can reintroduce in a PR)
// in progress
invariant headInList(uint256 node)
    nodeExists(node) => connectsToHead[node]
    {
        preserved insert(uint256 _node, uint256 _new, bool _dir) {
            requireInvariant noSelfPoint(_node);
            requireInvariant alwaysDoubleLinked(_node);
            requireInvariant noSelfPoint(node);
            requireInvariant alwaysDoubleLinked(node);
        }
        preserved remove(uint256 _node) {
            requireInvariant noSelfPoint(_node);
            requireInvariant alwaysDoubleLinked(_node);
            requireInvariant noSelfPoint(node);
            requireInvariant alwaysDoubleLinked(node);
        }
    }



// size == # of nodes with nonzero next == # of nodes with nonzero prev
*/


/*
1) `StructuredLinkedList._createLink` creates only two-way links
2) `StructuredLinkedList.remove` removes both links from a node, and stitches together its existing links (which it breaks)
3) `StructuredLinkedList._insert` similarly inserts a new node 'between' nodes, ensuring that the new node is well-linked
*/
/*
// DEFINITIONS
definition isInDLL(address _id) returns bool =
    getValueOf(_id) != 0;
definition isLinked(address _id) returns bool =
    getPrev(_id) != 0 || getNext(_id) != 0;
definition isEmpty(address _id) returns bool =
    ! isInDLL(_id) && ! isLinked(_id);
definition isTwoWayLinked(address first, address second) returns bool =
    first != 0 && second != 0 => (getNext(first) == second <=> getPrev(second) == first);
definition isHeadWellFormed() returns bool =
    getPrev(getHead()) == 0 && (getHead() != 0 => isInDLL(getHead()));
definition isTailWellFormed() returns bool =
    getNext(getTail()) == 0 && (getTail() != 0 => isInDLL(getTail()));
definition hasNoPrevIsHead(address addr) returns bool =
    isInDLL(addr) && getPrev(addr) == 0 => addr == getHead();
definition hasNoNextIsTail(address addr) returns bool =
    isInDLL(addr) && getNext(addr) == 0 => addr == getTail();
function safeAssumptions() { 
    requireInvariant zeroEmpty();
    requireInvariant headWellFormed();
    requireInvariant tailWellFormed();
    requireInvariant tipsZero();
}
// INVARIANTS & RULES
// Notice that some invariants have the preservation proof separated for some public functions,
// or even all of the public functions (in that last case they are still relevant for proving 
// the property at initial state).

invariant zeroEmpty()
    isEmpty(0)
    filtered { f -> f.selector != sig:insertSorted(address, uint256, uint256).selector }

rule zeroEmptyPreservedInsertSorted(address _id, uint256 _value) {
    address prev;

    require isEmpty(0);

    requireInvariant twoWayLinked(prev, getNext(prev));
    requireInvariant noNextIsTail(prev);
    requireInvariant tipsZero();

    insertSorted(_id, _value, maxIterations());

    require prev == getInsertedAfter();

    assert isEmpty(0);
}

invariant headWellFormed()
    isHeadWellFormed()
    { preserved remove(address _id) {
        requireInvariant zeroEmpty();
        requireInvariant twoWayLinked(getPrev(_id), _id);
        requireInvariant twoWayLinked(_id, getNext(_id));
        requireInvariant linkedIsInDLL(getNext(_id));
      }
    }

invariant tailWellFormed()
    isTailWellFormed()
    filtered { f -> f.selector != sig:insertSorted(address, uint256, uint256).selector }
    { preserved remove(address _id) {
        requireInvariant zeroEmpty();
        requireInvariant twoWayLinked(getPrev(_id), _id);
        requireInvariant twoWayLinked(_id, getNext(_id));
        requireInvariant linkedIsInDLL(getPrev(_id));
      }
    }

rule tailWellFormedPreservedInsertSorted(address _id, uint256 _value) {
    address next; address prev;

    require isTailWellFormed();

    requireInvariant zeroEmpty();
    requireInvariant twoWayLinked(getPrev(next), next);
    requireInvariant twoWayLinked(prev, getNext(prev));

    insertSorted(_id, _value, maxIterations());
    
    require prev == getInsertedAfter();
    require next == getInsertedBefore();
    
    assert isTailWellFormed();
}

invariant tipsZero()
    getTail() == 0 <=> getHead() == 0
    { preserved remove(address _id) {
        requireInvariant zeroEmpty();
        requireInvariant noNextIsTail(_id);
        requireInvariant noPrevIsHead(_id);
      }
    }

invariant noPrevIsHead(address addr)
    hasNoPrevIsHead(addr)
    filtered { f -> f.selector != sig:insertSorted(address, uint256, uint256).selector }
    { preserved remove(address _id) {
        safeAssumptions();
        requireInvariant twoWayLinked(_id, getNext(_id));
        requireInvariant twoWayLinked(getPrev(_id), _id);
        requireInvariant noPrevIsHead(_id);
      }
    }

rule noPrevIsHeadPreservedInsertSorted(address _id, uint256 _value) {
    address addr; address next; address prev;

    require hasNoPrevIsHead(addr);

    safeAssumptions();
    requireInvariant twoWayLinked(getPrev(next), next);
    requireInvariant twoWayLinked(prev, getNext(prev));
    requireInvariant noNextIsTail(prev);

    insertSorted(_id, _value, maxIterations());
    
    require prev == getInsertedAfter();
    require next == getInsertedBefore();
    
    assert hasNoPrevIsHead(addr);
}

invariant noNextIsTail(address addr)
    hasNoNextIsTail(addr)
    filtered { f -> f.selector != sig:insertSorted(address, uint256, uint256).selector }
    { preserved remove(address _id) {
        safeAssumptions();
        requireInvariant twoWayLinked(_id, getNext(_id));
        requireInvariant twoWayLinked(getPrev(_id), _id);
        requireInvariant noNextIsTail(_id);
      }
    }

rule noNextisTailPreservedInsertSorted(address _id, uint256 _value) {
    address addr; address next; address prev;

    require hasNoNextIsTail(addr);

    safeAssumptions();
    requireInvariant twoWayLinked(getPrev(next), next);
    requireInvariant twoWayLinked(prev, getNext(prev));
    requireInvariant forwardLinked(getTail());

    insertSorted(_id, _value, maxIterations());
    
    require prev == getInsertedAfter();
    require next == getInsertedBefore();
    
    assert hasNoNextIsTail(addr);
}

invariant linkedIsInDLL(address addr)
    isLinked(addr) => isInDLL(addr)
    filtered { f -> f.selector != sig:insertSorted(address, uint256, uint256).selector }
    { preserved remove(address _id) {
        safeAssumptions();
        requireInvariant twoWayLinked(_id, getNext(_id));
        requireInvariant twoWayLinked(getPrev(_id), _id);
      }
    }

rule linkedIsInDllPreservedInsertSorted(address _id, uint256 _value) {
    address addr; address next; address prev;

    require isLinked(addr) => isInDLL(addr);
    require isLinked(getPrev(next)) => isInDLL(getPrev(next));

    safeAssumptions();
    requireInvariant twoWayLinked(getPrev(next), next);
    requireInvariant noPrevIsHead(next);
    requireInvariant twoWayLinked(prev, getNext(prev));
    requireInvariant noNextIsTail(prev);

    insertSorted(_id, _value, maxIterations());

    require prev == getInsertedAfter();
    require next == getInsertedBefore();

    assert isLinked(addr) => isInDLL(addr);
}

invariant twoWayLinked(address first, address second)
    isTwoWayLinked(first, second)
    filtered { f -> f.selector != sig:insertSorted(address, uint256, uint256).selector }
    { preserved remove(address _id) {
        safeAssumptions();
        requireInvariant twoWayLinked(getPrev(_id), _id);
        requireInvariant twoWayLinked(_id, getNext(_id));
      }
    }

rule twoWayLinkedPreservedInsertSorted(address _id, uint256 _value) {
    address first; address second; address next;

    require isTwoWayLinked(first, second);
    require isTwoWayLinked(getPrev(next), next);

    safeAssumptions();
    requireInvariant linkedIsInDLL(_id);

    insertSorted(_id, _value, maxIterations());

    require next == getInsertedBefore();

    assert isTwoWayLinked(first, second);
}

invariant forwardLinked(address addr)
    isInDLL(addr) => isForwardLinkedBetween(getHead(), addr)
    filtered { f -> f.selector != sig:remove(address).selector &&
                    f.selector != sig:insertSorted(address, uint256, uint256).selector }

rule forwardLinkedPreservedInsertSorted(address _id, uint256 _value) {
    address addr; address prev;

    require isInDLL(addr) => isForwardLinkedBetween(getHead(), addr);
    require isInDLL(getTail()) => isForwardLinkedBetween(getHead(), getTail());

    safeAssumptions();
    requireInvariant linkedIsInDLL(_id);
    requireInvariant twoWayLinked(prev, getNext(prev));
    requireInvariant noNextIsTail(prev);

    insertSorted(_id, _value, maxIterations());

    require prev == getInsertedAfter();

    assert isInDLL(addr) => isForwardLinkedBetween(getHead(), addr);
}

rule forwardLinkedPreservedRemove(address _id) {
    address addr; address prev;

    require prev == getPreceding(_id);

    require isInDLL(addr) => isForwardLinkedBetween(getHead(), addr);

    safeAssumptions();
    requireInvariant noPrevIsHead(_id);
    requireInvariant twoWayLinked(getPrev(_id), _id);
    requireInvariant twoWayLinked(prev, getNext(prev));
    requireInvariant noNextIsTail(_id);

    remove(_id);

    assert isInDLL(addr) => isForwardLinkedBetween(getHead(), addr);
}

rule removeRemoves(address _id) {
    safeAssumptions();

    remove(_id);

    assert !isInDLL(_id);
}

rule insertSortedInserts(address _id, uint256 _value) {
    safeAssumptions();

    insertSorted(_id, _value, maxIterations());

    assert isInDLL(_id);
}

rule insertSortedDecreasingOrder(address _id, uint256 _value) {
    address prev;

    uint256 maxIter = maxIterations();

    safeAssumptions();
    requireInvariant twoWayLinked(prev, getNext(prev));
    requireInvariant linkedIsInDLL(_id);

    insertSorted(_id, _value, maxIter);

    require prev == getInsertedAfter();

    uint256 positionInDLL = lenUpTo(_id);

    assert positionInDLL > maxIter => greaterThanUpTo(_value, 0, maxIter) && _id == getTail();
    assert positionInDLL <= maxIter => greaterThanUpTo(_value, _id, getLength()) && _value > getValueOf(getNext(_id));
}

// DERIVED RESULTS

// result: isForwardLinkedBetween(getHead(), getTail())
// explanation: if getTail() == 0, then from tipsZero() we know that getHead() == 0 so the result follows
// otherwise, from tailWellFormed(), we know that isInDLL(getTail()) so the result follows from forwardLinked(getTail()).

// result: forall addr. isForwardLinkedBetween(addr, getTail())
// explanation: it can be obtained from the previous result and forwardLinked.
// Going from head to tail should lead to addr in between (otherwise addr is never reached because there is nothing after the tail).

// result: "BackwardLinked" dual results
// explanation: it can be obtained from ForwardLinked and twoWayLinked.

// result: there is only one list
// explanation: it comes from the fact that every non zero address that is in the DLL is linked to getHead().

// result: there are no cycles that do not contain the 0 address
// explanation: let N be a node in a cycle. Since there is a link from getHead() to N, it means that getHead()
// is part of the cycle. This is absurd because we know from headWellFormed() that the previous element of
// getHead() is the 0 address.
````

## File: certora/specs/multichain/BN254CertificateVerifier.spec
````
import "../libraries/BN254-nondet.spec";
using OperatorSetHelper as OperatorSetHelper;

use builtin rule sanity filtered { f -> f.contract == currentContract }

methods{
    function OperatorSetHelper.getOperatorSetKey(BN254CertificateVerifier.OperatorSet os) external returns (bytes32) envfree;
}

/*
 * msg.sender != address(operatorTableUpdater) => revert
 * referenceTimestamp == 0 => revert
 *
 * What it means: Only the designated operatorTableUpdater address can call this function, all other callers must be rejected
 *
 * Why it should hold: The contract has a specific modifier 'onlyTableUpdater' and the function is critical for updating operator information. Unauthorized access could corrupt the operator registry
 *
 * Possible consequences: Unauthorized operator table manipulation, state corruption, denial of service by malicious actors updating operator information
 */
rule updateOperatorTable_revert_conditions(env e) {
    BN254CertificateVerifier.OperatorSet operatorSet;
    uint32 referenceTimestamp;
    IOperatorTableCalculatorTypes.BN254OperatorSetInfo operatorSetInfo;
    ICrossChainRegistryTypes.OperatorSetConfig operatorSetConfig;

    bool zeroRefTS = referenceTimestamp == 0;
    // call function under test
    updateOperatorTable@withrevert(e, operatorSet, referenceTimestamp, operatorSetInfo, operatorSetConfig);
    bool updateOperatorTable_reverted = lastReverted;

    // verify integrity
    assert ((e.msg.sender != currentContract.operatorTableUpdater || zeroRefTS) => updateOperatorTable_reverted), "msg.sender != address(operatorTableUpdater) => revert";
}




rule updateOperatorTable_updates_latest_for_set_and_frames(env e) {
    BN254CertificateVerifier.OperatorSet os;
    uint32 ts;
    IOperatorTableCalculatorTypes.BN254OperatorSetInfo info;
    ICrossChainRegistryTypes.OperatorSetConfig cfg;

    // keys
    bytes32 k  = OperatorSetHelper.getOperatorSetKey(os);
    BN254CertificateVerifier.OperatorSet otherOs;
    bytes32 ok = OperatorSetHelper.getOperatorSetKey(otherOs);

    // snapshots
    uint32 latest_before   = currentContract._latestReferenceTimestamps[k];
    uint32 other_before    = currentContract._latestReferenceTimestamps[ok];

    // require minimal success preconditions you know the code enforces:
    require e.msg.sender == currentContract.operatorTableUpdater;
    require ts != 0;
    // (If the implementation also checks ts <= block.timestamp, keep it below instead.)

    updateOperatorTable(e, os, ts, info, cfg);

    // effect on this set
    assert currentContract._latestReferenceTimestamps[k] == ts;
    assert currentContract._latestReferenceTimestamps[k] >  latest_before;

    // frame: unrelated sets unchanged
    assert (ok == k) || (currentContract._latestReferenceTimestamps[ok] == other_before);
}




/*
 * !operatorTableUpdater.isRootValidByTimestamp(cert.referenceTimestamp) => revert
 *
 * What it means: The function must revert if the operator table updater indicates that the root corresponding to the reference timestamp is disabled or invalid
 *
 * Why it should hold: The contract explicitly checks this condition in _validateCertificateTimestamp() with 'require(operatorTableUpdater.isRootValidByTimestamp(referenceTimestamp), RootDisabled())'. This ensures certificates are only verified against valid, non-disabled operator sets.
 *
 * Possible consequences: Accepting certificates based on outdated or compromised operator sets, potential for replay attacks using disabled roots
 */
rule verifyCertificate_disabled_root(env e) {
    BN254CertificateVerifier.OperatorSet operatorSet;
    IBN254CertificateVerifierTypes.BN254Certificate cert;
    uint256[] signedStakes;

    // call function under test
    verifyCertificate@withrevert(e, operatorSet, cert);
    bool verifyCertificate_reverted = lastReverted;

    // verify integrity
    assert (!currentContract.operatorTableUpdater.isRootValidByTimestamp(e, cert.referenceTimestamp) => verifyCertificate_reverted), "!operatorTableUpdater.isRootValidByTimestamp(cert.referenceTimestamp) => revert";
}

/*
 * !operatorTableUpdater.isRootValidByTimestamp(cert.referenceTimestamp) => revert
 * * totalStakeNominalThresholds.length > 100 => revert
 * What it means: The function must revert when the operator table updater indicates that the root for the given reference timestamp is disabled or invalid
 *
 * Why it should hold: This is a critical security check that ensures only valid, non-revoked operator sets can be used for verification. Disabled roots indicate compromised or outdated operator information
 *
 * Possible consequences: Security bypass allowing verification against compromised or revoked operator sets, potential fund loss or unauthorized operations
 */
rule verifyCertificateNominal_revert_conditions(env e) {
    BN254CertificateVerifier.OperatorSet operatorSet;
    IBN254CertificateVerifierTypes.BN254Certificate cert;
    uint256[] totalStakeNominalThresholds;
    bool result;

    bool disabledRoot = !currentContract.operatorTableUpdater.isRootValidByTimestamp(e, cert.referenceTimestamp);
    bool maxThresholdPassed = totalStakeNominalThresholds.length > 100;

    // call function under test
    verifyCertificateNominal@withrevert(e, operatorSet, cert, totalStakeNominalThresholds);
    bool verifyCertificateNominal_reverted = lastReverted;

    // verify integrity
    assert ((disabledRoot || maxThresholdPassed) => verifyCertificateNominal_reverted), "!operatorTableUpdater.isRootValidByTimestamp(cert.referenceTimestamp) => revert";
}
````

## File: certora/specs/multichain/CrossChainRegistry.spec
````
import "./EnumerableSet.spec";
using OperatorSetHelper as OperatorSetHelper;

use builtin rule sanity filtered { f -> f.contract == currentContract }

use invariant _activeGenerationReservationsInvariant;

methods {
    function _.calculateOperatorTableBytes(CrossChainRegistry.OperatorSet) external => DISPATCHER(true);
    function OperatorSetHelper.getOperatorSetKey(CrossChainRegistry.OperatorSet os) external returns (bytes32) envfree;
}

// // There must not be two active reservations for the same OperatorSet.key()
invariant activeGenerationReservationUniqueness(bytes32 key1, bytes32 key2, uint256 i1, uint256 i2)
    (key1 != key2 && ghostIndexes_activeGenerationReservations[key1] != 0 && ghostIndexes_activeGenerationReservations[key2] != 0) => 
        (ghostIndexes_activeGenerationReservations[key1] != ghostIndexes_activeGenerationReservations[key2] 
        && ghostValues_activeGenerationReservations[ghostIndexes_activeGenerationReservations[key1]-1] != ghostValues_activeGenerationReservations[ghostIndexes_activeGenerationReservations[key2]-1]) 
    {
        preserved{
            requireInvariant _activeGenerationReservationsInvariant();
        }
    }

// valid state changes
rule onlyValidSenderCanChangeState(env e, method f, calldataarg args)
filtered{f -> !f.isView} {
    CrossChainRegistry.OperatorSet os;
    bytes32 key = OperatorSetHelper.getOperatorSetKey(os);
    requireInvariant _activeGenerationReservationsInvariant();
    uint256 i;
    
    mathint _activeGenerationReservationsIndexPre = ghostIndexes_activeGenerationReservations[key];
    bytes32 _activeGenerationReservationsValuePre = ghostValues_activeGenerationReservations[i];
    uint256 _activeGenerationReservationsLengthPre = ghostLength_activeGenerationReservations;

    address configPreOwner = currentContract._operatorSetConfigs[key].owner;
    uint32 configPreMaxStalenessPeriod = currentContract._operatorSetConfigs[key].maxStalenessPeriod;
    address tableCalculatorPre = currentContract._operatorTableCalculators[key];

    bool canCall = canCall(e, os.avs, e.msg.sender, f.selector);

    if(f.selector ==  sig:createGenerationReservation(CrossChainRegistry.OperatorSet, address, ICrossChainRegistryTypes.OperatorSetConfig).selector){
        ICrossChainRegistryTypes.OperatorSetConfig config;
        createGenerationReservation(e, os, tableCalculatorPre, config);
    } else if (f.selector == sig:removeGenerationReservation(CrossChainRegistry.OperatorSet).selector){
        removeGenerationReservation(e, os);
    } else {
        f(e, args);
    }
    
    // no state change in _activeGenerationReservations
    assert ghostValues_activeGenerationReservations[i] == _activeGenerationReservationsValuePre || canCall;
    assert ghostIndexes_activeGenerationReservations[key] == _activeGenerationReservationsIndexPre || canCall;
    assert ghostLength_activeGenerationReservations == _activeGenerationReservationsLengthPre || canCall;

    // no state change in _operatorSetConfigs
    assert configPreOwner == currentContract._operatorSetConfigs[key].owner || canCall;
    assert configPreMaxStalenessPeriod == currentContract._operatorSetConfigs[key].maxStalenessPeriod || canCall;

    // no state change in _operatorTableCalculators
    assert tableCalculatorPre == currentContract._operatorTableCalculators[key] || canCall;

}

/*
 * _paused@before == _paused@after
 *
 * What it means: The function must not modify the pause state stored in the _paused state variable
 *
 * Why it should hold: createGenerationReservation is not a pause management function and should only affect operator set reservations. Only authorized pausers should be able to modify the pause state
 *
 * Possible consequences: If this property is violated, an attacker could unpause the contract or change pause states through a function that should only create reservations, bypassing pause controls
 */
rule no_illegal_change_to_paused(env e, method f, calldataarg args) filtered{f -> !f.isView}{

    // assign all the 'before' variables
    uint256 _paused_before = currentContract._paused;

    // call function under test
    f(e, args);

    // assign all the 'after' variables
    uint256 _paused_after = currentContract._paused;

    // verify integrity
    assert (_paused_before == _paused_after || 
        f.selector == sig:initialize(address, uint32, uint256).selector ||
        f.selector == sig:pauseAll().selector ||
        f.selector == sig:pause(uint256).selector ||
        f.selector == sig:unpause(uint256).selector
    ), "_paused@before == _paused@after";
}

/*
 * _initialized@after == _initialized@before
 *
 * What it means: The function must not change the initialization state flag
 *
 * Why it should hold: Only initialization functions should modify this flag, not chain whitelist operations
 *
 * Possible consequences: Reinitialization vulnerabilities, bypassing initialization checks, state corruption
 */
rule no_illegal_change_initialized(env e, method f, calldataarg args) {
    // assign all the 'before' variables
    uint8 _initialized_before = currentContract._initialized;

    // call function under test
    f(e, args);

    // assign all the 'after' variables
    uint8 _initialized_after = currentContract._initialized;

    // verify integrity
    assert (_initialized_after == _initialized_before || 
        f.selector == sig:initialize(address, uint32, uint256).selector
    ), "_initialized@after == _initialized@before";
}

/*
 * _initialized@after == _initialized@before
 *
 * What it means: The function must not change the initialization state flag
 *
 * Why it should hold: Only initialization functions should modify this flag, not chain whitelist operations
 *
 * Possible consequences: Reinitialization vulnerabilities, bypassing initialization checks, state corruption
 */
rule no_illegal_change_initializing(env e, method f, calldataarg args) {
    // assign all the 'before' variables
    bool _initializing_before = currentContract._initializing;

    // call function under test
    f(e, args);

    // assign all the 'after' variables
    bool _initializing_after = currentContract._initializing;

    // verify integrity
    assert (_initializing_after == _initializing_before), "_initialized@after == _initialized@before";
}

/*
 * _owner@after == _owner@before
 *
 * What it means: The contract owner address stored in _owner should remain the same before and after the function execution
 *
 * Why it should hold: The setOperatorSetConfig function is not designed to change ownership and has no ownership transfer logic. Any change to the owner during this function would indicate unauthorized privilege escalation or a serious bug
 *
 * Possible consequences: If ownership changes unexpectedly, it could lead to complete loss of administrative control, unauthorized access to owner-only functions, or transfer of control to malicious actors
 */
rule no_illegal_change_to_owner(env e, method f, calldataarg args) {
    // assign all the 'before' variables
    address _owner_before = currentContract._owner;

    // call function under test
    f(e, args);

    // assign all the 'after' variables
    address _owner_after = currentContract._owner;

    // verify integrity
    assert (_owner_after == _owner_before || 
        f.selector == sig:initialize(address, uint32, uint256).selector ||
        f.selector == sig:renounceOwnership().selector ||
        f.selector == sig:transferOwnership(address).selector
    ), "_owner@after == _owner@before";
}

/*
 * _initialized != 0 => revert
 *
 * What it means: The initialize function must revert if the contract has already been initialized (when _initialized is not 0)
 *
 * Why it should hold: This is a critical security property of the Initializable pattern from OpenZeppelin. The initialize function should only be callable once to prevent reinitialization attacks that could reset critical state variables like ownership
 *
 * Possible consequences: State corruption, ownership takeover, complete contract compromise, fund loss through unauthorized access control changes
 */
rule initialize_already_initialized_reverts(env e) {
    address initialOwner;
    uint32 initialTableUpdateCadence;
    uint256 initialPausedStatus;

    // assign all the 'before' variables
    uint8 _initialized_before = currentContract._initialized;

    // call function under test
    initialize@withrevert(e, initialOwner, initialTableUpdateCadence, initialPausedStatus);
    bool initialize_reverted = lastReverted;

    // verify integrity
    assert ((_initialized_before != 0) => initialize_reverted), "_initialized != 0 => revert";
}

/*
 * initialOwner != address(0) => _owner@after == initialOwner
 * _paused@after == initialPausedStatus
 * _initialized@after == 1
 * _initialized@before == 0 
 *
 * What it means: When a valid (non-zero) initialOwner is provided, the _owner storage variable must be set to that address after initialization. The _paused storage variable must be set to the initialPausedStatus parameter value after initialization. The _initialized flag must be set to 1 to mark the contract as initialized
 *
 * Why it should hold: This ensures proper ownership transfer during initialization. The owner has critical privileges in this contract including managing chain whitelists, so correct ownership assignment is essential for security
 *
 * Possible consequences: Loss of administrative control, inability to manage protocol parameters, potential for contract to become unmanageable
 */
rule initialize_integrity(env e) {
    address initialOwner;
    uint32 initialTableUpdateCadence;
    uint256 initialPausedStatus;

    // assign all the 'before' variables
    uint8 initializedBefore = currentContract._initialized;

    // call function under test
    initialize(e, initialOwner, initialTableUpdateCadence, initialPausedStatus);

    // assign all the 'after' variables
    address ownerAfter = currentContract._owner;
    uint256 pausedAfter = currentContract._paused;
    uint32 tableUpdateCadenceAfter = currentContract._tableUpdateCadence;

    // verify integrity
    assert (initialOwner != 0 => ownerAfter == initialOwner), "initialOwner != address(0) => _owner@after == initialOwner";
    assert (pausedAfter == initialPausedStatus), "_paused@after == initialPausedStatus";
    assert (initializedBefore == 0 && currentContract._initialized == 1), "_initialized@after == 1";
    assert (tableUpdateCadenceAfter == initialTableUpdateCadence && initialTableUpdateCadence != 0);
}



/*
 * _paused != 0 => revert
 *
 * What it means: The function must revert if the contract is in any paused state (when _paused is non-zero)
 *
 * Why it should hold: The function has the onlyWhenNotPaused(PAUSED_GENERATION_RESERVATIONS) modifier, which should prevent execution when the contract is paused. This is a critical safety mechanism to halt operations during emergencies or maintenance
 *
 * Possible consequences: If this property is violated, attackers could continue creating generation reservations even when the contract is paused, potentially bypassing emergency stops, maintenance windows, or security incident responses
 */
rule createGenerationReservation_paused_reverts(env e) {
    CrossChainRegistry.OperatorSet operatorSet;
    address operatorTableCalculator;
    ICrossChainRegistryTypes.OperatorSetConfig config;

    uint256 mask = 1 << 0; // PAUSED_GENERATION_RESERVATIONS == 0
    bool paused = (currentContract._paused & mask) == mask;

    // call function under test
    createGenerationReservation@withrevert(e, operatorSet, operatorTableCalculator, config);
    bool createGenerationReservation_reverted = lastReverted;

    // verify integrity
    assert (paused => createGenerationReservation_reverted), "_paused != 0 => revert";
}

/*
 * !allocationManager.isOperatorSet(operatorSet) => revert
 *
 * What it means: The function must revert if the provided operator set is not recognized as valid by the allocation manager
 *
 * Why it should hold: The function has the isValidOperatorSet modifier that calls allocationManager.isOperatorSet(operatorSet). Only legitimate operator sets registered with the allocation manager should be allowed to create reservations
 *
 * Possible consequences: If this property is violated, attackers could create reservations for non-existent or unauthorized operator sets, leading to invalid cross-chain configurations and potential system corruption
 */
rule createGenerationReservation_invalid_operator_set_reverts(env e) {
    CrossChainRegistry.OperatorSet operatorSet;
    address operatorTableCalculator;
    ICrossChainRegistryTypes.OperatorSetConfig config;

    // assign all the 'before' variables
    bool isOperatorSet = currentContract.allocationManager.isOperatorSet(e, operatorSet);

    // call function under test
    createGenerationReservation@withrevert(e, operatorSet, operatorTableCalculator, config);
    bool createGenerationReservation_reverted = lastReverted;

    // verify integrity
    assert (!isOperatorSet => createGenerationReservation_reverted), "!allocationManager.isOperatorSet(operatorSet) => revert";
}

/*
 * _paused != 0 => revert
 *
 * What it means: The function must revert when the contract is in a paused state (when _paused is not zero)
 *
 * Why it should hold: The function has the onlyWhenNotPaused(PAUSED_GENERATION_RESERVATIONS) modifier which should prevent execution when paused. This is a critical safety mechanism to halt operations during emergencies or maintenance
 *
 * Possible consequences: Emergency pause mechanisms could be bypassed, allowing operations to continue during critical vulnerabilities or maintenance periods, potentially leading to state corruption or exploitation
 */
rule removeGenerationReservation_paused_reverts(env e) {
    CrossChainRegistry.OperatorSet operatorSet;

    // assign all the 'before' variables
    uint256 mask = 1 << 0; // PAUSED_GENERATION_RESERVATIONS == 0
    bool paused = (currentContract._paused & mask) == mask;

    // call function under test
    removeGenerationReservation@withrevert(e, operatorSet);
    bool removeGenerationReservation_reverted = lastReverted;

    // verify integrity
    assert (paused => removeGenerationReservation_reverted), "_paused != 0 => revert";
}

/*
 * !allocationManager.isOperatorSet(operatorSet) => revert
 *
 * What it means: The function must revert when called with an operator set that is not valid according to the AllocationManager
 *
 * Why it should hold: The function has the isValidOperatorSet modifier which validates the operator set exists in the AllocationManager. This prevents operations on non-existent or invalid operator sets
 *
 * Possible consequences: Operations could be performed on invalid operator sets, leading to inconsistent state between the CrossChainRegistry and AllocationManager, potentially causing system-wide inconsistencies
 */
rule removeGenerationReservation_invalid_operator_set_reverts(env e) {
    CrossChainRegistry.OperatorSet operatorSet;

    // assign all the 'before' variables
    bool isOperatorSet = currentContract.allocationManager.isOperatorSet(e, operatorSet);

    // call function under test
    removeGenerationReservation@withrevert(e, operatorSet);
    bool removeGenerationReservation_reverted = lastReverted;

    // verify integrity
    assert (!isOperatorSet => removeGenerationReservation_reverted), "!allocationManager.isOperatorSet(operatorSet) => revert";
}

/*
 * _paused & PAUSED_OPERATOR_TABLE_CALCULATOR != 0 => revert
 *
 * What it means: The function must revert when the PAUSED_OPERATOR_TABLE_CALCULATOR pause flag is set in the _paused bitmap
 *
 * Why it should hold: The contract implements a pausable mechanism where specific functionality can be disabled during emergencies or maintenance. The onlyWhenNotPaused(PAUSED_OPERATOR_TABLE_CALCULATOR) modifier enforces this check
 *
 * Possible consequences: Emergency pause mechanisms could be bypassed, allowing critical operations to continue during security incidents or maintenance periods when they should be halted
 */
rule setOperatorTableCalculator_paused_reverts(env e) {
    CrossChainRegistry.OperatorSet operatorSet;
    address operatorTableCalculator;

    // assign all the 'before' variables
    uint256 mask = 1 << 1; // PAUSED_OPERATOR_TABLE_CALCULATOR == 1
    bool paused = (currentContract._paused & mask) == mask;

    // call function under test
    setOperatorTableCalculator@withrevert(e, operatorSet, operatorTableCalculator);
    bool setOperatorTableCalculator_reverted = lastReverted;

    // verify integrity
    assert (paused => setOperatorTableCalculator_reverted), "_paused & PAUSED_OPERATOR_TABLE_CALCULATOR != 0 => revert";
}

/*
 * !allocationManager.isOperatorSet(operatorSet) => revert
 *
 * What it means: The function must revert if the provided operatorSet is not recognized as valid by the allocationManager
 *
 * Why it should hold: The isValidOperatorSet modifier ensures only legitimate operator sets registered in the AllocationManager can have calculators set. This prevents operations on non-existent or unauthorized operator sets
 *
 * Possible consequences: Unauthorized operator sets could have calculators assigned, leading to invalid cross-chain operations and potential manipulation of operator table calculations
 */
rule setOperatorTableCalculator_invalid_operator_set_reverts(env e) {
    CrossChainRegistry.OperatorSet operatorSet;
    address operatorTableCalculator;

    // assign all the 'before' variables
    bool isOperatorSet = currentContract.allocationManager.isOperatorSet(e, operatorSet);

    // call function under test
    setOperatorTableCalculator@withrevert(e, operatorSet, operatorTableCalculator);
    bool setOperatorTableCalculator_reverted = lastReverted;

    // verify integrity
    assert (!isOperatorSet => setOperatorTableCalculator_reverted), "!allocationManager.isOperatorSet(operatorSet) => revert";
}


/*
 * _paused & PAUSED_OPERATOR_SET_CONFIG != 0 => revert
 *
 * What it means: The function must revert when the PAUSED_OPERATOR_SET_CONFIG flag is set in the _paused bitmap
 *
 * Why it should hold: The contract implements a pausable mechanism where specific functionality can be disabled during emergencies or maintenance. The onlyWhenNotPaused(PAUSED_OPERATOR_SET_CONFIG) modifier should enforce this by checking the pause status and reverting if the corresponding bit is set
 *
 * Possible consequences: If this property is violated, critical operator set configuration changes could occur during emergency situations when the system should be frozen, potentially allowing malicious configuration updates during security incidents or system maintenance
 */
rule setOperatorSetConfig_paused_reverts(env e) {
    CrossChainRegistry.OperatorSet operatorSet;
    ICrossChainRegistryTypes.OperatorSetConfig config;

    // assign all the 'before' variables
    uint256 _paused_before = currentContract._paused;
    uint256 mask = 1 << 2; // PAUSED_OPERATOR_SET_CONFIG == 2
    bool paused = (currentContract._paused & mask) == mask;

    // call function under test
    setOperatorSetConfig@withrevert(e, operatorSet, config);
    bool setOperatorSetConfig_reverted = lastReverted;

    // verify integrity
    assert (paused => setOperatorSetConfig_reverted), "_paused & PAUSED_OPERATOR_SET_CONFIG != 0 => revert";
}

/*
 * !allocationManager.isOperatorSet(operatorSet) => revert
 *
 * What it means: The function must revert when the provided operatorSet is not recognized as valid by the AllocationManager
 *
 * Why it should hold: The isValidOperatorSet modifier calls allocationManager.isOperatorSet(operatorSet) to ensure only legitimate operator sets can have their configurations modified. This prevents configuration of non-existent or unauthorized operator sets
 *
 * Possible consequences: If this property is violated, attackers could create configurations for fake or unauthorized operator sets, leading to state corruption, resource waste, and potential manipulation of cross-chain registry operations
 */
rule setOperatorSetConfig_invalid_operator_set_reverts(env e) {
    CrossChainRegistry.OperatorSet operatorSet;
    ICrossChainRegistryTypes.OperatorSetConfig config;

    // assign all the 'before' variables
    bool isOperatorSet = currentContract.allocationManager.isOperatorSet(e, operatorSet);

    // call function under test
    setOperatorSetConfig@withrevert(e, operatorSet, config);
    bool setOperatorSetConfig_reverted = lastReverted;

    // verify integrity
    assert (!isOperatorSet => setOperatorSetConfig_reverted), "!allocationManager.isOperatorSet(operatorSet) => revert";
}



/*
 * Combined revert conditions for addChainIDsToWhitelist
 * 
 * Must revert if:
 * 1) Paused bit for whitelist is set
 * 2) chainIDs.length != operatorTableUpdaters.length
 * 3) Any chainIDs[i] == 0
 * 4) msg sender is not owner
 */
rule addChainIDsToWhitelist_revert_conditions(env e) {
    address[] operatorTableUpdaters;
    uint256[] chainIDs;

    // --- snapshots / pre-state
    uint256 _paused_before = currentContract._paused;
    uint256 mask = 1 << 3; // PAUSED_CHAIN_WHITELIST == 3
    bool paused = (_paused_before & mask) == mask;
    
    uint256 i; 
    bool zero_present = i < chainIDs.length && chainIDs[i] == 0;

    // --- call function under test
    addChainIDsToWhitelist@withrevert(e, chainIDs, operatorTableUpdaters);
    bool reverted = lastReverted;

    // --- verify revert conditions
    assert (paused 
        || (e.msg.sender != currentContract._owner) 
        || (chainIDs.length != operatorTableUpdaters.length) 
        || zero_present 
    => reverted);
}


/*
 * removeChainIDsFromWhitelist revert conditions
 *
 * Must revert if:
 * 1) Paused bit for whitelist is set
 * 2) msg.sender is not the owner
 * 3) Any duplicate chain ID appears in the input (i != j && chainIDs[i] == chainIDs[j])
 *
 * Empty arrays are allowed and should NOT revert.
 */
rule removeChainIDsFromWhitelist_revert_conditions(env e) {
    uint256[] chainIDs;

    // --- pre-state
    uint256 paused_before = currentContract._paused;
    uint256 mask = 1 << 3; // PAUSED_CHAIN_WHITELIST == 3
    bool paused = (paused_before & mask) == mask;

    uint256 len = chainIDs.length;

    // nondet indices to quantify over the input
    uint256 i;
    uint256 j;

    bool i_in = (i < len);
    bool j_in = (j < len) && (j != i);
    uint256 ci = chainIDs[i];
    uint256 cj = chainIDs[j];
    // Any duplicate anywhere in the input will cause the second removal to fail.
    bool duplicate_present = i_in && j_in && (ci == cj);

    // --- call function under test
    removeChainIDsFromWhitelist@withrevert(e, chainIDs);
    bool reverted = lastReverted;

    assert (duplicate_present|| paused || e.msg.sender != currentContract._owner => reverted);
    // --- allowed no-op
    assert ((!paused && e.msg.sender == currentContract._owner && len == 0 && e.msg.value == 0) => !reverted), "empty input is allowed and should not revert";
}
````

## File: certora/specs/multichain/ECDSACertificateVerifier.spec
````
using OperatorSetHelper as OperatorSetHelper;

methods {
    function ECDSACertificateVerifier._parseSignatures(bytes32 signableDigest, bytes memory signatures) internal returns (address[] memory) => cvlParseSignatures(signatures);
    function OperatorSetHelper.getOperatorSetKey(ECDSACertificateVerifier.OperatorSet os) external returns (bytes32) envfree;
}

// Needed because the copy loop in _parseSignatures seems to be heavy for the prover.
function cvlParseSignatures(bytes signatures) returns (address[]) {
    uint256 signatureCount = require_uint256(signatures.length / 65);
    address[] signers;
    require signers.length == signatureCount;
    return signers;
}

use builtin rule sanity filtered { f -> f.contract == currentContract }


rule ecdsa_updateOperatorTable_revert_conditions(env e) {
  ECDSACertificateVerifier.OperatorSet os;
  uint32 ts;
  IOperatorTableCalculatorTypes.ECDSAOperatorInfo[] operatorInfos;
  ICrossChainRegistryTypes.OperatorSetConfig cfg;

  bytes32 k = OperatorSetHelper.getOperatorSetKey(os);
  bool notUpdater = e.msg.sender != currentContract.operatorTableUpdater;
  bool stale      = ts <= currentContract._latestReferenceTimestamps[k];

  updateOperatorTable@withrevert(e, os, ts, operatorInfos, cfg);
  assert ((notUpdater || stale) => lastReverted),
         "onlyTableUpdater && ts must be strictly newer";
}

rule ecdsa_updateOperatorTable_updates_and_frames(env e) {
  ECDSACertificateVerifier.OperatorSet os;
  uint32 ts;
  IOperatorTableCalculatorTypes.ECDSAOperatorInfo[] operatorInfos;
  ICrossChainRegistryTypes.OperatorSetConfig cfg;

  bytes32 k  = OperatorSetHelper.getOperatorSetKey(os);
  ECDSACertificateVerifier.OperatorSet other; 
  bytes32 ok = OperatorSetHelper.getOperatorSetKey(other);

  // snapshots
  uint32 latest_before = currentContract._latestReferenceTimestamps[k];
  uint32 other_before  = currentContract._latestReferenceTimestamps[ok];

  updateOperatorTable(e, os, ts, operatorInfos, cfg);

  // effects
  assert currentContract._latestReferenceTimestamps[k] == ts;
  assert currentContract._latestReferenceTimestamps[k] > latest_before;
  assert currentContract._numOperators[k][ts] == operatorInfos.length;
  assert currentContract._operatorSetOwners[k] == cfg.owner;
  assert currentContract._maxStalenessPeriods[k] == cfg.maxStalenessPeriod;

  // frame: other sets unchanged
  assert (ok == k) || (currentContract._latestReferenceTimestamps[ok] == other_before);
}

rule ecdsa_verifyCertificate_disabled_root_reverts(env e) {
  ECDSACertificateVerifier.OperatorSet os;
  IECDSACertificateVerifierTypes.ECDSACertificate cert;

  bool disabled = !currentContract.operatorTableUpdater.isRootValidByTimestamp(e, cert.referenceTimestamp);

  verifyCertificate@withrevert(e, os, cert);
  assert (disabled => lastReverted), "disabled root => revert";
}

rule ecdsa_verifyCertificate_staleness_window_reverts(env e) {
  ECDSACertificateVerifier.OperatorSet os;
  IECDSACertificateVerifierTypes.ECDSACertificate cert;

  bytes32 k = OperatorSetHelper.getOperatorSetKey(os);
  bool stale = currentContract._maxStalenessPeriods[k] != 0 && e.block.timestamp > cert.referenceTimestamp + currentContract._maxStalenessPeriods[k];

  verifyCertificate@withrevert(e, os, cert);
  assert (stale => lastReverted), "cert beyond staleness window => revert";
}


rule ecdsa_verify_paths_do_not_mutate_state(env e) {
  ECDSACertificateVerifier.OperatorSet os;
  IECDSACertificateVerifierTypes.ECDSACertificate cert;
  uint16[] p; uint256[] n;

  bytes32 k = OperatorSetHelper.getOperatorSetKey(os);

  uint32 latest_before      = currentContract._latestReferenceTimestamps[k];
  uint32 maxStale_before    = currentContract._maxStalenessPeriods[k];
  address owner_before      = currentContract._operatorSetOwners[k];

  verifyCertificate(e, os, cert);
  verifyCertificateProportion(e, os, cert, p);
  verifyCertificateNominal(e, os, cert, n);

  assert currentContract._latestReferenceTimestamps[k] == latest_before;
  assert currentContract._maxStalenessPeriods[k] == maxStale_before;
  assert currentContract._operatorSetOwners[k] == owner_before;
}
````

## File: certora/specs/multichain/EnumerableSet.spec
````
// GHOST COPIES:
// For every storage variable we add a ghost field that is kept synchronized by hooks.
// The ghost fields can be accessed by the spec, even inside quantifiers.

// ghost field for the values array
ghost mapping(mathint => bytes32) ghostValues_activeGenerationReservations {
    init_state axiom forall mathint x. ghostValues_activeGenerationReservations[x] == to_bytes32(0);
}
// ghost field for the indexes map
ghost mapping(bytes32 => uint256) ghostIndexes_activeGenerationReservations {
    init_state axiom forall bytes32 x. ghostIndexes_activeGenerationReservations[x] == 0;
}
// ghost field for the length of the values array (stored in offset 0)
ghost uint256 ghostLength_activeGenerationReservations {
    init_state axiom ghostLength_activeGenerationReservations == 0;
    // assumption: it's infeasible to grow the list to these many elements.
    axiom ghostLength_activeGenerationReservations < max_uint256;
}

// HOOKS
// Store hook to synchronize ghostLength_activeGenerationReservations with the length of the _activeGenerationReservations._inner._values array.
hook Sstore currentContract._activeGenerationReservations._inner._values.length uint256 newLength {
    ghostLength_activeGenerationReservations = newLength;
}
// Store hook to synchronize ghostValues_activeGenerationReservations array with _activeGenerationReservations._inner._values.
hook Sstore currentContract._activeGenerationReservations._inner._values[INDEX uint256 index] bytes32 newValue {
    ghostValues_activeGenerationReservations[index] = newValue;
}
// Store hook to synchronize ghostIndexes_activeGenerationReservations array with _activeGenerationReservations._inner._indexes.
hook Sstore currentContract._activeGenerationReservations._inner._indexes[KEY bytes32 value] uint256 newIndex {
    ghostIndexes_activeGenerationReservations[value] = newIndex;
}

// Load hook to synchronize ghostLength_activeGenerationReservations with the length of the _activeGenerationReservations._inner._values array.
hook Sload uint256 length currentContract._activeGenerationReservations._inner._values.length {
    require ghostLength_activeGenerationReservations == length;
}
hook Sload bytes32 value currentContract._activeGenerationReservations._inner._values[INDEX uint256 index] {
    require ghostValues_activeGenerationReservations[index] == value;
}
hook Sload uint256 index currentContract._activeGenerationReservations._inner._indexes[KEY bytes32 value] {
    require ghostIndexes_activeGenerationReservations[value] == index;
}

// INVARIANTS
//  This is the main invariant stating that the indexes and values always match:
//        values[indexes[v] - 1] = v for all values v in the _activeGenerationReservations
//    and indexes[values[i]] = i+1 for all valid indexes i.

invariant _activeGenerationReservationsInvariant()
    (forall uint256 index. 0 <= index && index < ghostLength_activeGenerationReservations => to_mathint(ghostIndexes_activeGenerationReservations[ghostValues_activeGenerationReservations[index]]) == index + 1)
    && (forall bytes32 value. ghostIndexes_activeGenerationReservations[value] == 0 ||
         (ghostValues_activeGenerationReservations[ghostIndexes_activeGenerationReservations[value] - 1] == value && ghostIndexes_activeGenerationReservations[value] >= 1 && ghostIndexes_activeGenerationReservations[value] <= ghostLength_activeGenerationReservations));
````

## File: certora/specs/multichain/OperatorTableUpdater.spec
````
import "../libraries/BN254-nondet.spec";

methods {
}

use builtin rule sanity filtered { f -> f.contract == currentContract  }


// A tiny “frame” helper for maps: if key != touchedKey then unchanged.
function unchangedMappingUint32(uint32 before, uint32 after, bool keysEqual) returns (bool) {
    return keysEqual || (after == before);
}

// A tiny “frame” helper for maps: if key != touchedKey then unchanged.
function unchangedMappingBytes32(bytes32 before, bytes32 after, bool keysEqual) returns (bool) {
    return keysEqual || (after == before);
}

rule confirmGlobalTableRoot_reverts_conditions(env e) {
    IBN254CertificateVerifierTypes.BN254Certificate cert;
    bytes32 root; 
    uint32 ts; 
    uint32 blk;

    bool futureTS = ts > e.block.timestamp;
    bool staleTS = ts <= currentContract._latestReferenceTimestamp; 
    bool zeroTS = ts == 0;
    bool invalidMsgHash = currentContract.getGlobalTableUpdateMessageHash(e, root, ts, blk) != cert.messageHash;
    // PAUSED_GLOBAL_ROOT_UPDATE = 0
    uint256 mask = 1 << 0;
    bool paused = (currentContract._paused & mask) == mask;

    confirmGlobalTableRoot@withrevert(e, cert, root, ts, blk);
    bool reverted = lastReverted;

    assert ((futureTS || staleTS || invalidMsgHash || zeroTS || paused) => reverted),
        "future || stale || bad messageHash => revert";
}

rule confirmGlobalTableRoot_success_updates_and_frames(env e) {
    IBN254CertificateVerifierTypes.BN254Certificate cert;
    bytes32 root; uint32 ts; uint32 blk;

    // Snapshots
    uint32 latest_before = currentContract._latestReferenceTimestamp;

    // Other keys for frame checks
    uint32 otherTs;
    uint32 otherBlk;
    bytes32 otherRoot;

    bytes32 roots_other_before = currentContract._globalTableRoots[otherTs];
    uint32 blks_other_before = currentContract._referenceBlockNumbers[otherTs];
    uint32 ts_other_before = currentContract._referenceTimestamps[otherBlk];
    bool valid_other_before = currentContract._isRootValid[otherRoot];
    
    address _owner_before = currentContract._owner;
    uint16 threshold_before = currentContract.globalRootConfirmationThreshold;
    uint256 paused_before = currentContract._paused;


    // Call
    confirmGlobalTableRoot(e, cert, root, ts, blk);

    // Post
    assert (
        currentContract._latestReferenceTimestamp == ts
        && currentContract._referenceBlockNumbers[ts] == blk
        && currentContract._referenceTimestamps[blk] == ts
        && currentContract._globalTableRoots[ts] == root
        && currentContract._isRootValid[root] == true
    );

    // Frame: no unintended writes
    assert (unchangedMappingBytes32(roots_other_before,
                             currentContract._globalTableRoots[otherTs],
                             otherTs == ts));
    assert (unchangedMappingUint32(blks_other_before,
                             currentContract._referenceBlockNumbers[otherTs],
                             otherTs == ts));
    assert (unchangedMappingUint32(ts_other_before,
                             currentContract._referenceTimestamps[otherBlk],
                             otherBlk == blk));
    assert ( (otherRoot == root) || (currentContract._isRootValid[otherRoot] == valid_other_before) );

    // Governance params don’t change here
    assert currentContract.globalRootConfirmationThreshold == threshold_before;
    assert currentContract._owner == _owner_before;
    assert currentContract._paused == paused_before;
}

rule confirmGlobalTableRoot_strictly_monotonic(env e) {
    IBN254CertificateVerifierTypes.BN254Certificate cert;
    bytes32 root; uint32 ts; uint32 blk;

    uint32 latest_before = currentContract._latestReferenceTimestamp;
    confirmGlobalTableRoot(e, cert, root, ts, blk);
    assert currentContract._latestReferenceTimestamp > latest_before;
}


rule updateOperatorTable_revert_conditions(env e) {
    uint32 referenceTimestamp; 
    bytes32 root; 
    uint32 idx; 
    bytes proof; 
    bytes operatorTable;

    // Snapshots to read pre-state in asserts
    bool rootValid_before = currentContract._isRootValid[root];
    bool emptyTable = operatorTable.length == 0;

    // an unset reference timestamp does not cause a revert but noop
    bool referenceTimestampSet = isReferenceTimestampSet(e, operatorTable, referenceTimestamp); 

    // the following revert cases only trigger if referenceTimestampSet == true
    bool staleTS = referenceTimestamp <= latestTsForOperatorTableBytes(e, operatorTable);
    bool mismatchedRoot = root != currentContract._globalTableRoots[referenceTimestamp];
    bool invalidCurvetype = !validCurvetype(e, operatorTable);

    uint256 _paused_before = currentContract._paused;
    uint256 mask = 1 << 1; // PAUSED_OPERATOR_TABLE_UPDATE == 1
    bool paused = (currentContract._paused & mask) == mask;

    updateOperatorTable@withrevert(e, referenceTimestamp, root, idx, proof, operatorTable);
    bool reverted = lastReverted;

    assert ((!rootValid_before || paused || emptyTable ) => reverted),
        "!_isRootValid[root] || _globalTableRoots[ts] != root || paused => revert";
    assert !referenceTimestampSet => ((mismatchedRoot || staleTS || invalidCurvetype) => reverted);
}

rule updateOperatorTable_frame_conditions(env e) {
    uint32 ts; bytes32 root; uint32 idx; bytes proof; bytes table;

    // Snapshots
    uint32 latest_before = currentContract._latestReferenceTimestamp;
    bytes32 mapped_before = currentContract._globalTableRoots[ts];
    uint16 thresh_before = currentContract.globalRootConfirmationThreshold;
    address owner_before = currentContract._owner;
    uint256 paused_before = currentContract._paused;
    bool rootValid_before_state = currentContract._isRootValid[root];

    updateOperatorTable(e, ts, root, idx, proof, table);

    // No writes to these in implementation
    assert currentContract._latestReferenceTimestamp == latest_before;
    assert currentContract._globalTableRoots[ts] == mapped_before;
    assert currentContract.globalRootConfirmationThreshold == thresh_before;
    assert currentContract._owner == owner_before;
    assert currentContract._paused == paused_before;
    assert currentContract._isRootValid[root] == rootValid_before_state;
}

rule disableRoot_then_updateOperatorTable_must_revert(env e) {
    bytes32 root; uint32 ts; uint32 idx; bytes proof; bytes table;

    // Disable
    disableRoot(e, root);
    assert !currentContract._isRootValid[root];

    // Now any attempt to use it must revert (independent of other args)
    updateOperatorTable@withrevert(e, ts, root, idx, proof, table);
    assert lastReverted;
}


rule setGlobalRootConfirmationThreshold_revert_conditions(env e) {
    uint16 bps;

    // onlyOwner
    setGlobalRootConfirmationThreshold@withrevert(e, bps);
    bool reverted = lastReverted; 

    assert ((e.msg.sender != currentContract._owner || bps > currentContract.MAX_BPS(e)) => reverted), "onlyOwner";
}

rule setGlobalRootConfirmationThreshold_success_and_frame_conditions(env e) {
    uint16 bps;
    uint32 someTs;
    uint32 someBlk;

    address owner = currentContract._owner;
    uint32 referenceTimestamp = currentContract._latestReferenceTimestamp;
    uint32 refBlockNum_before   = currentContract._referenceBlockNumbers[someTs];
    uint32 refTimestamp_before  = currentContract._referenceTimestamps[someBlk];

    // success updates
    setGlobalRootConfirmationThreshold(e, bps);

    // integrity check
    assert (currentContract.globalRootConfirmationThreshold == bps);

    // frame on unrelated state
    assert currentContract._latestReferenceTimestamp == referenceTimestamp;
    assert currentContract._owner == owner;
    assert currentContract._referenceBlockNumbers[someTs] == refBlockNum_before;
    assert currentContract._referenceTimestamps[someBlk]  == refTimestamp_before;
}


rule disableRoot_revert_conditions(env e){
    bytes32 root;

    bool valid_before = currentContract._isRootValid[root];
    bool pauser = currentContract.pauserRegistry.isPauser(e, e.msg.sender);

    disableRoot@withrevert(e, root);

    assert ((!pauser || !valid_before) => lastReverted), "valid root || onlyPauser";
}

rule disableRoot_success_and_frame_conditions(env e) {
    bytes32 root;
    bytes32 other;

    bool other_before = currentContract._isRootValid[other];

    // success effect
    disableRoot(e, root);

    assert (currentContract._isRootValid[root] == false);
    assert ( (other == root) || (currentContract._isRootValid[other] == other_before) );
}
````

## File: certora/specs/permissions/KeyRegistrar.spec
````
import "../libraries/BN254-nondet.spec";
using AllocationManager as AllocationManager;
using PermissionController as PermissionController;

methods {
    function _.canCall(address, address, address, bytes4) external => DISPATCHER(true);
    function _.isValidERC1271SignatureNow(address, bytes32, bytes memory) internal => NONDET;

    function isRegistered(KeyRegistrar.OperatorSet, address) external returns (bool) envfree;

    function getOperatorSetKey(KeyRegistrar.OperatorSet) external returns (bytes32) envfree;
    function getOperatorKeyDataHash(bytes32, address) external returns (bytes32) envfree;

     // external calls to AVSRegistrar.  Note that the source does not have a proper implementation, the one available always reverts
    function _.registerOperator(address,address,uint32[],bytes) external => DISPATCHER(true);
    function _.deregisterOperator(address,address,uint32[]) external => DISPATCHER(true);
    function _.supportsAVS(address) external => DISPATCHER(true);
}

use builtin rule sanity filtered { f -> f.contract == currentContract }


rule global_registry_monotonic(method f, env e, calldataarg args) filtered { f -> !f.isView } {
    bytes32 keyHash;

    // snapshot
    bool _globalKeyRegistry_before = currentContract._globalKeyRegistry[keyHash];

    // execute arbitrary non-view function
    f(e, args);

    // check monotonicity
    assert  _globalKeyRegistry_before => currentContract._globalKeyRegistry[keyHash], "_globalKeyRegistry must never flip from true to false";
}

/*
 * curveType == 0 => revert
 *
 * What it means: The function must revert when curveType is 0 (NONE), preventing configuration with an invalid curve type
 *
 * Why it should hold: CurveType.NONE (value 0) represents an unconfigured state, not a valid curve type for cryptographic operations. Allowing configuration with NONE would create an inconsistent state where an operator set appears configured but has no valid cryptographic curve
 *
 * Possible consequences: State corruption where operator sets appear configured but cannot perform cryptographic operations, leading to system-wide failures in key registration and verification
 */
rule configureOperatorSet_invalidCurveTypeReverts(env e) {
    KeyRegistrar.OperatorSet os;
    IKeyRegistrarTypes.CurveType curveType;
    bytes32 key = getOperatorSetKey(os);

    // assign all the 'before' variables
    IKeyRegistrarTypes.CurveType curveTypeBefore = currentContract._operatorSetCurveTypes[key];

    // call function under test
    configureOperatorSet@withrevert(e, os, curveType);
    bool configureOperatorSet_reverted = lastReverted;

    // assign all the 'after' variables
    IKeyRegistrarTypes.CurveType curveTypeAfter = currentContract._operatorSetCurveTypes[key];

    // verify integrity
    assert (curveType == IKeyRegistrarTypes.CurveType.NONE) => configureOperatorSet_reverted, "curveType == NONE => revert";
    assert (curveTypeBefore != IKeyRegistrarTypes.CurveType.NONE => configureOperatorSet_reverted), "curveTypeBefore must be empty";
    assert (curveTypeAfter == curveType && (curveType == IKeyRegistrarTypes.CurveType.ECDSA || curveType == IKeyRegistrarTypes.CurveType.BN254)) || configureOperatorSet_reverted, "curveType must be valid after successful configuration";
}

/*
 * operatorSetNotConfigured || keyAlreadyRegistered => revert
 *
 * What it means:  
 * `registerKey` must revert if either (a) the operator‑set has **not** been
 * configured with a valid curve type (`_operatorSetCurveTypes == NONE`), or
 * (b) the operator already has a key registered in that set, (c) keyData cannot be empty, 
 * (d) keyData must be exactly 20 bytes for ECDSA keys or 192 bytes for BN254 keys - any other length should cause registration to fail
 *
 * Why it should hold:  
 * Registering under an unconfigured curve type would leave the system in an
 * unusable state, while allowing duplicate registrations would violate the
 * one‑key‑per‑operator invariant and undermine key‑uniqueness guarantees.
 *
 * Possible consequences:  
 * If the check is bypassed, keys could be registered under invalid cryptographic
 * parameters, or operators could overwrite/accumulate multiple keys. Either case
 * leads to inconsistent state, signature‑verification failures, and potential
 * security breaches.
 */
rule registerKey_revertConditions(env e) {
    KeyRegistrar.OperatorSet os;
    address operator;
    bytes keyData;
    bytes signature;
    bytes32 key = getOperatorSetKey(os);

    // Ensure the operatorSet has been configured with a valid curve
    bool operatorSetNotConfigured = currentContract._operatorSetCurveTypes[key] == IKeyRegistrarTypes.CurveType.NONE;
    bool keyAlreadyRegistered = currentContract._operatorKeyInfo[key][operator].isRegistered == true;
    bool emptyKeyData = keyData.length == 0;
    bool validKeyDataLength = (currentContract._operatorSetCurveTypes[key] == IKeyRegistrarTypes.CurveType.ECDSA && keyData.length == 20) || (currentContract._operatorSetCurveTypes[key] == IKeyRegistrarTypes.CurveType.BN254 && keyData.length == 192);
    bool callAuthorized = PermissionController.canCall(e, operator, e.msg.sender, currentContract, to_bytes4(sig:registerKey(address, KeyRegistrar.OperatorSet, bytes, bytes).selector));

    // Then the call to registerKey should proceed
    registerKey@withrevert(e, operator, os, keyData, signature);
    bool registerKeyReverted = lastReverted;

    assert operatorSetNotConfigured => registerKeyReverted;
    assert keyAlreadyRegistered => registerKeyReverted;
    assert emptyKeyData => registerKeyReverted;
    assert !validKeyDataLength => registerKeyReverted;
    assert !callAuthorized => registerKeyReverted;
}

/*
 * (_operatorKeyInfo[operatorSetKey][operator] or keyData) changed
 *     => f.selector == registerKey || deregisterKey
 *
 * What it means:  
 * Any state change that touches an operator’s key‑registration record—either
 * the `isRegistered` flag or the stored key‑data hash—**must** originate
 * exclusively from the `registerKey` or `deregisterKey` functions. All other
 * non‑view methods are forbidden to modify this storage.
 *
 * Why it should hold:  
 * Centralising mutations in the dedicated registration functions preserves
 * invariant boundaries, simplifies auditing, and prevents accidental or
 * malicious corruption of key‑management data by unrelated contract logic.
 *
 * Possible consequences:  
 * If another function can alter these fields, it might silently register,
 * deregister, or tamper with keys without passing the intended access‑control
 * and validation pathways—resulting in lost keys, unauthorised operators,
 * denial‑of‑service, or broken cryptographic assumptions across the system.
 */
rule onlyRegisterAndDeregisterKeyModifyOperatorKeyInfo(method f, env e, calldataarg args)  filtered { f -> !f.isView } 
 {
    address operator;
    KeyRegistrar.OperatorSet os;
    bytes32 key = getOperatorSetKey(os);

    // Snapshot old state
    bool isRegistered = currentContract._operatorKeyInfo[key][operator].isRegistered;
    bytes32 keyData = getOperatorKeyDataHash(key, operator);

    // Run any non-view function
    f(e, args);

    // Assert state only changed by register or deregister key
    assert (getOperatorKeyDataHash(key, operator) != keyData ||
            currentContract._operatorKeyInfo[key][operator].isRegistered != isRegistered) 
            => (f.selector == sig:registerKey(address, KeyRegistrar.OperatorSet, bytes, bytes).selector ||
            f.selector == sig:deregisterKey(address, KeyRegistrar.OperatorSet).selector);
}


/*
 * a call to `registerKey` must turn `isRegistered` `false → true`; a call to `deregisterKey` must turn it `true → false`.
 */
rule registrationFlagFlipsCorrectly(method f, env e, calldataarg args) filtered { f -> !f.isView } {
    address operator;
    KeyRegistrar.OperatorSet os;
    bytes32 k = getOperatorSetKey(os);
    bool before = currentContract._operatorKeyInfo[k][operator].isRegistered;

    f(e,args);

    bool after  = currentContract._operatorKeyInfo[k][operator].isRegistered;

    assert (f.selector == sig:registerKey(address, KeyRegistrar.OperatorSet, bytes, bytes).selector) =>
           ((before == false) => after || before == after); //can stay the same if the registered key is different from k
    assert (f.selector == sig:deregisterKey(address, KeyRegistrar.OperatorSet).selector) =>
           ((before == true)  => !after || before == after); //can stay the same if the deregistered key is different from k
    assert (f.selector != sig:registerKey(address, KeyRegistrar.OperatorSet, bytes, bytes).selector && f.selector != sig:deregisterKey(address, KeyRegistrar.OperatorSet).selector) => before == after;
}


rule onlyConfigureOperatorSetMayWriteCurveType(method f, env e, calldataarg args)		
   filtered { f -> !f.isView } {
    bytes32 setKey;

    IKeyRegistrarTypes.CurveType before = currentContract._operatorSetCurveTypes[setKey];
    f(e, args);
    IKeyRegistrarTypes.CurveType after  = currentContract._operatorSetCurveTypes[setKey];

    assert (before != after) => 
        (f.selector == sig:configureOperatorSet(KeyRegistrar.OperatorSet, IKeyRegistrarTypes.CurveType).selector);
}



/*
 * otherOperator != operator => _operatorKeyInfo[operatorSetKey][otherOperator].isRegistered@after == _operatorKeyInfo[operatorSetKey][otherOperator].isRegistered@before
 *
 * What it means: When one operator deregisters their key, the registration status of all other operators in the same operator set must remain unchanged
 *
 * Why it should hold: Key deregistration should be isolated to the specific operator performing the action. Other operators' keys are independent and should not be affected by unrelated deregistration operations.
 *
 * Possible consequences: If other operators' registrations are affected, it could lead to widespread service disruption, unauthorized deregistration of valid keys, and breaking the isolation principle between different operators' key management.
 */
rule deregisterKey_other_operators_unchanged(env e) {
    address operator;
    KeyRegistrar.OperatorSet operatorSet;
    bytes32 operatorSetKey;
    address otherOperator;

    // assign all the 'before' variables
    bool _operatorKeyInfo_operatorSetKey__otherOperator__isRegistered_before = currentContract._operatorKeyInfo[operatorSetKey][otherOperator].isRegistered;

    // call function under test
    deregisterKey(e, operator, operatorSet);

    // assign all the 'after' variables
    bool _operatorKeyInfo_operatorSetKey__otherOperator__isRegistered_after = currentContract._operatorKeyInfo[operatorSetKey][otherOperator].isRegistered;

    // verify integrity
    assert ((otherOperator != operator) => (_operatorKeyInfo_operatorSetKey__otherOperator__isRegistered_after == _operatorKeyInfo_operatorSetKey__otherOperator__isRegistered_before)), "otherOperator != operator => _operatorKeyInfo[operatorSetKey][otherOperator].isRegistered@after == _operatorKeyInfo[operatorSetKey][otherOperator].isRegistered@before";
}


/*
 * (!keyRegistered) ∨ (operatorSetNotConfigured) ∨ (isOperatorSlashable) ⇒ revert
 *
 * What it means — `deregisterKey` must **fail** in any of the following
 * pre‑conditions:
 *   1. **Key not registered**  The operator has no key recorded in the requested
 *      operator‑set (`_operatorKeyInfo[setKey][operator].isRegistered == false`).
 *   2. **Operator‑set not configured**  The set’s curve type is
 *      `CurveType.NONE`, signalling it has never been initialised for use.
 *   3. **Operator is slashable**  `AllocationManager.isOperatorSlashable`
 *      reports the operator is currently subject to slashing and therefore
 *      must not be allowed to opt‑out.
 *
 * Why it should hold:
 *   • Prevents meaningless state transitions on non‑existent keys.  
 *   • Guards against interacting with an uninitialised cryptographic domain.  
 *   • Ensures slashable operators cannot escape penalties by deregistering.
 *
 * Possible consequences if violated:
 *   • Deregistering a non‑existent key breaks invariants and confuses callers.  
 *   • Operating on an unconfigured set may leave the system in an unusable or
 *     inconsistent state.  
 *   • Allowing slashable operators to deregister could let them evade economic
 *     punishment and undermine security assumptions.
 */
rule deregisterKey_revertConditions(env e) {
    address operator;
    KeyRegistrar.OperatorSet operatorSet;
    bytes32 operatorSetKey = getOperatorSetKey(operatorSet);

    // assign all the 'before' variables
    bool keyRegistered = currentContract._operatorKeyInfo[operatorSetKey][operator].isRegistered;
    bool operatorSetNotConfigured = currentContract._operatorSetCurveTypes[operatorSetKey] == IKeyRegistrarTypes.CurveType.NONE;
    bool isOperatorSlashable = AllocationManager.isOperatorSlashable(e, operator, operatorSet);
    bool callAuthorized = PermissionController.canCall(e, operator, e.msg.sender, currentContract, to_bytes4(sig:deregisterKey(address, KeyRegistrar.OperatorSet).selector));
    // call function under test
    deregisterKey@withrevert(e, operator, operatorSet);
    bool deregisterKey_reverted = lastReverted;

    // verify integrity
    assert (!keyRegistered => deregisterKey_reverted), "!_operatorKeyInfo[operatorSetKey][operator].isRegistered => revert";
    assert (operatorSetNotConfigured => deregisterKey_reverted), "curveType is 0 => revert";
    assert (isOperatorSlashable => deregisterKey_reverted), "operator that is slashable cannot be deregistered";
    assert (!callAuthorized => deregisterKey_reverted), "unauthorized operator";
}

/*****************************************************************
 * 1. configureOperatorSet — unauthorised caller must revert
 *****************************************************************/
rule configureOperatorSet_unauthorisedCallerReverts(env e) {
    KeyRegistrar.OperatorSet os;
    IKeyRegistrarTypes.CurveType curveType;

    // Permission check performed by the modifier in Solidity
    bool callAuthorised =
        PermissionController.canCall(
            e,
            os.avs,                             // account
            e.msg.sender,                       // caller
            currentContract,                    // target
            to_bytes4(sig:configureOperatorSet(KeyRegistrar.OperatorSet, IKeyRegistrarTypes.CurveType).selector)
        );

    configureOperatorSet@withrevert(e, os, curveType);
    bool reverted = lastReverted;

    // If not authorised, the call **must** revert
    assert (!callAuthorised) => reverted, "configureOperatorSet: unauthorised caller should revert";
}



/*****************************************************************
 * 2. Only registerKey may set a new entry in _globalKeyRegistry
 *****************************************************************/
rule onlyRegisterKeyMayWriteGlobalRegistry(method f, env e, calldataarg args)
      filtered { f -> !f.isView } {
    bytes32 keyHash;

    bool before = currentContract._globalKeyRegistry[keyHash];
    f(e, args);
    bool after  = currentContract._globalKeyRegistry[keyHash];

    /* A transition false → true is allowed **only** via registerKey */
    assert ((after && !before) =>
            (f.selector == sig:registerKey(address, KeyRegistrar.OperatorSet, bytes, bytes).selector)),
           "_globalKeyRegistry can be set only in registerKey";
}



/*****************************************************************
 * 3. registerKey must not touch other operators’ records
 *****************************************************************/
rule registerKey_otherOperatorsUnchanged(env e) {
    address operator;
    address otherOperator;
    KeyRegistrar.OperatorSet os;
    bytes keyData;
    bytes signature;
    bytes32 setKey = getOperatorSetKey(os);

    /* Snapshot another operator’s registration status */
    bool before = currentContract._operatorKeyInfo[setKey][otherOperator].isRegistered;

    registerKey@withrevert(e, operator, os, keyData, signature);

    bool after  = currentContract._operatorKeyInfo[setKey][otherOperator].isRegistered;

    assert ((otherOperator != operator) => (after == before)),
           "registerKey must not modify registrations of other operators";
}
````

## File: certora/specs/permissions/Pausable.spec
````
methods {
    // envfree functions
    function paused() external returns (uint256) envfree;
    function paused(uint8 index) external returns (bool) envfree;
    function pauserRegistry() external returns (address) envfree;

    // harnessed functions
    function isPauser(address) external returns (bool) envfree;
    function unpauser() external returns (address) envfree;
    function bitwise_not(uint256) external returns (uint256) envfree;
    function bitwise_and(uint256, uint256) external returns (uint256) envfree;
}

rule onlyPauserCanPauseAndOnlyUnpauserCanUnpause() {
    method f;
    env e;
    uint256 pausedStatusBefore = paused();
    address unpauser = unpauser();
    if (f.selector == sig:pause(uint256).selector) {
        uint256 newPausedStatus;
        pause(e, newPausedStatus);
        uint256 pausedStatusAfter = paused();
        if (isPauser(e.msg.sender) && bitwise_and(pausedStatusBefore, newPausedStatus) == pausedStatusBefore) {
            assert(pausedStatusAfter == newPausedStatus, "pausedStatusAfter != newPausedStatus");
        } else {
            assert(pausedStatusAfter == pausedStatusBefore, "pausedStatusAfter != pausedStatusBefore");
        }
    } else if (f.selector == sig:pauseAll().selector) {
        pauseAll(e);
        uint256 pausedStatusAfter = paused();
       if (isPauser(e.msg.sender)) {
            // assert(pausedStatusAfter == type(uint256).max, "pausedStatusAfter != newPausedStatus");
            assert(pausedStatusAfter == 115792089237316195423570985008687907853269984665640564039457584007913129639935,
                "pausedStatusAfter != newPausedStatus");
        } else {
            assert(pausedStatusAfter == pausedStatusBefore, "pausedStatusAfter != pausedStatusBefore");
        }
    } else if (f.selector == sig:unpause(uint256).selector) {
        uint256 newPausedStatus;
        unpause(e, newPausedStatus);
        uint256 pausedStatusAfter = paused();
        if (e.msg.sender == unpauser && bitwise_and(bitwise_not(pausedStatusBefore), bitwise_not(newPausedStatus)) == bitwise_not(pausedStatusBefore)) {
            assert(pausedStatusAfter == newPausedStatus, "pausedStatusAfter != newPausedStatus");
        } else {
            assert(pausedStatusAfter == pausedStatusBefore, "pausedStatusAfter != pausedStatusBefore");
        }
    } else {
        calldataarg arg;
        f(e,arg);
        uint256 pausedStatusAfter = paused();
        assert(pausedStatusAfter == pausedStatusBefore, "pausedStatusAfter != pausedStatusBefore");
    }
}
````

## File: certora/specs/pods/EigenPod.spec
````
methods {
    // Internal, NONDET-summarized EigenPod library functions
    function _.verifyValidatorFields(bytes32, bytes32[] calldata, bytes calldata, uint40) internal => NONDET;
    function _.verifyValidatorBalance(bytes32, bytes32, bytes calldata, uint40) internal => NONDET;
    function _.verifyStateRootAgainstLatestBlockRoot(bytes32, bytes32, bytes calldata) internal => NONDET;
    function _.verifyWithdrawal(bytes32, bytes32[] calldata, BeaconChainProofs.WithdrawalProof calldata) internal => NONDET;

    // Internal, NONDET-summarized "send ETH" function -- unsound summary used to avoid HAVOC behavior
    // when sending ETH using `Address.sendValue()`
    function _._sendETH(address recipient, uint256 amountWei) internal => NONDET;

    // summarize the deployment of EigenPods to avoid default, HAVOC behavior
    function _.deploy(uint256, bytes32, bytes memory bytecode) internal => NONDET;

    //// External Calls
	// external calls to DelegationManager 
    function _.undelegate(address) external => DISPATCHER(true);
    function _.decreaseDelegatedShares(address,address,uint256) external => DISPATCHER(true);
	function _.increaseDelegatedShares(address,address,uint256) external => DISPATCHER(true);

    // external calls from DelegationManager to ServiceManager
    function _.updateStakes(address[]) external => NONDET;

	// external calls to Slasher
    function _.isFrozen(address) external => DISPATCHER(true);
	function _.canWithdraw(address,uint32,uint256) external => DISPATCHER(true);
    function _.recordStakeUpdate(address,uint32,uint32,uint256) external => NONDET;

	// external calls to StrategyManager
    function _.getDeposits(address) external => DISPATCHER(true);
    function _.slasher() external => DISPATCHER(true);
    function _.removeShares(address,address,uint256) external => DISPATCHER(true);
    function _.withdrawSharesAsTokens(address, address, uint256, address) external => DISPATCHER(true);

    // external calls to Strategy contracts
    function _.deposit(address, uint256) external => NONDET;
    function _.withdraw(address, address, uint256) external => NONDET;

	// external calls to EigenPodManager
    function _.addShares(address,uint256) external => DISPATCHER(true);
    function _.removeShares(address,uint256) external => DISPATCHER(true);
    function _.withdrawSharesAsTokens(address, address, uint256) external => DISPATCHER(true);
    function _.podOwnerShares(address) external => DISPATCHER(true);

    // external calls to EigenPod
	function _.withdrawRestakedBeaconChainETH(address,uint256) external => DISPATCHER(true);
    function _.stake(bytes, bytes, bytes32) external => DISPATCHER(true);
    function _.initialize(address) external => DISPATCHER(true);

    // external calls to ETH2Deposit contract
    function _.deposit(bytes, bytes, bytes, bytes32) external => NONDET;

    // external calls to PauserRegistry
    function _.isPauser(address) external => DISPATCHER(true);
	function _.unpauser() external => DISPATCHER(true);

    // external calls to ERC20 token
    function _.transfer(address, uint256) external => DISPATCHER(true);
    function _.transferFrom(address, address, uint256) external => DISPATCHER(true);
    function _.approve(address, uint256) external => DISPATCHER(true);
	
    // envfree functions
    function MAX_RESTAKED_BALANCE_GWEI_PER_VALIDATOR() external returns (uint64) envfree;
    function withdrawableRestakedExecutionLayerGwei() external returns (uint64) envfree;
    function nonBeaconChainETHBalanceWei() external returns (uint256) envfree;
    function eigenPodManager() external returns (address) envfree;
    function podOwner() external returns (address) envfree;
    function hasRestaked() external returns (bool) envfree;
    function mostRecentWithdrawalTimestamp() external returns (uint64) envfree;
    function validatorPubkeyHashToInfo(bytes32 validatorPubkeyHash) external returns (IEigenPod.ValidatorInfo) envfree;
    function provenWithdrawal(bytes32 validatorPubkeyHash, uint64 slot) external returns (bool) envfree;
    function validatorStatus(bytes32 pubkeyHash) external returns (IEigenPod.VALIDATOR_STATUS) envfree;
    function nonBeaconChainETHBalanceWei() external returns (uint256) envfree;

    // harnessed functions
    function get_validatorIndex(bytes32 pubkeyHash) external returns (uint64) envfree;
    function get_restakedBalanceGwei(bytes32 pubkeyHash) external returns (uint64) envfree;
    function get_mostRecentBalanceUpdateTimestamp(bytes32 pubkeyHash) external returns (uint64) envfree;
    function get_podOwnerShares() external returns (int256) envfree;
    function get_withdrawableRestakedExecutionLayerGwei() external returns (uint256) envfree;
    function get_ETH_Balance() external returns (uint256) envfree;
}

// defines the allowed validator status transitions
definition validatorStatusTransitionAllowed(IEigenPod.VALIDATOR_STATUS statusBefore, IEigenPod.VALIDATOR_STATUS statusAfter) returns bool =
    (statusBefore == IEigenPod.VALIDATOR_STATUS.INACTIVE && statusAfter == IEigenPod.VALIDATOR_STATUS.ACTIVE)
    || (statusBefore == IEigenPod.VALIDATOR_STATUS.ACTIVE && statusAfter == IEigenPod.VALIDATOR_STATUS.WITHDRAWN);

// verifies that only the 2 allowed transitions of validator status occur
rule validatorStatusTransitionsCorrect(bytes32 pubkeyHash) {
    IEigenPod.VALIDATOR_STATUS statusBefore = validatorStatus(pubkeyHash);
    method f;
    env e;
    calldataarg args;
    f(e,args);
    IEigenPod.VALIDATOR_STATUS statusAfter = validatorStatus(pubkeyHash);
    assert(
        (statusBefore == statusAfter)
        || validatorStatusTransitionAllowed(statusBefore, statusAfter),
        "disallowed validator status transition occurred"
    );
}

// verifies that _validatorPubkeyHashToInfo[validatorPubkeyHash].mostRecentBalanceUpdateTimestamp can ONLY increase (or remain the same)
rule mostRecentBalanceUpdateTimestampOnlyIncreases(bytes32 validatorPubkeyHash) {
    IEigenPod.ValidatorInfo validatorInfoBefore = validatorPubkeyHashToInfo(validatorPubkeyHash);
    method f;
    env e;
    calldataarg args;
    f(e,args);
    IEigenPod.ValidatorInfo validatorInfoAfter = validatorPubkeyHashToInfo(validatorPubkeyHash);
    assert(validatorInfoAfter.mostRecentBalanceUpdateTimestamp >= validatorInfoBefore.mostRecentBalanceUpdateTimestamp,
        "mostRecentBalanceUpdateTimestamp decreased");
}

// verifies that if a validator is marked as 'INACTIVE', then it has no other entries set in its ValidatorInfo
invariant inactiveValidatorsHaveEmptyInfo(bytes32 pubkeyHash)
    (validatorStatus(pubkeyHash) == IEigenPod.VALIDATOR_STATUS.INACTIVE) => (
        get_validatorIndex(pubkeyHash) == 0
        && get_restakedBalanceGwei(pubkeyHash) == 0
        && get_mostRecentBalanceUpdateTimestamp(pubkeyHash) == 0);

// verifies that _validatorPubkeyHashToInfo[validatorPubkeyHash].validatorIndex can be set initially but otherwise can't change
// this can be understood as the only allowed transitions of index being of the form: 0 => anything (otherwise the index must stay the same)
rule validatorIndexSetOnlyOnce(bytes32 pubkeyHash) {
    requireInvariant inactiveValidatorsHaveEmptyInfo(pubkeyHash);
    uint64 validatorIndexBefore = get_validatorIndex(pubkeyHash);
    // perform arbitrary function call
    method f;
    env e;
    calldataarg args;
    f(e,args);
    uint64 validatorIndexAfter = get_validatorIndex(pubkeyHash);
    assert(validatorIndexBefore == 0 || validatorIndexAfter == validatorIndexBefore,
        "validator index modified from nonzero value");
}

// verifies that once a validator has its status set to WITHDRAWN, its ‘restakedBalanceGwei’ is *and always remains* zero
invariant withdrawnValidatorsHaveZeroRestakedGwei(bytes32 pubkeyHash)
    (validatorStatus(pubkeyHash) == IEigenPod.VALIDATOR_STATUS.INACTIVE) =>
        (get_restakedBalanceGwei(pubkeyHash) == 0);


// // TODO: see if this draft rule can be salvaged
// // draft rule to capture the following behavior (or at least most of it):
// // The core invariant that ought to be maintained across the EPM and the EPs is that
// // podOwnerShares[podOwner] + sum(sharesInQueuedWithdrawals) =
// // sum(_validatorPubkeyHashToInfo[validatorPubkeyHash].restakedBalanceGwei) + withdrawableRestakedExecutionLayerGwei

// // idea: if we ignore shares in queued withdrawals and rearrange, then we have:
// // sum(_validatorPubkeyHashToInfo[validatorPubkeyHash].restakedBalanceGwei) = 
// // EigenPodManager.podOwnerShares(podOwner) - withdrawableRestakedExecutionLayerGwei
// // we can track changes to the '_validatorPubkeyHashToInfo' mapping and check this with ghost variables

// based on Certora's example here https://github.com/Certora/Tutorials/blob/michael/ethcc/EthCC/Ghosts/ghostTest.spec
ghost mathint sumOfValidatorRestakedbalancesWei {
    // NOTE: this commented out line is broken, as calling functions in axioms is currently disallowed, but this is what we'd run ideally. 
    // init_state axiom sumOfValidatorRestakedbalancesWei == to_mathint(get_podOwnerShares()) - to_mathint(get_withdrawableRestakedExecutionLayerGwei() * 1000000000);

    // since both of these variables are zero at construction, just set the ghost to zero in the axiom
    init_state axiom sumOfValidatorRestakedbalancesWei == 0;
}

hook Sstore _validatorPubkeyHashToInfo[KEY bytes32 validatorPubkeyHash].restakedBalanceGwei uint64 newValue (uint64 oldValue) {
    sumOfValidatorRestakedbalancesWei = (
        sumOfValidatorRestakedbalancesWei + 
        to_mathint(newValue) * 1000000000 -
        to_mathint(oldValue) * 1000000000
    );
}

rule consistentAccounting() {
    // fetch info before call
    int256 podOwnerSharesBefore = get_podOwnerShares();
    uint256 withdrawableRestakedExecutionLayerGweiBefore = get_withdrawableRestakedExecutionLayerGwei();
    uint256 eigenPodBalanceBefore = get_ETH_Balance();
    // filter down to valid pre-states
    require(sumOfValidatorRestakedbalancesWei ==
        to_mathint(podOwnerSharesBefore) - to_mathint(withdrawableRestakedExecutionLayerGweiBefore));

    // perform arbitrary function call
    method f;
    env e;
    calldataarg args;
    f(e,args);

    // fetch info after call
    int256 podOwnerSharesAfter = get_podOwnerShares();
    uint256 withdrawableRestakedExecutionLayerGweiAfter = get_withdrawableRestakedExecutionLayerGwei();
    uint256 eigenPodBalanceAfter = get_ETH_Balance();
    /**
     * handling for weird, unrealistic edge case where calling `initialize` causes the pod owner to change, so the 
     * call to `get_podOwnerShares` queries the shares for a different address.
     * calling `initialize` should *not* change user shares, so it is unrealistic to simulate it doing so.
     */
    if (f.selector == sig:initialize(address).selector) {
        podOwnerSharesAfter = podOwnerSharesBefore;
    }
    // check post-state
    // TODO: this check is still broken for `withdrawRestakedBeaconChainETH` since it does a low-level call to transfer the ETH, which triggers optimistic fallback dispatching
    // special handling for one function
    if (f.selector == sig:withdrawRestakedBeaconChainETH(address,uint256).selector) {
        /* TODO: un-comment this once the dispatching is handled correctly
        assert(sumOfValidatorRestakedbalancesWei ==
            to_mathint(podOwnerSharesAfter) - to_mathint(withdrawableRestakedExecutionLayerGweiAfter)
            // adjustment term for the ETH balance of the contract changing
            + to_mathint(eigenPodBalanceBefore) - to_mathint(eigenPodBalanceAfter),
            "invalid post-state");
        */
        // TODO: delete this once the above is salvaged (was added since CVL forbids empty blocks)
        assert(true);
    // outside of special case, we don't need the adjustment term
    } else {
        assert(sumOfValidatorRestakedbalancesWei ==
            to_mathint(podOwnerSharesAfter) - to_mathint(withdrawableRestakedExecutionLayerGweiAfter),
            "invalid post-state");
    }
}

/*
rule baseInvariant() {
    int256 podOwnerSharesBefore = get_podOwnerShares();
    // perform arbitrary function call
    method f;
    env e;
    calldataarg args;
    f(e,args);
    int256 podOwnerSharesAfter = get_podOwnerShares();
    mathint podOwnerSharesDelta = podOwnerSharesAfter - podOwnerSharesBefore;
    assert(sumOfValidatorRestakedbalancesWei == podOwnerSharesDelta - to_mathint(get_withdrawableRestakedExecutionLayerGwei()),
        "base invariant violated");
}

invariant consistentAccounting() {
    sumOfValidatorRestakedbalancesWei ==
        to_mathint(get_withdrawableRestakedExecutionLayerGwei()) - to_mathint(get_withdrawableRestakedExecutionLayerGwei());
}
*/
````

## File: certora/specs/pods/EigenPodManager.spec
````
methods {
    //// External Calls
	// external calls to DelegationManager 
    function _.undelegate(address) external;
    function _.decreaseDelegatedShares(address,address,uint256) external;
	function _.increaseDelegatedShares(address,address,uint256) external;

    // external calls from DelegationManager to ServiceManager
    function _.updateStakes(address[]) external => NONDET;

	// external calls to Slasher
    function _.isFrozen(address) external => DISPATCHER(true);
	function _.canWithdraw(address,uint32,uint256) external => DISPATCHER(true);

	// external calls to StrategyManager
    function _.getDeposits(address) external => DISPATCHER(true);
    function _.slasher() external => DISPATCHER(true);
    function _.removeShares(address,address,uint256) external => DISPATCHER(true);
    function _.withdrawSharesAsTokens(address, address, uint256, address) external => DISPATCHER(true);

	// external calls to EigenPodManager
    function _.addShares(address,uint256) external => DISPATCHER(true);
    function _.removeShares(address,uint256) external => DISPATCHER(true);
    function _.withdrawSharesAsTokens(address, address, uint256) external => DISPATCHER(true);

    // external calls to EigenPod
	function _.withdrawRestakedBeaconChainETH(address,uint256) external => DISPATCHER(true);
    // external calls to PauserRegistry
    function _.isPauser(address) external => DISPATCHER(true);
	function _.unpauser() external => DISPATCHER(true);
	
    // envfree functions
    function ownerToPod(address podOwner) external returns (address) envfree;
    function getPod(address podOwner) external returns (address) envfree;
    function ethPOS() external returns (address) envfree;
    function eigenPodBeacon() external returns (address) envfree;
    function getBlockRootAtTimestamp(uint64 timestamp) external returns (bytes32) envfree;
    function strategyManager() external returns (address) envfree;
    function slasher() external returns (address) envfree;
    function hasPod(address podOwner) external returns (bool) envfree;
    function numPods() external returns (uint256) envfree;
    function podOwnerShares(address podOwner) external returns (int256) envfree;
    function beaconChainETHStrategy() external returns (address) envfree;

    // harnessed functions
    function get_podOwnerShares(address) external returns (int256) envfree;
    function get_podByOwner(address) external returns (address) envfree;
}

// verifies that podOwnerShares[podOwner] is never a non-whole Gwei amount
invariant podOwnerSharesAlwaysWholeGweiAmount(address podOwner)
    get_podOwnerShares(podOwner) % 1000000000 == 0;

// verifies that ownerToPod[podOwner] is set once (when podOwner deploys a pod), and can otherwise never be updated
rule podAddressNeverChanges(address podOwner) {
    address podAddressBefore = get_podByOwner(podOwner);
    // perform arbitrary function call
    method f;
    env e;
    calldataarg args;
    f(e,args);
    address podAddressAfter = get_podByOwner(podOwner);
    assert(podAddressBefore == 0 || podAddressBefore == podAddressAfter,
        "pod address changed after being set!");
}

// verifies that podOwnerShares[podOwner] can become negative (i.e. go from zero/positive to negative)
// ONLY as a result of a call to `recordBeaconChainETHBalanceUpdate`
rule limitationOnNegativeShares(address podOwner) {
    int256 podOwnerSharesBefore = get_podOwnerShares(podOwner);
    // perform arbitrary function call
    method f;
    env e;
    calldataarg args;
    f(e,args);
    int256 podOwnerSharesAfter = get_podOwnerShares(podOwner);
    if (podOwnerSharesAfter < 0) {
        if (podOwnerSharesBefore >= 0) {
            assert(f.selector == sig:recordBeaconChainETHBalanceUpdate(address, int256).selector,
                "pod owner shares became negative from calling an unqualified function!");
        } else {
            assert(
                (podOwnerSharesAfter >= podOwnerSharesBefore) ||
                (f.selector == sig:recordBeaconChainETHBalanceUpdate(address, int256).selector),
                "pod owner had negative shares decrease inappropriately"
            );
        }
    }
    // need this line to keep the prover happy :upside_down_face:
    assert(true);
}
````

## File: certora/specs/pods/EigenPodManagerRules.spec
````
using EigenPodManager as EigenPodManager;

methods {
    //// External Calls
	// external calls to DelegationManager 
    function _.undelegate(address) external;
    function _.decreaseDelegatedShares(address,address,uint256) external;
	function _.increaseDelegatedShares(address,address,uint256) external;

    // external calls from DelegationManager to ServiceManager
    function _.updateStakes(address[]) external => NONDET;

	// external calls to StrategyManager
    function _.getDeposits(address) external => DISPATCHER(true);

    // external calls to PauserRegistry
    function _.isPauser(address) external => DISPATCHER(true);
	function _.unpauser() external => DISPATCHER(true);
	
    // envfree functions
    function ownerToPod(address podOwner) external returns (address) envfree;
    function getPod(address podOwner) external returns (address) envfree;
    function ethPOS() external returns (address) envfree;
    function eigenPodBeacon() external returns (address) envfree;
    function hasPod(address podOwner) external returns (bool) envfree;
    function numPods() external returns (uint256) envfree;
    function beaconChainETHStrategy() external returns (address) envfree;

    function Create2.deploy(uint256,bytes32,bytes memory) internal returns (address) => NONDET;
}

// -----------------------------------------
// Constants and Definitions
// -----------------------------------------

definition WAD() returns uint64 = 1000000000000000000; // definition uint64 WAD = 1e18
// -----------------------------------------
// Ghost Mappings and Mirroring
// -----------------------------------------

// Mirror `_beaconChainSlashingFactor`
ghost mapping(address =>  uint64) slashingFactorsGhost {
    init_state axiom forall address staker . slashingFactorsGhost[staker] == 0;
}

// -----------------------------------------
// Hooks for Synchronizing Ghost Mappings
// -----------------------------------------

// Sync slashingFactor when `_beaconChainSlashingFactor` is updated
hook Sstore EigenPodManager._beaconChainSlashingFactor[KEY address operator].slashingFactor uint64 newSlashingFactor (uint64 oldSlashingFactor) {
    require oldSlashingFactor == slashingFactorsGhost[operator];
    slashingFactorsGhost[operator] = newSlashingFactor;
}
hook Sload uint64 slashingFactor EigenPodManager._beaconChainSlashingFactor[KEY address operator].slashingFactor {
    require slashingFactor == slashingFactorsGhost[operator];
}

// -----------------------------------------
// Invariants And Protocol Rules
// -----------------------------------------

/// @title Verifies that ownerToPod[podOwner] is set once (when podOwner deploys a pod), and can otherwise never be updated
/// @property Pod address immutability
rule podAddressNeverChanges(address podOwner) {
   address podAddressBefore = EigenPodManager.ownerToPod[podOwner];
   // perform arbitrary function call
   method f;
   env e;
   calldataarg args;
   f(e,args);
   address podAddressAfter = EigenPodManager.ownerToPod[podOwner];
   assert(podAddressBefore == 0 || podAddressBefore == podAddressAfter,
       "pod address changed after being set!");
}

/// @title BeaconChainSlashingFactor is initialized as WAD and only decreases.
/// @property BeaconChainSlashingFactor is montonically decreasing
rule BeaconChainSlashingFactorMonotonicDec(method f, address staker) {
    env e;
    calldataarg args;

    uint64 BeaconChainSlashingFactorPre = slashingFactorsGhost[staker];
    require BeaconChainSlashingFactorPre <= WAD();

        f(e, args);

    uint64 BeaconChainSlashingFactorPost = slashingFactorsGhost[staker];

    assert BeaconChainSlashingFactorPre >= BeaconChainSlashingFactorPost;
}

/// @title Verifies that podOwnerDepositShares can't go negative, assuming the current balance is a positive int256 value in podOwnerDepositShares
/// @property Pod owner deposited shares remain positive
invariant podOwnerDepositSharesRemainPositive(address podOwner) 
    EigenPodManager.podOwnerDepositShares[podOwner] >= 0;

/// @title This rule verifies that when a specified amount of deposit shares is removed from a staker's account, the staker's total deposited shares decrease exactly by that amount.
/// @property Remove Deposit Shares Integrity 
rule integrityOfRemoveDepositShares(address staker, address strategy, uint256 depositSharesToRemove) {
    env e;
    // max int256 is 2^255 - 1 since first bit is the sign bit
    int256 maxInt256 = (1 << 255) - 1;
    int256 depositedSharesPre = EigenPodManager.podOwnerDepositShares[staker];

        removeDepositShares(e, staker, strategy, depositSharesToRemove);

    int256 depositedSharesPost = EigenPodManager.podOwnerDepositShares[staker];

    if (depositSharesToRemove > maxInt256 || depositedSharesPre < depositSharesToRemove) {
        // invalid depositSharesToRemove should revert and not affect depositShares
        assert depositedSharesPost == depositedSharesPre;
    } else {
        // valid depositSharesToRemove should decrease depositShares
        assert depositedSharesPost == depositedSharesPre - depositSharesToRemove;
    }
}

/// @title 
/*
This rule verifies that when shares are added via the addShares function, 
the staker’s deposit shares increase by exactly the specified amount. 
It also confirms that the function returns the expected number of added shares and 
that the recorded previous deposit shares match the pre-operation value.
*/
/// @property Add Shares Integrity
rule integrityOfAddShares(address staker, address strategy, uint256 shares) {
    env e;

    int256 prevDepositSharesPre = EigenPodManager.podOwnerDepositShares[staker];

    uint256 returnedPrevDeposit; 
    uint256 returnedShares;

    (returnedPrevDeposit, returnedShares) = addShares(e, staker, strategy, shares);

    int256 updatedDepositSharesPost = EigenPodManager.podOwnerDepositShares[staker];

    // Verify that deposit shares have been updated correctly
    assert updatedDepositSharesPost == prevDepositSharesPre + shares;

    // If the updated deposit shares are non-positive, the function should return (0, 0)
    if (updatedDepositSharesPost <= 0) {
        assert returnedPrevDeposit == 0 && returnedShares == 0;
    } else {
        // Otherwise, if the pre-existing deposit shares were negative, the returned previous deposit should be 0 and the shares should be the updated deposited shares;
        // if non-negative, it should equal the pre-state value.
        if (prevDepositSharesPre < 0) {
            assert returnedPrevDeposit == 0 && returnedShares == updatedDepositSharesPost;
        } else {
            assert returnedPrevDeposit == prevDepositSharesPre && returnedShares == shares;
        }
    }
}

/// @title 
/*
This rule ensures correct behavior during token withdrawal. 
It checks that if a staker’s deposited shares are negative before the withdrawal, 
then afterward they either become zero or are increased by exactly the withdrawn shares. Conversely, 
if the deposited shares are non-negative, the withdrawal operation does not alter the staker’s deposited shares.
*/
/// @property Integrity Of Withdraw Shares As Tokens
rule integrityOfWithdrawSharesAsTokens(address staker, address strategy, address erc20, uint256 shares) {
    env e;

    int256 depositedSharesPre = EigenPodManager.podOwnerDepositShares[staker];

        withdrawSharesAsTokens(e, staker, strategy, erc20, shares);

    int256 depositedSharesPost = EigenPodManager.podOwnerDepositShares[staker];

    assert depositedSharesPre < 0 => depositedSharesPost == 0 || depositedSharesPost == depositedSharesPre + shares;
    assert depositedSharesPre >= 0 => depositedSharesPre == depositedSharesPost;
}

/// @title This rule checks that if shares are first added and then removed with the same amount, the staker's total deposited shares remain unchanged, confirming that the operations cancel each other out.
/// @property Add-Then-Remove Shares Neutrality
rule addThenRemoveSharesNoEffect(address staker, address strategy, uint256 depositSharesToRemove) {
    env e;

    int256 depositedSharesPre = EigenPodManager.podOwnerDepositShares[staker];

        addShares(e, staker, strategy, depositSharesToRemove);

        removeDepositShares(e, staker, strategy, depositSharesToRemove);

    int256 depositedSharesPost = EigenPodManager.podOwnerDepositShares[staker];
    
    assert depositedSharesPost == depositedSharesPre;
}

/// @title This rule confirms that if shares are removed and subsequently re-added with the same amount, the overall balance of the staker's deposited shares is preserved, ensuring no net effect from the operations.
/// @property Remove-Then-Add Shares Neutrality
rule removeThenAddSharesNoEffect(address staker, address strategy, uint256 depositSharesToRemove) {
    env e;

    int256 depositedSharesPre = EigenPodManager.podOwnerDepositShares[staker];

        removeDepositShares(e, staker, strategy, depositSharesToRemove);

        addShares(e, staker, strategy, depositSharesToRemove);

    int256 depositedSharesPost = EigenPodManager.podOwnerDepositShares[staker];
    
    assert depositedSharesPost == depositedSharesPre;
}
````

## File: certora/specs/strategies/StrategyBase.spec
````
using StrategyManager as strategyManager;
methods {
    // external calls to PauserRegistry
    function _.isPauser(address) external => DISPATCHER(true);
	function _.unpauser() external => DISPATCHER(true);

    // external calls to ERC20
    function _.balanceOf(address) external => DISPATCHER(true);
    function _.transfer(address, uint256) external => DISPATCHER(true);
    function _.decimals() external => DISPATCHER(true);

    // envfree functions
    function totalShares() external returns (uint256) envfree;
    function underlyingToken() external returns (address) envfree;
    function sharesToUnderlyingView(uint256) external returns (uint256) envfree;
    function sharesToUnderlying(uint256) external returns (uint256) envfree;
    function underlyingToSharesView(uint256) external returns (uint256) envfree;
    function underlyingToShares(uint256) external returns (uint256) envfree;
    function shares(address) external returns (uint256) envfree;
}

// // idea based on OpenZeppelin invariant -- see https://github.com/OpenZeppelin/openzeppelin-contracts/blob/formal-verification/certora/specs/ERC20.spec#L8-L22
// ghost sumOfShares() returns uint256 {
//   init_state axiom sumOfShares() == 0;
// }

// hook Sstore currentContract.strategyManager.stakerStrategyShares[KEY address staker][KEY address strategy] uint256 newValue (uint256 oldValue) STORAGE {
//     havoc sumOfShares assuming sumOfShares@new() == sumOfShares@old() + newValue - oldValue;
// }

// invariant totalSharesIsSumOfShares()
//     totalShares() == sumOfShares()

use builtin rule sanity;
````

## File: certora/specs/erc20cvl.spec
````
methods {
    // ERC20 standard
    function _.name()                                            external => NONDET; // can we use PER_CALLEE_CONSTANT?
    function _.symbol()                                          external => NONDET; // can we use PER_CALLEE_CONSTANT?
    function _.decimals()                                        external => PER_CALLEE_CONSTANT;
    function _.totalSupply()                                     external => totalSupplyCVL(calledContract) expect uint256;
    function _.balanceOf(address a)                              external => balanceOfCVL(calledContract, a) expect uint256;
    function _.allowance(address a, address b)                   external => allowanceCVL(calledContract, a, b) expect uint256;
    function _.approve(address a, uint256 x)                     external with (env e) => approveCVL(calledContract, e.msg.sender, a, x) expect bool;
    function _.transfer(address a, uint256 x)                    external with (env e) => transferCVL(calledContract, e.msg.sender, a, x) expect bool;
    function _.transferFrom(address a, address b, uint256 x)     external with (env e) => transferFromCVL(calledContract, e.msg.sender, a, b, x) expect bool;
    function _.safeTransferFrom(address a, address b, uint256 x) external with (env e) => safeTransferFromCVL(calledContract, e.msg.sender, a, b, x) expect void;
}


/// CVL simple implementations of IERC20:
/// token => totalSupply
ghost mapping(address => uint256) totalSupplyByToken;
/// token => account => balance
ghost mapping(address => mapping(address => uint256)) balanceByToken;
/// token => owner => spender => allowance
ghost mapping(address => mapping(address => mapping(address => uint256))) allowanceByToken;

// function tokenBalanceOf(address token, address account) returns uint256 {
//     return balanceByToken[token][account];
// }

function totalSupplyCVL(address t) returns uint256 {
    return totalSupplyByToken[t];
}

function balanceOfCVL(address t, address a) returns uint256 {
    return balanceByToken[t][a];
}

function allowanceCVL(address t, address a, address b) returns uint256 {
    return allowanceByToken[t][a][b];
}

function approveCVL(address t, address approver, address spender, uint256 amount) returns bool {
    // should be randomly reverting xxx
    bool nondetSuccess;
    if (!nondetSuccess) return false;

    allowanceByToken[t][approver][spender] = amount;
    return true;
}

function transferFromCVL(address t, address spender, address from, address to, uint256 amount) returns bool {
    // should be randomly reverting xxx
    bool nondetSuccess;
    if (!nondetSuccess) return false;

    if (allowanceByToken[t][from][spender] < amount) return false;
    allowanceByToken[t][from][spender] = assert_uint256(allowanceByToken[t][from][spender] - amount);
    return transferCVL(t, from, to, amount);
}

function safeTransferFromCVL(address t, address spender, address from, address to, uint256 amount) {
    bool nondetSuccess;
    if (!nondetSuccess) require false;
    transferFromCVL(t, spender, from, to, amount);
}

function transferCVL(address t, address from, address to, uint256 amount) returns bool {
    // should be randomly reverting xxx
    bool nondetSuccess;
    if (!nondetSuccess) return false;

    if(balanceByToken[t][from] < amount) return false;
    balanceByToken[t][from] = assert_uint256(balanceByToken[t][from] - amount);
    balanceByToken[t][to] = require_uint256(balanceByToken[t][to] + amount);  // We neglect overflows.
    return true;
}
````

## File: certora/specs/Merkle.spec
````
methods {
    function Merkle._ external => NONDET;
}
````

## File: certora/specs/optimizations.spec
````
// optimizing summaries

methods {
    function Math.mulDiv(uint256 x, uint256 y, uint256 denominator) internal returns (uint256) => cvlMulDiv(x, y, denominator);
    function Math.mulDiv(uint256 x, uint256 y, uint256 denominator, Math.Rounding rounding) internal returns (uint256) => cvlMulDivDirectional(x, y, denominator, rounding);
    function MathUpgradeable.average(uint256 a, uint256 b) internal returns (uint256) => cvlAverage(a, b);
}

function cvlMulDiv(uint256 x, uint256 y, uint256 denominator) returns uint256 {
    require denominator != 0;
    return require_uint256(x*y/denominator);
}

function cvlMulDivUp(uint256 x, uint256 y, uint256 denominator) returns uint256 {
    require denominator != 0;
    return require_uint256((x*y + denominator - 1)/denominator);
}

function cvlMulDivDirectional(uint256 x, uint256 y, uint256 denominator, Math.Rounding rounding) returns uint256 {
    if (rounding == Math.Rounding.Up) {
        return cvlMulDivUp(x, y, denominator);
    } else {
        return cvlMulDiv(x, y, denominator);
    }
}

function cvlAverage(uint256 a, uint256 b) returns uint256 {
    return require_uint256((a+b)/2);
}
````

## File: certora/specs/ptaHelpers.spec
````
// Helpers to make Points-to-analysis work
using ShortStringsUpgradeableHarness as ShortStringsUpgradeableHarness;

methods {
    function ShortStringsUpgradeable.toString(ShortStringsUpgradeableHarness.ShortString sstr) internal returns (string memory) => cvlToString(sstr);
    function ShortStringsUpgradeableHarness.toStringHarness(ShortStringsUpgradeableHarness.ShortString sstr) external returns (string memory) envfree;
}

function cvlToString(ShortStringsUpgradeableHarness.ShortString sstr) returns string {
    return ShortStringsUpgradeableHarness.toStringHarness(sstr);
}
````

## File: CHANGELOG/CHANGELOG-1.5.0.md
````markdown
# v1.5.0 Redistribution

## Release Manager

@0xClandestine @ypatil12

## Highlights

🚀 New features

- Redistribution is a feature that gives Service Builders a means to not just burn, but repurpose slashed funds.
- We introduce a new operatorSet creation mechanism: [`AllocationManager.createRedistributingOperatorSets`](../docs/core/AllocationManager.md#createredistributingoperatorsets), which allows slashed funds to be redistributed to a `RedistributionRecipient`. *Note: The redistribution recipient can be set only once and is immutable*. 
- *All slashed funds now follow a two-step process.* During a slash, we increase burn or redistributable shares. A cronjob then handles the actual redistribution or burning of these shares.
- The original `createOperatorSets` function still exists. This function creates operatorSets whose slashed funds will eventually be burned. There is no mechanism to convert an operatorSet to be redistributing. 
- See [ELIP-006](https://github.com/eigenfoundation/ELIPs/blob/main/ELIPs/ELIP-006.md) for a full description. 

📌 Future Deprecations 
- The pre-redistribution burn pathway [`StrategyManager.decreaseBurnableShares`](../docs/core/StrategyManager.md#burnshares) will be deprecated in an upgrade *after* the redistribution release. This function can still be used to burn shares that have been slashed at any point prior to the redistribution upgrade. 

🛠️ Security Updates
- The slashing of burned funds is no longer instantaneous. All slashed funds (burned or redistributed) now go through a two-step process where shares are first marked for burning/redistribution, then processed by a cronjob. The burning or redistribution of slashed funds can be paused by the `PauserMultisig`. 

🔧 Improvements
- The [`AllocationManager.slashOperator`](../docs/core/AllocationManager.md#slashoperator) function now returns a `slashId` and array of `shares` to be burned/redistributed. **The function selector remains the same.**
- OperatorSets now have a `slashCount` field, which returns the number of slashes completed by the operatorSet. This value only reflects the number of slashes after the redistribution upgrade.
- `StrategyBase` returns an `amountOut` upon withdrawal to comply with standard ERC-4626 vaults. 
- The `AllocationManager` and `DelegationManager` no longer use ownable. Thus, they now inherit the `Deprecated_OwnableUpgradeable` mixin in its place to reduce codesize. 

🐛 Bug Fixes
- `SemVerMixin` is updated to only return the first character of `majorVersion`. We currently return `1.` and will return `1` after this upgrade. 


## Changelog
- feat(draft): `AllocationManager` redistribution support [PR #1346](https://github.com/layr-labs/eigenlayer-contracts/pull/1346)
- feat: redistribution upgrade script [PR #1396](https://github.com/layr-labs/eigenlayer-contracts/pull/1396)
- chore: bindings [PR #1422](https://github.com/layr-labs/eigenlayer-contracts/pull/1422)
- test: redistribution upgrade [PR #1410](https://github.com/layr-labs/eigenlayer-contracts/pull/1410)
- test: redistribution integration [PR #1415](https://github.com/layr-labs/eigenlayer-contracts/pull/1415)
- docs: redistribution [PR #1409](https://github.com/layr-labs/eigenlayer-contracts/pull/1409)
- chore: address redistribution nits [PR #1420](https://github.com/layr-labs/eigenlayer-contracts/pull/1420)
- chore: style updates [PR #1416](https://github.com/layr-labs/eigenlayer-contracts/pull/1416)
- perf: avoid binary search [PR #1417](https://github.com/layr-labs/eigenlayer-contracts/pull/1417)
- feat: release escrow by strategy [PR #1412](https://github.com/layr-labs/eigenlayer-contracts/pull/1412)
- refactor: review changes [PR #1411](https://github.com/layr-labs/eigenlayer-contracts/pull/1411)
- refactor: `decreaseBurnOrRedistributableShares` [PR #1414](https://github.com/layr-labs/eigenlayer-contracts/pull/1414)
- feat: deploy escrow in `initiateSlashEscrow` [PR #1413](https://github.com/layr-labs/eigenlayer-contracts/pull/1413)
- chore: update naming [PR #1408](https://github.com/layr-labs/eigenlayer-contracts/pull/1408)
- feat: simplify escrow delay; add convenience functions [PR #1406](https://github.com/layr-labs/eigenlayer-contracts/pull/1406)
- fix: enumerable map overwrite [PR #1399](https://github.com/layr-labs/eigenlayer-contracts/pull/1399)
- chore: decrease dm diff further  [PR #1404](https://github.com/layr-labs/eigenlayer-contracts/pull/1404)
- test: full coverage `SlashEscrowFactory` + `SlashEscrow` [PR #1403](https://github.com/layr-labs/eigenlayer-contracts/pull/1403)
- chore: remove dm/alm code size optimizations [PR #1398](https://github.com/layr-labs/eigenlayer-contracts/pull/1398)
- chore: rename burnable -> burnOrRedistributable; fix storage gap; remove poc code [PR #1397](https://github.com/layr-labs/eigenlayer-contracts/pull/1397)
- chore: use internal getters; update `isOperatorRedistributable` [PR #1401](https://github.com/layr-labs/eigenlayer-contracts/pull/1401)
- fix: storage checker [PR #1394](https://github.com/layr-labs/eigenlayer-contracts/pull/1394)
- fix: review issues [PR #1391](https://github.com/layr-labs/eigenlayer-contracts/pull/1391)
- feat: escrow funds in unique clone contracts [PR #1387](https://github.com/layr-labs/eigenlayer-contracts/pull/1387)
- refactor: remove `v` prefix from `SemVerMixin` [PR #1385](https://github.com/layr-labs/eigenlayer-contracts/pull/1385)
- test(redistribution): add unit tests  [PR #1383](https://github.com/layr-labs/eigenlayer-contracts/pull/1383)
- feat: add `SlashingWithdrawalRouter` [PR #1358](https://github.com/layr-labs/eigenlayer-contracts/pull/1358)
- feat: simplify removeDepositShares in StrategyManager [PR #1373](https://github.com/layr-labs/eigenlayer-contracts/pull/1373)
- feat(draft): `AllocationManager` redistribution support [PR #1346](https://github.com/layr-labs/eigenlayer-contracts/pull/1346)
- ci: add explicit permissions to workflows to  mitigate security concerns [PR #1392](https://github.com/layr-labs/eigenlayer-contracts/pull/1392)
- ci: remove branch constraint for foundry coverage job
- docs: add release managers to changelogs
- docs: add templates for changelog and release notes [PR #1382](https://github.com/layr-labs/eigenlayer-contracts/pull/1382)
- docs: add doc for steps to write deploy scripts [PR #1380](https://github.com/layr-labs/eigenlayer-contracts/pull/1380)
- ci: add testnet envs sepolia and hoodi to validate-deployment-scripts [PR #1378](https://github.com/layr-labs/eigenlayer-contracts/pull/1378)
- docs: update MAINTENANCE to include practices of merging multiple release-dev branches
- docs: updating readme for dead links, readability, new language, and more [PR #1377](https://github.com/layr-labs/eigenlayer-contracts/pull/1377)
- docs: bump deployment matrix to top of README [PR #1376](https://github.com/layr-labs/eigenlayer-contracts/pull/1376)
- ci: add CI to auto validate deployment scripts [PR #1360](https://github.com/layr-labs/eigenlayer-contracts/pull/1360)
- chore: update readme for v1.4.1 [PR #1361](https://github.com/layr-labs/eigenlayer-contracts/pull/1361)
- ci: add cron to auto remove stale branches [PR #1348](https://github.com/layr-labs/eigenlayer-contracts/pull/1348)
- chore: Update README for Holesky v1.4.2 release [PR #1351](https://github.com/layr-labs/eigenlayer-contracts/pull/1351)
- docs: remove fork-pr instructions from CONTRIBUTING.md and MAINTENANCE.md
- ci: disable delete unauthorized branches
- docs: update addresses for mainnet [PR #1341](https://github.com/layr-labs/eigenlayer-contracts/pull/1341)
- docs: enrich MAINTENANCE.md re: release branches [PR #1340](https://github.com/layr-labs/eigenlayer-contracts/pull/1340)
- ci: enable auto delete branch upon eigengit launch [PR #1339](https://github.com/layr-labs/eigenlayer-contracts/pull/1339)
- test(redistribution-changes): passing [PR #1511](https://github.com/layr-labs/eigenlayer-contracts/pull/1511)
- fix: strategy manager gap [PR #1508](https://github.com/layr-labs/eigenlayer-contracts/pull/1508)
- refactor: remove redistribution delay [PR #1485](https://github.com/layr-labs/eigenlayer-contracts/pull/1485)
- docs(audit): note upgrade rescue flow [PR #1467](https://github.com/layr-labs/eigenlayer-contracts/pull/1467)
- fix(audit): assert redistribution recipient != burn address [PR #1466](https://github.com/layr-labs/eigenlayer-contracts/pull/1466)
- fix(audit): more reentrancy checks [PR #1450](https://github.com/layr-labs/eigenlayer-contracts/pull/1450)
- fix(audit): out-of-gas issue [PR #1459](https://github.com/layr-labs/eigenlayer-contracts/pull/1459)
````

## File: CHANGELOG/CHANGELOG-1.6.0.md
````markdown
# v1.6.0 Moocow and ELIP5

## Release Manager

@wadealexc @bowenli86

## Highlights

🚀 **New Features**
- New APIs supporting Pectra's validator consolidation and withdrawal features: `EigenPod.requestConsolidation(...)` and `EigenPod.requestWithdrawal(...)`
- New getters to support Pectra APIs: `EigenPod.getConsolidationRequestFee()` and `EigenPod.getWithdrawalRequestFee()`
- Added 4 new events to `EigenPod.sol` to track consolidation and withdrawal requests
- Added 2 new events to `Eigen.sol` to track token wraps/unwraps with `BackingEigen`

📌 **Deprecations**
- Removed `EigenPod.GENESIS_TIME()` getter. This method, though public, has been unused for over a year.

🔧 **Improvements**
- When finalizing an `EigenPod` checkpoint (`proofsRemaining == 0`), the contract will store the finalized checkpoint in storage. This can be queried via `EigenPod.currentCheckpoint()`. Starting a new checkpoint will overwrite this previously-finalized checkpoint.
- Added semver to `Eigen`
- Signatures of a few `EigenPod` events are changed to match the rest events and take validator pubkey hash instead of validator index, which standardized `EigenPod` events signature

🐛 Bug Fixes
- For Hoodi, updates fixes ethPOS deposit contract to point to `0x00000000219ab540356cBB839Cbe05303d7705Fa`

## Changelog

- feat: merge Moocow and ELIP5 into main [PR #1425](https://github.com/layr-labs/eigenlayer-contracts/pull/1425)
- docs: proper markdown [PR #1435](https://github.com/layr-labs/eigenlayer-contracts/pull/1435)
- docs: update readme
- chore: update testnet addresses for redistribution [PR #1428](https://github.com/layr-labs/eigenlayer-contracts/pull/1428)
- chore: remove User_M2.t.sol
- feat: update EIGEN binding
- chore: resolve conflicts in upgrade.json
- chore: update harness class formatting
- chore: complete v1.6.0 changelog
- chore: changelog and bindings
- test: add more script tests for Eigen and standardize semver
- feat: add semver to eigen [PR #1371](https://github.com/layr-labs/eigenlayer-contracts/pull/1371)
- feat: add TokenWrapped and TokenUnwrapped events in Eigen for observability [PR #1356](https://github.com/layr-labs/eigenlayer-contracts/pull/1356)
- feat: change eigenpod events to use pubkeyHash over index
- feat: release scripts for moocow and elip5
- feat: currentCheckpoint now returns finalized checkpoint
- feat: implement consolidation and withdrawal requests
````

## File: CHANGELOG/CHANGELOG-1.6.1.md
````markdown
# v1.6.1 Electra Timing Fix

Fixes a bug on EigenPods regarding partial withdrawals for Electra. Please read the [explainer](https://hackmd.io/@rNlehaDSRBydbF_i_McDcw/ByyodLJ9ex) for a detailed description of the bug. **No action is needed and no customer funds are at risk.**

## Release Manager

@ypatil12 

## Highlights

🐛 *Bug Fixes*
- Update the `EigenPod.requestWithdrawal` function to ensure that validators are pointed to the pod, matching the behavior of `requestConsolidation`

🔧 *Improvements*
- Update the `EigenPod.verifyWithdrawalCredentials` function to only accept `beaconTimestamps` that are after the `latestCheckpointTimestamp`. This enables the eigenpod state machine to be easier to be reasoned about
````

## File: CHANGELOG/CHANGELOG-1.7.0.md
````markdown
# v1.7.0 Multi Chain

The multichain release enables AVSs to launch their services and make verified Operator outputs available on any EVM chain, meeting their customers where they are. AVSs can specify custom operator weights to be transported to any destination chain. The release has 3 components:

1. Core Contracts
2. AVS Contracts
3. Offchain Infrastructure

The below release notes cover Core Contracts. For more information on the end to end protocol, see our [docs](../docs/multichain/README.md) and [ELIP-008](https://github.com/eigenfoundation/ELIPs/blob/main/ELIPs/ELIP-008.md).

## Release Manager

@ypatil12 @eigenmikem

## Highlights

This multichain release only introduces new standards and contracts. As a result, there are no breaking changes or deprecations. 

🚀 New Features – Highlight major new functionality

Source-Chain Contracts
- `KeyRegistrar`: Manages cryptographic keys for operators across different operator sets. It supports both ECDSA and BN254 key types and ensures global uniqueness of keys across all operator sets
- `CrossChainRegistry`: Enables AVSs to register to have their operator stakes transported to supported destination chains
- `ReleaseManager`: Provides a standardized way for AVSs to publish software artifacts (binaries, docker images, etc.) that operators in their operator sets should upgrade to by specified deadlines

Destination Chain Contracts
- `CertificateVerifier`: Proves the offchain execution of a task, via a Certificate, by the operators of an operatorSet. Two types of key material are supported: ECDSA and BN254
- `OperatorTableUpdater`: Updates operator tables in the `CertificateVerifier` to have tasks validated against up-to-date operator stake weights 

🔧 Improvements – Enhancements to existing features.

- The multichain protocol has protocol-ized several AVS-deployed contracts, enabling an simpler AVS developer experience. These include:
    - `KeyRegistrar`: Manages BLS and ECDSA signing keys. AVSs no longer have to deploy a `BLSAPKRegistry`
    - `CertificateVerifier`: Handles signature verification for BLS and ECDSA keys. AVSs no longer have to deploy a `BLSSignatureChecker`
    - Offchain Multichain Transport: AVSs no longer have to maintain [avs-sync](https://github.com/Layr-Labs/avs-sync) to keep operator stakes fresh

## Changelog

- fix: multichain deploy scripts [PR #1510](https://github.com/layr-labs/eigenlayer-contracts/pull/1510)
- test: multichain integration tests [PR #1528](https://github.com/layr-labs/eigenlayer-contracts/pull/1528)
- fix: multichain clarity updates [PR #1527](https://github.com/layr-labs/eigenlayer-contracts/pull/1527)
- refactor: table calc interface [PR #1525](https://github.com/layr-labs/eigenlayer-contracts/pull/1525)
- docs: update README for v1.5.0 & v1.6.0 [PR #1526](https://github.com/layr-labs/eigenlayer-contracts/pull/1526)
- docs: update ecdsa vc func
- docs: fix ordering of cv funcs
- chore: use bps_denominator in ecdsa cv
- chore: domain separator no chain id doc
- chore: use uint256 for index
- chore: is spent
- fix: cert verifier typo
- fix: by hash docs consistency
- refactor: cleaner reverts for `ECDSACertificateVerifier` [PR #1521](https://github.com/layr-labs/eigenlayer-contracts/pull/1521)
- docs: clear up certificate verification  [PR #1515](https://github.com/layr-labs/eigenlayer-contracts/pull/1515)
- docs: add final audit reports
- feat: key data reverse lookup  [PR #1520](https://github.com/layr-labs/eigenlayer-contracts/pull/1520)
- fix: remove unused constants and add gap [PR #1519](https://github.com/layr-labs/eigenlayer-contracts/pull/1519)
- refactor: remove unnecessary signature validation and change param name [PR #1509](https://github.com/layr-labs/eigenlayer-contracts/pull/1509)
- docs: update CHANGELOG [PR #1514](https://github.com/layr-labs/eigenlayer-contracts/pull/1514)
- docs(redistribution-changes): cleanup [PR #1513](https://github.com/layr-labs/eigenlayer-contracts/pull/1513)
- test(redistribution-changes): passing [PR #1511](https://github.com/layr-labs/eigenlayer-contracts/pull/1511)
- fix: strategy manager gap [PR #1508](https://github.com/layr-labs/eigenlayer-contracts/pull/1508)
- refactor: remove redistribution delay [PR #1485](https://github.com/layr-labs/eigenlayer-contracts/pull/1485)
- docs(audit): note upgrade rescue flow [PR #1467](https://github.com/layr-labs/eigenlayer-contracts/pull/1467)
- fix(audit): assert redistribution recipient != burn address [PR #1466](https://github.com/layr-labs/eigenlayer-contracts/pull/1466)
- fix(audit): more reentrancy checks [PR #1450](https://github.com/layr-labs/eigenlayer-contracts/pull/1450)
- fix(audit): out-of-gas issue [PR #1459](https://github.com/layr-labs/eigenlayer-contracts/pull/1459)
- chore: add final moocow audit
- docs: changelog [PR #1504](https://github.com/layr-labs/eigenlayer-contracts/pull/1504)
- feat: multichain deploy scripts [PR #1487](https://github.com/layr-labs/eigenlayer-contracts/pull/1487)
- feat: operator table updater pauser [PR #1501](https://github.com/layr-labs/eigenlayer-contracts/pull/1501)
- feat: add `publishMetadataURI` [PR #1492](https://github.com/layr-labs/eigenlayer-contracts/pull/1492)
- refactor: `globalRootConfirmerSet` -> `generator` [PR #1500](https://github.com/layr-labs/eigenlayer-contracts/pull/1500)
- fix: circular dependency for initial global root update [PR #1499](https://github.com/layr-labs/eigenlayer-contracts/pull/1499)
- chore: remove stale bindings [PR #1498](https://github.com/layr-labs/eigenlayer-contracts/pull/1498)
- fix: zero length [PR #1490](https://github.com/layr-labs/eigenlayer-contracts/pull/1490)
- docs: multichain docs [PR #1488](https://github.com/layr-labs/eigenlayer-contracts/pull/1488)
- refactor: remove table calculators [PR #1493](https://github.com/layr-labs/eigenlayer-contracts/pull/1493)
- refactor: `KeyRegistry` unit testing [PR #1482](https://github.com/layr-labs/eigenlayer-contracts/pull/1482)
- feat: disable root [PR #1481](https://github.com/layr-labs/eigenlayer-contracts/pull/1481)
- refactor: `ECDSATableCalculator` testing [PR #1479](https://github.com/layr-labs/eigenlayer-contracts/pull/1479)
- refactor: operators can deregister keys if not slashable [PR #1480](https://github.com/layr-labs/eigenlayer-contracts/pull/1480)
- refactor: `ECDSACertificateVerifier` testing [PR #1478](https://github.com/layr-labs/eigenlayer-contracts/pull/1478)
- refactor: `Bn254CertificateVerifierUnitTests` [PR #1476](https://github.com/layr-labs/eigenlayer-contracts/pull/1476)
- feat: ecdsa table calculator [PR #1473](https://github.com/layr-labs/eigenlayer-contracts/pull/1473)
- feat: ecdsacv views [PR #1475](https://github.com/layr-labs/eigenlayer-contracts/pull/1475)
- refactor: `BN254OperatorTableCalculator` [PR #1463](https://github.com/layr-labs/eigenlayer-contracts/pull/1463)
- feat: add `referenceBlockNumber` [PR #1472](https://github.com/layr-labs/eigenlayer-contracts/pull/1472)
- feat: release manager [PR #1469](https://github.com/layr-labs/eigenlayer-contracts/pull/1469)
- feat: ecdsa cert verifier [PR #1470](https://github.com/layr-labs/eigenlayer-contracts/pull/1470)
- feat: add view function for `getGlobalConfirmerSetReferenceTimestamp` [PR #1471](https://github.com/layr-labs/eigenlayer-contracts/pull/1471)
- chore: add helper view function [PR #1465](https://github.com/layr-labs/eigenlayer-contracts/pull/1465)
- chore: add sig digest functions to interface [PR #1464](https://github.com/layr-labs/eigenlayer-contracts/pull/1464)
- refactor: `CrossChainRegistry` [PR #1457](https://github.com/layr-labs/eigenlayer-contracts/pull/1457)
- fix: global table update message hash [PR #1460](https://github.com/layr-labs/eigenlayer-contracts/pull/1460)
- refactor: sig verification into library [PR #1455](https://github.com/layr-labs/eigenlayer-contracts/pull/1455)
- fix: `OperatorTableUpdater` encoding [PR #1456](https://github.com/layr-labs/eigenlayer-contracts/pull/1456)
- chore: add latest `referenceTimestamp` to OTC interface [PR #1454](https://github.com/layr-labs/eigenlayer-contracts/pull/1454)
- chore: bindings [PR #1452](https://github.com/layr-labs/eigenlayer-contracts/pull/1452)
- feat: add operator table updater to CCR [PR #1451](https://github.com/layr-labs/eigenlayer-contracts/pull/1451)
- chore: multichain deploy scripts [PR #1449](https://github.com/layr-labs/eigenlayer-contracts/pull/1449)
- feat: cross chain registry [PR #1439](https://github.com/layr-labs/eigenlayer-contracts/pull/1439)
- chore: update BN254CertificateVerifier [PR #1447](https://github.com/layr-labs/eigenlayer-contracts/pull/1447)
- feat: bn254 operator table contracts [PR #1429](https://github.com/layr-labs/eigenlayer-contracts/pull/1429)
- feat: KeyRegistrar [PR #1421](https://github.com/layr-labs/eigenlayer-contracts/pull/1421)
- feat: operator table updater [PR #1436](https://github.com/layr-labs/eigenlayer-contracts/pull/1436)
- feat: bn254 certificate verifier [PR #1431](https://github.com/layr-labs/eigenlayer-contracts/pull/1431)
- chore: bindings + interface update [PR #1438](https://github.com/layr-labs/eigenlayer-contracts/pull/1438)
- chore: update multichain interfaces [PR #1433](https://github.com/layr-labs/eigenlayer-contracts/pull/1433)
- feat: multi chain interfaces [PR #1423](https://github.com/layr-labs/eigenlayer-contracts/pull/1423)
````

## File: CHANGELOG/CHANGELOG-1.8.0-all.md
````markdown
# v1.8.0-testnet-final

The below release notes cover the updated version release candidate for multichain and hourglass

# Release Manager

@ypatil12 @eigenmikem @rajath0x

# Multichain

## Highlights

⛔ Breaking Changes
- The leaves of merkle trees used by the `OperatorTableUpdater` and `BN254CertificateVerifier` are now salted. The [`LeafCalculatorMixin`]() is used by:
   - `OperatorTableUpdater`: To salt the `operatorTableLeaf` via `calculateOperatorTableLeaf`. This change is also reflected in the [offchain transporter](https://github.com/Layr-Labs/multichain-go/pull/19)
   - `BN254CertificateVerifier`: To salt the `operatorInfoLeaf` via `calculateOperatorInfoLeaf`. BN254 OperatorSets MUST update their table calculators to use the new `BN254TableCalculatorBase` in the [`middleware repo`](https://github.com/Layr-Labs/eigenlayer-middleware/blob/dev/src/middlewareV2/tableCalculator/BN254TableCalculatorBase.sol)
- Nonsigners in the `BN254CertificateVerifier` are now sorted by operator index. See [PR #1615](https://github.com/layr-labs/eigenlayer-contracts/pull/1615). All offchain aggregators MUST sort nonsigners by operator index
- The `BN254CertificateVerifier` now requires signatures over the `referenceTimestamp` via `calculateCertificateDigest`. See [PR #1610](https://github.com/layr-labs/eigenlayer-contracts/pull/1610)

🛠️ Security Fixes
- The merkle library has been updated to address minor audit issues. No breaking changes. See [PR #1606](https://github.com/layr-labs/eigenlayer-contracts/pull/1606)
- Audit fixes for the `ReleaseManager`. See [PR #1608](https://github.com/layr-labs/eigenlayer-contracts/pull/1608)

🔧 Improvements
- Introspection for operatorSets with active generation reservations: `hasActiveGenerationReservation`. See [PR #1589](https://github.com/layr-labs/eigenlayer-contracts/pull/1589)
- Clearer error messages/natspec:
   - [PR #1602](https://github.com/layr-labs/eigenlayer-contracts/pull/1602)
   - [PR #1587](https://github.com/layr-labs/eigenlayer-contracts/pull/1587)
   - [PR #1585](https://github.com/layr-labs/eigenlayer-contracts/pull/1585)
   - [PR #1562](https://github.com/layr-labs/eigenlayer-contracts/pull/1562)
   - [PR #1567](https://github.com/layr-labs/eigenlayer-contracts/pull/1567)
- Require `KeyType` to be set when creating a generation reservation. See [PR #1561](https://github.com/layr-labs/eigenlayer-contracts/pull/1561)

🐛 Bug Fixes
- Add pagination for querying active generation reservations. See [PR #1569](https://github.com/layr-labs/eigenlayer-contracts/pull/1569)
- Fix race conditions on offchain table updates. See [PR #1575](https://github.com/layr-labs/eigenlayer-contracts/pull/1575)
- Remove restrictive check on ECDSA certificates required to be confirmed against the latest `referenceTimestamp`. See [PR #1582](https://github.com/layr-labs/eigenlayer-contracts/pull/1582)

## What's Changed
- fix: enforce ordering of nonsigners in bn254CV [PR #1615](https://github.com/layr-labs/eigenlayer-contracts/pull/1615)
- fix: releaseManager audit fixes [PR #1608](https://github.com/layr-labs/eigenlayer-contracts/pull/1608)
- fix: include timestamp with BN254CertificateVerifier certificate generation [PR #1610](https://github.com/layr-labs/eigenlayer-contracts/pull/1610)
- fix(audit): merkle library audit fixes [PR #1606](https://github.com/layr-labs/eigenlayer-contracts/pull/1606)
- chore: clearer error message [PR #1602](https://github.com/layr-labs/eigenlayer-contracts/pull/1602)
- chore: fmt and bindings
- fix: elm-08
- fix: elm-11(2) middleware ref typo
- chore: bindings
- fix: add `hasActiveGenerationReservation` [PR #1589](https://github.com/layr-labs/eigenlayer-contracts/pull/1589)
- fix(h-03): add pagination [PR #1569](https://github.com/layr-labs/eigenlayer-contracts/pull/1569)
- fix(docs): correct hash value in natspec [PR #1587](https://github.com/layr-labs/eigenlayer-contracts/pull/1587)
- fix(h-04): race condition [PR #1575](https://github.com/layr-labs/eigenlayer-contracts/pull/1575)
- docs: multichain natspec [PR #1584](https://github.com/layr-labs/eigenlayer-contracts/pull/1584)
- fix(audit): add salt to Merkle leaf hashing [PR #1580](https://github.com/layr-labs/eigenlayer-contracts/pull/1580)
- fix: check for key upon gen reservation [PR #1561](https://github.com/layr-labs/eigenlayer-contracts/pull/1561)
- fix: remove unused imports [PR #1585](https://github.com/layr-labs/eigenlayer-contracts/pull/1585)
- feat: update generator script [PR #1581](https://github.com/layr-labs/eigenlayer-contracts/pull/1581)
- fix(m-01): remove restrictive check [PR #1582](https://github.com/layr-labs/eigenlayer-contracts/pull/1582)
- fix(I-01): check input lengths [PR #1564](https://github.com/layr-labs/eigenlayer-contracts/pull/1564)
- chore: clean up interfaces [PR #1562](https://github.com/layr-labs/eigenlayer-contracts/pull/1562)
- fix: addressing pr comments [PR #1568](https://github.com/layr-labs/eigenlayer-contracts/pull/1568)
- fix: correct ecdsa message hash check [PR #1563](https://github.com/layr-labs/eigenlayer-contracts/pull/1563)
- fix: Release Manager internal review fixes [PR #1571](https://github.com/layr-labs/eigenlayer-contracts/pull/1571)
- docs: multichain [PR #1567](https://github.com/layr-labs/eigenlayer-contracts/pull/1567)
````

## File: CHANGELOG/CHANGELOG-1.8.0.md
````markdown
# v1.8.0 Hourglass

The Hourglass release consists of a framework that supports the creation of task-based AVSs. The task-based AVSs are enabled through a `TaskMailbox` core contract deployed to all chains that support a `CertificateVerifier`. Additionally AVSs deploy their `TaskAVSRegistrar`. The release has 3 components:

1. Core Contracts
2. AVS Contracts
3. Offchain Infrastructure

The below release notes cover Core Contracts. For more information on the end to end protocol, see our [docs](https://github.com/Layr-Labs/hourglass-monorepo/blob/master/README.md) and [core contract docs](../docs/avs/task/TaskMailbox.md).

## Release Manager

@0xrajath

## Highlights

This hourglass release only introduces new contracts. As a result, there are no breaking changes or deprecations.

🚀 New Features

Destination Chain Contracts
- `TaskMailbox`: A core infrastructure contract that enables task-based AVS execution models. It provides a standardized way for AVSs to create tasks, have operators execute them, and submit verified results on-chain. The contract acts as a mailbox system where task creators post tasks with fees, and operators compete to execute and submit results with proper consensus verification.

## Changelog

- fix: correct ecdsa message hash check [PR #1563](https://github.com/layr-labs/eigenlayer-contracts/pull/1563)
- fix: missing assume in fuzz test
- fix: `submitResult` certificate checks [PR #1557](https://github.com/layr-labs/eigenlayer-contracts/pull/1557)
- chore: forge fmt
- fix: certificate verifier interface changes
- feat: hourglass zeus script [PR #1546](https://github.com/layr-labs/eigenlayer-contracts/pull/1546)
- fix: mock certificate verifiers [PR #1545](https://github.com/layr-labs/eigenlayer-contracts/pull/1545)
- feat: hourglass (task-based AVS framework) [PR #1534](https://github.com/layr-labs/eigenlayer-contracts/pull/1534)
````

## File: CHANGELOG/CHANGELOG-1.8.1.md
````markdown
# v1.8.1 MultiChain Hourglass Combined

## Release Manager

@ypatil12 @eigenmikem @0xrajath

# Multichain 

The multichain release enables AVSs to launch their services and make verified Operator outputs available on any EVM chain, meeting their customers where they are. AVSs can specify custom operator weights to be transported to any destination chain. The release has 3 components:

1. Core Contracts
2. AVS Contracts
3. Offchain Infrastructure

The below release notes cover Core Contracts. For more information on the end to end protocol, see our [docs](../docs/multichain/README.md) and [ELIP-008](https://github.com/eigenfoundation/ELIPs/blob/main/ELIPs/ELIP-008.md).

## Highlights

This multichain release only introduces new standards and contracts. As a result, there are no breaking changes or deprecations. 

🚀 New Features – Highlight major new functionality

Source-Chain Contracts
- `KeyRegistrar`: Manages cryptographic keys for operators across different operator sets. It supports both ECDSA and BN254 key types and ensures global uniqueness of keys across all operator sets
- `CrossChainRegistry`: Enables AVSs to register to have their operator stakes transported to supported destination chains
- `ReleaseManager`: Provides a standardized way for AVSs to publish software artifacts (binaries, docker images, etc.) that operators in their operator sets should upgrade to by specified deadlines

Destination Chain Contracts
- `CertificateVerifier`: Proves the offchain execution of a task, via a Certificate, by the operators of an operatorSet. Two types of key material are supported: ECDSA and BN254
- `OperatorTableUpdater`: Updates operator tables in the `CertificateVerifier` to have tasks validated against up-to-date operator stake weights 

🔧 Improvements – Enhancements to existing features.

- The multichain protocol has protocol-ized several AVS-deployed contracts, enabling an simpler AVS developer experience. These include:
    - `KeyRegistrar`: Manages BLS and ECDSA signing keys. AVSs no longer have to deploy a `BLSAPKRegistry`
    - `CertificateVerifier`: Handles signature verification for BLS and ECDSA keys. AVSs no longer have to deploy a `BLSSignatureChecker`
    - Offchain Multichain Transport: AVSs no longer have to maintain [avs-sync](https://github.com/Layr-Labs/avs-sync) to keep operator stakes fresh

# Hourglass

The Hourglass release consists of a framework that supports the creation of task-based AVSs. The task-based AVSs are enabled through a `TaskMailbox` core contract deployed to all chains that support a `CertificateVerifier`. Additionally AVSs deploy their `TaskAVSRegistrar`. The release has 3 components:

1. Core Contracts
2. AVS Contracts
3. Offchain Infrastructure

The below release notes cover Core Contracts. For more information on the end to end protocol, see our [hourglass docs](https://github.com/Layr-Labs/hourglass-monorepo/blob/master/README.md),  [core contract docs](../docs/avs/task/TaskMailbox.md), and [ELIP-010](https://github.com/eigenfoundation/ELIPs/blob/main/ELIPs/ELIP-010.md).

## Highlights

This hourglass release only introduces new contracts. As a result, there are no breaking changes or deprecations.

🚀 New Features

Destination Chain Contracts
- `TaskMailbox`: A core infrastructure contract that enables task-based AVS execution models. It provides a standardized way for AVSs to create tasks, have operators execute them, and submit verified results on-chain. The contract acts as a mailbox system where task creators post tasks with fees, and operators compete to execute and submit results with proper consensus verification.

# Changelog

## What's Changed
* feat: multichain by @ypatil12 in https://github.com/Layr-Labs/eigenlayer-contracts/pull/1494
* chore: add final moocow audit by @wadealexc in https://github.com/Layr-Labs/eigenlayer-contracts/pull/1505
* fix: strategy manager gap by @0xClandestine in https://github.com/Layr-Labs/eigenlayer-contracts/pull/1508
* test(redistribution-changes): passing by @0xClandestine in https://github.com/Layr-Labs/eigenlayer-contracts/pull/1511
* docs(redistribution-changes): cleanup by @0xClandestine in https://github.com/Layr-Labs/eigenlayer-contracts/pull/1513
* docs: update CHANGELOG by @0xClandestine in https://github.com/Layr-Labs/eigenlayer-contracts/pull/1514
* release(redistribution): post audit changes by @0xClandestine in https://github.com/Layr-Labs/eigenlayer-contracts/pull/1461
* refactor: remove unnecessary signature validation and change param name by @eigenmikem in https://github.com/Layr-Labs/eigenlayer-contracts/pull/1509
* fix: remove unused constants and add gap by @8sunyuan in https://github.com/Layr-Labs/eigenlayer-contracts/pull/1519
* feat: key data reverse lookup  by @ypatil12 in https://github.com/Layr-Labs/eigenlayer-contracts/pull/1520
* docs: add final audit reports by @antojoseph in https://github.com/Layr-Labs/eigenlayer-contracts/pull/1523
* docs: clear up certificate verification  by @ypatil12 in https://github.com/Layr-Labs/eigenlayer-contracts/pull/1515
* refactor: cleaner reverts for `ECDSACertificateVerifier` by @ypatil12 in https://github.com/Layr-Labs/eigenlayer-contracts/pull/1521
* fix: internal audit fixes by @ypatil12 in https://github.com/Layr-Labs/eigenlayer-contracts/pull/1524
* docs: update README for v1.5.0 & v1.6.0 by @ypatil12 in https://github.com/Layr-Labs/eigenlayer-contracts/pull/1526
* refactor: table calc interface by @ypatil12 in https://github.com/Layr-Labs/eigenlayer-contracts/pull/1525
* fix: multichain clarity updates by @nadir-akhtar in https://github.com/Layr-Labs/eigenlayer-contracts/pull/1527
* test: multichain integration tests by @eigenmikem in https://github.com/Layr-Labs/eigenlayer-contracts/pull/1528
* fix: multichain deploy scripts by @ypatil12 in https://github.com/Layr-Labs/eigenlayer-contracts/pull/1510
* chore: update `v1.7.0` changelog by @ypatil12 in https://github.com/Layr-Labs/eigenlayer-contracts/pull/1529
* fix: typo  by @ypatil12 in https://github.com/Layr-Labs/eigenlayer-contracts/pull/1530
* feat: invalid staleness period prevention by @ypatil12 in https://github.com/Layr-Labs/eigenlayer-contracts/pull/1536
* feat: cleaner generator updates by @ypatil12 in https://github.com/Layr-Labs/eigenlayer-contracts/pull/1537
* chore: symmetric `BN254` and `ECDSA` checks by @ypatil12 in https://github.com/Layr-Labs/eigenlayer-contracts/pull/1540
* feat: add calculateCertificateDigestBytes to ECDSA cert verifier (#1532) by @ypatil12 in https://github.com/Layr-Labs/eigenlayer-contracts/pull/1542
* refactor: remove transport interface by @ypatil12 in https://github.com/Layr-Labs/eigenlayer-contracts/pull/1512
* chore: clean up natspec round 1 by @ypatil12 in https://github.com/Layr-Labs/eigenlayer-contracts/pull/1541
* fix: storage gap in `CrossChainRegistry` by @ypatil12 in https://github.com/Layr-Labs/eigenlayer-contracts/pull/1544
* test: more integration test scenarios and checks file by @eigenmikem in https://github.com/Layr-Labs/eigenlayer-contracts/pull/1548
* fix: prevent `globalTableRoot` certificate replay upon newly instantiated CertificateVerifiers/OperatorTables by @ypatil12 in https://github.com/Layr-Labs/eigenlayer-contracts/pull/1547
* fix: Multichain (Pt 2) fixes by @nadir-akhtar in https://github.com/Layr-Labs/eigenlayer-contracts/pull/1549
* chore: update `foundry.toml` to include `forge lint` config by @0xClandestine in https://github.com/Layr-Labs/eigenlayer-contracts/pull/1539
* chore: `KeyRegistrar` clarifications by @ypatil12 in https://github.com/Layr-Labs/eigenlayer-contracts/pull/1551
* chore: `CertificateVerifier` clarifications by @ypatil12 in https://github.com/Layr-Labs/eigenlayer-contracts/pull/1552
* chore: `CrossChainRegistry` clarifications by @ypatil12 in https://github.com/Layr-Labs/eigenlayer-contracts/pull/1553
* docs: update hoodi strat addresses by @ypatil12 in https://github.com/Layr-Labs/eigenlayer-contracts/pull/1556
* fix: hardening workflows test by @anupsv in https://github.com/Layr-Labs/eigenlayer-contracts/pull/1554
* docs: update for `v1.6.0` and `v1.5.0` by @ypatil12 in https://github.com/Layr-Labs/eigenlayer-contracts/pull/1558
* chore: update bindings by @ypatil12 in https://github.com/Layr-Labs/eigenlayer-contracts/pull/1565
* docs: multichain by @ypatil12 in https://github.com/Layr-Labs/eigenlayer-contracts/pull/1567
* fix: Release Manager internal review fixes by @nadir-akhtar in https://github.com/Layr-Labs/eigenlayer-contracts/pull/1571
* feat: hourglass by @0xrajath in https://github.com/Layr-Labs/eigenlayer-contracts/pull/1576
* fix: multichain pt1 audit fixes by @ypatil12 in https://github.com/Layr-Labs/eigenlayer-contracts/pull/1572
* feat: update generator script by @ypatil12 in https://github.com/Layr-Labs/eigenlayer-contracts/pull/1581
* fix: remove unused imports by @0xClandestine in https://github.com/Layr-Labs/eigenlayer-contracts/pull/1585
* fix: sp multichain audit fixes by @ypatil12 in https://github.com/Layr-Labs/eigenlayer-contracts/pull/1598
* chore: clearer error message by @ypatil12 in https://github.com/Layr-Labs/eigenlayer-contracts/pull/1602
* fix: multichain pt2 audit fixes by @ypatil12 in https://github.com/Layr-Labs/eigenlayer-contracts/pull/1592
* fix(audit): merkle library audit fixes by @nadir-akhtar in https://github.com/Layr-Labs/eigenlayer-contracts/pull/1606
* fix: hourglass part 1 and 2 audit fixes by @0xrajath in https://github.com/Layr-Labs/eigenlayer-contracts/pull/1609
* fix: include timestamp with BN254CertificateVerifier certificate generation by @nadir-akhtar in https://github.com/Layr-Labs/eigenlayer-contracts/pull/1610
* fix: enforce ordering of nonsigners in bn254CV by @eigenmikem in https://github.com/Layr-Labs/eigenlayer-contracts/pull/1615
* feat: final testnet upgrade scripts by @ypatil12 in https://github.com/Layr-Labs/eigenlayer-contracts/pull/1594
* feat: electra timing fix by @ypatil12 in https://github.com/Layr-Labs/eigenlayer-contracts/pull/1620
* docs: update readme by @eigenmikem in https://github.com/Layr-Labs/eigenlayer-contracts/pull/1623
* fix: task replay directed at same operator set by @0xrajath in https://github.com/Layr-Labs/eigenlayer-contracts/pull/1629
* feat: combine v1.7.0 and v1.8.0 upgrade scripts by @ypatil12 in https://github.com/Layr-Labs/eigenlayer-contracts/pull/1628
* chore: zeus script for task replay fix by @0xrajath in https://github.com/Layr-Labs/eigenlayer-contracts/pull/1632
* chore: update bindings by @0xrajath in https://github.com/Layr-Labs/eigenlayer-contracts/pull/1634
* fix: create generator script; initialization ordering by @ypatil12 in https://github.com/Layr-Labs/eigenlayer-contracts/pull/1630
````

## File: CHANGELOG/CHANGELOG-1.9.0.md
````markdown
# v1.9.0 Slashing UX Improvements

## Release Manager

@ypatil12 @eigenmikem @0xclandestine

# Overview

The Slashing UX improvement release is a tech debt-focused release that improves key parts of the Eigenlayer Core UX. This release will upgrade every core contract. 

The below release notes cover Core Contracts.

## Highlights

🚀 New Features

- The `AllocationManager` has been split into two contracts to address size limitations of the contract. The main contract handles state-mutating operations, while `AllocationManagerView` handles all read-only view functions. **This is not a breaking change for introspection as previous introspection calls fallback to `delegateCall` into the `AllocationManagerView` contract.**. For more information, see the [contract architecture](../docs/core/AllocationManager.md#contract-architecture). 
- The `ProtocolRegistry` is a new contract that stores all proxy contract addresses, global semver, and has the ability to pause the entire protocol. This contract will be deployed on all chains.
- Two new `createOperatorSets` functions (for redistributing and non redistributing operatorSets) have been added that take in a slasher address. This address is the *only* address that can slash an operatorSet. Changing the address is behind a `ALLOCATION_CONFIGURATION_DELAY` (17.5 days on mainnet). 

⛔ Breaking Changes

- The slasher permissions are set and stored in the `AllocationManager` instead of the `PermissionController`. Only one address can slash an operatorSet; the address is initially set upon creation of the operatorSet. OperatorSets created prior to this release will have their slasher migrated based on the following rules:
    - If there is no slasher set or the slasher in the `PermissionController` is the 0 address, the AVS address will be set as the slasher
    - If there are multiple slashers set in the `PermissionController`, the first address will be set as the slasher
- Semver (`SemverMixin.sol`) has been removed from all contracts, except from those that inherit the `SignatureUtilsMixin`. The version of the core protocol can be introspected via the `ProtocolRegistry`. 

📌 Deprecations

The old `createOperatorSets` functions in the leftmost column will be deprecated in Q2 2026 in favor of the newly specified functions. The old functions do not pass in a slasher. The new functions do pass in a slasher. If the old function is used, the slasher of the operatorSet is set to the avs address. 

| Function | MigrateTo | Notes |
| -------- | -------- | -------- |
| `createOperatorSets(avs, CreateSetParams[])` | `createOperatorSets(address avs, CreateSetParamsV2[])` | New function takes in a slasher address |
| `createRedistributingOperatorSets(avs, CreateSetParams[], redistributionRecipients[])` | `createRedistributingOperatorSets(avs, CreateSetParamsV2[], redistributionRecipients[])` | New function takes in a slasher address |

🔧 Improvements

- Added a non-revert `_canCall` in the `PermissionControllerMixin` for space savings. This function is used in the `AllocationManager` and `DelegationManager`. 
- The allocation delay for a newly created operator is active immediately. This allows operators to make allocations instantly after registering in the core. 
- The internal `SlashingLib.scaleForBurning` function has been deprecated in favor of `SlashingLib.calcSlashedAmount`, standardizing the calculation of slashed shares across the withdrawal queue and storage. See [PR #1502](https://github.com/Layr-Labs/eigenlayer-contracts/pull/1502) for more information. 


# Changelog

- feat: re-enable forge fmt + foundry v1.5.0 [PR #1669](https://github.com/layr-labs/eigenlayer-contracts/pull/1669)
- feat: substitute calcSlashedAmount for scaleForBurning [PR #1502](https://github.com/layr-labs/eigenlayer-contracts/pull/1502)
- fix: `v1.9.0` upgrade script [PR #1666](https://github.com/layr-labs/eigenlayer-contracts/pull/1666)
- feat: `v1.9.0` upgrade scripts + reusable upgrade helpers [PR #1665](https://github.com/layr-labs/eigenlayer-contracts/pull/1665)
- chore: update interface natspec for DM [PR #1664](https://github.com/layr-labs/eigenlayer-contracts/pull/1664)
- feat: slashing commitments [PR #1645](https://github.com/layr-labs/eigenlayer-contracts/pull/1645)
- feat: remove semver + minor optimizations [PR #1654](https://github.com/layr-labs/eigenlayer-contracts/pull/1654)
- feat: split `AllocationManager` [PR #1643](https://github.com/layr-labs/eigenlayer-contracts/pull/1643)
- feat: add protocol registry [PR #1655](https://github.com/layr-labs/eigenlayer-contracts/pull/1655)
- feat: instant alloc delay from dm [PR #1646](https://github.com/layr-labs/eigenlayer-contracts/pull/1646)
- chore: remove holesky [PR #1662](https://github.com/layr-labs/eigenlayer-contracts/pull/1662)
- chore: hardcode foundry ci to v1.3.5 [PR #1658](https://github.com/layr-labs/eigenlayer-contracts/pull/1658)
- chore: hardcode foundry to v1.3.5 in ci [PR #1657](https://github.com/layr-labs/eigenlayer-contracts/pull/1657)
- feat(audit): publish Hourglass + Multichain + RMS audit reports [PR #1644](https://github.com/layr-labs/eigenlayer-contracts/pull/1644)
- docs: add transport frequency for multichain [PR #1642](https://github.com/layr-labs/eigenlayer-contracts/pull/1642)
- chore: update readMe for multichain/hourglass [PR #1637](https://github.com/layr-labs/eigenlayer-contracts/pull/1637)
````

## File: CHANGELOG/CHANGELOG-template.md
````markdown
# <release-version>

**Use this template to draft changelog and submit PR to review by the team**

## Release Manager

github handle of release manager

## Highlights

🚀 New Features – Highlight major new functionality
- ...
- ...

⛔ Breaking Changes – Call out backward-incompatible changes.
- ...
- ...

📌 Deprecations – Mention features that are being phased out.
- ...
- ...

🛠️ Security Fixes – Specify patched vulnerabilities.
- ...
- ...

🔧 Improvements – Enhancements to existing features.
- ...
- ...

🐛 Bug Fixes – List resolved issues.
- ...
- ...


## Changelog

To generate a changelog of commits added since the last release using Git on 
the command line, follow these steps:

1. Identify the last release tag

First, list your tags (assuming you use Git tags for releases):

```
git tag --sort=-creatordate
```

This shows your most recent tags at the top. Let's say the last release tag is `v1.4.2`


2. Generate the changelog

Now, use the following command to list the commits since that tag, and auto generate github PR link if there's any

```
git log v1.4.2..HEAD --pretty=format:"%s" --no-merges | \
sed -E 's/^(.*)\(#([0-9]+)\)$/- \1[PR #\2](https:\/\/github.com\/layr-labs\/eigenlayer-contracts\/pull\/\2)/' | \
sed -E '/\[PR #[0-9]+\]/! s/^(.*)$/- \1/'
```

This will show:

- Only commits since v1.4.2 up to the current HEAD
- One-line commit messages (%s) with the author name (%an)


An example output is:

```
- ci: add explicit permissions to workflows to  mitigate security concerns [PR #1392](https://github.com/layr-labs/eigenlayer-contracts/pull/1392)
- ci: remove branch constraint for foundry coverage job
- docs: add release managers to changelogs
- docs: add templates for changelog and release notes [PR #1382](https://github.com/layr-labs/eigenlayer-contracts/pull/1382)
- docs: add doc for steps to write deploy scripts [PR #1380](https://github.com/layr-labs/eigenlayer-contracts/pull/1380)
- ci: add testnet envs sepolia and hoodi to validate-deployment-scripts [PR #1378](https://github.com/layr-labs/eigenlayer-contracts/pull/1378)
- docs: update MAINTENANCE to include practices of merging multiple release-dev branches
- docs: updating readme for dead links, readability, new language, and more [PR #1377](https://github.com/layr-labs/eigenlayer-contracts/pull/1377)
...
```

3. Commit the Changelog

Copy the output and add here with a commit, then proceed to cut the release from the commit.
````

## File: docs/avs/task/TaskMailbox.md
````markdown
# TaskMailbox

| File | Type | Proxy |
| -------- | -------- | -------- |
| [`TaskMailbox.sol`](../../../src/contracts/avs/task/TaskMailbox.sol) | Singleton | Transparent proxy |
| [`TaskMailboxStorage.sol`](../../../src/contracts/avs/task/TaskMailboxStorage.sol) | Storage | - |
| [`ITaskMailbox.sol`](../../../src/contracts/interfaces/ITaskMailbox.sol) | Interface | - |

Libraries and Mixins:

| File | Notes |
| -------- | -------- |
| [`SemVerMixin.sol`](../../../src/contracts/mixins/SemVerMixin.sol) | semantic versioning |
| [`OwnableUpgradeable`](https://github.com/OpenZeppelin/openzeppelin-contracts-upgradeable/blob/v4.9.0/contracts/access/OwnableUpgradeable.sol) | ownership management |
| [`ReentrancyGuardUpgradeable`](https://github.com/OpenZeppelin/openzeppelin-contracts-upgradeable/blob/v4.9.0/contracts/security/ReentrancyGuardUpgradeable.sol) | reentrancy protection |
| [`Initializable`](https://github.com/OpenZeppelin/openzeppelin-contracts-upgradeable/blob/v4.9.0/contracts/proxy/utils/Initializable.sol) | upgradeable initialization |
| [`SafeERC20`](https://github.com/OpenZeppelin/openzeppelin-contracts/blob/v4.9.0/contracts/token/ERC20/utils/SafeERC20.sol) | safe token transfers |
| [`SafeCast`](https://github.com/OpenZeppelin/openzeppelin-contracts/blob/v4.9.0/contracts/utils/math/SafeCast.sol) | safe type casting |
| [`OperatorSetLib.sol`](../../../src/contracts/libraries/OperatorSetLib.sol) | operator set encoding/decoding |

## Prior Reading

* [Hourglass Framework](https://github.com/Layr-Labs/hourglass-monorepo/blob/master/README.md) - for understanding the task-based AVS execution model
* [AllocationManager](../../core/AllocationManager.md) - for understanding operator sets
* [KeyRegistrar](../../permissions/KeyRegistrar.md) - for understanding operator key management
* [CertificateVerifier](../../multichain/destination/CertificateVerifier.md) - for understanding certificate verification

## Overview
The `TaskMailbox` is a core infrastructure contract that enables task-based AVS (Autonomous Verifiable Service) execution models. It provides a standardized way for AVSs to accept tasks created by users or apps, have operators execute them, and submit verified results on-chain. The contract acts as a mailbox system where task creators post tasks with fees, and operators compete to execute and submit results with proper consensus verification.

The `TaskMailbox`'s responsibilities are broken down into the following concepts:

* [Task Creation and Lifecycle](#task-creation-and-lifecycle)
* [Executor Operator Sets](#executor-operator-sets)
* [Result Submission and Verification](#result-submission-and-verification)
* [Fee Management](#fee-management)
* [Task Hooks and AVS Integration](#task-hooks-and-avs-integration)

### Immutable Configuration

The `TaskMailbox` contract has the following immutable parameters set at deployment:

* **BN254_CERTIFICATE_VERIFIER**: Address of the BN254 certificate verifier contract
* **ECDSA_CERTIFICATE_VERIFIER**: Address of the ECDSA certificate verifier contract  
* **MAX_TASK_SLA**: Maximum allowed task SLA duration (typically set to `DEALLOCATION_DELAY / 2`)

The `MAX_TASK_SLA` parameter is particularly important as it ensures AVSs can still slash operators in case of stake deallocation during inflight tasks. By limiting task SLAs to half the deallocation delay, the system guarantees that operators cannot avoid slashing by deallocating their stake while a task is still pending.

## Parameterization

The `TaskMailbox` uses the following key parameters:

* **Fee Split**: Configurable percentage (0-10000 basis points) that determines how task fees are split between the protocol fee collector and the AVS fee collector
* **Task SLA**: Service Level Agreement duration (in seconds) set per executor operator set, defining how long operators have to complete a task
* **MAX_TASK_SLA**: Maximum allowed task SLA duration (immutable, set at deployment)
* **Consensus Thresholds**: Configurable per operator set, defining the required stake proportion for result verification

---

## Task Creation and Lifecycle

Tasks in the TaskMailbox system follow a well-defined lifecycle with specific states and transitions. Each task is uniquely identified by a hash computed from the task parameters, block context, and a global counter.

### Certificate Staleness Protection

When creating a task, the system checks that the operator table reference timestamp is fresh enough to remain valid for the entire task SLA duration. This prevents tasks from being created with stale operator sets that might change before the task completes. The check ensures:

```
block.timestamp + taskSLA <= operatorTableReferenceTimestamp + maxStaleness
```

If `maxStaleness` is 0 (unconfigured), this check is skipped. Otherwise, if the certificate would become stale before the task SLA expires, the transaction reverts with `CertificateStale()`.

**State Variables:**
* `_globalTaskCount`: Counter ensuring unique task hashes
* `_tasks`: Mapping from task hash to task details

**Methods:**
* [`createTask`](#createtask)
* [`getTaskInfo`](#gettaskinfo)
* [`getTaskStatus`](#gettaskstatus)

### Task Status Flow

Tasks can be in one of the following states:
1. **NONE**: Task does not exist
2. **CREATED**: Task has been created and is waiting for execution
3. **EXPIRED**: Task SLA has passed without result submission
4. **VERIFIED**: Task result has been submitted and verified

#### `createTask`

```solidity
/**
 * @notice Creates a new task for execution by operators
 * @param taskParams The parameters for the task including refund collector, executor operator set, and payload
 * @return taskHash The unique identifier for the created task
 */
function createTask(TaskParams memory taskParams) external nonReentrant returns (bytes32 taskHash)
```

Creates a new task in the system. The method performs several validations and operations:

1. Validates that the executor operator set is registered and has a valid configuration
2. Validates that the task SLA does not exceed MAX_TASK_SLA
3. Checks certificate staleness to ensure the operator table reference timestamp is fresh enough for the task SLA
4. Calls the AVS task hook for pre-creation validation
5. Calculates the task fee using the AVS task hook
6. Generates a unique task hash
7. Transfers the fee from the caller to the TaskMailbox
8. Stores the task with its current configuration snapshot
9. Calls the AVS task hook for post-creation handling

*Effects*:
* Increments `_globalTaskCount`
* Stores task in `_tasks` mapping
* Transfers fee tokens from caller
* Emits `TaskCreated` event
* Calls [`IAVSTaskHook.validatePreTaskCreation`](../../../src/contracts/interfaces/IAVSTaskHook.sol) and [`IAVSTaskHook.handlePostTaskCreation`](../../../src/contracts/interfaces/IAVSTaskHook.sol)

*Requirements*:
* Executor operator set must be registered
* Executor operator set must have valid task configuration
* Task SLA must not exceed MAX_TASK_SLA (reverts with `TaskSLAExceedsMaximum`)
* Certificate must not be stale (reverts with `CertificateStale` if maxStaleness is exceeded)
* Task payload must not be empty
* Fee transfer must succeed
* AVS validation must pass

#### `getTaskInfo`

```solidity
/**
 * @notice Retrieves the complete information for a task
 * @param taskHash The unique identifier of the task
 * @return Task struct containing all task details
 */
function getTaskInfo(bytes32 taskHash) external view returns (Task memory)
```

Returns the complete task information including its current status. The status is computed dynamically based on the current block timestamp and task state.

#### `getTaskStatus`

```solidity
/**
 * @notice Gets the current status of a task
 * @param taskHash The unique identifier of the task
 * @return TaskStatus enum value
 */
function getTaskStatus(bytes32 taskHash) external view returns (TaskStatus)
```

Returns only the current status of a task, useful for lightweight status checks.

---

## Executor Operator Sets

Executor operator sets define which operators are eligible to execute tasks and under what conditions. Each operator set must be configured before it can be used for task execution.

**State Variables:**
* `_executorOperatorSetTaskConfigs`: Mapping from operator set to its task configuration
* `_isExecutorOperatorSetRegistered`: Tracks registered operator sets

**Methods:**
* [`setExecutorOperatorSetTaskConfig`](#setexecutoroperatorsettaskconfig)
* [`registerExecutorOperatorSet`](#registerexecutoroperatorset)
* [`getExecutorOperatorSetTaskConfig`](#getexecutoroperatorsettaskconfig)

### ExecutorOperatorSetTaskConfig Structure

The task configuration for an executor operator set contains the following fields:

```solidity
struct ExecutorOperatorSetTaskConfig {
    IAVSTaskHook taskHook;        // AVS-specific contract for custom validation
    uint96 taskSLA;               // Time limit in seconds for task completion
    IERC20 feeToken;              // Token used for task fees (zero address = no fees)
    address feeCollector;         // Address to receive AVS portion of fees
    CurveType curveType;          // Cryptographic curve (BN254 or ECDSA)
    Consensus consensus;          // Consensus type and parameters
    bytes taskMetadata;           // AVS-specific metadata
}
```

### Consensus Configuration

The consensus configuration determines how operator signatures are validated:

```solidity
struct Consensus {
    ConsensusType consensusType;  // Type of consensus validation
    bytes value;                  // Type-specific parameters
}

enum ConsensusType {
    NONE,                         // AVS handles consensus validation
    STAKE_PROPORTION_THRESHOLD    // Require minimum stake percentage
}
```

**Consensus Types:**

1. **NONE**: 
   - The TaskMailbox only verifies certificate validity (signature, timestamp, message hash)
   - AVS is responsible for implementing custom consensus logic in task hooks
   - `value` must be empty bytes
   - Useful for AVSs with custom consensus mechanisms or off-chain validation

2. **STAKE_PROPORTION_THRESHOLD**:
   - Requires a minimum percentage of total stake to sign the result
   - `value` contains `abi.encode(uint16)` representing threshold in basis points (0-10000)
   - Example: 6667 = 66.67% stake required
   - Certificate verification will fail if threshold is not met

#### `setExecutorOperatorSetTaskConfig`

```solidity
/**
 * @notice Sets the task configuration for an executor operator set
 * @param executorOperatorSet The operator set to configure
 * @param config The configuration including task hook, SLA, fee token, etc.
 */
function setExecutorOperatorSetTaskConfig(
    OperatorSet memory executorOperatorSet,
    ExecutorOperatorSetTaskConfig memory config
) external
```

Configures how tasks should be executed by a specific operator set. The configuration includes:
- **Task Hook**: AVS-specific contract for custom validation and handling
- **Task SLA**: Time limit for task completion (must not exceed MAX_TASK_SLA)
- **Fee Token**: Token used for task fees (can be zero address for no fees). **Fees will not be collected if this is the zero address.**
- **Fee Collector**: Address to receive AVS portion of fees
- **Curve Type**: Cryptographic curve used by operators (BN254 or ECDSA)
- **Consensus**: Type and threshold for result verification
- **Task Metadata**: AVS-specific metadata

*Effects*:
* Stores configuration in `_executorOperatorSetTaskConfigs`
* Sets `_isExecutorOperatorSetRegistered` to true if not already registered
* Emits `ExecutorOperatorSetTaskConfigSet` event

*Requirements*:
* Caller must be the operator set owner (verified via certificate verifier)
* Task hook must not be zero address
* Task SLA must be greater than zero
* Task SLA must not exceed MAX_TASK_SLA (reverts with `TaskSLAExceedsMaximum`)
* Consensus type and curve type must be valid
* Consensus value must be properly formatted

**Example Configuration:**

```solidity
// Example 1: Configure with 66.67% stake threshold
ExecutorOperatorSetTaskConfig memory config = ExecutorOperatorSetTaskConfig({
    taskHook: IAVSTaskHook(0x...),
    taskSLA: 3600, // 1 hour
    feeToken: IERC20(0x...),
    feeCollector: 0x...,
    curveType: CurveType.BN254,
    consensus: Consensus({
        consensusType: ConsensusType.STAKE_PROPORTION_THRESHOLD,
        value: abi.encode(uint16(6667)) // 66.67%
    }),
    taskMetadata: bytes("")
});

// Example 2: Configure with NONE consensus (AVS handles validation)
ExecutorOperatorSetTaskConfig memory config = ExecutorOperatorSetTaskConfig({
    taskHook: IAVSTaskHook(0x...),
    taskSLA: 3600,
    feeToken: IERC20(address(0)), // No fees
    feeCollector: address(0),
    curveType: CurveType.ECDSA,
    consensus: Consensus({
        consensusType: ConsensusType.NONE,
        value: bytes("") // Must be empty
    }),
    taskMetadata: bytes("")
});
```

#### `registerExecutorOperatorSet`

```solidity
/**
 * @notice Registers or unregisters an executor operator set
 * @param executorOperatorSet The operator set to register/unregister
 * @param isRegistered Whether to register (true) or unregister (false)
 */
function registerExecutorOperatorSet(
    OperatorSet memory executorOperatorSet,
    bool isRegistered
) external
```

Allows operator set owners to explicitly register or unregister their operator sets for task execution.

*Effects*:
* Updates `_isExecutorOperatorSetRegistered`
* Emits `ExecutorOperatorSetRegistered` event

*Requirements*:
* Caller must be the operator set owner
* Operator set must have a valid configuration if registering

---

## Result Submission and Verification

Task results are submitted along with cryptographic certificates that prove consensus among the operator set. The verification process depends on the curve type configured for the operator set.

**Methods:**
* [`submitResult`](#submitresult)
* [`getTaskResult`](#gettaskresult)

#### `submitResult`

```solidity
/**
 * @notice Submits the result of a task execution with consensus proof
 * @param taskHash The unique identifier of the task
 * @param executorCert Certificate proving operator consensus
 * @param result The execution result data
 */
function submitResult(
    bytes32 taskHash,
    bytes memory executorCert,
    bytes memory result
) external nonReentrant
```

Submits the result of task execution along with proof of consensus. The method:

1. Validates the task exists and hasn't expired or been verified
2. Calls AVS hook for pre-submission validation
3. Verifies the certificate based on both curve type and consensus type:
   - **ConsensusType.NONE**: 
     - Validates certificate fields (reference timestamp, message hash, non-empty signature)
     - Calls certificate verifier to validate signature authenticity
     - Does NOT enforce any stake threshold requirements
     - AVS can implement custom consensus logic in `handlePostTaskResultSubmission`
   - **ConsensusType.STAKE_PROPORTION_THRESHOLD**:
     - Performs all validations from NONE
     - Additionally verifies that signers meet the configured stake threshold
     - Uses `verifyCertificateProportion` to ensure minimum stake percentage signed
4. Distributes fees according to fee split configuration
5. Stores the result and marks task as verified
6. Calls AVS hook for post-submission handling

*Effects*:
* Updates task status to VERIFIED
* Stores executor certificate and result
* Transfers fees to collectors
* Emits `TaskVerified` event
* Calls [`IAVSTaskHook.validatePreTaskResultSubmission`](../../../src/contracts/interfaces/IAVSTaskHook.sol) and [`IAVSTaskHook.handlePostTaskResultSubmission`](../../../src/contracts/interfaces/IAVSTaskHook.sol)

*Requirements*:
* Task must exist and be in CREATED status
* Current timestamp must be after task creation time
* Certificate must have valid signature(s)
* Certificate verification must pass consensus threshold (reverts with `ThresholdNotMet` if not)
* AVS validation must pass

#### `getTaskResult`

```solidity
/**
 * @notice Retrieves the result of a verified task
 * @param taskHash The unique identifier of the task
 * @return result The task execution result data
 */
function getTaskResult(bytes32 taskHash) external view returns (bytes memory result)
```

Returns the result data for tasks that have been successfully verified.

*Requirements*:
* Task must be in VERIFIED status

---

## Fee Management

The TaskMailbox implements a flexible fee system that supports fee splitting between the protocol and AVS, as well as refunds for expired tasks.

**State Variables:**
* `feeSplit`: Global fee split percentage (basis points)
* `feeSplitCollector`: Address receiving protocol portion of fees

**Methods:**
* [`setFeeSplit`](#setfeesplit)
* [`setFeeSplitCollector`](#setfeesplitcollector)
* [`refundFee`](#refundfee)

#### `setFeeSplit`

```solidity
/**
 * @notice Sets the global fee split percentage
 * @param _feeSplit The fee split in basis points (0-10000)
 */
function setFeeSplit(uint16 _feeSplit) external onlyOwner
```

Configures what percentage of task fees goes to the protocol fee collector versus the AVS fee collector.

*Effects*:
* Updates `feeSplit` state variable
* Emits `FeeSplitSet` event

*Requirements*:
* Caller must be contract owner
* Fee split must not exceed 10000 (100%)

#### `setFeeSplitCollector`

```solidity
/**
 * @notice Sets the protocol fee collector address
 * @param _feeSplitCollector The address to receive protocol fees
 */
function setFeeSplitCollector(address _feeSplitCollector) external onlyOwner
```

Sets the address that receives the protocol portion of task fees.

*Effects*:
* Updates `feeSplitCollector` state variable
* Emits `FeeSplitCollectorSet` event

*Requirements*:
* Caller must be contract owner
* Address must not be zero

#### `refundFee`

```solidity
/**
 * @notice Refunds the fee for an expired task
 * @param taskHash The unique identifier of the task
 */
function refundFee(bytes32 taskHash) external nonReentrant
```

Allows the designated refund collector to reclaim fees from expired tasks that were never executed.

*Effects*:
* Marks task fee as refunded
* Transfers full fee amount to refund collector
* Emits `FeeRefunded` event

*Requirements*:
* Task must be in EXPIRED status
* Caller must be the task's refund collector
* Fee must not have been previously refunded
* Task must have a fee token configured

---

## Task Hooks and AVS Integration

Task hooks provide AVSs with customization points throughout the task lifecycle. This allows AVSs to implement custom validation logic, fee calculations, and side effects.

**Integration Points:**

### IAVSTaskHook Interface

AVSs implement the [`IAVSTaskHook`](../../../src/contracts/interfaces/IAVSTaskHook.sol) interface to customize task behavior:

```solidity
interface IAVSTaskHook {
    // Called before task creation to validate the caller and parameters
    function validatePreTaskCreation(
        address caller,
        TaskParams memory taskParams
    ) external view;

    // Called after task creation for any side effects
    function handlePostTaskCreation(bytes32 taskHash) external;

    // Called before result submission to validate the submitter and data
    function validatePreTaskResultSubmission(
        address caller,
        bytes32 taskHash,
        bytes memory cert,
        bytes memory result
    ) external view;

    // Called after successful result submission for any side effects
    function handlePostTaskResultSubmission(
        address caller,
        bytes32 taskHash
    ) external;

    // Calculates the fee for a task based on its parameters
    function calculateTaskFee(
        TaskParams memory taskParams
    ) external view returns (uint96);
}
```

### Integration Flow

1. **Task Creation**:
   - AVS validates caller permissions and task parameters
   - AVS calculates appropriate fee based on task complexity
   - AVS performs any initialization after task creation

2. **Result Submission**:
   - AVS validates submitter permissions
   - AVS can validate result format and content
   - AVS processes verified results for their application logic

This hook system enables AVSs to build sophisticated task-based systems while leveraging the TaskMailbox's core infrastructure for consensus verification and fee management.

---

## Security Considerations

The TaskMailbox implements several security measures:

1. **Reentrancy Protection**: All state-changing functions use OpenZeppelin's `ReentrancyGuardUpgradeable`
2. **Certificate Verification**: Results must include valid consensus proofs verified by the appropriate certificate verifier
3. **Fee Safety**: Uses OpenZeppelin's `SafeERC20` for all token transfers
4. **Access Control**: Operator set owners control their configurations; contract owner controls global parameters
5. **Timestamp Validation**: Tasks cannot be verified at their creation timestamp to prevent same-block manipulation
6. **Task SLA Limits**: MAX_TASK_SLA immutable constant prevents excessively long task durations
7. **Certificate Staleness Protection**: Ensures operator table reference timestamps are fresh enough for the task SLA duration
````

## File: docs/core/accounting/DualSlashingEdgeCase.md
````markdown
# Dual Slashing Edge Case

This document describes edge cases surrounding the slashing of a staker for native ETH by the beacon chain (BC) and an AVS. 

## Prior Reading

* [ELIP-002: Slashing via Unique Stake and Operator Sets](https://github.com/eigenfoundation/ELIPs/blob/main/ELIPs/ELIP-002.md)
* [ELIP-004: Slashing-Aware EigenPods](https://github.com/eigenfoundation/ELIPs/blob/main/ELIPs/ELIP-004.md)
* [Shares Accounting](./SharesAccounting.md)

## Scenario

Consider a staker, Alice who is in the following state:

1. Alice has verified a validator. `withdrawable: 32 ETH`
2. Alice's operator is slashed for 75%. `withdrawable: 8 ETH`
    <details>
    <summary>Calculation</summary>

    * `depositShares: 32` 
    * `maxMagnitude: 0.25`
    * `BCSF: 1`
    * `DSF: 1`
    * `withdrawable = 32 * 0.25 * 1 * 1 = 8 ETH`
    </details>
3. Alice is slashed by 16 ETH on the beacon chain

## Restaking

We define restaking as **reusing staked ETH as security for AVSs. Thus, the same Native ETH that is securing the BC (beacon chain) can also be slashed by an AVS, with priority burning rights going to the BC.**

In the above scenario, let's say the Alice now proves a checkpoint.

4. A checkpoint of BC state is proven. `withdrawable: 4 ETH`
    <details>
    <summary>Calculation</summary>

    * `depositShares: 16`
    * `maxMagnitude: 0.25`
    * `BCSF: 1`
    * `DSF: 1`
    * `withdrawable = 16 * 0.25 * 1 * 1 = 4 ETH`
    </details>

The checkpoint slash has devalued Alice's currently withdrawable assets by 50%. The AVS slashes from what's left due to the BC getting priority burning rights. Thus, AVSs must factor Native ETH (or an LST) being slashed by the beacon chain when designing their slashing conditions. The below diagram illustrates this behavior:

| ![AVS and Beacon Chain Slashing Behavior](../../images/avs-bc-slash.png) |
|:--:|
| *Diagram showing how AVS slashing is applied after Beacon Chain slashing, with BC having priority burning rights* |

Note that the portion that is marked as BC Slash and BC + AVS Slash has priority burning rights by the beacon chain. 12 ETH has been slashed "twice", but this is by design given our definition of restaking.

The behavior of BC and AVS slashings for Native ETH mimics the behavior of slashings for an LST in isolation (see below for an additional edge case). This ensures that Native ETH security is not disadvantaged compared to LST security. ELIP-004 explains this in [more detail](https://github.com/eigenfoundation/ELIPs/blob/main/ELIPs/ELIP-004.md#why-do-eigenpods-need-to-upgrade).

## Ordering of EigenPod Actions

**When an AVS slashes, its attributable slashed amount is between 0 and the originally slashed amount. The attributable slashed amount decreases in the event of BC slashes.** We see this behavior in the above example, where the 12 ETH that was attributed to the AVS is less than the original 24 ETH that was slashed. 

However, given the asynchronous nature of the EigenPod proof system, Alice may have a different number of withdrawable shares depending on the ordering of her actions. Note that even in this case, **assets are not overslashed**.

Let's start with our above scenario. 

Scenario A:

4. Alice verifies another validator. `withdrawable: 40 ETH`
    <details>
    <summary>Calculation</summary>

    * `depositShares: 64`
    * `maxMagnitude: 0.25`
    * `BCSF: 1`
    * `DSF = 40 / (32 + 32) / 0.25 = 2.5`
    * `withdrawable = 64 * 0.25 * 1 * 2.5 = 40 ETH`
    </details>

5. Alice checkpoints all her pods. `withdrawable: 30 ETH`
    <details>
    <summary>Calculation</summary>

    * `depositShares: 64`
    * `maxMagnitude: 0.25`
    * `BCSF = 48 / 64 = 0.75`
    * `DSF: 2.5`
    * `withdrawable = 64 * 0.25 * 0.75 * 2.5 = 30 ETH`
    </details>

In this scenario, 25% of Alice's currently proven assets are slashed. Similarly, the AVSs attributable slashed amount has been decreased by 25% (24 → 18 ETH). 


Scenario B:

4. Alice checkpoints her pod. `withdrawable: 4 ETH`
    <details>
    <summary>Calculation</summary>

    * `depositShares: 32`
    * `maxMagnitude: 0.25`
    * `BCSF = 16 / 32 = 0.5`
    * `DSF: 1`
    * `withdrawable = 32 * 0.25 * 0.5 * 1 = 4 ETH`
    </details>

5. Alice verifies another validator. `withdrawable: 40 ETH`
    <details>
    <summary>Calculation</summary>

    * `depositShares: 64`
    * `maxMagnitude: 0.25`
    * `BCSF: 0.5`
    * `DSF = 36 / (32 + 32) / 0.125 = 4.5`
    * `withdrawable = 64 * 0.25 * 0.5 * 4.5 = 36 ETH`
    </details>

In scenario B, 50% of Alice's currently proven assets are slashed, along with a commensurate decrease in the AVSs attributable slashed amount. In both cases Alice's withdrawable shares and the AVSs attributable slashed amount decrease by the same percentage.

We acknowledge this edge case. A benefit of this system is that stakers are incentivized to immediately prove BC slashed. Eigen Labs runs an off-chain process (EigenPod Health Checker) that monitors BC slashings and starts checkpoints as needed. Conversely, when Native-ETH burning is implemented, AVSs are incentivized to immediately exit stakers from the BC to recoup the maximum possible attributable slashed amount.  

This edge case also applies if Alice undelegates after being slashed on the beacon chain, and then continues along with Scenario A, exiting her position fully. See below for details:
<details>
<summary>Scenario</summary>

1. Alice verifies a validator: `withdrawable: 32 ETH`
2. Alice's operator is slashed for 100%. `withdrawable: 0 ETH` 
3. Alice is slashed by 16 ETH on the beacon chain. 
4. Alice undelegates. `depositShares = 0` 
5. Alice verifies another validator. `withdrawable: 32 ETH`. `depositShares: 32 ETH` 
6. Alice checkpoints her slash from step 3. `withdrawable: 24 ETH`
    - `restakedExecutionLayerGwei = 16`. This is the AVSs attributable slashed amount, but it increases once Alice completely exits. 
    - `BCSF= 48/64 = 0.75`
7. Alice completes her withdrawal as shares from undelegation. No affect since the operator's magnitude was 0
8. Alice exits her validator from step 5. `withdrawable: 24 ETH`
    - `restakedExecutionLayerGwei = 48` 
9. Alice queues a withdrawal for all shares. `scaledShares = 32` 
10. Alice completes her withdrawal. Alice receives 24 ETH
    - `scaledShares * slashingFactor = 32 * 0.75 = 24` 
11. There is 24 ETH locked up in the pod. 
</details>
````

## File: docs/core/accounting/SharesAccounting.md
````markdown
[elip-002]: https://github.com/eigenfoundation/ELIPs/blob/main/ELIPs/ELIP-002.md

# Shares Accounting

This document outlines the changes to the staker and operator Shares accounting resulting from the Slashing Upgrade. There are several introduced variables such as the _deposit scaling factor_ ($k_n$), _max magnitude_ ($m_n$), and _beacon chain slashing factor_ ($l_n$). How these interact with the operator and staker events like deposits, slashing, withdrawals will all be described below.

## Prior Reading

* [ELIP-002: Slashing via Unique Stake and Operator Sets](https://github.com/eigenfoundation/ELIPs/blob/main/ELIPs/ELIP-002.md)

## Pre-Slashing Upgrade

We'll look at the "shares" model as historically defined prior to the Slashing upgrade. Pre-slashing, stakers could receive shares for deposited assets, delegate those shares to operators, and withdraw those shares from the protocol. We can write this a bit more formally:

#### Staker Level

$s_n$ - The amount of shares in the storage of the `StrategyManager`/`EigenPodManager` at time n.

#### Operator Level

$op_n$ - The operator shares in the storage of the `DelegationManager` at time n which can also be rewritten as \
$op_n = \sum_{i=1}^{k} s_{n,i}$ where the operator has $k$ number of stakers delegated to them.


#### Staker Deposits 

Upon each staker deposit of amount $d_n$ at time $n$, the staker's shares and delegated operator's shares are updated as follows:

$$
 s_{n+1} = s_{n} + d_{n}
$$

$$
 op_{n+1} = op_{n} + d_{n}
$$

#### Staker Withdrawals 

Similarly for staker withdrawals, given an amount $w_n$ to withdraw at time $n$, the staker and operator's shares are decremented at the point of the withdrawal being queued:

$$
 s_{n+1} = s_{n} - w_{n}
$$

$$  
 op_{n+1} = op_{n} - w_{n}
$$

Later after the withdrawal delay has passed, the staker can complete their withdrawal to withdraw the full amount $w_n$ of shares. 

---

## Slashing Upgrade Changes

The remaining portions of this document will assume understanding of Allocations/Deallocations, Max Magnitudes, and Operator Sets as described in [ELIP-002][elip-002].

### Terminology

The word "shares" in EigenLayer has historically referred to the amount of shares a staker receives upon depositing assets through the `StrategyManager` or `EigenPodManager`. Outside of some conversion ratios in the `StrategyManager` to account for rebasing tokens, shares roughly correspond 1:1 with deposit amounts (i.e. 1e18 shares in the `beaconChainETHStrategy` corresponds to 1 ETH of assets). When delegating to an operator or queueing a withdrawal, the `DelegationManager` reads deposit shares from the `StrategyManager` or `EigenPodManager` to determine how many shares to delegate (or undelegate).

With the slashing release, there is a need to differentiate "classes" of shares.

**Deposit shares**: 

Formerly known as "shares," these are the same shares used before the slashing release. They continue to be managed by the `StrategyManager` and `EigenPodManager`, and roughly correspond 1:1 with deposited assets.

**Withdrawable shares**: 

When an operator is slashed, the slash is applied to their stakers _asynchronously_ (otherwise, slashing would require iterating over each of an operator's stakers; this is prohibitively expensive). 

The `DelegationManager` must find a common representation for the deposit shares of many stakers, each of which may have experienced different amounts of slashing depending on which operator they are delegated to, and when they delegated. This common representation is achieved in part through a value called the `depositScalingFactor`: a per-staker, per-strategy value that scales a staker's deposit shares as they deposit assets over time.

When a staker does just about anything (changing their delegated operator, queueing/completing a withdrawal, depositing new assets), the `DelegationManager` converts their _deposit shares_ to _withdrawable shares_ by applying the staker's `depositScalingFactor` and the current _slashing factor_ (a per-strategy scalar primarily derived from the amount of slashing an operator has received in the `AllocationManager`).

These _withdrawable shares_ are used to determine how many of a staker's deposit shares are actually able to be withdrawn from the protocol, as well as how many shares can be delegated to an operator. An individual staker's withdrawable shares are not reflected anywhere in storage; they are calculated on-demand.

**Operator shares**:

_Operator shares_ are derivative of _withdrawable shares_. When a staker delegates to an operator, they are delegating their _withdrawable shares_. Thus, an operator's _operator shares_ represent the sum of all of their stakers' _withdrawable shares_. Note that when a staker first delegates to an operator, this is a special case where _deposit shares_ == _withdrawable shares_. If the staker deposits additional assets later, this case will not hold if slashing was experienced in the interim.

---

Each of these definitions can also be applied to the pre-slashing share model, but with the caveat that for all stakers, _withdrawable shares equal deposit shares_. After the slashing upgrade this is not necessarily the case - a staker may not be able to withdraw the amount they deposited if their operator got slashed.

Now let's look at these updated definitions in detail and how the accounting math works with deposits, withdrawals, and slashing.

### Stored Variables

Note that these variables are all defined within the context of a single Strategy. Also note that the concept of "1" used within these equations is represented in the code by the constant `1 WAD`, or `1e18`.

#### Staker Level

$s_n$ - The amount of deposit shares in the storage of the `StrategyManager`/`EigenPodManager` at time $n$. In storage: `StrategyManager.stakerDepositShares` and `EigenPodManager.podOwnerDepositShares`

$k_n$ - The staker's “deposit scaling factor” at time $n$. This is initialized to 1. In storage: `DelegationManager.depositScalingFactor`

$l_n$ - The staker's "beacon chain slashing factor" at time $n$. This is initialized to 1. For any equations concerning non-native ETH strategies, this can be assumed to be 1. In storage: `EigenPodManager.beaconChainSlashingFactor`

#### Operator Level

$m_n$ - The operator magnitude at time n. This is initialized to 1.

$op_n$ - The operator shares in the storage of the `DelegationManager` at time n. In storage: `DelegationManager.operatorShares`

### Conceptual Variables

$a_n = s_n k_n l_n m_n$ - The withdrawable shares that the staker owns at time $n$. Read from view function `DelegationManager.getWithdrawableShares`

Note that $op_n = \sum_{i=1}^{k} a_{n,i}$.

---

### Deposits

For an amount of newly deposited shares $d_n$,

#### Staker Level

Conceptually, the staker's deposit shares and withdrawable shares both increase by the deposited amount $d_n$. Let's work out how this math impacts the deposit scaling factor $k_n$.

$$
a_{n+1} = a_n + d_n
$$

$$
s_{n+1} = s_n +d_n
$$

$$
l_{n+1} = l_n
$$

$$
m_{n+1} = m_n
$$

Expanding the $a_{n+1}$ calculation

$$
s_{n+1} k_{n+1} l_{n+1} m_{n+1} = s_n k_n l_n m_n + d_n
$$

Simplifying yields:

$$
k_{n+1} = \frac{s_n k_n l_n m_n + d_n}{s_{n+1} l_{n+1} m_{n+1}}=\frac{s_n k_n l_n m_n + d_n}{(s_n+d_n)l_nm_n}
$$

Updating the slashing factor is implemented in `SlashingLib.update`.

#### Operator Level

For the operator (if the staker is delegated), the delegated operator shares should increase by the exact amount
the staker just deposited. Therefore $op_n$ is updated as follows:

$$
op_{n+1} = op_n+d_n
$$

See implementation in:
* [`StrategyManager.depositIntoStrategy`](../../../src/contracts/core/StrategyManager.sol)
* [`EigenPodManager.recordBeaconChainETHBalanceUpdate`](../../../src/contracts/pods/EigenPodManager.sol)


---

### Delegation

Suppose we have an undelegated staker who decides to delegate to an operator.
We have the following properties that should be preserved.

#### Operator Level

Operator shares should be increased by the amount of delegatable shares the staker has, this is synonymous to their withdrawable shares $a_n$. Therefore,

$$
op_{n+1} = op_{n} + a_n
$$

$$
= op_{n} + s_n k_n l_n m_n
$$


#### Staker Level

withdrawable shares should remain unchanged

$$
a_{n+1} = a_n
$$

deposit shares should remain unchanged

$$
s_{n+1} = s_n
$$

beaconChainSlashingFactor and maxMagnitude should also remain unchanged. In this case, since the staker is not delegated, then their maxMagnitude should by default be equal to 1.

$$
l_{n+1} = l_n
$$

Now the question is what is the new depositScalingFactor equal to?

$$
a_{n+1} = a_n
$$

$$
=> s_{n+1} k_{n+1} l_{n+1} m_{n+1} = s_n k_n l_n m_n
$$

$$
=> s_{n} k_{n+1} l_{n} m_{n+1} = s_n k_n l_n m_n
$$

$$
=> k_{n+1} = \frac {k_n m_n} { m_{n+1} }
$$

Notice how the staker variables that update $k_{n+1}$ and $m_{n+1}$ do not affect previously queued withdrawals and shares received upon withdrawal completion. This is because the maxMagnitude that is looked up is dependent on the operator at the time of the queued withdrawal and the $k_n$ is effectively stored in the scaled shares field.

---

### Slashing

Given a proportion to slash $p_n = \frac {m_{n+1}}{m_n}$ ,

#### Operator Level

From a conceptual level, operator shares should be decreased by the proportion according to the following:

$$
 op_{n+1} = op_n p_n
$$

$$
 => op_{n+1} = op_n \frac {m_{n+1}} {m_n}
$$ 

Calculating the amount of $sharesToDecrement$:

$$
 sharesToDecrement = op_n - op_{n+1}
$$

$$
 = op_n - op_n \frac {m_{n+1}} {m_n}
$$

This calculation is performed in `SlashingLib.calcSlashedAmount`.

#### Staker Level

From the conceptual level, a staker's withdrawable shares should also be proportionally slashed so the following must be true:

$$
a_{n+1} = a_n p_n
$$

We don't want to update storage at the staker level during slashing as this would be computationally too expensive given an operator has a 1-many relationship with its delegated stakers. Therefore we want to prove $a_{n+1} = a_n p_n$ since withdrawable shares are slashed by $p_n$.

Given the following:

$l_{n+1} = l_n$ \
$k_{n+1} = k_n$ \
$s_{n+1} = s_n$

Expanding the $a_{n+1}$ equation:

$$
a_{n+1} = s_{n+1} k_{n+1} l_{n+1} m_{n+1}
$$

$$
=> s_{n} k_{n} l_{n} m_{n+1}
$$

We know that  $p_n = \frac {m_{n+1}}{m_n}$ =>  $m_{n+1} = m_n p_n$ 

$$
=>  s_n k_n l_n m_n p_n
$$

$$
=> a_n p_n
$$

This means that a staker's withdrawable shares are immediately affected upon their operator's maxMagnitude being decreased via slashing.

---

### Queue Withdrawal

Withdrawals are queued by inputting a `depositShares` amount $x_n <= s_n$. The actual withdrawable amount $w_n$ corresponding to $x_n$ is given by the following:

$$
 w_n = x_n k_n l_n m_n
$$

This conceptually makes sense as the amount being withdrawn $w_n$ is some amount <= $a_n$ which is the total withdrawable shares amount for the staker. 


#### Operator Level

When a staker queues a withdrawal, their operator's shares are reduced accordingly:

$$
 op_{n+1} = op_n - w_n
$$


#### Staker Level

$$
 a_{n+1} = a_n - w_n
$$

$$
 s_{n+1} = s_n - x_n
$$

This means that when queuing a withdrawal, the staker inputs a `depositShares` amount $x_n$. The `DelegationManager` calls the the `EigenPodManager`/`StrategyManager` to decrement their `depositShares` by this amount. Additionally, the `depositShares` are converted to a withdrawable amount $w_n$, which are decremented from the operator's shares.

We want to show that the total withdrawable shares for the staker are decreased accordingly such that $a_{n+1} = a_n - w_n$.

Given the following:

$l_{n+1} = l_n$ \
$k_{n+1} = k_n$ \
$s_{n+1} = s_n$

Expanding the $a_{n+1}$ equation:

$$
 a_{n+1} = s_{n+1} k_{n+1} l_{n+1} m_{n+1}
$$


$$
 =>  (s_{n} - x_n) k_{n+1} l_{n+1} m_{n+1}
$$

$$
 =  (s_{n} - x_n) k_n l_n m_n
$$

$$
 = s_n k_n l_n m_n - x_n k_n l_n m_n
$$

$$
 = a_n - w_n
$$

Note that when a withdrawal is queued, a `Withdrawal` struct is created with _scaled shares_ defined as $q_t = x_t k_t$ where $t$ is the time of the queuing. The reason we define and store scaled shares like this will be clearer in [Complete Withdrawal](#complete-withdrawal) below.

Additionally, we reset the depositScalingFactor when a user queues a withdrawal for all their shares, either through un/redelegation or directly. This is because the DSF at the time of withdrawal is stored in the scaled shares, and any "new" deposits or delegations by the staker should be considered as new. Note that withdrawal completion is treated as a kind of deposit when done as shares, which again will be clearer below.

See implementation in:
* `DelegationManager.queueWithdrawals`
* `SlashingLib.scaleForQueueWithdrawal`

<br>

---

### Complete Withdrawal

Now the staker completes a withdrawal $(q_t, t)$ which was queued at time $t$.

#### Operator Level

If the staker completes the withdrawal _as tokens_, any operator shares remain unchanged. The original operator's shares were decremented when the withdrawal was queued, and a new operator does not receive shares if the staker is withdrawing assets ("as tokens").

However, if the staker completes the withdrawal _as shares_, the shares are added to the staker's current operator according to the formulae in [Deposits](#deposits).

#### Staker Level

<!-- There are no storage updates for the staker outside of needing to calculate the shares to send the staker. -->

Recall from [Queue Withdrawal](#queue-withdrawal) that, when a withdrawal is queued, the `Withdrawal` struct stores _scaled shares_, defined as $q_t = x_t k_t$ where $x_t$ is the deposit share amount requested for withdrawal and $t$ is the time of the queuing.

And, given the formula for calculating withdrawable shares, the withdrawable shares given to the staker are $w_t$:

$$
w_t = q_t m_t l_t = x_t k_t l_t m_t
$$

However, the staker's shares in their withdrawal may have been slashed while the withdrawal was in the queue. Their operator may have been slashed by an AVS, or, if the strategy is the `beaconChainETHStrategy`, the staker's validators may have been slashed/penalized.

The amount of shares they actually receive is proportionally the following:

$$
    \frac{m_{t+delay} l_{now} }{m_t l_t}
$$

So the actual amount of shares withdrawn on completion is calculated to be:

$$
sharesWithdrawn = w_t (\frac{m_{t+delay} l_{now}}{m_t l_t} )
$$

$$ 
= x_t k_t l_t m_t (\frac{m_{t+delay} l_{now}}{m_t l_t} )
$$

$$ 
= x_t k_t m_{t+delay} l_{now}
$$

Now we know that $q_t = x_t k_t$ so we can substitute this value in here. 

$$ 
= q_t m_{t+delay} l_{now}
$$

From the above equations the known values we have during the time of queue withdrawal is $x_t k_t$ and we only know $m_{t+delay} l_{now}$ when the queued withdrawal is completable. This is why we store scaled shares as $q_t = x_t k_t$. The other term ($m_{t+delay} l_{now}$) is read during the completing transaction of the withdrawal.

Note: Reading $m_{t+delay}$ is performed by a historical Snapshot lookup of the max magnitude in the `AllocationManager` while $l_{now}$, the current beacon chain slashing factor, is done through the `EigenPodManager`. Recall that if the strategy in question is not the `beaconChainETHStrategy`, $l_{now}$ will default to "1".

The definition of scaled shares is used solely for handling withdrawals and accounting for slashing that may have occurred (both on EigenLayer and on the beacon chain) during the queue period.

See implementation in:
* `DelegationManager.completeQueuedWithdrawal`
* `SlashingLib.scaleForCompleteWithdrawal`

---

### Handling Beacon Chain Balance Decreases in EigenPods

Beacon chain balance decreases are handled differently after the slashing upgrade with the introduction of $l_n$ the beacon chain slashing factor. 

Prior to the upgrade, any decreases in an `EigenPod` balance for a staker as a result of completing a checkpoint immediately decrements from the staker's shares in the `EigenPodManager`. As an edge case, this meant that a staker's shares could go negative if, for example, they queued a withdrawal for all their shares and then completed a checkpoint on their `EigenPod` showing a balance decrease.

With the introduction of the beacon chain slashing factor, beacon chain balance decreases no longer result in a decrease in deposit shares. Instead, the staker's beacon chain slashing factor is decreased, allowing the system to realize that slash in any existing shares, as well as in any existing queued withdrawals. Effectively, this means that beacon chain slashing is accounted for similarly to EigenLayer-native slashing; _deposit shares remain the same, while withdrawable shares are reduced:_

![.](../../images/slashing-model.png)

Now let's consider how beacon chain balance decreases are handled when they represent a negative share delta for a staker's EigenPod.

#### Added Definitions

$welw$ is `withdrawableExecutionLayerGwei`. This is purely native ETH in the `EigenPod`, attributed via checkpoint and considered withdrawable by the pod (but without factoring in any EigenLayer-native slashing). `DelegationManager.getWithdrawableShares` can be called  to account for both EigenLayer and beacon chain slashing.

$before\text{ }start$ is time just before a checkpoint is started

<!-- $before\text{ }complete$ is time just before a checkpoint is completed -->

$after\text{ }complete$ is the time just after a checkpoint is completed 

As a checkpoint is completed, the total assets represented by the pod's native ETH and beacon chain balances _before_ and _after_ are given by:

$g_n = welw_{before\text{ }start}+\sum_i validator_i.balance_{before\text{ }start}$ \
$h_n = welw_{after\text{ }complete}+\sum_i validator_i.balance_{after\text{ }complete}$

#### Staker Level

Conceptually, the above logic specifies that we decrease the staker's withdrawable shares proportionally to the balance decrease:

$$
a_{n+1} = \frac{h_n}{g_n}a_n
$$

We implement this by setting

$$
l_{n+1}=\frac{h_n}{g_n}l_n
$$

Given:

$m_{n+1}=m_n$ (staker beacon chain slashing does not affect its operator's magnitude)
$s_{n+1} = s_n$ (no subtraction of deposit shares)
$k_{n+1}=k_n$

Then, plugging into the formula for withdrawable shares:

$$
a_{n+1} = s_{n+1}k_{n+1}l_{n+1}m_{n+1}
$$

$$
=s_nk_n\frac{h_n}{g_n}l_nm_n
$$

$$
= \frac{h_n}{g_n}a_n
$$

#### Operator Level

Now we want to update the operator's shares accordingly. At a conceptual level $op_{n+1}$ should be the following:

$$
 op_{n+1} = op_n - a_n + a_{n+1}
$$

We can simplify this further


$$
 =op_{n}-s_nk_nl_nm_n + s_nk_nl_{n+1}m_n
$$


$$
 = op_{n}+s_nk_nm_n(l_{n+1}-l_n)
$$

See implementation in:
* `EigenPodManager.recordBeaconChainETHBalanceUpdate`
* `DelegationManager.decreaseDelegatedShares`

---

## Implementation Details

In practice, we can’t actually have floating values so we will substitute all $k_n, l_n, m_n$ terms with $m_n$/1e18  $\frac{k_n}{1e18},\frac{l_n}{1e18} ,\frac{m_n}{1e18}$ respectively where $k_n, l_n, m_n$ are the values in storage, all initialized to 1e18. This allows us to conceptually have values in the range $[0,1]$.

We make use of OpenZeppelin's Math library and `mulDiv` for calculating $floor(\frac{x \cdot y}{denominator})$ with full precision. Sometimes for specific rounding edge cases, $ceiling(\frac{x \cdot y}{denominator})$ is explicitly used.

#### Multiplication and Division Operations
For all the equations in the above document, we substitute any product operations of $k_n, l_n, m_n$ with the `mulWad` pure function.
```solidity
function mulWad(uint256 x, uint256 y) internal pure returns (uint256) {
    return x.mulDiv(y, WAD);
}
```

Conversely, for any divisions of $k_n, l_n, m_n$ we use the `divWad` pure function.

```solidity
function divWad(uint256 x, uint256 y) internal pure returns (uint256) {
    return x.mulDiv(WAD, y);
}
```
````

## File: docs/core/accounting/SharesAccountingEdgeCases.md
````markdown
[elip-002]: https://github.com/eigenfoundation/ELIPs/blob/main/ELIPs/ELIP-002.md

# Shares Accounting Edge Cases

This document is meant to explore and analyze the different mathematical operations we are performing in the slashing release. Primarily we want to ensure safety on rounding and overflow situations. Prior reading of the [Shares Accounting](./SharesAccounting.md) is required to make sense of this document.

## Prior Reading

* [ELIP-002: Slashing via Unique Stake and Operator Sets](https://github.com/eigenfoundation/ELIPs/blob/main/ELIPs/ELIP-002.md)
* [Shares Accounting](./SharesAccounting.md)


## Fully Slashed for a Strategy

Within the context of a single Strategy, recall that updates to the deposit scaling factor $k_n$ are defined as the following:

$$
k_{n+1} = \frac{s_n k_n m_n + d_n}{s_{n+1} l_{n+1} m_{n+1}}=\frac{s_n k_n l_n m_n + d_n}{(s_n+d_n)l_nm_n}
$$

We can see here that calculating $k_{n+1}$ can give us a divide by 0 error if any of $(s_n + d_n)$, $l_n$, or $m_n$ are equal to 0. The $(s_n + d_n) = 0$ case should not arise because the `EigenPodManager` and `StrategyManager` will not report share increases in this case. However, the other two terms may reach 0:
* When an operator is 100% slashed for a given strategy and their max magnitude $m_n = 0$
* When a staker's `EigenPod` native ETH balance is 0 _and_ their validators have all been slashed such that $l_n = 0$

In these cases, updates to a staker's deposit scaling factor will encounter a division by 0 error. In either case, we know that since either the operator was fully slashed or the staker was fully slashed for the `beaconChainETHStrategy` then their withdrawable shares $a_n = 0$.

In practice, if $m_n = 0$ for a given operator, then:
1. Any staker who is already delegated to this operator _will be unable to deposit additional assets into the corresponding strategy_ 
2. Any staker that currently holds deposit shares in this strategy and is NOT delegated to the operator _will be unable to delegate to the operator_

Note that in the first case, it _is_ possible for the staker to undelegate, queue, and complete withdrawals - though as $a_n = 0$, they will not receive any withdrawable shares as a result.

Additionally, if $l_n = 0$ for a given staker in the beacon chain ETH strategy, then **any further deposits of ETH or restaking of validators will not yield shares in EigenLayer.** This should only occur in extraordinary circumstances, as a beacon chain slashing factor of 0 means that a staker both has ~0 assets in their `EigenPod`, and ALL of their validators have been ~100% slashed on the beacon chain - something that happens only when coordinated groups of validators are slashed. If this case occurs, an `EigenPod` is essentially bricked - the pod owner should NOT send ETH to the pod, and should NOT point additional validators at the pod.

If an operator has *their own* Native ETH shares in EigenLayer and is **fully slashed by an AVS** ($m_n = 0$), the operator's *new* ETH deposits are not recoverable. Stakers can undelegate from the fully slashed operator to recover *new* deposits, but an operator cannot since it cannot undelegate from itself. 

These are all expected edge cases and their occurrences and side effects are within acceptable tolerances.

## Upper Bound on Deposit Scaling Factor $k_n$

Let's examine potential overflow situations with respect to calculating a staker's withdrawable shares.
Below is the function in `SlashingLib.sol` which calculates $a_n = s_nk_nl_nm_n$. \
Note: `slashingFactor` = $l_nm_n$

```solidity
function calcWithdrawable(
    DepositScalingFactor memory dsf,
    uint256 depositShares,
    uint256 slashingFactor
) internal pure returns (uint256) {
    /// forgefmt: disable-next-item
    return depositShares
        .mulWad(dsf.scalingFactor())
        .mulWad(slashingFactor);
}
```

`depositShares` are the staker’s shares $s_n$ in storage. We know this can at max be 1e38 - 1 as this is the max total shares we allow in a strategy. $l_n ≤ 1e18$ and $m_n ≤ 1e18$ as they are montonically decreasing values. So a `mulWad` of the `slashingFactor` operation should never result in a overflow, it will always result in a smaller or equal number.

The question now comes to `depositShares.mulWad(dsf.scalingFactor())` and whether this term will overflow a `uint256`. Let's examine the math behind this. The function `SlashingLib.update` performs the following calculation:

$$
k_{n+1} =\frac{s_n k_n l_n m_n + d_n}{(s_n+d_n)l_nm_n}
$$

Assuming:
- $k_0 = 1$
- 0 < $l_0$ ≤ 1 and is monotonically decreasing but doesn’t reach 0
- 0 < $m_0$ ≤ 1 and is monotonically decreasing but doesn’t reach 0
- 0 ≤ $s_n, {s_{n+1}}$ ≤ 1e38 - 1 (`MAX_TOTAL_SHARES = 1e38 - 1` in StrategyBase.sol)
- 0 < $d_n$ ≤ 1e38 - 1
- ${s_{n+1}}={s_n} + {d_n}$

Rewriting above we can get the following by factoring out the k and cancelling out some terms.

$$
k_{n+1} = k_n\frac{s_n}{s_n + d_n} + \frac{d_n}{(s_n+d_n)l_nm_n}
$$

The first term  $\frac{s_n}{{{s_n} + {d_n}}}$ < 1 so when multiplied with $k_n$ will not contribute to the growth of ${k_{n+1}}$ if only considering this term. 

The second term $\frac{d_n}{({{s_n} + {d_n}}){l_n}{m_n}}$ however can make $k_n$ grow over time depending on how small ${l_n}{m_n}$ becomes and also how large $d_n$ is proportionally compared to $s_n$. We only care about the worst case scenario here so let’s assume the upper bound on the existing shares and new deposit amount by rounding the value up to 1.

Now in practice, the smallest values ${l_n}$ and ${m_n}$ could equal to is 1/1e18. Substituting this in the above second term gives the following:

$$
\frac{d_n}{(s_n+d_n)l_nm_n} = \frac{d_n}{s_n+d_n}*1e18^2
$$

So lets round up the first term $\frac{s_n}{{{s_n} + {d_n}}}$ to 1 and also $\frac{d_n}{{{s_n} + {d_n}}}$ in the second term to 1. We can simplify the recursive definition of k in this worst case scenario as the following.

$$
k_{n+1} = k_n\frac{s_n}{s_n + d_n} + \frac{d_n}{(s_n+d_n)l_nm_n}
$$

$$
=> k_{n+1} = k_n+ \frac{d_n}{(s_n+d_n)l_nm_n}
$$

$$
=> k_{n+1} = k_n + 1e36
$$

Because of the max shares in storage for a strategy is 1e38 - 1 and deposits must be non-zero we can actually come up with an upper bound on ${k_n}$ by having 1e38-1 deposits of amount 1, updating ${k_n}$ each time.

$$
k_{1e38-1} \approx (1e38-1)\cdot 1e36 < 1e74
$$

After 1e38-1 iterations/deposits, the upper bound on k we calculate is 1e74 in the _worst_ case scenario. This is technically possible if as a staker, you are delegated to an operator for the beaconChainStrategy where your operator has been slashed 99.9999999…% for native ETH but also as a staker you have had proportional EigenPod balance decreases up to 99.9999999…..%.

The max shares of 1e38-1 also accommodates the entire supply of ETH as well (only needs 27 bits). For normal StrategyManager strategies,  ${l_n} = 1$ and ${k_n}$ would not grow nearly to the same extent.

Clearly this value of 1e74 for ${k_n}$ fits within a uint256 storage slot.

Bringing this all back to the `calcWithdrawable` method used to calculate your actual withdrawable shares for a staker as well as the actual next ${k_{n+1}}$ value. We can see here that the shares is not expected to overflow given the constraints on all our variables and the use of the depositScalingFactor is safe.


The staker depositScalingFactor is unbounded on how it can increase over time but because of the lower bounds we have  ${l_n}$ and  ${m_n}$ as well as the upper bound on number of shares a strategy has (or amount of ETH in existence w.r.t beaconChainStrategy) we can see that it is infeasble for the deposit scaling factor $k_n$ to overflow in our contracts.  



## Rounding Behavior Considerations

The `SlashingLib.sol` introduces some small rounding precision errors due to the usage of `mulWad`/`divWad` operations in the contracts where we are doing a `x * y / denominator` operation. In Solidity, we round down to the nearest integer introducing an absolute error of up to 1 wei. Taking this into consideration, in certain portions of code, we will explicitly use either take the floor or ceiling value of `x * y / denominator`.

This has implications on several parts of the system. For example, completing a withdrawal as shares and having your updated withdrawable shares being less than what it was originally due to rounding. For stakers having a non-WAD beacon chain slashing factor(BCSF) this is essentially self induced from being penalized/slashed on the BC. For operator's have non-WAD maxMagnitudes for specific strategies, it is also a result of them being slashed by the OperatorSet(s) they are allocated to. Stakers should be wary of delegating to operators of low maxMagnitude for the strategies they they have deposits in. The impact of rounding error can result in a larger discrepancy between what they _should_ have withdrawable vs what they actually can withdraw.

### Rounding up on Slashing

When an operator is slashed by an operatorSet in the `AllocationManager`, we actually want to round up on slashing. Rather than calculating `floor(x * y / denominator)` from mulDiv, we want `ceiling(x * y / denominator)`. This is because we don’t want any kind of DOS scenario where an operatorSet attempting to slash an operator is rounded to 0; potentially possible if an operator registered for their own fake AVS and slashed themselves repeatedly to bring their maxMagnitude to a small enough value. This will ensure an operator is always slashed for some amount from their maxMagnitude which eventually, if they are slashed enough, can reach 0.

`AllocationManager.slashOperator`
```solidity
// 3. Calculate the amount of magnitude being slashed, and subtract from
// the operator's currently-allocated magnitude, as well as the strategy's
// max and encumbered magnitudes
uint64 slashedMagnitude = uint64(uint256(allocation.currentMagnitude).mulWadRoundUp(params.wadsToSlash[i]));
```

### Deposits actually _reducing_ withdrawableShares

There are some very particular edge cases where, due to rounding error, deposits can actually decrease withdrawble shares for a staker which is conceptually wrong.
The unit test `DelegationUnit.t.sol:test_increaseDelegatedShares_depositRepeatedly` exemplifies this where there is an increasing difference over the course of multiple deposits between a staker's withdrawable shares and the staker's delegated operator shares.
Essentially, what’s happening in this test case is that after the very first deposit of a large amount of shares, subsequent deposits of amount 1000 are causing the getWithdrawable shares to actually decrease for the staker.

Since the operatorShares are simply incrementing by the exact depositShares, the operatorShares mapping is increasing as expected. This ends up creating a very big discrepancy/drift between the two values after performing 1000 deposits. The difference between the operatorShares and the staker’s withdrawableShares ends up being `4.418e13`.

Granted the initial deposit amount was `4.418e28` which is magnitudes larger than the discrepancy here but this its important to note the side effects of the redesigned accounting model.
Instead of purely incremented/decremented amounts, we have introduced magnitudes and scaling factor variables which now result in small amounts of rounding error from division in several places. We deem this rounding behavior to be tolerable given the costs associated for the number of transactions to emulate this and the proportional error is very small.

### Slashing and Rounding Up Operator Shares and Rounding down on Staker Withdrawable Shares

As can be observed in the `SlashingLib.sol` library, we round up on the operatorShares when slashing and round down on the staker's withdrawableShares. If we look at a core invariant of the shares accounting model, we ideally want to preserve the following:

$$
op_n = \sum_{i=1}^{k} a_{n,i}
$$

where $op_n$ is the operatorShares at time $n$ and $a_{n,i}$ is the staker's withdrawableShares at time $n$ for the $i^{th}$ staker.

However due to rounding limitations, there will be some error introduced in calculating the amount of operator shares to slash above and also in calculating the staker's withdrawableShares. To prevent a situation where all stakers were to attempt to withdraw and the operatorShares underflows, we round up on the operatorShares when slashing and round down on the staker's withdrawableShares.

So in practice, the above invariant becomes.

$$
op_n \geq \sum_{i=1}^{k} a_{n,i}
$$

Upwards rounding on calculating the amount of operatorShares to give to an operator after slashing is intentionally performed in `SlashingLib.calcSlashedAmount`.
For calculating a staker's withdrawableShares, there are many different factors to consider such as calculating their depositScalingFactor, their slashingFactor, and calculating the amount of withdrawable shares altogether with their depositShares. These variables are all by default rounded down in calculation and is expected behavior for stakers.


## Upper bound on Residual Operator Shares

Related to the above rounding error on deposits, we want to calculate what is the worst case rounding error for a staker depositing shares into EigenLayer.
That is, what is the largest difference between the depositShares deposited and the resulting withdrawableShares? For a staker who initially deposits without getting slashed, these two values should conceptually be equal. Let's examine below.

Below is a code snippet of `SlashingLib.sol`
```solidity
function update(
    DepositScalingFactor storage dsf,
    uint256 prevDepositShares,
    uint256 addedShares,
    uint256 slashingFactor
) internal {
    // If this is the staker's first deposit, set the scaling factor to
    // the inverse of slashingFactor
    if (prevDepositShares == 0) {
        dsf._scalingFactor = uint256(WAD).divWad(slashingFactor);
        return;
    }

...

function calcWithdrawable(
    DepositScalingFactor memory dsf,
    uint256 depositShares,
    uint256 slashingFactor
) internal pure returns (uint256) {
    /// forgefmt: disable-next-item
    return depositShares
        .mulWad(dsf.scalingFactor())
        .mulWad(slashingFactor);
}
```

Mathematically, withdrawable shares can be represented as below

$$
withdrawableShares = d\space\cdot\space \frac{k}{WAD} \space\cdot\space \frac{slashingFactor}{WAD}
$$

Substituting $k$ with `WAD.divWad(slashingFactor)` (see update function above) if the staker only has done one single deposit of amount $d$. Also expanding out slashingFactor which is `maxMagnitude.mulWad(beaconChainScalingFactor)`

$$
= d\space\cdot\space \frac{\frac{WAD\space\cdot \space WAD}{m_{deposit} \cdot l_{deposit}}}{WAD} \space\cdot\space \frac{\frac{m \space\cdot\space l}{WAD}}{WAD}
$$

Above is the real true value of the amount of withdrawable shares a staker has but in practice, there are rounding implications at each division operation. It becomes the following

$$
withdrawableShares (rounded) =
\lfloor
\lfloor 
d \space\cdot\space 
\frac{\lfloor\frac{WAD\space\cdot \space WAD
}{m_{deposit} \space\cdot\space l_{deposit}}
\rfloor }{WAD}
\rfloor 
\space\cdot\space \frac{\lfloor \frac{m \space\cdot\space l}{WAD}\rfloor}{WAD}
\rfloor
$$

Each floor operation can introduce a rounding error of at most 1 wei. Because there are nested divisions however, this error can result in a total error thats larger than just off by 1 wei.
We can rewrite parts of above with epsilon $e$ which is in the range of [0,1].

1. First inner rounded term

$$
\frac{WAD \cdot WAD}{m_{deposit} \cdot l_{deposit}} = \lfloor \frac{WAD \cdot WAD}{m_{deposit} \cdot l_{deposit}} \rfloor + \epsilon_1
$$

$$
\frac{\lfloor \frac{WAD \cdot WAD}{m_{deposit} \cdot l_{deposit}} \rfloor}{WAD} = \frac{\frac{WAD \cdot WAD}{m_{deposit} \cdot l_{deposit}} - \epsilon_1}{WAD}
$$

2. Second rounded term

$$
\lfloor d \cdot \frac{\lfloor \frac{WAD \cdot WAD}{m_{deposit} \cdot l_{deposit}} \rfloor}{WAD} \rfloor
$$

$$
= \lfloor d \cdot \frac{WAD \cdot WAD}{m_{deposit} \cdot l_{deposit} \cdot WAD} - d \cdot \frac{\epsilon_1}{WAD} \rfloor
$$

$$
= d \cdot \frac{WAD \cdot WAD}{m_{deposit} \cdot l_{deposit} \cdot WAD} - d \cdot \frac{\epsilon_1}{WAD} - \epsilon_2
$$

3. Third rounded term

$$
\lfloor \frac{m \cdot l}{WAD} \rfloor = \frac{m \cdot l}{WAD}  - \epsilon_3
$$

$$
=>
\frac{\lfloor \frac{m \cdot l}{WAD} \rfloor}{WAD} = \frac{\frac{m \cdot l}{WAD} - \epsilon_3}{WAD}
$$

$$
=>
\frac{\lfloor \frac{m \cdot l}{WAD} \rfloor}{WAD} = \frac{m \cdot l}{WAD^2} - \frac{\epsilon_3}{WAD}
$$

4. Now bringing it all back to the original equation

$$
withdrawableShares (rounded) =
\lfloor
\lfloor 
d \space\cdot\space 
\frac{\lfloor\frac{WAD\space\cdot \space WAD
}{m_{deposit} \space\cdot\space l_{deposit}}
\rfloor }{WAD}
\rfloor 
\space\cdot\space \frac{\lfloor \frac{m \space\cdot\space l}{WAD}\rfloor}{WAD}
\rfloor
$$

$$
= \lfloor\left(d \cdot \frac{WAD \cdot WAD}{m_{deposit} \cdot l_{deposit} \cdot WAD} - d \cdot \frac{\epsilon_1}{WAD} - \epsilon_2\right)\cdot\left(\frac{m \cdot l}{WAD^2} - \frac{\epsilon_3}{WAD}\right)\rfloor
$$

$$
= \left(
d \cdot \frac{WAD \cdot WAD}{m_{deposit} \cdot l_{deposit} \cdot WAD} - d \cdot \frac{\epsilon_1}{WAD} - \epsilon_2
\right)
\cdot
\left(
\frac{m \cdot l}{WAD^2} - \frac{\epsilon_3}{WAD}
\right) - \epsilon_4
$$

After expansion and some simplification

$$
withdrawableShares (rounded) =
d \cdot \frac{m\cdot l}{m_{deposit} \cdot l_{deposit}\cdot WAD} - d \cdot \frac{\epsilon_1 \cdot m \cdot l}{WAD^3} - \frac{\epsilon_2 \cdot m \cdot l}{WAD^2} - d \cdot \frac{\epsilon_3}{m_{deposit} \cdot l_{deposit} } + \text{(higher-order terms)}
$$

Note that (higher-order terms) are the terms with multiple epsilon terms where the amounts become negligible, because each term $e$ is < 1.

The true value term is the following:

$$
withdrawableShares = d\space\cdot\space \frac{\frac{WAD \space\cdot\space WAD}{m_{deposit} \cdot l_{deposit}}}{WAD} \space\cdot\space \frac{\frac{m \space\cdot\space l}{WAD}}{WAD}
$$

$$
= d\space\cdot\space \frac{WAD }{m_{deposit} \cdot l_{deposit}}\space\cdot\space \frac{m \space\cdot\space l}{WAD^2}
$$

$$
d \cdot \frac{m\cdot l}{m_{deposit } \cdot l_{deposit}\cdot WAD}
$$

But we can see this term show in the withdrawableShares(rounded) above in the first term! Then we can see that we can represent the equations as the following. 

$$
withdrawableShares (rounded) =
withdrawableShares - d \cdot \frac{\epsilon_1 \cdot m \cdot l}{WAD^3} - \frac{\epsilon_2 \cdot m \cdot l}{WAD^2} - d \cdot \frac{\epsilon_3 }{m_{deposit} \cdot l_{deposit} } + \text{(higher-order terms)}
$$

This intuitively makes sense as all the rounding error comes from the epsilon terms and how they propagate out from being nested. Therefore the introduced error from rounding are all the rounding terms added up ignoring the higher-order terms.

$$
roundedError =d \cdot \frac{\epsilon_1 \cdot m \cdot l}{WAD^3} + \frac{\epsilon_2 \cdot m \cdot l}{WAD^2} + d \cdot \frac{\epsilon_3 }{m_{\text{deposit}} \cdot l_{deposit} }
$$

Now lets assume the worst case scenario of maximizing this sum above, if each epsilon $e$ is replaced with the value of 1 due to a full wei being rounded off we can get the following.

$$
d \cdot \frac{m \cdot l}{WAD^3} + \frac{ m \cdot l}{WAD^2} + \frac{ d}{m_{\text{deposit}} \cdot l_{deposit}}
$$

Assuming close to max values that results in rounding behaviour, we can maximize this total sum by having $d = 1e38$ ,  $m, m_{deposit}, l, l_{deposit}$ equal to WAD(1e18) then we get the following:

$$
\frac{1e38\cdot WAD^2}{WAD^3} + \frac{ WAD^2}{WAD^2} + \frac{1e38}{1e36}
$$

$$
=> \frac{1e38}{1e18} + 1 + 100
$$

$$
\approx 1e20
$$

Framed in another way, the amount of loss a staker can have is $\frac{1}{1e18}$ th of the deposit amount. This makes sense as a result of having nested flooring operations that are then multiplied against outer terms.
Over time, as stakers deposit and withdraw, they may not receive as many shares as their “real” withdrawable amount as this is rounded down and there could be residual/dust shares amount in the delegated operatorShares mapping AND in the original Strategy contract.
This is known and we specifically round down to avoid underflow of operatorShares if all their delegated stakers were to withdraw.
````

## File: docs/core/accounting/StrategyBaseAccounting.md
````markdown
# StrategyBase Accounting

- [StrategyBase Accounting](#strategybase-accounting)
  - [Overview](#overview)
  - [Why are shares needed?](#why-are-shares-needed)
  - [Can I mess up the accounting? Say, with a direct transfer?](#can-i-mess-up-the-accounting-say-with-a-direct-transfer)
    - [Arbitrary direct transfers](#arbitrary-direct-transfers)
      - [Simple Scenario](#simple-scenario)
      - [Scenario with More Depositors](#scenario-with-more-depositors)
    - [Inflation attacks](#inflation-attacks)
      - [Exploit Scenario](#exploit-scenario)
      - [Mitigation: Virtual Shares](#mitigation-virtual-shares)
      - [Attack Variation: Diluting the Virtual Depositor](#attack-variation-diluting-the-virtual-depositor)
      - [Attack Variation: Flash Loans](#attack-variation-flash-loans)
      - [Mitigation Side Effects](#mitigation-side-effects)
  - [Conclusion](#conclusion)

## Overview

The `StrategyBase` contract is used to manage the accounting of deposit shares for a specific token by collecting tokens and producing shares. Shares represent a proportional claim to the `StrategyBase`'s token balance, ensuring that users can withdraw their intended amount of tokens.

This document serves *specifically* to describe the accounting behavior for the `StrategyBase` contract. General documentation on the `StrategyBase` contract can be found [here](../StrategyManager.md#strategybase).

## Why are shares needed?

At first glance, one may wonder why we need shares to be minted and burned when a staker deposits and withdraws tokens. Why not just track the token balance directly?

The primary reason is **rebase tokens**. Rebase tokens are tokens whose supply can change. An example of a rebase token's behavior is as follows:

* A user holds 1000 tokens
* The token undergoes a 2x rebase (doubling what `balanceOf` returns)
* The token balance of the user is now 2000 tokens

If we were to track the token balance directly, then this 2x increase would not be reflected by the user's withdrawable amount.

Consider the following scenario, where a user deposits a rebase token into EigenLayer:

* A user deposits 1000 tokens, and this value is recorded
* The token undergoes a 2x rebase
* The user's original 1000 tokens are now worth 2000 tokens
* The user *can only withdraw 1000 tokens*, as the recorded deposit is 1000 tokens

**This is where shares come in.** Shares represent a proportional claim to the `StrategyBase`'s token balance, ensuring that users can withdraw their intended amount of tokens.

When a user deposits tokens, they receive shares proportional to the amount of tokens they deposited. Similarly, when a user withdraws tokens, they receive tokens proportional to the amount of shares they burned. Even though the underlying token balance may change, the number of shares a user holds will always represent their proportion of the underlying `StrategyBase` token balance.

With shares, the above scenario would play out as follows:

* A user deposits 1000 tokens, and they receive 1000 shares. Assume this is the first deposit for this strategy.
* The token undergoes a 2x rebase
* The user's original 1000 tokens are now worth 2000 tokens
* The user's 1000 shares are *also* now worth 2000 tokens
* The user can withdraw 2000 tokens, as expected

In short, shares allow for tracking a user's proportional claim to the `StrategyBase`'s token balance, ensuring that users can withdraw their intended amount of tokens even in the presence of rebase or other token behavior.

## Can I mess up the accounting? Say, with a direct transfer?

*TL;DR: No, you cannot arbitrarily mess up the accounting with a direct transfer -- at least, not without leveraging or destroying much capital to do so with minimal benefit.*

### Arbitrary direct transfers

As mentioned before, shares represent a proportional claim to the `StrategyBase`'s token balance. When a user deposits tokens, they receive shares proportional to the amount of tokens they deposited. Similarly, when a user withdraws tokens, they receive tokens proportional to the amount of shares they burned.

However, one can impact the accounting by sending tokens directly to the `StrategyBase` contract. For example:

* A user deposits 1000 tokens, receiving 1000 shares. Assume this is the first deposit for this strategy.
* The user sends 1000 tokens directly to the `StrategyBase` contract
* The user still has 1000 shares, but the `StrategyBase` now has 2000 tokens
* The user can now withdraw 2000 tokens, as their shares are 100% of the total number of shares, so they can withdraw 100% of the `StrategyBase`'s token balance

In this case, even though the user circumvented the expected flow, they still receive their intended amount of tokens.

This is due to the concept of an ***exchange rate***, which is the ratio of total shares to total tokens. This exchange rate by default is 1:1, but implicitly changes as the number of shares deviates from the number of tokens. In the above scenario, the exchange rate is now 2 tokens : 1 share.

However, can this behavior be used by an attacker to profit, or otherwise impact the accounting? Let's walk through a scenario.

#### Simple Scenario

Consider Alice and Bob, who are both aspirational stakers for EigenLayer. Alice has 1000 tokens, and Bob has 1000 tokens.

Alice deposits 500 tokens into the `StrategyBase` contract for this token, the first staker to do so. She receives 500 shares in return, a 1:1 ratio. Presume for demonstration purposes that this is not a rebase token, and that no other users are interacting with this `StrategyBase` contract.

The current state:
* `StrategyBase` total shares: **500**
* `StrategyBase` token balance: **500**
* Alice's shares: **500**
* Alice's "deserved" token balance: **500**
* Bob's shares: 0
* Bob's "deserved" token balance: 0

Bob is about to deposit 500 tokens into the `StrategyBase` contract, but Alice notices this. To increase her proportion of the shares, she sends 500 tokens *directly* to the `StrategyBase` contract. She does not go through the `deposit` function; she does not receive any additional shares for depositing these tokens into the contract.

The current state:
* `StrategyBase` total shares: 500
* `StrategyBase` token balance: **1000**
* Alice's shares: 500
* Alice's "deserved" token balance: **1000**
* Bob's shares: 0
* Bob's "deserved" token balance: 0

As we can see, Alice deposited a net total of 1000 tokens, and she is entitled to those 1000 tokens. Even though she only has 500 shares, she still has 100% of the total shares, and therefore is entitled to 100% of the `StrategyBase`'s token balance.

Bob continues with his day, depositing 500 tokens into the `StrategyBase` contract. However, he does not receive 500 shares, but instead receives 250 shares. This is fewer shares than he expected -- is this an issue?

The current state:
* `StrategyBase` total shares: **750**
* `StrategyBase` token balance: **1500**
* Alice's shares: 500
* Alice's "deserved" token balance: 1000
* Bob's shares: **250**
* Bob's "deserved" token balance: **500**

Let's investigate the accounting -- specifically, the ratio of shares to tokens.

As we can see, the `StrategyBase` contract for this token has 750 shares, and 1500 tokens. The ratio of tokens to shares is 2:1. Here you'll notice the concept of an ***exchange rate***, which is the ratio of total shares to total tokens. This exchange rate by default is 1:1, but implicitly changes as the number of shares deviates from the number of tokens.

Does this exchange rate correctly reflect what Alice and Bob are entitled to?

* Alice's 500 shares * 2 tokens / 1 share = 1000 tokens. **Correct!**
* Bob's 250 shares * 2 tokens / 1 share = 500 tokens. **Correct!**

Both Alice and Bob are still able to withdraw their "deserved" token amounts, as their shares are still correctly proportional in relation to each other. As such, despite the direct transfer of tokens to the `StrategyBase` contract, the accounting is still correct.

#### Scenario with More Depositors

Consider the same scenario, but with more depositors. Alice and Bob each deposit 500 tokens, receiving 500 shares each.

The current state:
* `StrategyBase` total shares: **1000**
* `StrategyBase` token balance: **1000**
* Alice's shares: **500**
* Alice's "deserved" token balance: **500**
* Bob's shares: **500**
* Bob's "deserved" token balance: **500**

A third entity, Charlie, prepares to deposit 500 tokens into the `StrategyBase` contract. However, Alice notices this. To increase her proportion of the shares, she sends 500 tokens *directly* to the `StrategyBase` contract. She does not go through the `deposit` function; she does not receive any additional shares for depositing these tokens into the contract.

The current state:
* `StrategyBase` total shares: **1500**
* `StrategyBase` token balance: **2000**
* Alice's shares: 500
* Alice's "deserved" token balance: **1000**
* Bob's shares: 500
* Bob's "deserved" token balance: 500
* Charlie's shares: 0
* Charlie's "deserved" token balance: 0

As we can see, the exchange rate is now 4 tokens : 3 shares.

As such:
* Alice's 500 shares * 4 tokens / 3 shares = 666 tokens. ***Lower* than the expected 1000 tokens.**
* Bob's 500 shares * 4 tokens / 3 shares = 666 tokens. ***Higher* than the expected 500 tokens. (Good for Bob!)**

From the onset, Bob benefits from Alice's direct deposit. He is still entitled to the same proportion of tokens, but the total tokens have increased. Alice, on the other hand, is worse off, as she is entitled to fewer tokens than she overall deposited or transferred.

As Charlie deposits 500 tokens, he receives 375 shares due to the exchange rate, as 500 tokens * 3 shares / 4 tokens = 375 shares.

The current state:
* `StrategyBase` total shares: **1875**
* `StrategyBase` token balance: **2500**
* Alice's shares: 500
* Alice's "deserved" token balance: 1000
* Bob's shares: 500
* Bob's "deserved" token balance: 500
* Charlie's shares: **375**
* Charlie's "deserved" token balance: **500**

As we can see, the exchange rate is now 4 tokens : 3 shares.

We can see that Charlie's 375 shares are correctly worth 500 tokens, as 375 shares * 4 tokens / 3 shares = 500 tokens. *Note that, since the exchange rate hasn't changed, we do not need to recalculate Alice and Bob's eligible tokens.*

Therefore, even though the exchange rate was not 1:1 prior to Charlie's deposit, the accounting is still correct, and he receives his intended amount of tokens. The only victim here is Alice, who effectively donated tokens to the existing depositors of the `StrategyBase` contract.

### Inflation attacks

An inflation attack is a more *specific* scenario that may impact depositors during the first deposits into a `StrategyBase` contract. This kind of attack is possible when the `StrategyBase` contract is first created, before or after the very first deposit. At this stage, the exchange rate of the `StrategyBase` is highly susceptible to manipulation, giving the first depositor the ability to steal funds from later depositors.

#### Exploit Scenario

Say Alice deposits 1 token into a `StrategyBase` contract, the first depositor to do so, and receives 1 share. This is an intentionally minimal amount so that she can perform an inflation attack.

The current state:
* `StrategyBase` total shares: **1**
* `StrategyBase` token balance: **1**
* Alice's shares: **1**
* Alice's "deserved" token balance: **1**

She notices that Bob is about to deposit 1000 tokens into the `StrategyBase` contract. She wants to manipulate the exchange rate to be so high that, due to rounding, Bob receives no shares for his deposit. In other words, she wants to set the exchange rate to some value where the number of tokens that Bob will be depositing is less than the number of tokens that would be required to receive 1 share. This would leave Bob with no shares, and no way to withdraw his tokens.

For example, say that Alice sends a *million* tokens to the `StrategyBase` contract. She does not go through the `deposit` function; she does not receive any additional shares for depositing these tokens into the contract. The exchange rate is now 1e6 + 1 tokens : 1 share.

The current state:
* `StrategyBase` total shares: 1
* `StrategyBase` token balance: **1e6 + 1**
* Alice's shares: **1**
* Alice's "deserved" token balance: **1e6 + 1**

Note the large difference between the `StrategyBase`'s token balance and the number of shares. As mentioned before, the exchange rate is now 1e6 + 1 tokens : 1 share.

When Bob deposits 1000 tokens, he is depositing less than 1e6 tokens, meaning that *he receives no shares for his deposit*. Calculating Bob's total shares:

* Bob's 1000 tokens * 1 share / 1e6 + 1 tokens = 1e-3 shares = 0 shares

Due to the large divisor, Bob's received shares are now 1e-3, a very small number, which is *rounded down to 0* due to EVM division. Thus, **Bob receives no shares for his token deposit**. This is a problem, as he is entitled to 1000 tokens, but has no shares for withdrawing it.

The current state:
* `StrategyBase` total shares: 1
* `StrategyBase` token balance: **1e6 + 1001**
* Alice's shares: 1
* Alice's "deserved" token balance: 1e6 + 1
* Bob's shares: 0
* Bob's "deserved" token balance: **1000**

As we can see, Bob's token balance increased, but his shares remained at 0, losing his deposited tokens to Alice. Alice has all the shares of the `StrategyBase` contract, and can withdraw all of the tokens, including Bob's 1000 tokens, even though she does not "deserve" those tokens as she is not the rightful owner.

#### Mitigation: Virtual Shares

To mitigate this, **we use a "virtual shares" mechanism**. Every created `StrategyBase` contract is initialized with a certain number of virtual shares (1e3) and virtual tokens (1e3), which simulate the "first deposit" into this `StrategyBase` contract. This prevents a first depositor from manipulating the exchange rate to their benefit, as they lose the advantages typically associated with the first depositor.

Consider Alice trying to perform the same attack as before, but with the virtual shares mechanism. The virtual shares are now 1e3, and the virtual tokens are 1e3. The total shares and token balance reflect this.

The current state:
* `StrategyBase` total shares: **1,000**
* `StrategyBase` token balance: **1,000**
* Alice's shares: 0
* Alice's "deserved" token balance: 0

Alice deposits her 1 token into the `StrategyBase` contract. She receives 1 share, as expected.

The current state:
* `StrategyBase` total shares: **1,001**
* `StrategyBase` token balance: **1,001**
* Alice's shares: **1**
* Alice's "deserved" token balance: **1**

Note immediately that Alice has 1 share, which is less than 0.1% of the total shares. She no longer has 100% of the shares due to this "virtual depositor".

Bob again intends to deposit 100 tokens into the `StrategyBase` contract. However, Alice beats him to it, depositing 1 million tokens into the `StrategyBase` contract. She does not receive any additional shares for depositing these tokens into the contract.

The current state:
* `StrategyBase` total shares: **1,001**
* `StrategyBase` token balance: **1,001,001**
* Alice's shares: **1**
* Alice's "deserved" token balance: **1,000,001**

Remember how Alice only has 1 share? Notice how she cannot withdraw the million tokens she deposited!

* Alice's 1 share * 1,000,001 tokens / 1,001 shares = 999 tokens. ***Lower* than the expected 1,000,001 tokens.**

Given the virtual depositor, Alice is "donating" her tokens to the `StrategyBase` contract, and is not able to withdraw the majority of the tokens she deposited.

Bob now deposits his 1000 tokens, at an exchange rate of ~1000 tokens : 1 share. Given that the exchange rate is now 1000 tokens : 1 share, Bob receives 1 share for his deposit, as he has deposited enough tokens to not have his shares rounded down to 0.

The current state:
* `StrategyBase` total shares: **1,002**
* `StrategyBase` token balance: **1,002,001**
* Alice's shares: 1
* Alice's "deserved" token balance: 1,000,001
* Bob's shares: **1**
* Bob's "deserved" token balance: **1,000**

Hilariously enough, not only is Bob able to withdraw his 1000 tokens, but Alice is also *only* able to withdraw 1000 tokens! Alice's attack is rendered unsuccessful.

#### Attack Variation: Diluting the Virtual Depositor

What if Alice attempts to dilute the initial 1e3 virtual shares and tokens? Clearly, since she didn't have enough shares with her minimal initial deposit, her attack's capital was dilulted by the "virtual depositor".

Imagine that Alice instead deposits 1 million tokens upfront. She receives 1 million shares, as expected.

The current state:
* `StrategyBase` total shares: **1,001,000**
* `StrategyBase` token balance: **1,001,000**
* Alice's shares: **1,000,000**
* Alice's "deserved" token balance: **1,000,000**

As you can see here, Alice has a vast majority of the shares. She tries again to manipulate the exchange rate before Bob deposits by depositing yet *another* million tokens. Remember that she does not receive any additional shares for depositing these tokens into the contract.

The current state:
* `StrategyBase` total shares: 1,001,000
* `StrategyBase` token balance: **2,001,000**
* Alice's shares: 1,000,000
* Alice's "deserved" token balance: **2,000,000**

The exchange rate is now ~2 tokens : 1 share. More accurately, it is 2,001,000 tokens : 1,001,000 shares, or ~1.999 tokens : 1 share.

So let's ask the question: how many tokens can Alice withdraw given her 1 million shares?

* Alice's 1 million shares * 2,001,000 tokens / 1,001,000 shares = 1,999,000 tokens. **Lower* than the expected 2,000,000 tokens.**

As we can see, Alice is not able to withdraw her intended amount of tokens, even though she has a vast majority of the shares. She actually *loses* 1000 tokens due to the virtual depositor.

Let's see what happens when Bob deposits his 1000 tokens. Given the exchange rate of ~2 tokens : 1 share, we expect him to receive 500 shares for his deposit. We calculate this as follows:

* Bob's 1000 tokens * 1,001,000 shares / 2,001,000 tokens = 500.25 shares = 500 shares (due to rounding)

The current state:
* `StrategyBase` total shares: **1,001,500**
* `StrategyBase` token balance: **2,002,000**
* Alice's shares: 1,000,000
* Alice's "deserved" token balance: 2,000,000
* Bob's shares: **500**
* Bob's "deserved" token balance: **1,000**

As we can see, Bob receives 500 shares for his deposit, as expected. If he attempts to withdraw:

* Bob's 500 shares * 2,002,000 tokens / 1,001,500 shares = 999.5 tokens = 999 tokens (due to rounding). ***Correct!**

Alice, the attempted attacker, is the one who loses in this scenario. Bob loses one token, but Alice loses 1000 tokens, and locks up significant capital for her troubles. An attacker **is not economically incentivized** to perform an inflation attack, as they will lose out in the end.

As such, the virtual depositor is a useful mechanism to protect against inflation attacks, even when the attacker has a vast majority of the shares.

#### Attack Variation: Flash Loans

You may be wondering, what if Alice performs a flash loan attack? These provide large amounts of capital on demand, and perhaps enough capital can make an inflation attack profitable.

First, similar to how Alice lost capital to the virtual depositor in the previous scenario, she will lose capital when performing the flash loan attack. This alone prevents her attack from being profitable, even in the best case scenario.

Say that Alice is, for lack of a better term, "insane" and chooses to disobey economic incentives. Note that typical flash loans only provide capital [within a given transaction](https://aave.com/docs/developers/flash-loans#:~:text=the%20borrowed%20amount%20(and%20a%20fee)%20is%20returned%20before%20the%20end%20of%20the%20transaction), and are not able to be borrowed over any larger unit of time. As such, flash loans are not a viable route for performing this attack in the first place.

#### Mitigation Side Effects

The virtual depositor has a few side effects that are important to note.

* **Rebase dilution:** In the event of a token rebase, user token balances will typically increase by the rebase factor. However, the virtual depositor's token balance will not increase by the same factor, as it is a fixed amount. This means that user gains will be mildly diluted over time.
  * However, as the virtual depositor only has 1e3 shares and tokens, this effect is negligible (estimated to be 1 part in 1e20).
* **Negative rebase:** In the event of a "negative rebase," where the token balance decreases, not all users may be able to withdraw. The `StrategyBase` contract will have more shares than assets due to this loss of principal. As a result, the last depositor(s) will not be able to withdraw. This is because the virtual depositor's shares and tokens are fixed, and are not subject to the loss of principal. Thus, the last withdrawal(s) will attempt to withdraw more tokens than the `StrategyBase` contract has.
  * However, this is expected to occur infrequently, if ever. For example, many rebasing tokens such as LSTs only undergo negative rebases in the event of a beacon chain slash, which is a rare event. Given this minimal impact, we do not consider this a significant issue.

## Conclusion

Shares are a useful mechanism to manage the accounting of a `StrategyBase` contract. They allow for tracking a user's proportional claim to the `StrategyBase`'s token balance, ensuring that users can withdraw their intended amount of tokens even in the presence of rebase or other token behavior.

Typically, this model is vulnerable to an "inflation attack," but the virtual depositor mitigation protects against this. It is a simple and effective mechanism to prevent a first depositor from manipulating the exchange rate to their benefit, as they lose the advantages typically associated with the first depositor.

Any attacker attempting to perform an inflation attack will lose out in the end. Even if they seek to grief other users, the amount of capital required to perform the attack in the first place is extremely high. Though there are small side effects to the virtual depositor, they are negligible and do not impact the core functionality of the `StrategyBase` contract.
````

## File: docs/core/libraries/Merkle.md
````markdown
## Merkle

| File | Notes |
| -------- | -------- |
| [`Merkle.sol`](../../../src/contracts/libraries/Merkle.sol) | Core Merkle tree library |

## Overview

The `Merkle` library provides cryptographically secure Merkle tree functionality for the EigenLayer protocol. It supports both Keccak256 and SHA-256 hash functions for different use cases across the system. The library enables efficient verification of data inclusion in large datasets without requiring the full dataset, which is essential for scalable proof systems in EigenLayer.

Key capabilities include:
- **Proof verification**: Verify that a leaf exists in a Merkle tree given a root and proof
- **Tree construction**: Build Merkle trees from arrays of leaves
- **Proof generation**: Generate inclusion proofs for specific leaves
- **Dual hash function support**: Both Keccak256 (for EVM compatibility) and SHA-256 (for beacon chain compatibility)

## Prior Reading

* Understanding of [Merkle trees](https://en.wikipedia.org/wiki/Merkle_tree) and cryptographic hash functions
* [EIP-197](https://eips.ethereum.org/EIPS/eip-197) for understanding precompiled contracts

## Usage in EigenLayer

The Merkle library is used extensively throughout EigenLayer for various proof systems:

- **[`BN254CertificateVerifier`](../../../src/contracts/multichain/BN254CertificateVerifier.sol)**: Verifies operator information inclusion in certificate Merkle trees (see [CertificateVerifier.md](../../multichain/destination/CertificateVerifier.md))
- **[`OperatorTableUpdater`](../../../src/contracts/multichain/OperatorTableUpdater.sol)**: Manages operator set proofs for multichain operations (see [OperatorTableUpdater.md](../../multichain/destination/OperatorTableUpdater.md))
- **[`RewardsCoordinator`](../../../src/contracts/core/RewardsCoordinator.sol)**: Verifies reward distribution claims (see [RewardsCoordinator.md](../RewardsCoordinator.md))
- **[`BeaconChainProofs`](../../../src/contracts/libraries/BeaconChainProofs.sol)**: Processes beacon chain state proofs (see [EigenPod.md](../EigenPod.md) for beacon chain proof usage)

## Security Considerations

### **Critical Security Warning**

**You should avoid using leaf values that are 64 bytes long prior to hashing, salt the leaves, or hash the leaves with a hash function other than what is used for the Merkle tree's internal nodes.** This prevents potential collision attacks where the concatenation of a sorted pair of internal nodes could be reinterpreted as a leaf value.

### **Zero Hash Padding**

When trees are not perfect powers of 2, the library pads with `bytes32(0)` values. For security-critical applications, consider using unique filler values to prevent potential collision attacks with legitimate zero-valued leaves.

---

## Proof Verification

### **Keccak256 Proof Verification**

#### `verifyInclusionKeccak`

```solidity
function verifyInclusionKeccak(
    bytes memory proof,
    bytes32 root,
    bytes32 leaf,
    uint256 index
) internal pure returns (bool)
```

Verifies that a given leaf is included in a Merkle tree using Keccak256.

*Effects:*
* Computes the root hash by traversing the Merkle proof path
* Compares computed root with expected root for verification

*Used in:*
* [`BN254CertificateVerifier.verifyOperatorInfoProof`](../../../src/contracts/multichain/BN254CertificateVerifier.sol)
* [`OperatorTableUpdater.checkGlobalTableHash`](../../../src/contracts/multichain/OperatorTableUpdater.sol)
* [`RewardsCoordinator`](../../../src/contracts/core/RewardsCoordinator.sol) for reward claim verification

#### `processInclusionProofKeccak`

```solidity
function processInclusionProofKeccak(
    bytes memory proof,
    bytes32 leaf,
    uint256 index
) internal pure returns (bytes32)
```

Returns the computed root hash by traversing up the tree from the leaf.

*Effects:*
* Traverses the Merkle tree from leaf to root using provided proof
* Computes hash at each level by combining current hash with proof siblings
* Returns the final computed root hash

*Requirements:*
* Proof length MUST be a multiple of 32 bytes (reverts with `InvalidProofLength` otherwise)
* Index MUST reach 0 after processing all proof elements (reverts with `InvalidIndex` if proof length mismatch)

### **SHA-256 Proof Verification**

#### `verifyInclusionSha256`

```solidity
function verifyInclusionSha256(
    bytes memory proof,
    bytes32 root,
    bytes32 leaf,
    uint256 index
) internal pure returns (bool)
```

Verifies inclusion using SHA-256 hash function via precompiled contract.

*Effects:*
* Computes the root hash using SHA-256 via precompiled contract
* Compares computed root with expected root for verification

*Used in:*
* [`BeaconChainProofs`](../../../src/contracts/libraries/BeaconChainProofs.sol) for beacon chain state verification

#### `processInclusionProofSha256`

```solidity
function processInclusionProofSha256(
    bytes memory proof,
    bytes32 leaf,
    uint256 index
) internal view returns (bytes32)
```

Returns the computed root hash by traversing up the tree from the leaf using SHA-256.

*Effects:*
* Traverses the Merkle tree from leaf to root using provided proof
* Computes hash at each level combining current hash with proof siblings
* Returns the final computed root hash

*Requirements:*
* Proof length MUST be non-zero and a multiple of 32 bytes (reverts with `InvalidProofLength` otherwise)
* Index MUST reach 0 after processing all proof elements (reverts with `InvalidIndex` if proof length mismatch)

---

## Tree Construction

### **Keccak256 Tree Construction**

#### `merkleizeKeccak`

```solidity
function merkleizeKeccak(bytes32[] memory leaves) internal pure returns (bytes32)
```

Constructs a Merkle tree root from an array of leaves using Keccak256. Accepts any non-empty array of leaves, including single-leaf trees, and automatically pads to the next power of 2 using `bytes32(0)` values.

*Effects:*
* Pads input array to next power of 2 (if needed) using `bytes32(0)` values
* Constructs binary Merkle tree bottom-up by hashing pairs using in-place array modification
* For single-leaf arrays, returns the leaf itself as the root
* Returns the single root hash representing the entire tree

*Algorithm:*
1. Pad leaves array to next power of 2
2. Iteratively hash pairs level by level until single root remains
3. Uses in-place array modification for gas efficiency

*Used in:*
* [`BN254CertificateVerifier`](../../../src/contracts/multichain/BN254CertificateVerifier.sol) for operator info trees
* [`OperatorTableUpdater`](../../../src/contracts/multichain/OperatorTableUpdater.sol) for operator set hashing

### **SHA-256 Tree Construction**

#### `merkleizeSha256`

```solidity
function merkleizeSha256(bytes32[] memory leaves) internal pure returns (bytes32)
```

Constructs a Merkle tree root using SHA-256 hash function.

*Effects:*
* Validates input meets strict requirements (power of 2, minimum 2 leaves)
* Constructs binary Merkle tree bottom-up using SHA-256 hashing
* Returns the single root hash representing the entire tree

*Requirements*:
* Input array MUST contain at least 2 leaves (rejects single-leaf trees with `NotEnoughLeaves` error)
* Input array length MUST be an exact power of 2 (validates with `LeavesNotPowerOfTwo` error)
* No auto-padding available - stricter requirements for beacon chain compatibility

*Used in:*
* [`BeaconChainProofs`](../../../src/contracts/libraries/BeaconChainProofs.sol) for beacon chain compatibility

---

## Proof Generation

### **Keccak256 Proof Generation**

#### `getProofKeccak`

```solidity
function getProofKeccak(bytes32[] memory leaves, uint256 index) internal pure returns (bytes memory proof)
```

Generates an inclusion proof for a specific leaf in a Keccak256 tree. Supports single-leaf trees (returns empty proof) and automatically handles non-power-of-2 leaf arrays through padding.

*Effects:*
* Constructs a Merkle tree from the provided leaves with automatic padding
* Traverses from specified leaf to root, collecting sibling hashes at each level
* For single-leaf trees, returns empty proof since root equals leaf
* Returns concatenated proof bytes for verification

*Algorithm:*
1. Pad leaves to next power of 2
2. For each tree level, find sibling of current index
3. Append sibling to proof bytes
4. Move up tree by dividing index by 2
5. Continue until reaching root

*Used in:*
* Test frameworks for generating proofs
* Off-chain proof generation systems

### **SHA-256 Proof Generation**

#### `getProofSha256`

```solidity
function getProofSha256(bytes32[] memory leaves, uint256 index) internal pure returns (bytes memory proof)
```

Generates SHA-256 inclusion proof with same algorithm as Keccak version but using SHA-256 hashing.

*Effects:*
* Validates input meets SHA-256 requirements (minimum 2 leaves)
* Constructs a Merkle tree using SHA-256 hashing
* Traverses from specified leaf to root, collecting sibling hashes
* Returns concatenated proof bytes for verification

*Requirements*:
* Input array MUST contain at least 2 leaves (rejects single-leaf trees with `NotEnoughLeaves` error)
* Cannot generate proofs for single-element arrays
* Follows stricter validation for beacon chain compatibility

---

## Utility Functions

### **Power of Two Check**

#### `isPowerOfTwo`

```solidity
function isPowerOfTwo(uint256 value) internal pure returns (bool)
```

Efficiently determines if a value is a power of 2 using bit manipulation.

*Effects:*
* Performs bitwise operations to check power-of-2 property

*Used internally* for validation in `merkleizeSha256` and optimization paths.

---

## Error Reference

| Error | Code | Description |
|-------|------|-------------|
| `InvalidProofLength` | `0x4dc5f6a4` | Proof length not multiple of 32 bytes |
| `InvalidIndex` | `0x63df8171` | Index outside valid range for tree |
| `LeavesNotPowerOfTwo` | `0xf6558f51` | Leaves array not power of 2 (SHA-256 only) |
| `NoLeaves` | `0xbaec3d9a` | Empty leaves array provided |
| `NotEnoughLeaves` | `0xf8ef0367` | Less than 2 leaves for SHA-256 operations |

---

## Implementation Optimizations

### **Assembly Usage**
- Proof verification uses inline assembly for gas efficiency
- Manual memory management avoids Solidity's safety overhead
- Direct opcode usage (Keccak256) vs precompile calls (SHA-256)

### **Memory Efficiency**
- Tree construction reuses input array space
- In-place modifications reduce memory allocation costs
- Sibling calculation uses XOR instead of arithmetic operations

### **Precompile Handling**
- SHA-256 functions reserve gas before precompile calls
- Static call pattern optimized for success case
- Explicit revert handling for precompile failures

---

## Implementation Notes

### **Keccak256 vs SHA-256 Differences**

The library provides two distinct implementations with different design philosophies:

| Feature | Keccak256 Functions | SHA-256 Functions |
|---------|-------------------|-------------------|
| **Single-leaf trees** | ✅ Supported | ❌ Rejected (`NotEnoughLeaves`) |
| **Input validation** | Flexible (any non-empty array) | Strict (≥2 leaves, power of 2) |
| **Auto-padding** | ✅ Pads to next power of 2 | ❌ Requires exact power of 2 |
| **Use case** | General EVM Merkle trees | Beacon chain compatibility |
| **Error handling** | Permissive | Strict validation |

### **Tree Padding Strategy**
The library uses different padding strategies for different hash functions:

- **Keccak256**: Pads with `bytes32(0)` to next power of 2
- **SHA-256**: Requires exact power of 2, no padding

### **Index Validation**
Index validation occurs during proof processing rather than upfront, allowing the tree traversal algorithm to naturally detect out-of-bounds conditions.

### **Memory Layout**
Proof bytes are laid out as concatenated 32-byte chunks: `[sibling₀, sibling₁, ..., siblingₙ]` where siblings are sequenced by tree depth, with `sibling₀` being the sibling at the leaf level, `sibling₁` at the next level up, and so on until reaching the root.
````

## File: docs/core/AllocationManager.md
````markdown
# AllocationManager

| File | Notes |
| -------- | -------- |
| [`AllocationManager.sol`](../../src/contracts/core/AllocationManager.sol) |  |
| [`AllocationManagerStorage.sol`](../../src/contracts/core/AllocationManagerStorage.sol) | state variables |
| [`IAllocationManager.sol`](../../src/contracts/interfaces/IAllocationManager.sol) | interface |

Libraries and Mixins:

| File | Notes |
| -------- | -------- |
| [`SplitContractMixin.sol`](../../src/contracts/mixins/SplitContractMixin.sol) | contract splitting for codesize optimization |
| [`PermissionControllerMixin.sol`](../../src/contracts/mixins/PermissionControllerMixin.sol) | account delegation |
| [`Deprecated_OwnableUpgradeable`](../../src/contracts/mixins/Deprecated_OwnableUpgradeable.sol) | deprecated ownable logic |
| [`Pausable.sol`](../../src/contracts/permissions/Pausable.sol) | |
| [`SlashingLib.sol`](../../src/contracts/libraries/SlashingLib.sol) | slashing math |
| [`OperatorSetLib.sol`](../../src/contracts/libraries/OperatorSetLib.sol) | encode/decode operator sets |
| [`Snapshots.sol`](../../src/contracts/libraries/Snapshots.sol) | historical state |

### Function Deprecation Notice Q2 2026

The `v1.9.0` slashing upgrade introduces a single slasher per operatorSet that is stored in the `AllocationManager`. The functions in the leftmost column will be deprecated in Q2 2026 in favor of the newly specified function (if applicable). 

| Function | MigrateTo | Notes |
| -------- | -------- | -------- |
| `createOperatorSets(avs, CreateSetParams[])` | `createOperatorSets(address avs, CreateSetParamsV2[])` | New function takes in a slasher address |
| `createRedistributingOperatorSets(avs, CreateSetParams[], redistributionRecipients[])` | `createRedistributingOperatorSets(avs, CreateSetParamsV2[], redistributionRecipients[])` | New function takes in a slasher address |
| [`migrateSlashers(operatorSets[])`](#migrateslashers) | N/A | Migration function to migrate slashers from the `PermissionController` to the `AllocationManager` |

## Prior Reading

* [ELIP-002: Slashing via Unique Stake and Operator Sets](https://github.com/eigenfoundation/ELIPs/blob/main/ELIPs/ELIP-002.md)

## Overview

The `AllocationManager` manages AVS metadata registration, registration and deregistration of operators to operator sets, handles allocation and slashing of operators' slashable stake, and is the entry point an AVS uses to slash an operator. An AVS in the context of `AllocationManager` is defined as the `address` of the contract that implements [ServiceManagerBase](https://github.com/Layr-Labs/eigenlayer-middleware/blob/mainnet/docs/ServiceManagerBase.md). For `PermissionController` purposes, this AVS address is also the AVS [account](https://github.com/Layr-Labs/eigenlayer-contracts/blob/dev/docs/permissions/PermissionController.md#accounts).



The `AllocationManager's` responsibilities are broken down into the following concepts:

* [Contract Architecture](#contract-architecture)
* [AVS Metadata](#avs-metadata)
* [Operator Sets](#operator-sets)
* [Allocations and Slashing](#allocations-and-slashing)
* [Config](#config)

## Contract Architecture

The `AllocationManager` uses a **split contract pattern** implemented via the `SplitContractMixin` to address EVM contract size limitations while maintaining full backwards compatibility.

```mermaid
graph TD
Alice --> |call| Proxy["AllocationManager Proxy"]
Proxy -->|delegatecall| Logic["AllocationManager Logic"]
Logic -->|_delegateView| View["AllocationManager View"]
```

### Split Contract Pattern

**Main Contract (`AllocationManager`):**
- Contains all state-mutating functions (actions)
- Inherits from `SplitContractMixin` which provides delegation capabilities
- Delegates all view function calls to the separate view contract
- Maintains the same external interface as a monolithic contract

**View Contract (`AllocationManagerView`):**
- Contains all read-only view functions
- Shares the same storage layout as the main contract using `layout at 151` directive
- Implements the same `IAllocationManagerView` interface

### Rationale

**Codesize Optimization:**
- The EVM has a contract size limit of 24KB (24,576 bytes) for deployed contracts
- Complex contracts like `AllocationManager` with extensive functionality can exceed this limit
- By splitting view functions into a separate contract, the main contract stays under the size limit
- This allows for more comprehensive functionality without compromising deployability

**Backwards Compatibility:**
- The external interface remains identical to a monolithic contract
- All existing integrations continue to work without modification
- View functions are transparently delegated using `_delegateView()`
- No breaking changes to the ABI or function signatures

**Implementation Details:**
- View functions in the main contract use `_delegateView(viewImplementation)` to delegate calls.
- The `viewImplementation` address is set during construction and stored as an immutable variable.
- The `_delegateView()` function conveniently indicates which calls are intended to be delegated as view functions, but it does not enforce this at the EVM level; rather, it signals intended usage and expected behavior to the user or integrator. 
- Both contracts are aligned in storage layout, so all state variables are accessible as intended.

This pattern is especially useful for complex contracts that require a comprehensive set of view functions while maintaining the ability to perform state mutations. It helps keep contracts deployable within EVM bytecode limits, while making clear which functions are for data retrieval.

## Parameterization

* `ALLOCATION_CONFIGURATION_DELAY`: The delay in blocks before allocations take effect.
    * Mainnet: `126000 blocks` (17.5 days).
    * Testnet: `75 blocks` (15 minutes).
* `DEALLOCATION_DELAY`: The delay in blocks before deallocations take effect.
    * Mainnet: `100800 blocks` (14 days).
    * Testnet: `50 blocks` (10 minutes).
* `SLASHER_CONFIGURATION_DELAY`: The delay in blocks before slasher changes take effect.
    * Currently set to the same value as `ALLOCATION_CONFIGURATION_DELAY`.
    * Can be changed independently in future upgrades.

---

## AVS Metadata

AVSs must register their metadata to declare themselves who they are as the first step, before they can create operator sets or register operators into operator sets. `AllocationManager` keeps track of AVSs that have registered metadata.

**Methods:**
* [`updateAVSMetadataURI`](#updateavsmetadatauri)


#### `updateAVSMetadataURI`

```solidity
/**
 *  @notice Called by an AVS to emit an `AVSMetadataURIUpdated` event indicating the information has updated.
 *
 *  @param metadataURI The URI for metadata associated with an AVS.
 *
 *  @dev Note that the `metadataURI` is *never stored* and is only emitted in the `AVSMetadataURIUpdated` event.
 */
function updateAVSMetadataURI(
    address avs, 
    string calldata metadataURI
) 
    external
    checkCanCall(avs)
```

_Note: this method can be called directly by an AVS, or by a caller authorized by the AVS. See [`PermissionController.md`](../permissions/PermissionController.md) for details._

Invoking this function effectively "enshrines" the AVS address in the core protocol.

Below is the format AVSs should use when updating their metadata URI initially. This is not validated onchain.

```json
{
    "name": "AVS",
    "website": "https.avs.xyz/",
    "description": "Some description about",
    "logo": "http://github.com/logo.png",
    "twitter": "https://twitter.com/avs",
}
```


Later on, once AVSs have created operator sets, content in their metadata URI can be updated subsequently.

```json
{
    "name": "AVS",
    "website": "https.avs.xyz/",
    "description": "Some description about",
    "logo": "http://github.com/logo.png",
    "twitter": "https://twitter.com/avs",
    "operatorSets": [
        {
            "name": "ETH Set",
            "id": "1", // Note: we use this param to match the opSet id in the Allocation Manager
            "description": "The ETH operatorSet for AVS",
            "software": [
                {
                    "name": "NetworkMonitor",
                    "description": "",
                    "url": "https://link-to-binary-or-github.com"
                },
                {
                    "name": "ValidatorClient",
                    "description": "",
                    "url": "https://link-to-binary-or-github.com"
                }
            ],
            "slashingConditions": ["Condition A", "Condition B"]
        },
        {
            "name": "EIGEN Set",
            "id": "2", // Note: we use this param to match the opSet id in the Allocation Manager
            "description": "The EIGEN operatorSet for AVS",
            "software": [
                {
                    "name": "NetworkMonitor",
                    "description": "",
                    "url": "https://link-to-binary-or-github.com"
                },
                {
                    "name": "ValidatorClient",
                    "description": "",
                    "url": "https://link-to-binary-or-github.com"
                }
            ],
            "slashingConditions": ["Condition A", "Condition B"]
        }
    ]
}
```

*Effects*:
* Emits an `AVSMetadataURIUpdated` event for use in offchain services

*Requirements*:
* Caller MUST be authorized, either as the AVS itself or an admin/appointee (see [`PermissionController.md`](../permissions/PermissionController.md))


## Operator Sets

Operator sets, as described in [ELIP-002](https://github.com/eigenfoundation/ELIPs/blob/main/ELIPs/ELIP-002.md#operator-sets), are useful for AVSs to configure operator groupings which can be assigned different tasks, rewarded based on their strategy allocations, and slashed according to different rules. Operator sets are defined in [`libraries/OperatorSetLib.sol`](../../src/contracts/libraries/OperatorSetLib.sol):

```solidity
/**
 * @notice An operator set identified by the AVS address and an identifier
 * @param avs The address of the AVS this operator set belongs to
 * @param id The unique identifier for the operator set
 */
struct OperatorSet {
    address avs;
    uint32 id;
}
```

The `AllocationManager` tracks operator sets and members of operator sets in the following mappings:

```solidity
/// @dev Lists the operator set ids an AVS has created
mapping(address avs => EnumerableSet.UintSet) internal _operatorSets;

/// @dev Lists the members of an AVS's operator set
mapping(bytes32 operatorSetKey => EnumerableSet.AddressSet) internal _operatorSetMembers;
```

Every `OperatorSet` corresponds to a single AVS, as indicated by the `avs` parameter. On creation, the AVS provides an `id` (unique to that AVS), as well as a list of `strategies` the `OperatorSet` includes. Together, the `avs` and `id` form the `key` that uniquely identifies a given `OperatorSet`. Operators can register to and deregister from operator sets. In combination with allocating slashable magnitude, operator set registration forms the basis of operator slashability (discussed further in [Allocations and Slashing](#allocations-and-slashing)). There are two types of operatorSets, redistributing and non-redistributing. 

**Concepts:**
* [Registration Status](#registration-status)

**Methods:**
* [`createOperatorSets`](#createoperatorsets)
* [`createRedistributingOperatorSets`](#createredistributingoperatorsets)
* [`addStrategiesToOperatorSet`](#addstrategiestooperatorset)
* [`removeStrategiesFromOperatorSet`](#removestrategiesfromoperatorset)
* [`registerForOperatorSets`](#registerforoperatorsets)
* [`deregisterFromOperatorSets`](#deregisterfromoperatorsets)

#### Registration Status

Operator registration and deregistration is tracked in the following state variables:

```solidity
/// @dev Lists the operator sets the operator is registered for. Note that an operator
/// can be registered without allocated stake. Likewise, an operator can allocate
/// without being registered.
mapping(address operator => EnumerableSet.Bytes32Set) internal registeredSets;

/**
 * @notice Contains registration details for an operator pertaining to an operator set
 * @param registered Whether the operator is currently registered for the operator set
 * @param slashableUntil If the operator is not registered, they are still slashable until
 * this block is reached.
 */
struct RegistrationStatus {
    bool registered;
    uint32 slashableUntil;
}

/// @dev Contains the operator's registration status for an operator set.
mapping(address operator => mapping(bytes32 operatorSetKey => RegistrationStatus)) internal registrationStatus;
```

For each operator, `registeredSets` keeps a list of `OperatorSet` `keys` for which the operator is currently registered. Each operator registration and deregistration respectively adds and removes the relevant `key` for a given operator. An additional factor in registration is the operator's `RegistrationStatus`.

The `RegistrationStatus.slashableUntil` value is used to ensure an operator remains slashable for a period of time after they initiate deregistration. This is to prevent an operator from committing a slashable offence and immediately deregistering to avoid penalty. This means that when an operator deregisters from an operator set, their `RegistrationStatus.slashableUntil` value is set to `block.number + DEALLOCATION_DELAY`.

#### `createOperatorSets`

***Note: The `createOperatorSets` function that uses `CreateSetParams` will be deprecated in favor of `createOperatorSets` that takes in `CreateSetParamsV2` (with a slasher) in Q2 2026.***

```solidity
/**
 * @notice Parameters used by an AVS to create new operator sets
 * @param operatorSetId the id of the operator set to create
 * @param strategies the strategies to add as slashable to the operator set
 * @dev This struct and its associated method will be deprecated in Early Q2 2026
 */
struct CreateSetParams {
    uint32 operatorSetId;
    IStrategy[] strategies;
}

/**
 * @notice Parameters used by an AVS to create new operator sets
 * @param operatorSetId the id of the operator set to create
 * @param strategies the strategies to add as slashable to the operator set
 * @param slasher the address that will be the slasher for the operator set
 */

struct CreateSetParamsV2 {
    uint32 operatorSetId;
    IStrategy[] strategies;
    address slasher;
}

/**
 * @notice Allows an AVS to create new operator sets, defining strategies that the operator set uses
 * @dev Upon creation, the address that can slash the operatorSet is the `avs` address. If you would like to use a different address,
 *      use the `createOperatorSets` method which takes in `CreateSetParamsV2` instead.
 * @dev THIS FUNCTION WILL BE DEPRECATED IN EARLY Q2 2026 IN FAVOR OF `createOperatorSets`, WHICH TAKES IN `CreateSetParamsV2`
 * @dev Reverts for: 
 *      - NonexistentAVSMetadata: The AVS metadata is not registered
 *      - InvalidOperatorSet: The operatorSet already exists
 *      - InputAddressZero: The slasher is the zero address
 */
function createOperatorSets(address avs, CreateSetParams[] calldata params) external checkCanCall(avs);

/**
 * @notice Allows an AVS to create new operator sets, defining strategies that the operator set uses
 * @dev Reverts for: 
 *      - NonexistentAVSMetadata: The AVS metadata is not registered
 *      - InvalidOperatorSet: The operatorSet already exists
 *      - InputAddressZero: The slasher is the zero address
 */
function createOperatorSets(address avs, CreateSetParamsV2[] calldata params) external checkCanCall(avs);
```

_Note: this method can be called directly by an AVS, or by a caller authorized by the AVS. See [`PermissionController.md`](../permissions/PermissionController.md) for details._

AVSs use this method to create new operator sets. An AVS can create as many operator sets as they desire, depending on their needs. Once created, operators can [allocate slashable stake to](#modifyallocations) and [register for](#registerforoperatorsets) these operator sets. The `redistributionRecipient` is the `DEFAULT_BURN_ADDRESS`, where slashed funds are sent.

On creation, the `avs` specifies an `operatorSetId` unique to the AVS. Together, the `avs` address and `operatorSetId` create a `key` that uniquely identifies this operator set throughout the `AllocationManager`.

The `avs` also specifies a `slasher`, an address that can slash the operatorSet. For the `createOperatorSets` function that takes in the *old* `CreateSetParams` struct, the slasher is set to the `avs` address. 

Optionally, the `avs` can provide a list of `strategies`, specifying which strategies will be slashable for the new operator set. AVSs may create operator sets with various strategies based on their needs - and strategies may be added to more than one operator set.

*Effects*:
* For each `CreateSetParams` element:
    * For each `params.strategies` element:
        * Add `strategy` to `_operatorSetStrategies[operatorSetKey]`
        * Emits `StrategyAddedToOperatorSet` event
    * Sets the slasher in `_slashers[operatorSetKey]`, with an `effectBlock = uint32(block.number)`, allowing the slasher to be active immediately. Both `slasher` and `pendingSlasher` fields are set to ensure storage consistency.
    * Emits a `SlasherUpdated` event


*Requirements*:
* Caller MUST be authorized, either as the AVS itself or an admin/appointee (see [`PermissionController.md`](../permissions/PermissionController.md))
* AVS MUST have registered metadata via calling `updateAVSMetadataURI`
* For each `CreateSetParams` element:
    * Each `params.operatorSetId` MUST NOT already exist in `_operatorSets[avs]`
    * The `slasher` MUST NOT be the zero address

#### `createRedistributingOperatorSets`

***Note: The `createRedistributingOperatorSets` function that uses `CreateSetParams` will be deprecated in favor of `createOperatorSets` that takes in `CreateSetParamsV2` (with a slasher) in Q2 2026.***

```solidity
/**
 * @notice Allows an AVS to create new Redistribution operator sets.
 * @param avs The AVS creating the new operator sets.
 * @param params An array of operator set creation parameters.
 * @param redistributionRecipients An array of addresses that will receive redistributed funds when operators are slashed.
 * @dev Same logic as `createOperatorSets`, except `redistributionRecipients` corresponding to each operator set are stored.
 *      Additionally, emits `RedistributionOperatorSetCreated` event instead of `OperatorSetCreated` for each created operator set.
 * @dev The address that can slash the operatorSet is the `avs` address. If you would like to use a different address,
 *      use the `createOperatorSets` method which takes in `CreateSetParamsV2` instead.
 * @dev THIS FUNCTION WILL BE DEPRECATED IN EARLY Q2 2026 IN FAVOR OF `createRedistributingOperatorSets` WHICH TAKES IN `CreateSetParamsV2`
 * @dev Reverts for:
 *      - InputArrayLengthMismatch: The length of the params array does not match the length of the redistributionRecipients array
 *      - NonexistentAVSMetadata: The AVS metadata is not registered
 *      - InputAddressZero: The redistribution recipient is the zero address
 *      - InvalidRedistributionRecipient: The redistribution recipient is the zero address or the default burn address
 *      - InvalidOperatorSet: The operatorSet already exists
 *      - InvalidStrategy: The strategy is the BEACONCHAIN_ETH_STRAT or the EIGEN strategy
 *      - InputAddressZero: The slasher is the zero address
 */
function createRedistributingOperatorSets(
    address avs,
    CreateSetParams[] calldata params,
    address[] calldata redistributionRecipients
) external checkCanCall(avs);

/**
 * @notice Allows an AVS to create new Redistribution operator sets.
 * @param avs The AVS creating the new operator sets.
 * @param params An array of operator set creation parameters.
 * @param redistributionRecipients An array of addresses that will receive redistributed funds when operators are slashed.
 * @dev Same logic as `createOperatorSets`, except `redistributionRecipients` corresponding to each operator set are stored.
 *      Additionally, emits `RedistributionOperatorSetCreated` event instead of `OperatorSetCreated` for each created operator set.
 * @dev Reverts for:
 *      - InputArrayLengthMismatch: The length of the params array does not match the length of the redistributionRecipients array
 *      - NonexistentAVSMetadata: The AVS metadata is not registered
 *      - InputAddressZero: The redistribution recipient is the zero address
 *      - InvalidRedistributionRecipient: The redistribution recipient is the zero address or the default burn address
 *      - InvalidOperatorSet: The operatorSet already exists
 *      - InvalidStrategy: The strategy is the BEACONCHAIN_ETH_STRAT or the EIGEN strategy
 *      - InputAddressZero: The slasher is the zero address
 */
function createRedistributingOperatorSets(
    address avs,
    CreateSetParamsV2[] calldata params,
    address[] calldata redistributionRecipients
) external checkCanCall(avs);
```

AVSs use this method to create new redistributing operatorSets. Unlike the previous function, slashed funds for this operatorSet are sent to a `redistributionRecipient`. This value is set only once, upon creation. Note that redistributing operatorSets may not have Native ETH, as the protocol does not support native eth redistribution. See [ELIP-006](https://github.com/eigenfoundation/ELIPs/blob/main/ELIPs/ELIP-006.md) for additional context. 

*Effects*:
* For each `CreateSetParams` element:
    * For each `params.strategies` element:
        * Add `strategy` to `_operatorSetStrategies[operatorSetKey]`
        * Emits `StrategyAddedToOperatorSet` event
    * Sets the `redistributionRecipient` of the operatorSet
        * Emits the `RedistributionAddressSet`
    * Sets the slasher in `_slashers[operatorSetKey]`, with an `effectBlock = uint32(block.number)`, allowing the slasher to be active immediately
    * Emits a `SlasherUpdated` event

*Requirements*:
* Caller MUST be authorized, either as the AVS itself or an admin/appointee (see [`PermissionController.md`](../permissions/PermissionController.md))
* AVS MUST have registered metadata via calling `updateAVSMetadataURI`
* The `redistributionRecipient` MUST NOT  be the 0 address
* For each `CreateSetParams` element:
    * Each `params.operatorSetId` MUST NOT already exist in `_operatorSets[avs]`
    * The `slasher` MUST NOT be the zero address
    
#### `addStrategiesToOperatorSet`

```solidity
/**
 * @notice Allows an AVS to add strategies to an operator set
 * @dev Strategies MUST NOT already exist in the operator set
 * @param avs the avs to set strategies for
 * @param operatorSetId the operator set to add strategies to
 * @param strategies the strategies to add
 */
function addStrategiesToOperatorSet(
    address avs,
    uint32 operatorSetId,
    IStrategy[] calldata strategies
)
    external
    checkCanCall(avs)
```

_Note: this method can be called directly by an AVS, or by a caller authorized by the AVS. See [`PermissionController.md`](../permissions/PermissionController.md) for details._

This function allows an AVS to add slashable strategies to a given operator set. If any strategy is already registered for the given operator set, the entire call will fail.

*Effects*:
* For each `strategies` element:
    * Adds the strategy to `_operatorSetStrategies[operatorSetKey]`
    * Emits a `StrategyAddedToOperatorSet` event

*Requirements*:
* Caller MUST be authorized, either as the AVS itself or an admin/appointee (see [`PermissionController.md`](../permissions/PermissionController.md))
* The operator set MUST be registered for the AVS
* Each proposed strategy MUST NOT be registered for the operator set
* If the operatorSet is redistributing, the `BEACONCHAIN_ETH_STRAT` may not be added, since redistribution is not supported for native eth

#### `removeStrategiesFromOperatorSet`

```solidity
/**
 * @notice Allows an AVS to remove strategies from an operator set
 * @dev Strategies MUST already exist in the operator set
 * @param avs the avs to remove strategies for
 * @param operatorSetId the operator set to remove strategies from
 * @param strategies the strategies to remove
 */
function removeStrategiesFromOperatorSet(
    address avs,
    uint32 operatorSetId,
    IStrategy[] calldata strategies
)
    external
    checkCanCall(avs)
```

_Note: this method can be called directly by an AVS, or by a caller authorized by the AVS. See [`PermissionController.md`](../permissions/PermissionController.md) for details._

This function allows an AVS to remove slashable strategies from a given operator set. If any strategy is not registered for the given operator set, the entire call will fail.

*Effects*:
* For each `strategies` element:
    * Removes the strategy from `_operatorSetStrategies[operatorSetKey]`
    * Emits a `StrategyRemovedFromOperatorSet` event

*Requirements*:
* Caller MUST be authorized, either as the AVS itself or an admin/appointee (see [`PermissionController.md`](../permissions/PermissionController.md))
* The operator set MUST be registered for the AVS
* Each proposed strategy MUST be registered for the operator set

#### `registerForOperatorSets`

```solidity
/**
 * @notice Parameters used to register for an AVS's operator sets
 * @param avs the AVS being registered for
 * @param operatorSetIds the operator sets within the AVS to register for
 * @param data extra data to be passed to the AVS to complete registration
 */
struct RegisterParams {
    address avs;
    uint32[] operatorSetIds;
    bytes data;
}

/**
 * @notice Allows an operator to register for one or more operator sets for an AVS. If the operator
 * has any stake allocated to these operator sets, it immediately becomes slashable.
 * @dev After registering within the ALM, this method calls the AVS Registrar's `IAVSRegistrar.
 * registerOperator` method to complete registration. This call MUST succeed in order for 
 * registration to be successful.
 */
function registerForOperatorSets(
    address operator,
    RegisterParams calldata params
)
    external
    onlyWhenNotPaused(PAUSED_OPERATOR_SET_REGISTRATION_AND_DEREGISTRATION)
    checkCanCall(operator)
```

_Note: this method can be called directly by an operator, or by a caller authorized by the operator. See [`PermissionController.md`](../permissions/PermissionController.md) for details._

An operator may call this function to register for any number of operator sets of a given AVS at once. There are two very important details to know about this method:
1. As part of registration, each operator set is added to the operator's `registeredSets`. Note that for each newly-registered set, **any stake allocations to the operator set become immediately slashable**.
2. Once all sets have been added, the AVS's configured `IAVSRegistrar` is called to confirm and complete registration. _This call MUST NOT revert,_ as **AVSs are expected to use this call to reject ineligible operators** (according to their own custom logic). Note that if the AVS has not configured a registrar, the `avs` itself is called.

This method makes an external call to the `IAVSRegistrar.registerOperator` method, passing in the registering `operator`, the `operatorSetIds` being registered for, and the input `params.data` provided during registration. From [`IAVSRegistrar.sol`](../../src/contracts/interfaces/IAVSRegistrar.sol):

```solidity
/**
 * @notice Called by the AllocationManager when an operator wants to register
 * for one or more operator sets. This method should revert if registration
 * is unsuccessful.
 * @param operator the registering operator
 * @param operatorSetIds the list of operator set ids being registered for
 * @param data arbitrary data the operator can provide as part of registration
 */
function registerOperator(address operator, uint32[] calldata operatorSetIds, bytes calldata data) external;
```

*Effects*:
* Adds the proposed operator sets to the operator's list of registered sets (`registeredSets`)
* Adds the operator to `_operatorSetMembers` for each operator set
* Marks the operator as registered for the given operator sets (in `registrationStatus`)
* Passes the `params` for registration to the AVS's `AVSRegistrar`, which can arbitrarily handle the registration request
* Emits an `OperatorAddedToOperatorSet` event for each operator

*Requirements*:
* Pause status MUST NOT be set: `PAUSED_OPERATOR_SET_REGISTRATION_AND_DEREGISTRATION`
* `operator` MUST be registered as an operator in the `DelegationManager`
* Caller MUST be authorized, either the operator themselves, or an admin/appointee (see [`PermissionController.md`](../permissions/PermissionController.md))
* Each `operatorSetId` MUST exist for the given AVS
* Operator MUST NOT already be registered for any proposed operator sets
* If operator has deregistered, operator MUST NOT be slashable anymore (i.e. the `DEALLOCATION_DELAY` must have passed)
* The call to the AVS's configured `IAVSRegistrar` MUST NOT revert

#### `deregisterFromOperatorSets`

```solidity
/**
 * @notice Parameters used to deregister from an AVS's operator sets
 * @param operator the operator being deregistered
 * @param avs the avs being deregistered from
 * @param operatorSetIds the operator sets within the AVS being deregistered from
 */
struct DeregisterParams {
    address operator;
    address avs;
    uint32[] operatorSetIds;
}

/**
 * @notice Allows an operator or AVS to deregister the operator from one or more of the AVS's operator sets.
 * If the operator has any slashable stake allocated to the AVS, it remains slashable until the
 * DEALLOCATION_DELAY has passed.
 * @dev After deregistering within the ALM, this method calls the AVS Registrar's `IAVSRegistrar.
 * deregisterOperator` method to complete deregistration. This call MUST succeed in order for
 * deregistration to be successful.
 */
function deregisterFromOperatorSets(
    DeregisterParams calldata params
)
    external
    onlyWhenNotPaused(PAUSED_OPERATOR_SET_REGISTRATION_AND_DEREGISTRATION)
```

_Note: this method can be called directly by an operator/AVS, or by a caller authorized by the operator/AVS. See [`PermissionController.md`](../permissions/PermissionController.md) for details._

This method may be called by EITHER an operator OR an AVS to which an operator is registered; it is intended to allow deregistration to be triggered by EITHER party. This method generally inverts the effects of `registerForOperatorSets`, with two specific exceptions:
1. As part of deregistration, each operator set is removed from the operator's `registeredSets`. HOWEVER, **any stake allocations to that operator set will remain slashable for `DEALLOCATION_DELAY` blocks.** The operator will not be allowed to register for the operator set again until this slashable window has passed.
2. Once all sets have been removed, the AVS's configured `IAVSRegistrar` is called to complete deregistration on the AVS side.

This method makes an external call to the `IAVSRegistrar.deregisterOperator` method, passing in the deregistering `operator` and the `operatorSetIds` being deregistered from. From [`IAVSRegistrar.sol`](../../src/contracts/interfaces/IAVSRegistrar.sol):

```solidity
/**
 * @notice Called by the AllocationManager when an operator is deregistered from
 * one or more operator sets. If this method reverts, it is ignored.
 * @param operator the deregistering operator
 * @param operatorSetIds the list of operator set ids being deregistered from
 */
function deregisterOperator(address operator, uint32[] calldata operatorSetIds) external;
```

*Effects*:
* Removes the proposed operator sets from the operator's list of registered sets (`registeredSets`)
* Removes the operator from `_operatorSetMembers` for each operator set
* Updates the operator's `registrationStatus` with:
    * `registered: false`
    * `slashableUntil: block.number + DEALLOCATION_DELAY`
        * As mentioned above, this allows for AVSs to slash deregistered operators until `block.number == slashableUntil`
* Emits an `OperatorRemovedFromOperatorSet` event for each operator
* Passes the `operator` and `operatorSetIds` to the AVS's `AVSRegistrar`, which can arbitrarily handle the deregistration request

*Requirements*:
<!-- * Address MUST be registered as an operator -->
* Pause status MUST NOT be set: `PAUSED_OPERATOR_SET_REGISTRATION_AND_DEREGISTRATION`
* Caller MUST be authorized, either the operator/AVS themselves, or an admin/appointee (see [`PermissionController.md`](../permissions/PermissionController.md))
* Each operator set ID MUST exist for the given AVS
* Operator MUST be registered for the given operator sets
* The call to the AVS's configured `IAVSRegistrar` MUST NOT revert

---

## Allocations and Slashing

[Operator set registration](#operator-sets) is one step of preparing to participate in an AVS. When an operator successfully registers for an operator set, it is because the AVS in question is ready to assign them tasks. However, it follows that _before assigning tasks_ to an operator, an AVS will expect operators to allocate slashable stake to the operator set such that the AVS has some economic security.

For this reason, it is expected that many AVSs will require operators to **allocate slashable stake BEFORE registering for an operator set**. This is due to [`registerForOperatorSets`](#registerforoperatorsets) serving in part as an AVS's "consent mechanism," as calling `IAVSRegsitrar.registerOperator` allows the AVS to query the amount of slashable stake the operator can provide when assigned tasks.

It is only once an operator is both _registered for an operator set_ and _has an active allocation to that operator set_ that the associated AVS can slash actual stake from an operator.

See [ELIP-002#Unique Stake Allocation & Deallocation](https://github.com/eigenfoundation/ELIPs/blob/main/ELIPs/ELIP-002.md#unique-stake-allocation--deallocation) for additional context.

**Concepts:**
* [Max vs Encumbered Magnitude](#max-vs-encumbered-magnitude)
* [Evaluating the "Current" Allocation](#evaluating-the-current-allocation)
* [Evaluating Whether an Allocation is "Slashable"](#evaluating-whether-an-allocation-is-slashable)

**Methods:**
* [`modifyAllocations`](#modifyallocations)
* [`clearDeallocationQueue`](#cleardeallocationqueue)
* [`slashOperator`](#slashoperator)

#### Max vs Encumbered Magnitude

Operators allocate _magnitude_, which represents a proportion of their total stake. For a given strategy, the `AllocationManager` tracks two quantities, _max magnitude_ and _encumbered magnitude_:

```solidity
/**
 * @notice Contains allocation info for a specific strategy
 * @param maxMagnitude the maximum magnitude that can be allocated between all operator sets
 * @param encumberedMagnitude the currently-allocated magnitude for the strategy
 */
struct StrategyInfo {
    uint64 maxMagnitude;
    uint64 encumberedMagnitude;
}

/// @dev Contains a history of the operator's maximum magnitude for a given strategy
mapping(address operator => mapping(IStrategy strategy => Snapshots.DefaultWadHistory)) internal _maxMagnitudeHistory;

/// @dev For a strategy, contains the amount of magnitude an operator has allocated to operator sets
/// @dev This value should be read with caution, as deallocations that are completable but not
///      popped off the queue are still included in the encumbered magnitude
mapping(address operator => mapping(IStrategy strategy => uint64)) public encumberedMagnitude;
```

An operator's max magnitude starts at `1 WAD` (`1e18`), and is decreased when they are slashed. Max magnitude represents "100%" of allocatable magnitude. When an operator allocates magnitude from a strategy to an operator set, their encumbered magnitude for that strategy increases. An operator cannot allocate > 100%; therefore, a strategy's encumbered magnitude can never exceed that strategy's max magnitude.

#### Evaluating the "Current" Allocation

As mentioned in the previous section, allocations and deallocations take place on a delay, and as such the `Allocation` struct has both a `currentMagnitude`, and `pendingDiff` / `effectBlock` fields:

```solidity
/**
 * @notice Defines allocation information from a strategy to an operator set, for an operator
 * @param currentMagnitude the current magnitude allocated from the strategy to the operator set
 * @param pendingDiff a pending change in magnitude, if it exists (0 otherwise)
 * @param effectBlock the block at which the pending magnitude diff will take effect
 */
struct Allocation {
    uint64 currentMagnitude;
    int128 pendingDiff;
    uint32 effectBlock;
}
```

Although the `allocations` mapping can be used to fetch an `Allocation` directly, you'll notice a convention in the `AllocationManager` of using the `_getUpdatedAllocation` helper, instead. This helper reads an existing `Allocation`, then evaluates `block.number` against `Allocation.effectBlock` to determine whether or not to apply the `pendingDiff`. 
* If the diff can be applied, the helper returns an `Allocation` with an updated `currentMagnitude` and zeroed out `pendingDiff` and `effectBlock` fields -- as if the modification has already been completed.
* Otherwise, the `Allocation` is returned from storage unmodified.

Generally, when an `Allocation` is mentioned in this doc (or used within the `AllocationManager.sol` contract), we are referring to the "Current" `Allocation` as defined above.

#### Evaluating Whether an Allocation is "Slashable"

Given an `operator` and an `Allocation` from a `strategy` to an AVS's `OperatorSet`, the `AllocationManager` uses the following criteria to determine whether the operator's allocation is slashable:
1. The `operator` must be registered for the operator set, or if they are deregistered, they must still be slashable (See [Registration Status](#registration-status)).
2. The AVS must have added the `strategy` to the operator set (See [`addStrategiesToOperatorSet`](#addstrategiestooperatorset) and [`removeStrategiesFromOperatorSet`](#removestrategiesfromoperatorset))
3. The existing `Allocation` must have a nonzero `Allocation.currentMagnitude`

If ALL of these are true, the `AllocationManager` will allow the AVS to slash the `operator's` `Allocation`.

#### Evaluating How Much of the Allocation is "Slashable"

The `getMinimumSlashableStake` calculates the minimum amount of stake that will be slashable at a specified future block. This computation accounts for each operator’s allocated stake from different strategies within an operator set. The function considers pending allocation changes that could reduce the slashable stake over time, ensuring a minimum guaranteed value. Because this is a forecast, the slashable stake at any given moment is a discrete value, but when looking ahead to a future block, the function provides the lowest possible amount, factoring in any planned allocation adjustments that will take effect within the specified timeframe.

Please see [IAllocationManager.sol:getMinimumSlashableStake](https://github.com/Layr-Labs/eigenlayer-contracts/blob/dev/src/contracts/interfaces/IAllocationManager.sol#L577) for more detail.


#### `modifyAllocations`

```solidity
/**
 * @notice struct used to modify the allocation of slashable magnitude to an operator set
 * @param operatorSet the operator set to modify the allocation for
 * @param strategies the strategies to modify allocations for
 * @param newMagnitudes the new magnitude to allocate for each strategy to this operator set
 */
struct AllocateParams {
    OperatorSet operatorSet;
    IStrategy[] strategies;
    uint64[] newMagnitudes;
}

/**
 * @notice Modifies the proportions of slashable stake allocated to an operator set from a list of strategies
 * Note that deallocations remain slashable for DEALLOCATION_DELAY blocks therefore when they are cleared they may
 * free up less allocatable magnitude than initially deallocated.
 * @param operator the operator to modify allocations for
 * @param params array of magnitude adjustments for one or more operator sets
 * @dev Updates encumberedMagnitude for the updated strategies
 */
function modifyAllocations(
    address operator, 
    AllocateParams[] calldata params
) 
    external
    onlyWhenNotPaused(PAUSED_MODIFY_ALLOCATIONS)
```

_Note: this method can be called directly by an operator, or by a caller authorized by the operator. See [`PermissionController.md`](../permissions/PermissionController.md) for details._

This function is called by an operator to EITHER increase OR decrease the slashable magnitude allocated from a strategy to an operator set. As input, the operator provides an operator set as the target, and a list of strategies and corresponding `newMagnitudes` to allocate. The `newMagnitude` value is compared against the operator's current `Allocation` for that operator set/strategy:
* If `newMagnitude` is _greater than_ `Allocation.currentMagnitude`, this is an allocation
* If `newMagnitude` is _less than_ `Allocation.currentMagnitude`, this is a deallocation
* If `newMagnitude` is _equal to_ `Allocation.currentMagnitude`, this is invalid (revert)

Allocation modifications play by different rules depending on a few factors. Recall that at all times, the `encumberedMagnitude` for a strategy may not exceed that strategy's `maxMagnitude`. Additionally, note that _before processing a modification for a strategy,_ the `deallocationQueue` for that strategy is first cleared. This ensures any completable deallocations are processed first, freeing up magnitude for allocation. This process is further explained in [`clearDeallocationQueue`](#cleardeallocationqueue). 

Finally, `modifyAllocations` does NOT require an allocation to consider whether its corresponding strategy is relevant to the operator set in question. This is primarily to cut down on complexity. Because [`removeStrategiesFromOperatorSet`](#removestrategiesfromoperatorset) always allows an AVS to _remove_ strategies from consideration, we always need to be sure an operator can initiate a _deallocation_ for such strategies. Although there's not a clear usecase for _allocating_ when a strategy is not included in an operator set, we elected not to check for this. It's possible some AVSs may announce a strategy is being added ahead of time specifically to encourage allocations in advance. **It is expected behavior** that an AVS adding a strategy to an operator set makes any existing allocations to that strategy instantly slashable.

**If we are handling an _increase in magnitude_ (allocation):**

* The increase in magnitude is immediately added to the strategy's `encumberedMagnitude`. This ensures that subsequent _allocations to other operator sets from the same strategy_ will not go above the strategy's `maxMagnitude`.
* The `allocation.pendingDiff` is set, with an `allocation.effectBlock` equal to the current block plus the operator's configured allocation delay.
* Unlike for deallocations, the `effectBlock` for allocations is not incremented by 1. This is to allow for instantaneous allocations. 

**If we are handling a _decrease in magnitude_ (deallocation):**

First, evaluate whether the operator's _existing allocation is currently slashable_ by the AVS. This is important because the AVS might be using the existing allocation to secure a task given to this operator. See [Evaluating Whether an Allocation is "Slashable"](#evaluating-whether-an-allocation-is-slashable) for details.

Next, _if the existing allocation IS slashable_:

* The `allocation.pendingDiff` is set, with an `allocation.effectBlock` equal to the current block plus `DEALLOCATION_DELAY + 1`. This means the existing allocation _remains slashable_ for `DEALLOCATION_DELAY` blocks.
* The _operator set_ is pushed to the operator's `deallocationQueue` for that strategy, denoting that there is a pending deallocation for this `(operatorSet, strategy)`. This is an ordered queue that enforces deallocations are processed sequentially and is used both in this method and in [`clearDeallocationQueue`](#cleardeallocationqueue).

Alternatively, _if the existing allocation IS NOT slashable_, the deallocated amount is immediately **freed**. It is subtracted from the strategy's encumbered magnitude and can be used for subsequent allocations. This is the only type of update that does not result in a "pending modification." The rationale here is that if the existing allocation is not slashable, the AVS does not need it to secure tasks, and therefore does not need to enforce a deallocation delay. 

*Note: If a strategy is removed from an operatorSet AFTER a deallocation is queued, the deallocation still has to go through the entire `DEALLOCATION_DELAY` blocks. The deallocation will not be instantly completable in this case*

Another point of consideration are race conditions involving a slashing event and a deallocation occurring for an operator. Consider the following scenario with an operator having an allocation of 500 magnitude and trying to deallocate setting it to 250. However in the same block _right_ before calling `modifyAllocations` the operator is slashed 100% by the OperatorSet, setting the current magnitude to 0. Now the operator's deallocation is considered an allocation and ends up allocating 250 magnitude when they were trying to _deallocate_. This is a potential griefing vector by malicious AVSs and a known shortcoming. In such scenarios, the operator should simply deallocate all their allocations to 0 so that they don't accidentally allocate more slashable stake. In general for non malicious AVSs, slashing is deemed to be a very occasional occurrence and this race condition to not be impacting to operators.

*Effects*:
* For each `AllocateParams` element:
    * Complete any existing deallocations (See [`clearDeallocationQueue`](#cleardeallocationqueue))
    * Update the operator's `encumberedMagnitude`, `allocations`, and `deallocationQueue` according to the rules described above. Additionally:
        * If `encumberedMagnitude` is updated, emits `EncumberedMagnitudeUpdated`
        * If a pending modification is created:
            * Adds the `strategy` to `allocatedStrategies[operator][operatorSetKey]` (if not present)
            * Adds the `operatorSetKey` to `allocatedSets[operator]` (if not present)
        * If the allocation now has a `currentMagnitude` of 0:
            * Removes `strategy` from the `allocatedStrategies[operator][operatorSetKey]` list
            * If this list now has a length of 0, remove `operatorSetKey` from `allocatedSets[operator]`
    * Emits an `AllocationUpdated` event

*Requirements*:
* Pause status MUST NOT be set: `PAUSED_MODIFY_ALLOCATIONS`
* Caller MUST be authorized, either as the operator themselves or an admin/appointee (see [`PermissionController.md`](../permissions/PermissionController.md))
* Operator MUST have already set an allocation delay (See [`setAllocationDelay`](#setallocationdelay))
* For each `AllocationParams` element:
    * Provided strategies MUST be of equal length to provided magnitudes for a given `AllocateParams` object
    * Operator set MUST exist for each specified AVS
    * Operator MUST NOT have pending, non-completable modifications for any given strategy
    * New magnitudes MUST NOT match existing ones
    * New encumbered magnitude MUST NOT exceed the operator's max magnitude for the given strategy

*Note: For operators who have negative shares in the `EigenPodManager` (from a pre slashing upgrade state), we recommend not allocating until shares become nonzero.*

#### `clearDeallocationQueue`

```solidity
/**
 * @notice This function takes a list of strategies and for each strategy, removes from the deallocationQueue
 * all clearable deallocations up to max `numToClear` number of deallocations, updating the encumberedMagnitude
 * of the operator as needed.
 *
 * @param operator address to clear deallocations for
 * @param strategies a list of strategies to clear deallocations for
 * @param numToClear a list of number of pending deallocations to clear for each strategy
 *
 * @dev can be called permissionlessly by anyone
 */
function clearDeallocationQueue(
    address operator,
    IStrategy[] calldata strategies,
    uint16[] calldata numToClear
)
    external
    onlyWhenNotPaused(PAUSED_MODIFY_ALLOCATIONS)
```

This function is used to complete any eligible pending deallocations for an operator. The function takes an operator, a list of strategies, and a corresponding number of pending deallocations to complete. 

Clearing pending deallocations plays an important role in [`modifyAllocations`](#modifyallocations), as completable deallocations represent magnitude that can be freed for re-allocation to a different operator set. This method exists as a convenience for operators that want to complete pending deallocations as a standalone operation. However, `modifyAllocations` will _automatically_ clear any eligible deallocations when processing an allocation modification for a given strategy.

For each strategy, the method iterates over `deallocationQueue[operator][strategy]`:

```solidity
/// @dev For a strategy, keeps an ordered queue of operator sets that have pending deallocations
/// These must be completed in order to free up magnitude for future allocation
mapping(address operator => mapping(IStrategy strategy => DoubleEndedQueue.Bytes32Deque)) internal deallocationQueue;
```

This queue contains a per-strategy ordered list of operator sets that, due to prior calls by the `operator` to `modifyAllocations`, have a pending decrease in slashable magnitude. For each operator set in the queue, the corresponding allocation for that operator set is evaluated. If its `effectBlock` has been reached, the deallocation is completed, freeing up the deallocated magnitude by subtracting it from `encumberedMagnitude[operator][strategy]`. The corresponding entry is then popped from the front of the queue.

This method stops iterating when: the queue is empty, a deallocation is reached that cannot be completed yet, or when it has cleared `numToClear` entries from the queue.

*Effects*:
* For each `strategy` and _completable_ deallocation in `deallocationQueue[operator][strategy]`:
    * Pops the corresponding operator set from the `deallocationQueue`
    * Reduces `allocation.currentMagnitude` by the deallocated amount
    * Sets `allocation.pendingDiff` and `allocation.effectBlock` to 0
    * Adds the deallocated amount to the strategy's `encumberedMagnitude`
    * Emits `EncumberedMagnitudeUpdated`
    * Additionally, if the deallocation leaves `allocation.currentMagnitude` equal to zero:
        * Removes `strategy` from the `allocatedStrategies[operator][operatorSetKey]` list
        * If this list now has a length of 0, remove `operatorSetKey` from `allocatedSets[operator]`

*Requirements*:
* Pause status MUST NOT be set: `PAUSED_MODIFY_ALLOCATIONS`
* Strategy list MUST be equal length of `numToClear` list

#### `slashOperator`

```solidity
/**
 * @notice Struct containing parameters to slashing
 * @param operator the address to slash
 * @param operatorSetId the ID of the operatorSet the operator is being slashed on behalf of
 * @param strategies the set of strategies to slash
 * @param wadsToSlash the parts in 1e18 to slash, this will be proportional to the operator's
 * slashable stake allocation for the operatorSet
 * @param description the description of the slashing provided by the AVS for legibility
 */
struct SlashingParams {
    address operator;
    uint32 operatorSetId;
    IStrategy[] strategies;
    uint256[] wadsToSlash;
    string description;
}

/**
 * @notice Called by an AVS to slash an operator in a given operator set. The operator must be registered
 * and have slashable stake allocated to the operator set.
 *
 * @param avs The AVS address initiating the slash.
 * @param params The slashing parameters, containing:
 *  - operator: The operator to slash.
 *  - operatorSetId: The ID of the operator set the operator is being slashed from.
 *  - strategies: Array of strategies to slash allocations from (must be in ascending order).
 *  - wadsToSlash: Array of proportions to slash from each strategy (must be between 0 and 1e18).
 *  - description: Description of why the operator was slashed.
 *
 * @return slashId The ID of the slash.
 * @return shares The amount of shares that were slashed for each strategy.
 * 
 * @dev For each strategy:
 *      1. Reduces the operator's current allocation magnitude by wadToSlash proportion.
 *      2. Reduces the strategy's max and encumbered magnitudes proportionally.
 *      3. If there is a pending deallocation, reduces it proportionally.
 *      4. Updates the operator's shares in the DelegationManager.
 *
 * @dev Small slashing amounts may not result in actual token burns due to
 *      rounding, which will result in small amounts of tokens locked in the contract
 *      rather than fully burning through the burn mechanism.
 */
function slashOperator(
    address avs,
    SlashingParams calldata params
)
    external
    onlyWhenNotPaused(PAUSED_OPERATOR_SLASHING)
    returns (uint256, uint256[] memory)
```

_Note: As of v1.9.0, this method can *only* be called by a single caller authorized by the AVS. See [`PermissionController.md`](../permissions/PermissionController.md) for details._

AVSs use slashing as a punitive disincentive for misbehavior. For details and examples of how slashing works, see [ELIP-002#Slashing of Unique Stake](https://github.com/eigenfoundation/ELIPs/blob/main/ELIPs/ELIP-002.md#slashing-of-unique-stake). Note that whatever slashing criteria an AVS decides on, the only criteria enforced by the `AllocationManager` are those detailed above (see [Evaluating Whether an Allocation is "Slashable"](#evaluating-whether-an-allocation-is-slashable)).

In order to slash an eligible operator, the AVS specifies which operator set the operator belongs to, the `strategies` the operator should be slashed for, and for each strategy, the _proportion of the operator's allocated magnitude_ that should be slashed (given by `wadsToSlash`). An optional `description` string allows the AVS to add context to the slash.

Once triggered in the `AllocationManager`, slashing is instant and irreversible. For each slashed strategy, the operator's `maxMagnitude` and `encumberedMagnitude` are decreased, and the allocation made to the given operator set has its `currentMagnitude` reduced. See [TODO - Accounting Doc]() for details on how slashed amounts are calculated.

There are two edge cases to note for this method:
1. In the process of slashing an `operator` for a given `strategy`, if the `Allocation` being slashed has a `currentMagnitude` of 0, the call will NOT revert. Instead, the `strategy` is skipped and slashing continues with the next `strategy` listed. This is to prevent an edge case where slashing occurs on or around a deallocation's `effectBlock` -- if the call reverted, the entire slash would fail. Skipping allows any valid slashes to be processed without requiring resubmission.
2. If the `operator` has a pending, non-completable deallocation, the deallocation's `pendingDiff` is reduced proportional to the slash. This ensures that when the deallocation is completed, less `encumberedMagnitude` is freed.

Once slashing is processed for a strategy, [slashed stake is burned or redistributed via the `DelegationManager`](https://github.com/eigenfoundation/ELIPs/blob/main/ELIPs/ELIP-002.md#burning-of-slashed-funds).

*Effects*:
* Given an `operator` and `operatorSet`, then for each `params.strategies` element and its corresponding `allocation`:
    * Calculates magnitude to slash by multiplying current magnitude by the provided `wadsToSlash`
    * Reduce `allocation.currentMagnitude` by the slashed magnitude
        * Emit an `AllocationUpdated` event
    * Reduce the operator's `encumberedMagnitude` for this strategy by the slashed magnitude
        * Emit an `EncumberedMagnitudeUpdated` event
    * Push an entry to the operator's `maxMagnitudeHistory`, reducing their `maxMagnitude` by the slashed magnitude
        * Emit a `MaxMagnitudeUpdated` event
    * If the `allocation` has a pending, non-completable deallocation, additionally reduce `allocation.pendingDiff` by the same proportion and emit an `AllocationUpdated` event
    * If the `allocation` now has a `currentMagnitude` of 0:
        * Removes `strategy` from the `allocatedStrategies[operator][operatorSetKey]` list
        * If this list now has a length of 0, remove `operatorSetKey` from `allocatedSets[operator]`
    * Calls [`DelegationManager.slashOperatorShares`](./DelegationManager.md#slashoperatorshares)
* Emit an `OperatorSlashed` event
* Increments the `slashId` for the operatorSet
* Returns `slashId` and the number of shares slashed for each strategy

*Requirements*:
* Pause status MUST NOT be set: `PAUSED_OPERATOR_SLASHING`
* Caller MUST be authorized, either as the AVS itself or an admin/appointee (see [`PermissionController.md`](../permissions/PermissionController.md))
* Operator set MUST be registered for the AVS
* Operator MUST BE slashable, i.e.:
    * Operator is registered for the operator set, *OR*
    * The operator's `DEALLOCATION_DELAY` has not yet completed
* `params.strategies` MUST be in ascending order (to ensure no duplicates)
* `params.strategies.length` MUST be equal to `params.wadsToSlash.length`
* For each `params.strategies` element:
    * `wadsToSlash` MUST be within the bounds `(0, 1e18]`
    * Operator set MUST contain the strategy

---

## Config

**Methods:**
* [`setAllocationDelay`](#setallocationdelay)
* [`setAVSRegistrar`](#setavsregistrar)
* [`updateSlasher`](#updateslasher)

#### `setAllocationDelay`

```solidity
/**
 * @notice Called by the delegation manager OR an operator to set an operator's allocation delay.
 * This is set when the operator first registers, and is the number of blocks between an operator
 * allocating magnitude to an operator set, and the magnitude becoming slashable.
 * @param operator The operator to set the delay on behalf of.
 * @param delay the allocation delay in blocks
 * @dev When the delay is set for a newly-registered operator (via the `DelegationManager.registerAsOperator` method),
 * the delay will take effect immediately, allowing for operators to allocate slashable stake immediately. 
 * Else, the delay will take effect after `ALLOCATION_CONFIGURATION_DELAY` blocks.
 */
function setAllocationDelay(
    address operator,
    uint32 delay
)
    external
```

_Note: IF NOT CALLED BY THE `DelegationManager`, this method can be called directly by an operator, or by a caller authorized by the operator. See [`PermissionController.md`](../permissions/PermissionController.md) for details._

This function sets an operator's allocation delay, in blocks. This delay can be updated by the operator once set. The initial setting of this value by a newly created operator via [`DelegationManager.registerAsOperator`](./DelegationManager.md#registerasoperator) will take effect immediately. The setting of this value for an operator who has already been registered in core or further updates _take `ALLOCATION_CONFIGURATION_DELAY` blocks_ to take effect. Because having a delay is a requirement to allocating slashable stake, this effectively means that once the slashing release goes live, no already-created operators will be able to allocate slashable stake for at least `ALLOCATION_CONFIGURATION_DELAY` blocks.

The `DelegationManager` calls this upon operator registration for all new operators created after the slashing release. For operators that existed in the `DelegationManager` _prior_ to the slashing release, **they will need to call this method to configure an allocation delay prior to allocating slashable stake to any AVS**.

The allocation delay's primary purpose is to give stakers delegated to an operator the chance to withdraw their stake before the operator can change the risk profile to something they're not comfortable with. However, operators can choose to configure this delay however they want - including setting it to 0.

*Effects*:
* Sets the operator's `pendingDelay` to the proposed `delay`, and save the `effectBlock` at which the `pendingDelay` can be activated
    * For newly registered operators (called by DelegationManager): Sets `delay`, `isSet`, and `pendingDelay` immediately with `effectBlock = uint32(block.number)`, ensuring storage consistency and allowing operators to allocate slashable stake immediately after registration.
    * For existing operators: Sets `pendingDelay` and `effectBlock = uint32(block.number) + ALLOCATION_CONFIGURATION_DELAY + 1`. The `delay` and `isSet` fields are updated when the pending delay is applied.
* If the operator has a `pendingDelay`, and if the `effectBlock` has passed, sets the operator's `delay` to the `pendingDelay` value
    * This also sets the `isSet` boolean to `true` to indicate that the operator's `delay`, even if 0, was set intentionally
* Emits an `AllocationDelaySet` event

*Requirements*:
* Caller MUST BE either the DelegationManager, or a registered operator
    * An admin and/or appointee for the operator can also call this function (see [`PermissionController.md`](../permissions/PermissionController.md))

#### `setAVSRegistrar`

```solidity
/**
 * @notice Called by an AVS to configure the address that is called when an operator registers
 * or is deregistered from the AVS's operator sets. If not set (or set to 0), defaults
 * to the AVS's address.
 * @param registrar the new registrar address
 */
function setAVSRegistrar(
    address avs,
    IAVSRegistrar registrar
)
    external
    checkCanCall(avs)
```

_Note: this method can be called directly by an AVS, or by a caller authorized by the AVS. See [`PermissionController.md`](../permissions/PermissionController.md) for details._

Sets the `registrar` for a given `avs`. Note that if the registrar is set to 0, `getAVSRegistrar` will return the AVS's address.

The avs registrar is called when operators register to or deregister from an operator set. From [`IAVSRegistrar.sol`](../../src/contracts/interfaces/IAVSRegistrar.sol), the avs registrar should use the following interface:

```solidity
interface IAVSRegistrar {
    /**
     * @notice Called by the AllocationManager when an operator wants to register
     * for one or more operator sets. This method should revert if registration
     * is unsuccessful.
     * @param operator the registering operator
     * @param operatorSetIds the list of operator set ids being registered for
     * @param data arbitrary data the operator can provide as part of registration
     */
    function registerOperator(address operator, uint32[] calldata operatorSetIds, bytes calldata data) external;

    /**
     * @notice Called by the AllocationManager when an operator is deregistered from
     * one or more operator sets. If this method reverts, it is ignored.
     * @param operator the deregistering operator
     * @param operatorSetIds the list of operator set ids being deregistered from
     */
    function deregisterOperator(address operator, uint32[] calldata operatorSetIds) external;
}
```

Note that when an operator registers, registration will FAIL if the call to `IAVSRegistrar` reverts. However, when an operator deregisters, a revert in `deregisterOperator` is ignored.

*Effects*:
* Sets `_avsRegistrar[avs]` to `registrar`
* Emits an `AVSRegistrarSet` event

*Requirements*:
* Caller MUST be authorized, either as the AVS itself or an admin/appointee (see [`PermissionController.md`](../permissions/PermissionController.md))

#### `updateSlasher`

```solidity
/**
 * @notice Allows an AVS to update the slasher for an operator set
 * @param operatorSet the operator set to update the slasher for
 * @param slasher the new slasher
 * @dev The new slasher will take effect in DEALLOCATION_DELAY blocks
 * @dev The slasher can only be updated if it has already been set. The slasher is set either on operatorSet creation or,
 *      for operatorSets created prior to v1.9.0, via `migrateSlashers`
 * @dev Reverts for:
 *      - InvalidCaller: The caller cannot update the slasher for the operator set (set via the `PermissionController`)
 *      - InvalidOperatorSet: The operator set does not exist
 *      - SlasherNotSet: The slasher has not been set yet
 *      - InputAddressZero: The slasher is the zero address
 */
function updateSlasher(OperatorSet memory operatorSet, address slasher) external;
```

Updates the slasher that can call [`slashOperator`](#slashoperator) on behalf of an operatorSet. The slasher will become active after `SLASHER_CONFIGURATION_DELAY` blocks. Only 1 address can slash an operatorSet.

Prior to `v1.9.0`, the address that could set the slasher was settable via the `PermissionController`, which allowed any number of admins/appointees to slash an operatorSet on behalf of an AVS. OperatorSets created prior to `v1.9.0` will have their slasher migrated to the `AllocationManager` - see [`migrateSlashers`](#migrateslashers) for more information.

*Effects*:
* If the proposed slasher is the same as the currently pending slasher and the pending change hasn't taken effect yet, this is a no-op (delay countdown is not restarted).
* Sets the operatorSet's `pendingSlasher` to the proposed `slasher`, and save the `effectBlock` at which the `pendingSlasher` can be activated
    * `effectBlock = uint32(block.number) + SLASHER_CONFIGURATION_DELAY + 1`
* If the operatorSet has a `pendingDelay`, and if the `effectBlock` has passed, sets the operatorSet's slasher to the pendingSlasher
* Emits an `SlasherUpdated` event

*Requirements*:
* Caller MUST be authorized, either as the AVS itself or an admin/appointee (see [`PermissionController.md`](../permissions/PermissionController.md))
* The operatorSet MUST exist
* The slasher MUST already be set - either upon creation of the operatorSet or migration for operatorSets created prior to `v1.9.0`
* The slasher address MUST NOT be the zero address

#### `migrateSlashers`

```solidity
/**
 * @notice Allows any address to migrate the slasher from the permission controller to the ALM
 * @param operatorSets the list of operator sets to migrate the slasher for
 * @dev This function is used to migrate the slasher from the permission controller to the ALM for operatorSets created prior to `v1.9.0`
 * @dev Migrates based on the following rules:
 *      - If there is no slasher set or the slasher in the `PermissionController`is the 0 address, the AVS address will be set as the slasher
 *      - If there are multiple slashers set in the `PermissionController`, the first address will be set as the slasher
 * @dev A migration can only be completed once for a given operatorSet
 * @dev This function will be deprecated in Early Q2 2026. EigenLabs will migrate the slasher for all operatorSets created prior to `v1.9.0`
 * @dev This function does not revert to allow for simpler offchain calling. It will no-op if:
 *      - The operator set does not exist
 *      - The slasher has already been set, either via migration or creation of the operatorSet
 */
function migrateSlashers(
    OperatorSet[] memory operatorSets
) external;
```

Migrates a slasher from the `PermissionController` to the `AllocationManager`. **This function is useful for operatorSets that have been created prior to `v1.9.0`**. Customers *will not* have to migrate a slasher themselves; migration will be done on behalf of all operatorSets upon completion of the `v1.9.0` upgrade.

**Gas Warning**: This function can be expensive for AVSs with many slashing appointees. The `PermissionController.getAppointees()` call enumerates the full appointee set (using `EnumerableSet.values()`), which has O(n) gas cost. Large appointee sets may cause this function to exceed block gas limits. Consider batching operator sets if needed.

Only 1 slasher can be slash an operatorSet on behalf of an AVS; however, multiple addresses may have had the ability to slash an operatorSet via the previous `PermissionController`-based access control. Because of this mismatch, slashers are migrated based on the following criteria:
1. If there are no slashers set in the `PermissionController` OR the slasher set is the 0 address, set the slasher to the AVS
2. If there are *multiple* slashers set, the first address will be set as the slasher

**The slasher can only be migrated once**. After, an operatorSet must use [`updateSlasher`](#updateslasher) to set a new address. 

*Effects*:
* For each operatorSet:
    * Sets the operatorSet's `slasher` and `pendingSlasher` to the proposed slasher, with `effectBlock = uint32(block.number)`, ensuring immediate effect with consistent storage.
    * If the operatorSet has a `pendingDelay`, and if the `effectBlock` has passed, sets the operatorSet's slasher to the pendingSlasher
    * Emits a `SlasherMigrated` event
    * Emits an `SlasherUpdated` event

*Requirements*:
* For each operatorSet: 
    * If the operatorSet does not exist, do not migrate (no revert)
    * If the slasher is already set, do not migrate (no revert)
    * The slasher address MUST NOT be the zero address
````

## File: docs/core/AVSDirectory.md
````markdown
[middleware-repo]: https://github.com/Layr-Labs/eigenlayer-middleware/

## AVSDirectory

| File | Type | Proxy |
| -------- | -------- | -------- |
| [`AVSDirectory.sol`](../../src/contracts/core/AVSDirectory.sol) | Singleton | Transparent proxy |

*Note: The AVSDirectory is deprecated as of the slashing release. This documentation is kept for historical purposes. AVSs are recommended to use the [AllocationManager](./AllocationManager.md) for the new operatorSet and slashing model.*

The `AVSDirectory` once handled interactions between AVSs and the EigenLayer core contracts. Once registered as an Operator in EigenLayer core (via the `DelegationManager`), Operators can register with one or more AVSs (via the AVS's contracts) to begin providing services to them offchain. As a part of registering with an AVS, the AVS will record this registration in the core contracts by calling into the `AVSDirectory`.

For more information on AVS contracts, see the [middleware repo][middleware-repo].

Currently, the only interactions between AVSs and the core contracts is to track whether Operators are currently registered for the AVS. This is handled by two methods:
<!-- no toc -->
* [`AVSDirectory.registerOperatorToAVS`](#registeroperatortoavs)
* [`AVSDirectory.deregisterOperatorFromAVS`](#deregisteroperatorfromavs)

---

#### `registerOperatorToAVS`

```solidity
function registerOperatorToAVS(
    address operator,
    ISignatureUtils.SignatureWithSaltAndExpiry memory operatorSignature
) 
    external 
    onlyWhenNotPaused(PAUSED_OPERATOR_REGISTER_DEREGISTER_TO_AVS)
```

Allows the caller (an AVS) to register an `operator` with itself, given the provided signature is valid.

*Effects*:
* Sets the `operator`'s status to `REGISTERED` for the AVS

*Requirements*:
* Pause status MUST NOT be set: `PAUSED_OPERATOR_REGISTER_DEREGISTER_TO_AVS`
* `operator` MUST already be a registered Operator (via the `DelegationManager`)
* `operator` MUST NOT already be registered with the AVS
* `operatorSignature` must be a valid, unused, unexpired signature from the `operator`. The signature is an ECDSA signature by the operator over the [`OPERATOR_AVS_REGISTRATION_TYPEHASH`](../../src/contracts/core/DelegationManagerStorage.sol). Expiry is a utc timestamp in seconds. Salt is used only once per signature to prevent replay attacks.

*As of M2*:
* Operator registration/deregistration in the AVSDirectory does not have any sort of consequences for the Operator or its shares. The AllocationManager handles with operator sets, tying in rewards for services and slashing for misbehavior.

#### `deregisterOperatorFromAVS`

```solidity
function deregisterOperatorFromAVS(
    address operator
) 
    external 
    onlyWhenNotPaused(PAUSED_OPERATOR_REGISTER_DEREGISTER_TO_AVS)
```

Allows the caller (an AVS) to deregister an `operator` with itself

*Effects*:
* Sets the `operator's` status to `UNREGISTERED` for the AVS

*Requirements*:
* Pause status MUST NOT be set: `PAUSED_OPERATOR_REGISTER_DEREGISTER_TO_AVS`
* `operator` MUST already be registered with the AVS

*As of M2*:
* Operator registration/deregistration in the AVSDirectory does not have any sort of consequences for the Operator or its shares. The AllocationManager handles this with operator sets, tying in rewards for services and slashing for misbehavior.

#### `cancelSalt`

```solidity
function cancelSalt(bytes32 salt) external
```

Allows the caller (an Operator) to cancel a signature salt before it is used to register for an AVS.

*Effects*:
* Sets `operatorSaltIsSpent[msg.sender][salt]` to `true`

*Requirements*:
* Salt MUST NOT already be cancelled
````

## File: docs/core/DelegationManager.md
````markdown
## DelegationManager

| File | Notes |
| -------- | -------- |
| [`DelegationManager.sol`](../../src/contracts/core/DelegationManager.sol) | |
| [`DelegationManagerStorage.sol`](../../src/contracts/core/DelegationManagerStorage.sol) | state variables |
| [`IDelegationManager.sol`](../../src/contracts/interfaces/IDelegationManager.sol) | interface |

Libraries and Mixins:

| File | Notes |
| -------- | -------- |
| [`PermissionControllerMixin.sol`](../../src/contracts/mixins/PermissionControllerMixin.sol) | account delegation |
| [`SignatureUtils.sol`](../../src/contracts/mixins/SignatureUtils.sol) | signature validation |
| [`Pausable.sol`](../../src/contracts/permissions/Pausable.sol) | |
| [`SlashingLib.sol`](../../src/contracts/libraries/SlashingLib.sol) | slashing math |
| [`Snapshots.sol`](../../src/contracts/libraries/Snapshots.sol) | historical state |

## Prior Reading

* [ELIP-002: Slashing via Unique Stake and Operator Sets](https://github.com/eigenfoundation/ELIPs/blob/main/ELIPs/ELIP-002.md)
* [Shares Accounting](./accounting/SharesAccounting.md)

## Overview

The `DelegationManager` is the intersection between the two sides of the protocol. It (i) allows stakers to delegate/undelegate to/from operators, (ii) handles withdrawals and withdrawal processing for assets in both the `StrategyManager` and `EigenPodManager`, and (iii) manages accounting around slashing for stakers and operators.

When operators are slashed by AVSs, it receives share slashing directives from the `AllocationManager`. When stakers deposit assets using the `StrategyManager/EigenPodManager`, it tracks share/delegation accounting changes. The `DelegationManager` combines inputs from both sides of the protocol into a staker's "deposit scaling factor," which serves as the primary conversion vehicle between a staker's _raw deposited assets_ and the _amount they can withdraw_.

The `DelegationManager's` responsibilities can be broken down into the following concepts:
* [Becoming an Operator](#becoming-an-operator)
* [Delegation and Withdrawals](#delegation-and-withdrawals)
* [Slashing and Accounting](#slashing-and-accounting)

## Parameterization

* `MIN_WITHDRAWAL_DELAY_BLOCKS`: The delay in blocks before withdrawals can be completed.
    * Mainnet: `100800 blocks` (14 days).
    * Testnet: `50 blocks` (10 minutes).
* `beaconChainETHStrategy`: a pseudo strategy used to represent beacon chain ETH internally. This is not a real contract!
    * Value: `0xbeaC0eeEeeeeEEeEeEEEEeeEEeEeeeEeeEEBEaC0`

---

## Becoming an Operator

The `DelegationManager` tracks operator-related state in the following mappings:

```solidity
/// @notice Returns the `operator` a `staker` is delegated to, or address(0) if not delegated.
/// Note: operators are delegated to themselves
mapping(address staker => address operator) public delegatedTo;

/// @notice Returns the operator details for a given `operator`.
/// Note: two of the `OperatorDetails` fields are deprecated. The only relevant field
/// is `OperatorDetails.delegationApprover`.
mapping(address operator => OperatorDetails) internal _operatorDetails;

/**
 * @notice Tracks the current balance of shares an `operator` is delegated according to each `strategy`. 
 * Updated by both the `StrategyManager` and `EigenPodManager` when a staker's delegatable balance changes,
 * and by the `AllocationManager` when the `operator` is slashed.
 *
 * @dev The following invariant should hold for each `strategy`:
 *
 * operatorShares[operator] = sum(withdrawable shares of all stakers delegated to operator)
 */
mapping(address operator => mapping(IStrategy strategy => uint256 shares)) public operatorShares;
```

**Methods**:
* [`DelegationManager.registerAsOperator`](#registerasoperator)
* [`DelegationManager.modifyOperatorDetails`](#modifyoperatordetails)
* [`DelegationManager.updateOperatorMetadataURI`](#updateoperatormetadatauri)

#### `registerAsOperator`

```solidity
/**
 * @notice Registers the caller as an operator in EigenLayer.
 * @param initDelegationApprover is an address that, if set, must provide a signature when stakers delegate
 * to an operator.
 * @param allocationDelay The delay before allocations take effect.
 * @param metadataURI is a URI for the operator's metadata, i.e. a link providing more details on the operator.
 *
 * @dev Once an operator is registered, they cannot 'deregister' as an operator, and they will forever be considered "delegated to themself".
 * @dev This function will revert if the caller is already delegated to an operator.
 * @dev Note that the `metadataURI` is *never stored * and is only emitted in the `OperatorMetadataURIUpdated` event
 */
function registerAsOperator(
    address initDelegationApprover,
    uint32 allocationDelay,
    string calldata metadataURI
) external nonReentrant;
```

Registers the caller as an operator in EigenLayer. The new operator provides the following input parameters:
* `address initDelegationApprover`: *(OPTIONAL)* if set to a non-zero address, this address must sign and approve new delegation from stakers to this operator (See [`delegateTo`](#delegateto))
* `uint32 allocationDelay`: the delay (in blocks) before slashable stake allocations will take effect. This is passed to the `AllocationManager` (See [`AllocationManager.md#setAllocationDelay`](./AllocationManager.md#setallocationdelay)). Upon registration, this allocation delay is effective immediately. Further modifications directly via `AllocationManager.setAllocationDelay` take `ALLOCATION_CONFIGURATION_DELAY` blocks.
* `string calldata metadataURI`: emits this input in the event `OperatorMetadataURIUpdated`. Does not store the value anywhere.

`registerAsOperator` cements the operator's delegation approver and allocation delay in storage, and self-delegates the operator to themselves - permanently marking the caller as an operator. They cannot "deregister" as an operator - however, if they have deposited funds, they can still withdraw them (See [Delegation and Withdrawals](#delegation-and-withdrawals)).

*Effects*:
* Sets `_operatorDetails[operator].delegationApprover`. Note that the other `OperatorDetails` fields are deprecated; only the `delegationApprover` is used.
* Delegates the operator to themselves
    * Tabulates any deposited shares across the `EigenPodManager` and `StrategyManager`, and delegates these shares to themselves
    * For each strategy in which the operator holds assets, updates the operator's `depositScalingFactor` for that strategy

*Requirements*:
* Caller MUST NOT already be delegated
* Pause status MUST NOT be set: `PAUSED_NEW_DELEGATION`
* For each strategy in which the operator holds assets, their `slashingFactor` for that strategy MUST be non-zero.

#### `modifyOperatorDetails`

```solidity
/**
 * @notice Updates an operator's stored `delegationApprover`.
 * @param operator is the operator to update the delegationApprover for
 * @param newDelegationApprover is the new delegationApprover for the operator
 *
 * @dev The caller must have previously registered as an operator in EigenLayer.
 */
function modifyOperatorDetails(
    address operator, 
    address newDelegationApprover
) 
    external 
    checkCanCall(operator)
    nonReentrant
```

_Note: this method can be called directly by an operator, or by a caller authorized by the operator. See [`PermissionController.md`](../permissions/PermissionController.md) for details._

Allows an operator to update their stored `delegationApprover`.

*Requirements*:
* `address operator` MUST already be an operator.
* Caller MUST be authorized: either the operator themselves, or an admin/appointee (see [`PermissionController.md`](../permissions/PermissionController.md))

#### `updateOperatorMetadataURI`

```solidity
/**
 * @notice Called by an operator to emit an `OperatorMetadataURIUpdated` event indicating the information has updated.
 * @param operator The operator to update metadata for
 * @param metadataURI The URI for metadata associated with an operator
 * @dev Note that the `metadataURI` is *never stored * and is only emitted in the `OperatorMetadataURIUpdated` event
 */
function updateOperatorMetadataURI(
    address operator, 
    string calldata metadataURI
) 
    external 
    checkCanCall(operator)
```

_Note: this method can be called directly by an operator, or by a caller authorized by the operator. See [`PermissionController.md`](../permissions/PermissionController.md) for details._

Allows an operator to emit an `OperatorMetadataURIUpdated` event. No other state changes occur.

*Requirements*:
* `address operator` MUST already be an operator.
* Caller MUST be authorized: either the operator themselves, or an admin/appointee (see [`PermissionController.md`](../permissions/PermissionController.md))

---

## Delegation and Withdrawals

**Concepts**:
* [Shares Accounting](./accounting/SharesAccounting.md)
* [Legacy and Post-Slashing Withdrawals](#legacy-and-post-slashing-withdrawals)
* [Slashing Factors and Scaling Shares](#slashing-factors-and-scaling-shares)

**Methods**:
* [`DelegationManager.delegateTo`](#delegateto)
* [`DelegationManager.undelegate`](#undelegate)
* [`DelegationManager.redelegate`](#redelegate)
* [`DelegationManager.queueWithdrawals`](#queuewithdrawals)
* [`DelegationManager.completeQueuedWithdrawal`](#completequeuedwithdrawal)
* [`DelegationManager.completeQueuedWithdrawals`](#completequeuedwithdrawals)

#### Legacy and Post-Slashing Withdrawals

The `DelegationManager` tracks withdrawal-related state in the following mappings:

```solidity
/**
 * @dev A struct representing an existing queued withdrawal. After the withdrawal delay has elapsed, this withdrawal can be completed via `completeQueuedWithdrawal`.
 * A `Withdrawal` is created by the `DelegationManager` when `queueWithdrawals` is called. The `withdrawalRoots` hashes returned by `queueWithdrawals` can be used
 * to fetch the corresponding `Withdrawal` from storage (via `queuedWithdrawals`).
 *
 * @param staker The address that queued the withdrawal
 * @param delegatedTo The address that the staker was delegated to at the time the withdrawal was queued. Used to determine if additional slashing occurred before
 * this withdrawal became completable.
 * @param withdrawer The address that will call the contract to complete the withdrawal. Note that this will always equal `staker`; alternate withdrawers are not
 * supported at this time.
 * @param nonce The staker's `cumulativeWithdrawalsQueued` at time of queuing. Used to ensure withdrawals have unique hashes.
 * @param startBlock The block number when the withdrawal was queued.
 * @param strategies The strategies requested for withdrawal when the withdrawal was queued
 * @param scaledShares The staker's deposit shares requested for withdrawal, scaled by the staker's `depositScalingFactor`. Upon completion, these will be
 * scaled by the appropriate slashing factor as of the withdrawal's completable block. The result is what is actually withdrawable.
 */
struct Withdrawal {
    address staker;
    address delegatedTo;
    address withdrawer;
    uint256 nonce;
    uint32 startBlock;
    IStrategy[] strategies;
    uint256[] scaledShares;
}

/// @dev Returns whether a withdrawal is pending for a given `withdrawalRoot`.
/// @dev This variable will be deprecated in the future, values should only be read or deleted.
mapping(bytes32 withdrawalRoot => bool pending) public pendingWithdrawals;

/// @notice Returns the total number of withdrawals that have been queued for a given `staker`.
/// @dev This only increments (doesn't decrement), and is used to help ensure that otherwise identical withdrawals have unique hashes.
mapping(address staker => uint256 totalQueued) public cumulativeWithdrawalsQueued;

/// @notice Returns a list of queued withdrawals for a given `staker`.
/// @dev Entries are removed when the withdrawal is completed.
/// @dev This variable only reflects withdrawals that were made after the slashing release.
mapping(address staker => EnumerableSet.Bytes32Set withdrawalRoots) internal _stakerQueuedWithdrawalRoots;

/// @notice Returns the details of a queued withdrawal given by `withdrawalRoot`.
/// @dev This variable only reflects withdrawals that were made after the slashing release.
mapping(bytes32 withdrawalRoot => Withdrawal withdrawal) public queuedWithdrawals;

/// @notice Contains history of the total cumulative staker withdrawals for an operator and a given strategy.
/// Used to calculate burned/redistributed StrategyManager shares when an operator is slashed.
/// @dev Stores scaledShares instead of total withdrawn shares to track current slashable shares, dependent on the maxMagnitude
mapping(address operator => mapping(IStrategy strategy => Snapshots.DefaultZeroHistory)) internal
    _cumulativeScaledSharesHistory;
```

Prior to the slashing release, withdrawals were only stored as hashes in the `pendingWithdrawals` mapping. 

With the slashing release, withdrawals are now stored entirely in state, and two new mappings have been added to support this:
* `_stakedQueuedWithdrawalRoots`: a list of all the currently-queued withdrawal hashes belonging to a staker
* `queuedWithdrawals`: maps queued withdrawal hash to `Withdrawal` struct

Legacy withdrawals remain completable using the same methods as new withdrawals. The primary difference between the two is that it is not possible to query the corresponding `Withdrawal` struct for a legacy withdrawal hash. When determining what `Withdrawal` struct to supply to the contract to complete a legacy withdrawal, the caller will need to derive the original `Withdrawal` struct generated when the withdrawal was queued.

#### Slashing Factors and Scaling Shares

_See the [Shares Accounting](./accounting/SharesAccounting.md) doc for a more thorough explanation with examples._

Throughout the `DelegationManager`, a staker's _deposit shares_ can be converted into their current _withdrawable shares_ by applying two factors: the _slashing factor_ and the _deposit scaling factor_. These two values are scaling factors that act as numerators when scaling shares. By default, these values start at `1 WAD` (`1e18`). `1 WAD` also acts as the denominator when scaling.

```solidity
/// @dev All scaling factors have `1e18` as an initial/default value. This value is represented
/// by the constant `WAD`, which is used to preserve precision with uint256 math.
///
/// When applying scaling factors, they are typically multiplied/divided by `WAD`, allowing this
/// constant to act as a "1" in mathematical formulae.
uint64 constant WAD = 1e18;
```

The _deposit scaling factor_ is represented in `DelegationManager` storage, and can be thought of as a way to normalize newly-deposited shares using the _current_ slashing factor, so that _future_ withdrawals can be scaled appropriately if the slashing factor has changed:

```solidity
/*
 * There are 2 types of shares:
 *      1. deposit shares
 *          - These can be converted to an amount of tokens given a strategy
 *              - by calling `sharesToUnderlying` on the strategy address (they're already tokens 
 *              in the case of EigenPods)
 *          - These live in the storage of the EigenPodManager and individual StrategyManager strategies 
 *      2. withdrawable shares
 *          - For a staker, this is the amount of shares that they can withdraw
 *          - For an operator, the shares delegated to them are equal to the sum of their stakers'
 *            withdrawable shares
 *
 * Along with a slashing factor, the DepositScalingFactor is used to convert between the two share types.
 */
struct DepositScalingFactor {
    uint256 _scalingFactor;
}

/// @notice Returns the scaling factor applied to a `staker` for a given `strategy`
mapping(address staker => mapping(IStrategy strategy => DepositScalingFactor)) internal _depositScalingFactor;
```

Calculating the _slashing factor_ varies depending on the strategy in question. _For all strategies_, the slashing factor is the max magnitude of the staker's delegated `operator` in the `AllocationManager` (See [Max vs Encumbered Magnitude](./AllocationManager.md#max-vs-encumbered-magnitude)). If the staker is NOT delegated, this is `WAD` (aka "1").

_For the `beaconChainETHStrategy`_, the slashing factor _also_ includes the staker's `beaconChainSlashingFactor`, which acts like the `operator's` max magnitude, but for a staker's beacon chain assets. This means that, for the `beaconChainETHStrategy` specifically, _slashing factors_ can be applied because of EITHER/BOTH:
* `operator` got slashed for this strategy by an AVS
* `staker` got slashed on the beacon chain

From `DelegationManager.sol`:

```solidity
/// @dev Calculate the amount of slashing to apply to the staker's shares
function _getSlashingFactor(
    address staker,
    IStrategy strategy,
    uint64 operatorMaxMagnitude
) internal view returns (uint256) {
    if (strategy == beaconChainETHStrategy) {
        uint64 beaconChainSlashingFactor = eigenPodManager.beaconChainSlashingFactor(staker);
        return operatorMaxMagnitude.mulWad(beaconChainSlashingFactor);
    }

    return operatorMaxMagnitude;
}
```

#### `delegateTo`

```solidity
// @notice Struct that bundles together a signature and an expiration time for the signature. Used primarily for stack management.
struct SignatureWithExpiry {
    // the signature itself, formatted as a single bytes object
    bytes signature;
    // the expiration timestamp (UTC) of the signature
    uint256 expiry;
}

/**
 * @notice Caller delegates their stake to an operator.
 * @param operator The account (`msg.sender`) is delegating its assets to for use in serving applications built on EigenLayer.
 * @param approverSignatureAndExpiry (optional) Verifies the operator approves of this delegation
 * @param approverSalt (optional) A unique single use value tied to an individual signature.
 * @dev The signature/salt are used ONLY if the operator has configured a delegationApprover.
 * If they have not, these params can be left empty.
 */
function delegateTo(
    address operator, 
    SignatureWithExpiry memory approverSignatureAndExpiry, 
    bytes32 approverSalt
) 
    external
    nonReentrant
```

Allows a staker to delegate their assets to an operator. Delegation is all-or-nothing: when a staker delegates to an operator, they delegate ALL their assets. Stakers can only be delegated to one operator at a time. 

*Note: Delegating to an operator who has very low magnitudes (on the order of wei) may result in loss of funds.*

For each strategy the staker has deposit shares in, the `DelegationManager` will:
* Query the staker's deposit shares from the `StrategyManager/EigenPodManager`
* Get the slashing factor for this `(staker, operator, strategy)` and use it to update the staker's deposit scaling factor (See [Slashing Factors and Scaling Shares](#slashing-factors-and-scaling-shares))
* Add the deposit shares to the operator's `operatorShares` directly. _Note_ that the initial delegation to an operator is a special case where deposit shares == withdrawable shares.

*Effects*:
* Delegates the caller to the `operator`
    * Tabulates any deposited shares across the `EigenPodManager` and `StrategyManager`, and delegates these shares to the `operator`
    * For each strategy in which the caller holds assets, updates the caller's `depositScalingFactor` for that strategy
* Upon delegation, all funds of the `staker` are immediately slashable if the operator has allocated slashable stake for a staker's strategy to an operatorSet

*Requirements*:
* The caller MUST NOT already be delegated to an operator
* The `operator` MUST already be an operator
* If the `operator` has a `delegationApprover`, the caller MUST provide a valid `approverSignatureAndExpiry` and `approverSalt`
* Pause status MUST NOT be set: `PAUSED_NEW_DELEGATION`
* For each strategy in which the staker holds assets, the `slashingFactor` for that strategy MUST be non-zero.

#### `undelegate`

```solidity
/**
 * @notice Undelegates the staker from their operator and queues a withdrawal for all of their shares
 * @param staker The account to be undelegated
 * @return withdrawalRoots The roots of the newly queued withdrawals, if a withdrawal was queued. Returns 
 * an empty array if none was queued.
 *
 * @dev Reverts if the `staker` is also an operator, since operators are not allowed to undelegate from themselves.
 * @dev Reverts if the caller is not the staker, nor the operator who the staker is delegated to, nor the operator's specified "delegationApprover"
 * @dev Reverts if the `staker` is not delegated to an operator
 */
function undelegate(
    address staker
) 
    external
    nonReentrant
    returns (bytes32[] memory withdrawalRoots);
```

_Note: this method can be called directly by an operator, or by a caller authorized by the operator. See [`PermissionController.md`](../permissions/PermissionController.md) for details._

`undelegate` can be called EITHER by a staker to undelegate themselves, OR by an operator to force-undelegate a staker from them. Force-undelegation is primarily useful if an operator has a `delegationApprover`, as this role is the only way to prevent a staker from delegating back to the operator once force-undelegated.

Undelegation immediately sets the staker's delegated operator to 0, decreases the prior operator's delegated shares, and queues withdrawals for all of the staker's deposited assets. For UX reasons, one withdrawal is queued for each strategy in which the staker has deposited assets. Queued withdrawals mimic the behavior of the [`queueWithdrawals`](#queuewithdrawals) method; see that method's documentation for details.

Just as with a normal queued withdrawal, these withdrawals can be completed by the staker after `MIN_WITHDRAWAL_DELAY_BLOCKS`. These withdrawals do not require the staker to "fully exit" from the system -- the staker may choose to keep their assets in the system once withdrawals are completed (See [`completeQueuedWithdrawal`](#completequeuedwithdrawal) for details).

*Effects*: 
* The `staker` is undelegated from their operator
* If the `staker` has no deposit shares, there is no withdrawal queued or further effects
* For each strategy held by the `staker`, a `Withdrawal` is queued:
    * _Deposit shares_ are removed from the staker's deposit share balances
        * See [`EigenPodManager.removeDepositShares`](./EigenPodManager.md#removedepositshares)
        * See [`StrategyManager.removeDepositShares`](./StrategyManager.md#removedepositshares)
    * _Deposit shares_ are converted to _withdrawable shares_ (See [Slashing Factors and Scaling Shares](#slashing-factors-and-scaling-shares)). These are decremented from the operator's delegated shares.
    * _Deposit shares_ are converted to _scaled shares_  (See [Shares Accounting - Queue Withdrawals](./accounting/SharesAccounting.md#queue-withdrawal)), which are stored in the `Withdrawal` struct
    * _Scaled shares_ are pushed to `_cumulativeScaledSharesHistory`, which is used for burning or redistributing slashed shares
    * The `Withdrawal` is saved to storage
        * The hash of the `Withdrawal` is marked as "pending"
        * The hash of the `Withdrawal` is set in a mapping to the `Withdrawal` struct itself
        * The hash of the `Withdrawal` is pushed to `_stakerQueuedWithdrawalRoots`
    * The staker's withdrawal nonce is increased by 1 for each `Withdrawal`

*Requirements*:
* Pause status MUST NOT be set: `PAUSED_ENTER_WITHDRAWAL_QUEUE`
* `staker` MUST be delegated to an operator
* `staker` MUST NOT be an operator
* `staker` parameter MUST NOT be zero
* Caller MUST be authorized: either the `staker` themselves, their operator, their operator's `delegationApprover`, or their operator's admin/appointee (see [`PermissionController.md`](../permissions/PermissionController.md))
* See [`EigenPodManager.removeDepositShares`](./EigenPodManager.md#removedepositshares)
* See [`StrategyManager.removeDepositShares`](./StrategyManager.md#removedepositshares)

#### `redelegate`

```solidity
/**
 * @notice Undelegates the staker from their current operator, and redelegates to `newOperator`
 * Queues a withdrawal for all of the staker's withdrawable shares. These shares will only be
 * delegated to `newOperator` AFTER the withdrawal is completed.
 * @dev This method acts like a call to `undelegate`, then `delegateTo`
 * @param newOperator the new operator that will be delegated all assets
 * @dev NOTE: the following 2 params are ONLY checked if `newOperator` has a `delegationApprover`.
 * If not, they can be left empty.
 * @param newOperatorApproverSig A signature from the operator's `delegationApprover`
 * @param approverSalt A unique single use value tied to the approver's signature
 */
 function redelegate(
    address newOperator,
    SignatureWithExpiry memory newOperatorApproverSig,
    bytes32 approverSalt
) 
    external 
    returns (bytes32[] memory withdrawalRoots);
```

`redelegate` is a convenience method that combines the effects of `undelegate` and `delegateTo`. `redelegate` allows a staker to switch their delegated operator to `newOperator` with a single call. **Note**, though, that the staker's assets will not be fully delegated to `newOperator` until the withdrawals queued during the undelegation portion of this method are completed.

*Effects*: 
* See [`delegateTo`](#delegateto) and [`undelegate`](#undelegate)

*Requirements*:
* See [`delegateTo`](#delegateto) and [`undelegate`](#undelegate)

#### `queueWithdrawals`

```solidity
/**
 * @param strategies The strategies to withdraw from
 * @param depositShares For each strategy, the number of deposit shares to withdraw. Deposit shares can
 * be queried via `getDepositedShares`.
 * NOTE: The number of shares ultimately received when a withdrawal is completed may be lower depositShares
 * if the staker or their delegated operator has experienced slashing.
 * @param __deprecated_withdrawer This field is ignored. The only party that may complete a withdrawal
 * is the staker that originally queued it. Alternate withdrawers are not supported.
 */
struct QueuedWithdrawalParams {
    IStrategy[] strategies;
    uint256[] depositShares;
    address __deprecated_withdrawer;
}

/**
 * @notice Allows a staker to queue a withdrawal of their deposit shares. The withdrawal can be 
 * completed after the MIN_WITHDRAWAL_DELAY_BLOCKS via either of the completeQueuedWithdrawal methods.
 * 
 * While in the queue, these shares are removed from the staker's balance, as well as from their operator's
 * delegated share balance (if applicable). Note that while in the queue, deposit shares are still subject
 * to slashing. If any slashing has occurred, the shares received may be less than the queued deposit shares.
 *
 * @dev To view all the staker's strategies/deposit shares that can be queued for withdrawal, see `getDepositedShares`
 * @dev To view the current conversion between a staker's deposit shares and withdrawable shares, see `getWithdrawableShares`
 */
function queueWithdrawals(
    QueuedWithdrawalParams[] calldata queuedWithdrawalParams
) 
    external 
    onlyWhenNotPaused(PAUSED_ENTER_WITHDRAWAL_QUEUE)
    nonReentrant
    returns (bytes32[] memory)
```

Allows the caller to queue their deposit shares for withdrawal across any strategy. Withdrawals can be completed after `MIN_WITHDRAWAL_DELAY_BLOCKS`, by calling [`completeQueuedWithdrawal`](#completequeuedwithdrawal). This method accepts _deposit shares_ as input - however, the amounts received upon completion may be lower if the staker has experienced slashing (See [Shares Accounting](./accounting/SharesAccounting.md) and [Slashing Factors and Scaling Shares](#slashing-factors-and-scaling-shares)).

For each `QueuedWithdrawalParams` passed as input, a `Withdrawal` is created in storage (See [Legacy and Post-Slashing Withdrawals](#legacy-and-post-slashing-withdrawals) for details on structure and querying). Queueing a withdrawal involves multiple transformations to a staker's _deposit shares_, serving a few different purposes:
* The raw _deposit shares_ are removed from the staker's deposit share balance in the corresponding share manager (`EigenPodManager` or `StrategyManager`).
* _Scaled shares_ are calculated by applying the staker's _deposit scaling factor_ to their _deposit shares_. Scaled shares:
    * are stored in the `Withdrawal` itself and used during withdrawal completion
    * are added to the operator's `cumulativeScaledSharesHistory`, where they can be burned or redistributed if slashing occurs while the withdrawal is in the queue
* _Withdrawable shares_ are calculated by applying both the staker's _deposit scaling factor_ AND any appropriate _slashing factor_ to the staker's _deposit shares_. These "currently withdrawable shares" are removed from the operator's delegated shares (if applicable).

Note that the `QueuedWithdrawalParams.__deprecated_withdrawer` field is ignored. Originally, this was used to create withdrawals that could be completed by a third party. This functionality was removed during the M2 release due to growing concerns over the phish risk this presented. Until the slashing release, this field was explicitly checked for equivalence with `msg.sender`; however, at present it is ignored. All `Withdrawals` are created with `withdrawer == staker` regardless of this field's value.

*Effects*:
* For each `QueuedWithdrawalParams` element:
    * _Deposit shares_ are removed from the staker's deposit share balances
        * See [`EigenPodManager.removeDepositShares`](./EigenPodManager.md#removedepositshares)
        * See [`StrategyManager.removeDepositShares`](./StrategyManager.md#removedepositshares)
    * _Deposit shares_ are converted to _withdrawable shares_ (See [Slashing Factors and Scaling Deposits](#slashing-factors-and-scaling-shares)). These are decremented from their operator's delegated shares (if applicable)
    * _Deposit shares_ are converted to _scaled shares_  (See [Shares Accounting - Queue Withdrawals](./accounting/SharesAccounting.md#queue-withdrawal)), which are stored in the `Withdrawal` struct
    * If the caller is delegated to an operator, _scaled shares_ are pushed to that operator's `_cumulativeScaledSharesHistory`, which may be burned or redistributed if slashing occurs.
    * The `Withdrawal` is saved to storage
        * The hash of the `Withdrawal` is marked as "pending"
        * The hash of the `Withdrawal` is set in a mapping to the `Withdrawal` struct itself
        * The hash of the `Withdrawal` is pushed to `_stakerQueuedWithdrawalRoots`
    * The staker's withdrawal nonce is increased by 1

*Requirements*:
* Pause status MUST NOT be set: `PAUSED_ENTER_WITHDRAWAL_QUEUE`
* For each `QueuedWithdrawalParams` element:
    * `strategies.length` MUST equal `depositShares.length`
    * The `withdrawer` MUST equal `msg.sender`
    * `strategies.length` MUST NOT be equal to 0
    * See [`EigenPodManager.removeDepositShares`](./EigenPodManager.md#removedepositshares)
    * See [`StrategyManager.removeDepositShares`](./StrategyManager.md#removedepositshares)

#### `completeQueuedWithdrawal`

```solidity
/**
 * @dev A struct representing an existing queued withdrawal. After the withdrawal delay has elapsed, this withdrawal can be completed via `completeQueuedWithdrawal`.
 * A `Withdrawal` is created by the `DelegationManager` when `queueWithdrawals` is called. The `withdrawalRoots` hashes returned by `queueWithdrawals` can be used
 * to fetch the corresponding `Withdrawal` from storage (via `getQueuedWithdrawal`).
 *
 * @param staker The address that queued the withdrawal
 * @param delegatedTo The address that the staker was delegated to at the time the withdrawal was queued. Used to determine if additional slashing occurred before
 * this withdrawal became completable.
 * @param withdrawer The address that will call the contract to complete the withdrawal. Note that this will always equal `staker`; alternate withdrawers are not
 * supported at this time.
 * @param nonce The staker's `cumulativeWithdrawalsQueued` at time of queuing. Used to ensure withdrawals have unique hashes.
 * @param startBlock The block number when the withdrawal was queued.
 * @param strategies The strategies requested for withdrawal when the withdrawal was queued
 * @param scaledShares The staker's deposit shares requested for withdrawal, scaled by the staker's `depositScalingFactor`. Upon completion, these will be
 * scaled by the appropriate slashing factor as of the withdrawal's completable block. The result is what is actually withdrawable.
 */
struct Withdrawal {
    address staker;
    address delegatedTo;
    address withdrawer;
    uint256 nonce;
    uint32 startBlock;
    IStrategy[] strategies;
    uint256[] scaledShares;
}

/**
 * @notice Used to complete a queued withdrawal
 * @param withdrawal The withdrawal to complete
 * @param tokens Array in which the i-th entry specifies the `token` input to the 'withdraw' function of the i-th Strategy in the `withdrawal.strategies` array.
 * @param tokens For each `withdrawal.strategies`, the underlying token of the strategy
 * NOTE: if `receiveAsTokens` is false, the `tokens` array is unused and can be filled with default values. However, `tokens.length` MUST still be equal to `withdrawal.strategies.length`.
 * NOTE: For the `beaconChainETHStrategy`, the corresponding `tokens` value is ignored (can be 0).
 * @param receiveAsTokens If true, withdrawn shares will be converted to tokens and sent to the caller. If false, the caller receives shares that can be delegated to an operator.
 * NOTE: if the caller receives shares and is currently delegated to an operator, the received shares are
 * automatically delegated to the caller's current operator.
 */
function completeQueuedWithdrawal(
    Withdrawal calldata withdrawal,
    IERC20[] calldata tokens,
    bool receiveAsTokens
) 
    external 
    onlyWhenNotPaused(PAUSED_EXIT_WITHDRAWAL_QUEUE)
    nonReentrant
```

`MIN_WITHDRAWAL_DELAY_BLOCKS` after queueing, a staker can complete a `Withdrawal` by calling this method. The staker can elect to receive _either_ tokens OR shares depending on the value of the `receiveAsTokens` parameter. 

Before processing a withdrawal, this method will calculate the slashing factor at the withdrawal's completion block (`withdrawal.startBlock + MIN_WITHDRAWAL_DELAY_BLOCKS`), according to the operator that was delegated to when the withdrawal was queued (`withdrawal.delegatedTo`). This slashing factor is used to determine if any additional slashing occurred while the withdrawal was in the queue. If so, this slashing is applied now.

For each `Withdrawal`, `withdrawal.scaledShares` are converted into _withdrawable shares_, accounting for any slashing that occurred during the withdrawal period (See [Shares Accounting - Complete Withdrawal](./accounting/SharesAccounting.md#complete-withdrawal)).

If the staker chooses to receive the withdrawal _as tokens_, the withdrawable shares are converted to tokens via the corresponding share manager (`EigenPodManager`/`StrategyManager`), and sent to the caller.

If the staker chooses to receive the withdrawal _as shares_, the withdrawable shares are credited to the staker via the corresponding share manager (`EigenPodManager`/`StrategyManager`). Additionally, if the caller is delegated to an operator, the new slashing factor for the given `(staker, operator, strategy)` determines how many shares are awarded to the operator (and how the staker's deposit scaling factor is updated) (See [Slashing Factors and Scaling Shares](#slashing-factors-and-scaling-shares)). In receiving the withdrawal as shares, this amount is credited as deposit shares for the staker. Due to known rounding error, the amount of withdrawable shares after completing the withdrawal may be slightly less than what was originally withdrawable.

**Note:** if the staker (i) receives the withdrawal as shares, (ii) has `MAX_STAKER_STRATEGY_LIST_LENGTH` unique deposit strategies in the `StrategyManager`, and (iii) is withdrawing to a `StrategyManager` strategy in which they do not currently have shares, this will revert. The staker cannot withdraw such that their `stakerStrategyList` length exceeds the maximum; this withdrawal will have to be completed as tokens instead. 

**Note:** if the staker receives a `beaconChainETHStrategy` withdrawal as tokens, the staker's `EigenPod` MUST have sufficient `withdrawableExecutionLayerGwei` to honor the withdrawal.

**Note:** if the strategy is not in the whitelist of the `StrategyManager`, the withdrawal will still succeed regardless of whether it is completed as shares or tokens. 

*Effects*:
* The hash of the `Withdrawal` is removed from the pending withdrawals
* The hash of the `Withdrawal` is removed from the enumerable set of staker queued withdrawals
* The `Withdrawal` struct is removed from the queued withdrawals 
* If `receiveAsTokens`:
    * See [`StrategyManager.withdrawSharesAsTokens`](./StrategyManager.md#withdrawsharesastokens)
    * See [`EigenPodManager.withdrawSharesAsTokens`](./EigenPodManager.md#withdrawsharesastokens)
* If `!receiveAsTokens`:
    * Withdrawable shares are awarded to the caller and delegated to the caller's current operator if applicable
    * See [`StrategyManager.addShares`](./StrategyManager.md#addshares)
    * See [`EigenPodManager.addShares`](./EigenPodManager.md#addshares)

*Requirements*:
* Pause status MUST NOT be set: `PAUSED_EXIT_WITHDRAWAL_QUEUE`
* `tokens.length` must equal `withdrawal.strategies.length`
* Caller MUST be the `staker/withdrawer` specified in the `Withdrawal`
* At least `MIN_WITHDRAWAL_DELAY_BLOCKS` MUST have passed before `completeQueuedWithdrawal` is called
* The hash of the passed-in `Withdrawal` MUST correspond to a pending withdrawal
* If `receiveAsTokens`:
    * The caller MUST pass in the underlying `IERC20[] tokens` being withdrawn in the appropriate order according to the strategies in the `Withdrawal`.
    * See [`StrategyManager.withdrawSharesAsTokens`](./StrategyManager.md#withdrawsharesastokens)
    * See [`EigenPodManager.withdrawSharesAsTokens`](./EigenPodManager.md#withdrawsharesastokens)
* If `!receiveAsTokens`:
    * See [`StrategyManager.addShares`](./StrategyManager.md#addshares)
    * See [`EigenPodManager.addShares`](./EigenPodManager.md#addshares)

#### `completeQueuedWithdrawals`

```solidity
/**
 * @notice Used to complete multiple queued withdrawals
 * @param withdrawals Array of Withdrawals to complete. See `completeQueuedWithdrawal` for the usage of a single Withdrawal.
 * @param tokens Array of tokens for each Withdrawal. See `completeQueuedWithdrawal` for the usage of a single array.
 * @param receiveAsTokens Whether or not to complete each withdrawal as tokens. See `completeQueuedWithdrawal` for the usage of a single boolean.
 * @dev See `completeQueuedWithdrawal` for relevant dev tags
 */
function completeQueuedWithdrawals(
    Withdrawal[] calldata withdrawals,
    IERC20[][] calldata tokens,
    bool[] calldata receiveAsTokens
) 
    external 
    onlyWhenNotPaused(PAUSED_EXIT_WITHDRAWAL_QUEUE) 
    nonReentrant
```

This method is the plural version of [`completeQueuedWithdrawal`](#completequeuedwithdrawal).

---

## Slashing and Accounting

These methods are all called by other system contracts: the `AllocationManager` calls `slashOperatorShares` during slashing, and the `EigenPodManager/StrategyManager` call `increaseDelegatedShares/decreaseDelegatedShares` when stakers' deposit shares (or when beacon chain balance decreases occur).

**Methods**:
* [`DelegationManager.slashOperatorShares`](#slashoperatorshares)
* [`DelegationManager.increaseDelegatedShares`](#increasedelegatedshares)
* [`DelegationManager.decreaseDelegatedShares`](#decreasedelegatedshares)

#### `slashOperatorShares`

```solidity
/**
 * @notice Decreases the operators shares in storage after a slash and increases the burn or redistributable shares by calling
 * into either the StrategyManager or EigenPodManager (if the strategy is beaconChainETH).
 * @param operator The operator to decrease shares for
 * @param operatorSet The OperatorSet to decrease shares for
 * @param slashID The slashID to decrease shares for
 * @param strategy The strategy to decrease shares for
 * @param prevMaxMagnitude the previous maxMagnitude of the operator
 * @param newMaxMagnitude the new maxMagnitude of the operator
 * @dev Callable only by the AllocationManager
 * @dev Note: Assumes `prevMaxMagnitude <= newMaxMagnitude`. This invariant is maintained in
 * the AllocationManager.
 * @return depositSharesToSlash The total deposit shares to slash (burn or redistribute).
 */
function slashOperatorShares(
    address operator,
    OperatorSet calldata operatorSet,
    uint256 slashId,
    IStrategy strategy,
    uint64 prevMaxMagnitude,
    uint64 newMaxMagnitude
) 
    external
    onlyAllocationManager
    nonReentrant
    returns (uint256 depositSharesToSlash)
```

_See [Shares Accounting - Slashing](https://github.com/Layr-Labs/eigenlayer-contracts/blob/slashing-magnitudes/docs/core/accounting/SharesAccounting.md#slashing) for a description of the accounting in this method._

This method is called by the `AllocationManager` when processing an AVS's slash of an operator. Slashing occurs instantly, with this method directly reducing the operator's delegated shares proportional to the slash.

Additionally, any _slashable shares_ in the withdrawal queue are marked for burn or redistribution according to the same slashing proportion (shares in the withdrawal queue remain slashable for `MIN_WITHDRAWAL_DELAY_BLOCKS`). For the slashed strategy, the corresponding share manager (`EigenPodManager/StrateyManager`) is called, increasing the burn or redistributable shares for that operatorSet, slashId, and strategy combination. 

**Note**: native ETH does not currently possess a burn/redistribution mechanism, as this requires Pectra to be able to force exit validators. Currently, slashing for the `beaconChainETHStrategy` is realized by modifying the amount stakers are able to withdraw.

*Effects*:
* The `operator's` `operatorShares` are reduced for the given `strategy`, according to the proportion given by `prevMaxMagnitude` and `newMaxMagnitude`
* Any slashable shares in the withdrawal queue are marked for burning or redistribution according to the same proportion
* See [`StrategyManager.increaseBurnOrRedistributableShares`](./StrategyManager.md#increaseBurnableShares)
* See [`EigenPodManager.increaseBurnOrRedistributableShares`](./EigenPodManager.md#increaseBurnableShares)


*Requirements*:
* The amount slashed from the operator must not result in underflow of their `operatorShares` for the given `strategy`

#### `increaseDelegatedShares`

```solidity
/**
 * @notice Called by a share manager when a staker's deposit share balance in a strategy increases.
 * This method delegates any new shares to an operator (if applicable), and updates the staker's 
 * deposit scaling factor regardless.
 * @param staker The address whose deposit shares have increased
 * @param strategy The strategy in which shares have been deposited
 * @param prevDepositShares The number of deposit shares the staker had in the strategy prior to the increase
 * @param addedShares The number of deposit shares added by the staker
 *
 * @dev Note that if either the staker's current operator has been slashed 100% for `strategy`, OR the
 * staker has been slashed 100% on the beacon chain such that the calculated slashing factor is 0, this
 * method WILL REVERT.
 */
function increaseDelegatedShares(
    address staker,
    IStrategy strategy,
    uint256 prevDepositShares,
    uint256 addedShares
) 
    external
    onlyStrategyManagerOrEigenPodManager
    nonReentrant
```

Called by either the `StrategyManager` or `EigenPodManager` when a staker's deposit shares for one or more strategies increase.

If the staker is delegated to an operator, the new deposit shares are directly added to that operator's `operatorShares`. Regardless of delegation status, the staker's deposit scaling factor is updated. In addition, if the operator has allocated slashable stake for the strategy, the staker's deposit is immediately slashable by an operatorSet. 

**Note** that if either the staker's current operator has been slashed 100% for `strategy`, OR the staker has been slashed 100% on the beacon chain such that the calculated slashing factor is 0, this method WILL REVERT. See [Shares Accounting - Fully Slashed](./accounting/SharesAccountingEdgeCases.md#fully-slashed-for-a-strategy) for details. This doesn't block delegation to an operator if the staker has 0 deposit shares for a strategy which has a slashing factor of 0, but any subsequent deposits that call `increaseDelegatedShares` will revert from the **Fully Slashed** edge case.

*Effects*:
* If the staker is delegated to an operator, `addedShares` are added to the operator's shares
* The staker's deposit scaling factor is updated

*Requirements*:
* Caller MUST be either the `StrategyManager` or `EigenPodManager`

#### `decreaseDelegatedShares`

```solidity
/**
 * @notice If the staker is delegated, decreases its operator's shares in response to
 * a decrease in balance in the beaconChainETHStrategy
 * @param staker the staker whose operator's balance will be decreased
 * @param curDepositShares the current deposit shares held by the staker
 * @param beaconChainSlashingFactorDecrease the amount that the staker's beaconChainSlashingFactor has decreased by
 * @dev Note: `beaconChainSlashingFactorDecrease` are assumed to ALWAYS be < 1 WAD.
 * These invariants are maintained in the EigenPodManager.
 */
function decreaseDelegatedShares(
    address staker,
    uint256 curDepositShares,
    uint64 beaconChainSlashingFactorDecrease
) 
    external
    onlyEigenPodManager
    nonReentrant
```

Called by the `EigenPodManager` when a staker's shares decrease due to a checkpointed balance decrease on the beacon chain. If the staker is delegated to an operator, the operator's shares are decreased in return. Otherwise, this method does nothing.

*Effects*: If the staker in question is delegated to an operator, the operator's shares for the `beaconChainETHStrategy` are decreased by the amount the staker's withdrawable shares have decreased by
* This method is a no-op if the staker is not delegated to an operator.

*Requirements*:
* Caller MUST be the `EigenPodManager`
````

## File: docs/core/DurationVaultStrategy.md
````markdown
# 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()<br/>vaultAdmin only
    ALLOCATIONS --> WITHDRAWALS: markMatured()<br/>anyone, after duration
    ALLOCATIONS --> WITHDRAWALS: advanceToWithdrawals()<br/>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.
````

## File: docs/core/EigenPod.md
````markdown
[eip-4788]: https://eips.ethereum.org/EIPS/eip-4788
[custom-types]: https://eth2book.info/capella/part3/config/types/#custom-types
[validator-container]: https://eth2book.info/capella/part3/containers/dependencies/#validator

## EigenPod

| File | Type | Proxy |
| -------- | -------- | -------- |
| [`EigenPod.sol`](../../src/contracts/pods/EigenPod.sol) | Instanced, deployed per-user | Beacon proxy |

An `EigenPod` is deployed via the `EigenPodManager` by a Staker (referred to in this doc as the _Pod Owner_). `EigenPods` allow a Pod Owner to restake one or more beacon chain validators, earning shares which can be delegated to Operators to earn yield. When a Pod Owner begins running a validator on the beacon chain, they choose _withdrawal credentials_ for that validator. Withdrawal credentials are the ETH address to which:
* A validator's _principal_ is sent when the validator exits the beacon chain
* A validator's _consensus rewards_ are sent as the validator proposes/attests to blocks on the beacon chain

Additionally, when running validator node software, a validator is configured with a _fee recipient_. The fee recipient receives:
* _Execution layer rewards_ when the validator proposes a block
* _MEV rewards_ if the validator is running MEV-boost/other custom block proposer software

**An `EigenPod` may serve as EITHER/BOTH the withdrawal credentials OR the fee recipient for your validators.** In prior releases, it was only possible to use an `EigenPod` for withdrawal credentials. However, this is no longer the case!

`EigenPods` support validators with BOTH 0x01 and 0x02 withdrawal credentials, as well as validators up to (and beyond) 2048 ETH.

For more background and history on `EigenPod` design, check out [this HackMD](https://hackmd.io/U36dE9lnQha3tbf7D0GtKw).

---

The **primary goal** of the `EigenPod` system is to **ensure that shares are backed 1:1** with ETH that is _either already in the `EigenPod`, or will eventually flow through the `EigenPod`._ To support this goal, `EigenPods`: 
* serve as the withdrawal credentials for one or more beacon chain validators controlled by the Pod Owner
* validate beacon chain state proofs
* interpret these proofs to add or remove shares in the beacon chain ETH strategy

Because beacon chain proofs are processed asynchronously from the beacon chain itself, there is an inherent _lag_ between an event on the beacon chain and a corresponding share update in any affected `EigenPods`. Therefore, the **secondary goals** of the `EigenPod` system are to **minimize lag where possible** and to **ensure various timing windows cannot (i) create unbacked shares or (ii) prevent the withdrawal of existing shares.**

#### High-level Concepts

* [Restaking Beacon Chain ETH](#restaking-beacon-chain-eth)
* [Checkpointing Validators](#checkpointing-validators)
* [Staleness Proofs](#staleness-proofs)
* [Consolidations and Withdrawals](#consolidations-and-withdrawals)
* [Other Methods](#other-methods)

#### Important Definitions

**_Pod Owner_**: A Staker who has deployed an `EigenPod` is a _Pod Owner_. The terms are used interchangeably in this document.
* _Pod Owners_ can only deploy a single `EigenPod`, but can restake any number of beacon chain validators from the same `EigenPod`.
* _Pod Owners_ can delegate their `EigenPodManager` shares to Operators (via `DelegationManager`).
* These shares correspond to the amount of restaked beacon chain ETH held by the _Pod Owner_ via their `EigenPod`.

**_Proof Submitter_**: An address designated by the Pod Owner with permissions to call certain `EigenPod` methods. This role is provided to allow Pod Owners to manage their day-to-day `EigenPod` tasks via hot wallets, rather than the Pod Owner address which controls all funds. The Proof Submitter can call several `EigenPod` methods. See [`setProofSubmitter` docs](#setproofsubmitter) for more details.

**_Active validator set_**: This term is used frequently in this document to describe the set of validators whose withdrawal credentials have been verified to be pointed at an `EigenPod`. The _active validator set_ is used to determine the number of proofs required to complete a checkpoint (see [Checkpointing Validators](#checkpointing-validators)).
* A validator enters the _active validator set_ when their withdrawal credentials are verified (see [`verifyWithdrawalCredentials`](#verifywithdrawalcredentials))
* A validator leaves the _active validator set_ when a checkpoint proof shows they have 0 balance (see [`verifyCheckpointProofs`](#verifycheckpointproofs))

In the implementation, the _active validator set_ is comprised of two state variables:
* `uint256 activeValidatorCount` 
    * incremented by 1 when a validator enters the _active validator set_
    * decremented by 1 when a validator leaves the _active validator set_
* `mapping(bytes32 => ValidatorInfo) _validatorPubkeyHashToInfo` (specifically, the `status` field)
    * `VALIDATOR_STATUS.INACTIVE -> VALIDATOR_STATUS.ACTIVE` when entering the _active validator set_
    * `VALIDATOR_STATUS.ACTIVE -> VALIDATOR_STATUS.WITHDRAWN` when leaving the _active validator set_

**_Checkpoint_**: A snapshot of `EigenPod` and beacon chain state used to update the _Pod Owner's_ shares based on a combination of beacon chain balance and native ETH balance. Checkpoints allow an `EigenPod` to account for validator exits, partial withdrawals of consensus rewards, or execution layer fees earned by their validators. Completing a checkpoint will account for these amounts in the `EigenPod`, enabling the _Pod Owner_ to compound their restaked shares or withdraw accumulated yield.

Only one _checkpoint_ can be active at a time in a given `EigenPod`. The pod's _current checkpoint_ is represented by the following data structure:

```solidity
struct Checkpoint {
    bytes32 beaconBlockRoot;      // proofs are verified against a beacon block root
    uint24 proofsRemaining;       // number of proofs remaining before the checkpoint is completed
    uint64 podBalanceGwei;        // native ETH that will be awarded shares when the checkpoint is completed
    int64 balanceDeltasGwei;      // total change in beacon chain balance tracked across submitted proofs
    uint64 prevBeaconBalanceGwei; // total recorded beacon chain balance as of the last checkpoint
}
```

Checkpoints are completed by submitting one beacon chain proof per validator in the pod's _active validator set_. See [Checkpointing Validators](#checkpointing-validators) for details.

---    

### Restaking Beacon Chain ETH

If a Pod Owner has validators whose withdrawal credentials are an `EigenPod`, the Pod Owner can use `verifyWithdrawalCredentials` to begin restaking ETH while it is still on the beacon chain. Once a validator's withdrawal credentials are verified:
* the Pod Owner receives delegatable shares via `EigenPodManager.podOwnerShares`
* the validator enters the pod's _active validator set_, and must be included in future checkpoint proofs (see [Checkpointing Validators](#checkpointing-validators))

_Methods:_
* [`verifyWithdrawalCredentials`](#verifywithdrawalcredentials)

#### `verifyWithdrawalCredentials`

```solidity
function verifyWithdrawalCredentials(
    uint64 beaconTimestamp,
    BeaconChainProofs.StateRootProof calldata stateRootProof,
    uint40[] calldata validatorIndices,
    bytes[] calldata validatorFieldsProofs,
    bytes32[][] calldata validatorFields
)
    external
    onlyOwnerOrProofSubmitter
    onlyWhenNotPaused(PAUSED_EIGENPODS_VERIFY_CREDENTIALS)

struct StateRootProof {
    bytes32 beaconStateRoot;
    bytes proof;
}
```

This method first verifies a beacon state root against a beacon block root returned by the [EIP-4788 oracle][eip-4788]. Then, it verifies one or more withdrawal credential proofs against the beacon state root. Finally, the Pod Owner is awarded shares according to the sum of the effective balance of each verified validator (via `EigenPodManager.recordBeaconChainETHBalanceUpdate`).

A withdrawal credential proof uses a validator's [`ValidatorIndex`][custom-types] and a merkle proof to prove the existence of a [`Validator` container][validator-container] at a given block. The beacon chain `Validator` container holds important information used in this method:
* `pubkey`: A BLS pubkey hash, used to uniquely identify the validator within the `EigenPod`
* `withdrawal_credentials`: Used to verify that the validator will withdraw its principal to this `EigenPod` if it exits the beacon chain. Can have EITHER the 0x01 or 0x02 prefix.
* `effective_balance`: The balance of the validator, updated once per epoch and capped at 32 ETH. Used to award shares to the Pod Owner
* `activation_epoch`: Initially set to `type(uint64).max`, this value is updated when a validator reaches a balance of at least 32 ETH, designating the validator is ready to become active on the beacon chain. **This method requires that a validator is either already active, or in the process of activating on the beacon chain.**
* `exit_epoch`: Initially set to `type(uint64).max`, this value is updated when a validator initiates exit from the beacon chain. **This method requires that a validator has not initiated an exit from the beacon chain.**
  * If a validator has been exited prior to calling `verifyWithdrawalCredentials`, their ETH can be accounted for, awarded shares, and/or withdrawn via the checkpoint system (see [Checkpointing Validators](#checkpointing-validators)).

_Note that it is not required to verify your validator's withdrawal credentials_, unless you want to receive shares for ETH on the beacon chain. You may choose to use your `EigenPod` without verifying withdrawal credentials; you will still be able to withdraw yield (or receive shares for yield) via the [checkpoint system](#checkpointing-validators). To account for ETH held on the beacon chain and to make execution layer partial withdrawal or full exits, this function *MUST* be called. 

*Effects*:
* For each set of unique verified withdrawal credentials:
    * `activeValidatorCount` is increased by 1
    * The validator's info is recorded in state (`_validatorPubkeyHashToInfo[pubkeyHash]`):
        * `validatorIndex` is recorded from the passed-in `validatorIndices`
        * `restakedBalanceGwei` is set to the validator's effective balance
        * `lastCheckpointedAt` is set to either the `lastCheckpointTimestamp` or `currentCheckpointTimestamp`
        * `VALIDATOR_STATUS` moves from `INACTIVE` to `ACTIVE`
* The Pod Owner is awarded shares according to the sum of effective balances proven. See [`EigenPodManager.recordBeaconChainETHBalanceUpdate`](./EigenPodManager.md#recordbeaconchainethbalanceupdate)

*Requirements*:
* Caller MUST be EITHER the Pod Owner or Proof Submitter
* Pause status MUST NOT be set: `PAUSED_EIGENPODS_VERIFY_CREDENTIALS`
* Input array lengths MUST be equal
* `beaconTimestamp`:
    * MUST be greater than `currentCheckpointTimestamp`
    * MUST be greater than `latestCheckpointTimestamp`
    * MUST be queryable via the [EIP-4788 oracle][eip-4788]. Generally, this means `beaconTimestamp` corresponds to a valid beacon block created within the last 8192 blocks (~27 hours).
* `stateRootProof` MUST verify a `beaconStateRoot` against the `beaconBlockRoot` returned from the EIP-4788 oracle
* For each validator:
    * The validator MUST NOT have been previously-verified (`VALIDATOR_STATUS` should be `INACTIVE`)
    * The validator's `activation_epoch` MUST NOT equal `type(uint64).max` (aka `FAR_FUTURE_EPOCH`)
    * The validator's `exit_epoch` MUST equal `type(uint64).max` (aka `FAR_FUTURE_EPOCH`)
    * The validator's `withdrawal_credentials` MUST be pointed to the `EigenPod`
    * `validatorFieldsProof` MUST be a valid merkle proof of the corresponding `validatorFields` under the `beaconStateRoot` at the given `validatorIndex`
* See [`EigenPodManager.recordBeaconChainETHBalanceUpdate`](./EigenPodManager.md#recordbeaconchainethbalanceupdate)

---

### Checkpointing Validators

Checkpoint proofs comprise the bulk of proofs submitted to an `EigenPod`. Completing a checkpoint means submitting _one checkpoint proof for each validator_ in the pod's _active validator set._

`EigenPods` use checkpoints to detect:
* when validators have exited from the beacon chain, leaving the pod's _active validator set_
* when the pod has accumulated fees / partial withdrawals from validators
* whether any validators on the beacon chain have increased/decreased in balance
* when consolidation requests have been completed

When a checkpoint is completed, shares are updated accordingly for each of these events. OwnedShares can be withdrawn via the `DelegationManager` withdrawal queue (see [DelegationManager: Undelegating and Withdrawing](./DelegationManager.md#undelegating-and-withdrawing)), which means an `EigenPod's` checkpoint proofs also play an important role in allowing Pod Owners to exit funds from the system.

_Important Notes:_
* `EigenPods` can only have **one active checkpoint** at a given time, and once started, checkpoints **cannot be cancelled** (only completed)
* Checkpoint proofs are based entirely off of _current balance_ proofs. Even though partial/full withdrawals are processed via checkpoint proofs, this system does NOT use withdrawal proofs.

_Methods:_
* [`startCheckpoint`](#startcheckpoint)
* [`verifyCheckpointProofs`](#verifycheckpointproofs)

#### `startCheckpoint`

```solidity
function startCheckpoint(bool revertIfNoBalance)
    external
    onlyOwnerOrProofSubmitter() 
    onlyWhenNotPaused(PAUSED_START_CHECKPOINT) 
```

This method allows a Pod Owner (or Proof Submitter) to start a checkpoint, beginning the process of proving a pod's _active validator set_. `startCheckpoint` takes a snapshot of three things:
* `podBalanceGwei`: the `EigenPod's` native ETH balance, minus any balance already credited with shares through previous checkpoints
    * Note: if `revertIfNoBalance == true`, this method will revert if `podBalanceGwei == 0`. This is to allow a Pod Owner to avoid creating a checkpoint unintentionally.
* `activeValidatorCount`: the number of validators in the pod's _active validator set_, aka the number of validators with verified withdrawal credentials who have NOT been proven exited via a previous checkpoint
    * This becomes the checkpoint's `proofsRemaining`, or the number of proofs that need to be submitted to `verifyCheckpointProofs` to complete the checkpoint
* `beaconBlockRoot`: the beacon block root of the previous slot, fetched by querying the [EIP-4788 oracle][eip-4788] with the current `block.timestamp`
    * This is used as the single source of truth for all proofs submitted for this checkpoint

`startCheckpoint` plays a very important role in the security of the checkpoint process: it guarantees that _the pod's native ETH balance and any beacon balances proven in the checkpoint are 100% distinct_. That is: if a partial/full exit is processed in the block before `startCheckpoint` is called, then:
* The withdrawn ETH is already in the pod when `startCheckpoint` is called, and is factored into `podBalanceGwei`
* A proof of the validator's current balance against `beaconBlockRoot` will NOT include the withdrawn ETH

This guarantee means that, if we use the checkpoint to sum up the beacon chain balance of the pod's _active validator set_, **we can award guaranteed-backed shares** according to the sum of the pod's beacon chain balance and its native ETH balance.

*Effects*:
* Sets `currentCheckpointTimestamp` to `block.timestamp`
* Creates a new `Checkpoint`:
    * `beaconBlockRoot`: set to the current block's parent beacon block root, fetched by querying the [EIP-4788 oracle][eip-4788] using `block.timestamp` as input.
    * `proofsRemaining`: set to the current value of `activeValidatorCount` (note that this value MAY be 0)
    * `podBalanceGwei`: set to the pod's native ETH balance, minus any balance already accounted for in previous checkpoints
    * `balanceDeltasGwei`: set to 0 initially
* If `checkpoint.proofsRemaining == 0`, the new checkpoint is auto-completed:
    * `withdrawableRestakedExecutionLayerGwei` is increased by `checkpoint.podBalanceGwei`
    * `lastCheckpointTimestamp` is set to `currentCheckpointTimestamp`
    * `currentCheckpointTimestamp` and `_currentCheckpoint` are deleted
    * The Pod Owner's shares are updated (see [`EigenPodManager.recordBeaconChainETHBalanceUpdate`](./EigenPodManager.md#recordbeaconchainethbalanceupdate))

*Requirements*:
* Caller MUST be EITHER the Pod Owner or Proof Submitter
* Pause status MUST NOT be set: `PAUSED_START_CHECKPOINT`
* A checkpoint MUST NOT be active (`currentCheckpointTimestamp == 0`)
* The last checkpoint completed MUST NOT have been started in the current block (`lastCheckpointTimestamp != block.timestamp`)
* If `revertIfNoBalance == true`, the pod's native ETH balance MUST contain some nonzero value not already accounted for in the _Pod Owner's_ shares

#### `verifyCheckpointProofs`

```solidity
function verifyCheckpointProofs(
    BeaconChainProofs.BalanceContainerProof calldata balanceContainerProof,
    BeaconChainProofs.BalanceProof[] calldata proofs
)
    external 
    onlyWhenNotPaused(PAUSED_EIGENPODS_VERIFY_CHECKPOINT_PROOFS) 

struct BalanceContainerProof {
    bytes32 balanceContainerRoot;
    bytes proof;
}

struct BalanceProof {
    bytes32 pubkeyHash;
    bytes32 balanceRoot;
    bytes proof;
}
```

`verifyCheckpointProofs` is used to make progress on (or complete) the pod's current checkpoint. This method accepts one or more merkle proofs of validators' _current balances_ against a `balanceContainerRoot`. Additionally, a `balanceContainerProof` verifies this `balanceContainerRoot` against the _current checkpoint's_ `beaconBlockRoot`.

Proofs submitted to this method concern a validator's _current balance,_ NOT their _effective balance_. The _current balance_ is updated every slot, while _effective balances_ are updated roughly once per epoch. Current balances are stored in the [`BeaconState.balances` field](https://eth2book.info/capella/part3/containers/state/#beaconstate).

For each validator submitted via `proofs`:
* The validator's `status` should be `ACTIVE`. That is, its withdrawal credentials are verified (see [`verifyWithdrawalCredentials`](#verifywithdrawalcredentials)), and it has a nonzero balance as of the last time it was seen in a checkpoint proof.
* The validator's `lastCheckpointedAt` should be less than `currentCheckpointTimestamp`. This is to prevent a validator from counting towards a checkpoint's progression more than once.

If either of these two conditions is not met, _the proof will be skipped but execution will continue_. Execution continues without reverting to prevent a potential griefing vector where anyone could frontrun a batch of proofs, submit one proof from the batch, and cause the batch to revert.

Each valid proof submitted decreases the _current checkpoint's_ `proofsRemaining` by 1. If `proofsRemaining` hits 0 the checkpoint is automatically completed, updating the Pod Owner's shares accordingly.

*Effects*:
* Update `_currentCheckpoint` in storage
* For each validator successfully checkpointed:
    * The number of proofs remaining in the checkpoint is decreased (`checkpoint.proofsRemaining--`)
    * A balance delta is calculated using the validator's previous `restakedBalanceGwei`. This delta is added to `checkpoint.balanceDeltasGwei` to track the total beacon chain balance delta.
    * The validator's `restakedBalanceGwei` and `lastCheckpointedAt` fields are updated. Additionally, if the proof shows that the validator has a balance of 0, the validator's status is moved to `VALIDATOR_STATUS.WITHDRAWN` and the pod's `activeValidatorCount` is decreased.
* If the checkpoint's `proofsRemaining` drops to 0, the checkpoint is automatically completed:
    * `checkpoint.podBalanceGwei` is added to `withdrawableRestakedExecutionLayerGwei`, rendering it accounted for in future checkpoints
    * `lastCheckpointTimestamp` is set to `currentCheckpointTimestamp`, and `currentCheckpointTimestamp` is set to 0.
    * The Pod Owner's total share delta is calculated as the sum of `checkpoint.podBalanceGwei` and `checkpoint.balanceDeltasGwei`, and forwarded to the `EigenPodManager` (see [`EigenPodManager.recordBeaconChainETHBalanceUpdate`](./EigenPodManager.md#recordbeaconchainethbalanceupdate))

*Requirements*:
* Pause status MUST NOT be set: `PAUSED_EIGENPODS_VERIFY_CHECKPOINT_PROOFS`
* A checkpoint MUST currently be active (`currentCheckpointTimestamp != 0`)
* `balanceContainerProof` MUST contain a valid merkle proof of the beacon chain's balances container against `_currentCheckpoint.beaconBlockRoot`
* Each `proof` in `proofs` MUST contain a valid merkle proof of the validator's `balanceRoot` against `balanceContainerProof.balanceContainerRoot`

---

### Staleness Proofs

Regular checkpointing of validators plays an important role in the health of the system, as a completed checkpoint ensures that the pod's shares and backing assets are up to date.

Typically, checkpoints can only be started by the Pod Owner (see [`startCheckpoint`](#startcheckpoint)). This is because completing a checkpoint with a lot of validators has the potential to be an expensive operation, so gating `startCheckpoint` to only be callable by the Pod Owner prevents a griefing vector where anyone can cheaply force the Pod Owner to perform a checkpoint.

In most cases, Pod Owners are incentivized to perform their own regular checkpoints, as completing checkpoints is the only way to access yield sent to the pod. However, if beacon chain validators are slashed, it's possible that a Pod Owner no longer has an incentive to start/complete a checkpoint. After all, they would be losing shares equal to the slashed amount. Unless they have enough unclaimed yield in the pod to make up for this, they only stand to lose by completing a checkpoint.

In this case, `verifyStaleBalance` can be used to allow a third party to start a checkpoint on the Pod Owner's behalf.

*Methods*:
* [`verifyStaleBalance`](#verifystalebalance)

#### `verifyStaleBalance`

```solidity
function verifyStaleBalance(
    uint64 beaconTimestamp,
    BeaconChainProofs.StateRootProof calldata stateRootProof,
    BeaconChainProofs.ValidatorProof calldata proof
)
    external
    onlyWhenNotPaused(PAUSED_START_CHECKPOINT) 
    onlyWhenNotPaused(PAUSED_VERIFY_STALE_BALANCE)
```

Allows anyone to prove that a validator in the pod's _active validator set_ was slashed on the beacon chain. A successful proof allows the caller to start a checkpoint. Note that if the pod currently has an active checkpoint, the existing checkpoint needs to be completed before `verifyStaleBalance` can start a checkpoint.

A valid proof has the following requirements:
* The `beaconTimestamp` MUST be newer than the timestamp the validator was last checkpointed at
* The validator in question MUST be in the _active validator set_ (have the status `VALIDATOR_STATUS.ACTIVE`)
* The proof MUST show that the validator has been slashed

If these requirements are met and the proofs are valid against a beacon block root given by `beaconTimestamp`, a checkpoint is started.

*Effects*:
* Sets `currentCheckpointTimestamp` to `block.timestamp`
* Creates a new `Checkpoint`:
    * `beaconBlockRoot`: set to the current block's parent beacon block root, fetched by querying the [EIP-4788 oracle][eip-4788] using `block.timestamp` as input.
    * `proofsRemaining`: set to the current value of `activeValidatorCount`
    * `podBalanceGwei`: set to the pod's native ETH balance, minus any balance already accounted for in previous checkpoints
    * `balanceDeltasGwei`: set to 0 initially

*Requirements*:
* Pause status MUST NOT be set: `PAUSED_START_CHECKPOINT`
* Pause status MUST NOT be set: `PAUSED_VERIFY_STALE_BALANCE`
* A checkpoint MUST NOT be active (`currentCheckpointTimestamp == 0`)
* The last checkpoint completed MUST NOT be the current block
* For the validator given by `proof.validatorFields`:
    * `beaconTimestamp` MUST be greater than `validatorInfo.lastCheckpointedAt`
    * `validatorInfo.status` MUST be `VALIDATOR_STATUS.ACTIVE`
    * `proof.validatorFields` MUST show that the validator is slashed
* `stateRootProof` MUST verify a `beaconStateRoot` against the `beaconBlockRoot` returned from the EIP-4788 oracle
* The `ValidatorProof` MUST contain a valid merkle proof of the corresponding `validatorFields` under the `beaconStateRoot` at `validatorInfo.validatorIndex`

---

### Consolidations and Withdrawals

Methods for interacting with predeploys introduced in Pectra. See supplemental docs [here](https://hackmd.io/uijo9RSnSMOmejK1aKH0vw?view):
* [`requestConsolidation`](#requestconsolidation)
* [`requestWithdrawal`](#requestwithdrawal)


#### `requestConsolidation`

```solidity
/// SEE FULL METHOD DOCS IN IEigenPod.sol
function requestConsolidation(
    ConsolidationRequest[] calldata requests
) external payable onlyOwnerOrProofSubmitter;

/**
 * @param srcPubkey the pubkey of the source validator for the consolidation
 * @param targetPubkey the pubkey of the target validator for the consolidation
 * @dev Note that if srcPubkey == targetPubkey, this is a "switch request," and will
 * change the validator's withdrawal credential type from 0x01 to 0x02.
 * For more notes on usage, see `requestConsolidation`
 */
struct ConsolidationRequest {
    bytes srcPubkey;
    bytes targetPubkey;
}

/// @notice Returns the fee required to add a consolidation request to the EIP-7251 predeploy this block.
/// @dev Note that the predeploy updates its fee every block according to https://eips.ethereum.org/EIPS/eip-7251#fee-calculation
/// Consider overestimating the amount sent to ensure the fee does not update before your transaction.
function getConsolidationRequestFee() external view returns (uint256);
```

This method allows the pod owner or proof submitter to submit validator consolidation requests via the [EIP-7521](https://eips.ethereum.org/EIPS/eip-7251) predeploy. Consolidation requests come in two forms:
* "Switch requests" will switch a validator's withdrawal credentials from the 0x01 "eth1" prefix to the 0x02 "compounding" prefix. For a switch request, `srcPubkey == targetPubkey`.
* Standard requests will consolidate a source validator's balance _into_ a target 0x02 validator. For a standard request, `srcPubkey != targetPubkey`.

In order to initiate a consolidation request ([basic how-to guide here]((https://hackmd.io/uijo9RSnSMOmejK1aKH0vw?view#How-to-use-these-methods))):
* The predeploy requires a fee for each request. The current fee for the block can be queried using `getConsolidationRequestFee`. This should be multiplied for each request in the passed-in `requests` array and provided as `msg.value`. The predeploy updates its fee each block depending on how many consolidation requests are queued vs how many are processed.
    * Note that any unused fee is transferred back to `msg.sender` at the end of this method.
* The `target` validator MUST have verified withdrawal credentials (`getValidatorStatus` returns `ACTIVE`)
* For standard requests, the `target` validator MUST have 0x02 withdrawal credentials on the beacon chain.

When a standard consolidation is completed on the beacon chain, the source validator's balance will be transferred to the target validator. For all intents and purposes, the source validator will appear to have "exited" - its exit epoch and withdrawable epoch are set, and its balance drops to zero. When processed by a checkpoint, this 0 balance will cause the _source_ validator to be marked as `WITHDRAWN`, exempting it from future checkpoint proofs.

Note that the beacon chain may "skip" a consolidation request for many reasons. This skip is inherently invisible to the `EigenPod`. See [the `process_consolidation_request` spec](https://github.com/ethereum/consensus-specs/blob/dev/specs/electra/beacon-chain.md#new-process_consolidation_request) for a complete list of conditions that may cause a request to be skipped.

*Effects*:
* Queue each `request` in the EIP 7521 predeploy, sending the current consolidation request fee each time.
* If excess `msg.value` was provided, transfer the remainder back to `msg.sender`

*Requirements*:
* Caller MUST be EITHER the Pod Owner or Proof Submitter
* Pause status MUST NOT be set: `PAUSED_CONSOLIDATIONS`
* `msg.value` MUST be at least `getConsolidationRequestFee() * requests.length`
* For each `request` in `requests`:
    * `request.srcPubkey` and `request.targetPubkey` MUST have a length of 48
    * `request.targetPubkey` MUST correspond to a validator whose withdrawal credentials are proven to point at the pod (`VALIDATOR_STATUS.ACTIVE`)
* If excess `msg.value` was provided, the transfer of the excess back to `msg.sender` MUST succeed.

#### `requestWithdrawal`

```solidity
/// SEE FULL METHOD DOCS IN IEigenPod.sol
function requestWithdrawal(
    WithdrawalRequest[] calldata requests
) external payable onlyOwnerOrProofSubmitter;

/**
 * @param pubkey the pubkey of the validator to withdraw from
 * @param amountGwei the amount (in gwei) to withdraw from the beacon chain to the pod
 * @dev Note that if amountGwei == 0, this is a "full exit request," and will fully exit
 * the validator to the pod.
 * For more notes on usage, see `requestWithdrawal`
 */
struct WithdrawalRequest {
    bytes pubkey;
    uint64 amountGwei;
}

/// @notice Returns the current fee required to add a withdrawal request to the EIP-7002 predeploy.
/// @dev Note that the predeploy updates its fee every block according to https://eips.ethereum.org/EIPS/eip-7002#fee-update-rule
/// Consider overestimating the amount sent to ensure the fee does not update before your transaction.
function getWithdrawalRequestFee() external view returns (uint256);
```

This method allows the pod owner or proof submitter to submit validator withdrawal requests via the [EIP-7002](https://eips.ethereum.org/EIPS/eip-7002) predeploy. Withdrawal requests come in two forms:
* "Full withdrawals" will completely exit a validator from the beacon chain. For a full withdrawal, `request.amountGwei == 0`.
* "Partial withdrawals" will exit a portion of a validator's balance from the beacon chain, down to 32 ETH. Any amount requested that would bring a validator's balance below 32 ETH is ignored.

In order to initiate a withdrawal request:
* The [`verifyWithdrawalCredentials`](#verifywithdrawalcredentials) function must be called to prove the validator exists within the pod
* The predeploy requires a fee for each request. The current fee for the block can be queried using `getWithdrawalRequestFee`. This should be multiplied for each request in the passed-in `requests` array and provided as `msg.value`. The predeploy updates its fee each block depending on how many withdrawal requests are queued vs how many are processed.
    * Note that any unused fee is transferred back to `msg.sender` at the end of this method.
* For partial withdrawals, note that the beacon chain will only process these if the validator has 0x02 withdrawal credentials.

When a withdrawal request is completed on the beacon chain, the requested amount will be withdrawn from the validator's beacon chain balance and exited to the pod. Note that at no point can a partial withdrawal request cause a validator to drop below 32 ETH balance. This is especially important if you're planning to use requests to track withdrawn balance: _it's possible that the amount you request is not equal to the amount withdrawn_. For example, my validator has 33 ETH and I request a withdrawal of 2 ETH, the withdrawal request will only result in 1 ETH being withdrawn.

Note that the beacon chain may "skip" a withdrawal request for many reasons. This skip is inherently invisible to the `EigenPod`. See [the `process_withdrawal_request` spec](https://github.com/ethereum/consensus-specs/blob/dev/specs/electra/beacon-chain.md#new-process_withdrawal_request) for a complete list of conditions that may cause a request to be skipped.

**Finally,** note that if a validator has pending partial/full withdrawals initiated via this predeploy, it becomes _ineligible_ to be the _source_ validator in a standard consolidation until those requests are completed. There is no such requirement for _target_ validators.

*Effects*:
* Queue each `request` in the EIP 7002 predeploy, sending the current withdrawal request fee each time.
* If excess `msg.value` was provided, transfer the remainder back to `msg.sender`

*Requirements*:
* Caller MUST be EITHER the Pod Owner or Proof Submitter
* Pause status MUST NOT be set: `PAUSED_WITHDRAWAL_REQUESTS`
* `msg.value` MUST be at least `getWithdrawalRequestFee() * requests.length`
* For each `request` in `requests`:
    * The validator MUST have been proven to the pod
    * `request.pubkey` MUST correspond to a validator whose withdrawal credentials are proven to point at the pod (`VALIDATOR_STATUS.ACTIVE`)
* If excess `msg.value` was provided, the transfer of the excess back to `msg.sender` MUST succeed.

---

### Other Methods

Minor methods that do not fit well into other sections:
* [`setProofSubmitter`](#setproofsubmitter)
* [`stake`](#stake)
* [`withdrawRestakedBeaconChainETH`](#withdrawrestakedbeaconchaineth)
* [`recoverTokens`](#recovertokens)

#### `setProofSubmitter`

```solidity
function setProofSubmitter(address newProofSubmitter) external onlyEigenPodOwner
```

Allows the Pod Owner to update the Proof Submitter address for the `EigenPod`. The Proof Submitter is a secondary address that can call various validator and proof-related `EigenPod` methods, but has no permissions outside of the `EigenPod` contract (e.g. this address cannot manage delegation or queue withdrawals via the `DelegationManager`). 

This method/role is intended to allow the Pod Owner to create a hot wallet to perform validator and proof-related tasks without exposing access to funds.

If set, EITHER the Pod Owner OR Proof Submitter may call:
* `verifyWithdrawalCredentials`
* `startCheckpoint`
* `requestConsolidation`
* `requestWithdrawal`

The Pod Owner can call this with `newProofSubmitter == 0` to remove the current Proof Submitter. If there is no designated Proof Submitter, ONLY the Pod Owner can call the above methods.

*Effects*:
* Updates `proofSubmitter` to `newProofSubmitter`

*Requirements*:
* Caller MUST be the Pod Owner

#### `stake`

```solidity
function stake(
    bytes calldata pubkey,
    bytes calldata signature,
    bytes32 depositDataRoot
)
    external 
    payable 
    onlyEigenPodManager
```

Handles the call to the beacon chain deposit contract. Only called via `EigenPodManager.stake`.

Note that this method only supports deposits to 0x01 withdrawal credentials. For 0x02 credentials, pod owners should interact with the deposit contract directly.

*Effects*:
* Deposits 32 ETH into the beacon chain deposit contract, and provides the pod's address as the deposit's withdrawal credentials

*Requirements*:
* Caller MUST be the `EigenPodManager`
* Call value MUST be 32 ETH
* Deposit contract `deposit` method MUST succeed given the provided `pubkey`, `signature`, and `depositDataRoot`

#### `withdrawRestakedBeaconChainETH`

```solidity
function withdrawRestakedBeaconChainETH(
    address recipient, 
    uint256 amountWei
)
    external 
    onlyEigenPodManager
```

The `EigenPodManager` calls this method when withdrawing a Pod Owner's shares as tokens (native ETH). The input `amountWei` is converted to Gwei and subtracted from `withdrawableRestakedExecutionLayerGwei`, which tracks native ETH balance that has been accounted for in a checkpoint (see [Checkpointing Validators](#checkpointing-validators)).

If the `EigenPod` does not have `amountWei` available to transfer, this method will revert.

Note that if `amountWei` is not a whole gwei amount, the sub-gwei portion is truncated and may not be recoverable.

*Effects*:
* Decreases the pod's `withdrawableRestakedExecutionLayerGwei` by `amountWei / GWEI_TO_WEI`
* Converts `amountWei` to gwei, then sends that amount to `recipient`

*Requirements*:
* `amountWei / GWEI_TO_WEI` MUST NOT be greater than the proven `withdrawableRestakedExecutionLayerGwei`
* Pod MUST have at least `amountWei` ETH balance
* `recipient` MUST NOT revert when transferred `amountWei`

#### `recoverTokens`

```solidity
function recoverTokens(
    IERC20[] memory tokenList,
    uint256[] memory amountsToWithdraw,
    address recipient
) 
    external 
    onlyEigenPodOwner 
    onlyWhenNotPaused(PAUSED_NON_PROOF_WITHDRAWALS)
```

Allows the Pod Owner to rescue ERC20 tokens accidentally sent to the `EigenPod`.

*Effects:*
* Calls `transfer` on each of the ERC20's in `tokenList`, sending the corresponding `amountsToWithdraw` to the `recipient`

*Requirements:*
* Caller MUST be the Pod Owner
* Pause status MUST NOT be set: `PAUSED_NON_PROOF_WITHDRAWALS`
* `tokenList` and `amountsToWithdraw` MUST have equal lengths
````

## File: docs/core/EigenPodManager.md
````markdown
## EigenPodManager

| File | Notes |
| -------- | -------- |
| [`EigenPodManager.sol`](../../src/contracts/pods/EigenPodManager.sol) | |
| [`EigenPodManagerStorage.sol`](../../src/contracts/pods/EigenPodManagerStorage.sol) | state variables |
| [`IEigenPodManager.sol`](../../src/contracts/interfaces/IEigenPodManager.sol) | interface |

Libraries and Mixins:
| File | Notes |
| -------- | -------- |
| [`EigenPodPausingConstants.sol`](../../src/contracts/pods/EigenPodPausingConstants.sol) | pause values for `EigenPod/EigenPodManager` methods |

## Prior Reading

* [Shares Accounting](./accounting/SharesAccounting.md), especially [_Handling Beacon Chain Balance Decreases in EigenPods_](./accounting/SharesAccounting.md#handling-beacon-chain-balance-decreases-in-eigenpods)

## Overview

The `EigenPodManager` manages the "beacon chain ETH strategy", a virtual strategy that stakers can hold delegatable shares in, similar to the strategies managed by the `StrategyManager`. Whereas the `StrategyManager's` strategy shares are backed by deposited ERC20 tokens, beacon chain ETH strategy shares are backed either by beacon chain validators or native ETH attributed to `EigenPods`.

The `EigenPodManager` allows any staker to deploy an `EigenPod`. `EigenPods` contains beacon chain state proof logic that enable a staker to point either/both a validator's _withdrawal credentials_ and/or _fee recipient_ addresses to their pod. After submitting beacon chain state proofs to their pod, the staker is awarded deposit shares in the beacon chain ETH strategy, which are then delegated to their operator in the `DelegationManager` (if applicable). For more details, see [`EigenPod.md`](./EigenPod.md).

As an `EigenPod` receives balance updates, they are forwarded to the `EigenPodManager`. Balance increases resulting from validator activity on the beacon chain or ETH received in the `EigenPod` will result in an increase in the staker's _deposit shares_ for the beacon chain ETH strategy.

Balance decreases resulting from validator inactivity or beacon chain slashing do NOT decrease the staker's deposit shares. Instead, they result in a _decrease_ to the staker's _beacon chain slashing factor_. Among other factors, the `DelegationManager` uses the beacon chain slashing factor when determining:
* How many of a staker's _deposit shares_ can actually be withdrawn
* How many of a staker's _deposit shares_ can be delegated to an operator

Note that the number of _withdrawable shares_ a staker's _deposit shares_ represent can be queried using `DelegationManager.getWithdrawableShares(staker, strategies)`.

The `EigenPodManager's` responsibilities can be broken down into the following concepts:
* [Depositing Into EigenLayer](#depositing-into-eigenlayer)
* [Withdrawal Processing](#withdrawal-processing)
* [Other Methods](#other-methods)

## Parameterization

* `beaconChainETHStrategy = 0xbeaC0eeEeeeeEEeEeEEEEeeEEeEeeeEeeEEBEaC0`
    * A virtual strategy used to represent beacon chain ETH internally. The `DelegationManager` uses this address to denote the beacon chain ETH strategy managed by the `EigenPodManager`. However, it does not correspond to an actual contract!
* `ethPOS = 0x00000000219ab540356cBB839Cbe05303d7705Fa`
    * The address of the beacon chain deposit contract
* `beaconProxyBytecode` (defined in `EigenPodManagerStorage.sol`)
    * `EigenPods` are deployed using a beacon proxy. This bytecode is a constant, containing the _creation bytecode_ calculated by compiling [OpenZeppelin's `BeaconProxy` contract at version 4.7.1](https://github.com/OpenZeppelin/openzeppelin-contracts/blob/v4.7.1/contracts/proxy/beacon/BeaconProxy.sol). Compilation used solc version `0.8.12`, optimization enabled, 200 runs. Example verified contract [here](https://etherscan.io/address/0xA6f93249580EC3F08016cD3d4154AADD70aC3C96#code).

---

## Depositing Into EigenLayer

Before a staker begins restaking beacon chain ETH, they need to deploy an `EigenPod`, stake, and start a beacon chain validator:
* [`createPod`](#createpod)
* [`stake`](#stake)

#### `createPod`

```solidity
/**
 * @notice Creates an EigenPod for the sender.
 * @dev Function will revert if the `msg.sender` already has an EigenPod.
 * @dev Returns EigenPod address
 */
function createPod()
    external
    onlyWhenNotPaused(PAUSED_NEW_EIGENPODS)
    returns (address)
```

Allows a staker to deploy an `EigenPod` instance, if they have not done so already.

Each staker can only deploy a single `EigenPod` instance, but a single `EigenPod` can serve as the fee recipient / withdrawal credentials for any number of beacon chain validators. Each `EigenPod` is created using Create2 and the beacon proxy pattern, using the staker's address as the Create2 salt.

As part of the `EigenPod` deployment process, the staker is made the Pod Owner, a permissioned role within the `EigenPod`.

*Effects*:
* Create2 deploys `EigenPodManager.beaconProxyBytecode`, appending the `eigenPodBeacon` address as a constructor argument. `bytes32(msg.sender)` is used as the salt.
    * `address eigenPodBeacon` is an [OpenZeppelin v4.7.1 `UpgradableBeacon`](https://github.com/OpenZeppelin/openzeppelin-contracts/blob/v4.7.1/contracts/proxy/beacon/UpgradeableBeacon.sol), whose implementation address points to the current `EigenPod` implementation
    * `beaconProxyBytecode` is the constructor code for an [OpenZeppelin v4.7.1 `BeaconProxy`](https://github.com/OpenZeppelin/openzeppelin-contracts/blob/v4.7.1/contracts/proxy/beacon/BeaconProxy.sol)
* `EigenPod.initialize(msg.sender)`: initializes the pod, setting the caller as the Pod Owner and activating restaking for any validators pointed at the pod.
* Maps the new pod to the Pod Owner (each address can only deploy a single `EigenPod`)

*Requirements*:
* Caller MUST NOT have deployed an `EigenPod` already
* Pause status MUST NOT be set: `PAUSED_NEW_EIGENPODS`

#### `stake`

```solidity
/**
 * @notice Stakes for a new beacon chain validator on the sender's EigenPod.
 * Also creates an EigenPod for the sender if they don't have one already.
 * @param pubkey The 48 bytes public key of the beacon chain validator.
 * @param signature The validator's signature of the deposit data.
 * @param depositDataRoot The root/hash of the deposit data for the validator's deposit.
 */
function stake(
    bytes calldata pubkey,
    bytes calldata signature,
    bytes32 depositDataRoot
)
    external
    payable
    onlyWhenNotPaused(PAUSED_NEW_EIGENPODS)
```

Allows a staker to deposit 32 ETH into the beacon chain deposit contract, providing the credentials for the staker's beacon chain validator. The `EigenPod.stake` method is called, which automatically calculates the correct withdrawal credentials for the pod and passes these to the deposit contract along with the 32 ETH.

*Effects*:
* Deploys and initializes an `EigenPod` on behalf of staker, if this has not been done already
* See [`EigenPod.stake`](./EigenPod.md#stake)

*Requirements*:
* Pause status MUST NOT be set: `PAUSED_NEW_EIGENPODS`
* See [`EigenPod.stake`](./EigenPod.md#stake)

---

## Withdrawal Processing

These methods are callable ONLY by the DelegationManager, and are used when processing undelegations and withdrawals.

**Concepts**:
* [Shares Accounting - Handling Beacon Chain Balance Decreases](./accounting/SharesAccounting.md#handling-beacon-chain-balance-decreases-in-eigenpods)
* [Deposit Shares and Beacon Chain Slashing](#deposit-shares-and-beacon-chain-slashing)

**Methods**:
* [`removeDepositShares`](#removeDepositShares)
* [`addShares`](#addshares)
* [`withdrawSharesAsTokens`](#withdrawsharesastokens)

#### Deposit Shares and Beacon Chain Slashing

The `EigenPodManager` tracks a staker's _deposit shares_ and _beacon chain slashing factor_ using the following state variables:

```solidity
/**
 * @notice mapping from pod owner to the deposit shares they have in the virtual beacon chain ETH strategy
 * 
 * @dev When an EigenPod registers a balance increase, deposit shares are increased. When registering a balance
 * decrease, however, deposit shares are NOT decreased. Instead, the pod owner's beacon chain slashing factor
 * is decreased proportional to the balance decrease. This impacts the number of shares that will be withdrawn
 * when the deposit shares are queued for withdrawal in the DelegationManager.
 * 
 * Note that prior to the slashing release, deposit shares were decreased when balance decreases occurred.
 * In certain cases, a combination of queueing a withdrawal plus registering a balance decrease could result
 * in a staker having negative deposit shares in this mapping. This negative value would be corrected when the
 * staker completes a withdrawal (as tokens or as shares).
 *
 * With the slashing release, negative shares are no longer possible. However, a staker can still have negative
 * shares if they met the conditions for them before the slashing release. If this is the case, that staker
 * should complete any outstanding queued withdrawal in the DelegationManager ("as shares"). This will correct
 * the negative share count and allow the staker to continue using their pod as normal.
 */
mapping(address podOwner => int256 shares) public podOwnerDepositShares;

/**
 * @notice The amount of beacon chain slashing experienced by a pod owner as a proportion of WAD
 * @param isSet whether the slashingFactor has ever been updated. Used to distinguish between
 * a value of "0" and an uninitialized value.
 * @param slashingFactor the proportion of the pod owner's balance that has been decreased due to
 * slashing or other beacon chain balance decreases.
 * @dev NOTE: if !isSet, `slashingFactor` should be treated as WAD. `slashingFactor` is monotonically
 * decreasing and can hit 0 if fully slashed.
 */
struct BeaconChainSlashingFactor {
    bool isSet;
    uint64 slashingFactor;
}

/// @notice Returns the slashing factor applied to the `staker` for the `beaconChainETHStrategy`
/// Note: this value starts at 1 WAD (1e18) for all stakers, and is updated when a staker's pod registers
/// a balance decrease.
mapping(address staker => BeaconChainSlashingFactor) internal _beaconChainSlashingFactor;
```

#### `removeDepositShares`

```solidity
/**
 * @notice Used by the DelegationManager to remove a pod owner's deposit shares when they enter the withdrawal queue.
 * Simply decreases the `podOwner`'s shares by `shares`, down to a minimum of zero.
 * @dev This function reverts if it would result in `podOwnerDepositShares[podOwner]` being less than zero, i.e. it is forbidden for this function to
 * result in the `podOwner` incurring a "share deficit". This behavior prevents a Staker from queuing a withdrawal which improperly removes excessive
 * shares from the operator to whom the staker is delegated.
 * @dev The delegation manager validates that the podOwner is not address(0)
 */
function removeDepositShares(
    address podOwner,
    IStrategy strategy,
    uint256 depositSharesToRemove
)
    external
    onlyDelegationManager
```

The `DelegationManager` calls this method when a staker queues a withdrawal (or undelegates, which also queues a withdrawal). The shares are removed while the withdrawal is in the queue, and when the queue completes, the shares will either be re-awarded or withdrawn as tokens (`addShares` and `withdrawSharesAsTokens`, respectively).

The staker's share balance is decreased by `depositSharesToRemove`.

This method is not allowed to cause the `staker's` balance to go negative. This prevents a staker from queueing a withdrawal for more shares than they have (or more shares than they delegated to an operator).

Note that the amount of deposit shares removed while in the withdrawal queue may not equal the amount credited when the withdrawal is completed. The staker may receive fewer if slashing occurred; see [`DelegationManager.md`](./DelegationManager.md) for details.

*Effects*:
* Removes `depositSharesToRemove` from `podOwner` share balance in `podOwnerDepositShares`
* Emits a `NewTotalShares` event

*Requirements*:
* Caller MUST be the `DelegationManager`
* `strategy` MUST be `beaconChainETHStrategy`
* `staker` MUST NOT be zero
* `depositSharesToRemove` MUST be less than `staker` share balance in `podOwnerDepositShares`

#### `addShares`

```solidity
/**
 * @notice Increases the `podOwner`'s shares by `shares`, paying off negative shares if needed.
 * Used by the DelegationManager to award a pod owner shares on exiting the withdrawal queue
 * @return existingDepositShares the pod owner's shares prior to any additions. Returns 0 if negative
 * @return addedShares the number of shares added to the staker's balance above 0. This means that if,
 * after shares are added, the staker's balance is non-positive, this will return 0.
 */
function addShares(
    address staker,
    IStrategy strategy,
    uint256 shares
)
    external
    onlyDelegationManager
    returns (uint256, uint256)
```

The `DelegationManager` calls this method when a queued withdrawal is completed and the withdrawer specifies that they want to receive the withdrawal "as shares" (rather than as the underlying tokens). A staker might want to do this in order to change their delegated operator without needing to fully exit their validators.

This method credits the input deposit shares to the staker. In most cases, the input `shares` equal the same shares originally removed when the withdrawal was queued. However, if the staker's operator was slashed (or the staker experienced beacon chain slashing), they may receive less. See [`DelegationManager.md`](./DelegationManager.md) for details.

If the staker has a share deficit (negative shares), the deficit is repaid out of the added `shares`. If the Pod Owner's positive share count increases, this change is returned to the `DelegationManager` to be delegated to the staker's operator (if they have one).

*Effects*:
* Increases `staker`'s deposit share balance in `podOwnerDepositShares` by `shares`

*Requirements*:
* Caller MUST be the `DelegationManager`
* `strategy` MUST be `beaconChainETHStrategy`
* `staker` MUST NOT be `address(0)`
* `shares` MUST NOT be negative when converted to an `int256`
* Emits `PodSharesUpdated` and `NewTotalShares` events

#### `withdrawSharesAsTokens`

```solidity
/**
 * @notice Used by the DelegationManager to complete a withdrawal, sending tokens to the pod owner
 * @dev Prioritizes decreasing the podOwner's share deficit, if they have one
 * @dev This function assumes that `removeShares` has already been called by the delegationManager, hence why
 *      we do not need to update the podOwnerDepositShares if `currentpodOwnerDepositShares` is positive
 */
function withdrawSharesAsTokens(
    address podOwner,
    IStrategy strategy,
    IERC20,
    uint256 shares
)
    external
    onlyDelegationManager
```

The `DelegationManager` calls this method when a queued withdrawal is completed and the withdrawer specifies that they want to receive the withdrawal as the tokens underlying the shares. This can be used to "fully exit" some amount of native ETH and send it to the pod owner (via `EigenPod.withdrawRestakedBeaconChainETH`).

Note that because this method entails withdrawing and sending native ETH, two conditions must be met for this method to succeed: (i) the ETH being withdrawn should already be in the `EigenPod`, and (ii) the amount being withdrawn should be accounted for in `EigenPod.withdrawableExecutionLayerGwei`. This latter condition can be achieved by completing an `EigenPod` checkpoint just prior to completing a queued `DelegationManager` withdrawal (see [EigenPod: Checkpointing Validators](./EigenPod.md#checkpointing-validators) for details).

Also note that, like `addShares`, if the original Pod Owner has a share deficit (negative shares), the deficit is repaid out of the withdrawn `shares` before any native ETH is withdrawn.

*Effects*:
* If `staker`'s share balance in `podOwnerDepositShares` is negative (i.e. the staker has a *deficit*):
    * If `shares` is greater than the current deficit:
        * Sets `staker` balance in `podOwnerDepositShares` to 0
        * Subtracts `|deficit|` from `shares` and converts remaining shares 1:1 to ETH (see [`EigenPod.withdrawRestakedBeaconChainETH`](./EigenPod.md#withdrawrestakedbeaconchaineth))
    * If `shares` is less than or equal to the current deficit:
        * Increases `staker` negative balance in `podOwnerDepositShares` by `shares`, bringing it closer to 0
        * Does *not* withdraw any shares
* Emits `PodSharesUpdated` and `NewTotalShares` events

*Requirements*:
* Caller MUST be the `DelegationManager`
* `strategy` MUST be `beaconChainETHStrategy`
* `staker` MUST NOT be `address(0)`
* `shares` MUST NOT be negative when converted to an `int256`
* See [`EigenPod.withdrawRestakedBeaconChainETH`](./EigenPod.md#withdrawrestakedbeaconchaineth)

---

## Other Methods

**Methods**:
* [`recordBeaconChainETHBalanceUpdate`](#recordbeaconchainethbalanceupdate)
* [`increaseBurnOrRedistributableShares`](#increaseburnorredistributableshares)

#### `recordBeaconChainETHBalanceUpdate`

```solidity
/**
 * @notice Adds any positive share delta to the pod owner's deposit shares, and delegates them to the pod
 * owner's operator (if applicable). A negative share delta does NOT impact the pod owner's deposit shares,
 * but will reduce their beacon chain slashing factor and delegated shares accordingly.
 * @param podOwner is the pod owner whose balance is being updated.
 * @param prevRestakedBalanceWei is the total amount restaked through the pod before the balance update, including
 * any amount currently in the withdrawal queue.
 * @param balanceDeltaWei is the amount the balance changed
 * @dev Callable only by the podOwner's EigenPod contract.
 * @dev Reverts if `sharesDelta` is not a whole Gwei amount
 */
function recordBeaconChainETHBalanceUpdate(
    address podOwner,
    uint256 prevRestakedBalanceWei,
    int256 balanceDeltaWei
)
    external
    onlyEigenPod(podOwner)
    nonReentrant
```

This method is called by an `EigenPod` to report a change in its pod owner's shares. It accepts a positive or negative `balanceDeltaWei`. A positive delta is added to the pod owner's _deposit shares,_ and delegated to their operator if applicable. A negative delta is NOT removed from the pod owner's deposit shares. Instead, the proportion of the balance decrease is used to update the pod owner's beacon chain slashing factor and decrease the number of shares delegated to their operator (if applicable). A zero delta results in no change. 

**Note** that prior to the slashing release, negative balance deltas subtracted from the pod owner's shares, and could, in certain cases, result in a negative share balance. As of the slashing release, negative balance deltas no longer subtract from share balances, updating the beacon chain slashing factor instead. 

If a staker has negative shares as of the slashing release, this method will REVERT, preventing any further balance updates from their pod while the negative share balance persists. In order to fix this and restore the use of their pod, the staker should complete any outstanding withdrawals in the `DelegationManager` "as shares," which will correct the share deficit.

*Effects*:
* If `balanceDeltaWei` is zero, do nothing
* If `balanceDeltaWei` is positive:
  * Adds `shares` to `podOwnerDepositShares` for `podOwner`
  * Emits `PodSharesUpdated` and `NewTotalShares` events
  * Calls [`DelegationManager.increaseDelegatedShares`](./DelegationManager.md#increasedelegatedshares)
* If `balanceDeltaWei` is negative:
  * Reduces slashing factor proportional to relative balance decrease
  * Emits `BeaconChainSlashingFactorDecreased` event
  * Calls [`DelegationManager.decreaseDelegatedShares`](./DelegationManager.md#decreasedelegatedshares)

*Requirements*:
* Caller MUST be the `EigenPod` associated with the passed-in `podOwner`
* `podOwner` MUST NOT be `address(0)`
* `balanceDeltaWei` MUST be a whole Gwei amount
* Legacy withdrawals MUST be complete (i.e. `currentDepositShares >= 0`)

#### `increaseBurnOrRedistributableShares`

```solidity
/**
 * @notice Increase the amount of burnable/redistributable shares for a given Strategy. This is called by the DelegationManager
 * when an operator is slashed in EigenLayer.
 * @param operatorSet The operator set to burn shares in.
 * @param slashId The slash id to burn shares in.
 * @param strategy The strategy to burn shares in.
 * @param addedSharesToBurn The amount of added shares to burn.
 * @dev This function is only called by the DelegationManager when an operator is slashed.
 */
function increaseBurnOrRedistributableShares(
    OperatorSet calldata operatorSet,
    uint256 slashId,
    IStrategy strategy,
    uint256 addedSharesToBurn
) external onlyDelegationManager;
```

The `DelegationManager` calls this method when an operator is slashed, calculating the number of slashable shares and marking them for burning here.

Unlike in the `StrategyManager`, there is no current mechanism to burn these shares, as burning requires the Pectra hard fork to be able to eject validators. This will be added in a future update.

We also do not distinguish burnable shares on a per operatorSet/slashId basis, like the `StrategyManager` does. 

*Effects*:
* Increases `burnableShares` for the beacon chain ETH strategy by `addedSharesToBurn`

*Requirements*:
* Can only be called by the `DelegationManager`
````

## File: docs/core/ProtocolRegistry.md
````markdown
# ProtocolRegistry

| File | Notes |
| --- | --- |
| [`ProtocolRegistry.sol`](../../src/contracts/core/ProtocolRegistry.sol) | core logic |
| [`ProtocolRegistryStorage.sol`](../../src/contracts/core/storage/ProtocolRegistryStorage.sol) | state variables |
| [`IProtocolRegistry.sol`](../../src/contracts/interfaces/IProtocolRegistry.sol) | interface, events, and types |

Libraries and Mixins:

| File | Notes |
| --- | --- |
| [`AccessControlEnumerableUpgradeable`](https://docs.openzeppelin.com/contracts/5.x/api/access#AccessControlEnumerableUpgradeable) | role-based access control |
| [`Initializable`](https://docs.openzeppelin.com/contracts/5.x/api/proxy#Initializable) | protects initializer |
| [`ShortStringsUpgradeable`](https://docs.openzeppelin.com/contracts/5.x/api/utils#ShortStringsUpgradeable) | compact semantic version storage |
| [`EnumerableMap`](https://docs.openzeppelin.com/contracts/5.x/api/utils#EnumerableMap) | iterable mapping for deployment catalog |
| [`IPausable`](../../src/contracts/interfaces/IPausable.sol) | pause hook invoked during emergencies |

## Overview

`ProtocolRegistry` is the canonical catalog of EigenLayer protocol deployments. It maps human-readable deployment names to contract addresses, tracks per-contract configuration flags, emits semantic-version updates every time a new protocol shipment occurs, and exposes functionality to pause the the entire core protocol. This contract is deployed on all EigenLayer source and destination chains.

### Roles and Permissions

* `DEFAULT_ADMIN_ROLE`: Full control, required for `initialize`, `ship`, and `configure`.
* `PAUSER_ROLE`: Defined as `hex"01"` in storage. Addresses with this role can invoke `pauseAll()`.

### Deployment Config Structure

```solidity
struct DeploymentConfig {
    bool pausable;   // deployment supports IPausable.pauseAll()
    bool deprecated; // deployment should no longer be interacted with
}
```

* `pausable` gates whether `pauseAll()` targets the deployment.
* `deprecated` prevents new pauses from being attempted against sunset contracts.

---

## Write Functions

### `initialize`

```solidity
function initialize(address initialAdmin, address pauserMultisig) external initializer
```

Initializes the proxy once by granting:

* `DEFAULT_ADMIN_ROLE` to `initialAdmin`.
* `PAUSER_ROLE` to `pauserMultisig`.

The constructor disables further initializers; therefore `initialize` must be called exactly once after deployment. Upon deployment the `executorMultisig` will be the default admin and the `pauserMultisig` will hold the `PAUSER_ROLE`.

### `ship`

```solidity
function ship(
    address[] calldata addresses,
    DeploymentConfig[] calldata configs,
    string[] calldata names,
    string calldata semanticVersion
) external onlyRole(DEFAULT_ADMIN_ROLE)
```

Ships a new semantic version and batch-registers deployments:

*Effects*:
* Calls `_updateSemanticVersion(semanticVersion)` and emits `SemanticVersionUpdated`.
* For each address to ship:
    * Calls `_appendDeployment`, which stores the name→address mapping, records the config, and emits `DeploymentShipped`.

*Requirements*:
* Caller must hold `DEFAULT_ADMIN_ROLE`.
* `addresses`, `configs`, and `names` must have equal length.
* For each address to ship: 
    * Address must be non-zero
    * Contract names must be non-empty strings.

In practice, for upgrades that do not deploy net new contracts, only the `semanticVersion` parameter will be populated, with the rest left empty.

A contract name may be passed to this function repeatedly; each time, the previous address mapping for that name is overwritten with the new one. In general, this should be uncommon, as changing a core contract's address is an exceptional event.

### `configure`

```solidity
function configure(string calldata name, DeploymentConfig calldata config) external onlyRole(DEFAULT_ADMIN_ROLE)
```

Updates the stored `DeploymentConfig` for a single deployment:

*Effects*:
* Looks up the address for `name` from `_deployments`.
* Overwrites `_deploymentConfigs[addr]` with the supplied configuration.
* Emits `DeploymentConfigured(addr, config)`.

*Requirements*:
* Caller must hold `DEFAULT_ADMIN_ROLE`.
* `name` must have been previously shipped.

### `pauseAll`

```solidity
function pauseAll() external onlyRole(PAUSER_ROLE)
```

Triggers emergency pausing across all tracked deployments:

*Effects*:
* Iterates over `_deployments`, invoking `IPausable(addr).pauseAll()` on every entry marked `pausable` and not `deprecated`.
* Silently skips deployments that fail the interface call (propagates no revert) to maximize coverage in emergencies.

*Requirements*:
* Caller must hold `PAUSER_ROLE`.
* Deployments targeted must implement `IPausable`; registry does not enforce this at compile time, so operators should ensure configs reflect actual contract capabilities.

Intended for crisis response (e.g., discovered exploit) where pauser multisig needs to freeze protocol components rapidly.

---

## View Functions

### `version`

Returns the full semantic version string (e.g., `"1.9.0"`) by decoding `_semanticVersion`.

### `majorVersion`

Extracts and returns only the major component (characters before the first dot) of the semantic version.

### `getAddress`

Resolves a deployment name to its registered address. Useful for on-chain lookups by other contracts that only need the address.

### `getDeployment`

Returns both the address and `DeploymentConfig` for a given name. Preferred by off-chain services that need to inspect configuration flags alongside the address.

### `getAllDeployments`

Materializes the entire registry into parallel arrays of names, addresses, and configs. Primarily intended for off-chain introspection.

### `totalDeployments`

Returns the length of `_deployments`, which doubles as the number of rows the registry will iterate over during `pauseAll()`.
````

## File: docs/core/ReleaseManager.md
````markdown
# ReleaseManager

| File | Notes |
| -------- | -------- |
| [`ReleaseManager.sol`](../../src/contracts/core/ReleaseManager.sol) |  |
| [`ReleaseManagerStorage.sol`](../../src/contracts/core/ReleaseManagerStorage.sol) | state variables |
| [`IReleaseManager.sol`](../../src/contracts/interfaces/IReleaseManager.sol) | interface |

Libraries and Mixins:

| File | Notes |
| -------- | -------- |
| [`PermissionControllerMixin.sol`](../../src/contracts/mixins/PermissionControllerMixin.sol) | account delegation |
| [`OperatorSetLib.sol`](../../src/contracts/libraries/OperatorSetLib.sol) | encode/decode operator sets |

## Overview

The `ReleaseManager` manages software releases for AVS operator sets. It provides a standardized way for AVSs to publish software artifacts (binaries, docker images, etc.) that operators in their operator sets should upgrade to by specified deadlines. This ensures operators run compatible and up-to-date software versions required by the AVS.

The `ReleaseManager's` responsibilities include:

* **Release Publishing**: AVSs can publish new releases containing one or more software artifacts for their operator sets.
* **Upgrade Deadlines**: Each release specifies a deadline by which operators must upgrade.
* **Release Tracking**: Maintains a history of all releases for each operator set.
* **Release Queries**: Provides view functions to query release information.

An AVS in the context of `ReleaseManager` is defined as the `address` of the contract that implements the AVS logic. For `PermissionController` purposes, this AVS address is also the AVS [account](https://github.com/Layr-Labs/eigenlayer-contracts/blob/dev/docs/permissions/PermissionController.md#accounts).

### Important Notes on Release Management

* **Latest Release Validity**: Only the latest release for an operator set is considered valid. Previous releases become obsolete as soon as a new release is published.
* **Upgrade Deadlines**: The `upgradeByTime` timestamp (in Unix time) is a suggested deadline and is not enforced on-chain or off-chain. It serves as a communication mechanism for AVSs to indicate when operators should complete their upgrades.
* **Instant Upgrades**: When `upgradeByTime` is set to 0, this signals an instant upgrade requirement.
* **Multiple Releases in Same Block**: If multiple releases are published in the same block with the same `upgradeByTime`, the last transaction processed in that block will determine the latest valid release.

---

## Releases

A release represents a collection of software artifacts that operators in an operator set must run. Each release is associated with a specific operator set and contains:

* **Artifacts**: An array of software artifacts, each with a digest (hash) and registry URL
* **Upgrade By Time**: A Unix timestamp by which operators should complete the upgrade

The release structure is defined as:

```solidity
/**
 * @notice Represents a software artifact with its digest and registry URL.
 * @param digest The hash digest of the artifact.
 * @param registryUrl The URL where the artifact can be found.
 */
struct Artifact {
    bytes32 digest;
    string registryUrl;
}

/**
 * @notice Represents a release containing multiple artifacts and an upgrade deadline.
 * @param artifacts Array of artifacts included in this release.
 * @param upgradeByTime Timestamp by which operators must upgrade to this release. 
 *                      A value of 0 signals an instant upgrade requirement.
 */
struct Release {
    Artifact[] artifacts;
    uint32 upgradeByTime;
}
```

**State Management:**

```solidity
/// @dev Mapping from operator set key to array of releases for that operator set
mapping(bytes32 operatorSetKey => Release[]) internal _operatorSetReleases;
```

**Methods:**
* [`publishRelease`](#publishrelease)
* [`getTotalReleases`](#gettotalreleases)
* [`getRelease`](#getrelease)
* [`getLatestRelease`](#getlatestrelease)
* [`getLatestUpgradeByTime`](#getlatestupgradebytime)
* [`isValidRelease`](#isValidRelease)

---

### Write Functions

#### `publishRelease`

```solidity
/**
 * @notice Publishes a new release for an operator set.
 * @dev If the upgradeByTime is 0, the release is meant to signal an instant upgrade.
 * @param operatorSet The operator set this release is for.
 * @param release The release that was published.
 * @return releaseId The index of the newly published release.
 */
function publishRelease(
    OperatorSet calldata operatorSet,
    Release calldata release
) 
    external 
    checkCanCall(operatorSet.avs) 
    returns (uint256 releaseId)
```

_Note: this method can be called directly by an AVS, or by a caller authorized by the AVS. See [`PermissionController.md`](../permissions/PermissionController.md) for details._

AVSs use this method to publish new software releases for their operator sets. Each release contains one or more artifacts that represent the software components operators must run (e.g., validator clients, network monitors, etc.). The AVS specifies a deadline (`upgradeByTime`) by which all operators in the operator set must upgrade to the new release.

**Special Case - Instant Upgrades**: Setting `upgradeByTime` to 0 signals that this is an instant upgrade that operators should apply immediately. This is typically used for critical security patches or emergency updates.

The `releaseId` returned is the zero-based index of the release in the operator set's release array. This ID can be used to query the release later using [`getRelease`](#getrelease).

*Effects*:
* Appends the release to `_operatorSetReleases[operatorSet.key()]`
* The new release is assigned a `releaseId` equal to the previous array length
* All artifact information (digest and registryUrl) is copied to storage
* Emits a `ReleasePublished` event with the operator set, release ID, and release details

*Requirements*:
* Caller MUST be authorized, either as the AVS itself or an admin/appointee (see [`PermissionController.md`](../permissions/PermissionController.md))
* Operator set MUST have published metadata URI via `updateOperatorSetMetadataURI`
* `release.upgradeByTime` MUST be either 0 (instant upgrade) or greater than or equal to the current block timestamp
---

### View Functions

#### `getTotalReleases`

```solidity
/**
 * @notice Returns the total number of releases for an operator set.
 * @param operatorSet The operator set to query.
 * @return The number of releases.
 */
function getTotalReleases(
    OperatorSet memory operatorSet
) 
    public 
    view 
    returns (uint256)
```

Returns the total number of releases that have been published for the specified operator set. This can be used to iterate through all releases or to determine if any releases exist.

*Returns*:
* The length of the releases array for the given operator set
* Returns 0 if no releases have been published

#### `getRelease`

```solidity
/**
 * @notice Returns a specific release by index.
 * @dev If the upgradeByTime is 0, the release is meant to signal an instant upgrade.
 * @param operatorSet The operator set to query.
 * @param releaseId The id of the release to get.
 * @return The release at the specified index.
 */
function getRelease(
    OperatorSet memory operatorSet, 
    uint256 releaseId
) 
    external 
    view 
    returns (Release memory)
```

Retrieves a specific release by its ID for a given operator set. The `releaseId` is the zero-based index of the release in the operator set's release history.

*Returns*:
* The complete `Release` struct including all artifacts and the upgrade deadline
* If `upgradeByTime` is 0, this indicates an instant upgrade requirement
* Reverts if `releaseId` is out of bounds

#### `getLatestRelease`

```solidity
/**
 * @notice Returns the latest release for an operator set.
 * @dev If the upgradeByTime is 0, the release is meant to signal an instant upgrade.
 * @param operatorSet The operator set to query.
 * @return The id of the latest release.
 * @return The latest release.
 */
function getLatestRelease(
    OperatorSet memory operatorSet
) 
    public 
    view 
    returns (uint256, Release memory)
```

Retrieves the most recently published release for an operator set. This is typically the release that operators should be running or upgrading to.

*Returns*:
* The release ID and the latest `Release` struct from the operator set's release array
* If `upgradeByTime` is 0, this indicates an instant upgrade requirement
* Reverts with `NoReleases()` if no releases have been published for the operator set

#### `getLatestUpgradeByTime`

```solidity
/**
 * @notice Returns the upgrade by time for the latest release.
 * @dev If the upgradeByTime is 0, the release is meant to signal an instant upgrade.
 * @param operatorSet The operator set to query.
 * @return The upgrade by time for the latest release.
 */
function getLatestUpgradeByTime(
    OperatorSet memory operatorSet
) 
    external 
    view 
    returns (uint32)
```

A convenience function that returns just the upgrade deadline from the latest release. This can be useful for quickly checking when operators must complete their upgrades.

*Returns*:
* The `upgradeByTime` timestamp from the latest release
* A value of 0 indicates an instant upgrade requirement
* Reverts with `NoReleases()` if no releases have been published for the operator set

#### `isValidRelease`

```solidity
/**
 * @notice Returns true if the release is the latest release, false otherwise.
 * @param operatorSet The operator set to query.
 * @param releaseId The id of the release to check.
 * @return True if the release is the latest release, false otherwise.
 */
function isValidRelease(
    OperatorSet memory operatorSet, 
    uint256 releaseId
) 
    external 
    view 
    returns (bool)
```

Checks whether a given release ID corresponds to the latest release for an operator set. This can be useful for operators to verify they are running the most current software version.

**Note**: Only the latest release is considered valid. All previous releases are considered obsolete and should not be used by operators.

*Returns*:
* `true` if the `releaseId` matches the latest release index
* `false` if the `releaseId` refers to an older release
* Reverts with `NoReleases()` if the operator set has no releases

---

## Error Definitions

The `ReleaseManager` defines the following custom errors:

* `MustPublishMetadataURI()`: Thrown when attempting to publish a release for an operator set that hasn't published its metadata URI via `updateOperatorSetMetadataURI`.
* `InvalidUpgradeByTime()`: Thrown when the `upgradeByTime` is in the past (not including 0, which is valid for instant upgrades).
* `InvalidMetadataURI()`: Thrown when the metadata URI is empty.
* `NoReleases()`: Thrown when querying release information for an operator set that has no published releases.

---
````

## File: docs/core/RewardsCoordinator.md
````markdown
## RewardsCoordinator

| File | Type | Proxy |
| -------- | -------- | -------- |
| [`RewardsCoordinator.sol`](../../src/contracts/core/RewardsCoordinator.sol) | Singleton | Transparent proxy |


<!-- The primary functions of the `RewardsCoordinator` contract are to (i) accept ERC20 rewards from AVSs (Actively Validated Services) to their Operators and delegated Stakers for a given time range; (ii) enable the protocol to provide ERC20 tokens to all stakers over a specified time range; and (iii) allow stakers and operators to claim their accumulated earnings. -->

The `RewardsCoordinator` accepts ERC20s from AVSs alongside rewards submission requests made out to Operators who, during a specified time range, were registered to the AVS in the core [`AllocationManager`](./AllocationManager.md) contract.

There are four forms of rewards:
* **Rewards v1**, also known as rewards submissions. AVS-wide, auto-weighted distribution based on total delegated stake.
* **Rewards v2**, also known as operator-directed rewards submissions. AVSs specify per-operator amounts with custom logic, scoped AVS-wide. See [ELIP-001](https://github.com/eigenfoundation/ELIPs/blob/main/ELIPs/ELIP-001.md) for additional context.
* **Rewards v2.1**, also known as operator-directed operator set rewards submissions. Same operator-directed model as v2 but scoped to a specific Operator Set rather than AVS-wide. Uses per-operator-set splits (via `setOperatorSetSplit`) and operator set registration for eligibility.
* **Rewards v2.2**, also known as unique stake and total stake operator set rewards. Auto-weighted distribution scoped to Operator Sets, supporting both retroactive and forward-looking submissions (up to 2 years). See [ELIP-014](https://github.com/eigenfoundation/ELIPs/blob/main/ELIPs/ELIP-014.md) for additional context. This includes:
  * **Unique Stake Rewards**: Distributes based on allocated unique stake (`magnitude / max_magnitude`) within an Operator Set.
  * **Total Stake Rewards**: Distributes based on total delegated stake within an Operator Set (operator set analog to Rewards v1).

*Off-chain*, the trusted *rewards updater* calculates a rewards distribution over some rewards submission's time range, depending on the rewards type. For a **v1 rewards submission**, it is based on: (i) the relative stake weight of each Operator's Stakers and (ii) a default split given to the Operator. For a **v2 rewards submission**, it is based on: (i) an AVS's custom rewards logic, (ii) the per-operator splits. For a **v2.1 rewards submission**, it is based on: (i) the AVS's per-operator amounts, (ii) the per-operator-set split, and (iii) operator registration to the specific Operator Set. For a **v2.2 rewards submission**, it is based on: (i) the relative unique or total stake weight of each Operator within the Operator Set, (ii) the per-operator-set split.

*On-chain*, the rewards updater sends the `RewardsCoordinator` a merkle root of each earner's cumulative earnings. Earners provide merkle proofs to the `RewardsCoordinator` to claim rewards against these roots.

The typical user flow is as follows:
1. An AVS submits a *rewards submission* — either a `RewardsSubmission` (v1/v2.2) or `OperatorDirectedRewardsSubmission` (v2/v2.1) — to the `RewardsCoordinator` contract, which specifies a time range (`startTimestamp` and `duration`) and `token`. The rewards submission also specifies the relative reward weights of strategies (i.e. "distribute 80% out to holders of X strategy, and 20% to holders of strategy Y").
   * **v1 rewards** specify a total `amount` distributed AVS-wide.
   * **v2 rewards** specify a per-operator reward (due to customizable rewards logic) and allow for adding a `description` of the rewards submission's purpose.
   * **v2.1 rewards** are identical to v2 but scoped to a specific Operator Set. Operators must be registered to the Operator Set, and per-operator-set splits apply.
   * **v2.2 rewards** specify a total `amount` scoped to a specific Operator Set. The system automatically calculates per-operator distribution based on either unique allocated stake or total delegated stake weight.
2. Off-chain, the rewards submissions are used to calculate reward distributions, which are periodically consolidated into a merkle tree.
3. The root of this tree (aka the `DistributionRoot`) is posted on-chain by the *rewards updater*. A `DistributionRoot` becomes active for claims after some globally-configured `activationDelay`.
4. Stakers and Operators (or their configured "claimers") can claim their accumulated earnings by providing a merkle proof against any previously-posted `DistributionRoot`.

This entire flow will repeat periodically as AVSs submit rewards submissions, `DistributionRoots` are submitted, and Stakers/Operators claim their accumulated earnings. Note that `DistributionRoots` contain *cumulative earnings*, meaning Stakers/Operators aren't required to claim against every root - simply claiming against the most recent root will claim anything not yet claimed.

**NOTE: Use caution when using reward tokens that do not strictly conform to ERC20 standards. Please DYOR if your token falls outside of ERC20 norms.** Specific things to look out for include (but are not limited to): exotic rebasing tokens, fee-on-transfer tokens, tokens that support reentrant behavior (like ERC-777), and other nonstandard ERC20 derivatives.

#### High-level Concepts

This document is organized according to the following themes (click each to be taken to the relevant section):
* [Submitting Rewards Requests](#submitting-rewards-requests)
* [Distributing and Claiming Rewards](#distributing-and-claiming-rewards)
* [System Configuration](#system-configuration)
* [Rewards Merkle Tree Structure](#rewards-merkle-tree-structure)
* [Off Chain Calculation](#off-chain-calculation)

#### Important state variables

* `DistributionRoot[] public distributionRoots`:
    * `distributionRoots` stores historic reward merkle tree roots submitted by the rewards updater. For each earner, the rewards merkle tree stores cumulative earnings per ERC20 reward token. For more details on merkle tree structure see [Rewards Merkle Tree Structure](#rewards-merkle-tree-structure) below.
* `mapping(address => address) public claimerFor`: earner => claimer
    * Stakers and Operators can designate a "claimer" who can claim rewards via on their behalf via `processClaim`. If a claimer is not set in `claimerFor`, the earner will have to call `processClaim` themselves.
    * Note that the claimer isn't necessarily the reward recipient, but they do have the authority to specify the recipient when calling `processClaim` on the earner's behalf.
* `mapping(address => mapping(IERC20 => uint256)) public cumulativeClaimed`: earner => token => total amount claimed to date
    * Mapping for earners(Stakers/Operators) to track their total claimed earnings per reward token. This mapping is used to calculate the difference between the cumulativeEarnings stored in the merkle tree and the previous total claimed amount. This difference is then transferred to the specified destination address.
* `uint16 public defaultOperatorSplitBips`: *Used off-chain* by the rewards updater to calculate an Operator's split for a specific reward.
    * This is expected to be a flat 10% rate for the initial rewards release. Expressed in basis points, this is `1000`.
* `mapping(address => mapping(address => OperatorSplit)) internal _operatorAVSSplitBips`: operator => AVS => `OperatorSplit`
  * Operators specify their custom split for a given AVS for each `OperatorDirectedRewardsSubmission`, where Stakers receive a relative proportion (by stake weight) of the remaining amount.
* `mapping(address => OperatorSplit) internal _operatorPISplitBips`: operator => `OperatorSplit`
  * Operators may also specify their custom split for [programmatic incentives](https://www.blog.eigenlayer.xyz/introducing-programmatic-incentives-v1/), where Stakers similarly receive a relative proportion (by stake weight) of the remaining amount.
* `mapping(address operator => mapping(bytes32 operatorSetKey => OperatorSplit split)) internal _operatorSetSplitBips`: operator => Operator Set Key => `OperatorSplit`
  * Operators may specify their custom split for a given Operator Set, which is more granular than an overarching AVS split

#### Helpful definitions

* **AVS** (Autonomous Verifiable Service) refers to the contract entity that is submitting rewards to the `RewardsCoordinator`.
  * This is assumed to be a customized `ServiceManager` contract of some kind that is interfacing with the EigenLayer protocol. See the `ServiceManagerBase` docs here: [`eigenlayer-middleware/docs/ServiceManagerBase.md`](https://github.com/Layr-Labs/eigenlayer-middleware/blob/dev/docs/ServiceManagerBase.md).
* An **Operator Set** refers to a collection of registered operators and strategies. See [ELIP-002](https://github.com/eigenfoundation/ELIPs/blob/main/ELIPs/ELIP-002.md#operator-sets) for more details.
* An **Operator Set Key** describes the tuple of an AVS address and an ID that uniquely identifies an Operator Set. See the [AllocationManager](./AllocationManager.md#operator-sets) for details.
* A **rewards submission** includes, unless specified otherwise, the v1/v2.2 `RewardsSubmission` and the v2/v2.1 `OperatorDirectedRewardsSubmission` types.
* The internal function `_checkClaim(RewardsMerkleClaim calldata claim, DistributionRoot memory root)` checks the merkle inclusion of a claim against a `DistributionRoot`
    * It reverts if any of the following are true:
        * mismatch input param lengths: tokenIndices, tokenTreeProofs, tokenLeaves
        * earner proof reverting from calling `_verifyEarnerClaimProof`
        * any of the token proofs reverting from calling `_verifyTokenClaimProof`

---

### Submitting Rewards Requests

Rewards are initially submitted to the contract to be distributed to Operators and Stakers by the following functions:

* [`RewardsCoordinator.createAVSRewardsSubmission`](#createavsrewardssubmission)
* [`RewardsCoordinator.createRewardsForAllSubmission`](#createrewardsforallsubmission)
* [`RewardsCoordinator.createRewardsForAllEarners`](#createrewardsforallearners)
* [`RewardsCoordinator.createOperatorDirectedAVSRewardsSubmission`](#createoperatordirectedavsrewardssubmission)
* [`RewardsCoordinator.createOperatorDirectedOperatorSetRewardsSubmission`](#createoperatordirectedoperatorsetrewardssubmission)
* [`RewardsCoordinator.createUniqueStakeRewardsSubmission`](#createuniquestakerewardssubmission)
* [`RewardsCoordinator.createTotalStakeRewardsSubmission`](#createtotalstakerewardssubmission)

#### `createAVSRewardsSubmission`

```solidity
function createAVSRewardsSubmission(
    RewardsSubmission[] calldata RewardsSubmissions
)
    external
    onlyWhenNotPaused(PAUSED_AVS_REWARDS_SUBMISSION)
    nonReentrant
```

Called by an AVS to submit a list of `RewardsSubmission`s to be distributed across all registered Operators (and Stakers delegated to each Operator). A `RewardsSubmission` consists of the following fields:
* `IERC20 token`: the address of the ERC20 token being used for reward submission
* `uint256 amount`: amount of `token` to transfer to the `RewardsCoordinator`
* `uint32 startTimestamp`: the start of the submission time range
* `uint32 duration`: the duration of the submission time range, in seconds
* `StrategyAndMultiplier[] strategiesAndMultipliers`: an array of `StrategyAndMultiplier` structs that define a linear combination of EigenLayer strategies the AVS is considering eligible for rewards. Each `StrategyAndMultiplier` contains:
    * `IStrategy strategy`: address of the strategy against which a Staker/Operator's relative shares are weighted in order to determine their reward amount
    * `uint96 multiplier`: the relative weighting of the strategy in the linear combination. (Recommended use here is to use 1e18 as the base multiplier and adjust the relative weightings accordingly)

For each submitted `RewardsSubmission`, this method performs a `transferFrom` to transfer the specified reward `token` and `amount` from the caller to the `RewardsCoordinator`.

*Eligibility*:

In order to be eligible to claim a `createAVSRewardsSubmission` reward, the Operator should be registered for the AVS in the `AVSDirectory` during the time period over which the reward is being made (see docs for [`AVSDirectory.registerOperatorToAVS`](./AVSDirectory.md#registeroperatortoavs)). If an Operator is ineligible, any Stakers delegated to the Operator are also ineligible.

In addition, the AVS ServiceManager contract must also implement the interfaces `ServiceManager.getRestakeableStrategies` and `ServiceManager.getOperatorRestakedStrategies` to have their rewards be successfully distributed as these view functions are called offchain as part of the rewards distribution process. This is by default implemented in the `ServiceManagerBase` contract but is important to note if the base contract is not being inherited from.
See the `ServiceManagerBase` abstract contract here: [`ServiceManagerBase.sol`](https://github.com/Layr-Labs/eigenlayer-middleware/blob/dev/src/ServiceManagerBase.sol)

*Rewards Distribution*:

The rewards distribution amongst the AVS's Operators and delegated Stakers is determined offchain using the strategies and multipliers provided in the `RewardsSubmission` struct as well as the actual shares for those defined strategies over the `RewardsSubmission`'s time range. These shares are read from the [`EigenPodManager`](./EigenPodManager.md) (in the case of the Beacon Chain ETH strategy), or the [`StrategyManager`](./StrategyManager.md) for any other strategy. Note that Stakers' shares specifically are what determines rewards distribution; Operators earn based on a combination of their own deposited shares and a configured `defaultOperatorSplitBips`.

*Effects*:
* For each `RewardsSubmission` element
    * Transfers `amount` of `token` from the msg.sender (AVS) to the `RewardsCoordinator`
    * Hashes msg.sender(AVS), nonce, and `RewardsSubmission` struct to create a unique rewards hash and sets this value to `true` in the `isAVSRewardsSubmissionHash` mapping
    * Increments `submissionNonce[msg.sender]`
    * Emits a `AVSRewardsSubmissionCreated` event

*Requirements*:
* Pause status MUST NOT be set: `PAUSED_AVS_REWARDS_SUBMISSION`
* Function call is not reentered
* For each `RewardsSubmission` element
    * Requirements from calling internal function `_validateRewardsSubmission()`
        * `rewardsSubmission.strategiesAndMultipliers.length > 0`
        * `rewardsSubmission.amount > 0`
        * `rewardsSubmission.amount <= MAX_REWARDS_AMOUNT`
        * `rewardsSubmission.duration <= MAX_REWARDS_DURATION`
        * `rewardsSubmission.duration % calculationIntervalSeconds == 0`
        * `rewardsSubmission.duration > 0`
        * `rewardsSubmission.startTimestamp % calculationIntervalSeconds == 0`
        * `block.timestamp - MAX_RETROACTIVE_LENGTH <= rewardsSubmission.startTimestamp`
        * `GENESIS_REWARDS_TIMESTAMP <= rewardsSubmission.startTimestamp`
        * `rewardsSubmission.startTimestamp <= block.timestamp + MAX_FUTURE_LENGTH`
        * Requirements for `rewardsSubmission.strategiesAndMultipliers`
            * Each `strategy` is whitelisted for deposit in the StrategyManager or is the `beaconChainETHStrategy`
            * `rewardsSubmission.strategiesAndMultipliers` is sorted by ascending strategy address to prevent duplicate strategies
    * `transferFrom` MUST succeed in transferring `amount` of `token` from `msg.sender` to the `RewardsCoordinator`

The text diagram below better visualizes a valid start timestamp for a `RewardsSubmission`
```
Sliding Window for valid RewardsSubmission startTimestamp

Scenario A: GENESIS_REWARDS_TIMESTAMP IS WITHIN RANGE
        <-----MAX_RETROACTIVE_LENGTH-----> t (block.timestamp) <---MAX_FUTURE_LENGTH--->
            <--------------------valid range for startTimestamp------------------------>
            ^
        GENESIS_REWARDS_TIMESTAMP


Scenario B: GENESIS_REWARDS_TIMESTAMP IS OUT OF RANGE
        <-----MAX_RETROACTIVE_LENGTH-----> t (block.timestamp) <---MAX_FUTURE_LENGTH--->
        <------------------------valid range for startTimestamp------------------------>
    ^
GENESIS_REWARDS_TIMESTAMP
```

#### `createRewardsForAllSubmission`

```solidity
function createRewardsForAllSubmission(
    RewardsSubmission[] calldata RewardsSubmissions
)
    external
    onlyWhenNotPaused(PAUSED_REWARDS_FOR_ALL_SUBMISSION)
    onlyRewardsForAllSubmitter
    nonReentrant
```

This method is identical in function to [`createAVSRewardsSubmission`](#createavsrewardssubmission) above, except:
* It can only be called by a whitelisted "rewards for all submitter"
* ALL Stakers are eligible for rewards, instead of those specifically registered for a given AVS

*Effects*:
* See [`createAVSRewardsSubmission`](#createavsrewardssubmission) above. The only differences are that:
    * Each rewards submission hash is stored in the `isRewardsSubmissionForAllHash` mapping
    * A `RewardsSubmissionForAllCreated` event is emitted

*Requirements*:
* See [`createAVSRewardsSubmission`](#createavsrewardssubmission) above. The only difference is that each calculated rewards submission hash MUST NOT already exist in the `isRewardsSubmissionForAllHash` mapping.

#### `createRewardsForAllEarners`

```solidity
function createRewardsForAllEarners(
    RewardsSubmission[] calldata RewardsSubmissions
)
    external
    onlyWhenNotPaused(PAUSED_REWARDS_FOR_ALL_SUBMISSION)
    onlyRewardsForAllSubmitter
    nonReentrant
```

This method is identical in function to [`createAVSRewardsSubmission`](#createavsrewardssubmission) above, except:
* It can only be called by a whitelisted "rewards for all submitter"
* Only operators who have opted into at least one AVS and the operator's delegated stakers are eligible for rewards

*Effects*:
* See [`createAVSRewardsSubmission`](#createavsrewardssubmission) above. The only differences are that:
    * Each rewards submission hash is stored in the `isRewardsSubmissionForAllEarnersHash` mapping
    * Emits a `RewardsSubmissionForAllEarnersCreated` event

*Requirements*:
* See [`createAVSRewardsSubmission`](#createavsrewardssubmission) above. The only difference is that each calculated rewards submission hash MUST NOT already exist in the `isRewardsSubmissionForAllEarnersHash` mapping.

#### `createOperatorDirectedAVSRewardsSubmission`

```solidity
function createOperatorDirectedAVSRewardsSubmission(
    address avs,
    OperatorDirectedRewardsSubmission[] calldata operatorDirectedRewardsSubmissions
)
    external
    onlyWhenNotPaused(PAUSED_OPERATOR_DIRECTED_AVS_REWARDS_SUBMISSION)
    checkCanCall(avs)
    nonReentrant
```

AVS may make Rewards v2 submissions by calling `createOperatorDirectedAVSRewardsSubmission()` with any custom on-chain or off-chain logic to determine their rewards distribution strategy. This can be custom to the work performed by Operators during a certain period of time, can be a flat reward rate, or some other structure based on the AVS’s economic model. This would enable AVSs' flexibility in rewarding different operators for performance and other variables while maintaining the same easily calculable reward rate for stakers delegating to the same operator and strategy. The AVS can submit multiple performance-based rewards denominated in different tokens for even more flexibility.

*Effects*:
* For each `OperatorDirectedRewardsSubmission` element
  * Transfers `amount` of `token` from `msg.sender` to the `RewardsCoordinator`
  * Hashes `AVS`, `nonce`, and `OperatorDirectedRewardsSubmission` struct to create a unique rewards hash and sets this value to `true` in the `isOperatorDirectedAVSRewardsSubmissionHash` mapping
  * Increments `submissionNonce[avs]`
  * Emits an `OperatorDirectedAVSRewardsSubmissionCreated` event

*Requirements*:
* Pause status MUST NOT be set: `PAUSED_OPERATOR_DIRECTED_AVS_REWARDS_SUBMISSION`
* Caller MUST be authorized, either as the AVS itself or an admin/appointee (see [`PermissionController.md`](../permissions/PermissionController.md))
* Function call is not reentered
* For each `OperatorDirectedRewardsSubmission` element:
  * Requirements from calling internal function `_validateOperatorDirectedRewardsSubmission()`
    * `operatorDirectedRewardsSubmission.strategiesAndMultipliers.length > 0`
    * `operatorDirectedRewardsSubmission.duration <= MAX_REWARDS_DURATION`
    * `operatorDirectedRewardsSubmission.duration % calculationIntervalSeconds == 0`
    * `operatorDirectedRewardsSubmission.duration > 0`
    * `operatorDirectedRewardsSubmission.startTimestamp % calculationIntervalSeconds == 0`
    * `block.timestamp - MAX_RETROACTIVE_LENGTH <= operatorDirectedRewardsSubmission.startTimestamp`
    * `GENESIS_REWARDS_TIMESTAMP <= operatorDirectedRewardsSubmission.startTimestamp`
    * For each `operatorDirectedRewardsSubmission.strategiesAndMultipliers` element:
      * Each `strategy` is whitelisted for deposit in the StrategyManager or is the `beaconChainETHStrategy`
      * `rewardsSubmission.strategiesAndMultipliers` is sorted by ascending strategy address to prevent duplicate strategies
    * `operatorDirectedRewardsSubmission.operatorRewards.length > 0`
    * For each `operatorDirectedRewardsSubmission.operatorRewards` element:
      * `operatorReward.operator != address(0)`
      * `currOperatorAddress < operatorReward.operator`
      * `operatorReward.amount > 0`
    * `totalAmount <= MAX_REWARDS_AMOUNT`, where `totalAmount` is the sum of every `operatorReward.amount`
    * `operatorDirectedRewardsSubmission.startTimestamp + operatorDirectedRewardsSubmission.duration < block.timestamp`, enforcing strictly retoractive rewards submissions
  * `transferFrom` MUST succeed in transferring `amount` of `token` from `msg.sender` to the `RewardsCoordinator`

#### `createOperatorDirectedOperatorSetRewardsSubmission`

```solidity
function createOperatorDirectedOperatorSetRewardsSubmission(
    OperatorSet calldata operatorSet,
    OperatorDirectedRewardsSubmission[] calldata operatorDirectedRewardsSubmissions
)
    external
    onlyWhenNotPaused(PAUSED_OPERATOR_DIRECTED_OPERATOR_SET_REWARDS_SUBMISSION)
    checkCanCall(operatorSet.avs)
    nonReentrant
```

This is the **Rewards v2.1** function. It allows AVSs to make operator-directed rewards submissions scoped to a specific Operator Set, allowing for more granularly targeted rewards based on tasks assigned to a specific operator set, or any other custom AVS logic. Its functionality is almost identical to [`createOperatorDirectedAVSRewardsSubmission`](#createoperatordirectedavsrewardssubmission), save for some operator-set specific requirements, state variables, and events.

Note that an AVS must specify an operator set registered to the AVS; in other words, an operator set belonging to a different AVS, or an unregistered operator set, will cause this function to revert.

Also note that making this reward submission with a duration extending prior to the slashing release will result in those reward snapshots, prior to the slashing release, being refunded to the AVS (this is handled in the Sidecar rewards calculation logic).

*Eligibility*:

Operators specified in the `operatorRewards` array must be registered to the Operator Set during the reward period. If an operator is not registered during a given snapshot, the allocated amounts for that snapshot are refunded to the AVS. Additionally, if a strategy specified in the submission is not registered to the Operator Set, the staker portion for that strategy is also refunded to the AVS.

*Rewards Distribution*:

Unlike v2 (AVS-wide), v2.1 uses **per-operator-set splits** (set via [`setOperatorSetSplit`](#setoperatorsetsplit)) rather than per-AVS splits. The split lookup chain is: operator set split → global default split → 10% fallback. Staker distribution is proportional to their delegated shares weighted by the `strategiesAndMultipliers`, considering only strategies registered to the Operator Set.

*Effects*:
* See [`createOperatorDirectedAVSRewardsSubmission`](#createoperatordirectedavsrewardssubmission) above. The only differences are that:
  * Each rewards submission is stored in the `isOperatorDirectedOperatorSetRewardsSubmissionHash` mapping
  * An `OperatorDirectedOperatorSetRewardsSubmissionCreated` event is emitted

*Requirements*:
* See [`createOperatorDirectedAVSRewardsSubmission`](#createoperatordirectedavsrewardssubmission) above. The only differences are that:
  * `operatorSet` MUST be a [registered operator set](./AllocationManager.md#createoperatorsets) for the given AVS as according to `allocationManager.isOperatorSet()`
  * Pause status is instead: `PAUSED_OPERATOR_DIRECTED_OPERATOR_SET_REWARDS_SUBMISSION`

#### `createUniqueStakeRewardsSubmission`

```solidity
function createUniqueStakeRewardsSubmission(
    OperatorSet calldata operatorSet,
    RewardsSubmission[] calldata rewardsSubmissions
)
    external
    onlyWhenNotPaused(PAUSED_UNIQUE_STAKE_REWARDS_SUBMISSION)
    checkCanCall(operatorSet.avs)
    nonReentrant
```

Called by an AVS to submit a list of `RewardsSubmission`s to be distributed across Operators who have allocated **unique stake** to the specified Operator Set. This is the first forward-looking rewards mechanism for `AllocationManager`-registered AVSs, and is essentially the Rewards v1 model scoped to allocated unique stake within an Operator Set.

The AVS specifies a total `amount`; the off-chain system automatically calculates per-operator distribution based on each operator's relative unique stake weight (`magnitude / max_magnitude`) within the Operator Set.

A `RewardsSubmission` consists of the same fields as described in [`createAVSRewardsSubmission`](#createavsrewardssubmission):
* `IERC20 token`, `uint256 amount`, `uint32 startTimestamp`, `uint32 duration`, `StrategyAndMultiplier[] strategiesAndMultipliers`

*Eligibility*:

Operators must be registered to the Operator Set **and** have allocated unique stake to that specific Operator Set during the reward period to be eligible for unique stake rewards. Unique stake is always slashable by definition. If no operators are registered during a given snapshot, the allocated amounts for that snapshot are refunded to the AVS.

*Rewards Distribution*:

The off-chain sidecar calculates daily distributions based on `magnitude / max_magnitude` from `AllocationManager` allocation snapshots. For each daily snapshot during the reward `duration`:
* Each operator's allocated weight is calculated as `SUM(shares * magnitude / max_magnitude * multiplier)` across the specified strategies
* Operator share for the day: `FLOOR(tokens_per_day * operator_weight / total_weight)`
* The operator's share is split according to the per-operator-set split (see [`setOperatorSetSplit`](#setoperatorsetsplit)), with the remainder distributed to stakers proportional to their delegated shares and the `strategiesAndMultipliers`

The split lookup chain is: operator set split → global default split → 10% fallback.

*Effects*:
* For each `RewardsSubmission` element:
    * Transfers `amount` of `token` from `msg.sender` to the `RewardsCoordinator`
    * Takes the protocol fee (if the submitter is opted in for protocol fees)
    * Hashes `operatorSet.avs`, nonce, and `RewardsSubmission` struct to create a unique rewards hash and sets this value to `true` in the `isUniqueStakeRewardsSubmissionHash` mapping
    * Increments `submissionNonce[operatorSet.avs]`
    * Emits a `UniqueStakeRewardsSubmissionCreated` event

*Requirements*:
* Pause status MUST NOT be set: `PAUSED_UNIQUE_STAKE_REWARDS_SUBMISSION`
* Caller MUST be authorized, either as the AVS itself or an admin/appointee (see [`PermissionController.md`](../permissions/PermissionController.md))
* `operatorSet` MUST be a [registered operator set](./AllocationManager.md#createoperatorsets) for the given AVS as according to `allocationManager.isOperatorSet()`
* Function call is not reentered
* For each `RewardsSubmission` element:
    * Requirements from calling internal function `_validateRewardsSubmission()` (same validation as [`createAVSRewardsSubmission`](#createavsrewardssubmission))
    * `transferFrom` MUST succeed in transferring `amount` of `token` from `msg.sender` to the `RewardsCoordinator`

*Key behavioral notes*:
* **Dynamic Weighting**: Stake weights are queried daily at execution time, not locked at submission time. Individual operator shares fluctuate as relative stake changes; the total daily rate (`amount / duration`) remains fixed.
* **No Cancellation**: Once submitted, commitments are binding. Tokens are immediately escrowed and cannot be cancelled.
* **Forward-Looking**: Unlike operator-directed rewards (which are strictly retroactive), unique stake rewards support `startTimestamp` up to `MAX_FUTURE_LENGTH` in the future.

#### `createTotalStakeRewardsSubmission`

```solidity
function createTotalStakeRewardsSubmission(
    OperatorSet calldata operatorSet,
    RewardsSubmission[] calldata rewardsSubmissions
)
    external
    onlyWhenNotPaused(PAUSED_TOTAL_STAKE_REWARDS_SUBMISSION)
    checkCanCall(operatorSet.avs)
    nonReentrant
```

Called by an AVS to submit a list of `RewardsSubmission`s to be distributed across Operators registered to the specified Operator Set based on **total delegated stake**. This is the Operator Set analog to Rewards v1, scoped to a specific Operator Set instead of AVS-wide.

The AVS specifies a total `amount`, then the off-chain system automatically calculates per-operator distribution based on each operator's relative total delegated stake weight within the Operator Set.

*Eligibility*:

Operators must be registered to the Operator Set during the reward period to be eligible for total stake rewards. Unlike unique stake rewards, operators are not required to have allocated unique stake. Only registration is needed. If no operators are registered during a given snapshot, the allocated amounts for that snapshot are refunded to the AVS.

*Rewards Distribution*:

The off-chain sidecar calculates daily distributions based on total delegated shares from `DelegationManager` share snapshots. For each daily snapshot during the reward `duration`:
* Each operator's total weight is calculated as `SUM(shares * multiplier)` across the specified strategies
* Operator share for the day: `FLOOR(tokens_per_day * operator_weight / total_weight)`
* The operator's share is split the same way as unique stake rewards (per-operator-set split → global default → 10% fallback)

*Effects*:
* See [`createUniqueStakeRewardsSubmission`](#createuniquestakerewardssubmission) above. The only differences are that:
    * Each rewards submission hash is stored in the `isTotalStakeRewardsSubmissionHash` mapping
    * A `TotalStakeRewardsSubmissionCreated` event is emitted

*Requirements*:
* See [`createUniqueStakeRewardsSubmission`](#createuniquestakerewardssubmission) above. The only difference is that:
    * Pause status is instead: `PAUSED_TOTAL_STAKE_REWARDS_SUBMISSION`

*Key behavioral notes*:
* See [`createUniqueStakeRewardsSubmission`](#createuniquestakerewardssubmission) above. The primary difference is the stake weighting mechanism — total stake uses total delegated shares (`SUM(shares * multiplier)`) rather than allocated unique stake (`SUM(shares * magnitude / max_magnitude * multiplier)`).

---

### Distributing and Claiming Rewards

The *rewards updater* calculates rewards distributions and submit claimable roots through the following function `submitRoot`. They can also disable the root if it has not yet been activated:

* [`RewardsCoordinator.submitRoot`](#submitroot)
* [`RewardsCoordinator.disableRoot`](#disableroot)

Earners configure and claim these rewards using the following functions:

* [`RewardsCoordinator.setClaimerFor`](#setclaimerfor)
* [`RewardsCoordinator.processClaim`](#processclaim)
* [`RewardsCoordinator.processClaims`](#processclaims)

#### `submitRoot`

```solidity
function submitRoot(
    bytes32 root,
    uint32 rewardsCalculationEndTimestamp
)
    external
    onlyWhenNotPaused(PAUSED_SUBMIT_DISABLE_ROOTS)
    onlyRewardsUpdater
```

Called only by the `rewardsUpdater` address to create a new `DistributionRoot` in the RewardsCoordinator. The `DistributionRoot` struct contains the following fields:
* `bytes32 root`: the merkle root of the rewards merkle tree
* `uint32 rewardsCalculationEndTimestamp`: the end of the rewards time range for which the `DistributionRoot` is being submitted
* `uint32 activatedAt`: the timestamp in seconds when the `DistributionRoot` is activated and can be claimed against

`submitRoot` pushes a new `DistributionRoot` to the `distributionRoots` array. The `DistributionRoot.activatedAt` timestamp is set to `block.timestamp + activationDelay()` to allow for a delay before claims can be processed. Once this delay has passed, the root can be used to verify merkle proofs of rewards made out to Stakers/Operators.

*Effects*:
* Pushes a new `DistributionRoot` to the `distributionRoots` array
* Sets `currRewardsCalculationEndTimestamp` to the param `rewardsCalculationEndTimestamp`
* Emits a `DistributionRootSubmitted` event

*Requirements*:
* Pause status MUST NOT be set: `PAUSED_SUBMIT_DISABLE_ROOTS`
* `msg.sender` MUST be the `rewardsUpdater`
* `rewardsCalculationEndTimestamp > currRewardsCalculationEndTimestamp`
* `rewardsCalculationEndTimestamp < block.timestamp`

#### `disableRoot`

```solidity
function disableRoot(
    uint32 rootIndex
)
    external
    onlyWhenNotPaused(PAUSED_SUBMIT_DISABLE_ROOTS)
    onlyRewardsUpdater
```

Called only by the `rewardsUpdater` address to disable a pending `DistributionRoot` that has not yet been activated (activatedAt timestamp hasn't been reached yet) in the RewardsCoordinator. Once the activatedAt timestamp has been reached, a root can no longer be disabled and is deemed finalized and claimable against.
This is to add additional measures to prevent invalid roots posted to the contract, either from error or potentially malicious roots posted.

*Effects*:
* Sets the `disabled` field to True for the corresponding `DistributionRoot`
* `DistributionRoot` can no longer be claimed against in `processClaim`
* Emits a `DistributionRootDisabled` event

*Requirements*:
* Pause status MUST NOT be set: `PAUSED_SUBMIT_DISABLE_ROOTS`
* `msg.sender` MUST be the `rewardsUpdater`
* `rootIndex < distributionRoots.length`
* `root.disabled == False`
* `block.timestamp < root.activatedAt`
* `rewardsCalculationEndTimestamp < block.timestamp`


#### `setClaimerFor`

```solidity
function setClaimerFor(address claimer) external
```

Called by an earner (Staker/Operator) to set a claimer address that can call `processClaim` on their behalf. If the claimer is not set (`claimerFor[earner] == address(0)`), the earner themselves can call `processClaim` directly.

*Effects*:
* Sets the `claimerFor[msg.sender]` to the input param `claimer`
* Emits a `ClaimerForSet` event

#### `processClaim`

```solidity
function processClaim(
    RewardsMerkleClaim calldata claim,
    address recipient
)
    external
    onlyWhenNotPaused(PAUSED_PROCESS_CLAIM)
    nonReentrant
```

Called an earner (Staker/Operator) to claim their accumulated earnings by providing a merkle proof against a posted `DistributionRoot`. If the earner has configured a claimer (via `setClaimerFor`), the claimer must call this method instead.

The `RewardsMerkleClaim` struct contains the following fields (see [Rewards Merkle Tree Structure](#rewards-merkle-tree-structure) for further details):
* `uint32 rootIndex`: the index of the `DistributionRoot` in `distributionRoots` to prove against
* `uint32 earnerIndex`: the index of the earner's account root in the merkle tree
* `bytes earnerTreeProof`: the proof of the earner's `EarnerTreeMerkleLeaf` against the `DistributionRoot`
* `EarnerTreeMerkleLeaf earnerLeaf`: the earner's address and token subtree root
    * `address earner`: the address of the earner
    * `bytes32 earnerTokenRoot`: the merkle root of the earner's token merkle tree
* `uint32[] tokenIndices`: the indices of the token leaves in the earner's subtree
* `bytes[] tokenTreeProofs`: the proofs of the token leaves against the earner's `earnerTokenRoot`
* `TokenTreeMerkleLeaf[] tokenLeaves`: the token leaves to be claimed:
    * `IERC20 token`: the ERC20 token to be claimed
    * `uint256 amount`: the amount of the ERC20 token to be claimed

`processClaim` is a simple wrapper function which calls out to the internal function `_processClaim`, which holds all of the necessary logic.

`_processClaim` will first call `_checkClaim` to verify the merkle proofs against the `DistributionRoot` at the specified `rootIndex`. This is done by first performing a merkle proof verification of the earner's `EarnerTreeMerkleLeaf` against the `DistributionRoot` and then for each tokenIndex, verifying each token leaf against the earner's `earnerTokenRoot`.

The caller must be the set claimer address in the `claimerFor` mapping or the earner themselves if the claimer is not set.

After the claim is verified, for each token leaf, the difference between the cumulative earnings in the merkle tree and the previous total claimed amount last stored in the contract is calculated and transferred from the `RewardsCoordinator` contract to the address `recipient`.

*Effects*:
* For each `claim.tokenLeaves`:
    * Calculates `uint claimAmount = tokenLeaf.cumulativeEarnings - cumulativeClaimed[earner][tokenLeaf.token]`
        * Transfers `claimAmount` of `tokenLeaf.token` to the specified `recipient`
    * Updates the `cumulativeClaimed` mapping for the earner and token
    * Emits a `RewardsClaimed` event

*Requirements*:
* Pause status MUST NOT be set: `PAUSED_PROCESS_CLAIM`
* The `claim` must have valid proofs against a valid `DistributionRoot`:
    * For the `DistributionRoot` given by `claim.rootIndex`, the root MUST be active (`block.timestamp >= root.activatedAt`)
    * `claim.tokenIndices` MUST equal the lengths of `claim.TokenTreeProofs` AND `claim.tokenLeaves`
    * `claim.earnerTreeProof` MUST validate `claim.earnerLeaf` against the `DistributionRoot`
    * For each `claim.tokenIndices[i]`:
        * `claim.tokenTreeProofs[i]` MUST validate `claim.tokenLeaves[i]` against `claim.earnerLeaf.earnerTokenRoot`
* If the `earner` specified in `claim.earnerLeaf.earner` has a designated `claimer` in `claimerFor[earner]`, `msg.sender` MUST be the `claimer`
    * Otherwise, `msg.sender` MUST be the `earner`
* For each `TokenTreeMerkleLeaf`,
    * `tokenLeaf.cumulativeEarnings > cumulativeClaimed[earner][token]`: cumulativeEarnings must be gt than cumulativeClaimed. Trying to reclaim with the same proofs will revert because the claimed and earnings values will equal, breaking this requirement.
    * `tokenLeaf.token.safeTransfer(recipient, claimAmount)` MUST succeed

#### `processClaims`

```solidity
function processClaims(
        RewardsMerkleClaim[] calldata claims,
        address recipient
)
    external
    onlyWhenNotPaused(PAUSED_PROCESS_CLAIM)
    nonReentrant
```

`processClaims` is a simple wrapper function around `_processClaim`, calling it once for each claim provided.

*Effects*:
* For each `RewardsMerkleClaim` element: see [`processClaim`](#processclaim) above.

*Requirements*
* See [`processClaim`](#processclaim) above.

---

### System Configuration

* [`RewardsCoordinator.setActivationDelay`](#setactivationdelay)
* [`RewardsCoordinator.setDefaultOperatorSplit`](#setdefaultoperatorsplit)
* [`RewardsCoordinator.setRewardsUpdater`](#setrewardsupdater)
* [`RewardsCoordinator.setRewardsForAllSubmitter`](#setrewardsforallsubmitter)
* [`RewardsCoordinator.setOperatorAVSSplit`](#setoperatoravssplit)
* [`RewardsCoordinator.setOperatorPISplit`](#setoperatorpisplit)
* [`RewardsCoordinator.setOperatorSetSplit`](#setoperatorsetsplit)

#### `setActivationDelay`

```solidity
function setActivationDelay(uint32 _activationDelay) external onlyOwner
```

Allows the Owner to set the global `activationDelay`. The activation delay is the time in seconds after a `DistributionRoot` is submitted before it can be claimed against. This delay is to allow for interested parties to perform verification of the root before claiming begins.

*Effects*:
* Sets the global `activationDelay`
* Emits a `ActivationDelaySet` event

*Requirements*:
* Caller MUST be the Owner

#### `setDefaultOperatorSplit`

```solidity
function setDefaultOperatorSplit(uint16 split) external onlyOwner
```

Allows the Owner to set the default operator split in basis points.

This split is *used off-chain* when calculating Operator earnings for a given rewards distribution. Operator split is calculated as a percentage of the reward amount made out to each Operator. This split is deducted from the reward amount, after which the remainder is used to calculate rewards made to any Stakers delegated to the Operator.

*Effects*:
* Sets the `defaultOperatorSplitBips`
* Emits a `DefaultOperatorSplitBipsSet` event

*Requirements*:
* Caller MUST be the Owner

#### `setRewardsUpdater`

```solidity
function setRewardsUpdater(address _rewardsUpdater) external onlyOwner
```

Allows the Owner to set the `rewardsUpdater` address. The `rewardsUpdater` is the singleton address that can submit new `DistributionRoots` to the `RewardsCoordinator`. The `rewardsUpdater` is a trusted entity that performs the bulk of the calculations and merkle tree structuring described in this document.

*Effects*:
* Sets the global `rewardsUpdater` address
* Emits a `RewardsUpdaterSet` event

*Requirements*:
* Caller MUST be the Owner

#### `setRewardsForAllSubmitter`

```solidity
function setRewardsForAllSubmitter(address _submitter, bool _newValue) external onlyOwner
```

Allows the Owner to update the `_submitter's` permissions in the `isRewardsForAllSubmitter` mapping. This mapping is used to determine if a given address is a valid submitter for the `createRewardsForAllSubmission` method.

*Effects*:
* Sets the `isRewardsForAllSubmitter` mapping for the address `_submitter` to the bool `_newValue`
* Emits a `RewardsForAllSubmitterSet` event

*Requirements*:
* Caller MUST be the Owner

#### `setOperatorAVSsplit`

```solidity
function setOperatorAVSSplit(
    address operator,
    address avs,
    uint16 split
)
    external
    onlyWhenNotPaused(PAUSED_OPERATOR_AVS_SPLIT)
    checkCanCall(operator)
```

An Operator may, for a given AVS, set a split which will determine what percent of their attributed rewards are allocated to themselves. The remaining percentage will go to Stakers.

The split will take effect after an `activationDelay` set by the contract owner. Note that once an operator initiates a split update, the `activationDelay` must pass before a new split update can be initiated.

*Effects*:
* Updates `operatorSplit.activatedAt` to `block.timestamp + activationDelay`
* If the operator has not initialized yet, sets  `operatorSplit.oldSplitBips` to `defaultOperatorSplitBips`. Else sets `operatorSplit.oldSplitBips` to the current `newSplitBips`
* Updates `operatorSplit.newSplitBips` to `split`
* Emits an `OperatorAVSSplitBipsSet` event

*Requirements*:
* Caller MUST be authorized, either as the operator itself or an admin/appointee (see [`PermissionController.md`](../permissions/PermissionController.md))
* Split MUST BE <= 10,000 bips (100%)
* Current `block.timestamp` MUST BE greater than current `operatorSplit.activatedAt`.
  * Any pending split must have already completed prior to setting a new split.

#### `setOperatorPIsplit`

```solidity
function setOperatorPISplit(
    address operator,
    uint16 split
)
    external
    onlyWhenNotPaused(PAUSED_OPERATOR_PI_SPLIT)
    checkCanCall(operator)
```

Similar to [`setOperatorAVSSplit`](#setoperatoravssplit), Operators may set their split for [programmatic incentives](https://www.blog.eigenlayer.xyz/introducing-programmatic-incentives-v1/), allowing them to specify what percent of these rewards they will maintain and what percent will go to their Stakers. The `allocationDelay` also applies here, as well as the inability to reinitiate a split update before the delay passes.

*Effects*:
* See [`setOperatorAVSSplit`](#setoperatoravssplit) above. The only differences are that:
  * The split is stored within `_operatorPISplitBips` instead of `_operatorAVSSplitBips`.
  * An `OperatorPISplitBipsSet` event is emitted

*Requirements*:
* See [`setOperatorAVSSplit`](#setoperatoravssplit) above. The only difference is that:
  * Pause status is instead: `PAUSED_OPERATOR_PI_SPLIT`

#### `setOperatorSetSplit`

```solidity
function setOperatorSetSplit(
    address operator,
    OperatorSet calldata operatorSet,
    uint16 split
) 
    external 
    onlyWhenNotPaused(PAUSED_OPERATOR_SET_SPLIT) 
    checkCanCall(operator)
```

*Effects*:
* See [`setOperatorAVSSplit`](#setoperatoravssplit) above. The only difference is that:
  * The split is stored within `_operatorSetSplitBips` instead of `_operatorAVSSplitBips`
  * An `OperatorSetSplitBipsSet` event is emitted 

*Requirements*:
* See [`setOperatorAVSSplit`](#setoperatoravssplit) above. The only differences are that:
  * `operatorSet` MUST be a [registered operator set](./AllocationManager.md#createoperatorsets) for the given AVS as according to `allocationManager.isOperatorSet()`
  * Pause status is instead: `PAUSED_OPERATOR_SET_SPLIT`

---

### Rewards Merkle Tree Structure

This merkle tree is used to verify the claims against a `DistributionRoot`.

When submitting a new `DistributionRoot`, the rewards updater consolidates all `RewardsSubmissions` submitted by AVSs since the previously submitted `DistributionRoot` into a merkle tree comprised of earners and their cumulative earnings for their respective reward tokens distributed.

When an earner or their designated claimer calls `processClaim`, they must provide a `RewardsMerkleClaim` struct that contains the necessary information to verify their claim against the latest `DistributionRoot`. The merkle proof verification is done in the internal `_checkClaim` helper function. This function verifies the merkle proof of the earner's `EarnerTreeMerkleLeaf` against the `DistributionRoot` and then for each tokenIndex, verifies each token leaf against the earner's `earnerTokenRoot`.

Claimers can selectively choose which token leaves to prove against and claim accumulated earnings. Each token reward claimed in a `processClaim` call will send tokens to the `recipient` address specified in the call.

The rewards merkle tree is structured in the diagram below:

![.](../images/RewardsCoordinator_Merkle_Tree.png)

---

### Off Chain Calculation

Rewards are calculated via an off-chain data pipeline (the [EigenLayer Sidecar](https://github.com/Layr-Labs/sidecar)). The pipeline takes snapshots of core contract state at the `SNAPSHOT_CADENCE`, currently set to once per day. It then combines these snapshots with any active rewards to calculate what the single daily reward of an earner is. Every `CALCULATION_INTERVAL_SECONDS` rewards are accumulated up to `lastRewardsTimestamp + CALCULATION_INTERVAL_SECONDS` and posted on-chain by the entity with the `rewardsUpdater` role.

`MAX_REWARDS_AMOUNT` is set to `1e38-1` given the precision bounds of the off-chain pipeline. An in-depth overview of the off-chain calculation can be found [here](https://github.com/Layr-Labs/sidecar/blob/master/docs/docs/sidecar/rewards/calculation.md).
````

## File: docs/core/StrategyManager.md
````markdown
## StrategyManager

| File | Notes |
| -------- | -------- |
| [`StrategyManager.sol`](../../src/contracts/core/StrategyManager.sol) | singleton share manager hooked into core |
| [`StrategyManagerStorage.sol`](../../src/contracts/core/StrategyManagerStorage.sol) | state variables |
| [`IStrategyManager.sol`](../../src/contracts/interfaces/IStrategyManager.sol) | interface |

StrategyFactory:

| File | Notes |
| -------- | -------- |
| [`StrategyFactory.sol`](../../src/contracts/core/StrategyFactory.sol) | allows deployment of `StrategyBase` for ERC20 tokens |
| [`StrategyBase.sol`](../../src/contracts/strategies/StrategyBase.sol) | deployed as a beacon proxy via `StrategyFactory` |

Individual strategies:

| File | Notes |
| -------- | -------- |
| [`StrategyBaseTVLLimits.sol`](../../src/contracts/strategies/StrategyBaseTVLLimits.sol) | Pre-StrategyFactory, deployed for certain LSTs. Each instances uses a transparent proxy pattern |
| [`EigenStrategy.sol`](../../src/contracts/strategies/EigenStrategy.sol) | One-off strategy deployed to support EIGEN/bEIGEN |

## Overview

The primary function of the `StrategyManager` is to handle _deposit share_ accounting for individual stakers as they deposit and withdraw supported tokens from their corresponding strategies. Note that the `StrategyManager` only handles _deposit shares_. When the word _shares_ is used in this document, it refers to _deposit shares,_ specifically. For an explanation of other share types, see [Shares Accounting - Terminology](./accounting/SharesAccounting.md#terminology).

The `StrategyManager` is responsible for (i) allowing stakers to deposit tokens into the corresponding strategy, (ii) allowing the `DelegationManager` to remove deposit shares when a staker queues a withdrawal, and (iii) allowing the `DelegationManager` to complete a withdrawal by either adding deposit shares back to the staker or withdrawing the deposit shares as tokens via the corresponding strategy.

Any ERC20-compatible token can be supported by deploying a `StrategyBase` instance from the `StrategyFactory`. Under the hood, the `StrategyFactory` uses the beacon proxy pattern and only allows a strategy to be deployed once per token. Deployed strategies are automatically whitelists for deposit in the `StrategyManager`. For details, see [Strategies](#strategies) below.

**Note**: for the EIGEN/bEIGEN token specifically, the `EigenStrategy` contract is used instead of `StrategyBase`. Additionally, the EIGEN/bEIGEN token are blacklisted within the `StrategyFactory` to prevent duplicate strategies from being deployed for these tokens.

**Note**: for certain LST tokens, the `StrategyBaseTVLLimits` contract is used instead of `StrategyBase`. These strategies were deployed before the `StrategyFactory` allowed arbitrary ERC20 strategies. Unlike strategies deployed through the `StrategyFactory`, these `StrategyBaseTVLLimits` contracts use the transparent proxy pattern. For all intents and purposes, these instances behave the same as `StrategyBase` instances deployed from the `StrategyFactory`. The "TVL Limits" capability of these instances has never been used. Any tokens using one of these instances are blacklisted in the `StrategyFactory` to prevent duplicate strategies from being deployed for these tokens.

The `StrategyManager's` responsibilities can be broken down into the following concepts:
* [Depositing Into Strategies](#depositing-into-strategies)
* [Withdrawal Processing](#withdrawal-processing)
* [Burning Slashed Shares](#burning-slashed-shares)
* [Strategies](#strategies)
* [System Configuration](#system-configuration)

## Parameterization

* `MAX_TOTAL_SHARES = 1e38 - 1`
    * The maximum total shares a single strategy can handle. This maximum prevents overflow in offchain services. Deposits that would increase a strategy's total shares beyond this value will revert.
* `MAX_STAKER_STRATEGY_LIST_LENGTH = 32`
    * The maximum number of unique `StrategyManager` strategies a staker can have deposits in. Any deposits that cause this number to be exceeded will revert.
* `DEFAULT_BURN_ADDRESS = 0x00000000000000000000000000000000000E16E4`
    * When slashed shares are burned, they are converted to tokens and transferred to this address, where they are unrecoverable.

---

## Depositing Into Strategies

The following methods are called by stakers as they (i) deposit ERC20 tokens into strategies to receive deposit shares:

* [`StrategyManager.depositIntoStrategy`](#depositintostrategy)
* [`StrategyManager.depositIntoStrategyWithSignature`](#depositintostrategywithsignature)

Withdrawals are performed through the `DelegationManager` (see [`DelegationManager.md`](./DelegationManager.md)).

#### `depositIntoStrategy`

```solidity
/**
 * @notice Deposits `amount` of `token` into the specified `strategy` and credits shares to the caller
 * @param strategy the strategy that handles `token`
 * @param token the token from which the `amount` will be transferred
 * @param amount the number of tokens to deposit
 * @return depositShares the number of deposit shares credited to the caller
 * @dev The caller must have previously approved this contract to transfer at least `amount` of `token` on their behalf.
 * 
 * WARNING: Be extremely cautious when depositing tokens that do not strictly adhere to ERC20 standards.
 * Tokens that diverge significantly from ERC20 norms can cause unexpected behavior in token balances for
 * that strategy, e.g. ERC-777 tokens allowing cross-contract reentrancy.
 */
function depositIntoStrategy(
    IStrategy strategy,
    IERC20 token,
    uint256 amount
)
    external
    onlyWhenNotPaused(PAUSED_DEPOSITS)
    nonReentrant
    returns (uint256 depositShares)
```

Allows a staker to deposit some `amount` of `token` into the specified `strategy` in exchange for deposit shares in that strategy. The underlying `strategy` must be whitelisted for deposits, meaning it has either been deployed via the `StrategyFactory`, or is an existing `StrategyBaseTVLLimits/EigenStrategy` instance. The `token` parameter should correspond to the strategy's supported token.

The number of shares received is calculated by the `strategy` using an internal exchange rate that depends on the previous number of tokens deposited.

After processing a deposit, the `StrategyManager` forwards the deposit information to the `DelegationManager`, which updates the staker's deposit scaling factor and delegates shares to the staker's operator (if applicable). See [`DelegationManager.increaseDelegatedShares`](./DelegationManager.md#increasedelegatedshares) for details.

*Effects*:
* `token.safeTransferFrom`: Transfers `amount` of `token` to `strategy` on behalf of the caller.
* `StrategyManager` awards the staker with the newly-created deposit shares
* See [`StrategyBase.deposit`](#strategybasedeposit)
* See [`DelegationManager.increaseDelegatedShares`](./DelegationManager.md#increasedelegatedshares)

*Requirements*:
* Pause status MUST NOT be set: `PAUSED_DEPOSITS`
* Caller MUST allow at least `amount` of `token` to be transferred by `StrategyManager` to the strategy
* `strategy` in question MUST be whitelisted for deposits.
* See [`StrategyBaseTVLLimits.deposit`](#strategybasedeposit)

#### `depositIntoStrategyWithSignature`

```solidity
/**
 * @notice Deposits `amount` of `token` into the specified `strategy` and credits shares to the `staker`
 * Note tokens are transferred from `msg.sender`, NOT from `staker`. This method allows the caller, using a
 * signature, to deposit their tokens to another staker's balance.
 * @param strategy the strategy that handles `token`
 * @param token the token from which the `amount` will be transferred
 * @param amount the number of tokens to transfer from the caller to the strategy
 * @param staker the staker that the deposited assets will be credited to
 * @param expiry the timestamp at which the signature expires
 * @param signature a valid ECDSA or EIP-1271 signature from `staker`
 * @return depositShares the number of deposit shares credited to `staker`
 * @dev The caller must have previously approved this contract to transfer at least `amount` of `token` on their behalf.
 *
 * WARNING: Be extremely cautious when depositing tokens that do not strictly adhere to ERC20 standards.
 * Tokens that diverge significantly from ERC20 norms can cause unexpected behavior in token balances for
 * that strategy, e.g. ERC-777 tokens allowing cross-contract reentrancy.
 */
function depositIntoStrategyWithSignature(
    IStrategy strategy,
    IERC20 token,
    uint256 amount,
    address staker,
    uint256 expiry,
    bytes memory signature
)
    external
    onlyWhenNotPaused(PAUSED_DEPOSITS)
    nonReentrant
    returns (uint256 depositShares)
```

This method works like `depositIntoStrategy()`, transferring tokens _from the caller_ to the `strategy` contract. Unlike `depositIntoStrategy`, the resulting deposit shares are credited to the passed-in `staker` address, which must sign off on this intent.

*Effects*: See `depositIntoStrategy` above. Additionally:
* The staker's nonce is incremented

*Requirements*: See `depositIntoStrategy` above. Additionally:
* Caller MUST provide a valid, unexpired signature over the correct fields

---

## Withdrawal Processing

These methods are callable ONLY by the `DelegationManager`, and are used when processing undelegations and withdrawals:
* [`StrategyManager.removeDepositShares`](#removedepositshares)
* [`StrategyManager.addShares`](#addshares)
* [`StrategyManager.withdrawSharesAsTokens`](#withdrawsharesastokens)

See [`DelegationManager.md`](./DelegationManager.md) for more context on how these methods are used.

#### `removeDepositShares`

```solidity
/// @notice Used by the DelegationManager to remove a Staker's shares from a particular strategy when entering the withdrawal queue
/// @dev strategy must be beaconChainETH when talking to the EigenPodManager
function removeDepositShares(
    address staker,
    IStrategy strategy,
    uint256 depositSharesToRemove
)
    external
    onlyDelegationManager
```

The `DelegationManager` calls this method when a staker queues a withdrawal (or undelegates, which also queues a withdrawal). The staker's deposit shares are removed while the withdrawal is in the queue, and when the withdrawal is completed, the staker can choose whether to be re-awarded the shares, or to convert and receive them as tokens (`addShares` and `withdrawSharesAsTokens`, respectively).

The staker's deposit share balance for the `strategy` is decreased by the removed `depositSharesToRemove`. If this causes the staker's share balance to hit zero, the `strategy` is removed from the staker's strategy list.

Note that the amount of deposit shares removed while in the withdrawal queue may not equal the amount credited when the withdrawal is completed. The staker may receive fewer if slashing occurred; see [`DelegationManager.md`](./DelegationManager.md) for details.

*Effects*:
* Decrease the staker's deposit share balance for the given `strategy` by the given `depositSharesToRemove`
    * If this causes the balance to hit zero, the `strategy` is removed from the staker's strategy list

*Requirements*:
* Caller MUST be the `DelegationManager`
* `depositSharesToRemove` parameter MUST NOT be zero
* `staker` MUST have at least `depositSharesToRemove` balance for the given `strategy`

#### `addShares`

```solidity
/// @notice Used by the DelegationManager to award a Staker some shares that have passed through the withdrawal queue
/// @dev strategy must be beaconChainETH when talking to the EigenPodManager
/// @return existingDepositShares the shares the staker had before any were added
/// @return addedShares the new shares added to the staker's balance
function addShares(
    address staker,
    IStrategy strategy,
    uint256 shares
)
    external
    onlyDelegationManager
    returns (uint256, uint256)
```

The `DelegationManager` calls this method when a queued withdrawal is completed and the withdrawer specifies that they want to receive the withdrawal "as shares" (rather than as the underlying tokens). 

This method credits the input deposit shares to the staker. In most cases, the input `shares` equal the same shares originally removed when the withdrawal was queued. However, if the staker's operator was slashed, they may receive less. See [`DelegationManager.md`](./DelegationManager.md) for details.

**Note** that if the staker has deposits in `MAX_STAKER_STRATEGY_LIST_LENGTH` unique strategies (and the input `strategy` is not among them), this method will revert. The staker can still choose to complete the withdrawal "as tokens" (See [`DelegationManager.completeQueuedWithdrawal`](./DelegationManager.md#completequeuedwithdrawal)).

*Effects*:
* Increase the `staker's` deposit share balance for the given `strategy` by `shares`
    * If the prior balance was zero, the `strategy` is added to the `staker's` strategy list
* Emit a `Deposit` event

*Requirements*:
* Caller MUST be the `DelegationManager`
* `staker` parameter MUST NOT be zero
* `shares` parameter MUST NOT be zero
* Length of `stakerStrategyList` for the `staker` MUST NOT exceed `MAX_STAKER_STRATEGY_LIST_LENGTH`

#### `withdrawSharesAsTokens`

```solidity
/// @notice Used by the DelegationManager to convert deposit shares to tokens and send them to a staker
/// @dev strategy must be beaconChainETH when talking to the EigenPodManager
/// @dev token is not validated when talking to the EigenPodManager
function withdrawSharesAsTokens(
    address staker,
    IStrategy strategy,
    IERC20 token,
    uint256 shares
)
    external
    onlyDelegationManager
```

The `DelegationManager` calls this method when a queued withdrawal is completed and the withdrawer specifies that they want to receive the withdrawal as the tokens underlying the shares. 

This method directs the `strategy` to convert the input deposit shares to tokens and send them to the `staker`. In most cases, the input `shares` equal the same shares originally removed when the withdrawal was queued. However, if the staker's operator was slashed, they may receive less. See [`DelegationManager.md`](./DelegationManager.md) for details.

*Effects*:
* Calls [`StrategyBase.withdraw`](#strategybasewithdraw)

*Requirements*:
* Caller MUST be the `DelegationManager`
* See [`StrategyBase.withdraw`](#strategybasewithdraw)

---

## Increasing/Clearing Slashed Shares

Slashes shares are marked as burnable or redistributable. Anybody can call
`clearBurnOrRedistributableShares` to send tokens to the slash's `redistributionRecipient`. Shares to clear are stored in `_burnOrRedistributableShares`, a nested [EnumerableMap](https://github.com/OpenZeppelin/openzeppelin-contracts/blob/v4.9.0/contracts/utils/structs/EnumerableMap.sol). The operatorSet and slashId are used to index into the enumerableMap of strategies to shares. The following methods handle clearing burn or redistributable shares:
* [`StrategyManager.increaseBurnOrRedistributableShares`](#increaseburnorredistributableshares)
* [`StrategyManager.clearBurnOrRedistributableShares`](#clearBurnOrRedistributableShares)
* [`StrategyManager.clearBurnOrRedistributableSharesByStrategy](#clearburnorredistributableshares)
* [`StrategyManager.burnShares`](#burnshares) - Legacy burnShares function

#### `increaseBurnOrRedistributableShares`

```solidity
/**
 * @notice Increase the amount of burnable/redistributable shares for a given Strategy. This is called by the DelegationManager
 * when an operator is slashed in EigenLayer.
 * @param operatorSet The operator set to burn shares in.
 * @param slashId The slash id to burn shares in.
 * @param strategy The strategy to burn shares in.
 * @param addedSharesToBurn The amount of added shares to burn.
 * @dev This function is only called by the DelegationManager when an operator is slashed.
 */
function increaseBurnOrRedistributableShares(
    OperatorSet calldata operatorSet,
    uint256 slashId,
    IStrategy strategy,
    uint256 addedSharesToBurn
) external onlyDelegationManager;
```

The `DelegationManager` calls this method when an operator is slashed, calculating the number of slashable shares and marking them for burn or redistribution here.

Anyone can then convert the shares to tokens and trigger a burn via `burnShares`. This asynchronous method was added to mitigate potential DoS vectors when slashing.

*Effects*:
* Sets `burnOrRedistributableShares` for the given `operatorSet`, `slashId`, and `strategy`
* Emits a `BurnOrRedistributableSharesIncreased` event



*Requirements*:
* Can only be called by the `DelegationManager`
* The `burnOrRedistributableShares` for the given `operatorSet` and `slashId` must not contain the `strategy`


#### `clearBurnOrRedistributableShares` 

```solidity
/**
 * @notice Removes burned shares from storage and transfers the underlying tokens for the slashId to the slash escrow.
 * @param operatorSet The operator set to burn shares in.
 * @param slashId The slash ID to burn shares in.
 * @return The amounts of tokens transferred to the slash escrow for each strategy
 */
function clearBurnOrRedistributableShares(
    OperatorSet calldata operatorSet, 
    uint256 slashId) 
external returns (uint256[] memory);

/**
 * @notice Removes a single strategy's shares from storage and transfers the underlying tokens for the slashId to the slash escrow.
 * @param operatorSet The operator set to burn shares in.
 * @param slashId The slash ID to burn shares in.
 * @param strategy The strategy to burn shares in.
 * @return The amount of shares that were burned.
 */
function clearBurnOrRedistributableSharesByStrategy(
    OperatorSet calldata operatorSet,
    uint256 slashId,
    IStrategy strategy
) external returns (uint256);
```

Anyone can call this method to transfer slashed shares to the operator sets's `redistributionRecipient`. This method sets the `burnOrRedistributableShares` for the given `slashId` and `operatorSet` to 0. To accommodate the unlimited number of strategies that can be added to an operatorSet, users can also pass in a strategy to clear via `clearBurnOrRedistributableSharesByStrategy`. The strategies that haven not been cleared can be retrieved by calling `getBurnOrRedistributableShares(operatorSet, slashId)`. 

*Effects*:
* Resets the strategy's burn or redistributable shares for the operatorSet and slashId to 0
* If the shares to remove are nonzero:
    * Calls `withdraw` on the `strategy`, withdrawing shares and sending a corresponding amount of tokens to the operator sets's `redistributionRecipient`
    * Emits a `BurnOrRedistributableSharesDecreased`

#### `burnShares`

*Note: This is the legacy function for burning shares pre-redistribution. It will be deprecated sometime after the redistribution upgrade.*

```solidity
/**
 * @notice Legacy burn strategy shares for the given strategy by calling into the strategy to transfer
 * to the default burn address.
 * @param strategy The strategy to burn shares in.
 * @dev This function will be DEPRECATED in a release after redistribution
 */
function burnShares(
    IStrategy strategy
) external;
```

Anyone can call this method to burn slashed shares previously added by the `DelegationManager` via the now-deprecated `increaseBurnableShares`. This method resets the strategy's burnable shares to 0, and directs the corresponding `strategy` to convert the shares to tokens and transfer them to `DEFAULT_BURN_ADDRESS`, rendering them unrecoverable.

The `strategy` is not called if the strategy had no burnable shares.

*Effects*:
* Resets the strategy's burnable shares to 0
* Calls `withdraw` on the `strategy`, withdrawing shares and sending a corresponding amount of tokens to the `DEFAULT_BURN_ADDRESS`

---

## Strategies

**Concepts**:
* [StrategyBase vs StrategyBaseTVLLimits](#strategybase-vs-strategybasetvllimits)

**Methods**:
* [`StrategyBase.deposit`](#strategybasedeposit)
* [`StrategyBase.withdraw`](#strategybasewithdraw)
* [`StrategyFactory.deployNewStrategy`](#strategyfactorydeploynewstrategy)
* [`StrategyFactory.blacklistTokens`](#strategyfactoryblacklisttokens)
* [`StrategyFactory.whitelistStrategies`](#strategyfactorywhiteliststrategies)
* [`StrategyFactory.removeStrategiesFromWhitelist`](#strategyfactoryremovestrategiesfromwhitelist)

#### `StrategyBase` vs `StrategyBaseTVLLimits`

Before the introduction of the `StrategyFactory`, strategies were manually deployed and whitelisted in the `StrategyManager`. These strategies used `StrategyBaseTVLLimits.sol`, and were deployed using the transparent proxy pattern. With the introduction of the `StrategyFactory`, anyone can create a depositable strategy for any ERC20 (provided it does not have a deployed strategy yet). The `StrategyFactory` deploys beacon proxies, each of which points at a single implementation of `StrategyBase.sol`.

Though these are two different contracts, `StrategyBaseTVLLimits` inherits all its basic functionality from `StrategyBase`, and only implements a "TVL limits" capability on top of them. In short, this additional functionality checks, before each deposit, whether:
1. the deposit amount exceeds a configured `maxPerDeposit`
2. the total token balance after the deposit exceeds a configured `maxTotalDeposits`

To this date, however, these "TVL limits" capabilities have _never_ been used. The values for both of the variables mentioned above have been set to `type(uint).max` since deployment, and there is no plan to change these. Effectively, all instances of `StrategyBaseTVLLimits` behave identically to instances of `StrategyBase` - with the exception being that the former uses a transparent proxy, and the latter a beacon proxy.

#### `StrategyBase.deposit`

```solidity
/**
 * @notice Used to deposit tokens into this Strategy
 * @param token is the ERC20 token being deposited
 * @param amount is the amount of token being deposited
 * @dev This function is only callable by the strategyManager contract. It is invoked inside of the strategyManager's
 * `depositIntoStrategy` function, and individual share balances are recorded in the strategyManager as well.
 * @dev Note that the assumption is made that `amount` of `token` has already been transferred directly to this contract
 * (as performed in the StrategyManager's deposit functions). In particular, setting the `underlyingToken` of this contract
 * to be a fee-on-transfer token will break the assumption that the amount this contract *received* of the token is equal to
 * the amount that was input when the transfer was performed (i.e. the amount transferred 'out' of the depositor's balance).
 * @dev Note that any validation of `token` is done inside `_beforeDeposit`. This can be overridden if needed.
 * @return newShares is the number of new shares issued at the current exchange ratio.
 */
function deposit(
    IERC20 token,
    uint256 amount
)
    external
    onlyWhenNotPaused(PAUSED_DEPOSITS)
    onlyStrategyManager
    returns (uint256 newShares)
```

The `StrategyManager` calls this method when stakers deposit ERC20 tokens into a strategy. At the time this method is called, the tokens have already been transferred to the strategy. The role of this method is to (i) calculate the number of deposit shares the tokens represent according to the exchange rate, and (ii) add the new deposit shares to the strategy's recorded total shares.

The number of new shares created are returned to the `StrategyManager` to be added to the staker's strategy share balance.

*Effects*:
* `StrategyBaseTVLLimits.totalShares` is increased to account for the new shares created by the deposit

*Requirements*:
* Caller MUST be the `StrategyManager`
* Pause status MUST NOT be set: `PAUSED_DEPOSITS`
* The passed-in `token` MUST match the strategy's `underlyingToken`
* The token amount being deposited MUST NOT exceed the per-deposit cap
* When converted to shares via the strategy's exchange rate:
    * The `amount` of `token` deposited MUST represent at least 1 new share for the depositor
    * The new total shares awarded by the strategy MUST NOT exceed `MAX_TOTAL_SHARES`


#### `StrategyBase.withdraw`

```solidity
/**
 * @notice Used to withdraw tokens from this Strategy, to the `recipient`'s address
 * @param recipient is the address to receive the withdrawn funds
 * @param token is the ERC20 token being transferred out
 * @param amountShares is the amount of shares being withdrawn
 * @dev This function is only callable by the strategyManager contract. It is invoked inside of the strategyManager's
 * other functions, and individual share balances are recorded in the strategyManager as well.
 * @dev Note that any validation of `token` is done inside `_beforeWithdrawal`. This can be overridden if needed.
 * @return amountOut is the amount of tokens being transferred out.
 */
function withdraw(
    address recipient,
    IERC20 token,
    uint256 amountShares
)
    external
    onlyWhenNotPaused(PAUSED_WITHDRAWALS)
    onlyStrategyManager
    returns (uint256)
```

The `StrategyManager` calls this method to convert a number of deposit shares to tokens, and transfer them to a `recipient`. Typically, this method is invoked as part of the withdrawal completion flow (see [`DelegationManager.completeQueuedWithdrawal`](./DelegationManager.md#completequeuedwithdrawal)). However, this method may also be invoked during the share burning flow (see [`StrategyManager.burnShares`](#burnshares)).

This method converts the deposit shares back into tokens using the strategy's exchange rate. The strategy's total shares are decreased to reflect the withdrawal before transferring the tokens to the `recipient`.

*Effects*:
* `StrategyBaseTVLLimits.totalShares` is decreased to account for the shares being withdrawn
* `underlyingToken.safeTransfer` is called to transfer the tokens to the `recipient`
* Returns the amount of tokens the `recipient`` will receive

*Requirements*:
* Caller MUST be the `StrategyManager`
* Pause status MUST NOT be set: `PAUSED_WITHDRAWALS`
* The passed-in `token` MUST match the strategy's `underlyingToken`
* The `amountShares` being withdrawn MUST NOT exceed the `totalShares` in the strategy
* The tokens represented by `amountShares` MUST NOT exceed the strategy's token balance

#### `StrategyFactory.deployNewStrategy`

```solidity
/**
 * @notice Deploy a new StrategyBase contract for the ERC20 token, using a beacon proxy
 * @dev A strategy contract must not yet exist for the token.
 * @dev Immense caution is warranted for non-standard ERC20 tokens, particularly "reentrant" tokens
 * like those that conform to ERC777.
 */
function deployNewStrategy(IERC20 token)
    external
    onlyWhenNotPaused(PAUSED_NEW_STRATEGIES)
    returns (IStrategy newStrategy)
```

Allows anyone to deploy a new `StrategyBase` instance that supports deposits/withdrawals using the provided `token`. As part of calling this method, the `StrategyFactory` automatically whitelists the new strategy for deposits via the `StrategyManager`.

Note that the `StrategyFactory` only permits ONE strategy deployment per `token`. Once a `token` has an associated strategy deployed via this method, `deployNewStrategy` cannot be used to deploy a strategy for `token` again. Additionally, `deployNewStrategy` will reject any `token` placed onto the `StrategyFactory` blacklist. This feature was added to prevent the deployment of strategies that existed _before_ the `StrategyFactory` was created. For details, see [`StrategyFactory.blacklistTokens`](#strategyfactoryblacklisttokens).

**NOTE: Use caution when deploying strategies for tokens that do not strictly conform to ERC20 standards. Rebasing tokens similar to already-whitelisted LSTs should be supported, but please DYOR if your token falls outside of ERC20 norms.** Specific things to look out for include (but are not limited to): exotic rebasing tokens, tokens that support reentrant behavior (like ERC-777), and other nonstandard ERC20 derivatives.

*Effects*:
* Deploys a new `BeaconProxy` for the `token`, which references the current `StrategyBase` implementation
* Updates the `tokenStrategy` mapping for the `token`, preventing a second strategy deployment for the same token
* See `StrategyManager.addStrategiesToDepositWhitelist`

*Requirements*:
* Pause status MUST NOT be set: `PAUSED_NEW_STRATEGIES`
* `token` MUST NOT be blacklisted within `StrategyFactory`
* `StrategyFactory` MUST NOT have been used to deploy a strategy for `token` already
* See `StrategyManager.addStrategiesToDepositWhitelist`

#### `StrategyFactory.blacklistTokens`

```solidity
/**
 * @notice Owner-only function to prevent strategies from being created for given tokens.
 * @param tokens An array of token addresses to blacklist.
 */
function blacklistTokens(IERC20[] calldata tokens) 
    external 
    onlyOwner
```

Allows the owner to prevent certain `tokens` from having strategies deployed via `StrategyFactory.deployNewStrategy`. This method was added to prevent the deployment of strategies for tokens that already have strategies deployed/whitelisted through other means.

Note that once the owner adds tokens to the blacklist, they cannot be removed. This is a known limitation of the `StrategyFactory`, and can be addressed by upgrading the factory if needed.

*Effects*:
* Adds each token in `tokens` to the `isBlacklisted` mapping

*Requirements*:
* Caller MUST be the owner
* Each passed in `token` MUST NOT already be blacklisted

#### `StrategyFactory.whitelistStrategies`

```solidity
/**
 * @notice Owner-only function to pass through a call to `StrategyManager.addStrategiesToDepositWhitelist`
 */
function whitelistStrategies(
    IStrategy[] calldata strategiesToWhitelist
)
    external
    onlyOwner
```

Allows the owner to explicitly whitelist strategies in the `StrategyManager`. This method is used as a passthrough for the `StrategyManager.addStrategiesToDepositWhitelist`, in case the owner needs to whitelist strategies not deployed via the `StrategyFactory`.

*Effects*:
* See `StrategyManager.addStrategiesToDepositWhitelist`

*Requirements*:
* Caller MUST be the owner
* See `StrategyManager.addStrategiesToDepositWhitelist`

#### `StrategyFactory.removeStrategiesFromWhitelist`

```solidity
/**
 * @notice Owner-only function to pass through a call to `StrategyManager.removeStrategiesFromDepositWhitelist`
 */
function removeStrategiesFromWhitelist(
    IStrategy[] calldata strategiesToRemoveFromWhitelist
) 
    external
    onlyOwner
```

Allows the owner to remove strategies from the `StrategyManager` strategy whitelist. This method is used as a passthrough for the `StrategyManager.removeStrategiesFromDepositWhitelist`, in case the owner needs to access this method.

*Effects*:
* See `StrategyManager.removeStrategiesFromDepositWhitelist`

*Requirements*:
* Caller MUST be the owner
* See `StrategyManager.removeStrategiesFromDepositWhitelist`

---

## System Configuration

The Strategy Whitelister role has the ability to permit/remove strategies from being depositable via the `StrategyManager`. This role is held by the `StrategyFactory` (which is fully documented in [Strategies](#strategies)). The following methods concern the Strategy Whitelister role and its abilities within the `StrategyManager`:
* [`StrategyManager.setStrategyWhitelister`](#setstrategywhitelister)
* [`StrategyManager.addStrategiesToDepositWhitelist`](#addstrategiestodepositwhitelist)
* [`StrategyManager.removeStrategiesFromDepositWhitelist`](#removestrategiesfromdepositwhitelist)

#### `setStrategyWhitelister`

```solidity
/**
 * @notice Owner-only function to change the `strategyWhitelister` address.
 * @param newStrategyWhitelister new address for the `strategyWhitelister`.
 */
function setStrategyWhitelister(address newStrategyWhitelister) external onlyOwner
```

Allows the `owner` to update the Strategy Whitelister address. Currently, the Strategy Whitelister role is held by the `StrategyFactory`. See [Strategies](#strategies) for more details.

*Effects*:
* Updates `StrategyManager.strategyWhitelister`

*Requirements*:
* Caller MUST be the `owner`

#### `addStrategiesToDepositWhitelist`

```solidity
/**
 * @notice Owner-only function that adds the provided Strategies to the 'whitelist' of strategies that stakers can deposit into
 * @param strategiesToWhitelist Strategies that will be added to the `strategyIsWhitelistedForDeposit` mapping (if they aren't in it already)
 */
function addStrategiesToDepositWhitelist(
    IStrategy[] calldata strategiesToWhitelist
)
    external
    onlyStrategyWhitelister
```

Allows the Strategy Whitelister to add any number of strategies to the `StrategyManager` whitelist, and configure whether third party transfers are enabled or disabled for each. Strategies on the whitelist are eligible for deposit via `depositIntoStrategy`.

*Effects*:
* Adds entries to `StrategyManager.strategyIsWhitelistedForDeposit`

*Requirements*:
* Caller MUST be the `strategyWhitelister`

#### `removeStrategiesFromDepositWhitelist`

```solidity
/**
 * @notice Owner-only function that removes the provided Strategies from the 'whitelist' of strategies that stakers can deposit into
 * @param strategiesToRemoveFromWhitelist Strategies that will be removed to the `strategyIsWhitelistedForDeposit` mapping (if they are in it)
 */
function removeStrategiesFromDepositWhitelist(
    IStrategy[] calldata strategiesToRemoveFromWhitelist
)
    external
    onlyStrategyWhitelister
```

Allows the Strategy Whitelister to remove any number of strategies from the `StrategyManager` whitelist. The removed strategies will no longer be eligible for deposit via `depositIntoStrategy`. However, withdrawals for previously-whitelisted strategies may still be initiated and completed, as long as the staker has shares to withdraw.

*Effects*:
* Removes entries from `StrategyManager.strategyIsWhitelistedForDeposit`

*Requirements*:
* Caller MUST be the `strategyWhitelister`
````

## File: docs/experimental/AVS-Guide.md
````markdown
[middleware-folder-link]: https://github.com/Layr-Labs/eigenlayer-contracts/tree/master/src/contracts/middleware
[middleware-guide-link]: https://github.com/Layr-Labs/eigenlayer-contracts/blob/master/docs/AVS-Guide.md#quick-start-guide-to-build-avs-contracts
# Purpose
This document aims to describe and summarize how actively validated services (AVSs) building on EigenLayer interact with the core EigenLayer protocol. Currently, this doc explains how AVS developers can use the current** APIs for: 
- enabling operators to opt-in to the AVS,
- enabling operators to opt-out (withdraw stake) from the AVS,
- enabling operators to continuously update their commitments to middlewares, and
- enabling AVS to freeze operators for the purpose of slashing (the corresponding unfreeze actions are determined by the veto committee).

<p align="center"><b><font size="+1">
🚧 ** The Slasher contract is under active development and its interface is expected to change. We recommend writing slashing logic without integrating with the Slasher at this point in time. 🚧
</font></b><p>

We are currently in the process of implementing the API for rewards flow from AVSs to operators in EigenLayer. Details of this API will be added to this document in the near future.

The following figure summarizes the scope of this document: 
![Doc Outline](../images/middleware_outline_doc.png)


# Introduction
In designing EigenLayer, the EigenLabs team aspired to make minimal assumptions about the structure of AVSs built on top of it. If you are getting started looking at EigenLayer's codebase, the `Slasher.sol` contains most of the logic that actually mediates the interactions between EigenLayer and AVSs. Additionally, there is a general-purpose [/middleware/ folder][middleware-folder-link], which contains code that can be extended, used directly, or consulted as a reference in building an AVS on top of EigenLayer. Note that there will be a single, EigenLayer-owned, `Slasher.sol` contract, but all the `middleware` contracts are AVS-specific and need to be deployed separately by AVS teams.

## Important Terminology
- **Tasks** - A task in EigenLayer is the smallest unit of work that operators commit to perform when serving an AVS. These tasks may be associated with one or more slashing conditions applicable to the AVS. 
- **Strategies** - A strategy in EigenLayer is a contract that holds staker deposits, i.e. it controls one or more asset(s) that can be restaked. At launch EigenLayer will feature only simple strategies which may hold a single token. However, EigenLayer's strategy design is flexible and open, and in the future strategies could be deployed which implement more complex logic, including DeFi integrations. 
- **Quorums** - A quorum in EigenLayer is a grouping of specific kinds of stake who opt into an AVS while satisfying a particular trait. Examples of such traits could be stETH stakers or native stakers.  The purpose of having a quorum is that an AVS can customize the makeup of their security offering by choosing which kinds of stake/security they would like to utilize.  

# Key Design Considerations
1. *Decomposition into "Tasks"*: <br/>
    EigenLayer assumes that an AVS manages tasks that are executed over time by a registered operator. Each task is associated with the time period during which the AVS's operators' stakes are placed "at stake", i.e. potentially subject to slashing. Examples of tasks could be:
    - Hosting and serving a “DataStore” in the context of EigenDA
    - Posting a state root of another blockchain for a bridge service

2. *Stake is "At Stake" on Tasks for a Finite Duration*: <br/>
    It is assumed that every task (eventually) resolves. Each operator places their stake in EigenLayer “at stake” on the tasks that they perform. In order to “release” the stake (e.g. so the operator can withdraw their funds), these tasks need to eventually resolve. It is RECOMMENDED, but not required that a predefined duration is specified in the AVS contract for each task. As a guideline, the EigenLabs team believes that the duration of a task should be aligned with the longest reasonable duration that would be acceptable for an operator to keep funds “at stake”. An AVS builder should recognize that extending the duration of a task may impose significant negative externalities on the stakers of EigenLayer, and may disincentivize operators from opting-in to serving their application (so that they can attract more delegated stake).

3. *Services Slash Only Objectively Attributable Behavior*: <br/>
    EigenLayer is built to support slashing as a result of an on-chain-checkable, objectively attributable action. An AVS SHOULD slash in EigenLayer only for such provable and attributable behavior. It is expected that operators will be very hesitant to opt-in to services that slash for other types of behavior, and other services may even choose to exclude operators who have opted-in to serving one or more AVSs with such “subjective slashing conditions”, as these slashing conditions present a significant challenge for risk modeling, and may be perceived as more dangerous in general. Some examples of on-chain-checkable, objectively attributable behavior: 
    - double-signing a block in Ethereum, but NOT inactivity leak; 
    - proofs-of-custody in EigenDA, but NOT a node ceasing to serve data; 
    - a node in a light-node-bridge AVS signing an invalid block from another chain.

4. *Single Point-of-Interaction for Services and EigenLayer*: <br/>
    It is assumed that services have a single contract that coordinates the service’s communications sent to EigenLayer. This contract – referred to as the ServiceManager – informs EigenLayer of operator registration, updates, and deregistration, as well as signaling to EigenLayer when an operator should be slashed (frozen). An AVS has full control over how it splits the actual logic involved, but is expected to route all calls to EigenLayer through a single contract. While technically possible, an AVS SHOULD NOT use multiple contracts to interact with EigenLayer. An AVS architecture using multiple contracts to interact with EigenLayer will impose additional burden on stakers in EigenLayer when withdrawing stake.

## Integration with EigenLayer Contracts:
In this section, we will explain various API interfaces that EigenLayer provides which are essential for AVSs to integrate with EigenLayer. 

### *Operators Opting into AVS*
In order for any EigenLayer operator to be able to opt-in to an AVS, EigenLayer provides two interfaces: `optIntoSlashing(..)` and `recordFirstStakeUpdate(..)`. The sequential flow for opting into an AVS using these functions is as follows:
1. The operator first opts into slashing by calling  `Slasher.optIntoSlashing(..)`, where it has to specify the address of the AVS's ServiceManager contract in the argument. This step results in the operator giving permission to the AVS's ServiceManager contract to slash the operator via EigenLayer, if the operator is ever proven to have engaged in adversarial behavior while responding to the AVS's task. A successful call to  `Slasher.optIntoSlashing(..)` emits the `OptedIntoSlashing(..)` event.
2. Next, the operator needs to register with the AVS on chain via an AVS-specific registry contract (see [this][middleware-guide-link] section for examples). To integrate with EigenLayer, the AVS's Registry contract provides a registration endpoint that calls on the AVS's `ServiceManager.recordFirstStakeUpdate(..)` which in turn calls `Slasher.recordFirstStakeUpdate(..)`. On successful execution of this function call, the event `MiddlewareTimesAdded(..)` is emitted and the operator has to start serving the tasks from the AVS.

The following figure illustrates the above flow: 
![Operator opting-in](../images/operator_opting.png)

### *Staker Delegation to an Operator: Which Opts-In to AVSs*

A staker does not restake into AVSs. A staker delegates to an operator and it is the operator that registers for new AVSs (with the staker having option to opt-out).

By delegating to a specific operator, stakers are implicitly agreeing to the AVSs they support. If desired, operators can pursue off-chain consensus with stakers prior to modifying their AVSs. Moreover, stakers will have a grace period to withdraw their delegation should an operator introduce an AVS that doesn't align with their objectives. This grace period is configurable on an operator level.

### *AVS Visibility and Control*

An AVS registration function can blacklist another AVS contract and during registration check that the operator is not registered in that AVS. Or it can check that the operator has not given permission to that AVS's service manager to slash it.

An AVS registry contract should define quorums (eth LST quorum, erc20 quorum, etc.) and allow (or prefer) operators having a minimum amount of restaked assets in each of those quorums to register with the AVS.

### *Recording Stake Updates*
EigenLayer is a dynamic system where stakers and operators are constantly adjusting amounts of stake delegated via the system. It is therefore imperative for an AVS to be aware of any changes to stake delegated to its operators. In order to facilitate this, EigenLayer offers the `Slasher.recordStakeUpdate(..)`.

Let us illustrate the usage of this facility with an example: A staker has delegated to an operator, who has opted-in to serving an AVS. Whenever the staker withdraws some or all of its stake from EigenLayer, this withdrawal affects all the AVSs uniformly that the staker's delegated operator is participating in. The series of steps for withdrawing stake is as follows:
 - The staker queues their withdrawal request with EigenLayer. The staker can place this request by calling  `StrategyManager.queueWithdrawal(..)`.
 - The operator, noticing an upcoming change in their delegated stake, notifies the AVS about this change. To do this, the operator triggers the AVS to call the `ServiceManager.recordStakeUpdate(..)` which in turn accesses `Slasher.recordStakeUpdate(..)`.  On successful execution of this call, the event `MiddlewareTimesAdded(..)` is emitted.
- The AVS provider now is aware of the change in stake, and the staker can eventually complete their withdrawal.  Refer [here](https://github.com/Layr-Labs/eigenlayer-contracts/blob/master/docs/EigenLayer-withdrawal-flow.md) for more details

The following figure illustrates the above flow: 
![Stake update](../images/staker_withdrawing.png)

### *Deregistering from AVS*
In order for any EigenLayer operator to be able to de-register from an AVS, EigenLayer provides the interface `Slasher.recordLastStakeUpdateAndRevokeSlashingAbility(..)`. Essentially, in order for an operator to deregister from an AVS, the operator has to call `Slasher.recordLastStakeUpdateAndRevokeSlashingAbility(..)`  via the AVS's ServiceManager contract. It is important to note that the latest block number until which the operator is required to serve tasks for the service must be known by the service and included in the ServiceManager's call to `Slasher.recordLastStakeUpdateAndRevokeSlashingAbility`.

The following figure illustrates the above flow in which the operator calls the `deregister(..)` function in a sample Registry contract.
![Operator deregistering](../images/operator_deregister.png)

### *Slashing*
As mentioned above, EigenLayer is built to support slashing as a result of an on-chain-checkable, objectively attributable action. In order for an AVS to be able to slash an operator in an objective manner, the AVS needs to deploy a DisputeResolution contract which anyone can call to raise a challenge against an EigenLayer operator for its adversarial action. On successful challenge, the DisputeResolution contract calls `ServiceManager.freezeOperator(..)`; the ServiceManager in turn calls `Slasher.freezeOperator(..)` to freeze the operator in EigenLayer. EigenLayer's Slasher contract emits a `OperatorFrozen(..)` event whenever an operator is (successfully) frozen

The following figure illustrates the above flow: 
![Slashing](../images/slashing.png)


## Quick Start Guide to Build AVS Contracts:
The EigenLayer team has built a set of reusable and extensible contracts for use in AVSs built on top of EigenLayer. These are contained in the general-purpose [/middleware/ folder][middleware-folder-link], which contains code that can be extended, used directly, or consulted as a reference in building AVS on top of EigenLayer. There are several basic contracts that all AVS-specific contracts can be built on:
- The *VoteWeigherBase contract* tracks an operator’s “weight” in a given quorum, across all strategies that are associated with that quorum.  This contract also manages which strategies are in each quorum - this includes functionalities for both adding and removing strategies, as well as changing strategy weights.  
- The *RegistryBase contract* is a basic registry contract that can be used to track operators opted-into running an AVS.  Importantly, this base registry contract assumes a maximum of two quorums, where each quorum represents an aggregation of a certain type of stake. 

Furthermore, it’s expected that many AVSs will require a quorum of registered operators to sign on commitments.  To this end, the EigenLabs team has developed a set of contracts designed to optimize the cost of checking signatures through the use of a BLS aggregate signature scheme:
### BLSPublicKeyCompendium
This contract allows each Ethereum address to register a unique BLS public key; a single BLSPublicKeyCompendium contract can be shared amongst all AVSs using BLS signatures. <br/>
### BLSRegistry
This contract builds upon lower-level (RegistryBase and VoteWeigherBase) contracts, to allow users of EigenLayer to register as operators for a single AVS. Each AVS’s BLSRegistry keeps a historic record of the Aggregate Public Key (APK) of all operators of the AVS. To allow proper encoding of data and aggregation of signatures while avoiding race conditions (e.g. from operators registering or deregistering, causing the current APK to change), each task defines a referenceBlockNumber, which may be briefly in the past. The BLSRegistry defines an optional whitelister role, which controls whether or not the whitelist is enabled and can edit the whitelist. If the whitelist is enabled, then only addresses that have been whitelisted may opt-in to serving the AVS. <br/>   

In addition, the BLSRegistry (technically the lower-level RegistryBase which the BLSRegistry inherits from) defines a “minimum stake” for the quorum(s). An operator can only register for the AVS if they meet the minimum requirement for at least one quorum. By default the `ServiceManager.owner()` has the ability to change the minimum stake requirement(s). Each BLSRegistry defines one or two “quorums”; each operator for the AVS may have stake in EigenLayer that falls into either (or both) quorum(s). Each quorum is essentially defined by two vectors: a vector of “Strategies” of interest (in practice this ends up being tokens of interest) and a vector of “weights” or “multipliers”, which define whether certain strategies are weighed more heavily than others within the quorum (e.g. if the AVS desires to give 2x power to a specific token over another token). In the contract code these vectors are condensed into a single array of `StrategyAndWeightingMultiplier` structs. The `ServiceManager.owner()` has the ability to edit these arrays at will.

### BLSSignatureChecker
When signatures have been aggregated, they can be submitted to the BLSSignatureChecker, an optimized contract designed expressly for verifying quorums of BLS signers. The caller MUST provide a small amount of data corresponding to the task to be confirmed, the aggregate signature itself, and a bit of data for each non-signer, that is, the caller MUST provide data for each operator registered for the service for whom their signature has not been aggregated. The BLSSignatureChecker ultimately returns both the total stake that was present at the specified block number (i.e. the sum of all operator’s stakes) and the total stake that signed; these amounts can then be checked against a quorum condition (e.g. requiring ⅔ stake to sign) before the task is ultimately confirmed.
````

## File: docs/images/Staker Flow Diagrams/diagrams.excalidraw
````
{
  "type": "excalidraw",
  "version": 2,
  "source": "https://excalidraw.com",
  "elements": [
    {
      "type": "rectangle",
      "version": 1801,
      "versionNonce": 1412022419,
      "index": "b1y0G",
      "isDeleted": false,
      "id": "d7pRFde2mvhA75ZinOGRD",
      "fillStyle": "solid",
      "strokeWidth": 2,
      "strokeStyle": "solid",
      "roughness": 1,
      "opacity": 100,
      "angle": 0,
      "x": 1007.4642857142851,
      "y": 227.21428571428572,
      "strokeColor": "#1e1e1e",
      "backgroundColor": "#ffec99",
      "width": 455.8571428571431,
      "height": 114.99999999999997,
      "seed": 1964018507,
      "groupIds": [],
      "frameId": null,
      "roundness": {
        "type": 3
      },
      "boundElements": [
        {
          "type": "text",
          "id": "pr1eJhZG8MQGJxWd2tB0Y"
        },
        {
          "id": "LDZjamuIcsv5-Wrln_O_d",
          "type": "arrow"
        },
        {
          "id": "lS4fRSLZHIKN77q4fwuWo",
          "type": "arrow"
        },
        {
          "id": "pQuPzVRh8WjIFdRY2eKF5",
          "type": "arrow"
        }
      ],
      "updated": 1734360900715,
      "link": null,
      "locked": false
    },
    {
      "type": "text",
      "version": 1535,
      "versionNonce": 1316959251,
      "index": "b1y0V",
      "isDeleted": false,
      "id": "pr1eJhZG8MQGJxWd2tB0Y",
      "fillStyle": "solid",
      "strokeWidth": 2,
      "strokeStyle": "solid",
      "roughness": 1,
      "opacity": 100,
      "angle": 0,
      "x": 1155.6345258440285,
      "y": 275.1142857142857,
      "strokeColor": "#1e1e1e",
      "backgroundColor": "transparent",
      "width": 159.51666259765625,
      "height": 19.2,
      "seed": 1520221355,
      "groupIds": [],
      "frameId": null,
      "roundness": null,
      "boundElements": [],
      "updated": 1734113298835,
      "link": null,
      "locked": false,
      "fontSize": 16,
      "fontFamily": 3,
      "text": "DelegationManager",
      "textAlign": "center",
      "verticalAlign": "middle",
      "containerId": "d7pRFde2mvhA75ZinOGRD",
      "originalText": "DelegationManager",
      "autoResize": true,
      "lineHeight": 1.2
    },
    {
      "type": "rectangle",
      "version": 1595,
      "versionNonce": 1462533565,
      "index": "b1y1",
      "isDeleted": false,
      "id": "BjZJSI_MJK0uSe18cWEsM",
      "fillStyle": "solid",
      "strokeWidth": 2,
      "strokeStyle": "solid",
      "roughness": 1,
      "opacity": 100,
      "angle": 0,
      "x": 512.3474413621626,
      "y": 599.8323612009546,
      "strokeColor": "#1e1e1e",
      "backgroundColor": "#b2f2bb",
      "width": 223.00000000000006,
      "height": 114.99999999999997,
      "seed": 663150021,
      "groupIds": [],
      "frameId": null,
      "roundness": {
        "type": 3
      },
      "boundElements": [
        {
          "type": "text",
          "id": "SAKX-tjznJ9nB3OnPBiJo"
        },
        {
          "id": "LDZjamuIcsv5-Wrln_O_d",
          "type": "arrow"
        },
        {
          "id": "IVDpX9ZNHIWc1DEu-_MSJ",
          "type": "arrow"
        },
        {
          "id": "LzGvT9mueNtOL43AADrvA",
          "type": "arrow"
        }
      ],
      "updated": 1734360277639,
      "link": null,
      "locked": false
    },
    {
      "type": "text",
      "version": 1296,
      "versionNonce": 531611165,
      "index": "b1y1V",
      "isDeleted": false,
      "id": "SAKX-tjznJ9nB3OnPBiJo",
      "fillStyle": "solid",
      "strokeWidth": 2,
      "strokeStyle": "solid",
      "roughness": 1,
      "opacity": 100,
      "angle": 0,
      "x": 553.4724413621626,
      "y": 647.7323612009545,
      "strokeColor": "#1e1e1e",
      "backgroundColor": "transparent",
      "width": 140.75,
      "height": 19.2,
      "seed": 215014693,
      "groupIds": [],
      "frameId": null,
      "roundness": null,
      "boundElements": [],
      "updated": 1734360277639,
      "link": null,
      "locked": false,
      "fontSize": 16,
      "fontFamily": 3,
      "text": "EigenPodManager",
      "textAlign": "center",
      "verticalAlign": "middle",
      "containerId": "BjZJSI_MJK0uSe18cWEsM",
      "originalText": "EigenPodManager",
      "autoResize": true,
      "lineHeight": 1.2
    },
    {
      "type": "rectangle",
      "version": 671,
      "versionNonce": 108445629,
      "index": "b1y2",
      "isDeleted": false,
      "id": "hu48jItWXAGznv2MYPlfa",
      "fillStyle": "solid",
      "strokeWidth": 2,
      "strokeStyle": "solid",
      "roughness": 1,
      "opacity": 100,
      "angle": 0,
      "x": 739.7857142857142,
      "y": -686.6751012333061,
      "strokeColor": "#1e1e1e",
      "backgroundColor": "#a5d8ff",
      "width": 223.00000000000006,
      "height": 114.99999999999997,
      "seed": 1017310757,
      "groupIds": [],
      "frameId": null,
      "roundness": {
        "type": 3
      },
      "boundElements": [
        {
          "type": "text",
          "id": "k29t3JUZtaF8eQ7ad9dvG"
        }
      ],
      "updated": 1734360836083,
      "link": null,
      "locked": false
    },
    {
      "type": "text",
      "version": 408,
      "versionNonce": 811712541,
      "index": "b1y2G",
      "isDeleted": false,
      "id": "k29t3JUZtaF8eQ7ad9dvG",
      "fillStyle": "solid",
      "strokeWidth": 2,
      "strokeStyle": "solid",
      "roughness": 1,
      "opacity": 100,
      "angle": 0,
      "x": 780.9107142857142,
      "y": -638.7751012333061,
      "strokeColor": "#1e1e1e",
      "backgroundColor": "transparent",
      "width": 140.75,
      "height": 19.2,
      "seed": 1489756549,
      "groupIds": [],
      "frameId": null,
      "roundness": null,
      "boundElements": [],
      "updated": 1734360836083,
      "link": null,
      "locked": false,
      "fontSize": 16,
      "fontFamily": 3,
      "text": "StrategyManager",
      "textAlign": "center",
      "verticalAlign": "middle",
      "containerId": "hu48jItWXAGznv2MYPlfa",
      "originalText": "StrategyManager",
      "autoResize": true,
      "lineHeight": 1.2
    },
    {
      "type": "rectangle",
      "version": 2120,
      "versionNonce": 2064992157,
      "index": "b1y2V",
      "isDeleted": false,
      "id": "-WvgRiaL0QVDivEZ7r6Xc",
      "fillStyle": "solid",
      "strokeWidth": 2,
      "strokeStyle": "solid",
      "roughness": 1,
      "opacity": 100,
      "angle": 0,
      "x": 638.4580244801324,
      "y": 1117.635055046703,
      "strokeColor": "#1e1e1e",
      "backgroundColor": "#b2f2bb",
      "width": 135.00000000000006,
      "height": 114.99999999999997,
      "seed": 847130949,
      "groupIds": [
        "txawL17FR69jm-jT8VmVM"
      ],
      "frameId": null,
      "roundness": {
        "type": 3
      },
      "boundElements": [],
      "updated": 1734360277639,
      "link": null,
      "locked": false
    },
    {
      "type": "rectangle",
      "version": 2050,
      "versionNonce": 1134840829,
      "index": "b1y3",
      "isDeleted": false,
      "id": "tleLAbz09IPjqR2KmnNm8",
      "fillStyle": "solid",
      "strokeWidth": 2,
      "strokeStyle": "solid",
      "roughness": 1,
      "opacity": 100,
      "angle": 0,
      "x": 638.4580244801324,
      "y": 1082.635055046703,
      "strokeColor": "#1e1e1e",
      "backgroundColor": "#b2f2bb",
      "width": 135.00000000000006,
      "height": 114.99999999999997,
      "seed": 1955709093,
      "groupIds": [
        "txawL17FR69jm-jT8VmVM"
      ],
      "frameId": null,
      "roundness": {
        "type": 3
      },
      "boundElements": [],
      "updated": 1734360277639,
      "link": null,
      "locked": false
    },
    {
      "type": "rectangle",
      "version": 1999,
      "versionNonce": 1083425885,
      "index": "b1y3V",
      "isDeleted": false,
      "id": "aobl_RC8TILQJlluTfRQL",
      "fillStyle": "solid",
      "strokeWidth": 2,
      "strokeStyle": "solid",
      "roughness": 1,
      "opacity": 100,
      "angle": 0,
      "x": 638.4580244801324,
      "y": 1047.135055046703,
      "strokeColor": "#1e1e1e",
      "backgroundColor": "#b2f2bb",
      "width": 135.00000000000006,
      "height": 114.99999999999997,
      "seed": 3957765,
      "groupIds": [
        "txawL17FR69jm-jT8VmVM"
      ],
      "frameId": null,
      "roundness": {
        "type": 3
      },
      "boundElements": [],
      "updated": 1734360277639,
      "link": null,
      "locked": false
    },
    {
      "type": "rectangle",
      "version": 1925,
      "versionNonce": 1974808765,
      "index": "b1y4",
      "isDeleted": false,
      "id": "rIBNqVkwT_U14Ee5tTTXy",
      "fillStyle": "solid",
      "strokeWidth": 2,
      "strokeStyle": "solid",
      "roughness": 1,
      "opacity": 100,
      "angle": 0,
      "x": 638.4580244801324,
      "y": 1012.135055046703,
      "strokeColor": "#1e1e1e",
      "backgroundColor": "#b2f2bb",
      "width": 135.00000000000006,
      "height": 114.99999999999997,
      "seed": 964402021,
      "groupIds": [
        "txawL17FR69jm-jT8VmVM"
      ],
      "frameId": null,
      "roundness": {
        "type": 3
      },
      "boundElements": [],
      "updated": 1734360277639,
      "link": null,
      "locked": false
    },
    {
      "type": "rectangle",
      "version": 1990,
      "versionNonce": 1890193693,
      "index": "b1y4G",
      "isDeleted": false,
      "id": "vCqGpKBTk41RnVpK56dHk",
      "fillStyle": "solid",
      "strokeWidth": 2,
      "strokeStyle": "solid",
      "roughness": 1,
      "opacity": 100,
      "angle": 0,
      "x": 638.4580244801324,
      "y": 981.385055046703,
      "strokeColor": "#1e1e1e",
      "backgroundColor": "#b2f2bb",
      "width": 135.00000000000006,
      "height": 114.99999999999997,
      "seed": 866810155,
      "groupIds": [
        "txawL17FR69jm-jT8VmVM"
      ],
      "frameId": null,
      "roundness": {
        "type": 3
      },
      "boundElements": [
        {
          "id": "vNXvHpaNh61uq1U8du8yF",
          "type": "arrow"
        }
      ],
      "updated": 1734360277639,
      "link": null,
      "locked": false
    },
    {
      "type": "rectangle",
      "version": 1920,
      "versionNonce": 61091293,
      "index": "b1y4V",
      "isDeleted": false,
      "id": "IQBALGzyvaO99XKwSkIRH",
      "fillStyle": "solid",
      "strokeWidth": 2,
      "strokeStyle": "solid",
      "roughness": 1,
      "opacity": 100,
      "angle": 0,
      "x": 638.4580244801324,
      "y": 946.385055046703,
      "strokeColor": "#1e1e1e",
      "backgroundColor": "#b2f2bb",
      "width": 135.00000000000006,
      "height": 114.99999999999997,
      "seed": 2113412043,
      "groupIds": [
        "txawL17FR69jm-jT8VmVM"
      ],
      "frameId": null,
      "roundness": {
        "type": 3
      },
      "boundElements": [],
      "updated": 1734360277639,
      "link": null,
      "locked": false
    },
    {
      "type": "rectangle",
      "version": 1865,
      "versionNonce": 503081533,
      "index": "b1y5",
      "isDeleted": false,
      "id": "ApHGGX2G2KlFQna4mgGyW",
      "fillStyle": "solid",
      "strokeWidth": 2,
      "strokeStyle": "solid",
      "roughness": 1,
      "opacity": 100,
      "angle": 0,
      "x": 638.4580244801324,
      "y": 910.885055046703,
      "strokeColor": "#1e1e1e",
      "backgroundColor": "#b2f2bb",
      "width": 135.00000000000006,
      "height": 114.99999999999997,
      "seed": 906093349,
      "groupIds": [
        "txawL17FR69jm-jT8VmVM"
      ],
      "frameId": null,
      "roundness": {
        "type": 3
      },
      "boundElements": [
        {
          "id": "Erd3ee2INdOqhV26KPfNR",
          "type": "arrow"
        }
      ],
      "updated": 1734360277639,
      "link": null,
      "locked": false
    },
    {
      "type": "rectangle",
      "version": 1798,
      "versionNonce": 1322130077,
      "index": "b1y5V",
      "isDeleted": false,
      "id": "pO-cMQXuP3FqEK-VO2nH-",
      "fillStyle": "solid",
      "strokeWidth": 2,
      "strokeStyle": "solid",
      "roughness": 1,
      "opacity": 100,
      "angle": 0,
      "x": 638.4580244801324,
      "y": 875.885055046703,
      "strokeColor": "#1e1e1e",
      "backgroundColor": "#b2f2bb",
      "width": 135.00000000000006,
      "height": 114.99999999999997,
      "seed": 620990117,
      "groupIds": [
        "txawL17FR69jm-jT8VmVM"
      ],
      "frameId": null,
      "roundness": {
        "type": 3
      },
      "boundElements": [
        {
          "id": "Erd3ee2INdOqhV26KPfNR",
          "type": "arrow"
        }
      ],
      "updated": 1734360277639,
      "link": null,
      "locked": false
    },
    {
      "type": "rectangle",
      "version": 1717,
      "versionNonce": 1858780925,
      "index": "b1y6",
      "isDeleted": false,
      "id": "3B57LAKyPYCAagMZIplZn",
      "fillStyle": "solid",
      "strokeWidth": 2,
      "strokeStyle": "solid",
      "roughness": 1,
      "opacity": 100,
      "angle": 0,
      "x": 638.8330244801324,
      "y": 836.4544994911473,
      "strokeColor": "#1e1e1e",
      "backgroundColor": "#b2f2bb",
      "width": 135.00000000000006,
      "height": 114.99999999999997,
      "seed": 1867190251,
      "groupIds": [
        "txawL17FR69jm-jT8VmVM"
      ],
      "frameId": null,
      "roundness": {
        "type": 3
      },
      "boundElements": [
        {
          "type": "text",
          "id": "t-Fb9iJCrieEmdEJ8_Rze"
        },
        {
          "id": "Erd3ee2INdOqhV26KPfNR",
          "type": "arrow"
        },
        {
          "id": "vNXvHpaNh61uq1U8du8yF",
          "type": "arrow"
        },
        {
          "id": "LzGvT9mueNtOL43AADrvA",
          "type": "arrow"
        }
      ],
      "updated": 1734360277639,
      "link": null,
      "locked": false
    },
    {
      "type": "text",
      "version": 1455,
      "versionNonce": 1148442461,
      "index": "b1y6V",
      "isDeleted": false,
      "id": "t-Fb9iJCrieEmdEJ8_Rze",
      "fillStyle": "solid",
      "strokeWidth": 2,
      "strokeStyle": "solid",
      "roughness": 1,
      "opacity": 100,
      "angle": 0,
      "x": 650.0330252430718,
      "y": 874.7544994911473,
      "strokeColor": "#1e1e1e",
      "backgroundColor": "transparent",
      "width": 112.5999984741211,
      "height": 38.4,
      "seed": 249027211,
      "groupIds": [
        "txawL17FR69jm-jT8VmVM"
      ],
      "frameId": null,
      "roundness": null,
      "boundElements": [],
      "updated": 1734360277639,
      "link": null,
      "locked": false,
      "fontSize": 16,
      "fontFamily": 3,
      "text": "EigenPods\n(1 per user)",
      "textAlign": "center",
      "verticalAlign": "middle",
      "containerId": "3B57LAKyPYCAagMZIplZn",
      "originalText": "EigenPods\n(1 per user)",
      "autoResize": true,
      "lineHeight": 1.2
    },
    {
      "type": "rectangle",
      "version": 1675,
      "versionNonce": 1349154813,
      "index": "b1y7",
      "isDeleted": false,
      "id": "iN5d7A4GZ0ti1VZf0ejqo",
      "fillStyle": "solid",
      "strokeWidth": 2,
      "strokeStyle": "solid",
      "roughness": 1,
      "opacity": 100,
      "angle": 0,
      "x": 1009.5251238798216,
      "y": 892.1062215430579,
      "strokeColor": "#1e1e1e",
      "backgroundColor": "#b2f2bb",
      "width": 266.00000000000017,
      "height": 114.99999999999997,
      "seed": 1219437925,
      "groupIds": [],
      "frameId": null,
      "roundness": {
        "type": 3
      },
      "boundElements": [
        {
          "type": "text",
          "id": "A2WEASUqMm8xFmepnTzDB"
        }
      ],
      "updated": 1734360280457,
      "link": null,
      "locked": false
    },
    {
      "type": "text",
      "version": 1576,
      "versionNonce": 733245533,
      "index": "b1y7V",
      "isDeleted": false,
      "id": "A2WEASUqMm8xFmepnTzDB",
      "fillStyle": "solid",
      "strokeWidth": 2,
      "strokeStyle": "solid",
      "roughness": 1,
      "opacity": 100,
      "angle": 0,
      "x": 1072.1501238798216,
      "y": 940.0062215430579,
      "strokeColor": "#1e1e1e",
      "backgroundColor": "transparent",
      "width": 140.75,
      "height": 19.2,
      "seed": 1601149643,
      "groupIds": [],
      "frameId": null,
      "roundness": null,
      "boundElements": [],
      "updated": 1734360280457,
      "link": null,
      "locked": false,
      "fontSize": 16,
      "fontFamily": 3,
      "text": "EIP-4788 Oracle",
      "textAlign": "center",
      "verticalAlign": "middle",
      "containerId": "iN5d7A4GZ0ti1VZf0ejqo",
      "originalText": "EIP-4788 Oracle",
      "autoResize": true,
      "lineHeight": 1.2
    },
    {
      "type": "rectangle",
      "version": 1013,
      "versionNonce": 2043524221,
      "index": "b1y8",
      "isDeleted": false,
      "id": "uiNRUWY9ZI4zldFqQX2ve",
      "fillStyle": "solid",
      "strokeWidth": 2,
      "strokeStyle": "solid",
      "roughness": 1,
      "opacity": 100,
      "angle": 0,
      "x": 1112.5873015873017,
      "y": -618.2822440904488,
      "strokeColor": "#1e1e1e",
      "backgroundColor": "#a5d8ff",
      "width": 249.00000000000009,
      "height": 114.99999999999997,
      "seed": 1320455557,
      "groupIds": [
        "L8wotQa46OELUi4G_L_sv"
      ],
      "frameId": null,
      "roundness": {
        "type": 3
      },
      "boundElements": [],
      "updated": 1734360836083,
      "link": null,
      "locked": false
    },
    {
      "type": "rectangle",
      "version": 963,
      "versionNonce": 779885789,
      "index": "b1y8G",
      "isDeleted": false,
      "id": "VYDyjsUXdkxIKjcQeYM0U",
      "fillStyle": "solid",
      "strokeWidth": 2,
      "strokeStyle": "solid",
      "roughness": 1,
      "opacity": 100,
      "angle": 0,
      "x": 1111.5873015873017,
      "y": -652.2822440904488,
      "strokeColor": "#1e1e1e",
      "backgroundColor": "#a5d8ff",
      "width": 249.00000000000009,
      "height": 114.99999999999997,
      "seed": 707957989,
      "groupIds": [
        "L8wotQa46OELUi4G_L_sv"
      ],
      "frameId": null,
      "roundness": {
        "type": 3
      },
      "boundElements": [],
      "updated": 1734360836083,
      "link": null,
      "locked": false
    },
    {
      "type": "rectangle",
      "version": 959,
      "versionNonce": 637434173,
      "index": "b1y8V",
      "isDeleted": false,
      "id": "GbnSO6e5w-zEyXp65Rnum",
      "fillStyle": "solid",
      "strokeWidth": 2,
      "strokeStyle": "solid",
      "roughness": 1,
      "opacity": 100,
      "angle": 0,
      "x": 1110.0873015873017,
      "y": -685.2822440904488,
      "strokeColor": "#1e1e1e",
      "backgroundColor": "#a5d8ff",
      "width": 249.00000000000009,
      "height": 114.99999999999997,
      "seed": 1042837419,
      "groupIds": [
        "L8wotQa46OELUi4G_L_sv"
      ],
      "frameId": null,
      "roundness": {
        "type": 3
      },
      "boundElements": [],
      "updated": 1734360836083,
      "link": null,
      "locked": false
    },
    {
      "type": "rectangle",
      "version": 909,
      "versionNonce": 1236683165,
      "index": "b1y9",
      "isDeleted": false,
      "id": "kV7S0-ol5pVjW8kyCPtrs",
      "fillStyle": "solid",
      "strokeWidth": 2,
      "strokeStyle": "solid",
      "roughness": 1,
      "opacity": 100,
      "angle": 0,
      "x": 1109.0873015873017,
      "y": -719.2822440904488,
      "strokeColor": "#1e1e1e",
      "backgroundColor": "#a5d8ff",
      "width": 249.00000000000009,
      "height": 114.99999999999997,
      "seed": 179466635,
      "groupIds": [
        "L8wotQa46OELUi4G_L_sv"
      ],
      "frameId": null,
      "roundness": {
        "type": 3
      },
      "boundElements": [],
      "updated": 1734360836083,
      "link": null,
      "locked": false
    },
    {
      "type": "rectangle",
      "version": 748,
      "versionNonce": 1523912189,
      "index": "b1y9V",
      "isDeleted": false,
      "id": "cbvowATXbHy47R6SwBFKv",
      "fillStyle": "solid",
      "strokeWidth": 2,
      "strokeStyle": "solid",
      "roughness": 1,
      "opacity": 100,
      "angle": 0,
      "x": 1109.0873015873017,
      "y": -754.2822440904488,
      "strokeColor": "#1e1e1e",
      "backgroundColor": "#a5d8ff",
      "width": 249.00000000000009,
      "height": 114.99999999999997,
      "seed": 1541881157,
      "groupIds": [
        "L8wotQa46OELUi4G_L_sv"
      ],
      "frameId": null,
      "roundness": {
        "type": 3
      },
      "boundElements": [
        {
          "type": "text",
          "id": "k4w0cZ79L66VZfHSBBqgn"
        }
      ],
      "updated": 1734360836083,
      "link": null,
      "locked": false
    },
    {
      "type": "text",
      "version": 576,
      "versionNonce": 2019313245,
      "index": "b1yA",
      "isDeleted": false,
      "id": "k4w0cZ79L66VZfHSBBqgn",
      "fillStyle": "solid",
      "strokeWidth": 2,
      "strokeStyle": "solid",
      "roughness": 1,
      "opacity": 100,
      "angle": 0,
      "x": 1116.2956374637665,
      "y": -715.9822440904488,
      "strokeColor": "#1e1e1e",
      "backgroundColor": "transparent",
      "width": 234.5833282470703,
      "height": 38.4,
      "seed": 620317861,
      "groupIds": [
        "L8wotQa46OELUi4G_L_sv"
      ],
      "frameId": null,
      "roundness": null,
      "boundElements": [],
      "updated": 1734360836083,
      "link": null,
      "locked": false,
      "fontSize": 16,
      "fontFamily": 3,
      "text": "StrategyBaseWithTVLLimits\n(1 per LST)",
      "textAlign": "center",
      "verticalAlign": "middle",
      "containerId": "cbvowATXbHy47R6SwBFKv",
      "originalText": "StrategyBaseWithTVLLimits\n(1 per LST)",
      "autoResize": true,
      "lineHeight": 1.2
    },
    {
      "type": "rectangle",
      "version": 583,
      "versionNonce": 2113318749,
      "index": "b1yAG",
      "isDeleted": false,
      "id": "76JG-p1ALcSUWf9ES9oHk",
      "fillStyle": "solid",
      "strokeWidth": 2,
      "strokeStyle": "solid",
      "roughness": 1,
      "opacity": 100,
      "angle": 0,
      "x": 198.71351960124616,
      "y": -655.8585003996734,
      "strokeColor": "#1e1e1e",
      "backgroundColor": "#ffec99",
      "width": 223.00000000000006,
      "height": 114.99999999999997,
      "seed": 1785752133,
      "groupIds": [],
      "frameId": null,
      "roundness": {
        "type": 3
      },
      "boundElements": [
        {
          "type": "text",
          "id": "yWIuKnaZ9EYu8nW_E24gu"
        }
      ],
      "updated": 1734360838904,
      "link": null,
      "locked": false
    },
    {
      "type": "text",
      "version": 307,
      "versionNonce": 2105719741,
      "index": "b1yAV",
      "isDeleted": false,
      "id": "yWIuKnaZ9EYu8nW_E24gu",
      "fillStyle": "solid",
      "strokeWidth": 2,
      "strokeStyle": "solid",
      "roughness": 1,
      "opacity": 100,
      "angle": 0,
      "x": 253.91352036418562,
      "y": -607.9585003996734,
      "strokeColor": "#1e1e1e",
      "backgroundColor": "transparent",
      "width": 112.5999984741211,
      "height": 19.2,
      "seed": 1138022821,
      "groupIds": [],
      "frameId": null,
      "roundness": null,
      "boundElements": [],
      "updated": 1734360838904,
      "link": null,
      "locked": false,
      "fontSize": 16,
      "fontFamily": 3,
      "text": "AVSDirectory",
      "textAlign": "center",
      "verticalAlign": "middle",
      "containerId": "76JG-p1ALcSUWf9ES9oHk",
      "originalText": "AVSDirectory",
      "autoResize": true,
      "lineHeight": 1.2
    },
    {
      "type": "arrow",
      "version": 1384,
      "versionNonce": 294900467,
      "index": "b1yB",
      "isDeleted": false,
      "id": "Erd3ee2INdOqhV26KPfNR",
      "fillStyle": "solid",
      "strokeWidth": 2,
      "strokeStyle": "solid",
      "roughness": 1,
      "opacity": 100,
      "angle": 0,
      "x": 781.4119809434505,
      "y": 951.712889169279,
      "strokeColor": "#1e1e1e",
      "backgroundColor": "#ffec99",
      "width": 208.02818639382463,
      "height": 0.6787821649787702,
      "seed": 257411774,
      "groupIds": [],
      "frameId": null,
      "roundness": {
        "type": 2
      },
      "boundElements": [],
      "updated": 1734360277648,
      "link": null,
      "locked": false,
      "startBinding": {
        "elementId": "3B57LAKyPYCAagMZIplZn",
        "focus": 0.9964165782256912,
        "gap": 7.578956463317979,
        "fixedPoint": null
      },
      "endBinding": null,
      "lastCommittedPoint": null,
      "startArrowhead": null,
      "endArrowhead": "triangle",
      "points": [
        [
          0,
          0
        ],
        [
          208.02818639382463,
          0.6787821649787702
        ]
      ]
    },
    {
      "type": "text",
      "version": 472,
      "versionNonce": 157466845,
      "index": "b1yBV",
      "isDeleted": false,
      "id": "FQ0Osc5fg3FuRYzXUG7wf",
      "fillStyle": "solid",
      "strokeWidth": 2,
      "strokeStyle": "solid",
      "roughness": 1,
      "opacity": 100,
      "angle": 0,
      "x": 788.0115959087037,
      "y": 857.3314836181316,
      "strokeColor": "#1e1e1e",
      "backgroundColor": "#ffec99",
      "width": 215.9166717529297,
      "height": 75,
      "seed": 126625186,
      "groupIds": [],
      "frameId": null,
      "roundness": null,
      "boundElements": [
        {
          "id": "Erd3ee2INdOqhV26KPfNR",
          "type": "arrow"
        }
      ],
      "updated": 1734360277639,
      "link": null,
      "locked": false,
      "fontSize": 20,
      "fontFamily": 1,
      "text": "3. Proof validated vs\nrecent beacon block\nheader",
      "textAlign": "left",
      "verticalAlign": "top",
      "containerId": null,
      "originalText": "3. Proof validated vs\nrecent beacon block\nheader",
      "autoResize": true,
      "lineHeight": 1.25
    },
    {
      "type": "arrow",
      "version": 2434,
      "versionNonce": 1411187837,
      "index": "b1yC",
      "isDeleted": false,
      "id": "LzGvT9mueNtOL43AADrvA",
      "fillStyle": "solid",
      "strokeWidth": 2,
      "strokeStyle": "solid",
      "roughness": 1,
      "opacity": 100,
      "angle": 0,
      "x": 705.4173021012218,
      "y": 827.5462212097732,
      "strokeColor": "#1e1e1e",
      "backgroundColor": "#ffec99",
      "width": 87.80438961267384,
      "height": 106.31901873897732,
      "seed": 1825768382,
      "groupIds": [],
      "frameId": null,
      "roundness": {
        "type": 2
      },
      "boundElements": [
        {
          "type": "text",
          "id": "9LXoq9DwZzpa_Fyv9Teu0"
        }
      ],
      "updated": 1734360312556,
      "link": null,
      "locked": false,
      "startBinding": {
        "elementId": "3B57LAKyPYCAagMZIplZn",
        "focus": 0.4689934907333594,
        "gap": 8.908278281374123,
        "fixedPoint": null
      },
      "endBinding": {
        "elementId": "BjZJSI_MJK0uSe18cWEsM",
        "focus": 0.3711161723740525,
        "gap": 6.394841269841322,
        "fixedPoint": null
      },
      "lastCommittedPoint": null,
      "startArrowhead": null,
      "endArrowhead": "triangle",
      "points": [
        [
          0,
          0
        ],
        [
          -87.80438961267384,
          -106.31901873897732
        ]
      ]
    },
    {
      "type": "text",
      "version": 189,
      "versionNonce": 1700401085,
      "index": "b1yCG",
      "isDeleted": false,
      "id": "9LXoq9DwZzpa_Fyv9Teu0",
      "fillStyle": "solid",
      "strokeWidth": 2,
      "strokeStyle": "solid",
      "roughness": 1,
      "opacity": 100,
      "angle": 0,
      "x": 568.7551738232053,
      "y": 749.3867118402845,
      "strokeColor": "#1e1e1e",
      "backgroundColor": "#ffc9c9",
      "width": 185.51986694335938,
      "height": 50,
      "seed": 518652962,
      "groupIds": [],
      "frameId": null,
      "roundness": null,
      "boundElements": [],
      "updated": 1734360311034,
      "link": null,
      "locked": false,
      "fontSize": 20,
      "fontFamily": 1,
      "text": "4. Staker awarded\ndeposit shares",
      "textAlign": "center",
      "verticalAlign": "middle",
      "containerId": "LzGvT9mueNtOL43AADrvA",
      "originalText": "4. Staker awarded  deposit shares",
      "autoResize": true,
      "lineHeight": 1.25
    },
    {
      "type": "ellipse",
      "version": 861,
      "versionNonce": 239332765,
      "index": "b1yCV",
      "isDeleted": false,
      "id": "aNLyHhgEK3ibcdWPwAb6V",
      "fillStyle": "solid",
      "strokeWidth": 2,
      "strokeStyle": "solid",
      "roughness": 1,
      "opacity": 100,
      "angle": 0,
      "x": 147.4758816229895,
      "y": 1025.724340760989,
      "strokeColor": "#1e1e1e",
      "backgroundColor": "#ffc9c9",
      "width": 108.75,
      "height": 105,
      "seed": 1412352510,
      "groupIds": [],
      "frameId": null,
      "roundness": {
        "type": 2
      },
      "boundElements": [
        {
          "id": "vNXvHpaNh61uq1U8du8yF",
          "type": "arrow"
        },
        {
          "type": "text",
          "id": "pvdmt5DJrZ55bLVP2537b"
        },
        {
          "id": "IVDpX9ZNHIWc1DEu-_MSJ",
          "type": "arrow"
        }
      ],
      "updated": 1734360277639,
      "link": null,
      "locked": false
    },
    {
      "type": "text",
      "version": 618,
      "versionNonce": 101593597,
      "index": "b1yD",
      "isDeleted": false,
      "id": "pvdmt5DJrZ55bLVP2537b",
      "fillStyle": "solid",
      "strokeWidth": 2,
      "strokeStyle": "solid",
      "roughness": 1,
      "opacity": 100,
      "angle": 0,
      "x": 173.2686171897942,
      "y": 1066.601234748695,
      "strokeColor": "#1e1e1e",
      "backgroundColor": "#ffc9c9",
      "width": 57.266666412353516,
      "height": 23,
      "seed": 298627006,
      "groupIds": [],
      "frameId": null,
      "roundness": null,
      "boundElements": [],
      "updated": 1734360277639,
      "link": null,
      "locked": false,
      "fontSize": 20,
      "fontFamily": 2,
      "text": "Staker",
      "textAlign": "center",
      "verticalAlign": "middle",
      "containerId": "aNLyHhgEK3ibcdWPwAb6V",
      "originalText": "Staker",
      "autoResize": true,
      "lineHeight": 1.15
    },
    {
      "type": "arrow",
      "version": 1890,
      "versionNonce": 1710398227,
      "index": "b1yDV",
      "isDeleted": false,
      "id": "vNXvHpaNh61uq1U8du8yF",
      "fillStyle": "solid",
      "strokeWidth": 2,
      "strokeStyle": "solid",
      "roughness": 1,
      "opacity": 100,
      "angle": 0,
      "x": 269.3765893531465,
      "y": 1102.7423950802493,
      "strokeColor": "#1e1e1e",
      "backgroundColor": "#ffc9c9",
      "width": 367.24347365786707,
      "height": 0.05830618139498256,
      "seed": 1119593122,
      "groupIds": [],
      "frameId": null,
      "roundness": {
        "type": 2
      },
      "boundElements": [],
      "updated": 1734360277648,
      "link": null,
      "locked": false,
      "startBinding": {
        "elementId": "aNLyHhgEK3ibcdWPwAb6V",
        "focus": 0.4672147590179739,
        "gap": 17.6893676636725,
        "fixedPoint": null
      },
      "endBinding": {
        "elementId": "vCqGpKBTk41RnVpK56dHk",
        "focus": -1.1091502390745562,
        "gap": 6.299033852151297,
        "fixedPoint": null
      },
      "lastCommittedPoint": null,
      "startArrowhead": null,
      "endArrowhead": "triangle",
      "points": [
        [
          0,
          0
        ],
        [
          367.24347365786707,
          -0.05830618139498256
        ]
      ]
    },
    {
      "type": "text",
      "version": 1038,
      "versionNonce": 1378536317,
      "index": "b1yE",
      "isDeleted": false,
      "id": "jcaRATQnUsA8qMWkGunCX",
      "fillStyle": "solid",
      "strokeWidth": 2,
      "strokeStyle": "solid",
      "roughness": 1,
      "opacity": 100,
      "angle": 0.0026774312006994094,
      "x": 287.9730286654003,
      "y": 985.9959243795562,
      "strokeColor": "#1e1e1e",
      "backgroundColor": "#ffc9c9",
      "width": 311.5333251953125,
      "height": 100,
      "seed": 1748858018,
      "groupIds": [],
      "frameId": null,
      "roundness": null,
      "boundElements": [
        {
          "id": "vNXvHpaNh61uq1U8du8yF",
          "type": "arrow"
        }
      ],
      "updated": 1734360277639,
      "link": null,
      "locked": false,
      "fontSize": 20,
      "fontFamily": 1,
      "text": "2. Supply proof of beacon chain\nvalidator with withdrawal\ncredentials pointed at Staker's\nEigenPod",
      "textAlign": "left",
      "verticalAlign": "top",
      "containerId": null,
      "originalText": "2. Supply proof of beacon chain\nvalidator with withdrawal\ncredentials pointed at Staker's\nEigenPod",
      "autoResize": true,
      "lineHeight": 1.25
    },
    {
      "type": "text",
      "version": 275,
      "versionNonce": 1226724317,
      "index": "b1yEV",
      "isDeleted": false,
      "id": "uQmR5duxL2YFGZTLLdDKu",
      "fillStyle": "solid",
      "strokeWidth": 2,
      "strokeStyle": "solid",
      "roughness": 1,
      "opacity": 100,
      "angle": 0,
      "x": 277.6544530515599,
      "y": 1121.1707693324174,
      "strokeColor": "#1e1e1e",
      "backgroundColor": "#ffc9c9",
      "width": 316.3500061035156,
      "height": 24,
      "seed": 623129890,
      "groupIds": [],
      "frameId": null,
      "roundness": null,
      "boundElements": [],
      "updated": 1734360277639,
      "link": null,
      "locked": false,
      "fontSize": 20,
      "fontFamily": 3,
      "text": "verifyWithdrawalCredentials",
      "textAlign": "left",
      "verticalAlign": "top",
      "containerId": null,
      "originalText": "verifyWithdrawalCredentials",
      "autoResize": true,
      "lineHeight": 1.2
    },
    {
      "type": "arrow",
      "version": 911,
      "versionNonce": 1699748733,
      "index": "b1yF",
      "isDeleted": false,
      "id": "LDZjamuIcsv5-Wrln_O_d",
      "fillStyle": "solid",
      "strokeWidth": 2,
      "strokeStyle": "solid",
      "roughness": 1,
      "opacity": 100,
      "angle": 0,
      "x": 670.8071239588882,
      "y": 593.3081513249739,
      "strokeColor": "#1e1e1e",
      "backgroundColor": "#ffc9c9",
      "width": 338.2683875544691,
      "height": 248.48315485174834,
      "seed": 846354786,
      "groupIds": [],
      "frameId": null,
      "roundness": {
        "type": 2
      },
      "boundElements": [
        {
          "type": "text",
          "id": "xcaW5b597i8KFqrKbe9_q"
        }
      ],
      "updated": 1734361148717,
      "link": null,
      "locked": false,
      "startBinding": {
        "elementId": "BjZJSI_MJK0uSe18cWEsM",
        "focus": -0.2118205902239549,
        "gap": 6.5242098759806595,
        "fixedPoint": null
      },
      "endBinding": {
        "elementId": "d7pRFde2mvhA75ZinOGRD",
        "focus": 0.4718620660053835,
        "gap": 2.6107107589399163,
        "fixedPoint": null
      },
      "lastCommittedPoint": null,
      "startArrowhead": null,
      "endArrowhead": "triangle",
      "points": [
        [
          0,
          0
        ],
        [
          338.2683875544691,
          -248.48315485174834
        ]
      ]
    },
    {
      "type": "text",
      "version": 320,
      "versionNonce": 1237168019,
      "index": "b1yFV",
      "isDeleted": false,
      "id": "xcaW5b597i8KFqrKbe9_q",
      "fillStyle": "solid",
      "strokeWidth": 2,
      "strokeStyle": "solid",
      "roughness": 1,
      "opacity": 100,
      "angle": 0,
      "x": 734.981417833779,
      "y": 394.0665738990997,
      "strokeColor": "#1e1e1e",
      "backgroundColor": "#ffc9c9",
      "width": 209.9197998046875,
      "height": 150,
      "seed": 1848652862,
      "groupIds": [],
      "frameId": null,
      "roundness": null,
      "boundElements": [],
      "updated": 1734361147616,
      "link": null,
      "locked": false,
      "fontSize": 20,
      "fontFamily": 1,
      "text": "5. If Staker is\ndelegated, update\nOperator's delegated\nshares based on\nstaker's increased\ndeposit shares",
      "textAlign": "center",
      "verticalAlign": "middle",
      "containerId": "LDZjamuIcsv5-Wrln_O_d",
      "originalText": "5. If Staker is delegated, update Operator's delegated shares based on staker's increased deposit shares",
      "autoResize": true,
      "lineHeight": 1.25
    },
    {
      "type": "text",
      "version": 594,
      "versionNonce": 1027723325,
      "index": "b1yG",
      "isDeleted": false,
      "id": "pgNm6zGufuhDI1ptkmCnq",
      "fillStyle": "solid",
      "strokeWidth": 2,
      "strokeStyle": "solid",
      "roughness": 1,
      "opacity": 100,
      "angle": 0,
      "x": 245.77111158020585,
      "y": 442.6588645705128,
      "strokeColor": "#1e1e1e",
      "backgroundColor": "#ffc9c9",
      "width": 281.1000061035156,
      "height": 64.39999999999999,
      "seed": 1380464190,
      "groupIds": [],
      "frameId": null,
      "roundness": null,
      "boundElements": [],
      "updated": 1734360277639,
      "link": null,
      "locked": false,
      "fontSize": 28,
      "fontFamily": 2,
      "text": "Staker Flow:\nDepositing Native ETH",
      "textAlign": "center",
      "verticalAlign": "top",
      "containerId": null,
      "originalText": "Staker Flow:\nDepositing Native ETH",
      "autoResize": true,
      "lineHeight": 1.15
    },
    {
      "type": "arrow",
      "version": 1278,
      "versionNonce": 1635725907,
      "index": "b1yGG",
      "isDeleted": false,
      "id": "IVDpX9ZNHIWc1DEu-_MSJ",
      "fillStyle": "solid",
      "strokeWidth": 2,
      "strokeStyle": "solid",
      "roughness": 1,
      "opacity": 100,
      "angle": 0,
      "x": 170.51159590870293,
      "y": 1022.5993428059394,
      "strokeColor": "#1e1e1e",
      "backgroundColor": "#ffc9c9",
      "width": 327.30210637174764,
      "height": 324.01338450211006,
      "seed": 503264766,
      "groupIds": [],
      "frameId": null,
      "roundness": {
        "type": 2
      },
      "boundElements": [
        {
          "type": "text",
          "id": "7X5j5XWcrfqZunL5LVn8P"
        }
      ],
      "updated": 1734360277648,
      "link": null,
      "locked": false,
      "startBinding": {
        "elementId": "aNLyHhgEK3ibcdWPwAb6V",
        "focus": -0.973783988334446,
        "gap": 10.907898277340259,
        "fixedPoint": null
      },
      "endBinding": {
        "elementId": "BjZJSI_MJK0uSe18cWEsM",
        "focus": -0.11991131074358848,
        "gap": 14.533739081712099,
        "fixedPoint": null
      },
      "lastCommittedPoint": null,
      "startArrowhead": null,
      "endArrowhead": "triangle",
      "points": [
        [
          0,
          0
        ],
        [
          135.43746691313794,
          -276.72474110745
        ],
        [
          327.30210637174764,
          -324.01338450211006
        ]
      ]
    },
    {
      "type": "text",
      "version": 271,
      "versionNonce": 1433013523,
      "index": "b1yGV",
      "isDeleted": false,
      "id": "7X5j5XWcrfqZunL5LVn8P",
      "fillStyle": "solid",
      "strokeWidth": 2,
      "strokeStyle": "solid",
      "roughness": 1,
      "opacity": 100,
      "angle": 0,
      "x": 221.2623046390588,
      "y": 634.6785714285717,
      "strokeColor": "#1e1e1e",
      "backgroundColor": "#ffc9c9",
      "width": 220.91983032226562,
      "height": 150,
      "seed": 1517705406,
      "groupIds": [],
      "frameId": null,
      "roundness": null,
      "boundElements": [],
      "updated": 1734359522384,
      "link": null,
      "locked": false,
      "fontSize": 20,
      "fontFamily": 1,
      "text": "1. Deploy EigenPod and\nstart up one or more\nbeacon chain\nvalidators with\nwithdrawal credentials\npointed at pod.",
      "textAlign": "center",
      "verticalAlign": "middle",
      "containerId": "IVDpX9ZNHIWc1DEu-_MSJ",
      "originalText": "1. Deploy EigenPod and start up one or more beacon chain validators with withdrawal credentials pointed at pod.",
      "autoResize": true,
      "lineHeight": 1.25
    },
    {
      "type": "rectangle",
      "version": 2123,
      "versionNonce": 1818185405,
      "index": "b1yH",
      "isDeleted": false,
      "id": "OoHImjROrg7WnQ4xzkpcv",
      "fillStyle": "solid",
      "strokeWidth": 2,
      "strokeStyle": "solid",
      "roughness": 1,
      "opacity": 100,
      "angle": 0,
      "x": 651.7118827829199,
      "y": 1717.428037405244,
      "strokeColor": "#1e1e1e",
      "backgroundColor": "#ffec99",
      "width": 455.8571428571431,
      "height": 114.99999999999997,
      "seed": 1897941602,
      "groupIds": [],
      "frameId": null,
      "roundness": {
        "type": 3
      },
      "boundElements": [
        {
          "type": "text",
          "id": "27hGMnQNsPM5Ow8ganeGX"
        },
        {
          "id": "UShknM2c1yF75IS4pc0Bs",
          "type": "arrow"
        },
        {
          "id": "5nPp_KJjwxHRLaooYuN1o",
          "type": "arrow"
        },
        {
          "id": "3paqcsWlpb_FIiY6I8Lko",
          "type": "arrow"
        },
        {
          "id": "uZdrle8wzDudz1Ky8EmR2",
          "type": "arrow"
        }
      ],
      "updated": 1734361800476,
      "link": null,
      "locked": false
    },
    {
      "type": "text",
      "version": 1852,
      "versionNonce": 33812339,
      "index": "b1yHV",
      "isDeleted": false,
      "id": "27hGMnQNsPM5Ow8ganeGX",
      "fillStyle": "solid",
      "strokeWidth": 2,
      "strokeStyle": "solid",
      "roughness": 1,
      "opacity": 100,
      "angle": 0,
      "x": 799.8821229126634,
      "y": 1765.328037405244,
      "strokeColor": "#1e1e1e",
      "backgroundColor": "transparent",
      "width": 159.51666259765625,
      "height": 19.2,
      "seed": 1697426978,
      "groupIds": [],
      "frameId": null,
      "roundness": null,
      "boundElements": [],
      "updated": 1734361205390,
      "link": null,
      "locked": false,
      "fontSize": 16,
      "fontFamily": 3,
      "text": "DelegationManager",
      "textAlign": "center",
      "verticalAlign": "middle",
      "containerId": "OoHImjROrg7WnQ4xzkpcv",
      "originalText": "DelegationManager",
      "autoResize": true,
      "lineHeight": 1.2
    },
    {
      "type": "rectangle",
      "version": 1652,
      "versionNonce": 1205018099,
      "index": "b1yI",
      "isDeleted": false,
      "id": "y-bDpBMyaFEbqM1dAyygO",
      "fillStyle": "solid",
      "strokeWidth": 2,
      "strokeStyle": "solid",
      "roughness": 1,
      "opacity": 100,
      "angle": 0,
      "x": 564.219819290857,
      "y": 2031.3248628020692,
      "strokeColor": "#1e1e1e",
      "backgroundColor": "#b2f2bb",
      "width": 223.00000000000006,
      "height": 114.99999999999997,
      "seed": 695638498,
      "groupIds": [],
      "frameId": null,
      "roundness": {
        "type": 3
      },
      "boundElements": [
        {
          "type": "text",
          "id": "OYjXOfgD4G99D0UzjCUa4"
        },
        {
          "id": "5nPp_KJjwxHRLaooYuN1o",
          "type": "arrow"
        }
      ],
      "updated": 1734361205390,
      "link": null,
      "locked": false
    },
    {
      "type": "text",
      "version": 1350,
      "versionNonce": 1312876435,
      "index": "b1yIG",
      "isDeleted": false,
      "id": "OYjXOfgD4G99D0UzjCUa4",
      "fillStyle": "solid",
      "strokeWidth": 2,
      "strokeStyle": "solid",
      "roughness": 1,
      "opacity": 100,
      "angle": 0,
      "x": 605.344819290857,
      "y": 2079.224862802069,
      "strokeColor": "#1e1e1e",
      "backgroundColor": "transparent",
      "width": 140.75,
      "height": 19.2,
      "seed": 1829572002,
      "groupIds": [],
      "frameId": null,
      "roundness": null,
      "boundElements": [],
      "updated": 1734361205390,
      "link": null,
      "locked": false,
      "fontSize": 16,
      "fontFamily": 3,
      "text": "EigenPodManager",
      "textAlign": "center",
      "verticalAlign": "middle",
      "containerId": "y-bDpBMyaFEbqM1dAyygO",
      "originalText": "EigenPodManager",
      "autoResize": true,
      "lineHeight": 1.2
    },
    {
      "type": "ellipse",
      "version": 1288,
      "versionNonce": 132376797,
      "index": "b1yIV",
      "isDeleted": false,
      "id": "_lflU-chf5oKUcaJ6h4iP",
      "fillStyle": "solid",
      "strokeWidth": 2,
      "strokeStyle": "solid",
      "roughness": 1,
      "opacity": 100,
      "angle": 0,
      "x": 83.42227628906892,
      "y": 1758.9697040719104,
      "strokeColor": "#1e1e1e",
      "backgroundColor": "#ffc9c9",
      "width": 108.75,
      "height": 105,
      "seed": 877827298,
      "groupIds": [],
      "frameId": null,
      "roundness": {
        "type": 2
      },
      "boundElements": [
        {
          "type": "text",
          "id": "dKgP0x4gTtpzyQ0k3fx7X"
        },
        {
          "id": "UShknM2c1yF75IS4pc0Bs",
          "type": "arrow"
        }
      ],
      "updated": 1734361240894,
      "link": null,
      "locked": false
    },
    {
      "type": "text",
      "version": 1042,
      "versionNonce": 411878717,
      "index": "b1yJ",
      "isDeleted": false,
      "id": "dKgP0x4gTtpzyQ0k3fx7X",
      "fillStyle": "solid",
      "strokeWidth": 2,
      "strokeStyle": "solid",
      "roughness": 1,
      "opacity": 100,
      "angle": 0,
      "x": 109.21501185587363,
      "y": 1799.8465980596168,
      "strokeColor": "#1e1e1e",
      "backgroundColor": "#ffc9c9",
      "width": 57.266666412353516,
      "height": 23,
      "seed": 1353820322,
      "groupIds": [],
      "frameId": null,
      "roundness": null,
      "boundElements": [],
      "updated": 1734361240894,
      "link": null,
      "locked": false,
      "fontSize": 20,
      "fontFamily": 2,
      "text": "Staker",
      "textAlign": "center",
      "verticalAlign": "middle",
      "containerId": "_lflU-chf5oKUcaJ6h4iP",
      "originalText": "Staker",
      "autoResize": true,
      "lineHeight": 1.15
    },
    {
      "type": "text",
      "version": 967,
      "versionNonce": 1354681267,
      "index": "b1yJV",
      "isDeleted": false,
      "id": "ldqJxq6Ymhs0S0M3Oeo2T",
      "fillStyle": "solid",
      "strokeWidth": 2,
      "strokeStyle": "solid",
      "roughness": 1,
      "opacity": 100,
      "angle": 0,
      "x": 188.83013064765873,
      "y": 1946.3208945481013,
      "strokeColor": "#1e1e1e",
      "backgroundColor": "#ffc9c9",
      "width": 290.1166687011719,
      "height": 64.39999999999999,
      "seed": 1058490146,
      "groupIds": [],
      "frameId": null,
      "roundness": null,
      "boundElements": [],
      "updated": 1734361205390,
      "link": null,
      "locked": false,
      "fontSize": 28,
      "fontFamily": 2,
      "text": "Staker Flow:\nQueueing a Withdrawal",
      "textAlign": "center",
      "verticalAlign": "top",
      "containerId": null,
      "originalText": "Staker Flow:\nQueueing a Withdrawal",
      "autoResize": true,
      "lineHeight": 1.15
    },
    {
      "type": "arrow",
      "version": 533,
      "versionNonce": 1822102941,
      "index": "b1yK",
      "isDeleted": false,
      "id": "UShknM2c1yF75IS4pc0Bs",
      "fillStyle": "solid",
      "strokeWidth": 2,
      "strokeStyle": "solid",
      "roughness": 1,
      "opacity": 100,
      "angle": 0,
      "x": 203.76971928374613,
      "y": 1823.2340121234956,
      "strokeColor": "#1e1e1e",
      "backgroundColor": "#ffc9c9",
      "width": 444.4312508007623,
      "height": 2.283485978642375,
      "seed": 1955708926,
      "groupIds": [],
      "frameId": null,
      "roundness": {
        "type": 2
      },
      "boundElements": [],
      "updated": 1734361240895,
      "link": null,
      "locked": false,
      "startBinding": {
        "elementId": "_lflU-chf5oKUcaJ6h4iP",
        "focus": 0.21762247876367694,
        "gap": 12.698369542443928,
        "fixedPoint": null
      },
      "endBinding": {
        "elementId": "OoHImjROrg7WnQ4xzkpcv",
        "focus": -0.8826906454351978,
        "gap": 3.51091269841163,
        "fixedPoint": null
      },
      "lastCommittedPoint": null,
      "startArrowhead": null,
      "endArrowhead": "triangle",
      "points": [
        [
          0,
          0
        ],
        [
          444.4312508007623,
          2.283485978642375
        ]
      ]
    },
    {
      "type": "text",
      "version": 224,
      "versionNonce": 1882176243,
      "index": "b1yKG",
      "isDeleted": false,
      "id": "-p_5qWmgqYtbWtGR7iAeW",
      "fillStyle": "solid",
      "strokeWidth": 2,
      "strokeStyle": "solid",
      "roughness": 1,
      "opacity": 100,
      "angle": 0,
      "x": 285.9276139074964,
      "y": 1837.487561214768,
      "strokeColor": "#1e1e1e",
      "backgroundColor": "#ffc9c9",
      "width": 281.25,
      "height": 48,
      "seed": 1827303778,
      "groupIds": [],
      "frameId": null,
      "roundness": null,
      "boundElements": [],
      "updated": 1734361205390,
      "link": null,
      "locked": false,
      "fontSize": 20,
      "fontFamily": 3,
      "text": "undelegate, redelegate, \nor queueWithdrawals",
      "textAlign": "center",
      "verticalAlign": "top",
      "containerId": null,
      "originalText": "undelegate, redelegate, \nor queueWithdrawals",
      "autoResize": true,
      "lineHeight": 1.2
    },
    {
      "type": "text",
      "version": 233,
      "versionNonce": 1721284221,
      "index": "b1yKV",
      "isDeleted": false,
      "id": "KzAAaAeuALvdgojxNjbs7",
      "fillStyle": "solid",
      "strokeWidth": 2,
      "strokeStyle": "solid",
      "roughness": 1,
      "opacity": 100,
      "angle": 0,
      "x": 218.01781375312828,
      "y": 1754.6780181142065,
      "strokeColor": "#1e1e1e",
      "backgroundColor": "#ffc9c9",
      "width": 393.69964599609375,
      "height": 50,
      "seed": 1121468350,
      "groupIds": [],
      "frameId": null,
      "roundness": null,
      "boundElements": [],
      "updated": 1734361237884,
      "link": null,
      "locked": false,
      "fontSize": 20,
      "fontFamily": 1,
      "text": "1. Initiate withdrawal of deposit shares\nfor LSTs, Native ETH, or both",
      "textAlign": "center",
      "verticalAlign": "top",
      "containerId": null,
      "originalText": "1. Initiate withdrawal of deposit shares\nfor LSTs, Native ETH, or both",
      "autoResize": true,
      "lineHeight": 1.25
    },
    {
      "type": "arrow",
      "version": 312,
      "versionNonce": 1014126707,
      "index": "b1yL",
      "isDeleted": false,
      "id": "5nPp_KJjwxHRLaooYuN1o",
      "fillStyle": "solid",
      "strokeWidth": 2,
      "strokeStyle": "solid",
      "roughness": 1,
      "opacity": 100,
      "angle": 0,
      "x": 742.5341158452547,
      "y": 1840.820894548101,
      "strokeColor": "#1e1e1e",
      "backgroundColor": "#ffc9c9",
      "width": 110.84284788508944,
      "height": 183.33333333333303,
      "seed": 2071062882,
      "groupIds": [],
      "frameId": null,
      "roundness": {
        "type": 2
      },
      "boundElements": [
        {
          "type": "text",
          "id": "oX28umVZ3JPHOhJbR9hcB"
        }
      ],
      "updated": 1734362077371,
      "link": null,
      "locked": false,
      "startBinding": {
        "elementId": "OoHImjROrg7WnQ4xzkpcv",
        "focus": 0.37027146266844296,
        "gap": 8.39285714285711,
        "fixedPoint": null
      },
      "endBinding": {
        "elementId": "y-bDpBMyaFEbqM1dAyygO",
        "focus": -0.5683425061782671,
        "gap": 7.170634920635166,
        "fixedPoint": null
      },
      "lastCommittedPoint": null,
      "startArrowhead": null,
      "endArrowhead": "triangle",
      "points": [
        [
          0,
          0
        ],
        [
          -110.84284788508944,
          183.33333333333303
        ]
      ]
    },
    {
      "type": "text",
      "version": 117,
      "versionNonce": 915396477,
      "index": "b1yLV",
      "isDeleted": false,
      "id": "oX28umVZ3JPHOhJbR9hcB",
      "fillStyle": "solid",
      "strokeWidth": 2,
      "strokeStyle": "solid",
      "roughness": 1,
      "opacity": 100,
      "angle": 0,
      "x": 578.5127730752955,
      "y": 1882.4875612147675,
      "strokeColor": "#1e1e1e",
      "backgroundColor": "#ffc9c9",
      "width": 217.19983765482903,
      "height": 100,
      "seed": 30379646,
      "groupIds": [],
      "frameId": null,
      "roundness": null,
      "boundElements": [],
      "updated": 1734362076301,
      "link": null,
      "locked": false,
      "fontSize": 20,
      "fontFamily": 1,
      "text": "4. Remove\ncorresponding deposit\nshares while\nwithdrawal is in queue",
      "textAlign": "center",
      "verticalAlign": "middle",
      "containerId": "5nPp_KJjwxHRLaooYuN1o",
      "originalText": "4. Remove corresponding deposit shares while withdrawal is in queue",
      "autoResize": true,
      "lineHeight": 1.25
    },
    {
      "type": "rectangle",
      "version": 762,
      "versionNonce": 1735007187,
      "index": "b1yM",
      "isDeleted": false,
      "id": "fgr-vhlkAfB4aNKWl1vBo",
      "fillStyle": "solid",
      "strokeWidth": 2,
      "strokeStyle": "solid",
      "roughness": 1,
      "opacity": 100,
      "angle": 0,
      "x": 977.3001764337146,
      "y": 2034.5947040719113,
      "strokeColor": "#1e1e1e",
      "backgroundColor": "#a5d8ff",
      "width": 223.00000000000006,
      "height": 114.99999999999997,
      "seed": 1155351458,
      "groupIds": [],
      "frameId": null,
      "roundness": {
        "type": 3
      },
      "boundElements": [
        {
          "type": "text",
          "id": "h0lFC_qYXovD547xr7zCV"
        },
        {
          "id": "3paqcsWlpb_FIiY6I8Lko",
          "type": "arrow"
        }
      ],
      "updated": 1734361205390,
      "link": null,
      "locked": false
    },
    {
      "type": "text",
      "version": 498,
      "versionNonce": 1107110259,
      "index": "b1yMV",
      "isDeleted": false,
      "id": "h0lFC_qYXovD547xr7zCV",
      "fillStyle": "solid",
      "strokeWidth": 2,
      "strokeStyle": "solid",
      "roughness": 1,
      "opacity": 100,
      "angle": 0,
      "x": 1018.4251764337146,
      "y": 2082.4947040719117,
      "strokeColor": "#1e1e1e",
      "backgroundColor": "transparent",
      "width": 140.75,
      "height": 19.2,
      "seed": 1098415970,
      "groupIds": [],
      "frameId": null,
      "roundness": null,
      "boundElements": [],
      "updated": 1734361205390,
      "link": null,
      "locked": false,
      "fontSize": 16,
      "fontFamily": 3,
      "text": "StrategyManager",
      "textAlign": "center",
      "verticalAlign": "middle",
      "containerId": "fgr-vhlkAfB4aNKWl1vBo",
      "originalText": "StrategyManager",
      "autoResize": true,
      "lineHeight": 1.2
    },
    {
      "type": "arrow",
      "version": 379,
      "versionNonce": 600938013,
      "index": "b1yN",
      "isDeleted": false,
      "id": "3paqcsWlpb_FIiY6I8Lko",
      "fillStyle": "solid",
      "strokeWidth": 2,
      "strokeStyle": "solid",
      "roughness": 1,
      "opacity": 100,
      "angle": 0,
      "x": 992.9125326314522,
      "y": 1839.453635696875,
      "strokeColor": "#1e1e1e",
      "backgroundColor": "#ffc9c9",
      "width": 152.49048544824382,
      "height": 186.66666666666606,
      "seed": 512599010,
      "groupIds": [],
      "frameId": null,
      "roundness": {
        "type": 2
      },
      "boundElements": [
        {
          "type": "text",
          "id": "zeElqxBoaWoookvFWk7QE"
        }
      ],
      "updated": 1734362080654,
      "link": null,
      "locked": false,
      "startBinding": {
        "elementId": "OoHImjROrg7WnQ4xzkpcv",
        "focus": -0.22029835777170426,
        "gap": 7.025598291631013,
        "fixedPoint": null
      },
      "endBinding": {
        "elementId": "fgr-vhlkAfB4aNKWl1vBo",
        "focus": 0.6972704914860178,
        "gap": 8.474401708370237,
        "fixedPoint": null
      },
      "lastCommittedPoint": null,
      "startArrowhead": null,
      "endArrowhead": "triangle",
      "points": [
        [
          0,
          0
        ],
        [
          152.49048544824382,
          186.66666666666606
        ]
      ]
    },
    {
      "type": "text",
      "version": 124,
      "versionNonce": 1464141555,
      "index": "b1yNV",
      "isDeleted": false,
      "id": "zeElqxBoaWoookvFWk7QE",
      "fillStyle": "solid",
      "strokeWidth": 2,
      "strokeStyle": "solid",
      "roughness": 1,
      "opacity": 100,
      "angle": 0,
      "x": 960.5578565281596,
      "y": 1882.786969030208,
      "strokeColor": "#1e1e1e",
      "backgroundColor": "#ffc9c9",
      "width": 217.19983765482903,
      "height": 100,
      "seed": 2125649826,
      "groupIds": [],
      "frameId": null,
      "roundness": null,
      "boundElements": [],
      "updated": 1734362079457,
      "link": null,
      "locked": false,
      "fontSize": 20,
      "fontFamily": 1,
      "text": "4. Remove\ncorresponding deposit\nshares while\nwithdrawal is in queue",
      "textAlign": "center",
      "verticalAlign": "middle",
      "containerId": "3paqcsWlpb_FIiY6I8Lko",
      "originalText": "4. Remove corresponding deposit shares while withdrawal is in queue",
      "autoResize": true,
      "lineHeight": 1.25
    },
    {
      "type": "rectangle",
      "version": 2236,
      "versionNonce": 219456563,
      "index": "b1yO",
      "isDeleted": false,
      "id": "HMOTYhgmt2kUR8Zl1vEhQ",
      "fillStyle": "solid",
      "strokeWidth": 2,
      "strokeStyle": "solid",
      "roughness": 1,
      "opacity": 100,
      "angle": 0,
      "x": 597.8047585425198,
      "y": 2620.875138540512,
      "strokeColor": "#1e1e1e",
      "backgroundColor": "#ffec99",
      "width": 455.8571428571431,
      "height": 114.99999999999997,
      "seed": 1749542178,
      "groupIds": [],
      "frameId": null,
      "roundness": {
        "type": 3
      },
      "boundElements": [
        {
          "type": "text",
          "id": "9Vck9P2kgcYLnAHDKMCOz"
        },
        {
          "id": "eDi3aeq3shWTkAvqzeyHF",
          "type": "arrow"
        },
        {
          "id": "TTmKNlPiKnQPMyN-Awpoc",
          "type": "arrow"
        },
        {
          "id": "8oDhid4AzUldXlmXntLbl",
          "type": "arrow"
        }
      ],
      "updated": 1734361190878,
      "link": null,
      "locked": false
    },
    {
      "type": "text",
      "version": 1966,
      "versionNonce": 1979164115,
      "index": "b1yOG",
      "isDeleted": false,
      "id": "9Vck9P2kgcYLnAHDKMCOz",
      "fillStyle": "solid",
      "strokeWidth": 2,
      "strokeStyle": "solid",
      "roughness": 1,
      "opacity": 100,
      "angle": 0,
      "x": 745.9749986722633,
      "y": 2668.7751385405127,
      "strokeColor": "#1e1e1e",
      "backgroundColor": "transparent",
      "width": 159.51666259765625,
      "height": 19.2,
      "seed": 840102114,
      "groupIds": [],
      "frameId": null,
      "roundness": null,
      "boundElements": [],
      "updated": 1734361190878,
      "link": null,
      "locked": false,
      "fontSize": 16,
      "fontFamily": 3,
      "text": "DelegationManager",
      "textAlign": "center",
      "verticalAlign": "middle",
      "containerId": "HMOTYhgmt2kUR8Zl1vEhQ",
      "originalText": "DelegationManager",
      "autoResize": true,
      "lineHeight": 1.2
    },
    {
      "type": "rectangle",
      "version": 1766,
      "versionNonce": 1216914515,
      "index": "b1yOV",
      "isDeleted": false,
      "id": "miN4w27CQFNxPcL7apF3C",
      "fillStyle": "solid",
      "strokeWidth": 2,
      "strokeStyle": "solid",
      "roughness": 1,
      "opacity": 100,
      "angle": 0,
      "x": 510.3126950504569,
      "y": 2934.771963937337,
      "strokeColor": "#1e1e1e",
      "backgroundColor": "#b2f2bb",
      "width": 223.00000000000006,
      "height": 114.99999999999997,
      "seed": 1845920930,
      "groupIds": [],
      "frameId": null,
      "roundness": {
        "type": 3
      },
      "boundElements": [
        {
          "type": "text",
          "id": "LH_Dxlusq3BFFI0jYoPF_"
        },
        {
          "id": "TTmKNlPiKnQPMyN-Awpoc",
          "type": "arrow"
        }
      ],
      "updated": 1734361190878,
      "link": null,
      "locked": false
    },
    {
      "type": "text",
      "version": 1464,
      "versionNonce": 2134286835,
      "index": "b1yP",
      "isDeleted": false,
      "id": "LH_Dxlusq3BFFI0jYoPF_",
      "fillStyle": "solid",
      "strokeWidth": 2,
      "strokeStyle": "solid",
      "roughness": 1,
      "opacity": 100,
      "angle": 0,
      "x": 551.4376950504569,
      "y": 2982.6719639373378,
      "strokeColor": "#1e1e1e",
      "backgroundColor": "transparent",
      "width": 140.75,
      "height": 19.2,
      "seed": 1439801442,
      "groupIds": [],
      "frameId": null,
      "roundness": null,
      "boundElements": [],
      "updated": 1734361190878,
      "link": null,
      "locked": false,
      "fontSize": 16,
      "fontFamily": 3,
      "text": "EigenPodManager",
      "textAlign": "center",
      "verticalAlign": "middle",
      "containerId": "miN4w27CQFNxPcL7apF3C",
      "originalText": "EigenPodManager",
      "autoResize": true,
      "lineHeight": 1.2
    },
    {
      "type": "ellipse",
      "version": 1364,
      "versionNonce": 316080435,
      "index": "b1yPV",
      "isDeleted": false,
      "id": "lciwwPyWIpXIstSEYo0zY",
      "fillStyle": "solid",
      "strokeWidth": 2,
      "strokeStyle": "solid",
      "roughness": 1,
      "opacity": 100,
      "angle": 0,
      "x": 59.88610774887013,
      "y": 2662.416805207179,
      "strokeColor": "#1e1e1e",
      "backgroundColor": "#ffc9c9",
      "width": 108.75,
      "height": 105,
      "seed": 356729890,
      "groupIds": [],
      "frameId": null,
      "roundness": {
        "type": 2
      },
      "boundElements": [
        {
          "type": "text",
          "id": "oRexr89IPDmIIbDsjlB_S"
        },
        {
          "id": "eDi3aeq3shWTkAvqzeyHF",
          "type": "arrow"
        }
      ],
      "updated": 1734361190878,
      "link": null,
      "locked": false
    },
    {
      "type": "text",
      "version": 1118,
      "versionNonce": 761684691,
      "index": "b1yQ",
      "isDeleted": false,
      "id": "oRexr89IPDmIIbDsjlB_S",
      "fillStyle": "solid",
      "strokeWidth": 2,
      "strokeStyle": "solid",
      "roughness": 1,
      "opacity": 100,
      "angle": 0,
      "x": 85.67884331567484,
      "y": 2703.2936991948854,
      "strokeColor": "#1e1e1e",
      "backgroundColor": "#ffc9c9",
      "width": 57.266666412353516,
      "height": 23,
      "seed": 105541602,
      "groupIds": [],
      "frameId": null,
      "roundness": null,
      "boundElements": [],
      "updated": 1734361190878,
      "link": null,
      "locked": false,
      "fontSize": 20,
      "fontFamily": 2,
      "text": "Staker",
      "textAlign": "center",
      "verticalAlign": "middle",
      "containerId": "lciwwPyWIpXIstSEYo0zY",
      "originalText": "Staker",
      "autoResize": true,
      "lineHeight": 1.15
    },
    {
      "type": "text",
      "version": 1165,
      "versionNonce": 1223952915,
      "index": "b1yQG",
      "isDeleted": false,
      "id": "JoojGAxv1vLPsyFreqRYg",
      "fillStyle": "solid",
      "strokeWidth": 2,
      "strokeStyle": "solid",
      "roughness": 1,
      "opacity": 100,
      "angle": 0,
      "x": 60.16467510843063,
      "y": 2854.76799568337,
      "strokeColor": "#1e1e1e",
      "backgroundColor": "#ffc9c9",
      "width": 419.6333312988281,
      "height": 64.39999999999999,
      "seed": 1828070306,
      "groupIds": [],
      "frameId": null,
      "roundness": null,
      "boundElements": [],
      "updated": 1734361190878,
      "link": null,
      "locked": false,
      "fontSize": 28,
      "fontFamily": 2,
      "text": "Staker Flow:\nCompleting Withdrawal as Shares",
      "textAlign": "center",
      "verticalAlign": "top",
      "containerId": null,
      "originalText": "Staker Flow:\nCompleting Withdrawal as Shares",
      "autoResize": true,
      "lineHeight": 1.15
    },
    {
      "type": "arrow",
      "version": 849,
      "versionNonce": 275206333,
      "index": "b1yQV",
      "isDeleted": false,
      "id": "eDi3aeq3shWTkAvqzeyHF",
      "fillStyle": "solid",
      "strokeWidth": 2,
      "strokeStyle": "solid",
      "roughness": 1,
      "opacity": 100,
      "angle": 0,
      "x": 180.22970805664283,
      "y": 2726.7025563613306,
      "strokeColor": "#1e1e1e",
      "backgroundColor": "#ffc9c9",
      "width": 414.0641377874654,
      "height": 2.2620428760758386,
      "seed": 863330146,
      "groupIds": [],
      "frameId": null,
      "roundness": {
        "type": 2
      },
      "boundElements": [],
      "updated": 1734361190885,
      "link": null,
      "locked": false,
      "startBinding": {
        "elementId": "lciwwPyWIpXIstSEYo0zY",
        "focus": 0.21762247876367327,
        "gap": 12.698369542443949,
        "fixedPoint": null
      },
      "endBinding": {
        "elementId": "HMOTYhgmt2kUR8Zl1vEhQ",
        "focus": -0.8826906454351975,
        "gap": 3.5109126984114596,
        "fixedPoint": null
      },
      "lastCommittedPoint": null,
      "startArrowhead": null,
      "endArrowhead": "triangle",
      "points": [
        [
          0,
          0
        ],
        [
          414.0641377874654,
          2.2620428760758386
        ]
      ]
    },
    {
      "type": "text",
      "version": 314,
      "versionNonce": 942727507,
      "index": "b1yR",
      "isDeleted": false,
      "id": "KPgJz2-1NWphbqelE6-3Z",
      "fillStyle": "solid",
      "strokeWidth": 2,
      "strokeStyle": "solid",
      "roughness": 1,
      "opacity": 100,
      "angle": 0,
      "x": 226.16885093037138,
      "y": 2740.934662350036,
      "strokeColor": "#1e1e1e",
      "backgroundColor": "#ffc9c9",
      "width": 292.9166564941406,
      "height": 24,
      "seed": 639050530,
      "groupIds": [],
      "frameId": null,
      "roundness": null,
      "boundElements": [],
      "updated": 1734361190878,
      "link": null,
      "locked": false,
      "fontSize": 20,
      "fontFamily": 3,
      "text": "completeQueuedWithdrawals",
      "textAlign": "center",
      "verticalAlign": "top",
      "containerId": null,
      "originalText": "completeQueuedWithdrawals",
      "autoResize": true,
      "lineHeight": 1.2
    },
    {
      "type": "text",
      "version": 411,
      "versionNonce": 684670707,
      "index": "b1yRV",
      "isDeleted": false,
      "id": "cEyESCGLOGOYOFv2oE-WX",
      "fillStyle": "solid",
      "strokeWidth": 2,
      "strokeStyle": "solid",
      "roughness": 1,
      "opacity": 100,
      "angle": 0,
      "x": 190.66051963154325,
      "y": 2657.601329016703,
      "strokeColor": "#1e1e1e",
      "backgroundColor": "#ffc9c9",
      "width": 343.9333190917969,
      "height": 50,
      "seed": 793407202,
      "groupIds": [],
      "frameId": null,
      "roundness": null,
      "boundElements": [],
      "updated": 1734361190878,
      "link": null,
      "locked": false,
      "fontSize": 20,
      "fontFamily": 1,
      "text": "1. After withdrawal delay, complete\nwithdrawal \"as shares\"",
      "textAlign": "center",
      "verticalAlign": "top",
      "containerId": null,
      "originalText": "1. After withdrawal delay, complete\nwithdrawal \"as shares\"",
      "autoResize": true,
      "lineHeight": 1.25
    },
    {
      "type": "arrow",
      "version": 664,
      "versionNonce": 513224691,
      "index": "b1yS",
      "isDeleted": false,
      "id": "TTmKNlPiKnQPMyN-Awpoc",
      "fillStyle": "solid",
      "strokeWidth": 2,
      "strokeStyle": "solid",
      "roughness": 1,
      "opacity": 100,
      "angle": 0,
      "x": 689.0054083910524,
      "y": 2744.267995683369,
      "strokeColor": "#1e1e1e",
      "backgroundColor": "#ffc9c9",
      "width": 110.84284788508944,
      "height": 183.33333333333303,
      "seed": 329138850,
      "groupIds": [],
      "frameId": null,
      "roundness": {
        "type": 2
      },
      "boundElements": [
        {
          "type": "text",
          "id": "hJNGWB18ZIUSw7JVTgc2K"
        }
      ],
      "updated": 1734363719393,
      "link": null,
      "locked": false,
      "startBinding": {
        "elementId": "HMOTYhgmt2kUR8Zl1vEhQ",
        "focus": 0.36883093359979874,
        "gap": 8.392857142856883,
        "fixedPoint": null
      },
      "endBinding": {
        "elementId": "miN4w27CQFNxPcL7apF3C",
        "focus": -0.5657552947899162,
        "gap": 7.170634920635166,
        "fixedPoint": null
      },
      "lastCommittedPoint": null,
      "startArrowhead": null,
      "endArrowhead": "triangle",
      "points": [
        [
          0,
          0
        ],
        [
          -110.84284788508944,
          183.33333333333303
        ]
      ]
    },
    {
      "type": "text",
      "version": 180,
      "versionNonce": 2100058109,
      "index": "b1ySG",
      "isDeleted": false,
      "id": "hJNGWB18ZIUSw7JVTgc2K",
      "fillStyle": "solid",
      "strokeWidth": 2,
      "strokeStyle": "solid",
      "roughness": 1,
      "opacity": 100,
      "angle": 0,
      "x": 534.7340656210931,
      "y": 2785.9346623500355,
      "strokeColor": "#1e1e1e",
      "backgroundColor": "#ffc9c9",
      "width": 197.69983765482903,
      "height": 100,
      "seed": 767663714,
      "groupIds": [],
      "frameId": null,
      "roundness": null,
      "boundElements": [],
      "updated": 1734363718346,
      "link": null,
      "locked": false,
      "fontSize": 20,
      "fontFamily": 1,
      "text": "4. Re-add deposit\nshares (by\nwithdrawable shares\namount)",
      "textAlign": "center",
      "verticalAlign": "middle",
      "containerId": "TTmKNlPiKnQPMyN-Awpoc",
      "originalText": "4. Re-add deposit shares (by withdrawable shares amount)",
      "autoResize": true,
      "lineHeight": 1.25
    },
    {
      "type": "rectangle",
      "version": 876,
      "versionNonce": 447503923,
      "index": "b1ySV",
      "isDeleted": false,
      "id": "FkjP9vIB5dinD6UIBMgml",
      "fillStyle": "solid",
      "strokeWidth": 2,
      "strokeStyle": "solid",
      "roughness": 1,
      "opacity": 100,
      "angle": 0,
      "x": 923.3930521933146,
      "y": 2938.04180520718,
      "strokeColor": "#1e1e1e",
      "backgroundColor": "#a5d8ff",
      "width": 223.00000000000006,
      "height": 114.99999999999997,
      "seed": 713261602,
      "groupIds": [],
      "frameId": null,
      "roundness": {
        "type": 3
      },
      "boundElements": [
        {
          "type": "text",
          "id": "5FKrWFg1DqsWunCD6mjB9"
        },
        {
          "id": "8oDhid4AzUldXlmXntLbl",
          "type": "arrow"
        }
      ],
      "updated": 1734361190878,
      "link": null,
      "locked": false
    },
    {
      "type": "text",
      "version": 612,
      "versionNonce": 747118547,
      "index": "b1yT",
      "isDeleted": false,
      "id": "5FKrWFg1DqsWunCD6mjB9",
      "fillStyle": "solid",
      "strokeWidth": 2,
      "strokeStyle": "solid",
      "roughness": 1,
      "opacity": 100,
      "angle": 0,
      "x": 964.5180521933146,
      "y": 2985.9418052071796,
      "strokeColor": "#1e1e1e",
      "backgroundColor": "transparent",
      "width": 140.75,
      "height": 19.2,
      "seed": 1154674146,
      "groupIds": [],
      "frameId": null,
      "roundness": null,
      "boundElements": [],
      "updated": 1734361190878,
      "link": null,
      "locked": false,
      "fontSize": 16,
      "fontFamily": 3,
      "text": "StrategyManager",
      "textAlign": "center",
      "verticalAlign": "middle",
      "containerId": "FkjP9vIB5dinD6UIBMgml",
      "originalText": "StrategyManager",
      "autoResize": true,
      "lineHeight": 1.2
    },
    {
      "type": "arrow",
      "version": 738,
      "versionNonce": 385988243,
      "index": "b1yTV",
      "isDeleted": false,
      "id": "8oDhid4AzUldXlmXntLbl",
      "fillStyle": "solid",
      "strokeWidth": 2,
      "strokeStyle": "solid",
      "roughness": 1,
      "opacity": 100,
      "angle": 0,
      "x": 939.8126988370193,
      "y": 2742.9007368321436,
      "strokeColor": "#1e1e1e",
      "backgroundColor": "#ffc9c9",
      "width": 152.49048544824382,
      "height": 186.66666666666606,
      "seed": 29286818,
      "groupIds": [],
      "frameId": null,
      "roundness": {
        "type": 2
      },
      "boundElements": [
        {
          "type": "text",
          "id": "D41UobT9h1xxCvSzfzvM6"
        }
      ],
      "updated": 1734363721965,
      "link": null,
      "locked": false,
      "startBinding": {
        "elementId": "HMOTYhgmt2kUR8Zl1vEhQ",
        "focus": -0.2232350156608123,
        "gap": 7.025598291631468,
        "fixedPoint": null
      },
      "endBinding": {
        "elementId": "FkjP9vIB5dinD6UIBMgml",
        "focus": 0.702364689952395,
        "gap": 8.474401708370351,
        "fixedPoint": null
      },
      "lastCommittedPoint": null,
      "startArrowhead": null,
      "endArrowhead": "triangle",
      "points": [
        [
          0,
          0
        ],
        [
          152.49048544824382,
          186.66666666666606
        ]
      ]
    },
    {
      "type": "text",
      "version": 138,
      "versionNonce": 1892574045,
      "index": "b1yU",
      "isDeleted": false,
      "id": "D41UobT9h1xxCvSzfzvM6",
      "fillStyle": "solid",
      "strokeWidth": 2,
      "strokeStyle": "solid",
      "roughness": 1,
      "opacity": 100,
      "angle": 0,
      "x": 917.2080227337267,
      "y": 2786.2340701654766,
      "strokeColor": "#1e1e1e",
      "backgroundColor": "#ffc9c9",
      "width": 197.69983765482903,
      "height": 100,
      "seed": 1819696482,
      "groupIds": [],
      "frameId": null,
      "roundness": null,
      "boundElements": [],
      "updated": 1734363721257,
      "link": null,
      "locked": false,
      "fontSize": 20,
      "fontFamily": 1,
      "text": "4. Re-add deposit\nshares (by\nwithdrawable shares\namount)",
      "textAlign": "center",
      "verticalAlign": "middle",
      "containerId": "8oDhid4AzUldXlmXntLbl",
      "originalText": "4. Re-add deposit shares (by withdrawable shares amount)",
      "autoResize": true,
      "lineHeight": 1.25
    },
    {
      "type": "rectangle",
      "version": 2427,
      "versionNonce": 393682109,
      "index": "b1yUG",
      "isDeleted": false,
      "id": "PQ83u0WAkad1B1o1C1iNi",
      "fillStyle": "solid",
      "strokeWidth": 2,
      "strokeStyle": "solid",
      "roughness": 1,
      "opacity": 100,
      "angle": 0,
      "x": 977.3043324551686,
      "y": 4051.854354948895,
      "strokeColor": "#1e1e1e",
      "backgroundColor": "#ffec99",
      "width": 455.8571428571431,
      "height": 114.99999999999997,
      "seed": 715186850,
      "groupIds": [],
      "frameId": null,
      "roundness": {
        "type": 3
      },
      "boundElements": [
        {
          "type": "text",
          "id": "WxM9bgcZ3WGnjASzoklsN"
        },
        {
          "id": "AxtNwGQnRh8fqQAYXPcB8",
          "type": "arrow"
        },
        {
          "id": "-2NlzuMn6PNtlfulLdjA7",
          "type": "arrow"
        },
        {
          "id": "BEr_TOZmKQdO6AcwFrKWb",
          "type": "arrow"
        },
        {
          "id": "1YDohtzXZZQMtHn9rNLZR",
          "type": "arrow"
        }
      ],
      "updated": 1734363560512,
      "link": null,
      "locked": false
    },
    {
      "type": "text",
      "version": 2148,
      "versionNonce": 1531870493,
      "index": "b1yUV",
      "isDeleted": false,
      "id": "WxM9bgcZ3WGnjASzoklsN",
      "fillStyle": "solid",
      "strokeWidth": 2,
      "strokeStyle": "solid",
      "roughness": 1,
      "opacity": 100,
      "angle": 0,
      "x": 1125.474572584912,
      "y": 4099.754354948895,
      "strokeColor": "#1e1e1e",
      "backgroundColor": "transparent",
      "width": 159.51666259765625,
      "height": 19.2,
      "seed": 191905378,
      "groupIds": [],
      "frameId": null,
      "roundness": null,
      "boundElements": [],
      "updated": 1734363560512,
      "link": null,
      "locked": false,
      "fontSize": 16,
      "fontFamily": 3,
      "text": "DelegationManager",
      "textAlign": "center",
      "verticalAlign": "middle",
      "containerId": "PQ83u0WAkad1B1o1C1iNi",
      "originalText": "DelegationManager",
      "autoResize": true,
      "lineHeight": 1.2
    },
    {
      "type": "ellipse",
      "version": 1466,
      "versionNonce": 153856765,
      "index": "b1yUl",
      "isDeleted": false,
      "id": "NQxdmwNFdM60dm5-JugHD",
      "fillStyle": "solid",
      "strokeWidth": 2,
      "strokeStyle": "solid",
      "roughness": 1,
      "opacity": 100,
      "angle": 0,
      "x": 266.05234832818553,
      "y": 4100.062688282228,
      "strokeColor": "#1e1e1e",
      "backgroundColor": "#ffc9c9",
      "width": 108.75,
      "height": 105,
      "seed": 846299554,
      "groupIds": [],
      "frameId": null,
      "roundness": {
        "type": 2
      },
      "boundElements": [
        {
          "type": "text",
          "id": "cor2pTfIUrALyeGhEkHT3"
        },
        {
          "id": "AxtNwGQnRh8fqQAYXPcB8",
          "type": "arrow"
        },
        {
          "id": "6wphfCZUznb3CeuzUuOTg",
          "type": "arrow"
        }
      ],
      "updated": 1734363560512,
      "link": null,
      "locked": false
    },
    {
      "type": "text",
      "version": 1218,
      "versionNonce": 1003963229,
      "index": "b1yV",
      "isDeleted": false,
      "id": "cor2pTfIUrALyeGhEkHT3",
      "fillStyle": "solid",
      "strokeWidth": 2,
      "strokeStyle": "solid",
      "roughness": 1,
      "opacity": 100,
      "angle": 0,
      "x": 291.84508389499024,
      "y": 4140.939582269934,
      "strokeColor": "#1e1e1e",
      "backgroundColor": "#ffc9c9",
      "width": 57.266666412353516,
      "height": 23,
      "seed": 768933218,
      "groupIds": [],
      "frameId": null,
      "roundness": null,
      "boundElements": [],
      "updated": 1734363560512,
      "link": null,
      "locked": false,
      "fontSize": 20,
      "fontFamily": 2,
      "text": "Staker",
      "textAlign": "center",
      "verticalAlign": "middle",
      "containerId": "NQxdmwNFdM60dm5-JugHD",
      "originalText": "Staker",
      "autoResize": true,
      "lineHeight": 1.15
    },
    {
      "type": "text",
      "version": 2048,
      "versionNonce": 306431101,
      "index": "b1yVG",
      "isDeleted": false,
      "id": "LsXGoQ1gtpREiel6zNv0A",
      "fillStyle": "solid",
      "strokeWidth": 2,
      "strokeStyle": "solid",
      "roughness": 1,
      "opacity": 100,
      "angle": 0,
      "x": 367.58091823087784,
      "y": 4294.080545425084,
      "strokeColor": "#1e1e1e",
      "backgroundColor": "#ffc9c9",
      "width": 250.46665954589844,
      "height": 128.79999999999998,
      "seed": 785580322,
      "groupIds": [],
      "frameId": null,
      "roundness": null,
      "boundElements": [],
      "updated": 1734363560512,
      "link": null,
      "locked": false,
      "fontSize": 28,
      "fontFamily": 2,
      "text": "Staker Flow:\nCompleting a Native\nETH Withdrawal\nAs Tokens",
      "textAlign": "center",
      "verticalAlign": "top",
      "containerId": null,
      "originalText": "Staker Flow:\nCompleting a Native\nETH Withdrawal\nAs Tokens",
      "autoResize": true,
      "lineHeight": 1.15
    },
    {
      "type": "arrow",
      "version": 1381,
      "versionNonce": 287695827,
      "index": "b1yVV",
      "isDeleted": false,
      "id": "AxtNwGQnRh8fqQAYXPcB8",
      "fillStyle": "solid",
      "strokeWidth": 2,
      "strokeStyle": "solid",
      "roughness": 1,
      "opacity": 100,
      "angle": 0,
      "x": 386.5051575541728,
      "y": 4163.754307029607,
      "strokeColor": "#1e1e1e",
      "backgroundColor": "#ffc9c9",
      "width": 587.2882622025842,
      "height": 2.0989984505267785,
      "seed": 819629282,
      "groupIds": [],
      "frameId": null,
      "roundness": {
        "type": 2
      },
      "boundElements": [],
      "updated": 1734363560521,
      "link": null,
      "locked": false,
      "startBinding": {
        "elementId": "NQxdmwNFdM60dm5-JugHD",
        "focus": 0.21767058936200775,
        "gap": 12.698184619725637,
        "fixedPoint": null
      },
      "endBinding": {
        "elementId": "PQ83u0WAkad1B1o1C1iNi",
        "focus": -0.882690645435168,
        "gap": 3.51091269841163,
        "fixedPoint": null
      },
      "lastCommittedPoint": null,
      "startArrowhead": null,
      "endArrowhead": "triangle",
      "points": [
        [
          0,
          0
        ],
        [
          587.2882622025842,
          -2.0989984505267785
        ]
      ]
    },
    {
      "type": "text",
      "version": 410,
      "versionNonce": 70289725,
      "index": "b1yW",
      "isDeleted": false,
      "id": "i-HUeFuIj_CNiK4aocZiK",
      "fillStyle": "solid",
      "strokeWidth": 2,
      "strokeStyle": "solid",
      "roughness": 1,
      "opacity": 100,
      "angle": 0,
      "x": 452.3350915096869,
      "y": 4180.247212091752,
      "strokeColor": "#1e1e1e",
      "backgroundColor": "#ffc9c9",
      "width": 292.9166564941406,
      "height": 24,
      "seed": 1769644194,
      "groupIds": [],
      "frameId": null,
      "roundness": null,
      "boundElements": [],
      "updated": 1734363560512,
      "link": null,
      "locked": false,
      "fontSize": 20,
      "fontFamily": 3,
      "text": "completeQueuedWithdrawals",
      "textAlign": "center",
      "verticalAlign": "top",
      "containerId": null,
      "originalText": "completeQueuedWithdrawals",
      "autoResize": true,
      "lineHeight": 1.2
    },
    {
      "type": "text",
      "version": 531,
      "versionNonce": 925260189,
      "index": "b1yWV",
      "isDeleted": false,
      "id": "J8KNcgeeIIyPrjuezAJWw",
      "fillStyle": "solid",
      "strokeWidth": 2,
      "strokeStyle": "solid",
      "roughness": 1,
      "opacity": 100,
      "angle": 0,
      "x": 433.4934268775253,
      "y": 4101.91387875842,
      "strokeColor": "#1e1e1e",
      "backgroundColor": "#ffc9c9",
      "width": 343.9333190917969,
      "height": 50,
      "seed": 73546850,
      "groupIds": [],
      "frameId": null,
      "roundness": null,
      "boundElements": [],
      "updated": 1734363560512,
      "link": null,
      "locked": false,
      "fontSize": 20,
      "fontFamily": 1,
      "text": "1. After withdrawal delay, complete\nwithdrawal \"as tokens\"",
      "textAlign": "center",
      "verticalAlign": "top",
      "containerId": null,
      "originalText": "1. After withdrawal delay, complete\nwithdrawal \"as tokens\"",
      "autoResize": true,
      "lineHeight": 1.25
    },
    {
      "type": "rectangle",
      "version": 1514,
      "versionNonce": 1069751805,
      "index": "b1yX",
      "isDeleted": false,
      "id": "kQ1fgu7rlXnxTswNeY2sY",
      "fillStyle": "solid",
      "strokeWidth": 2,
      "strokeStyle": "solid",
      "roughness": 1,
      "opacity": 100,
      "angle": 0,
      "x": 666.9913364234233,
      "y": 4356.830183280432,
      "strokeColor": "#1e1e1e",
      "backgroundColor": "#b2f2bb",
      "width": 223.00000000000006,
      "height": 114.99999999999997,
      "seed": 800379198,
      "groupIds": [],
      "frameId": null,
      "roundness": {
        "type": 3
      },
      "boundElements": [
        {
          "type": "text",
          "id": "Q4WYiLsmSd2ANtW4Fzf5C"
        },
        {
          "id": "-2NlzuMn6PNtlfulLdjA7",
          "type": "arrow"
        },
        {
          "id": "sEaeau6v0HW9Bw5m2-QLc",
          "type": "arrow"
        }
      ],
      "updated": 1734363560512,
      "link": null,
      "locked": false
    },
    {
      "type": "text",
      "version": 1210,
      "versionNonce": 889738845,
      "index": "b1yXG",
      "isDeleted": false,
      "id": "Q4WYiLsmSd2ANtW4Fzf5C",
      "fillStyle": "solid",
      "strokeWidth": 2,
      "strokeStyle": "solid",
      "roughness": 1,
      "opacity": 100,
      "angle": 0,
      "x": 708.1163364234233,
      "y": 4404.730183280432,
      "strokeColor": "#1e1e1e",
      "backgroundColor": "transparent",
      "width": 140.75,
      "height": 19.2,
      "seed": 96729470,
      "groupIds": [],
      "frameId": null,
      "roundness": null,
      "boundElements": [],
      "updated": 1734363560512,
      "link": null,
      "locked": false,
      "fontSize": 16,
      "fontFamily": 3,
      "text": "EigenPodManager",
      "textAlign": "center",
      "verticalAlign": "middle",
      "containerId": "kQ1fgu7rlXnxTswNeY2sY",
      "originalText": "EigenPodManager",
      "autoResize": true,
      "lineHeight": 1.2
    },
    {
      "type": "rectangle",
      "version": 2229,
      "versionNonce": 67745661,
      "index": "b1yXV",
      "isDeleted": false,
      "id": "-ByAz-Fdfvva8JaCOwxPA",
      "fillStyle": "solid",
      "strokeWidth": 2,
      "strokeStyle": "solid",
      "roughness": 1,
      "opacity": 100,
      "angle": 0,
      "x": 667.5468919789791,
      "y": 4896.3857388359875,
      "strokeColor": "#1e1e1e",
      "backgroundColor": "#b2f2bb",
      "width": 135.00000000000006,
      "height": 114.99999999999997,
      "seed": 1480858046,
      "groupIds": [
        "5pa49v7yiW1ejxPXqXnpp"
      ],
      "frameId": null,
      "roundness": {
        "type": 3
      },
      "boundElements": [],
      "updated": 1734363560512,
      "link": null,
      "locked": false
    },
    {
      "type": "rectangle",
      "version": 2159,
      "versionNonce": 943701981,
      "index": "b1yY",
      "isDeleted": false,
      "id": "eMRf6JiZPdxP9G7OwFmLL",
      "fillStyle": "solid",
      "strokeWidth": 2,
      "strokeStyle": "solid",
      "roughness": 1,
      "opacity": 100,
      "angle": 0,
      "x": 667.5468919789791,
      "y": 4861.3857388359875,
      "strokeColor": "#1e1e1e",
      "backgroundColor": "#b2f2bb",
      "width": 135.00000000000006,
      "height": 114.99999999999997,
      "seed": 1582707198,
      "groupIds": [
        "5pa49v7yiW1ejxPXqXnpp"
      ],
      "frameId": null,
      "roundness": {
        "type": 3
      },
      "boundElements": [],
      "updated": 1734363560512,
      "link": null,
      "locked": false
    },
    {
      "type": "rectangle",
      "version": 2108,
      "versionNonce": 492158013,
      "index": "b1yYV",
      "isDeleted": false,
      "id": "-3YXnHeLhfBTkpAIrjWHi",
      "fillStyle": "solid",
      "strokeWidth": 2,
      "strokeStyle": "solid",
      "roughness": 1,
      "opacity": 100,
      "angle": 0,
      "x": 667.5468919789791,
      "y": 4825.8857388359875,
      "strokeColor": "#1e1e1e",
      "backgroundColor": "#b2f2bb",
      "width": 135.00000000000006,
      "height": 114.99999999999997,
      "seed": 1123762750,
      "groupIds": [
        "5pa49v7yiW1ejxPXqXnpp"
      ],
      "frameId": null,
      "roundness": {
        "type": 3
      },
      "boundElements": [],
      "updated": 1734363560512,
      "link": null,
      "locked": false
    },
    {
      "type": "rectangle",
      "version": 2035,
      "versionNonce": 2066558109,
      "index": "b1yZ",
      "isDeleted": false,
      "id": "OMQvAoE8on6TXfPaYPM7k",
      "fillStyle": "solid",
      "strokeWidth": 2,
      "strokeStyle": "solid",
      "roughness": 1,
      "opacity": 100,
      "angle": 0,
      "x": 667.5468919789791,
      "y": 4790.8857388359875,
      "strokeColor": "#1e1e1e",
      "backgroundColor": "#b2f2bb",
      "width": 135.00000000000006,
      "height": 114.99999999999997,
      "seed": 689195646,
      "groupIds": [
        "5pa49v7yiW1ejxPXqXnpp"
      ],
      "frameId": null,
      "roundness": {
        "type": 3
      },
      "boundElements": [],
      "updated": 1734363560512,
      "link": null,
      "locked": false
    },
    {
      "type": "rectangle",
      "version": 2100,
      "versionNonce": 561484029,
      "index": "b1yZG",
      "isDeleted": false,
      "id": "lWvf1FuH4IJqchS8LLjgi",
      "fillStyle": "solid",
      "strokeWidth": 2,
      "strokeStyle": "solid",
      "roughness": 1,
      "opacity": 100,
      "angle": 0,
      "x": 667.5468919789791,
      "y": 4760.1357388359875,
      "strokeColor": "#1e1e1e",
      "backgroundColor": "#b2f2bb",
      "width": 135.00000000000006,
      "height": 114.99999999999997,
      "seed": 794970814,
      "groupIds": [
        "5pa49v7yiW1ejxPXqXnpp"
      ],
      "frameId": null,
      "roundness": {
        "type": 3
      },
      "boundElements": [],
      "updated": 1734363560512,
      "link": null,
      "locked": false
    },
    {
      "type": "rectangle",
      "version": 2029,
      "versionNonce": 1840671069,
      "index": "b1yZV",
      "isDeleted": false,
      "id": "T3ieDPp5QgyBQ8v2i4_Hc",
      "fillStyle": "solid",
      "strokeWidth": 2,
      "strokeStyle": "solid",
      "roughness": 1,
      "opacity": 100,
      "angle": 0,
      "x": 667.5468919789791,
      "y": 4725.1357388359875,
      "strokeColor": "#1e1e1e",
      "backgroundColor": "#b2f2bb",
      "width": 135.00000000000006,
      "height": 114.99999999999997,
      "seed": 1954956030,
      "groupIds": [
        "5pa49v7yiW1ejxPXqXnpp"
      ],
      "frameId": null,
      "roundness": {
        "type": 3
      },
      "boundElements": [],
      "updated": 1734363560512,
      "link": null,
      "locked": false
    },
    {
      "type": "rectangle",
      "version": 1974,
      "versionNonce": 289093053,
      "index": "b1ya",
      "isDeleted": false,
      "id": "oFgAfaubZA5gBAcdWlWX2",
      "fillStyle": "solid",
      "strokeWidth": 2,
      "strokeStyle": "solid",
      "roughness": 1,
      "opacity": 100,
      "angle": 0,
      "x": 667.5468919789791,
      "y": 4689.635738835988,
      "strokeColor": "#1e1e1e",
      "backgroundColor": "#b2f2bb",
      "width": 135.00000000000006,
      "height": 114.99999999999997,
      "seed": 453063486,
      "groupIds": [
        "5pa49v7yiW1ejxPXqXnpp"
      ],
      "frameId": null,
      "roundness": {
        "type": 3
      },
      "boundElements": [],
      "updated": 1734363560512,
      "link": null,
      "locked": false
    },
    {
      "type": "rectangle",
      "version": 1909,
      "versionNonce": 388462109,
      "index": "b1yaV",
      "isDeleted": false,
      "id": "sJgKoBo4od3axAJJzTbFl",
      "fillStyle": "solid",
      "strokeWidth": 2,
      "strokeStyle": "solid",
      "roughness": 1,
      "opacity": 100,
      "angle": 0,
      "x": 667.5468919789791,
      "y": 4654.635738835988,
      "strokeColor": "#1e1e1e",
      "backgroundColor": "#b2f2bb",
      "width": 135.00000000000006,
      "height": 114.99999999999997,
      "seed": 1295260542,
      "groupIds": [
        "5pa49v7yiW1ejxPXqXnpp"
      ],
      "frameId": null,
      "roundness": {
        "type": 3
      },
      "boundElements": [
        {
          "id": "6wphfCZUznb3CeuzUuOTg",
          "type": "arrow"
        }
      ],
      "updated": 1734363560512,
      "link": null,
      "locked": false
    },
    {
      "type": "rectangle",
      "version": 1832,
      "versionNonce": 466375389,
      "index": "b1yb",
      "isDeleted": false,
      "id": "UicKTv5RzQFz_sRAvYCSx",
      "fillStyle": "solid",
      "strokeWidth": 2,
      "strokeStyle": "solid",
      "roughness": 1,
      "opacity": 100,
      "angle": 0,
      "x": 667.9218919789791,
      "y": 4615.205183280432,
      "strokeColor": "#1e1e1e",
      "backgroundColor": "#b2f2bb",
      "width": 135.00000000000006,
      "height": 114.99999999999997,
      "seed": 1096809406,
      "groupIds": [
        "5pa49v7yiW1ejxPXqXnpp"
      ],
      "frameId": null,
      "roundness": {
        "type": 3
      },
      "boundElements": [
        {
          "type": "text",
          "id": "FS4_skLwKgXHbZaPDZncL"
        },
        {
          "id": "sEaeau6v0HW9Bw5m2-QLc",
          "type": "arrow"
        }
      ],
      "updated": 1734363560512,
      "link": null,
      "locked": false
    },
    {
      "type": "text",
      "version": 1565,
      "versionNonce": 668462909,
      "index": "b1ybV",
      "isDeleted": false,
      "id": "FS4_skLwKgXHbZaPDZncL",
      "fillStyle": "solid",
      "strokeWidth": 2,
      "strokeStyle": "solid",
      "roughness": 1,
      "opacity": 100,
      "angle": 0,
      "x": 679.1218927419186,
      "y": 4653.505183280433,
      "strokeColor": "#1e1e1e",
      "backgroundColor": "transparent",
      "width": 112.5999984741211,
      "height": 38.4,
      "seed": 1034277886,
      "groupIds": [
        "5pa49v7yiW1ejxPXqXnpp"
      ],
      "frameId": null,
      "roundness": null,
      "boundElements": [],
      "updated": 1734363560512,
      "link": null,
      "locked": false,
      "fontSize": 16,
      "fontFamily": 3,
      "text": "EigenPods\n(1 per user)",
      "textAlign": "center",
      "verticalAlign": "middle",
      "containerId": "UicKTv5RzQFz_sRAvYCSx",
      "originalText": "EigenPods\n(1 per user)",
      "autoResize": true,
      "lineHeight": 1.2
    },
    {
      "type": "arrow",
      "version": 748,
      "versionNonce": 685733469,
      "index": "b1yd",
      "isDeleted": false,
      "id": "-2NlzuMn6PNtlfulLdjA7",
      "fillStyle": "solid",
      "strokeWidth": 2,
      "strokeStyle": "solid",
      "roughness": 1,
      "opacity": 100,
      "angle": 0,
      "x": 991.1236247335738,
      "y": 4171.271021615562,
      "strokeColor": "#1e1e1e",
      "backgroundColor": "#ffc9c9",
      "width": 223.9610718898632,
      "height": 176.66666666666652,
      "seed": 1035097662,
      "groupIds": [],
      "frameId": null,
      "roundness": {
        "type": 2
      },
      "boundElements": [
        {
          "type": "text",
          "id": "oRz68yZNH2lbKSZF1y-hq"
        }
      ],
      "updated": 1734363735302,
      "link": null,
      "locked": false,
      "startBinding": {
        "elementId": "PQ83u0WAkad1B1o1C1iNi",
        "focus": 0.4508229435372423,
        "gap": 4.41666666666697,
        "fixedPoint": null
      },
      "endBinding": {
        "elementId": "kQ1fgu7rlXnxTswNeY2sY",
        "focus": -0.5178875121387579,
        "gap": 8.892494998202892,
        "fixedPoint": null
      },
      "lastCommittedPoint": null,
      "startArrowhead": null,
      "endArrowhead": "triangle",
      "points": [
        [
          0,
          0
        ],
        [
          -223.9610718898632,
          176.66666666666652
        ]
      ]
    },
    {
      "type": "text",
      "version": 112,
      "versionNonce": 1545484979,
      "index": "b1ydG",
      "isDeleted": false,
      "id": "oRz68yZNH2lbKSZF1y-hq",
      "fillStyle": "solid",
      "strokeWidth": 2,
      "strokeStyle": "solid",
      "roughness": 1,
      "opacity": 100,
      "angle": 0,
      "x": 784.3631586738961,
      "y": 4234.604354948895,
      "strokeColor": "#1e1e1e",
      "backgroundColor": "#ffc9c9",
      "width": 189.5598602294922,
      "height": 50,
      "seed": 969993890,
      "groupIds": [],
      "frameId": null,
      "roundness": null,
      "boundElements": [],
      "updated": 1734363734241,
      "link": null,
      "locked": false,
      "fontSize": 20,
      "fontFamily": 1,
      "text": "3. Withdraw shares\nas native eth",
      "textAlign": "center",
      "verticalAlign": "middle",
      "containerId": "-2NlzuMn6PNtlfulLdjA7",
      "originalText": "3. Withdraw shares as native eth",
      "autoResize": true,
      "lineHeight": 1.25
    },
    {
      "type": "arrow",
      "version": 487,
      "versionNonce": 1107673693,
      "index": "b1ydV",
      "isDeleted": false,
      "id": "sEaeau6v0HW9Bw5m2-QLc",
      "fillStyle": "solid",
      "strokeWidth": 2,
      "strokeStyle": "solid",
      "roughness": 1,
      "opacity": 100,
      "angle": 0,
      "x": 714.3058205504078,
      "y": 4474.604354948895,
      "strokeColor": "#1e1e1e",
      "backgroundColor": "#ffc9c9",
      "width": 30,
      "height": 131.66666666666652,
      "seed": 857568610,
      "groupIds": [],
      "frameId": null,
      "roundness": {
        "type": 2
      },
      "boundElements": [
        {
          "type": "text",
          "id": "PGqyWD0wYyKYxhwnFlq99"
        }
      ],
      "updated": 1734363753816,
      "link": null,
      "locked": false,
      "startBinding": {
        "elementId": "kQ1fgu7rlXnxTswNeY2sY",
        "focus": 0.40490889053038814,
        "gap": 2.7741716684631683,
        "fixedPoint": null
      },
      "endBinding": {
        "elementId": "UicKTv5RzQFz_sRAvYCSx",
        "focus": -0.8219842250215641,
        "gap": 8.934161664870771,
        "fixedPoint": null
      },
      "lastCommittedPoint": null,
      "startArrowhead": null,
      "endArrowhead": "triangle",
      "points": [
        [
          0,
          0
        ],
        [
          -30,
          131.66666666666652
        ]
      ]
    },
    {
      "type": "text",
      "version": 150,
      "versionNonce": 1797238451,
      "index": "b1ye",
      "isDeleted": false,
      "id": "PGqyWD0wYyKYxhwnFlq99",
      "fillStyle": "solid",
      "strokeWidth": 2,
      "strokeStyle": "solid",
      "roughness": 1,
      "opacity": 100,
      "angle": 0,
      "x": 590.8558998961109,
      "y": 4502.937688282228,
      "strokeColor": "#1e1e1e",
      "backgroundColor": "#ffc9c9",
      "width": 216.89984130859375,
      "height": 75,
      "seed": 376107390,
      "groupIds": [],
      "frameId": null,
      "roundness": null,
      "boundElements": [],
      "updated": 1734363752712,
      "link": null,
      "locked": false,
      "fontSize": 20,
      "fontFamily": 1,
      "text": "4. Withdraw ETH from\nproven \"withdrawable\"\nETH",
      "textAlign": "center",
      "verticalAlign": "middle",
      "containerId": "sEaeau6v0HW9Bw5m2-QLc",
      "originalText": "4. Withdraw ETH from proven \"withdrawable\" ETH",
      "autoResize": true,
      "lineHeight": 1.25
    },
    {
      "type": "rectangle",
      "version": 2283,
      "versionNonce": 1483513213,
      "index": "b1yeV",
      "isDeleted": false,
      "id": "ov74QuZuHeQk5snpuex4j",
      "fillStyle": "solid",
      "strokeWidth": 2,
      "strokeStyle": "solid",
      "roughness": 1,
      "opacity": 100,
      "angle": 0,
      "x": 508.3638562646935,
      "y": 5672.694632726673,
      "strokeColor": "#1e1e1e",
      "backgroundColor": "#b2f2bb",
      "width": 135.00000000000006,
      "height": 114.99999999999997,
      "seed": 1321608034,
      "groupIds": [
        "-a95jHDTnDXw5D9TZzWPv"
      ],
      "frameId": null,
      "roundness": {
        "type": 3
      },
      "boundElements": [],
      "updated": 1734363560512,
      "link": null,
      "locked": false
    },
    {
      "type": "rectangle",
      "version": 2214,
      "versionNonce": 190178781,
      "index": "b1yf",
      "isDeleted": false,
      "id": "1K3KAKEZc7hub6QqnfFkO",
      "fillStyle": "solid",
      "strokeWidth": 2,
      "strokeStyle": "solid",
      "roughness": 1,
      "opacity": 100,
      "angle": 0,
      "x": 508.3638562646935,
      "y": 5637.694632726673,
      "strokeColor": "#1e1e1e",
      "backgroundColor": "#b2f2bb",
      "width": 135.00000000000006,
      "height": 114.99999999999997,
      "seed": 581920546,
      "groupIds": [
        "-a95jHDTnDXw5D9TZzWPv"
      ],
      "frameId": null,
      "roundness": {
        "type": 3
      },
      "boundElements": [
        {
          "id": "mGMTzes2F3Dpy73P0aXca",
          "type": "arrow"
        }
      ],
      "updated": 1734363560512,
      "link": null,
      "locked": false
    },
    {
      "type": "rectangle",
      "version": 2164,
      "versionNonce": 917971517,
      "index": "b1yfG",
      "isDeleted": false,
      "id": "KbInyH-gvwVMsVBnNRlsP",
      "fillStyle": "solid",
      "strokeWidth": 2,
      "strokeStyle": "solid",
      "roughness": 1,
      "opacity": 100,
      "angle": 0,
      "x": 508.3638562646935,
      "y": 5602.194632726673,
      "strokeColor": "#1e1e1e",
      "backgroundColor": "#b2f2bb",
      "width": 135.00000000000006,
      "height": 114.99999999999997,
      "seed": 2017080034,
      "groupIds": [
        "-a95jHDTnDXw5D9TZzWPv"
      ],
      "frameId": null,
      "roundness": {
        "type": 3
      },
      "boundElements": [],
      "updated": 1734363560512,
      "link": null,
      "locked": false
    },
    {
      "type": "rectangle",
      "version": 2091,
      "versionNonce": 1869730461,
      "index": "b1yfV",
      "isDeleted": false,
      "id": "ic5dIZ-8ueKkFPMVrRg3q",
      "fillStyle": "solid",
      "strokeWidth": 2,
      "strokeStyle": "solid",
      "roughness": 1,
      "opacity": 100,
      "angle": 0,
      "x": 508.3638562646935,
      "y": 5567.194632726673,
      "strokeColor": "#1e1e1e",
      "backgroundColor": "#b2f2bb",
      "width": 135.00000000000006,
      "height": 114.99999999999997,
      "seed": 838174370,
      "groupIds": [
        "-a95jHDTnDXw5D9TZzWPv"
      ],
      "frameId": null,
      "roundness": {
        "type": 3
      },
      "boundElements": [
        {
          "id": "vj4BSnZm75z5L1-Bd7wmA",
          "type": "arrow"
        }
      ],
      "updated": 1734363560512,
      "link": null,
      "locked": false
    },
    {
      "type": "rectangle",
      "version": 2154,
      "versionNonce": 842495741,
      "index": "b1yg",
      "isDeleted": false,
      "id": "w8AHt8u9f13X41cx2ch_o",
      "fillStyle": "solid",
      "strokeWidth": 2,
      "strokeStyle": "solid",
      "roughness": 1,
      "opacity": 100,
      "angle": 0,
      "x": 508.3638562646935,
      "y": 5536.444632726673,
      "strokeColor": "#1e1e1e",
      "backgroundColor": "#b2f2bb",
      "width": 135.00000000000006,
      "height": 114.99999999999997,
      "seed": 143680098,
      "groupIds": [
        "-a95jHDTnDXw5D9TZzWPv"
      ],
      "frameId": null,
      "roundness": {
        "type": 3
      },
      "boundElements": [],
      "updated": 1734363560512,
      "link": null,
      "locked": false
    },
    {
      "type": "rectangle",
      "version": 2089,
      "versionNonce": 1770622813,
      "index": "b1ygV",
      "isDeleted": false,
      "id": "GEAj2lmmidRmUlCzXn9xj",
      "fillStyle": "solid",
      "strokeWidth": 2,
      "strokeStyle": "solid",
      "roughness": 1,
      "opacity": 100,
      "angle": 0,
      "x": 508.3638562646935,
      "y": 5501.444632726673,
      "strokeColor": "#1e1e1e",
      "backgroundColor": "#b2f2bb",
      "width": 135.00000000000006,
      "height": 114.99999999999997,
      "seed": 1188677154,
      "groupIds": [
        "-a95jHDTnDXw5D9TZzWPv"
      ],
      "frameId": null,
      "roundness": {
        "type": 3
      },
      "boundElements": [],
      "updated": 1734363560512,
      "link": null,
      "locked": false
    },
    {
      "type": "rectangle",
      "version": 2028,
      "versionNonce": 867802045,
      "index": "b1yh",
      "isDeleted": false,
      "id": "k40q4mWXkGfhuTKm0wtdK",
      "fillStyle": "solid",
      "strokeWidth": 2,
      "strokeStyle": "solid",
      "roughness": 1,
      "opacity": 100,
      "angle": 0,
      "x": 508.3638562646935,
      "y": 5465.944632726673,
      "strokeColor": "#1e1e1e",
      "backgroundColor": "#b2f2bb",
      "width": 135.00000000000006,
      "height": 114.99999999999997,
      "seed": 96514530,
      "groupIds": [
        "-a95jHDTnDXw5D9TZzWPv"
      ],
      "frameId": null,
      "roundness": {
        "type": 3
      },
      "boundElements": [
        {
          "id": "wl2N1yzHJY0w9n2-O6uBK",
          "type": "arrow"
        }
      ],
      "updated": 1734363560512,
      "link": null,
      "locked": false
    },
    {
      "type": "rectangle",
      "version": 1961,
      "versionNonce": 1760107549,
      "index": "b1yhG",
      "isDeleted": false,
      "id": "mCl_YXyLYkCML2D84GHb_",
      "fillStyle": "solid",
      "strokeWidth": 2,
      "strokeStyle": "solid",
      "roughness": 1,
      "opacity": 100,
      "angle": 0,
      "x": 508.3638562646935,
      "y": 5430.944632726673,
      "strokeColor": "#1e1e1e",
      "backgroundColor": "#b2f2bb",
      "width": 135.00000000000006,
      "height": 114.99999999999997,
      "seed": 1750345122,
      "groupIds": [
        "-a95jHDTnDXw5D9TZzWPv"
      ],
      "frameId": null,
      "roundness": {
        "type": 3
      },
      "boundElements": [
        {
          "id": "wl2N1yzHJY0w9n2-O6uBK",
          "type": "arrow"
        }
      ],
      "updated": 1734363560512,
      "link": null,
      "locked": false
    },
    {
      "type": "rectangle",
      "version": 1883,
      "versionNonce": 1628016765,
      "index": "b1yhV",
      "isDeleted": false,
      "id": "EIr7yDWcf5XOCl3LVxa0f",
      "fillStyle": "solid",
      "strokeWidth": 2,
      "strokeStyle": "solid",
      "roughness": 1,
      "opacity": 100,
      "angle": 0,
      "x": 508.7388562646935,
      "y": 5391.5140771711185,
      "strokeColor": "#1e1e1e",
      "backgroundColor": "#b2f2bb",
      "width": 135.00000000000006,
      "height": 114.99999999999997,
      "seed": 1472405858,
      "groupIds": [
        "-a95jHDTnDXw5D9TZzWPv"
      ],
      "frameId": null,
      "roundness": {
        "type": 3
      },
      "boundElements": [
        {
          "type": "text",
          "id": "G35L9DJWDWkC_VH8bd05f"
        },
        {
          "id": "wl2N1yzHJY0w9n2-O6uBK",
          "type": "arrow"
        },
        {
          "id": "vj4BSnZm75z5L1-Bd7wmA",
          "type": "arrow"
        }
      ],
      "updated": 1734363560512,
      "link": null,
      "locked": false
    },
    {
      "type": "text",
      "version": 1619,
      "versionNonce": 2044491997,
      "index": "b1yi",
      "isDeleted": false,
      "id": "G35L9DJWDWkC_VH8bd05f",
      "fillStyle": "solid",
      "strokeWidth": 2,
      "strokeStyle": "solid",
      "roughness": 1,
      "opacity": 100,
      "angle": 0,
      "x": 519.9388570276329,
      "y": 5429.814077171118,
      "strokeColor": "#1e1e1e",
      "backgroundColor": "transparent",
      "width": 112.5999984741211,
      "height": 38.4,
      "seed": 1063036194,
      "groupIds": [
        "-a95jHDTnDXw5D9TZzWPv"
      ],
      "frameId": null,
      "roundness": null,
      "boundElements": [],
      "updated": 1734363560512,
      "link": null,
      "locked": false,
      "fontSize": 16,
      "fontFamily": 3,
      "text": "EigenPods\n(1 per user)",
      "textAlign": "center",
      "verticalAlign": "middle",
      "containerId": "EIr7yDWcf5XOCl3LVxa0f",
      "originalText": "EigenPods\n(1 per user)",
      "autoResize": true,
      "lineHeight": 1.2
    },
    {
      "type": "rectangle",
      "version": 1866,
      "versionNonce": 121825789,
      "index": "b1yiV",
      "isDeleted": false,
      "id": "6dE977xJsK71ptktUgxTH",
      "fillStyle": "solid",
      "strokeWidth": 2,
      "strokeStyle": "solid",
      "roughness": 1,
      "opacity": 100,
      "angle": 0,
      "x": 916.8638562646933,
      "y": 5437.527966060007,
      "strokeColor": "#1e1e1e",
      "backgroundColor": "#b2f2bb",
      "width": 266.00000000000017,
      "height": 114.99999999999997,
      "seed": 69099618,
      "groupIds": [],
      "frameId": null,
      "roundness": {
        "type": 3
      },
      "boundElements": [
        {
          "type": "text",
          "id": "LpzmdEWZoAuxFhQksffXs"
        },
        {
          "id": "wl2N1yzHJY0w9n2-O6uBK",
          "type": "arrow"
        }
      ],
      "updated": 1734363560512,
      "link": null,
      "locked": false
    },
    {
      "type": "text",
      "version": 1765,
      "versionNonce": 313434717,
      "index": "b1yj",
      "isDeleted": false,
      "id": "LpzmdEWZoAuxFhQksffXs",
      "fillStyle": "solid",
      "strokeWidth": 2,
      "strokeStyle": "solid",
      "roughness": 1,
      "opacity": 100,
      "angle": 0,
      "x": 979.4888562646934,
      "y": 5485.427966060007,
      "strokeColor": "#1e1e1e",
      "backgroundColor": "transparent",
      "width": 140.75,
      "height": 19.2,
      "seed": 1542980642,
      "groupIds": [],
      "frameId": null,
      "roundness": null,
      "boundElements": [],
      "updated": 1734363560512,
      "link": null,
      "locked": false,
      "fontSize": 16,
      "fontFamily": 3,
      "text": "EIP-4788 Oracle",
      "textAlign": "center",
      "verticalAlign": "middle",
      "containerId": "6dE977xJsK71ptktUgxTH",
      "originalText": "EIP-4788 Oracle",
      "autoResize": true,
      "lineHeight": 1.2
    },
    {
      "type": "arrow",
      "version": 2118,
      "versionNonce": 1971038611,
      "index": "b1yjV",
      "isDeleted": false,
      "id": "wl2N1yzHJY0w9n2-O6uBK",
      "fillStyle": "solid",
      "strokeWidth": 2,
      "strokeStyle": "solid",
      "roughness": 1,
      "opacity": 100,
      "angle": 0,
      "x": 651.2829108238828,
      "y": 5506.268772499644,
      "strokeColor": "#1e1e1e",
      "backgroundColor": "#ffec99",
      "width": 258.0630882979534,
      "height": 0.06671593128066888,
      "seed": 409415650,
      "groupIds": [],
      "frameId": null,
      "roundness": {
        "type": 2
      },
      "boundElements": [],
      "updated": 1734363560521,
      "link": null,
      "locked": false,
      "startBinding": {
        "elementId": "EIr7yDWcf5XOCl3LVxa0f",
        "focus": 0.9957690346543716,
        "gap": 7.544054559189192,
        "fixedPoint": null
      },
      "endBinding": {
        "elementId": "6dE977xJsK71ptktUgxTH",
        "focus": -0.19358446686072192,
        "gap": 7.5178571428570535,
        "fixedPoint": null
      },
      "lastCommittedPoint": null,
      "startArrowhead": null,
      "endArrowhead": "triangle",
      "points": [
        [
          0,
          0
        ],
        [
          258.0630882979534,
          -0.06671593128066888
        ]
      ]
    },
    {
      "type": "text",
      "version": 767,
      "versionNonce": 390300541,
      "index": "b1yk",
      "isDeleted": false,
      "id": "suYlO5trpiXH7DPcsPva-",
      "fillStyle": "solid",
      "strokeWidth": 2,
      "strokeStyle": "solid",
      "roughness": 1,
      "opacity": 100,
      "angle": 0,
      "x": 659.5840943599316,
      "y": 5439.057727964769,
      "strokeColor": "#1e1e1e",
      "backgroundColor": "#ffec99",
      "width": 241.89999389648438,
      "height": 50,
      "seed": 494592930,
      "groupIds": [],
      "frameId": null,
      "roundness": null,
      "boundElements": [
        {
          "id": "wl2N1yzHJY0w9n2-O6uBK",
          "type": "arrow"
        }
      ],
      "updated": 1734363560512,
      "link": null,
      "locked": false,
      "fontSize": 20,
      "fontFamily": 1,
      "text": "1.5 Parent beacon block\nroot queried from oracle",
      "textAlign": "left",
      "verticalAlign": "top",
      "containerId": null,
      "originalText": "1.5 Parent beacon block\nroot queried from oracle",
      "autoResize": true,
      "lineHeight": 1.25
    },
    {
      "type": "ellipse",
      "version": 1588,
      "versionNonce": 1516243933,
      "index": "b1ykV",
      "isDeleted": false,
      "id": "fu5u9qb7f5q6a-Xge9KFW",
      "fillStyle": "solid",
      "strokeWidth": 2,
      "strokeStyle": "solid",
      "roughness": 1,
      "opacity": 100,
      "angle": 0,
      "x": 39.081118169455294,
      "y": 5470.079915506246,
      "strokeColor": "#1e1e1e",
      "backgroundColor": "#ffc9c9",
      "width": 108.75,
      "height": 105,
      "seed": 1969364834,
      "groupIds": [],
      "frameId": null,
      "roundness": {
        "type": 2
      },
      "boundElements": [
        {
          "type": "text",
          "id": "zoX-NdDWsLZeKla7uZsJa"
        },
        {
          "id": "vj4BSnZm75z5L1-Bd7wmA",
          "type": "arrow"
        }
      ],
      "updated": 1734363560512,
      "link": null,
      "locked": false
    },
    {
      "type": "text",
      "version": 1336,
      "versionNonce": 764184637,
      "index": "b1yl",
      "isDeleted": false,
      "id": "zoX-NdDWsLZeKla7uZsJa",
      "fillStyle": "solid",
      "strokeWidth": 2,
      "strokeStyle": "solid",
      "roughness": 1,
      "opacity": 100,
      "angle": 0,
      "x": 64.87385373626,
      "y": 5510.956809493952,
      "strokeColor": "#1e1e1e",
      "backgroundColor": "#ffc9c9",
      "width": 57.266666412353516,
      "height": 23,
      "seed": 208397090,
      "groupIds": [],
      "frameId": null,
      "roundness": null,
      "boundElements": [],
      "updated": 1734363560512,
      "link": null,
      "locked": false,
      "fontSize": 20,
      "fontFamily": 2,
      "text": "Staker",
      "textAlign": "center",
      "verticalAlign": "middle",
      "containerId": "fu5u9qb7f5q6a-Xge9KFW",
      "originalText": "Staker",
      "autoResize": true,
      "lineHeight": 1.15
    },
    {
      "type": "arrow",
      "version": 908,
      "versionNonce": 670474451,
      "index": "b1ylG",
      "isDeleted": false,
      "id": "vj4BSnZm75z5L1-Bd7wmA",
      "fillStyle": "solid",
      "strokeWidth": 2,
      "strokeStyle": "solid",
      "roughness": 1,
      "opacity": 100,
      "angle": 0,
      "x": 149.63115028729248,
      "y": 5490.368685685094,
      "strokeColor": "#1e1e1e",
      "backgroundColor": "#ffc9c9",
      "width": 356.86961092156184,
      "height": 1.7933079596450625,
      "seed": 1829187298,
      "groupIds": [],
      "frameId": null,
      "roundness": {
        "type": 2
      },
      "boundElements": [],
      "updated": 1734363560521,
      "link": null,
      "locked": false,
      "startBinding": {
        "elementId": "fu5u9qb7f5q6a-Xge9KFW",
        "focus": -0.6081621304143124,
        "gap": 10.858235443211711,
        "fixedPoint": null
      },
      "endBinding": {
        "elementId": "EIr7yDWcf5XOCl3LVxa0f",
        "focus": -0.677928857055987,
        "gap": 2.23809505583921,
        "fixedPoint": null
      },
      "lastCommittedPoint": null,
      "startArrowhead": null,
      "endArrowhead": "triangle",
      "points": [
        [
          0,
          0
        ],
        [
          356.86961092156184,
          -1.7933079596450625
        ]
      ]
    },
    {
      "type": "text",
      "version": 366,
      "versionNonce": 1196471645,
      "index": "b1ylV",
      "isDeleted": false,
      "id": "8BahsLtuF7IbIbOLx2-Mx",
      "fillStyle": "solid",
      "strokeWidth": 2,
      "strokeStyle": "solid",
      "roughness": 1,
      "opacity": 100,
      "angle": 0,
      "x": 227.2477848361218,
      "y": 5494.246582172914,
      "strokeColor": "#1e1e1e",
      "backgroundColor": "#ffc9c9",
      "width": 175.75,
      "height": 24,
      "seed": 2076377762,
      "groupIds": [],
      "frameId": null,
      "roundness": null,
      "boundElements": [
        {
          "id": "vj4BSnZm75z5L1-Bd7wmA",
          "type": "arrow"
        }
      ],
      "updated": 1734363560512,
      "link": null,
      "locked": false,
      "fontSize": 20,
      "fontFamily": 3,
      "text": "startCheckpoint",
      "textAlign": "center",
      "verticalAlign": "top",
      "containerId": null,
      "originalText": "startCheckpoint",
      "autoResize": true,
      "lineHeight": 1.2
    },
    {
      "type": "text",
      "version": 569,
      "versionNonce": 1504444861,
      "index": "b1ym",
      "isDeleted": false,
      "id": "_4N_XcbOGQl5IcAcywLwz",
      "fillStyle": "solid",
      "strokeWidth": 2,
      "strokeStyle": "solid",
      "roughness": 1,
      "opacity": 100,
      "angle": 0,
      "x": 220.72278331024324,
      "y": 5392.579915506248,
      "strokeColor": "#1e1e1e",
      "backgroundColor": "#ffc9c9",
      "width": 168.8000030517578,
      "height": 25,
      "seed": 860773986,
      "groupIds": [],
      "frameId": null,
      "roundness": null,
      "boundElements": [],
      "updated": 1734363560512,
      "link": null,
      "locked": false,
      "fontSize": 20,
      "fontFamily": 1,
      "text": "0. Exit validator",
      "textAlign": "center",
      "verticalAlign": "top",
      "containerId": null,
      "originalText": "0. Exit validator",
      "autoResize": true,
      "lineHeight": 1.25
    },
    {
      "type": "text",
      "version": 2120,
      "versionNonce": 798933533,
      "index": "b1ymV",
      "isDeleted": false,
      "id": "d72WGNKRuYgAsUjbtzORG",
      "fillStyle": "solid",
      "strokeWidth": 2,
      "strokeStyle": "solid",
      "roughness": 1,
      "opacity": 100,
      "angle": 0,
      "x": 71.25582258491318,
      "y": 5302.404354948895,
      "strokeColor": "#1e1e1e",
      "backgroundColor": "#ffc9c9",
      "width": 322.76666259765625,
      "height": 64.39999999999999,
      "seed": 1006649378,
      "groupIds": [],
      "frameId": null,
      "roundness": null,
      "boundElements": [],
      "updated": 1734363560512,
      "link": null,
      "locked": false,
      "fontSize": 28,
      "fontFamily": 2,
      "text": "Staker Flow:\nProcessing Validator Exits",
      "textAlign": "center",
      "verticalAlign": "top",
      "containerId": null,
      "originalText": "Staker Flow:\nProcessing Validator Exits",
      "autoResize": true,
      "lineHeight": 1.15
    },
    {
      "type": "arrow",
      "version": 579,
      "versionNonce": 1807838109,
      "index": "b1yn",
      "isDeleted": false,
      "id": "6wphfCZUznb3CeuzUuOTg",
      "fillStyle": "solid",
      "strokeWidth": 2,
      "strokeStyle": "solid",
      "roughness": 1,
      "opacity": 100,
      "angle": 0,
      "x": 661.8188413837411,
      "y": 4783.347844532228,
      "strokeColor": "#1e1e1e",
      "backgroundColor": "#ffc9c9",
      "width": 339.50691489593646,
      "height": 566.5762032002181,
      "seed": 827744894,
      "groupIds": [],
      "frameId": null,
      "roundness": {
        "type": 2
      },
      "boundElements": [
        {
          "type": "text",
          "id": "g7WtYgMLCoPIyK2GZ6v0S"
        }
      ],
      "updated": 1734363759259,
      "link": null,
      "locked": false,
      "startBinding": {
        "elementId": "sJgKoBo4od3axAJJzTbFl",
        "focus": -1.171032254566488,
        "gap": 13.712105696239632,
        "fixedPoint": null
      },
      "endBinding": {
        "elementId": "NQxdmwNFdM60dm5-JugHD",
        "focus": 0.030507353609042952,
        "gap": 11.73505335639934,
        "fixedPoint": null
      },
      "lastCommittedPoint": null,
      "startArrowhead": null,
      "endArrowhead": "triangle",
      "points": [
        [
          0,
          0
        ],
        [
          -320,
          -213.33333333333348
        ],
        [
          -339.50691489593646,
          -566.5762032002181
        ]
      ]
    },
    {
      "type": "text",
      "version": 57,
      "versionNonce": 1123936627,
      "index": "b1ynG",
      "isDeleted": false,
      "id": "g7WtYgMLCoPIyK2GZ6v0S",
      "fillStyle": "solid",
      "strokeWidth": 2,
      "strokeStyle": "solid",
      "roughness": 1,
      "opacity": 100,
      "angle": 0,
      "x": 223.50893168239372,
      "y": 4545.014511198895,
      "strokeColor": "#1e1e1e",
      "backgroundColor": "#ffc9c9",
      "width": 236.6198194026947,
      "height": 50,
      "seed": 958894142,
      "groupIds": [],
      "frameId": null,
      "roundness": null,
      "boundElements": [],
      "updated": 1734363758637,
      "link": null,
      "locked": false,
      "fontSize": 20,
      "fontFamily": 1,
      "text": "5. Send ETH directly to\nStaker",
      "textAlign": "center",
      "verticalAlign": "middle",
      "containerId": "6wphfCZUznb3CeuzUuOTg",
      "originalText": "5. Send ETH directly to Staker",
      "autoResize": true,
      "lineHeight": 1.25
    },
    {
      "type": "arrow",
      "version": 939,
      "versionNonce": 285232563,
      "index": "b1ynV",
      "isDeleted": false,
      "id": "mGMTzes2F3Dpy73P0aXca",
      "fillStyle": "solid",
      "strokeWidth": 2,
      "strokeStyle": "solid",
      "roughness": 1,
      "opacity": 100,
      "angle": 0,
      "x": 667.4588196812585,
      "y": 5737.719971933378,
      "strokeColor": "#1e1e1e",
      "backgroundColor": "#ffc9c9",
      "width": 174.472005955412,
      "height": 1.7402432100288934,
      "seed": 2136924002,
      "groupIds": [],
      "frameId": null,
      "roundness": {
        "type": 2
      },
      "boundElements": [],
      "updated": 1734363560522,
      "link": null,
      "locked": false,
      "startBinding": null,
      "endBinding": {
        "elementId": "i9Mz6DQh6ztmSH01qUZ0E",
        "focus": -0.1511269098788724,
        "gap": 12.049992879231922,
        "fixedPoint": null
      },
      "lastCommittedPoint": null,
      "startArrowhead": null,
      "endArrowhead": "triangle",
      "points": [
        [
          0,
          0
        ],
        [
          174.472005955412,
          -1.7402432100288934
        ]
      ]
    },
    {
      "type": "text",
      "version": 479,
      "versionNonce": 998423357,
      "index": "b1yo",
      "isDeleted": false,
      "id": "i9Mz6DQh6ztmSH01qUZ0E",
      "fillStyle": "solid",
      "strokeWidth": 2,
      "strokeStyle": "solid",
      "roughness": 1,
      "opacity": 100,
      "angle": 0,
      "x": 853.9808185159025,
      "y": 5676.271021615562,
      "strokeColor": "#1e1e1e",
      "backgroundColor": "#ffc9c9",
      "width": 353.98333740234375,
      "height": 100,
      "seed": 8192610,
      "groupIds": [],
      "frameId": null,
      "roundness": null,
      "boundElements": [
        {
          "id": "mGMTzes2F3Dpy73P0aXca",
          "type": "arrow"
        }
      ],
      "updated": 1734363560512,
      "link": null,
      "locked": false,
      "fontSize": 20,
      "fontFamily": 1,
      "text": "3. Any native ETH in pod is\nawarded shares and is made\n\"withdrawable\" via DelegationManger\nwithdrawal queue",
      "textAlign": "center",
      "verticalAlign": "top",
      "containerId": null,
      "originalText": "3. Any native ETH in pod is\nawarded shares and is made\n\"withdrawable\" via DelegationManger\nwithdrawal queue",
      "autoResize": true,
      "lineHeight": 1.25
    },
    {
      "type": "ellipse",
      "version": 1225,
      "versionNonce": 577240733,
      "index": "b1yoV",
      "isDeleted": false,
      "id": "xZf-MkC7-tDuT1_y0E2RJ",
      "fillStyle": "solid",
      "strokeWidth": 2,
      "strokeStyle": "solid",
      "roughness": 1,
      "opacity": 100,
      "angle": 0,
      "x": 2251.5302860009665,
      "y": 622.5598244224238,
      "strokeColor": "#1e1e1e",
      "backgroundColor": "#ffc9c9",
      "width": 108.75,
      "height": 105,
      "seed": 616463010,
      "groupIds": [],
      "frameId": null,
      "roundness": {
        "type": 2
      },
      "boundElements": [
        {
          "type": "text",
          "id": "E5Mvud8IjUlm4Xgjw3ocp"
        },
        {
          "id": "B_6S76kMy7S19TN-Xpgxi",
          "type": "arrow"
        }
      ],
      "updated": 1734360257984,
      "link": null,
      "locked": false
    },
    {
      "type": "text",
      "version": 980,
      "versionNonce": 2106073853,
      "index": "b1yp",
      "isDeleted": false,
      "id": "E5Mvud8IjUlm4Xgjw3ocp",
      "fillStyle": "solid",
      "strokeWidth": 2,
      "strokeStyle": "solid",
      "roughness": 1,
      "opacity": 100,
      "angle": 0,
      "x": 2277.3230215677713,
      "y": 663.4367184101302,
      "strokeColor": "#1e1e1e",
      "backgroundColor": "#ffc9c9",
      "width": 57.266666412353516,
      "height": 23,
      "seed": 505075298,
      "groupIds": [],
      "frameId": null,
      "roundness": null,
      "boundElements": [],
      "updated": 1734360257984,
      "link": null,
      "locked": false,
      "fontSize": 20,
      "fontFamily": 2,
      "text": "Staker",
      "textAlign": "center",
      "verticalAlign": "middle",
      "containerId": "xZf-MkC7-tDuT1_y0E2RJ",
      "originalText": "Staker",
      "autoResize": true,
      "lineHeight": 1.15
    },
    {
      "type": "text",
      "version": 559,
      "versionNonce": 368012669,
      "index": "b1ypG",
      "isDeleted": false,
      "id": "K4Gd0EEsZCk0uKQWEsgtd",
      "fillStyle": "solid",
      "strokeWidth": 2,
      "strokeStyle": "solid",
      "roughness": 1,
      "opacity": 100,
      "angle": 0,
      "x": 1865.175987485854,
      "y": 336.226190476191,
      "strokeColor": "#1e1e1e",
      "backgroundColor": "#ffc9c9",
      "width": 201.31666564941406,
      "height": 64.39999999999999,
      "seed": 1488135394,
      "groupIds": [],
      "frameId": null,
      "roundness": null,
      "boundElements": [],
      "updated": 1734113298835,
      "link": null,
      "locked": false,
      "fontSize": 28,
      "fontFamily": 2,
      "text": "Staker Flow:\nDepositing LSTs",
      "textAlign": "center",
      "verticalAlign": "top",
      "containerId": null,
      "originalText": "Staker Flow:\nDepositing LSTs",
      "autoResize": true,
      "lineHeight": 1.15
    },
    {
      "type": "rectangle",
      "version": 1248,
      "versionNonce": 880640061,
      "index": "b1ypV",
      "isDeleted": false,
      "id": "wVMAbbDeEbMp5p52aabU-",
      "fillStyle": "solid",
      "strokeWidth": 2,
      "strokeStyle": "solid",
      "roughness": 1,
      "opacity": 100,
      "angle": 0,
      "x": 1652.7864327916523,
      "y": 615.4846062981054,
      "strokeColor": "#1e1e1e",
      "backgroundColor": "#a5d8ff",
      "width": 223.00000000000006,
      "height": 114.99999999999997,
      "seed": 1175012030,
      "groupIds": [],
      "frameId": null,
      "roundness": {
        "type": 3
      },
      "boundElements": [
        {
          "type": "text",
          "id": "ZlMmZXV0dGL0ZOKWCdMOu"
        },
        {
          "id": "B_6S76kMy7S19TN-Xpgxi",
          "type": "arrow"
        },
        {
          "id": "Bj6zp7ALVlRBocmVnGWMH",
          "type": "arrow"
        },
        {
          "id": "Who6V4OKBA7YOdSKks5WU",
          "type": "arrow"
        },
        {
          "id": "lS4fRSLZHIKN77q4fwuWo",
          "type": "arrow"
        }
      ],
      "updated": 1734360230418,
      "link": null,
      "locked": false
    },
    {
      "type": "text",
      "version": 980,
      "versionNonce": 1622962333,
      "index": "b1yq",
      "isDeleted": false,
      "id": "ZlMmZXV0dGL0ZOKWCdMOu",
      "fillStyle": "solid",
      "strokeWidth": 2,
      "strokeStyle": "solid",
      "roughness": 1,
      "opacity": 100,
      "angle": 0,
      "x": 1693.9114327916523,
      "y": 663.3846062981054,
      "strokeColor": "#1e1e1e",
      "backgroundColor": "transparent",
      "width": 140.75,
      "height": 19.2,
      "seed": 193870590,
      "groupIds": [],
      "frameId": null,
      "roundness": null,
      "boundElements": [],
      "updated": 1734360230418,
      "link": null,
      "locked": false,
      "fontSize": 16,
      "fontFamily": 3,
      "text": "StrategyManager",
      "textAlign": "center",
      "verticalAlign": "middle",
      "containerId": "wVMAbbDeEbMp5p52aabU-",
      "originalText": "StrategyManager",
      "autoResize": true,
      "lineHeight": 1.2
    },
    {
      "type": "rectangle",
      "version": 1612,
      "versionNonce": 291578333,
      "index": "b1yqV",
      "isDeleted": false,
      "id": "PzimP3lWTrcDzRjSEXUDX",
      "fillStyle": "solid",
      "strokeWidth": 2,
      "strokeStyle": "solid",
      "roughness": 1,
      "opacity": 100,
      "angle": 0,
      "x": 1596.2627015786109,
      "y": 1046.5568984271035,
      "strokeColor": "#1e1e1e",
      "backgroundColor": "#a5d8ff",
      "width": 249.00000000000009,
      "height": 114.99999999999997,
      "seed": 2118789950,
      "groupIds": [
        "KsktPBVCh0m-8eJ1ax8wi"
      ],
      "frameId": null,
      "roundness": {
        "type": 3
      },
      "boundElements": [],
      "updated": 1734360231907,
      "link": null,
      "locked": false
    },
    {
      "type": "rectangle",
      "version": 1562,
      "versionNonce": 1341840957,
      "index": "b1yr",
      "isDeleted": false,
      "id": "VYih8IVbgosYSpf1fsC7r",
      "fillStyle": "solid",
      "strokeWidth": 2,
      "strokeStyle": "solid",
      "roughness": 1,
      "opacity": 100,
      "angle": 0,
      "x": 1595.2627015786109,
      "y": 1012.5568984271036,
      "strokeColor": "#1e1e1e",
      "backgroundColor": "#a5d8ff",
      "width": 249.00000000000009,
      "height": 114.99999999999997,
      "seed": 1285428094,
      "groupIds": [
        "KsktPBVCh0m-8eJ1ax8wi"
      ],
      "frameId": null,
      "roundness": {
        "type": 3
      },
      "boundElements": [],
      "updated": 1734360231907,
      "link": null,
      "locked": false
    },
    {
      "type": "rectangle",
      "version": 1558,
      "versionNonce": 551423645,
      "index": "b1yrV",
      "isDeleted": false,
      "id": "66oUWESs2szy5Tu2IR57k",
      "fillStyle": "solid",
      "strokeWidth": 2,
      "strokeStyle": "solid",
      "roughness": 1,
      "opacity": 100,
      "angle": 0,
      "x": 1593.7627015786109,
      "y": 979.5568984271036,
      "strokeColor": "#1e1e1e",
      "backgroundColor": "#a5d8ff",
      "width": 249.00000000000009,
      "height": 114.99999999999997,
      "seed": 818607038,
      "groupIds": [
        "KsktPBVCh0m-8eJ1ax8wi"
      ],
      "frameId": null,
      "roundness": {
        "type": 3
      },
      "boundElements": [],
      "updated": 1734360231907,
      "link": null,
      "locked": false
    },
    {
      "type": "rectangle",
      "version": 1508,
      "versionNonce": 1656500989,
      "index": "b1ys",
      "isDeleted": false,
      "id": "0stGgUmnEj0FJWSOQa2_X",
      "fillStyle": "solid",
      "strokeWidth": 2,
      "strokeStyle": "solid",
      "roughness": 1,
      "opacity": 100,
      "angle": 0,
      "x": 1592.7627015786109,
      "y": 945.5568984271036,
      "strokeColor": "#1e1e1e",
      "backgroundColor": "#a5d8ff",
      "width": 249.00000000000009,
      "height": 114.99999999999997,
      "seed": 1962003454,
      "groupIds": [
        "KsktPBVCh0m-8eJ1ax8wi"
      ],
      "frameId": null,
      "roundness": {
        "type": 3
      },
      "boundElements": [],
      "updated": 1734360231907,
      "link": null,
      "locked": false
    },
    {
      "type": "rectangle",
      "version": 1351,
      "versionNonce": 571919197,
      "index": "b1ysV",
      "isDeleted": false,
      "id": "oUz79H06A1yzhMam5WMvD",
      "fillStyle": "solid",
      "strokeWidth": 2,
      "strokeStyle": "solid",
      "roughness": 1,
      "opacity": 100,
      "angle": 0,
      "x": 1592.7627015786109,
      "y": 910.5568984271036,
      "strokeColor": "#1e1e1e",
      "backgroundColor": "#a5d8ff",
      "width": 249.00000000000009,
      "height": 114.99999999999997,
      "seed": 1997773886,
      "groupIds": [
        "KsktPBVCh0m-8eJ1ax8wi"
      ],
      "frameId": null,
      "roundness": {
        "type": 3
      },
      "boundElements": [
        {
          "type": "text",
          "id": "gDqcJw586XS90Eux8eqy7"
        },
        {
          "id": "Bj6zp7ALVlRBocmVnGWMH",
          "type": "arrow"
        },
        {
          "id": "Who6V4OKBA7YOdSKks5WU",
          "type": "arrow"
        }
      ],
      "updated": 1734360231907,
      "link": null,
      "locked": false
    },
    {
      "type": "text",
      "version": 1175,
      "versionNonce": 1597986749,
      "index": "b1yt",
      "isDeleted": false,
      "id": "gDqcJw586XS90Eux8eqy7",
      "fillStyle": "solid",
      "strokeWidth": 2,
      "strokeStyle": "solid",
      "roughness": 1,
      "opacity": 100,
      "angle": 0,
      "x": 1599.9710374550757,
      "y": 948.8568984271036,
      "strokeColor": "#1e1e1e",
      "backgroundColor": "transparent",
      "width": 234.5833282470703,
      "height": 38.4,
      "seed": 756114558,
      "groupIds": [
        "KsktPBVCh0m-8eJ1ax8wi"
      ],
      "frameId": null,
      "roundness": null,
      "boundElements": [],
      "updated": 1734360231907,
      "link": null,
      "locked": false,
      "fontSize": 16,
      "fontFamily": 3,
      "text": "StrategyBaseWithTVLLimits\n(1 per LST)",
      "textAlign": "center",
      "verticalAlign": "middle",
      "containerId": "oUz79H06A1yzhMam5WMvD",
      "originalText": "StrategyBaseWithTVLLimits\n(1 per LST)",
      "autoResize": true,
      "lineHeight": 1.2
    },
    {
      "type": "text",
      "version": 454,
      "versionNonce": 1654092627,
      "index": "b1ytG",
      "isDeleted": false,
      "id": "c1SY7VGafpSUMHtyH25Xr",
      "fillStyle": "solid",
      "strokeWidth": 2,
      "strokeStyle": "solid",
      "roughness": 1,
      "opacity": 100,
      "angle": 0,
      "x": 1817.580154661147,
      "y": 426.1428571428572,
      "strokeColor": "#1e1e1e",
      "backgroundColor": "#ffc9c9",
      "width": 313.4666748046875,
      "height": 50,
      "seed": 1218017826,
      "groupIds": [],
      "frameId": null,
      "roundness": null,
      "boundElements": [],
      "updated": 1734113298835,
      "link": null,
      "locked": false,
      "fontSize": 20,
      "fontFamily": 1,
      "text": "0. Approve StrategyManager to\ntransfer deposit amounts",
      "textAlign": "center",
      "verticalAlign": "top",
      "containerId": null,
      "originalText": "0. Approve StrategyManager to\ntransfer deposit amounts",
      "autoResize": true,
      "lineHeight": 1.25
    },
    {
      "type": "arrow",
      "version": 1191,
      "versionNonce": 1575271261,
      "index": "b1ytV",
      "isDeleted": false,
      "id": "B_6S76kMy7S19TN-Xpgxi",
      "fillStyle": "solid",
      "strokeWidth": 2,
      "strokeStyle": "solid",
      "roughness": 1,
      "opacity": 100,
      "angle": 0,
      "x": 2244.2656001597725,
      "y": 671.1629088833433,
      "strokeColor": "#1e1e1e",
      "backgroundColor": "#ffc9c9",
      "width": 360.5783737173265,
      "height": 3.2202684628167617,
      "seed": 1077347490,
      "groupIds": [],
      "frameId": null,
      "roundness": {
        "type": 2
      },
      "boundElements": [],
      "updated": 1734360257984,
      "link": null,
      "locked": false,
      "startBinding": {
        "elementId": "xZf-MkC7-tDuT1_y0E2RJ",
        "focus": 0.08470894448090276,
        "gap": 7.39556321554889
      },
      "endBinding": {
        "elementId": "wVMAbbDeEbMp5p52aabU-",
        "focus": 0.16494087647740363,
        "gap": 7.90079365079373
      },
      "lastCommittedPoint": null,
      "startArrowhead": null,
      "endArrowhead": "triangle",
      "points": [
        [
          0,
          0
        ],
        [
          -360.5783737173265,
          3.2202684628167617
        ]
      ]
    },
    {
      "type": "text",
      "version": 240,
      "versionNonce": 1219520061,
      "index": "b1yu",
      "isDeleted": false,
      "id": "OR7_5x1L3ZEbhEVKLMUwR",
      "fillStyle": "solid",
      "strokeWidth": 2,
      "strokeStyle": "solid",
      "roughness": 1,
      "opacity": 100,
      "angle": 0,
      "x": 1961.8665323648602,
      "y": 694.4699893236942,
      "strokeColor": "#1e1e1e",
      "backgroundColor": "#ffc9c9",
      "width": 222.61666870117188,
      "height": 24,
      "seed": 953797474,
      "groupIds": [],
      "frameId": null,
      "roundness": null,
      "boundElements": [],
      "updated": 1734360260040,
      "link": null,
      "locked": false,
      "fontSize": 20,
      "fontFamily": 3,
      "text": "depositIntoStrategy",
      "textAlign": "center",
      "verticalAlign": "top",
      "containerId": null,
      "originalText": "depositIntoStrategy",
      "autoResize": true,
      "lineHeight": 1.2
    },
    {
      "type": "text",
      "version": 265,
      "versionNonce": 272327741,
      "index": "b1yuV",
      "isDeleted": false,
      "id": "dPD4J6PBBhuD02bxds9p7",
      "fillStyle": "solid",
      "strokeWidth": 2,
      "strokeStyle": "solid",
      "roughness": 1,
      "opacity": 100,
      "angle": 0,
      "x": 1989.9982692537926,
      "y": 635.0022298479423,
      "strokeColor": "#1e1e1e",
      "backgroundColor": "#ffc9c9",
      "width": 156.03334045410156,
      "height": 25,
      "seed": 1544827362,
      "groupIds": [],
      "frameId": null,
      "roundness": null,
      "boundElements": [],
      "updated": 1734360262644,
      "link": null,
      "locked": false,
      "fontSize": 20,
      "fontFamily": 1,
      "text": "1. Deposit LSTs",
      "textAlign": "center",
      "verticalAlign": "top",
      "containerId": null,
      "originalText": "1. Deposit LSTs",
      "autoResize": true,
      "lineHeight": 1.25
    },
    {
      "type": "arrow",
      "version": 1334,
      "versionNonce": 341268509,
      "index": "b1yv",
      "isDeleted": false,
      "id": "Bj6zp7ALVlRBocmVnGWMH",
      "fillStyle": "solid",
      "strokeWidth": 2,
      "strokeStyle": "solid",
      "roughness": 1,
      "opacity": 100,
      "angle": 0,
      "x": 1731.593808711268,
      "y": 737.9171459806447,
      "strokeColor": "#1e1e1e",
      "backgroundColor": "#ffc9c9",
      "width": 117.08400107865964,
      "height": 163.37387943058638,
      "seed": 801795390,
      "groupIds": [],
      "frameId": null,
      "roundness": {
        "type": 2
      },
      "boundElements": [
        {
          "type": "text",
          "id": "eP99TQkpI2x9f7BJ2cKb-"
        }
      ],
      "updated": 1734360231907,
      "link": null,
      "locked": false,
      "startBinding": {
        "elementId": "wVMAbbDeEbMp5p52aabU-",
        "focus": -0.16112741540408798,
        "gap": 7.4325396825393
      },
      "endBinding": {
        "elementId": "oUz79H06A1yzhMam5WMvD",
        "focus": -0.908836098861225,
        "gap": 9.265873015872558
      },
      "lastCommittedPoint": null,
      "startArrowhead": null,
      "endArrowhead": "triangle",
      "points": [
        [
          0,
          0
        ],
        [
          -117.08400107865964,
          163.37387943058638
        ]
      ]
    },
    {
      "type": "text",
      "version": 51,
      "versionNonce": 1519847901,
      "index": "b1yvG",
      "isDeleted": false,
      "id": "eP99TQkpI2x9f7BJ2cKb-",
      "fillStyle": "solid",
      "strokeWidth": 2,
      "strokeStyle": "solid",
      "roughness": 1,
      "opacity": 100,
      "angle": 0,
      "x": 1746.2220671702282,
      "y": 743.9464285714288,
      "strokeColor": "#1e1e1e",
      "backgroundColor": "#ffc9c9",
      "width": 191.61984622478485,
      "height": 50,
      "seed": 72803874,
      "groupIds": [],
      "frameId": null,
      "roundness": null,
      "boundElements": [],
      "updated": 1734360226997,
      "link": null,
      "locked": false,
      "fontSize": 20,
      "fontFamily": 1,
      "text": "2. Transfer tokens\nto strategy",
      "textAlign": "center",
      "verticalAlign": "middle",
      "containerId": "Bj6zp7ALVlRBocmVnGWMH",
      "originalText": "2. Transfer tokens to strategy",
      "autoResize": true,
      "lineHeight": 1.25
    },
    {
      "type": "arrow",
      "version": 671,
      "versionNonce": 1692118035,
      "index": "b1yvV",
      "isDeleted": false,
      "id": "Who6V4OKBA7YOdSKks5WU",
      "fillStyle": "solid",
      "strokeWidth": 2,
      "strokeStyle": "solid",
      "roughness": 1,
      "opacity": 100,
      "angle": 0,
      "x": 1850.9902149301315,
      "y": 921.4976590025567,
      "strokeColor": "#1e1e1e",
      "backgroundColor": "#ffc9c9",
      "width": 116.88516834619963,
      "height": 200.6323634923193,
      "seed": 1310791522,
      "groupIds": [],
      "frameId": null,
      "roundness": {
        "type": 2
      },
      "boundElements": [
        {
          "type": "text",
          "id": "TSrje3lowDMZwQ1PERCdD"
        }
      ],
      "updated": 1734360323660,
      "link": null,
      "locked": false,
      "startBinding": {
        "elementId": "oUz79H06A1yzhMam5WMvD",
        "focus": 0.34684392252796814,
        "gap": 9.227513351520656,
        "fixedPoint": null
      },
      "endBinding": {
        "elementId": "wVMAbbDeEbMp5p52aabU-",
        "focus": -0.39267292129709724,
        "gap": 1,
        "fixedPoint": null
      },
      "lastCommittedPoint": null,
      "startArrowhead": null,
      "endArrowhead": "triangle",
      "points": [
        [
          0,
          0
        ],
        [
          116.88516834619963,
          -85.84845852014746
        ],
        [
          17.863239999640427,
          -200.6323634923193
        ]
      ]
    },
    {
      "type": "text",
      "version": 152,
      "versionNonce": 1615275485,
      "index": "b1yw",
      "isDeleted": false,
      "id": "TSrje3lowDMZwQ1PERCdD",
      "fillStyle": "solid",
      "strokeWidth": 2,
      "strokeStyle": "solid",
      "roughness": 1,
      "opacity": 100,
      "angle": 0,
      "x": 1874.705446142542,
      "y": 810.6492004824092,
      "strokeColor": "#1e1e1e",
      "backgroundColor": "#ffc9c9",
      "width": 186.33987426757812,
      "height": 50,
      "seed": 559498850,
      "groupIds": [],
      "frameId": null,
      "roundness": null,
      "boundElements": [],
      "updated": 1734360322544,
      "link": null,
      "locked": false,
      "fontSize": 20,
      "fontFamily": 1,
      "text": "3. Staker awarded\ndeposit shares",
      "textAlign": "center",
      "verticalAlign": "middle",
      "containerId": "Who6V4OKBA7YOdSKks5WU",
      "originalText": "3. Staker awarded deposit shares",
      "autoResize": true,
      "lineHeight": 1.25
    },
    {
      "type": "arrow",
      "version": 317,
      "versionNonce": 1888925363,
      "index": "b1ywV",
      "isDeleted": false,
      "id": "lS4fRSLZHIKN77q4fwuWo",
      "fillStyle": "solid",
      "strokeWidth": 2,
      "strokeStyle": "solid",
      "roughness": 1,
      "opacity": 100,
      "angle": 0,
      "x": 1703.2798349482075,
      "y": 606.7107967742961,
      "strokeColor": "#1e1e1e",
      "backgroundColor": "#ffc9c9",
      "width": 244.89245252218734,
      "height": 258.48460629810546,
      "seed": 1253663550,
      "groupIds": [],
      "frameId": null,
      "roundness": {
        "type": 2
      },
      "boundElements": [
        {
          "type": "text",
          "id": "6PJ_9NCrM6WpCh8MNp_fj"
        }
      ],
      "updated": 1734361144598,
      "link": null,
      "locked": false,
      "startBinding": {
        "elementId": "wVMAbbDeEbMp5p52aabU-",
        "focus": 0.010738090831398414,
        "gap": 8.773809523809291,
        "fixedPoint": null
      },
      "endBinding": {
        "elementId": "d7pRFde2mvhA75ZinOGRD",
        "focus": -0.5765561345526261,
        "gap": 6.011904761905015,
        "fixedPoint": null
      },
      "lastCommittedPoint": null,
      "startArrowhead": null,
      "endArrowhead": "triangle",
      "points": [
        [
          0,
          0
        ],
        [
          -244.89245252218734,
          -258.48460629810546
        ]
      ]
    },
    {
      "type": "text",
      "version": 139,
      "versionNonce": 215084349,
      "index": "b1yx",
      "isDeleted": false,
      "id": "6PJ_9NCrM6WpCh8MNp_fj",
      "fillStyle": "solid",
      "strokeWidth": 2,
      "strokeStyle": "solid",
      "roughness": 1,
      "opacity": 100,
      "angle": 0,
      "x": 1475.87370878477,
      "y": 402.46849362524335,
      "strokeColor": "#1e1e1e",
      "backgroundColor": "#ffc9c9",
      "width": 209.9197998046875,
      "height": 150,
      "seed": 1985941538,
      "groupIds": [],
      "frameId": null,
      "roundness": null,
      "boundElements": [],
      "updated": 1734361142777,
      "link": null,
      "locked": false,
      "fontSize": 20,
      "fontFamily": 1,
      "text": "4. If Staker is\ndelegated, update\nOperator's delegated\nshares based on\nstaker's increased\ndeposit shares",
      "textAlign": "center",
      "verticalAlign": "middle",
      "containerId": "lS4fRSLZHIKN77q4fwuWo",
      "originalText": "4. If Staker is delegated, update Operator's delegated shares based on staker's increased deposit shares",
      "autoResize": true,
      "lineHeight": 1.25
    },
    {
      "type": "rectangle",
      "version": 2191,
      "versionNonce": 450935581,
      "index": "b1yxG",
      "isDeleted": false,
      "id": "Njo4VT6aJS-BOBxW_rIMR",
      "fillStyle": "solid",
      "strokeWidth": 2,
      "strokeStyle": "solid",
      "roughness": 1,
      "opacity": 100,
      "angle": 0,
      "x": 2502.4901691502105,
      "y": 2039.71548848204,
      "strokeColor": "#1e1e1e",
      "backgroundColor": "#ffec99",
      "width": 455.8571428571431,
      "height": 114.99999999999997,
      "seed": 684382434,
      "groupIds": [],
      "frameId": null,
      "roundness": {
        "type": 3
      },
      "boundElements": [
        {
          "type": "text",
          "id": "S7nHBIf33C-pylj1fs2dG"
        },
        {
          "id": "hNnYwYsWakliX5fkmwJVb",
          "type": "arrow"
        },
        {
          "id": "b0llJrpSAPPddIptJHKYn",
          "type": "arrow"
        },
        {
          "id": "cGXQvdtzHLMM12Ot3tcts",
          "type": "arrow"
        }
      ],
      "updated": 1734361197598,
      "link": null,
      "locked": false
    },
    {
      "type": "text",
      "version": 1922,
      "versionNonce": 1354059645,
      "index": "b1yxV",
      "isDeleted": false,
      "id": "S7nHBIf33C-pylj1fs2dG",
      "fillStyle": "solid",
      "strokeWidth": 2,
      "strokeStyle": "solid",
      "roughness": 1,
      "opacity": 100,
      "angle": 0,
      "x": 2650.660409279954,
      "y": 2087.61548848204,
      "strokeColor": "#1e1e1e",
      "backgroundColor": "transparent",
      "width": 159.51666259765625,
      "height": 19.2,
      "seed": 360803490,
      "groupIds": [],
      "frameId": null,
      "roundness": null,
      "boundElements": [],
      "updated": 1734361197598,
      "link": null,
      "locked": false,
      "fontSize": 16,
      "fontFamily": 3,
      "text": "DelegationManager",
      "textAlign": "center",
      "verticalAlign": "middle",
      "containerId": "Njo4VT6aJS-BOBxW_rIMR",
      "originalText": "DelegationManager",
      "autoResize": true,
      "lineHeight": 1.2
    },
    {
      "type": "rectangle",
      "version": 1721,
      "versionNonce": 1335306493,
      "index": "b1yy",
      "isDeleted": false,
      "id": "fMrtOCuZyykx1UE2GS84u",
      "fillStyle": "solid",
      "strokeWidth": 2,
      "strokeStyle": "solid",
      "roughness": 1,
      "opacity": 100,
      "angle": 0,
      "x": 2414.998105658148,
      "y": 2353.6123138788653,
      "strokeColor": "#1e1e1e",
      "backgroundColor": "#b2f2bb",
      "width": 223.00000000000006,
      "height": 114.99999999999997,
      "seed": 498042978,
      "groupIds": [],
      "frameId": null,
      "roundness": {
        "type": 3
      },
      "boundElements": [
        {
          "type": "text",
          "id": "LNX2NfmyO99AzTqRwXqZk"
        },
        {
          "id": "b0llJrpSAPPddIptJHKYn",
          "type": "arrow"
        }
      ],
      "updated": 1734361197598,
      "link": null,
      "locked": false
    },
    {
      "type": "text",
      "version": 1420,
      "versionNonce": 1680015709,
      "index": "b1yyV",
      "isDeleted": false,
      "id": "LNX2NfmyO99AzTqRwXqZk",
      "fillStyle": "solid",
      "strokeWidth": 2,
      "strokeStyle": "solid",
      "roughness": 1,
      "opacity": 100,
      "angle": 0,
      "x": 2456.123105658148,
      "y": 2401.512313878865,
      "strokeColor": "#1e1e1e",
      "backgroundColor": "transparent",
      "width": 140.75,
      "height": 19.2,
      "seed": 2032413730,
      "groupIds": [],
      "frameId": null,
      "roundness": null,
      "boundElements": [],
      "updated": 1734361197598,
      "link": null,
      "locked": false,
      "fontSize": 16,
      "fontFamily": 3,
      "text": "EigenPodManager",
      "textAlign": "center",
      "verticalAlign": "middle",
      "containerId": "fMrtOCuZyykx1UE2GS84u",
      "originalText": "EigenPodManager",
      "autoResize": true,
      "lineHeight": 1.2
    },
    {
      "type": "ellipse",
      "version": 1334,
      "versionNonce": 491654685,
      "index": "b1yz",
      "isDeleted": false,
      "id": "pYX7-scbCCY5JSKmZ1I-q",
      "fillStyle": "solid",
      "strokeWidth": 2,
      "strokeStyle": "solid",
      "roughness": 1,
      "opacity": 100,
      "angle": 0,
      "x": 1994.5715183565608,
      "y": 2081.2571551487063,
      "strokeColor": "#1e1e1e",
      "backgroundColor": "#ffc9c9",
      "width": 108.75,
      "height": 105,
      "seed": 231626722,
      "groupIds": [],
      "frameId": null,
      "roundness": {
        "type": 2
      },
      "boundElements": [
        {
          "type": "text",
          "id": "7ExJPMtL5cEUiKWn321Sh"
        },
        {
          "id": "hNnYwYsWakliX5fkmwJVb",
          "type": "arrow"
        }
      ],
      "updated": 1734361197598,
      "link": null,
      "locked": false
    },
    {
      "type": "text",
      "version": 1088,
      "versionNonce": 1610629757,
      "index": "b1yzG",
      "isDeleted": false,
      "id": "7ExJPMtL5cEUiKWn321Sh",
      "fillStyle": "solid",
      "strokeWidth": 2,
      "strokeStyle": "solid",
      "roughness": 1,
      "opacity": 100,
      "angle": 0,
      "x": 2020.3642539233656,
      "y": 2122.1340491364126,
      "strokeColor": "#1e1e1e",
      "backgroundColor": "#ffc9c9",
      "width": 57.266666412353516,
      "height": 23,
      "seed": 733809570,
      "groupIds": [],
      "frameId": null,
      "roundness": null,
      "boundElements": [],
      "updated": 1734361197598,
      "link": null,
      "locked": false,
      "fontSize": 20,
      "fontFamily": 2,
      "text": "Staker",
      "textAlign": "center",
      "verticalAlign": "middle",
      "containerId": "pYX7-scbCCY5JSKmZ1I-q",
      "originalText": "Staker",
      "autoResize": true,
      "lineHeight": 1.15
    },
    {
      "type": "text",
      "version": 1068,
      "versionNonce": 258311997,
      "index": "b1yzV",
      "isDeleted": false,
      "id": "ctarScP_mj0QeE5OZNAlr",
      "fillStyle": "solid",
      "strokeWidth": 2,
      "strokeStyle": "solid",
      "roughness": 1,
      "opacity": 100,
      "angle": 0,
      "x": 2021.2500897851316,
      "y": 2268.608345624897,
      "strokeColor": "#1e1e1e",
      "backgroundColor": "#ffc9c9",
      "width": 320.1666564941406,
      "height": 64.39999999999999,
      "seed": 1226786658,
      "groupIds": [],
      "frameId": null,
      "roundness": null,
      "boundElements": [],
      "updated": 1734361197598,
      "link": null,
      "locked": false,
      "fontSize": 28,
      "fontFamily": 2,
      "text": "Staker Flow:\nDelegating to an Operator",
      "textAlign": "center",
      "verticalAlign": "top",
      "containerId": null,
      "originalText": "Staker Flow:\nDelegating to an Operator",
      "autoResize": true,
      "lineHeight": 1.15
    },
    {
      "type": "arrow",
      "version": 763,
      "versionNonce": 1016613107,
      "index": "b1yzl",
      "isDeleted": false,
      "id": "hNnYwYsWakliX5fkmwJVb",
      "fillStyle": "solid",
      "strokeWidth": 2,
      "strokeStyle": "solid",
      "roughness": 1,
      "opacity": 100,
      "angle": 0,
      "x": 2114.9106506143335,
      "y": 2145.5654144347063,
      "strokeColor": "#1e1e1e",
      "backgroundColor": "#ffc9c9",
      "width": 379.0686058374654,
      "height": 2.7707857282800887,
      "seed": 1044646690,
      "groupIds": [],
      "frameId": null,
      "roundness": {
        "type": 2
      },
      "boundElements": [],
      "updated": 1734361197728,
      "link": null,
      "locked": false,
      "startBinding": {
        "elementId": "pYX7-scbCCY5JSKmZ1I-q",
        "focus": 0.23409655429971704,
        "gap": 12.698164422728148,
        "fixedPoint": null
      },
      "endBinding": {
        "elementId": "Njo4VT6aJS-BOBxW_rIMR",
        "focus": -0.7411498268808536,
        "gap": 8.51091269841163,
        "fixedPoint": null
      },
      "lastCommittedPoint": null,
      "startArrowhead": null,
      "endArrowhead": "triangle",
      "points": [
        [
          0,
          0
        ],
        [
          379.0686058374654,
          -2.7707857282800887
        ]
      ]
    },
    {
      "type": "text",
      "version": 253,
      "versionNonce": 1683004413,
      "index": "b1z",
      "isDeleted": false,
      "id": "pjE8l-z9Co8dDH2mNSC-0",
      "fillStyle": "solid",
      "strokeWidth": 2,
      "strokeStyle": "solid",
      "roughness": 1,
      "opacity": 100,
      "angle": 0,
      "x": 2218.7292577233648,
      "y": 2159.775012291564,
      "strokeColor": "#1e1e1e",
      "backgroundColor": "#ffc9c9",
      "width": 117.16666412353516,
      "height": 24,
      "seed": 26892002,
      "groupIds": [],
      "frameId": null,
      "roundness": null,
      "boundElements": [],
      "updated": 1734361197598,
      "link": null,
      "locked": false,
      "fontSize": 20,
      "fontFamily": 3,
      "text": "delegateTo",
      "textAlign": "center",
      "verticalAlign": "top",
      "containerId": null,
      "originalText": "delegateTo",
      "autoResize": true,
      "lineHeight": 1.2
    },
    {
      "type": "text",
      "version": 319,
      "versionNonce": 657855581,
      "index": "b20",
      "isDeleted": false,
      "id": "3yhssR2VfkcGJ9mtnM6dJ",
      "fillStyle": "solid",
      "strokeWidth": 2,
      "strokeStyle": "solid",
      "roughness": 1,
      "opacity": 100,
      "angle": 0,
      "x": 2129.2042574690518,
      "y": 2076.441678958231,
      "strokeColor": "#1e1e1e",
      "backgroundColor": "#ffc9c9",
      "width": 272.8833312988281,
      "height": 50,
      "seed": 1672555170,
      "groupIds": [],
      "frameId": null,
      "roundness": null,
      "boundElements": [],
      "updated": 1734361197598,
      "link": null,
      "locked": false,
      "fontSize": 20,
      "fontFamily": 1,
      "text": "1. Delegate to a registered\nOperator",
      "textAlign": "center",
      "verticalAlign": "top",
      "containerId": null,
      "originalText": "1. Delegate to a registered\nOperator",
      "autoResize": true,
      "lineHeight": 1.25
    },
    {
      "type": "arrow",
      "version": 522,
      "versionNonce": 1664804915,
      "index": "b21",
      "isDeleted": false,
      "id": "b0llJrpSAPPddIptJHKYn",
      "fillStyle": "solid",
      "strokeWidth": 2,
      "strokeStyle": "solid",
      "roughness": 1,
      "opacity": 100,
      "angle": 0,
      "x": 2594.0753392814922,
      "y": 2163.108345624897,
      "strokeColor": "#1e1e1e",
      "backgroundColor": "#ffc9c9",
      "width": 110.84284788508944,
      "height": 183.33333333333303,
      "seed": 1261930082,
      "groupIds": [],
      "frameId": null,
      "roundness": {
        "type": 2
      },
      "boundElements": [
        {
          "type": "text",
          "id": "dIrPhtpgOibEaRGdpQA3n"
        }
      ],
      "updated": 1734361197728,
      "link": null,
      "locked": false,
      "startBinding": {
        "elementId": "Njo4VT6aJS-BOBxW_rIMR",
        "focus": 0.36736717019133747,
        "gap": 8.392857142857451,
        "fixedPoint": null
      },
      "endBinding": {
        "elementId": "fMrtOCuZyykx1UE2GS84u",
        "focus": -0.5631263541856226,
        "gap": 7.170634920635166,
        "fixedPoint": null
      },
      "lastCommittedPoint": null,
      "startArrowhead": null,
      "endArrowhead": "triangle",
      "points": [
        [
          0,
          0
        ],
        [
          -110.84284788508944,
          183.33333333333303
        ]
      ]
    },
    {
      "type": "text",
      "version": 161,
      "versionNonce": 1197778419,
      "index": "b22",
      "isDeleted": false,
      "id": "dIrPhtpgOibEaRGdpQA3n",
      "fillStyle": "solid",
      "strokeWidth": 2,
      "strokeStyle": "solid",
      "roughness": 1,
      "opacity": 100,
      "angle": 0,
      "x": 1947.605846592538,
      "y": 1558.0357142857135,
      "strokeColor": "#1e1e1e",
      "backgroundColor": "#ffc9c9",
      "width": 191.73980712890625,
      "height": 75,
      "seed": 1895590434,
      "groupIds": [],
      "frameId": null,
      "roundness": null,
      "boundElements": [],
      "updated": 1734360637084,
      "link": null,
      "locked": false,
      "fontSize": 20,
      "fontFamily": 1,
      "text": "2. Query number of\ndeposit shares held\nby Staker",
      "textAlign": "center",
      "verticalAlign": "middle",
      "containerId": "b0llJrpSAPPddIptJHKYn",
      "originalText": "2. Query number of deposit shares held by Staker",
      "autoResize": true,
      "lineHeight": 1.25
    },
    {
      "type": "rectangle",
      "version": 830,
      "versionNonce": 788029725,
      "index": "b23",
      "isDeleted": false,
      "id": "iF4Go9CXS_-O1rd3mGeIe",
      "fillStyle": "solid",
      "strokeWidth": 2,
      "strokeStyle": "solid",
      "roughness": 1,
      "opacity": 100,
      "angle": 0,
      "x": 2828.078462801005,
      "y": 2356.882155148707,
      "strokeColor": "#1e1e1e",
      "backgroundColor": "#a5d8ff",
      "width": 223.00000000000006,
      "height": 114.99999999999997,
      "seed": 468637154,
      "groupIds": [],
      "frameId": null,
      "roundness": {
        "type": 3
      },
      "boundElements": [
        {
          "type": "text",
          "id": "dOm_3_POehmCJNweKFBRR"
        },
        {
          "id": "cGXQvdtzHLMM12Ot3tcts",
          "type": "arrow"
        }
      ],
      "updated": 1734361197598,
      "link": null,
      "locked": false
    },
    {
      "type": "text",
      "version": 567,
      "versionNonce": 250099069,
      "index": "b24",
      "isDeleted": false,
      "id": "dOm_3_POehmCJNweKFBRR",
      "fillStyle": "solid",
      "strokeWidth": 2,
      "strokeStyle": "solid",
      "roughness": 1,
      "opacity": 100,
      "angle": 0,
      "x": 2869.203462801005,
      "y": 2404.782155148707,
      "strokeColor": "#1e1e1e",
      "backgroundColor": "transparent",
      "width": 140.75,
      "height": 19.2,
      "seed": 1562233250,
      "groupIds": [],
      "frameId": null,
      "roundness": null,
      "boundElements": [],
      "updated": 1734361197598,
      "link": null,
      "locked": false,
      "fontSize": 16,
      "fontFamily": 3,
      "text": "StrategyManager",
      "textAlign": "center",
      "verticalAlign": "middle",
      "containerId": "iF4Go9CXS_-O1rd3mGeIe",
      "originalText": "StrategyManager",
      "autoResize": true,
      "lineHeight": 1.2
    },
    {
      "type": "arrow",
      "version": 590,
      "versionNonce": 1722726259,
      "index": "b25",
      "isDeleted": false,
      "id": "cGXQvdtzHLMM12Ot3tcts",
      "fillStyle": "solid",
      "strokeWidth": 2,
      "strokeStyle": "solid",
      "roughness": 1,
      "opacity": 100,
      "angle": 0,
      "x": 2844.0631322883887,
      "y": 2161.7410867736708,
      "strokeColor": "#1e1e1e",
      "backgroundColor": "#ffc9c9",
      "width": 152.49048544824382,
      "height": 186.66666666666606,
      "seed": 1270367586,
      "groupIds": [],
      "frameId": null,
      "roundness": {
        "type": 2
      },
      "boundElements": [
        {
          "type": "text",
          "id": "FnnLkQFKdQqwVYvgZ3Chu"
        }
      ],
      "updated": 1734361197728,
      "link": null,
      "locked": false,
      "startBinding": {
        "elementId": "Njo4VT6aJS-BOBxW_rIMR",
        "focus": -0.22165271141817774,
        "gap": 7.025598291631127,
        "fixedPoint": null
      },
      "endBinding": {
        "elementId": "iF4Go9CXS_-O1rd3mGeIe",
        "focus": 0.6996198786224589,
        "gap": 8.474401708370351,
        "fixedPoint": null
      },
      "lastCommittedPoint": null,
      "startArrowhead": null,
      "endArrowhead": "triangle",
      "points": [
        [
          0,
          0
        ],
        [
          152.49048544824382,
          186.66666666666606
        ]
      ]
    },
    {
      "type": "text",
      "version": 157,
      "versionNonce": 1058245821,
      "index": "b26",
      "isDeleted": false,
      "id": "FnnLkQFKdQqwVYvgZ3Chu",
      "fillStyle": "solid",
      "strokeWidth": 2,
      "strokeStyle": "solid",
      "roughness": 1,
      "opacity": 100,
      "angle": 0,
      "x": 2329.260306266101,
      "y": 1558.3351221011537,
      "strokeColor": "#1e1e1e",
      "backgroundColor": "#ffc9c9",
      "width": 191.73980712890625,
      "height": 75,
      "seed": 1091389730,
      "groupIds": [],
      "frameId": null,
      "roundness": null,
      "boundElements": [],
      "updated": 1734360640718,
      "link": null,
      "locked": false,
      "fontSize": 20,
      "fontFamily": 1,
      "text": "2. Query number of\ndeposit shares held\nby Staker",
      "textAlign": "center",
      "verticalAlign": "middle",
      "containerId": "cGXQvdtzHLMM12Ot3tcts",
      "originalText": "2. Query number of deposit shares held by Staker",
      "autoResize": true,
      "lineHeight": 1.25
    },
    {
      "type": "text",
      "version": 612,
      "versionNonce": 1407208029,
      "index": "b27",
      "isDeleted": false,
      "id": "VT_j7-YBBoCet0xKP8qhO",
      "fillStyle": "solid",
      "strokeWidth": 2,
      "strokeStyle": "solid",
      "roughness": 1,
      "opacity": 100,
      "angle": 0,
      "x": 2988.406633433543,
      "y": 2059.002177039263,
      "strokeColor": "#1e1e1e",
      "backgroundColor": "#ffc9c9",
      "width": 411.15966796875,
      "height": 100,
      "seed": 1915095486,
      "groupIds": [],
      "frameId": null,
      "roundness": null,
      "boundElements": [],
      "updated": 1734364477445,
      "link": null,
      "locked": false,
      "fontSize": 20,
      "fontFamily": 1,
      "text": "4. If staker is delegated, add delegated\nshares to Operator\n(increased by deposit shares amount)\n",
      "textAlign": "center",
      "verticalAlign": "top",
      "containerId": null,
      "originalText": "4. If staker is delegated, add delegated\nshares to Operator\n(increased by deposit shares amount)\n",
      "autoResize": true,
      "lineHeight": 1.25
    },
    {
      "type": "ellipse",
      "version": 1439,
      "versionNonce": 1773195261,
      "index": "b28",
      "isDeleted": false,
      "id": "ww6cJfMczV8T_u_QeDNDu",
      "fillStyle": "solid",
      "strokeWidth": 2,
      "strokeStyle": "solid",
      "roughness": 1,
      "opacity": 100,
      "angle": 0,
      "x": 1930.4582723589,
      "y": 4085.798557781826,
      "strokeColor": "#1e1e1e",
      "backgroundColor": "#ffc9c9",
      "width": 108.75,
      "height": 105,
      "seed": 793558526,
      "groupIds": [],
      "frameId": null,
      "roundness": {
        "type": 2
      },
      "boundElements": [
        {
          "type": "text",
          "id": "f3pJyffpDIooPa2lvpCDJ"
        },
        {
          "id": "BEr_TOZmKQdO6AcwFrKWb",
          "type": "arrow"
        },
        {
          "id": "VxgaSm93O4OlqrZMY57Iu",
          "type": "arrow"
        }
      ],
      "updated": 1734363560512,
      "link": null,
      "locked": false
    },
    {
      "type": "text",
      "version": 1192,
      "versionNonce": 2054146141,
      "index": "b29",
      "isDeleted": false,
      "id": "f3pJyffpDIooPa2lvpCDJ",
      "fillStyle": "solid",
      "strokeWidth": 2,
      "strokeStyle": "solid",
      "roughness": 1,
      "opacity": 100,
      "angle": 0,
      "x": 1956.251007925705,
      "y": 4126.675451769532,
      "strokeColor": "#1e1e1e",
      "backgroundColor": "#ffc9c9",
      "width": 57.266666412353516,
      "height": 23,
      "seed": 1296059966,
      "groupIds": [],
      "frameId": null,
      "roundness": null,
      "boundElements": [],
      "updated": 1734363560512,
      "link": null,
      "locked": false,
      "fontSize": 20,
      "fontFamily": 2,
      "text": "Staker",
      "textAlign": "center",
      "verticalAlign": "middle",
      "containerId": "ww6cJfMczV8T_u_QeDNDu",
      "originalText": "Staker",
      "autoResize": true,
      "lineHeight": 1.15
    },
    {
      "type": "text",
      "version": 926,
      "versionNonce": 1485728125,
      "index": "b2A",
      "isDeleted": false,
      "id": "n5kMVYG-Ovvk81SmcoVgI",
      "fillStyle": "solid",
      "strokeWidth": 2,
      "strokeStyle": "solid",
      "roughness": 1,
      "opacity": 100,
      "angle": 0,
      "x": 1645.111834632196,
      "y": 4283.149748258017,
      "strokeColor": "#1e1e1e",
      "backgroundColor": "#ffc9c9",
      "width": 274.2166748046875,
      "height": 96.6,
      "seed": 1054332542,
      "groupIds": [],
      "frameId": null,
      "roundness": null,
      "boundElements": [],
      "updated": 1734363560512,
      "link": null,
      "locked": false,
      "fontSize": 28,
      "fontFamily": 2,
      "text": "Staker Flow:\nCompleting an LST\nWithdrawal As Tokens",
      "textAlign": "center",
      "verticalAlign": "top",
      "containerId": null,
      "originalText": "Staker Flow:\nCompleting an LST\nWithdrawal As Tokens",
      "autoResize": true,
      "lineHeight": 1.15
    },
    {
      "type": "rectangle",
      "version": 1439,
      "versionNonce": 1029583325,
      "index": "b2B",
      "isDeleted": false,
      "id": "YEevKYXKSnAcEpK4SoXAN",
      "fillStyle": "solid",
      "strokeWidth": 2,
      "strokeStyle": "solid",
      "roughness": 1,
      "opacity": 100,
      "angle": 0,
      "x": 1375.6318834700096,
      "y": 4369.756891115159,
      "strokeColor": "#1e1e1e",
      "backgroundColor": "#a5d8ff",
      "width": 223.00000000000006,
      "height": 114.99999999999997,
      "seed": 1557419710,
      "groupIds": [],
      "frameId": null,
      "roundness": {
        "type": 3
      },
      "boundElements": [
        {
          "type": "text",
          "id": "2_63cFNXHKARWqWOScRsc"
        },
        {
          "id": "1YDohtzXZZQMtHn9rNLZR",
          "type": "arrow"
        },
        {
          "id": "LKXfIwH6k9YoTbRX_b9gI",
          "type": "arrow"
        }
      ],
      "updated": 1734363560512,
      "link": null,
      "locked": false
    },
    {
      "type": "text",
      "version": 1166,
      "versionNonce": 433450557,
      "index": "b2C",
      "isDeleted": false,
      "id": "2_63cFNXHKARWqWOScRsc",
      "fillStyle": "solid",
      "strokeWidth": 2,
      "strokeStyle": "solid",
      "roughness": 1,
      "opacity": 100,
      "angle": 0,
      "x": 1416.7568834700096,
      "y": 4417.656891115159,
      "strokeColor": "#1e1e1e",
      "backgroundColor": "transparent",
      "width": 140.75,
      "height": 19.2,
      "seed": 1071042302,
      "groupIds": [],
      "frameId": null,
      "roundness": null,
      "boundElements": [],
      "updated": 1734363560512,
      "link": null,
      "locked": false,
      "fontSize": 16,
      "fontFamily": 3,
      "text": "StrategyManager",
      "textAlign": "center",
      "verticalAlign": "middle",
      "containerId": "YEevKYXKSnAcEpK4SoXAN",
      "originalText": "StrategyManager",
      "autoResize": true,
      "lineHeight": 1.2
    },
    {
      "type": "rectangle",
      "version": 1885,
      "versionNonce": 520870749,
      "index": "b2D",
      "isDeleted": false,
      "id": "znJmTtSHOG4nKL_lIS9OI",
      "fillStyle": "solid",
      "strokeWidth": 2,
      "strokeStyle": "solid",
      "roughness": 1,
      "opacity": 100,
      "angle": 0,
      "x": 1620.1001374382645,
      "y": 4791.48308159135,
      "strokeColor": "#1e1e1e",
      "backgroundColor": "#a5d8ff",
      "width": 249.00000000000009,
      "height": 114.99999999999997,
      "seed": 1147158334,
      "groupIds": [
        "TqASbmNKtAb95Cc8uANEn"
      ],
      "frameId": null,
      "roundness": {
        "type": 3
      },
      "boundElements": [],
      "updated": 1734363560512,
      "link": null,
      "locked": false
    },
    {
      "type": "rectangle",
      "version": 1835,
      "versionNonce": 454191037,
      "index": "b2E",
      "isDeleted": false,
      "id": "TnoxboQXJOxVczGEBb3hq",
      "fillStyle": "solid",
      "strokeWidth": 2,
      "strokeStyle": "solid",
      "roughness": 1,
      "opacity": 100,
      "angle": 0,
      "x": 1619.1001374382645,
      "y": 4757.48308159135,
      "strokeColor": "#1e1e1e",
      "backgroundColor": "#a5d8ff",
      "width": 249.00000000000009,
      "height": 114.99999999999997,
      "seed": 248620926,
      "groupIds": [
        "TqASbmNKtAb95Cc8uANEn"
      ],
      "frameId": null,
      "roundness": {
        "type": 3
      },
      "boundElements": [],
      "updated": 1734363560512,
      "link": null,
      "locked": false
    },
    {
      "type": "rectangle",
      "version": 1831,
      "versionNonce": 55076893,
      "index": "b2F",
      "isDeleted": false,
      "id": "rk_4mrycfQe0nkdZf3KYv",
      "fillStyle": "solid",
      "strokeWidth": 2,
      "strokeStyle": "solid",
      "roughness": 1,
      "opacity": 100,
      "angle": 0,
      "x": 1617.6001374382645,
      "y": 4724.48308159135,
      "strokeColor": "#1e1e1e",
      "backgroundColor": "#a5d8ff",
      "width": 249.00000000000009,
      "height": 114.99999999999997,
      "seed": 258738110,
      "groupIds": [
        "TqASbmNKtAb95Cc8uANEn"
      ],
      "frameId": null,
      "roundness": {
        "type": 3
      },
      "boundElements": [],
      "updated": 1734363560512,
      "link": null,
      "locked": false
    },
    {
      "type": "rectangle",
      "version": 1781,
      "versionNonce": 161438845,
      "index": "b2G",
      "isDeleted": false,
      "id": "TAs2gzucG2h_8VB50-1i1",
      "fillStyle": "solid",
      "strokeWidth": 2,
      "strokeStyle": "solid",
      "roughness": 1,
      "opacity": 100,
      "angle": 0,
      "x": 1616.6001374382645,
      "y": 4690.48308159135,
      "strokeColor": "#1e1e1e",
      "backgroundColor": "#a5d8ff",
      "width": 249.00000000000009,
      "height": 114.99999999999997,
      "seed": 105930750,
      "groupIds": [
        "TqASbmNKtAb95Cc8uANEn"
      ],
      "frameId": null,
      "roundness": {
        "type": 3
      },
      "boundElements": [],
      "updated": 1734363560512,
      "link": null,
      "locked": false
    },
    {
      "type": "rectangle",
      "version": 1628,
      "versionNonce": 634963165,
      "index": "b2H",
      "isDeleted": false,
      "id": "GofJhEttiaSCMMbeZPpHJ",
      "fillStyle": "solid",
      "strokeWidth": 2,
      "strokeStyle": "solid",
      "roughness": 1,
      "opacity": 100,
      "angle": 0,
      "x": 1616.6001374382645,
      "y": 4655.48308159135,
      "strokeColor": "#1e1e1e",
      "backgroundColor": "#a5d8ff",
      "width": 249.00000000000009,
      "height": 114.99999999999997,
      "seed": 125808702,
      "groupIds": [
        "TqASbmNKtAb95Cc8uANEn"
      ],
      "frameId": null,
      "roundness": {
        "type": 3
      },
      "boundElements": [
        {
          "type": "text",
          "id": "yWGNhTGz9Jvd0dUba1m5W"
        },
        {
          "id": "LKXfIwH6k9YoTbRX_b9gI",
          "type": "arrow"
        },
        {
          "id": "VxgaSm93O4OlqrZMY57Iu",
          "type": "arrow"
        }
      ],
      "updated": 1734363560512,
      "link": null,
      "locked": false
    },
    {
      "type": "text",
      "version": 1448,
      "versionNonce": 1535516989,
      "index": "b2I",
      "isDeleted": false,
      "id": "yWGNhTGz9Jvd0dUba1m5W",
      "fillStyle": "solid",
      "strokeWidth": 2,
      "strokeStyle": "solid",
      "roughness": 1,
      "opacity": 100,
      "angle": 0,
      "x": 1623.8084733147293,
      "y": 4693.78308159135,
      "strokeColor": "#1e1e1e",
      "backgroundColor": "transparent",
      "width": 234.5833282470703,
      "height": 38.4,
      "seed": 2128279678,
      "groupIds": [
        "TqASbmNKtAb95Cc8uANEn"
      ],
      "frameId": null,
      "roundness": null,
      "boundElements": [],
      "updated": 1734363560512,
      "link": null,
      "locked": false,
      "fontSize": 16,
      "fontFamily": 3,
      "text": "StrategyBaseWithTVLLimits\n(1 per LST)",
      "textAlign": "center",
      "verticalAlign": "middle",
      "containerId": "GofJhEttiaSCMMbeZPpHJ",
      "originalText": "StrategyBaseWithTVLLimits\n(1 per LST)",
      "autoResize": true,
      "lineHeight": 1.2
    },
    {
      "type": "arrow",
      "version": 810,
      "versionNonce": 192462067,
      "index": "b2J",
      "isDeleted": false,
      "id": "BEr_TOZmKQdO6AcwFrKWb",
      "fillStyle": "solid",
      "strokeWidth": 2,
      "strokeStyle": "solid",
      "roughness": 1,
      "opacity": 100,
      "angle": 0,
      "x": 1921.2082144161936,
      "y": 4154.944773749827,
      "strokeColor": "#1e1e1e",
      "backgroundColor": "#ffc9c9",
      "width": 483.5690605324512,
      "height": 0.030639649032764282,
      "seed": 1794559294,
      "groupIds": [],
      "frameId": null,
      "roundness": {
        "type": 2
      },
      "boundElements": [],
      "updated": 1734363560522,
      "link": null,
      "locked": false,
      "startBinding": {
        "elementId": "ww6cJfMczV8T_u_QeDNDu",
        "focus": -0.31714756780341136,
        "gap": 11.516308661733518,
        "fixedPoint": null
      },
      "endBinding": {
        "elementId": "PQ83u0WAkad1B1o1C1iNi",
        "focus": 0.7918889943459513,
        "gap": 4.477678571430715,
        "fixedPoint": null
      },
      "lastCommittedPoint": null,
      "startArrowhead": null,
      "endArrowhead": "triangle",
      "points": [
        [
          0,
          0
        ],
        [
          -483.5690605324512,
          -0.030639649032764282
        ]
      ]
    },
    {
      "type": "text",
      "version": 250,
      "versionNonce": 1704008381,
      "index": "b2K",
      "isDeleted": false,
      "id": "kJlCKO6JhXQwzcWVF_58Z",
      "fillStyle": "solid",
      "strokeWidth": 2,
      "strokeStyle": "solid",
      "roughness": 1,
      "opacity": 100,
      "angle": 0,
      "x": 1530.672494337844,
      "y": 4091.2710216155624,
      "strokeColor": "#1e1e1e",
      "backgroundColor": "#ffc9c9",
      "width": 343.9333190917969,
      "height": 50,
      "seed": 1863111650,
      "groupIds": [],
      "frameId": null,
      "roundness": null,
      "boundElements": [],
      "updated": 1734363560512,
      "link": null,
      "locked": false,
      "fontSize": 20,
      "fontFamily": 1,
      "text": "1. After withdrawal delay, complete\nwithdrawal \"as tokens\"",
      "textAlign": "center",
      "verticalAlign": "top",
      "containerId": null,
      "originalText": "1. After withdrawal delay, complete\nwithdrawal \"as tokens\"",
      "autoResize": true,
      "lineHeight": 1.25
    },
    {
      "type": "text",
      "version": 234,
      "versionNonce": 293124893,
      "index": "b2L",
      "isDeleted": false,
      "id": "ElfgCTQ44t8xdLsJ7WzOF",
      "fillStyle": "solid",
      "strokeWidth": 2,
      "strokeStyle": "solid",
      "roughness": 1,
      "opacity": 100,
      "angle": 0,
      "x": 1551.1808256366717,
      "y": 4172.937688282229,
      "strokeColor": "#1e1e1e",
      "backgroundColor": "#ffc9c9",
      "width": 292.9166564941406,
      "height": 24,
      "seed": 412788578,
      "groupIds": [],
      "frameId": null,
      "roundness": null,
      "boundElements": [],
      "updated": 1734363560512,
      "link": null,
      "locked": false,
      "fontSize": 20,
      "fontFamily": 3,
      "text": "completeQueuedWithdrawals",
      "textAlign": "center",
      "verticalAlign": "top",
      "containerId": null,
      "originalText": "completeQueuedWithdrawals",
      "autoResize": true,
      "lineHeight": 1.2
    },
    {
      "type": "arrow",
      "version": 707,
      "versionNonce": 724323485,
      "index": "b2M",
      "isDeleted": false,
      "id": "1YDohtzXZZQMtHn9rNLZR",
      "fillStyle": "solid",
      "strokeWidth": 2,
      "strokeStyle": "solid",
      "roughness": 1,
      "opacity": 100,
      "angle": 0,
      "x": 1376.7635585898329,
      "y": 4174.604354948896,
      "strokeColor": "#1e1e1e",
      "backgroundColor": "#ffc9c9",
      "width": 99.6956610325094,
      "height": 188.33333333333303,
      "seed": 1957123774,
      "groupIds": [],
      "frameId": null,
      "roundness": {
        "type": 2
      },
      "boundElements": [
        {
          "type": "text",
          "id": "BBzLnTxvEeFogjjEpl2V8"
        }
      ],
      "updated": 1734363737996,
      "link": null,
      "locked": false,
      "startBinding": {
        "elementId": "PQ83u0WAkad1B1o1C1iNi",
        "focus": -0.5302158402110009,
        "gap": 7.7500000000009095,
        "fixedPoint": null
      },
      "endBinding": {
        "elementId": "YEevKYXKSnAcEpK4SoXAN",
        "focus": 0.16468584082485693,
        "gap": 6.819202832930387,
        "fixedPoint": null
      },
      "lastCommittedPoint": null,
      "startArrowhead": null,
      "endArrowhead": "triangle",
      "points": [
        [
          0,
          0
        ],
        [
          99.6956610325094,
          188.33333333333303
        ]
      ]
    },
    {
      "type": "text",
      "version": 41,
      "versionNonce": 1354586227,
      "index": "b2N",
      "isDeleted": false,
      "id": "BBzLnTxvEeFogjjEpl2V8",
      "fillStyle": "solid",
      "strokeWidth": 2,
      "strokeStyle": "solid",
      "roughness": 1,
      "opacity": 100,
      "angle": 0,
      "x": 1331.8314589913416,
      "y": 4243.771021615563,
      "strokeColor": "#1e1e1e",
      "backgroundColor": "#ffc9c9",
      "width": 189.5598602294922,
      "height": 50,
      "seed": 1202388322,
      "groupIds": [],
      "frameId": null,
      "roundness": null,
      "boundElements": [],
      "updated": 1734363737061,
      "link": null,
      "locked": false,
      "fontSize": 20,
      "fontFamily": 1,
      "text": "3. Withdraw shares\nas LST tokens",
      "textAlign": "center",
      "verticalAlign": "middle",
      "containerId": "1YDohtzXZZQMtHn9rNLZR",
      "originalText": "3. Withdraw shares as LST tokens",
      "autoResize": true,
      "lineHeight": 1.25
    },
    {
      "type": "arrow",
      "version": 701,
      "versionNonce": 712547421,
      "index": "b2O",
      "isDeleted": false,
      "id": "LKXfIwH6k9YoTbRX_b9gI",
      "fillStyle": "solid",
      "strokeWidth": 2,
      "strokeStyle": "solid",
      "roughness": 1,
      "opacity": 100,
      "angle": 0,
      "x": 1489.0907593444526,
      "y": 4492.937688282229,
      "strokeColor": "#1e1e1e",
      "backgroundColor": "#ffc9c9",
      "width": 119.11315367029124,
      "height": 159.7789287411406,
      "seed": 1486747326,
      "groupIds": [],
      "frameId": null,
      "roundness": {
        "type": 2
      },
      "boundElements": [
        {
          "type": "text",
          "id": "N0XoOQw-ax-DpKJhTrhTS"
        }
      ],
      "updated": 1734363743439,
      "link": null,
      "locked": false,
      "startBinding": {
        "elementId": "YEevKYXKSnAcEpK4SoXAN",
        "focus": 0.3045066137617944,
        "gap": 8.180797167069613,
        "fixedPoint": null
      },
      "endBinding": {
        "elementId": "GofJhEttiaSCMMbeZPpHJ",
        "focus": -0.5256061429217742,
        "gap": 8.396224423520607,
        "fixedPoint": null
      },
      "lastCommittedPoint": null,
      "startArrowhead": null,
      "endArrowhead": "triangle",
      "points": [
        [
          0,
          0
        ],
        [
          119.11315367029124,
          159.7789287411406
        ]
      ]
    },
    {
      "type": "text",
      "version": 103,
      "versionNonce": 410580147,
      "index": "b2P",
      "isDeleted": false,
      "id": "N0XoOQw-ax-DpKJhTrhTS",
      "fillStyle": "solid",
      "strokeWidth": 2,
      "strokeStyle": "solid",
      "roughness": 1,
      "opacity": 100,
      "angle": 0,
      "x": 1439.2874048447452,
      "y": 4535.327152652799,
      "strokeColor": "#1e1e1e",
      "backgroundColor": "#ffc9c9",
      "width": 218.71986266970634,
      "height": 75,
      "seed": 1358753598,
      "groupIds": [],
      "frameId": null,
      "roundness": null,
      "boundElements": [],
      "updated": 1734363742254,
      "link": null,
      "locked": false,
      "fontSize": 20,
      "fontFamily": 1,
      "text": "4. For each LST being\nwithdrawn, withdraw\nLST tokens",
      "textAlign": "center",
      "verticalAlign": "middle",
      "containerId": "LKXfIwH6k9YoTbRX_b9gI",
      "originalText": "4. For each LST being withdrawn, withdraw LST tokens",
      "autoResize": true,
      "lineHeight": 1.25
    },
    {
      "type": "arrow",
      "version": 536,
      "versionNonce": 1018931859,
      "index": "b2Q",
      "isDeleted": false,
      "id": "VxgaSm93O4OlqrZMY57Iu",
      "fillStyle": "solid",
      "strokeWidth": 2,
      "strokeStyle": "solid",
      "roughness": 1,
      "opacity": 100,
      "angle": 0,
      "x": 1839.7029559670757,
      "y": 4642.937688282229,
      "strokeColor": "#1e1e1e",
      "backgroundColor": "#ffc9c9",
      "width": 143.33333333333348,
      "height": 435,
      "seed": 2030782014,
      "groupIds": [],
      "frameId": null,
      "roundness": {
        "type": 2
      },
      "boundElements": [
        {
          "type": "text",
          "id": "9xUkxgnYx5-Dk5fyPHOh8"
        }
      ],
      "updated": 1734363747910,
      "link": null,
      "locked": false,
      "startBinding": {
        "elementId": "GofJhEttiaSCMMbeZPpHJ",
        "focus": 0.2691884539496283,
        "gap": 12.54539330912121,
        "fixedPoint": null
      },
      "endBinding": {
        "elementId": "ww6cJfMczV8T_u_QeDNDu",
        "focus": 0.03304796429408594,
        "gap": 17.16110751978089,
        "fixedPoint": null
      },
      "lastCommittedPoint": null,
      "startArrowhead": null,
      "endArrowhead": "triangle",
      "points": [
        [
          0,
          0
        ],
        [
          143.33333333333348,
          -188.33333333333348
        ],
        [
          143.33333333333348,
          -435
        ]
      ]
    },
    {
      "type": "text",
      "version": 51,
      "versionNonce": 1509994333,
      "index": "b2R",
      "isDeleted": false,
      "id": "9xUkxgnYx5-Dk5fyPHOh8",
      "fillStyle": "solid",
      "strokeWidth": 2,
      "strokeStyle": "solid",
      "roughness": 1,
      "opacity": 100,
      "angle": 0,
      "x": 1892.8263631515326,
      "y": 4429.604354948895,
      "strokeColor": "#1e1e1e",
      "backgroundColor": "#ffc9c9",
      "width": 180.4198522977531,
      "height": 50,
      "seed": 83823010,
      "groupIds": [],
      "frameId": null,
      "roundness": null,
      "boundElements": [],
      "updated": 1734363747174,
      "link": null,
      "locked": false,
      "fontSize": 20,
      "fontFamily": 1,
      "text": "5. Transfer LSTs\ndirectly to Staker",
      "textAlign": "center",
      "verticalAlign": "middle",
      "containerId": "VxgaSm93O4OlqrZMY57Iu",
      "originalText": "5. Transfer LSTs directly to Staker",
      "autoResize": true,
      "lineHeight": 1.25
    },
    {
      "type": "text",
      "version": 518,
      "versionNonce": 715656371,
      "index": "b2S",
      "isDeleted": false,
      "id": "YHs0Gqhmn3yfxnBDiszoT",
      "fillStyle": "solid",
      "strokeWidth": 2,
      "strokeStyle": "solid",
      "roughness": 1,
      "opacity": 100,
      "angle": 0,
      "x": 1062.3339933390657,
      "y": 2644.963326508974,
      "strokeColor": "#1e1e1e",
      "backgroundColor": "#ffc9c9",
      "width": 466.41960448026657,
      "height": 75,
      "seed": 608723646,
      "groupIds": [],
      "frameId": null,
      "roundness": null,
      "boundElements": [],
      "updated": 1734363349119,
      "link": null,
      "locked": false,
      "fontSize": 20,
      "fontFamily": 1,
      "text": "3. If Staker is delegated, add\ndelegated shares to Operator\n(increased by calculated withdrwawable shares)",
      "textAlign": "center",
      "verticalAlign": "top",
      "containerId": null,
      "originalText": "3. If Staker is delegated, add\ndelegated shares to Operator\n(increased by calculated withdrwawable shares)",
      "autoResize": true,
      "lineHeight": 1.25
    },
    {
      "type": "text",
      "version": 392,
      "versionNonce": 571875891,
      "index": "b2T",
      "isDeleted": false,
      "id": "TGtwXKQ5hDALWDo7cShaP",
      "fillStyle": "solid",
      "strokeWidth": 2,
      "strokeStyle": "solid",
      "roughness": 1,
      "opacity": 100,
      "angle": 0,
      "x": 1117.9934149732499,
      "y": 1742.4736186430125,
      "strokeColor": "#1e1e1e",
      "backgroundColor": "#ffc9c9",
      "width": 429.6596252322197,
      "height": 75,
      "seed": 640231614,
      "groupIds": [],
      "frameId": null,
      "roundness": null,
      "boundElements": [],
      "updated": 1734362188035,
      "link": null,
      "locked": false,
      "fontSize": 20,
      "fontFamily": 1,
      "text": "3. If Staker is delegated, remove\ndelegated Shares from Operator\n(decreased by withdrawable shares amount)",
      "textAlign": "center",
      "verticalAlign": "top",
      "containerId": null,
      "originalText": "3. If Staker is delegated, remove\ndelegated Shares from Operator\n(decreased by withdrawable shares amount)",
      "autoResize": true,
      "lineHeight": 1.25
    },
    {
      "type": "text",
      "version": 659,
      "versionNonce": 100123805,
      "index": "b2U",
      "isDeleted": false,
      "id": "0zAO6U6LbidesdIKI4H-Q",
      "fillStyle": "solid",
      "strokeWidth": 2,
      "strokeStyle": "solid",
      "roughness": 1,
      "opacity": 100,
      "angle": 0,
      "x": 176.06574627159222,
      "y": 5424.65197399651,
      "strokeColor": "#1e1e1e",
      "backgroundColor": "#ffc9c9",
      "width": 265.4166564941406,
      "height": 50,
      "seed": 480087746,
      "groupIds": [],
      "frameId": null,
      "roundness": null,
      "boundElements": [],
      "updated": 1734363560512,
      "link": null,
      "locked": false,
      "fontSize": 20,
      "fontFamily": 1,
      "text": "1. Once validator is exited,\nstart a checkpoint",
      "textAlign": "center",
      "verticalAlign": "top",
      "containerId": null,
      "originalText": "1. Once validator is exited,\nstart a checkpoint",
      "autoResize": true,
      "lineHeight": 1.25
    },
    {
      "type": "arrow",
      "version": 660,
      "versionNonce": 657402109,
      "index": "b2W",
      "isDeleted": false,
      "id": "wndJ7JHlbbZx0Z_hDBLF-",
      "fillStyle": "solid",
      "strokeWidth": 2,
      "strokeStyle": "solid",
      "roughness": 1,
      "opacity": 100,
      "angle": 0,
      "x": 140.08458328748145,
      "y": 5660.5854539636575,
      "strokeColor": "#1e1e1e",
      "backgroundColor": "#ffc9c9",
      "width": 356.67490285130594,
      "height": 2.266134773139129,
      "seed": 1708621442,
      "groupIds": [],
      "frameId": null,
      "roundness": {
        "type": 2
      },
      "boundElements": [],
      "updated": 1734363560512,
      "link": null,
      "locked": false,
      "startBinding": null,
      "endBinding": null,
      "lastCommittedPoint": null,
      "startArrowhead": null,
      "endArrowhead": "triangle",
      "points": [
        [
          0,
          0
        ],
        [
          356.67490285130594,
          2.266134773139129
        ]
      ]
    },
    {
      "type": "text",
      "version": 854,
      "versionNonce": 146473309,
      "index": "b2X",
      "isDeleted": false,
      "id": "9sXM5xj6xYZRin-ElRo03",
      "fillStyle": "solid",
      "strokeWidth": 2,
      "strokeStyle": "solid",
      "roughness": 1,
      "opacity": 100,
      "angle": 0,
      "x": 151.87408062217824,
      "y": 5555.4853073298445,
      "strokeColor": "#1e1e1e",
      "backgroundColor": "#ffc9c9",
      "width": 323.79998779296875,
      "height": 100,
      "seed": 2147457822,
      "groupIds": [],
      "frameId": null,
      "roundness": null,
      "boundElements": [],
      "updated": 1734363560512,
      "link": null,
      "locked": false,
      "fontSize": 20,
      "fontFamily": 1,
      "text": "2. Submit one balance proof\nper validator pointed at pod.\nProofs validated against beacon\nblock root.",
      "textAlign": "center",
      "verticalAlign": "top",
      "containerId": null,
      "originalText": "2. Submit one balance proof\nper validator pointed at pod.\nProofs validated against beacon\nblock root.",
      "autoResize": true,
      "lineHeight": 1.25
    },
    {
      "type": "text",
      "version": 430,
      "versionNonce": 267177405,
      "index": "b2Y",
      "isDeleted": false,
      "id": "wp_KB7xRBNL1sK5m_Ddox",
      "fillStyle": "solid",
      "strokeWidth": 2,
      "strokeStyle": "solid",
      "roughness": 1,
      "opacity": 100,
      "angle": 0,
      "x": 184.89074321983446,
      "y": 5678.485307329843,
      "strokeColor": "#1e1e1e",
      "backgroundColor": "#ffc9c9",
      "width": 257.76666259765625,
      "height": 24,
      "seed": 346173890,
      "groupIds": [],
      "frameId": null,
      "roundness": null,
      "boundElements": [],
      "updated": 1734363560512,
      "link": null,
      "locked": false,
      "fontSize": 20,
      "fontFamily": 3,
      "text": "verifyCheckpointProofs",
      "textAlign": "center",
      "verticalAlign": "top",
      "containerId": null,
      "originalText": "verifyCheckpointProofs",
      "autoResize": true,
      "lineHeight": 1.2
    },
    {
      "type": "rectangle",
      "version": 2349,
      "versionNonce": 2078674461,
      "index": "b2Z",
      "isDeleted": false,
      "id": "cQmwh38jtJYD4EgAa2dzN",
      "fillStyle": "solid",
      "strokeWidth": 2,
      "strokeStyle": "solid",
      "roughness": 1,
      "opacity": 100,
      "angle": 0,
      "x": 1832.8321102329483,
      "y": 5676.463779552066,
      "strokeColor": "#1e1e1e",
      "backgroundColor": "#b2f2bb",
      "width": 135.00000000000006,
      "height": 114.99999999999997,
      "seed": 128488834,
      "groupIds": [
        "beGEQyYEtc22TsXoZTryG"
      ],
      "frameId": null,
      "roundness": {
        "type": 3
      },
      "boundElements": [],
      "updated": 1734363560512,
      "link": null,
      "locked": false
    },
    {
      "type": "rectangle",
      "version": 2280,
      "versionNonce": 731398781,
      "index": "b2a",
      "isDeleted": false,
      "id": "VHQnnDAIGDndzyKOQ5TFC",
      "fillStyle": "solid",
      "strokeWidth": 2,
      "strokeStyle": "solid",
      "roughness": 1,
      "opacity": 100,
      "angle": 0,
      "x": 1832.8321102329483,
      "y": 5641.463779552066,
      "strokeColor": "#1e1e1e",
      "backgroundColor": "#b2f2bb",
      "width": 135.00000000000006,
      "height": 114.99999999999997,
      "seed": 381588802,
      "groupIds": [
        "beGEQyYEtc22TsXoZTryG"
      ],
      "frameId": null,
      "roundness": {
        "type": 3
      },
      "boundElements": [
        {
          "id": "CzL7G-cd1IeUb87tAORbe",
          "type": "arrow"
        }
      ],
      "updated": 1734363560512,
      "link": null,
      "locked": false
    },
    {
      "type": "rectangle",
      "version": 2231,
      "versionNonce": 600107741,
      "index": "b2b",
      "isDeleted": false,
      "id": "0kiRb8vKovbzXx8BfMr3w",
      "fillStyle": "solid",
      "strokeWidth": 2,
      "strokeStyle": "solid",
      "roughness": 1,
      "opacity": 100,
      "angle": 0,
      "x": 1832.8321102329483,
      "y": 5605.963779552066,
      "strokeColor": "#1e1e1e",
      "backgroundColor": "#b2f2bb",
      "width": 135.00000000000006,
      "height": 114.99999999999997,
      "seed": 444505346,
      "groupIds": [
        "beGEQyYEtc22TsXoZTryG"
      ],
      "frameId": null,
      "roundness": {
        "type": 3
      },
      "boundElements": [
        {
          "id": "CzL7G-cd1IeUb87tAORbe",
          "type": "arrow"
        }
      ],
      "updated": 1734363560512,
      "link": null,
      "locked": false
    },
    {
      "type": "rectangle",
      "version": 2157,
      "versionNonce": 564369309,
      "index": "b2c",
      "isDeleted": false,
      "id": "8Wai9QCuDoTCvrcKRXP0_",
      "fillStyle": "solid",
      "strokeWidth": 2,
      "strokeStyle": "solid",
      "roughness": 1,
      "opacity": 100,
      "angle": 0,
      "x": 1832.8321102329483,
      "y": 5570.963779552066,
      "strokeColor": "#1e1e1e",
      "backgroundColor": "#b2f2bb",
      "width": 135.00000000000006,
      "height": 114.99999999999997,
      "seed": 6794434,
      "groupIds": [
        "beGEQyYEtc22TsXoZTryG"
      ],
      "frameId": null,
      "roundness": {
        "type": 3
      },
      "boundElements": [
        {
          "id": "SpltLNf3GnK7lnsNrn-k3",
          "type": "arrow"
        }
      ],
      "updated": 1734363560512,
      "link": null,
      "locked": false
    },
    {
      "type": "rectangle",
      "version": 2220,
      "versionNonce": 602446845,
      "index": "b2d",
      "isDeleted": false,
      "id": "JEw4y43UVJO53IimI8gMq",
      "fillStyle": "solid",
      "strokeWidth": 2,
      "strokeStyle": "solid",
      "roughness": 1,
      "opacity": 100,
      "angle": 0,
      "x": 1832.8321102329483,
      "y": 5540.213779552066,
      "strokeColor": "#1e1e1e",
      "backgroundColor": "#b2f2bb",
      "width": 135.00000000000006,
      "height": 114.99999999999997,
      "seed": 773375106,
      "groupIds": [
        "beGEQyYEtc22TsXoZTryG"
      ],
      "frameId": null,
      "roundness": {
        "type": 3
      },
      "boundElements": [],
      "updated": 1734363560512,
      "link": null,
      "locked": false
    },
    {
      "type": "rectangle",
      "version": 2155,
      "versionNonce": 869143645,
      "index": "b2e",
      "isDeleted": false,
      "id": "oOSfSCvtN3AqNQyEKTVGL",
      "fillStyle": "solid",
      "strokeWidth": 2,
      "strokeStyle": "solid",
      "roughness": 1,
      "opacity": 100,
      "angle": 0,
      "x": 1832.8321102329483,
      "y": 5505.213779552066,
      "strokeColor": "#1e1e1e",
      "backgroundColor": "#b2f2bb",
      "width": 135.00000000000006,
      "height": 114.99999999999997,
      "seed": 2102453314,
      "groupIds": [
        "beGEQyYEtc22TsXoZTryG"
      ],
      "frameId": null,
      "roundness": {
        "type": 3
      },
      "boundElements": [],
      "updated": 1734363560512,
      "link": null,
      "locked": false
    },
    {
      "type": "rectangle",
      "version": 2094,
      "versionNonce": 757432509,
      "index": "b2f",
      "isDeleted": false,
      "id": "tLaVL1NOFzKG4pX5tsQyx",
      "fillStyle": "solid",
      "strokeWidth": 2,
      "strokeStyle": "solid",
      "roughness": 1,
      "opacity": 100,
      "angle": 0,
      "x": 1832.8321102329483,
      "y": 5469.713779552066,
      "strokeColor": "#1e1e1e",
      "backgroundColor": "#b2f2bb",
      "width": 135.00000000000006,
      "height": 114.99999999999997,
      "seed": 938413058,
      "groupIds": [
        "beGEQyYEtc22TsXoZTryG"
      ],
      "frameId": null,
      "roundness": {
        "type": 3
      },
      "boundElements": [
        {
          "id": "7JkoDbLx2twPP37CoCYe2",
          "type": "arrow"
        }
      ],
      "updated": 1734363560512,
      "link": null,
      "locked": false
    },
    {
      "type": "rectangle",
      "version": 2027,
      "versionNonce": 1972396317,
      "index": "b2g",
      "isDeleted": false,
      "id": "UEC4OLrCnh8Ml32lVj6Mo",
      "fillStyle": "solid",
      "strokeWidth": 2,
      "strokeStyle": "solid",
      "roughness": 1,
      "opacity": 100,
      "angle": 0,
      "x": 1832.8321102329483,
      "y": 5434.713779552066,
      "strokeColor": "#1e1e1e",
      "backgroundColor": "#b2f2bb",
      "width": 135.00000000000006,
      "height": 114.99999999999997,
      "seed": 334642114,
      "groupIds": [
        "beGEQyYEtc22TsXoZTryG"
      ],
      "frameId": null,
      "roundness": {
        "type": 3
      },
      "boundElements": [
        {
          "id": "7JkoDbLx2twPP37CoCYe2",
          "type": "arrow"
        }
      ],
      "updated": 1734363560512,
      "link": null,
      "locked": false
    },
    {
      "type": "rectangle",
      "version": 1949,
      "versionNonce": 1115698557,
      "index": "b2h",
      "isDeleted": false,
      "id": "nqbSVKCt0DHaSFjh5axoc",
      "fillStyle": "solid",
      "strokeWidth": 2,
      "strokeStyle": "solid",
      "roughness": 1,
      "opacity": 100,
      "angle": 0,
      "x": 1833.2071102329483,
      "y": 5395.283223996511,
      "strokeColor": "#1e1e1e",
      "backgroundColor": "#b2f2bb",
      "width": 135.00000000000006,
      "height": 114.99999999999997,
      "seed": 796488578,
      "groupIds": [
        "beGEQyYEtc22TsXoZTryG"
      ],
      "frameId": null,
      "roundness": {
        "type": 3
      },
      "boundElements": [
        {
          "type": "text",
          "id": "c8vLK_s-l9sT6HdL0kOUm"
        },
        {
          "id": "7JkoDbLx2twPP37CoCYe2",
          "type": "arrow"
        },
        {
          "id": "SpltLNf3GnK7lnsNrn-k3",
          "type": "arrow"
        }
      ],
      "updated": 1734363560512,
      "link": null,
      "locked": false
    },
    {
      "type": "text",
      "version": 1685,
      "versionNonce": 523664861,
      "index": "b2i",
      "isDeleted": false,
      "id": "c8vLK_s-l9sT6HdL0kOUm",
      "fillStyle": "solid",
      "strokeWidth": 2,
      "strokeStyle": "solid",
      "roughness": 1,
      "opacity": 100,
      "angle": 0,
      "x": 1844.4071109958877,
      "y": 5433.58322399651,
      "strokeColor": "#1e1e1e",
      "backgroundColor": "transparent",
      "width": 112.5999984741211,
      "height": 38.4,
      "seed": 214152002,
      "groupIds": [
        "beGEQyYEtc22TsXoZTryG"
      ],
      "frameId": null,
      "roundness": null,
      "boundElements": [],
      "updated": 1734363560512,
      "link": null,
      "locked": false,
      "fontSize": 16,
      "fontFamily": 3,
      "text": "EigenPods\n(1 per user)",
      "textAlign": "center",
      "verticalAlign": "middle",
      "containerId": "nqbSVKCt0DHaSFjh5axoc",
      "originalText": "EigenPods\n(1 per user)",
      "autoResize": true,
      "lineHeight": 1.2
    },
    {
      "type": "rectangle",
      "version": 1926,
      "versionNonce": 163516157,
      "index": "b2j",
      "isDeleted": false,
      "id": "3fXcLTF50p0EN1JpZNp4z",
      "fillStyle": "solid",
      "strokeWidth": 2,
      "strokeStyle": "solid",
      "roughness": 1,
      "opacity": 100,
      "angle": 0,
      "x": 2241.332110232948,
      "y": 5441.2971128854,
      "strokeColor": "#1e1e1e",
      "backgroundColor": "#b2f2bb",
      "width": 266.00000000000017,
      "height": 114.99999999999997,
      "seed": 238025474,
      "groupIds": [],
      "frameId": null,
      "roundness": {
        "type": 3
      },
      "boundElements": [
        {
          "type": "text",
          "id": "oqCfZlQ2XDeWsc466d8Q_"
        },
        {
          "id": "7JkoDbLx2twPP37CoCYe2",
          "type": "arrow"
        }
      ],
      "updated": 1734363560512,
      "link": null,
      "locked": false
    },
    {
      "type": "text",
      "version": 1826,
      "versionNonce": 475932509,
      "index": "b2k",
      "isDeleted": false,
      "id": "oqCfZlQ2XDeWsc466d8Q_",
      "fillStyle": "solid",
      "strokeWidth": 2,
      "strokeStyle": "solid",
      "roughness": 1,
      "opacity": 100,
      "angle": 0,
      "x": 2303.957110232948,
      "y": 5489.197112885399,
      "strokeColor": "#1e1e1e",
      "backgroundColor": "transparent",
      "width": 140.75,
      "height": 19.2,
      "seed": 1916619458,
      "groupIds": [],
      "frameId": null,
      "roundness": null,
      "boundElements": [],
      "updated": 1734363560512,
      "link": null,
      "locked": false,
      "fontSize": 16,
      "fontFamily": 3,
      "text": "EIP-4788 Oracle",
      "textAlign": "center",
      "verticalAlign": "middle",
      "containerId": "3fXcLTF50p0EN1JpZNp4z",
      "originalText": "EIP-4788 Oracle",
      "autoResize": true,
      "lineHeight": 1.2
    },
    {
      "type": "arrow",
      "version": 2321,
      "versionNonce": 218520051,
      "index": "b2l",
      "isDeleted": false,
      "id": "7JkoDbLx2twPP37CoCYe2",
      "fillStyle": "solid",
      "strokeWidth": 2,
      "strokeStyle": "solid",
      "roughness": 1,
      "opacity": 100,
      "angle": 0,
      "x": 1975.7511647921374,
      "y": 5510.0379193250365,
      "strokeColor": "#1e1e1e",
      "backgroundColor": "#ffec99",
      "width": 258.0630882979535,
      "height": 0.06671593127975939,
      "seed": 1334485634,
      "groupIds": [],
      "frameId": null,
      "roundness": {
        "type": 2
      },
      "boundElements": [],
      "updated": 1734363560522,
      "link": null,
      "locked": false,
      "startBinding": {
        "elementId": "nqbSVKCt0DHaSFjh5axoc",
        "focus": 0.995769034654371,
        "gap": 7.544054559189135,
        "fixedPoint": null
      },
      "endBinding": {
        "elementId": "3fXcLTF50p0EN1JpZNp4z",
        "focus": -0.19358446686074796,
        "gap": 7.517857142856883,
        "fixedPoint": null
      },
      "lastCommittedPoint": null,
      "startArrowhead": null,
      "endArrowhead": "triangle",
      "points": [
        [
          0,
          0
        ],
        [
          258.0630882979535,
          -0.06671593127975939
        ]
      ]
    },
    {
      "type": "text",
      "version": 827,
      "versionNonce": 1275406461,
      "index": "b2m",
      "isDeleted": false,
      "id": "3Ef8Ob6E-5IDU6m-8ALi8",
      "fillStyle": "solid",
      "strokeWidth": 2,
      "strokeStyle": "solid",
      "roughness": 1,
      "opacity": 100,
      "angle": 0,
      "x": 1984.0523483281863,
      "y": 5442.826874790161,
      "strokeColor": "#1e1e1e",
      "backgroundColor": "#ffec99",
      "width": 241.89999389648438,
      "height": 50,
      "seed": 282526274,
      "groupIds": [],
      "frameId": null,
      "roundness": null,
      "boundElements": [
        {
          "id": "7JkoDbLx2twPP37CoCYe2",
          "type": "arrow"
        }
      ],
      "updated": 1734363560513,
      "link": null,
      "locked": false,
      "fontSize": 20,
      "fontFamily": 1,
      "text": "1.5 Parent beacon block\nroot queried from oracle",
      "textAlign": "left",
      "verticalAlign": "top",
      "containerId": null,
      "originalText": "1.5 Parent beacon block\nroot queried from oracle",
      "autoResize": true,
      "lineHeight": 1.25
    },
    {
      "type": "ellipse",
      "version": 1648,
      "versionNonce": 832901341,
      "index": "b2n",
      "isDeleted": false,
      "id": "3xnU6mBXla8WhiFUdP3Jk",
      "fillStyle": "solid",
      "strokeWidth": 2,
      "strokeStyle": "solid",
      "roughness": 1,
      "opacity": 100,
      "angle": 0,
      "x": 1363.54937213771,
      "y": 5473.849062331638,
      "strokeColor": "#1e1e1e",
      "backgroundColor": "#ffc9c9",
      "width": 108.75,
      "height": 105,
      "seed": 1895918082,
      "groupIds": [],
      "frameId": null,
      "roundness": {
        "type": 2
      },
      "boundElements": [
        {
          "type": "text",
          "id": "H1IqgL54dRz4weNzer4uF"
        },
        {
          "id": "SpltLNf3GnK7lnsNrn-k3",
          "type": "arrow"
        }
      ],
      "updated": 1734363560513,
      "link": null,
      "locked": false
    },
    {
      "type": "text",
      "version": 1396,
      "versionNonce": 1072229693,
      "index": "b2o",
      "isDeleted": false,
      "id": "H1IqgL54dRz4weNzer4uF",
      "fillStyle": "solid",
      "strokeWidth": 2,
      "strokeStyle": "solid",
      "roughness": 1,
      "opacity": 100,
      "angle": 0,
      "x": 1389.3421077045145,
      "y": 5514.725956319345,
      "strokeColor": "#1e1e1e",
      "backgroundColor": "#ffc9c9",
      "width": 57.266666412353516,
      "height": 23,
      "seed": 1997068738,
      "groupIds": [],
      "frameId": null,
      "roundness": null,
      "boundElements": [],
      "updated": 1734363560513,
      "link": null,
      "locked": false,
      "fontSize": 20,
      "fontFamily": 2,
      "text": "Staker",
      "textAlign": "center",
      "verticalAlign": "middle",
      "containerId": "3xnU6mBXla8WhiFUdP3Jk",
      "originalText": "Staker",
      "autoResize": true,
      "lineHeight": 1.15
    },
    {
      "type": "arrow",
      "version": 1111,
      "versionNonce": 1243134259,
      "index": "b2p",
      "isDeleted": false,
      "id": "SpltLNf3GnK7lnsNrn-k3",
      "fillStyle": "solid",
      "strokeWidth": 2,
      "strokeStyle": "solid",
      "roughness": 1,
      "opacity": 100,
      "angle": 0,
      "x": 1474.0981463283924,
      "y": 5494.137838831703,
      "strokeColor": "#1e1e1e",
      "backgroundColor": "#ffc9c9",
      "width": 356.87086884871655,
      "height": 1.793314280863342,
      "seed": 1913409922,
      "groupIds": [],
      "frameId": null,
      "roundness": {
        "type": 2
      },
      "boundElements": [],
      "updated": 1734363560522,
      "link": null,
      "locked": false,
      "startBinding": {
        "elementId": "3xnU6mBXla8WhiFUdP3Jk",
        "focus": -0.6081621304143341,
        "gap": 10.8571572156769,
        "fixedPoint": null
      },
      "endBinding": {
        "elementId": "nqbSVKCt0DHaSFjh5axoc",
        "focus": -0.6779288570559726,
        "gap": 2.238095055839267,
        "fixedPoint": null
      },
      "lastCommittedPoint": null,
      "startArrowhead": null,
      "endArrowhead": "triangle",
      "points": [
        [
          0,
          0
        ],
        [
          356.87086884871655,
          -1.793314280863342
        ]
      ]
    },
    {
      "type": "text",
      "version": 426,
      "versionNonce": 896219741,
      "index": "b2q",
      "isDeleted": false,
      "id": "uqfWBDwr7iAProLhv7jCi",
      "fillStyle": "solid",
      "strokeWidth": 2,
      "strokeStyle": "solid",
      "roughness": 1,
      "opacity": 100,
      "angle": 0,
      "x": 1551.7160388043765,
      "y": 5498.015728998306,
      "strokeColor": "#1e1e1e",
      "backgroundColor": "#ffc9c9",
      "width": 175.75,
      "height": 24,
      "seed": 1967837506,
      "groupIds": [],
      "frameId": null,
      "roundness": null,
      "boundElements": [
        {
          "id": "SpltLNf3GnK7lnsNrn-k3",
          "type": "arrow"
        }
      ],
      "updated": 1734363560513,
      "link": null,
      "locked": false,
      "fontSize": 20,
      "fontFamily": 3,
      "text": "startCheckpoint",
      "textAlign": "center",
      "verticalAlign": "top",
      "containerId": null,
      "originalText": "startCheckpoint",
      "autoResize": true,
      "lineHeight": 1.2
    },
    {
      "type": "text",
      "version": 738,
      "versionNonce": 204334781,
      "index": "b2r",
      "isDeleted": false,
      "id": "BSMrX7GVsCBtAowF2fzk-",
      "fillStyle": "solid",
      "strokeWidth": 2,
      "strokeStyle": "solid",
      "roughness": 1,
      "opacity": 100,
      "angle": 0,
      "x": 1456.6243792584785,
      "y": 5393.015728998306,
      "strokeColor": "#1e1e1e",
      "backgroundColor": "#ffc9c9",
      "width": 365.9333190917969,
      "height": 50,
      "seed": 1411602690,
      "groupIds": [],
      "frameId": null,
      "roundness": null,
      "boundElements": [],
      "updated": 1734363560513,
      "link": null,
      "locked": false,
      "fontSize": 20,
      "fontFamily": 1,
      "text": "0. Consensus or execution layer yield\nenters pod",
      "textAlign": "center",
      "verticalAlign": "top",
      "containerId": null,
      "originalText": "0. Consensus or execution layer yield\nenters pod",
      "autoResize": true,
      "lineHeight": 1.25
    },
    {
      "type": "text",
      "version": 2229,
      "versionNonce": 1654392605,
      "index": "b2s",
      "isDeleted": false,
      "id": "AGPGFNNkrSQ_HtPilmtyi",
      "fillStyle": "solid",
      "strokeWidth": 2,
      "strokeStyle": "solid",
      "roughness": 1,
      "opacity": 100,
      "angle": 0,
      "x": 1394.9740765531678,
      "y": 5306.173501774288,
      "strokeColor": "#1e1e1e",
      "backgroundColor": "#ffc9c9",
      "width": 324.26666259765625,
      "height": 64.39999999999999,
      "seed": 504686786,
      "groupIds": [],
      "frameId": null,
      "roundness": null,
      "boundElements": [],
      "updated": 1734363560513,
      "link": null,
      "locked": false,
      "fontSize": 28,
      "fontFamily": 2,
      "text": "Staker Flow:\nProcessing Validator Yield",
      "textAlign": "center",
      "verticalAlign": "top",
      "containerId": null,
      "originalText": "Staker Flow:\nProcessing Validator Yield",
      "autoResize": true,
      "lineHeight": 1.15
    },
    {
      "type": "arrow",
      "version": 1014,
      "versionNonce": 1527531635,
      "index": "b2t",
      "isDeleted": false,
      "id": "CzL7G-cd1IeUb87tAORbe",
      "fillStyle": "solid",
      "strokeWidth": 2,
      "strokeStyle": "solid",
      "roughness": 1,
      "opacity": 100,
      "angle": 0,
      "x": 1975.2604069828478,
      "y": 5739.822452092104,
      "strokeColor": "#1e1e1e",
      "backgroundColor": "#ffc9c9",
      "width": 191.13867262207737,
      "height": 0.07357654336101405,
      "seed": 448692354,
      "groupIds": [],
      "frameId": null,
      "roundness": {
        "type": 2
      },
      "boundElements": [],
      "updated": 1734363560522,
      "link": null,
      "locked": false,
      "startBinding": {
        "elementId": "0kiRb8vKovbzXx8BfMr3w",
        "focus": 1.3278784800611976,
        "gap": 18.858672540038242,
        "fixedPoint": null
      },
      "endBinding": {
        "elementId": "cXR7t0HmweM2M4wSaVIkI",
        "focus": -0.192456511262002,
        "gap": 12.049992879231922,
        "fixedPoint": null
      },
      "lastCommittedPoint": null,
      "startArrowhead": null,
      "endArrowhead": "triangle",
      "points": [
        [
          0,
          0
        ],
        [
          191.13867262207737,
          -0.07357654336101405
        ]
      ]
    },
    {
      "type": "text",
      "version": 426,
      "versionNonce": 1309713373,
      "index": "b2u",
      "isDeleted": false,
      "id": "cXR7t0HmweM2M4wSaVIkI",
      "fillStyle": "solid",
      "strokeWidth": 2,
      "strokeStyle": "solid",
      "roughness": 1,
      "opacity": 100,
      "angle": 0,
      "x": 2178.449072484157,
      "y": 5680.040168440954,
      "strokeColor": "#1e1e1e",
      "backgroundColor": "#ffc9c9",
      "width": 353.98333740234375,
      "height": 100,
      "seed": 1172250690,
      "groupIds": [],
      "frameId": null,
      "roundness": null,
      "boundElements": [
        {
          "id": "CzL7G-cd1IeUb87tAORbe",
          "type": "arrow"
        }
      ],
      "updated": 1734363560513,
      "link": null,
      "locked": false,
      "fontSize": 20,
      "fontFamily": 1,
      "text": "3. Any native ETH in pod is\nawarded shares and is made\n\"withdrawable\" via DelegationManger\nwithdrawal queue",
      "textAlign": "center",
      "verticalAlign": "top",
      "containerId": null,
      "originalText": "3. Any native ETH in pod is\nawarded shares and is made\n\"withdrawable\" via DelegationManger\nwithdrawal queue",
      "autoResize": true,
      "lineHeight": 1.25
    },
    {
      "type": "text",
      "version": 784,
      "versionNonce": 1964314781,
      "index": "b2v",
      "isDeleted": false,
      "id": "_jv2opmrvR8FQED8d_KRL",
      "fillStyle": "solid",
      "strokeWidth": 2,
      "strokeStyle": "solid",
      "roughness": 1,
      "opacity": 100,
      "angle": 0,
      "x": 1541.1506638547555,
      "y": 5450.087787488568,
      "strokeColor": "#1e1e1e",
      "backgroundColor": "#ffc9c9",
      "width": 207.51666259765625,
      "height": 25,
      "seed": 1263912962,
      "groupIds": [],
      "frameId": null,
      "roundness": null,
      "boundElements": [],
      "updated": 1734363560513,
      "link": null,
      "locked": false,
      "fontSize": 20,
      "fontFamily": 1,
      "text": "1. Start a checkpoint",
      "textAlign": "center",
      "verticalAlign": "top",
      "containerId": null,
      "originalText": "1. Start a checkpoint",
      "autoResize": true,
      "lineHeight": 1.25
    },
    {
      "type": "arrow",
      "version": 727,
      "versionNonce": 1556280573,
      "index": "b2w",
      "isDeleted": false,
      "id": "XBnxCUl55FOBij1xdDAGb",
      "fillStyle": "solid",
      "strokeWidth": 2,
      "strokeStyle": "solid",
      "roughness": 1,
      "opacity": 100,
      "angle": 0,
      "x": 1466.2195039224025,
      "y": 5666.021267455718,
      "strokeColor": "#1e1e1e",
      "backgroundColor": "#ffc9c9",
      "width": 356.67490285130594,
      "height": 2.266134773139129,
      "seed": 52524994,
      "groupIds": [],
      "frameId": null,
      "roundness": {
        "type": 2
      },
      "boundElements": [],
      "updated": 1734363560513,
      "link": null,
      "locked": false,
      "startBinding": null,
      "endBinding": null,
      "lastCommittedPoint": null,
      "startArrowhead": null,
      "endArrowhead": "triangle",
      "points": [
        [
          0,
          0
        ],
        [
          356.67490285130594,
          2.266134773139129
        ]
      ]
    },
    {
      "type": "text",
      "version": 915,
      "versionNonce": 1911901533,
      "index": "b2x",
      "isDeleted": false,
      "id": "8y_pjMDCTlROHnbxnOVTe",
      "fillStyle": "solid",
      "strokeWidth": 2,
      "strokeStyle": "solid",
      "roughness": 1,
      "opacity": 100,
      "angle": 0,
      "x": 1476.342334590433,
      "y": 5559.254454155237,
      "strokeColor": "#1e1e1e",
      "backgroundColor": "#ffc9c9",
      "width": 323.79998779296875,
      "height": 100,
      "seed": 1835085698,
      "groupIds": [],
      "frameId": null,
      "roundness": null,
      "boundElements": [],
      "updated": 1734363560513,
      "link": null,
      "locked": false,
      "fontSize": 20,
      "fontFamily": 1,
      "text": "2. Submit one balance proof\nper validator pointed at pod.\nProofs validated against beacon\nblock root.",
      "textAlign": "center",
      "verticalAlign": "top",
      "containerId": null,
      "originalText": "2. Submit one balance proof\nper validator pointed at pod.\nProofs validated against beacon\nblock root.",
      "autoResize": true,
      "lineHeight": 1.25
    },
    {
      "type": "text",
      "version": 491,
      "versionNonce": 1945999805,
      "index": "b2y",
      "isDeleted": false,
      "id": "Z7P_tOk7DuCZFZ5E_Bl7O",
      "fillStyle": "solid",
      "strokeWidth": 2,
      "strokeStyle": "solid",
      "roughness": 1,
      "opacity": 100,
      "angle": 0,
      "x": 1509.3589971880892,
      "y": 5682.254454155233,
      "strokeColor": "#1e1e1e",
      "backgroundColor": "#ffc9c9",
      "width": 257.76666259765625,
      "height": 24,
      "seed": 777252674,
      "groupIds": [],
      "frameId": null,
      "roundness": null,
      "boundElements": [],
      "updated": 1734363560513,
      "link": null,
      "locked": false,
      "fontSize": 20,
      "fontFamily": 3,
      "text": "verifyCheckpointProofs",
      "textAlign": "center",
      "verticalAlign": "top",
      "containerId": null,
      "originalText": "verifyCheckpointProofs",
      "autoResize": true,
      "lineHeight": 1.2
    },
    {
      "type": "rectangle",
      "version": 1406,
      "versionNonce": 756005725,
      "index": "b33",
      "isDeleted": false,
      "id": "CX2I4G3Tx7B460R8LiO1n",
      "fillStyle": "solid",
      "strokeWidth": 2,
      "strokeStyle": "solid",
      "roughness": 1,
      "opacity": 100,
      "angle": 0,
      "x": 1736.9283928755115,
      "y": -683.360616382829,
      "strokeColor": "#1e1e1e",
      "backgroundColor": "#d0bfff",
      "width": 223.00000000000006,
      "height": 114.99999999999997,
      "seed": 702426237,
      "groupIds": [],
      "frameId": null,
      "roundness": {
        "type": 3
      },
      "boundElements": [
        {
          "type": "text",
          "id": "cpMdOQ5aa34VGghGaCa_o"
        }
      ],
      "updated": 1734361209401,
      "link": null,
      "locked": false
    },
    {
      "type": "text",
      "version": 1157,
      "versionNonce": 2107262909,
      "index": "b34",
      "isDeleted": false,
      "id": "cpMdOQ5aa34VGghGaCa_o",
      "fillStyle": "solid",
      "strokeWidth": 2,
      "strokeStyle": "solid",
      "roughness": 1,
      "opacity": 100,
      "angle": 0,
      "x": 1768.7408928755115,
      "y": -635.460616382829,
      "strokeColor": "#1e1e1e",
      "backgroundColor": "transparent",
      "width": 159.375,
      "height": 19.2,
      "seed": 1975358685,
      "groupIds": [],
      "frameId": null,
      "roundness": null,
      "boundElements": [],
      "updated": 1734361209401,
      "link": null,
      "locked": false,
      "fontSize": 16,
      "fontFamily": 3,
      "text": "AllocationManager",
      "textAlign": "center",
      "verticalAlign": "middle",
      "containerId": "CX2I4G3Tx7B460R8LiO1n",
      "originalText": "AllocationManager",
      "autoResize": true,
      "lineHeight": 1.2
    },
    {
      "type": "rectangle",
      "version": 1876,
      "versionNonce": 248928925,
      "index": "b35",
      "isDeleted": false,
      "id": "LB1RAC-R424nw3plgg1kh",
      "fillStyle": "solid",
      "strokeWidth": 2,
      "strokeStyle": "solid",
      "roughness": 1,
      "opacity": 100,
      "angle": 0,
      "x": 1135.6703214253794,
      "y": -116.37449800762263,
      "strokeColor": "#1e1e1e",
      "backgroundColor": "#d0bfff",
      "width": 223.00000000000006,
      "height": 114.99999999999997,
      "seed": 1046129075,
      "groupIds": [],
      "frameId": null,
      "roundness": {
        "type": 3
      },
      "boundElements": [
        {
          "type": "text",
          "id": "qH4cHb6aOV_E5qS8vJw4H"
        },
        {
          "id": "pQuPzVRh8WjIFdRY2eKF5",
          "type": "arrow"
        }
      ],
      "updated": 1734363588296,
      "link": null,
      "locked": false
    },
    {
      "type": "text",
      "version": 1627,
      "versionNonce": 63635197,
      "index": "b36",
      "isDeleted": false,
      "id": "qH4cHb6aOV_E5qS8vJw4H",
      "fillStyle": "solid",
      "strokeWidth": 2,
      "strokeStyle": "solid",
      "roughness": 1,
      "opacity": 100,
      "angle": 0,
      "x": 1167.4828214253794,
      "y": -68.47449800762266,
      "strokeColor": "#1e1e1e",
      "backgroundColor": "transparent",
      "width": 159.375,
      "height": 19.2,
      "seed": 1801517907,
      "groupIds": [],
      "frameId": null,
      "roundness": null,
      "boundElements": [],
      "updated": 1734363588297,
      "link": null,
      "locked": false,
      "fontSize": 16,
      "fontFamily": 3,
      "text": "AllocationManager",
      "textAlign": "center",
      "verticalAlign": "middle",
      "containerId": "LB1RAC-R424nw3plgg1kh",
      "originalText": "AllocationManager",
      "autoResize": true,
      "lineHeight": 1.2
    },
    {
      "type": "arrow",
      "version": 1452,
      "versionNonce": 461404627,
      "index": "b37",
      "isDeleted": false,
      "id": "pQuPzVRh8WjIFdRY2eKF5",
      "fillStyle": "solid",
      "strokeWidth": 2,
      "strokeStyle": "solid",
      "roughness": 1,
      "opacity": 100,
      "angle": 0,
      "x": 1242.1729864888496,
      "y": 211.26227843242594,
      "strokeColor": "#1e1e1e",
      "backgroundColor": "#ffc9c9",
      "width": 2.7711085123346493,
      "height": 203.15858945976518,
      "seed": 799750461,
      "groupIds": [],
      "frameId": null,
      "roundness": {
        "type": 2
      },
      "boundElements": [
        {
          "type": "text",
          "id": "-8p09am_7qW9OnaDRk8ia"
        }
      ],
      "updated": 1734363588308,
      "link": null,
      "locked": false,
      "startBinding": {
        "elementId": "d7pRFde2mvhA75ZinOGRD",
        "focus": 0.02526414269227943,
        "gap": 15.95200728185975,
        "fixedPoint": null
      },
      "endBinding": {
        "elementId": "LB1RAC-R424nw3plgg1kh",
        "focus": 0.011690285389073253,
        "gap": 9.478186980283425,
        "fixedPoint": null
      },
      "lastCommittedPoint": null,
      "startArrowhead": null,
      "endArrowhead": "triangle",
      "points": [
        [
          0,
          0
        ],
        [
          2.7711085123346493,
          -203.15858945976518
        ]
      ]
    },
    {
      "type": "text",
      "version": 469,
      "versionNonce": 1813289843,
      "index": "b38",
      "isDeleted": false,
      "id": "-8p09am_7qW9OnaDRk8ia",
      "fillStyle": "solid",
      "strokeWidth": 2,
      "strokeStyle": "solid",
      "roughness": 1,
      "opacity": 100,
      "angle": 0,
      "x": 1103.7635179447445,
      "y": 48.403683012858025,
      "strokeColor": "#1e1e1e",
      "backgroundColor": "#ffc9c9",
      "width": 217.41982972621918,
      "height": 125,
      "seed": 2144012701,
      "groupIds": [],
      "frameId": null,
      "roundness": null,
      "boundElements": [],
      "updated": 1734362486641,
      "link": null,
      "locked": false,
      "fontSize": 20,
      "fontFamily": 1,
      "text": "6/5. Query staker's\nmaxMagnitude for the\nStrategy to update\nstaker's\ndepositScalingFactor",
      "textAlign": "center",
      "verticalAlign": "middle",
      "containerId": "pQuPzVRh8WjIFdRY2eKF5",
      "originalText": "6/5. Query staker's maxMagnitude for the Strategy to update staker's depositScalingFactor",
      "autoResize": true,
      "lineHeight": 1.25
    },
    {
      "type": "rectangle",
      "version": 1681,
      "versionNonce": 1969129949,
      "index": "b3B",
      "isDeleted": false,
      "id": "uBOfg8AY3O3q1TzoE0AYc",
      "fillStyle": "solid",
      "strokeWidth": 2,
      "strokeStyle": "solid",
      "roughness": 1,
      "opacity": 100,
      "angle": 0,
      "x": 774.7144431608883,
      "y": 1368.5611244983547,
      "strokeColor": "#1e1e1e",
      "backgroundColor": "#d0bfff",
      "width": 223.00000000000006,
      "height": 114.99999999999997,
      "seed": 585934045,
      "groupIds": [],
      "frameId": null,
      "roundness": {
        "type": 3
      },
      "boundElements": [
        {
          "type": "text",
          "id": "T2lTCf315-7KP3ycNMXWW"
        },
        {
          "id": "uZdrle8wzDudz1Ky8EmR2",
          "type": "arrow"
        }
      ],
      "updated": 1734361966514,
      "link": null,
      "locked": false
    },
    {
      "type": "text",
      "version": 1432,
      "versionNonce": 537609789,
      "index": "b3C",
      "isDeleted": false,
      "id": "T2lTCf315-7KP3ycNMXWW",
      "fillStyle": "solid",
      "strokeWidth": 2,
      "strokeStyle": "solid",
      "roughness": 1,
      "opacity": 100,
      "angle": 0,
      "x": 806.5269431608883,
      "y": 1416.4611244983548,
      "strokeColor": "#1e1e1e",
      "backgroundColor": "transparent",
      "width": 159.375,
      "height": 19.2,
      "seed": 1260257597,
      "groupIds": [],
      "frameId": null,
      "roundness": null,
      "boundElements": [],
      "updated": 1734361966514,
      "link": null,
      "locked": false,
      "fontSize": 16,
      "fontFamily": 3,
      "text": "AllocationManager",
      "textAlign": "center",
      "verticalAlign": "middle",
      "containerId": "uBOfg8AY3O3q1TzoE0AYc",
      "originalText": "AllocationManager",
      "autoResize": true,
      "lineHeight": 1.2
    },
    {
      "type": "arrow",
      "version": 916,
      "versionNonce": 110574493,
      "index": "b3D",
      "isDeleted": false,
      "id": "uZdrle8wzDudz1Ky8EmR2",
      "fillStyle": "solid",
      "strokeWidth": 2,
      "strokeStyle": "solid",
      "roughness": 1,
      "opacity": 100,
      "angle": 0,
      "x": 888.8812762825158,
      "y": 1698.5800261707745,
      "strokeColor": "#1e1e1e",
      "backgroundColor": "#ffc9c9",
      "width": 0.03834289140161218,
      "height": 212.30934927812245,
      "seed": 218690429,
      "groupIds": [],
      "frameId": null,
      "roundness": {
        "type": 2
      },
      "boundElements": [
        {
          "type": "text",
          "id": "pAc8FXOW3tNpocQKsPVxn"
        }
      ],
      "updated": 1734362046016,
      "link": null,
      "locked": false,
      "startBinding": {
        "elementId": "OoHImjROrg7WnQ4xzkpcv",
        "focus": 0.04048028406652341,
        "gap": 18.848011234469368,
        "fixedPoint": null
      },
      "endBinding": {
        "elementId": "uBOfg8AY3O3q1TzoE0AYc",
        "focus": -0.024356922642854672,
        "gap": 2.7095523942973614,
        "fixedPoint": null
      },
      "lastCommittedPoint": null,
      "startArrowhead": null,
      "endArrowhead": "triangle",
      "points": [
        [
          0,
          0
        ],
        [
          0.03834289140161218,
          -212.30934927812245
        ]
      ]
    },
    {
      "id": "pAc8FXOW3tNpocQKsPVxn",
      "type": "text",
      "x": 790.0505289008022,
      "y": 1542.4253515317132,
      "width": 197.69983765482903,
      "height": 100,
      "angle": 0,
      "strokeColor": "#1e1e1e",
      "backgroundColor": "#d0bfff",
      "fillStyle": "solid",
      "strokeWidth": 1,
      "strokeStyle": "solid",
      "roughness": 0,
      "opacity": 100,
      "groupIds": [],
      "frameId": null,
      "index": "b3DV",
      "roundness": null,
      "seed": 1205146525,
      "version": 224,
      "versionNonce": 412461885,
      "isDeleted": false,
      "boundElements": null,
      "updated": 1734362040720,
      "link": null,
      "locked": false,
      "text": "2. Query\nmaxMagnitude to\ncalculate staker's\nwithdrawable shares",
      "fontSize": 20,
      "fontFamily": 1,
      "textAlign": "center",
      "verticalAlign": "middle",
      "containerId": "uZdrle8wzDudz1Ky8EmR2",
      "originalText": "2. Query maxMagnitude to calculate staker's withdrawable shares",
      "autoResize": true,
      "lineHeight": 1.25
    },
    {
      "type": "rectangle",
      "version": 1778,
      "versionNonce": 896093651,
      "index": "b3F",
      "isDeleted": false,
      "id": "6FNSXtSCK4i9vGJHUD_Gd",
      "fillStyle": "solid",
      "strokeWidth": 2,
      "strokeStyle": "solid",
      "roughness": 1,
      "opacity": 100,
      "angle": 0,
      "x": 2622.909053060372,
      "y": 1700.057029928533,
      "strokeColor": "#1e1e1e",
      "backgroundColor": "#d0bfff",
      "width": 223.00000000000006,
      "height": 114.99999999999997,
      "seed": 846589651,
      "groupIds": [],
      "frameId": null,
      "roundness": {
        "type": 3
      },
      "boundElements": [
        {
          "type": "text",
          "id": "EKob_oXQJUmOYJUD_1iZg"
        },
        {
          "id": "6dpTPKRZLEdmh9dN3ZD96",
          "type": "arrow"
        }
      ],
      "updated": 1734362199220,
      "link": null,
      "locked": false
    },
    {
      "type": "text",
      "version": 1529,
      "versionNonce": 759569267,
      "index": "b3G",
      "isDeleted": false,
      "id": "EKob_oXQJUmOYJUD_1iZg",
      "fillStyle": "solid",
      "strokeWidth": 2,
      "strokeStyle": "solid",
      "roughness": 1,
      "opacity": 100,
      "angle": 0,
      "x": 2654.721553060372,
      "y": 1747.957029928533,
      "strokeColor": "#1e1e1e",
      "backgroundColor": "transparent",
      "width": 159.375,
      "height": 19.2,
      "seed": 35036275,
      "groupIds": [],
      "frameId": null,
      "roundness": null,
      "boundElements": [],
      "updated": 1734362199220,
      "link": null,
      "locked": false,
      "fontSize": 16,
      "fontFamily": 3,
      "text": "AllocationManager",
      "textAlign": "center",
      "verticalAlign": "middle",
      "containerId": "6FNSXtSCK4i9vGJHUD_Gd",
      "originalText": "AllocationManager",
      "autoResize": true,
      "lineHeight": 1.2
    },
    {
      "type": "arrow",
      "version": 1115,
      "versionNonce": 339791603,
      "index": "b3H",
      "isDeleted": false,
      "id": "6dpTPKRZLEdmh9dN3ZD96",
      "fillStyle": "solid",
      "strokeWidth": 2,
      "strokeStyle": "solid",
      "roughness": 1,
      "opacity": 100,
      "angle": 0,
      "x": 2737.075886182,
      "y": 2030.0759316009528,
      "strokeColor": "#1e1e1e",
      "backgroundColor": "#ffc9c9",
      "width": 0.03834289140161218,
      "height": 212.30934927812245,
      "seed": 546346515,
      "groupIds": [],
      "frameId": null,
      "roundness": {
        "type": 2
      },
      "boundElements": [
        {
          "type": "text",
          "id": "stENef2b2kfL0tlWSytw2"
        }
      ],
      "updated": 1734362278797,
      "link": null,
      "locked": false,
      "startBinding": null,
      "endBinding": {
        "elementId": "6FNSXtSCK4i9vGJHUD_Gd",
        "focus": -0.02435692264285643,
        "gap": 2.7095523942973614,
        "fixedPoint": null
      },
      "lastCommittedPoint": null,
      "startArrowhead": null,
      "endArrowhead": "triangle",
      "points": [
        [
          0,
          0
        ],
        [
          0.03834289140161218,
          -212.30934927812245
        ]
      ]
    },
    {
      "id": "stENef2b2kfL0tlWSytw2",
      "type": "text",
      "x": 2628.1951595549963,
      "y": 1873.9212569618917,
      "width": 217.79979614540935,
      "height": 100,
      "angle": 0,
      "strokeColor": "#1e1e1e",
      "backgroundColor": "#d0bfff",
      "fillStyle": "solid",
      "strokeWidth": 1,
      "strokeStyle": "solid",
      "roughness": 0,
      "opacity": 100,
      "groupIds": [],
      "frameId": null,
      "index": "b3I",
      "roundness": null,
      "seed": 2094685107,
      "version": 278,
      "versionNonce": 1119906045,
      "isDeleted": false,
      "boundElements": [],
      "updated": 1734362277899,
      "link": null,
      "locked": false,
      "text": "3. Query\nmaxMagnitude to\nupdate staker's\ndeposit scaling factor",
      "fontSize": 20,
      "fontFamily": 1,
      "textAlign": "center",
      "verticalAlign": "middle",
      "containerId": "6dpTPKRZLEdmh9dN3ZD96",
      "originalText": "3. Query maxMagnitude to update staker's deposit scaling factor",
      "autoResize": true,
      "lineHeight": 1.25
    },
    {
      "type": "rectangle",
      "version": 1838,
      "versionNonce": 1109827805,
      "index": "b3J",
      "isDeleted": false,
      "id": "0a8N_e6gkwu5-k8KmBL_-",
      "fillStyle": "solid",
      "strokeWidth": 2,
      "strokeStyle": "solid",
      "roughness": 1,
      "opacity": 100,
      "angle": 0,
      "x": 710.5859275076249,
      "y": 2268.2620413972554,
      "strokeColor": "#1e1e1e",
      "backgroundColor": "#d0bfff",
      "width": 223.00000000000006,
      "height": 114.99999999999997,
      "seed": 1306495869,
      "groupIds": [],
      "frameId": null,
      "roundness": {
        "type": 3
      },
      "boundElements": [
        {
          "type": "text",
          "id": "2SpNu7VlX4wkRxeUwbP2L"
        },
        {
          "id": "130BriWp6I2pxy6aKtw0G",
          "type": "arrow"
        }
      ],
      "updated": 1734362372290,
      "link": null,
      "locked": false
    },
    {
      "type": "text",
      "version": 1589,
      "versionNonce": 1773698365,
      "index": "b3K",
      "isDeleted": false,
      "id": "2SpNu7VlX4wkRxeUwbP2L",
      "fillStyle": "solid",
      "strokeWidth": 2,
      "strokeStyle": "solid",
      "roughness": 1,
      "opacity": 100,
      "angle": 0,
      "x": 742.3984275076249,
      "y": 2316.1620413972555,
      "strokeColor": "#1e1e1e",
      "backgroundColor": "transparent",
      "width": 159.375,
      "height": 19.2,
      "seed": 1882919901,
      "groupIds": [],
      "frameId": null,
      "roundness": null,
      "boundElements": [],
      "updated": 1734362372290,
      "link": null,
      "locked": false,
      "fontSize": 16,
      "fontFamily": 3,
      "text": "AllocationManager",
      "textAlign": "center",
      "verticalAlign": "middle",
      "containerId": "0a8N_e6gkwu5-k8KmBL_-",
      "originalText": "AllocationManager",
      "autoResize": true,
      "lineHeight": 1.2
    },
    {
      "type": "arrow",
      "version": 1205,
      "versionNonce": 1180063027,
      "index": "b3L",
      "isDeleted": false,
      "id": "130BriWp6I2pxy6aKtw0G",
      "fillStyle": "solid",
      "strokeWidth": 2,
      "strokeStyle": "solid",
      "roughness": 1,
      "opacity": 100,
      "angle": 0,
      "x": 825.1694272959191,
      "y": 2598.2809430696752,
      "strokeColor": "#1e1e1e",
      "backgroundColor": "#ffc9c9",
      "width": 0.03834289140161218,
      "height": 212.30934927812223,
      "seed": 1657180221,
      "groupIds": [],
      "frameId": null,
      "roundness": {
        "type": 2
      },
      "boundElements": [
        {
          "type": "text",
          "id": "OfHErzEAswtHwUQ0Olnsf"
        }
      ],
      "updated": 1734363604361,
      "link": null,
      "locked": false,
      "startBinding": null,
      "endBinding": {
        "elementId": "0a8N_e6gkwu5-k8KmBL_-",
        "focus": -0.028093495417795003,
        "gap": 2.7095523942975888,
        "fixedPoint": null
      },
      "lastCommittedPoint": null,
      "startArrowhead": null,
      "endArrowhead": "triangle",
      "points": [
        [
          0,
          0
        ],
        [
          0.03834289140161218,
          -212.30934927812223
        ]
      ]
    },
    {
      "id": "OfHErzEAswtHwUQ0Olnsf",
      "type": "text",
      "x": 724.3686786935023,
      "y": 2417.126268430614,
      "width": 201.63984009623528,
      "height": 150,
      "angle": 0,
      "strokeColor": "#1e1e1e",
      "backgroundColor": "#d0bfff",
      "fillStyle": "solid",
      "strokeWidth": 1,
      "strokeStyle": "solid",
      "roughness": 0,
      "opacity": 100,
      "groupIds": [],
      "frameId": null,
      "index": "b3M",
      "roundness": null,
      "seed": 56852637,
      "version": 324,
      "versionNonce": 1891300851,
      "isDeleted": false,
      "boundElements": [],
      "updated": 1734363601320,
      "link": null,
      "locked": false,
      "text": "2. Query\nmaxMagnitude to\ncalculate whether\nwithdrawable shares\nwere slashed while in\nqueue",
      "fontSize": 20,
      "fontFamily": 1,
      "textAlign": "center",
      "verticalAlign": "middle",
      "containerId": "130BriWp6I2pxy6aKtw0G",
      "originalText": "2. Query maxMagnitude to calculate whether withdrawable shares were slashed while in queue",
      "autoResize": true,
      "lineHeight": 1.25
    },
    {
      "type": "rectangle",
      "version": 1925,
      "versionNonce": 1307885843,
      "index": "b3N",
      "isDeleted": false,
      "id": "AK7dgZlDTH-2Oikgm8ydH",
      "fillStyle": "solid",
      "strokeWidth": 2,
      "strokeStyle": "solid",
      "roughness": 1,
      "opacity": 100,
      "angle": 0,
      "x": 1091.7531389138244,
      "y": 3713.033937529639,
      "strokeColor": "#1e1e1e",
      "backgroundColor": "#d0bfff",
      "width": 223.00000000000006,
      "height": 114.99999999999997,
      "seed": 560396019,
      "groupIds": [],
      "frameId": null,
      "roundness": {
        "type": 3
      },
      "boundElements": [
        {
          "type": "text",
          "id": "Nz-REXSoxDrDSOd5LCxhq"
        },
        {
          "id": "07rBBHWqecyJpfZJMK1_M",
          "type": "arrow"
        }
      ],
      "updated": 1734363571520,
      "link": null,
      "locked": false
    },
    {
      "type": "text",
      "version": 1677,
      "versionNonce": 1652631219,
      "index": "b3O",
      "isDeleted": false,
      "id": "Nz-REXSoxDrDSOd5LCxhq",
      "fillStyle": "solid",
      "strokeWidth": 2,
      "strokeStyle": "solid",
      "roughness": 1,
      "opacity": 100,
      "angle": 0,
      "x": 1123.5656389138244,
      "y": 3760.933937529639,
      "strokeColor": "#1e1e1e",
      "backgroundColor": "transparent",
      "width": 159.375,
      "height": 19.2,
      "seed": 1509007507,
      "groupIds": [],
      "frameId": null,
      "roundness": null,
      "boundElements": [],
      "updated": 1734363571520,
      "link": null,
      "locked": false,
      "fontSize": 16,
      "fontFamily": 3,
      "text": "AllocationManager",
      "textAlign": "center",
      "verticalAlign": "middle",
      "containerId": "AK7dgZlDTH-2Oikgm8ydH",
      "originalText": "AllocationManager",
      "autoResize": true,
      "lineHeight": 1.2
    },
    {
      "type": "arrow",
      "version": 1377,
      "versionNonce": 446149171,
      "index": "b3P",
      "isDeleted": false,
      "id": "07rBBHWqecyJpfZJMK1_M",
      "fillStyle": "solid",
      "strokeWidth": 2,
      "strokeStyle": "solid",
      "roughness": 1,
      "opacity": 100,
      "angle": 0,
      "x": 1205.4707532854518,
      "y": 4042.1544017020587,
      "strokeColor": "#1e1e1e",
      "backgroundColor": "#ffc9c9",
      "width": 0.03834289140161218,
      "height": 212.30934927812223,
      "seed": 716576307,
      "groupIds": [],
      "frameId": null,
      "roundness": {
        "type": 2
      },
      "boundElements": [
        {
          "type": "text",
          "id": "sw19jzLIy905vlo-X89BW"
        }
      ],
      "updated": 1734363685756,
      "link": null,
      "locked": false,
      "startBinding": null,
      "endBinding": {
        "elementId": "AK7dgZlDTH-2Oikgm8ydH",
        "focus": -0.02032697503509013,
        "gap": 1.8111148942975888,
        "fixedPoint": null
      },
      "lastCommittedPoint": null,
      "startArrowhead": null,
      "endArrowhead": "triangle",
      "points": [
        [
          0,
          0
        ],
        [
          0.03834289140161218,
          -212.30934927812223
        ]
      ]
    },
    {
      "id": "sw19jzLIy905vlo-X89BW",
      "type": "text",
      "x": 1105.119223433035,
      "y": 3861.8981645629974,
      "width": 201.63984009623528,
      "height": 150,
      "angle": 0,
      "strokeColor": "#1e1e1e",
      "backgroundColor": "#d0bfff",
      "fillStyle": "solid",
      "strokeWidth": 1,
      "strokeStyle": "solid",
      "roughness": 0,
      "opacity": 100,
      "groupIds": [],
      "frameId": null,
      "index": "b3Q",
      "roundness": null,
      "seed": 43702227,
      "version": 328,
      "versionNonce": 1773573085,
      "isDeleted": false,
      "boundElements": [],
      "updated": 1734363604596,
      "link": null,
      "locked": false,
      "text": "2. Query\nmaxMagnitude to\ncalculate whether\nwithdrawable shares\nwere slashed while in\nqueue",
      "fontSize": 20,
      "fontFamily": 1,
      "textAlign": "center",
      "verticalAlign": "middle",
      "containerId": "07rBBHWqecyJpfZJMK1_M",
      "originalText": "2. Query maxMagnitude to calculate whether withdrawable shares were slashed while in queue",
      "autoResize": true,
      "lineHeight": 1.25
    },
    {
      "type": "rectangle",
      "version": 1868,
      "versionNonce": 848772413,
      "index": "b3R",
      "isDeleted": false,
      "id": "cyLRrqf8uVqIpnO4DRqqy",
      "fillStyle": "solid",
      "strokeWidth": 2,
      "strokeStyle": "solid",
      "roughness": 1,
      "opacity": 100,
      "angle": 0,
      "x": 1396.717409232908,
      "y": -982.4560167908803,
      "strokeColor": "#1e1e1e",
      "backgroundColor": "#b2f2bb",
      "width": 266.00000000000017,
      "height": 114.99999999999997,
      "seed": 2131196029,
      "groupIds": [],
      "frameId": null,
      "roundness": {
        "type": 3
      },
      "boundElements": [
        {
          "type": "text",
          "id": "HTWzY9PIToNQf8PIFO6bi"
        }
      ],
      "updated": 1734363922343,
      "link": null,
      "locked": false
    },
    {
      "type": "text",
      "version": 1766,
      "versionNonce": 1981310643,
      "index": "b3S",
      "isDeleted": false,
      "id": "HTWzY9PIToNQf8PIFO6bi",
      "fillStyle": "solid",
      "strokeWidth": 2,
      "strokeStyle": "solid",
      "roughness": 1,
      "opacity": 100,
      "angle": 0,
      "x": 1459.311159232908,
      "y": -934.5560167908803,
      "strokeColor": "#1e1e1e",
      "backgroundColor": "transparent",
      "width": 140.8125,
      "height": 19.2,
      "seed": 1876779229,
      "groupIds": [],
      "frameId": null,
      "roundness": null,
      "boundElements": [],
      "updated": 1734363922344,
      "link": null,
      "locked": false,
      "fontSize": 16,
      "fontFamily": 3,
      "text": "EIP-4788 Oracle",
      "textAlign": "center",
      "verticalAlign": "middle",
      "containerId": "cyLRrqf8uVqIpnO4DRqqy",
      "originalText": "EIP-4788 Oracle",
      "autoResize": true,
      "lineHeight": 1.2
    }
  ],
  "appState": {
    "gridSize": 20,
    "gridStep": 5,
    "gridModeEnabled": false,
    "viewBackgroundColor": "#ffffff"
  },
  "files": {}
}
````

## File: docs/multichain/destination/CertificateVerifier.md
````markdown
## CertificateVerifier

| File | Type | Proxy |
| -------- | -------- | -------- |
| [`ECDSACertificateVerifier.sol`](../../../src/contracts/multichain/ECDSACertificateVerifier.sol) | Singleton | Transparent proxy |
| [`BN254CertificateVerifier.sol`](../../../src/contracts/multichain/BN254CertificateVerifier.sol) | Singleton | Transparent proxy |
| [`IBaseCertificateVerifier.sol`](../../../src/contracts/interfaces/IBaseCertificateVerifier.sol) | Base interface for all verifiers | |

Libraries and Mixins:

| File | Used By | Notes |
| -------- | -------- | -------- |
| [`ECDSA.sol`](https://github.com/OpenZeppelin/openzeppelin-contracts/blob/v4.9.0/contracts/utils/cryptography/ECDSA.sol) | ECDSACertificateVerifier | ECDSA signature recovery |
| [`SignatureUtilsMixin.sol`](../../../src/contracts/mixins/SignatureUtilsMixin.sol) | ECDSACertificateVerifier | EIP-712 and signature validation |
| [`BN254.sol`](../../../src/contracts/libraries/BN254.sol) | BN254CertificateVerifier | BN254CertificateVerifier |
| [`BN254SignatureVerifier.sol`](../../../src/contracts/libraries/BN254SignatureVerifier.sol) | BN254CertificateVerifier | BLS signature verification |
| [`Merkle.sol`](../../../src/contracts/libraries/Merkle.sol) | BN254CertificateVerifier | Merkle proof verification |
| [`SemVerMixin.sol`](../../../src/contracts/mixins/SemVerMixin.sol) | BN254CertificateVerifier | Semantic versioning |
| [`OperatorSetLib.sol`](../../../src/contracts/libraries/OperatorSetLib.sol) | Both | Operator set key encoding |

---

## Overview

The CertificateVerifier contracts are responsible for verifying certificates from an offchain task, on-chain. The operatorSet tables are configured by the [`OperatorTableUpdater`](./OperatorTableUpdater.md) and updated in the `CertificateVerifier` by an offchain process. These contracts support two signature schemes: ECDSA for individual signatures and BN254 for aggregated signatures.

Certificates can be created at any time, but must contain a `referenceTimestamp`, which informs the contract of which operator table for the `operatorSet` to use. Both certificate verifiers implement staleness checks based on a `maxStalenessPeriod` to ensure certificates are not verified against outdated operator information. 

**Note: Setting a max staleness period to 0 enables certificates to be confirmed against any `referenceTimestamp`. In addition, setting a `maxStalenessPeriod` that is greater than 0 and less than the frequency of table updates (daily on testnet at 14:00 UTC, weekly on Monday on mainnet at 14:00 UTC) is impossible due bounds enfroced by the [`CrossChainRegistry`](../source/CrossChainRegistry.md#parameterization).** See the [staleness period](#staleness-period) in the appendix for some examples. 

Both the `BN254CertificateVerifier` and `ECDSACertificateVerifier` contain a `msgHash` parameter. This value is the the hash of a task that was completed by operators. **NOTE: The msgHash is NOT signed by operators as part of completion of a task**. The value signed by operators is the signable digest, which is the hash of the `msgHash` and `referenceTimestamp`. This signable digest is given by `certificateVerifier.calculateCertificateDigest`. 

In addition to the table updates that occur for *all* operatorSets, the multichain protocol updates tables for single operatorSets any time the following 4 events are emitted for an operatorSet with an active generation reservation:
 - AllocationManager: `OperatorSlashed`
 - AllocationManager: `OperatorAddedToOperatorSet`
 - AllocationManager: `OperatorRemovedFromOperatorSet`
 - CrossChainRegistry: `GenerationReservationCreated`

---

## ECDSACertificateVerifier

The `ECDSACertificateVerifier` implements ECDSA signature verification where each operator signs individually. For a given operatorSet, it stores the list of all operators and their corresponding weights. 


### Update Table
The `operatorTableUpdater` will update the via a merkle proof of the table against the `globalTableRoot`. See [`operatorTableUpdater`](./OperatorTableUpdater.md#updateoperatortable) for more information. 

#### `updateOperatorTable`

```solidity
/**
 * @notice A struct that contains information about a single operator for an ECDSA signing key
 * @param pubkey The address of the signing ECDSA key of the operator and not the operator address itself.
 * @param weights The weights of the operator for a single operatorSet
 *
 * @dev The `weights` array can be defined as a list of arbitrary stake types. For example,
 *      it can be [slashable_stake, delegated_stake, strategy_i_stake, ...]. Each stake type is an element in the array.
 *      The stake weights are defined by the operatorSet's `OperatorTableCalculator` and transported by the multichain protocol
 * 
 * @dev An AVS defines the `weights` array based on the criteria it wants to use for distribution and verification of off-chain tasks. 
 *      For example, a slashable that wants to distribute some tasks based on `EIGEN` stake and other based on `stETH` stake would 
 *      use [slashable_EIGEN_stake, slashable_stETH_stake] as the `weights` array
 *
 * @dev It is up to the AVS to define the `weights` array, which is used by the `IECDSACertificateVerifier` to verify Certificates
 *
 * @dev For each operator, the `weights` array should be the same length and composition, otherwise verification issues can arise
 */
struct ECDSAOperatorInfo {
    address pubkey;
    uint256[] weights;
}

/**
 * @notice updates the operatorSet with the operator table (i.e. stake weights) and its configuration
 * @param operatorSet the operatorSet to update the operator table for
 * @param referenceTimestamp the timestamp at which the operatorInfos (i.e. operator table) was sourced
 * @param operatorInfos the operatorInfos to update the operator table with.
 *        See `IOperatorTableCalculator.ECDSAOperatorInfo` for more details    
 * @param operatorSetConfig the configuration of the operatorSet, which includes the owner and max staleness period
 * @dev This function can only be called by the `OperatorTableUpdater` contract, which is itself permissionless to call
 * @dev The `referenceTimestamp` must correspond to a reference timestamp for a globalTableRoot stored in the `OperatorTableUpdater`
 *      In addition, it must be greater than the latest reference timestamp for the given operatorSet
 * @dev Reverts for:
 *      - OnlyTableUpdater: Caller is not the operatorTableUpdater
 *      - TableUpdateStale: The referenceTimestamp is not greater than the latest reference timestamp
 * @dev Emits the following events:
 *      - TableUpdated: When the operator table is successfully updated
 */
function updateOperatorTable(
    OperatorSet calldata operatorSet,
    uint32 referenceTimestamp,
    ECDSAOperatorInfo[] calldata operatorInfos,
    OperatorSetConfig calldata operatorSetConfig
) external;
```

Updates the operator table with new `operatorInfos` and `operatorSetConfig`. All operators and weights are written to storage. 

Note that updating operator tables for a `referenceTimestamp` that is less than the latest reference timestamp is not possible. Thus, operator tables cannot be updated retroactively. AVS developers should keep this in mind when building their off-chain signature aggregation logic. 

*Effects*:
* Stores the number of operators at `_numOperators[operatorSetKey][referenceTimestamp]`
* Stores each operator info at `_operatorInfos[operatorSetKey][referenceTimestamp][index]`
* Updates `_latestReferenceTimestamps[operatorSetKey]` to `referenceTimestamp`
* Updates `_operatorSetOwners[operatorSetKey]` to `operatorSetConfig.owner`
* Updates `_maxStalenessPeriods[operatorSetKey]` to `operatorSetConfig.maxStalenessPeriod`
* Updates `_isReferenceTimestampSet[operatorSetKey][referenceTimestamp]` to `true`
* Emits a `TableUpdated` event

*Requirements*:
* Caller MUST be the `operatorTableUpdater`
* The `referenceTimestamp` MUST be greater than the latest reference timestamp


### Certificate Verification
The contract supports 3 verification patterns:
1. [Basic verification](#verifycertificate) - Returns the signed stakes for further processing
2. [Proportional verification](#verifycertificateproportion) - Verifies against percentage-based thresholds
3. [Nominal verification](#verifycertificatenominal) - Verifies against absolute stake thresholds

For the `msgHash`, it is up to the off-chain AVS software to add relevant metadata to ensure that the `Certificate` cannot be reused across the same tasks. For example, an AVS can include a UID on the message hash for every task it creates. 

#### `verifyCertificate`

```solidity
/**
 * @notice A Certificate used to verify a set of ECDSA signatures for an off-chain task
 * @param referenceTimestamp a reference timestamp that corresponds to a timestamp at which an operator table was updated for the operatorSet
 * @param messageHash the hash of a task that was completed by operators. The messageHash is defined by the AVS, see `TaskMailbox.sol` for an example implementation.
 *                    NOTE: This value is NOT the message that is signed by operators - see `calculateCertificateDigest` for the signable digest.
 * @param sig the concatenated signature of each signing operator, in ascending order of signer address. The signature should be over the signable digest,
 *            which is calculated by `calculateCertificateDigest`
 * @dev The signers can be sorted via OZ sort library
 * @dev ECDSA certificates DO NOT support smart contract signatures
 * @dev The `referenceTimestamp` is used to key into the operatorSet's stake weights. It is NOT the timestamp at which the certificate was generated off-chain
 */
struct ECDSACertificate {
    uint32 referenceTimestamp;
    bytes32 messageHash;
    bytes sig;
}

/**
 * @notice verifies a certificate against the operator table for a given reference timestamp
 * @param operatorSet the operatorSet that the certificate is for
 * @param cert a certificate
 * @return totalSignedStakeWeights total stake weight that signed the certificate for each stake type. Each
 * index corresponds to a stake type in the `weights` array in the `ECDSAOperatorInfo` struct
 * @return signers array of addresses that signed the certificate
 * @dev This function DOES NOT support smart contact signatures
 * @dev The `referenceTimestamp` in the `ECDSACertificate` is used to determine the operator table to use for the verification
 * @dev AVS' are responsible for managing potential race conditions when certificates are signed close to operator table updates. Some examples include:
 *      a. An in-flight certificate for a past reference timestamp and an operator table update for a newer reference timestamp. The AVS should decide whether it
 *         wants to only confirm tasks against the *latest* certificate
 *      b. An in-flight certificate against a stake table with a majority-stake operator that has been slashed or removed from the operatorSet
 * @dev Reverts for:
 *      - CertificateStale: The certificate's referenceTimestamp is too stale with respect to the maxStalenessPeriod of the operatorSet
 *      - ReferenceTimestampDoesNotExist: The root at referenceTimestamp does not exist
 *      - RootDisabled: The root at referenceTimestamp is not valid
 *      - InvalidSignatureLength: Signatures are not proper length
 *      - InvalidSignature: Each signature is not valid
 *      - SignersNotOrdered: Signatures are not ordered by signer address ascending
 *      - ReferenceTimestampDoesNotExist: The operatorSet has not been updated for the referenceTimestamp
 *      - OperatorCountZero: There are zero operators for the referenceTimestamp
 *      - VerificationFailed: Any signer is not a registered operator
 */
function verifyCertificate(
    OperatorSet calldata operatorSet,
    ECDSACertificate memory cert
) external returns (uint256[] memory signedStakes, address[] memory signers);
```

Verifies an ECDSA certificate by checking individual signatures from operators. Each individual operator must sign off on a `signableDigest` given by [`calculateCertificateDigest`](#calculatecertificatedigest). **The `referenceTimestamp` of the certificate is the time at which the operator table for a given certificate was sourced. It is not the timestamp at which the certificate was created.**

*Process*:
* Validates the certificate timestamp against staleness requirements
* Computes the EIP-712 digest for the certificate
* Parses concatenated signatures and recovers signers
* For each recovered signer:
  * Verifies the signer is a registered operator
  * Adds the operator's weights to signed stakes
* Returns the total signed stakes

*Requirements*:
* The certificate MUST NOT be stale (based on `maxStalenessPeriod`)
* The root at `referenceTimestamp` MUST exist
* The root at `referenceTimestamp` MUST be valid
* Signatures MUST be proper length
* Each signature MUST be valid
* Signatures MUST be ordered by signer address (ascending)
* The operatorSet MUST be updated for the `referenceTimestamp`
* There must be a nonzero number of operators for the `referenceTimestamp`
* All signers MUST be registered operators

#### `verifyCertificateProportion`

```solidity
/**
 * @notice verifies a certificate and makes sure that the signed stakes meet
 * provided portions of the total stake weight on the AVS
 * @param operatorSet the operatorSet to verify the certificate for
 * @param cert a certificate
 * @param totalStakeProportionThresholds the proportion, in BPS, of total stake weight that
 * the signed stake of the certificate should meet. Each index corresponds to
 * a stake type in the `weights` array in the `ECDSAOperatorInfo`
 * @return Whether or not the certificate is valid and meets thresholds
 * @return signers array of addresses that signed the certificate
 * @dev This function DOES NOT support smart contact signatures
 * @dev The `referenceTimestamp` in the `ECDSACertificate` is used to determine the operator table to use for the verification
 * @dev AVS' are responsible for managing potential race conditions when certificates are signed close to operator table updates. Some examples include:
 *      a. An in-flight certificate for a past reference timestamp and an operator table update for a newer reference timestamp. The AVS should decide whether it
 *         wants to only confirm tasks against the *latest* certificate
 *      b. An in-flight certificate against a stake table with a majority-stake operator that has been slashed or removed from the operatorSet
 * @dev Reverts for:
 *      - All requirements from verifyCertificate
 *      - ArrayLengthMismatch: signedStakes.length does not equal totalStakeProportionThresholds.length
 */
function verifyCertificateProportion(
    OperatorSet calldata operatorSet,
    ECDSACertificate memory cert,
    uint16[] memory totalStakeProportionThresholds
) external view returns (bool, address[] memory signers);
```

Verifies that a certificate meets specified proportion thresholds as a percentage of total stake for each stake type.

*Process*:
* Performs the same verification as `verifyCertificate` to get signed stakes
* Calculates the total stakes for the operator set
* Compares signed stakes against proportion thresholds
* Returns true only if all thresholds are met

*Requirements*:
* All requirements from `verifyCertificate`
* `signedStakes.length` MUST equal `totalStakeProportionThresholds.length`

#### `verifyCertificateNominal`

```solidity
/**
 * @notice verifies a certificate and makes sure that the signed stakes meet
 * provided nominal stake thresholds
 * @param operatorSet the operatorSet that the certificate is for
 * @param cert a certificate
 * @param totalStakeNominalThresholds the nominal amount of total stake weight that
 * the signed stake of the certificate should meet. Each index corresponds to
 * a stake type in the `weights` array in the `ECDSAOperatorInfo`
 * @return Whether or not the certificate is valid and meets thresholds
 * @return signers array of addresses that signed the certificate
 * @dev This function DOES NOT support smart contact signatures
 * @dev The `referenceTimestamp` in the `ECDSACertificate` is used to determine the operator table to use for the verification
 * @dev AVS' are responsible for managing potential race conditions when certificates are signed close to operator table updates. Some examples include:
 *      a. An in-flight certificate for a past reference timestamp and an operator table update for a newer reference timestamp. The AVS should decide whether it
 *         wants to only confirm tasks against the *latest* certificate
 *      b. An in-flight certificate against a stake table with a majority-stake operator that has been slashed or removed from the operatorSet
 * @dev Reverts for:
 *      - All requirements from verifyCertificate
 *      - ArrayLengthMismatch: signedStakes.length does not equal totalStakeNominalThresholds.length
 */
function verifyCertificateNominal(
    OperatorSet calldata operatorSet,
    ECDSACertificate memory cert,
    uint256[] memory totalStakeNominalThresholds
) external returns (bool, address[] memory signers);
```

Verifies that a certificate meets specified nominal (absolute) stake thresholds for each stake type.

*Process*:
* Performs the same verification as `verifyCertificate` to get signed stakes
* Compares signed stakes against absolute thresholds
* Returns true only if all thresholds are met

*Requirements*:
* All requirements from `verifyCertificate`
* `signedStakes.length` MUST equal `totalStakeNominalThresholds.length`

### Utility Functions

#### `domainSeparator`

```solidity
/**
 * @notice Override domainSeparator to not include chainId
 * @return The domain separator hash without chainId
 * @dev This function overrides the base domainSeparator to not include chainId to replay
 *      certificates across multiple destination chains
 */
function domainSeparator() external view returns (bytes32);
```

The ECDSA Certificate Verifier uses a modified domain separator that intentionally **excludes the chainId**. This design choice enables cross-chain certificate reuse. 


#### `calculateCertificateDigest`

```solidity
/**
 * @notice Calculate the EIP-712 digest for a certificate, returning the hash of the digest
 * @param referenceTimestamp The reference timestamp
 * @param messageHash The message hash of the task
 * @return The EIP-712 digest
 * @dev EIP-712 is a standard ECDSA signature verification framework. See https://eips.ethereum.org/EIPS/eip-712 for more details
 * @dev This function is public to allow offchain tools to calculate the same digest
 * @dev Note: This does not support smart contract based signatures for multichain
 * @dev This is a chain-agnostic digest, so it can be used to verify certificates across
 *      multiple destination chains
 */
function calculateCertificateDigest(
    uint32 referenceTimestamp,
    bytes32 messageHash
) external view returns (bytes32);
```

Computes the EIP-712 structured data hash for ECDSA certificate signing. This digest is what operators must sign to create a valid certificate.

**Multichain Design**: This function creates a chain-agnostic digest by using a domain separator that doesn't include the chainId. This allows the same certificate to be verified across multiple destination chains without requiring separate signatures.

*Returns*:
* EIP-712 digest using domain separator (without chainId) and certificate type hash

---

## BN254CertificateVerifier

The `BN254CertificateVerifier` implements BN254 signature verification. BN254 signatures enable signature aggreagtion for larger operatorSets. It uses merkle proofs to cache nonsigners to for efficient stake table transport.

### Update Table
The `operatorTableUpdater` will update the table via a merkle proof against the `globalTableRoot`. Unlike ECDSA which stores individual operators, BN254 stores aggregated data and a merkle root of operator stakes.

#### `updateOperatorTable`

```solidity
/**
 * @notice A struct that contains information about a single operator for a given BN254 operatorSet
 * @param pubkey The G1 public key of the operator
 * @param weights The weights of the operator for a single operatorSet
 *
 * @dev The `weights` array is as a list of arbitrary stake types. For example,
 *      it can be [slashable_stake, delegated_stake, strategy_i_stake, ...]. Each stake type is an element in the array.
 *      The stake weights are defined by the operatorSet's `OperatorTableCalculator` and transported by the multichain protocol
 * 
 * @dev An AVS defines the `weights` array based on the criteria it wants to use for distribution and verification of off-chain tasks. 
 *      For example, a slashable that wants to distribute some tasks based on `EIGEN` stake and other based on `stETH` stake would 
 *      use [slashable_EIGEN_stake, slashable_stETH_stake] as the `weights` array
 *
 * @dev It is up to the AVS to define the `weights` array, which is used by the `IBN254CertificateVerifier` to verify Certificates
 *
 * @dev For each operator, the `weights` array should be the same length and composition, otherwise verification issues can arise
 */
struct BN254OperatorInfo {
    BN254.G1Point pubkey;
    uint256[] weights;
}

/**
 * @notice A struct that contains information about all operators for a given BN254OperatorSet
 * @param operatorInfoTreeRoot The root of the operatorInfo tree
 * @param numOperators The number of operators in the operatorSet
 * @param aggregatePubkey The aggregate G1 public key of the operators in the operatorSet
 * @param totalWeights The total stake weights of the operators in the operatorSet
 *
 * @dev The operatorInfoTreeRoot is the root of a merkle tree that contains the operatorInfos for each operator in the operatorSet.
 *      It is calculated on-chain by the `BN254TableCalculator` and used by the `IBN254CertificateVerifier` to verify stakes against the non-signing operators
 *
 * @dev Retrieval of the `aggregatePubKey` depends on maintaining a key registry contract, see `KeyRegistrar` for an example implementation
 *
 * @dev The `totalWeights` array should be the same length and composition as each individual `weights` array in `BN254OperatorInfo`.
 *      For example, if there are 3 operators with individual weights arrays with composition of  [delegated_stake, slashable_stake]
 *      of [100, 200], [300, 400], and [500, 600], the `totalWeights` array would be [900, 1200]
 */
struct BN254OperatorSetInfo {
    bytes32 operatorInfoTreeRoot;
    uint256 numOperators;
    BN254.G1Point aggregatePubkey;
    uint256[] totalWeights;
}

/**
 * @notice updates the operatorSet with the operator table (i.e. stake weights) and its configuration
 * @param operatorSet the operatorSet to update the operator table for
 * @param referenceTimestamp the timestamp at which the operatorSetInfo (i.e. operator table) was sourced
 * @param operatorSetInfo the operator table for this operatorSet. This includes the `totalWeights`, `operatorInfoTreeRoot`, `aggregatePubkey`, and `numOperators`.
 *        See `IOperatorTableCalculator.BN254OperatorSetInfo` for more details
 * @param operatorSetConfig the configuration of the operatorSet, which includes the owner and max staleness period
 * @dev This function can only be called by the `OperatorTableUpdater` contract, which is itself permissionless to call
 * @dev The `referenceTimestamp` must correspond to a reference timestamp for a globalTableRoot stored in the `OperatorTableUpdater`
 *      In addition, it must be greater than the latest reference timestamp for the given operatorSet
 */
function updateOperatorTable(
    OperatorSet calldata operatorSet,
    uint32 referenceTimestamp,
    BN254OperatorSetInfo memory operatorSetInfo,
    OperatorSetConfig calldata operatorSetConfig
) external onlyTableUpdater;
```

Updates the operator table with new `operatorSetInfo` and `operatorSetConfig`. 

Note that updating operator tables for a `referenceTimestamp` that is less than the latest reference timestamp is not possible. Thus, operator tables cannot be updated retroactively. AVS developers should keep this in mind when building their off-chain signature aggregation logic. 

*Effects*:
* Stores `operatorSetInfo` at `_operatorSetInfos[operatorSetKey][referenceTimestamp]` containing:
  * `operatorInfoTreeRoot` - Merkle root of all operator information, each leaf is a `BN254OperatorInfo`
  * `numOperators` - Total number of operators
  * `aggregatePubkey` - Aggregate BN254 public key
  * `totalWeights` - Sum of all operator weights
* Updates `_latestReferenceTimestamps[operatorSetKey]` to `referenceTimestamp`
* Updates `_operatorSetOwners[operatorSetKey]` to `operatorSetConfig.owner`
* Updates `_maxStalenessPeriods[operatorSetKey]` to `operatorSetConfig.maxStalenessPeriod`
* Updates `_isReferenceTimestampSet[operatorSetKey][referenceTimestamp]` to `true`
* Emits a `TableUpdated` event

*Requirements*:
* Caller MUST be the `operatorTableUpdater`
* The `referenceTimestamp` MUST be greater than the latest reference timestamp

### Certificate Verification
The contract supports 3 verification patterns:
1. [Basic verification](#verifycertificate-1) - Returns the signed stakes for further processing
2. [Proportional verification](#verifycertificateproportion-1) - Verifies against percentage-based thresholds
3. [Nominal verification](#verifycertificatenominal-1) - Verifies against absolute stake thresholds

#### `verifyCertificate`

```solidity
/**
 * @notice A BN254 Certificate
 * @param referenceTimestamp a reference timestamp that corresponds to a timestamp at which an operator table was updated for the operatorSet.
 * @param messageHash the hash of a task that was completed by operators. The messageHash is defined by the AVS, see `TaskMailbox.sol` for an example implementation.
 *                    NOTE: This value is NOT the message that is signed by operators - see `calculateCertificateDigest` for the signable digest.
 * @param signature the G1 signature of the message. The signature is over the signable digest, which is calculated by `calculateCertificateDigest`
 * @param apk the G2 aggregate public key
 * @param nonSignerWitnesses an array of witnesses of non-signing operators
 * @dev Non-signer witnesses MUST be strictly increasing by `operatorIndex`
 * @dev The `referenceTimestamp` is used to key into the operatorSet's stake weights. It is NOT the timestamp at which the certificate was generated off-chain
 */
struct BN254Certificate {
    uint32 referenceTimestamp;
    bytes32 messageHash;
    BN254.G1Point signature;
    BN254.G2Point apk;
    BN254OperatorInfoWitness[] nonSignerWitnesses;
}

/**
 * @notice verifies a certificate against the operator table for a given reference timestamp
 * @param operatorSet the operatorSet that the certificate is for
 * @param cert a certificate
 * @return totalSignedStakeWeights total stake weight that signed the certificate for each stake type. Each
 *         index corresponds to a stake type in the `weights` array in the `BN254OperatorSetInfo` struct
 * @dev The `referenceTimestamp` in the `BN254Certificate` is used to determine the operator table to use for the verification
 * @dev AVS' are responsible for managing potential race conditions when certificates are signed close to operator table updates. Some examples include:
 *      a. An in-flight certificate for a past reference timestamp and an operator table update for a newer reference timestamp. The AVS should decide whether it
 *         wants to only confirm tasks against the *latest* certificate
 *      b. An in-flight certificate against a stake table with a majority-stake operator that has been slashed or removed from the operatorSet
 * @dev Reverts if the certificate's `referenceTimestamp` is too stale with respect to the `maxStalenessPeriod` of the operatorSet
 * @dev This function is *non-view* because it caches non-signing operator info upon a successful certificate verification. See `getNonsignerOperatorInfo` for more details
 */
function verifyCertificate(
    OperatorSet memory operatorSet,
    BN254Certificate memory cert
) external returns (uint256[] memory totalSignedStakeWeights);
```

Verifies a BN254 certificate by checking the aggregated signature against the operator set's aggregate public key. *Note: This function is non-view because the non-signers are cached in storage.*. See [cachingMechanism](#caching-mechanism) for more information. **The `referenceTimestamp` of the certificate is the time at which the operator table for a given certificate was sourced. It is not the timestamp at which the certificate was created.**

*Process*:
* Validates the certificate timestamp against staleness requirements
* Initializes signed stakes with total stakes from the operator set
* Processes non-signer witnesses:
  * Verifies merkle proofs for non-signers (or uses cached data)
  * Subtracts non-signer stakes from total signed stakes
  * Aggregates non-signer public keys
* Calculates signer aggregate public key by subtracting non-signers from total
* Verifies the BLS signature using pairing checks

*Requirements*:
* The certificate MUST NOT be stale (based on `maxStalenessPeriod`)
* The root at the `referenceTimestamp` MUST exist
* The root at the `referenceTimestamp` MUST not be disabled
* The operator set info MUST exist for the `referenceTimestamp`
* The `operatorIndex` must be valid for the non signer
* The non-signer witnesses MUST be strictly increasing by `operatorIndex`
* All merkle proofs for nonsigners MUST be valid
* The BLS signature MUST verify correctly

#### `verifyCertificateProportion`

```solidity
/**
 * @notice verifies a certificate and makes sure that the signed stakes meet
 * provided portions of the total stake weight on the AVS
 * @param operatorSet the operatorSet that the certificate is for
 * @param cert the certificate
 * @param totalStakeProportionThresholds the proportion, in BPS, of total stake weight that
 *        the signed stake of the certificate should meet. Each index corresponds to
 *        a stake type in the `totalWeights` array in the `BN254OperatorSetInfo`
 * @return Whether or not certificate is valid and meets proportion thresholds
 * @dev The `referenceTimestamp` in the `BN254Certificate` is used to determine the operator table to use for the verification
 * @dev AVS' are responsible for managing potential race conditions when certificates are signed close to operator table updates. Some examples include:
 *      a. An in-flight certificate for a past reference timestamp and an operator table update for a newer reference timestamp. The AVS should decide whether it
 *         wants to only confirm tasks against the *latest* certificate
 *      b. An in-flight certificate against a stake table with a majority-stake operator that has been slashed or removed from the operatorSet
 * @dev Reverts if the certificate's `referenceTimestamp` is too stale with respect to the `maxStalenessPeriod` of the operatorSet
 * @dev This function is *non-view* because it caches non-signing operator info upon a successful certificate verification. See `getNonsignerOperatorInfo` for more details
 */
function verifyCertificateProportion(
    OperatorSet memory operatorSet,
    BN254Certificate memory cert,
    uint16[] memory totalStakeProportionThresholds
) external returns (bool);
```

Verifies that a certificate meets specified proportion thresholds as a percentage of total stake for each stake type.

*Process*:
* Performs the same verification as `verifyCertificate` to get signed stakes
* Retrieves the total stakes from the stored operator set info
* Compares signed stakes against proportion thresholds
* Returns true only if all thresholds are met

*Requirements*:
* All requirements from `verifyCertificate`
* `signedStakes.length` MUST equal `totalStakeProportionThresholds.length`
* For each stake type: `signedStakes[i] >= (totalStakes[i] * totalStakeProportionThresholds[i]) / 10000`

*Note*: This function has state-changing effects due to non-signer caching

#### `verifyCertificateNominal`

```solidity
/**
 * @notice verifies a certificate and makes sure that the signed stakes meet
 * provided nominal stake thresholds
 * @param operatorSet the operatorSet that the certificate is for
 * @param cert the certificate
 * @param totalStakeNominalThresholds the nominal amount of stake that
 *        the signed stake of the certificate should meet. Each index corresponds to
 *        a stake type in the `totalWeights` array in the `BN254OperatorSetInfo`
 * @return Whether or not certificate is valid and meets nominal thresholds
 * @dev The `referenceTimestamp` in the `BN254Certificate` is used to determine the operator table to use for the verification
 * @dev AVS' are responsible for managing potential race conditions when certificates are signed close to operator table updates. Some examples include:
 *      a. An in-flight certificate for a past reference timestamp and an operator table update for a newer reference timestamp. The AVS should decide whether it
 *         wants to only confirm tasks against the *latest* certificate
 *      b. An in-flight certificate against a stake table with a majority-stake operator that has been slashed or removed from the operatorSet
 * @dev Reverts if the certificate's `referenceTimestamp` is too stale with respect to the `maxStalenessPeriod` of the operatorSet
 * @dev This function is *non-view* because it caches non-signing operator info upon a successful certificate verification. See `getNonsignerOperatorInfo` for more details
 */
function verifyCertificateNominal(
    OperatorSet memory operatorSet,
    BN254Certificate memory cert,
    uint256[] memory totalStakeNominalThresholds
) external returns (bool);
```

Verifies that a certificate meets specified nominal (absolute) stake thresholds for each stake type.

*Process*:
* Performs the same verification as `verifyCertificate` to get signed stakes
* Compares signed stakes against absolute thresholds
* Returns true only if all thresholds are met

*Requirements*:
* All requirements from `verifyCertificate`
* `signedStakes.length` MUST equal `totalStakeNominalThresholds.length`
* For each stake type: `signedStakes[i] >= totalStakeNominalThresholds[i]`

*Note*: This function has state-changing effects due to non-signer caching

### Caching Mechanism

```solidity
/**
 * @notice A witness for an operator, used to identify the non-signers for a given certificate
 * @param operatorIndex the index of the nonsigner in the `BN254OperatorInfo` tree
 * @param operatorInfoProofs merkle proof of the nonsigner at the index.
 *        Leave empty if the non-signing operator is already stored from a previous verification at the same `referenceTimestamp`
 * @param operatorInfo the `BN254OperatorInfo` for the operator.
 *        Leave empty if the non-signing operator is already stored from a previous verification at the same `referenceTimestamp`
 * @dev Non-signing operators are stored in the `BN254CertificateVerifier` upon the first successful certificate verification that includes a merkle proof for the non-signing operator.
 *      This is done to avoid the need to provide proofs for non-signing operators for each certificate with the same `referenceTimestamp`
 */
struct BN254OperatorInfoWitness {
    uint32 operatorIndex;
    bytes operatorInfoProof;
    BN254OperatorInfo operatorInfo;
}
```

The `BN254CertificateVerifier` requires merkle proofs of nonSigning operators. When an operator is proven against an `operatorInfoTreeRoot` for the first time, it will be stored in the `operatorInfos` mapping so it doesn't need to be proven for future `referenceTimestamps`. Caching the non-signer decreases the verification costs for certificates at a given reference timestamp, since merkle proofs for non-signing operators do not have to be re-supplied. Once cached, future `certificates` do not need to pass in a proof for the `nonSigner`. 

```mermaid
flowchart TB
    R((OperatorInfoTreeRoot))
    R --> N0((Internal Node 0-1))
    R --> N1((Internal Node 2-3))
    N0 --> L0[[Leaf 0<br/>BN254OperatorInfo #0]]
    N0 --> L1[[Leaf 1<br/>BN254OperatorInfo #1]]
    N1 --> L2[[Leaf 2<br/>BN254OperatorInfo #2]]
    N1 --> L3[[Leaf 3<br/>BN254OperatorInfo #3]]
```

---

## Appendix

### Staleness Period

For the below examples, let's assume that the operator table is updated on Day 1

#### Eg. 1: Normal Functioning
Assume the the staleness period is 10 days and the `referenceTimestamp` of a certificate is Day 1. 

1. Day 1: Table Updated
2. Day 9: Certificate passes
3. Day 10: Certificate passes
4. Day 11: Certificate verification *fails*

#### Eg. 2: Low staleness period
The operator table is updated every 10 days. The staleness period is 5 days. The `referenceTimestamp` of a certificate is Day 1. 

1. Day 1: Table updated
2. Day 2: Certificate passes
3. Day 6: Certificate verification *fails*
4. Day 7: A new certificate is generated. However, this will fail as the `referenceTimestamp` would still be Day 1 given that was the latest table update

Note that we cannot re-generate a certificate on Day 7. This is why we prevent the `stalenessPeriod` from being less than 10 days in the `CrossChainRegistry`.

## Consumption Patterns

### Introspection

Both the `BN254CertificateVerifier` and `ECDSACertificateVerifier` share the following view functions

```solidity
/**
 * @notice The latest reference timestamp of the operator table for a given operatorSet. This value is
 *         updated each time an operator table is updated
 * @param operatorSet The operatorSet to get the latest reference timestamp of
 * @return The latest reference timestamp, 0 if the operatorSet has never been updated
 * @dev The latest reference timestamp is set when the operator table is updated
 * @dev The reference timestamp denotes the timestamp at which the operator table was calculated by the multichain protocol
 */
function latestReferenceTimestamp(
    OperatorSet memory operatorSet
) external view returns (uint32);

/**
 * @notice Whether the operator table has been updated for a given reference timestamp
 * @param operatorSet The operatorSet to check
 * @param referenceTimestamp The reference timestamp to check
 * @return Whether the reference timestamp has been updated
 * @dev The reference timestamp is set when the operator table is updated
 */
function isReferenceTimestampSet(
    OperatorSet memory operatorSet,
    uint32 referenceTimestamp
) external view returns (bool);

/**
 * @notice Get the total stake weights for all operators at a given reference timestamp
 * @param operatorSet The operator set to calculate stakes for
 * @param referenceTimestamp The reference timestamp
 * @return The sum of stake weights for each stake type, empty if the operatorSet has not been updated for the given reference timestamp
 * @dev The stake weights are defined in the AVS's `OperatorTableCalculator` and transported by the multichain protocol. An example
 *      of this can be [slashable_stake, delegated_stake, strategy_i_stake, ...], where each stake type is an element in the array
 * @dev For ECDSA, this function *reverts* if the reference timestamp is not set or the number of operators is 0
 * @dev For BN254, this function returns empty array if the reference timestamp is not set or the number of operators is 0
 */
function getTotalStakeWeights(
    OperatorSet memory operatorSet,
    uint32 referenceTimestamp
) external view returns (uint256[] memory);

/**
 * @notice Get the number of operators at a given reference timestamp
 * @param operatorSet The operator set to get the number of operators for
 * @param referenceTimestamp The reference timestamp
 * @return The number of operators
 * @dev Returns 0 if the reference timestamp is not set or the number of operators is 0
 */
function getOperatorCount(
    OperatorSet memory operatorSet,
    uint32 referenceTimestamp
) external view returns (uint256);
```

The `getTotalStakeWeights` function should be read by consumers before passing in expected proportional or nominal amounts into the `verifyCertificateProportion` or `verifyCertificateNominal` respectively. 

The `latestReferenceTimestamp` should be called by AVSs offchain aggregator to pass in a `referenceTimestasmp` into the `Certificate`

To retrieve the operators and their weights from an operatorSet, the AVS offchain aggregator can call the following function on the operatorSet's `OperatorTableCalculator`, which can be retrieved from the `CrossChainRegistry`.

```solidity
/**
 * @notice Get the operator stake weights for a given operatorSet
 * @param operatorSet The operatorSet to get the stake weights for
 * @return operators The addresses of the operators in the operatorSet
 * @return weights The stake weights for each operator in the operatorSet, this is a 2D array where the first index is the operator
 * and the second index is the stake weight
 */
function getOperatorSetWeights(
    OperatorSet calldata operatorSet
) external view returns (address[] memory operators, uint256[][] memory weights);
```

### End to End Verification

The below diagram describes an end to end verification process for verifying a certificate with nominal thresholds. Solid lines are on-chain write interactions. Dashed lines are read operations, either on- or off- chain. 

```mermaid
sequenceDiagram
    participant Transporter as EigenLabs Transporter
    participant OUT as OperatorTableUpdater
    participant OTC as OperatorTableCalculator
    participant CV as CertificateVerifier
    participant Aggregator as AVS Aggregator
    participant Registry as CrossChainRegistry
    participant Consumer as AVS Consumer

    Transporter->>OUT: 1. updateOperatorTable()
    OUT->>CV: updateOperatorTable()

    Aggregator-->>CV: 2. Get latestReferenceTimestamp()
    Aggregator-->>Registry: 3. getOperatorTableCalculator(operatorSet)
    Aggregator-->>OTC: 4. getOperatorSetWeights() at referenceTimestamp

    Aggregator-->>Aggregator: 5. create task & collect operator signatures
    Aggregator-->>Aggregator: 6. generate certificate with latestReferenceTimestamp & signatures

    Consumer-->>Aggregator: 7. retrieve certificate
    Consumer-->>CV: 8. getTotalStakeWeights()
    Consumer-->>Consumer: 9. adjust nominal verification thresholds
    Consumer->>CV: 10. verifyCertificateNominal()
```
````

## File: docs/multichain/destination/OperatorTableUpdater.md
````markdown
## OperatorTableUpdater

| File | Type | Proxy |
| -------- | -------- |  -------- | 
| [`OperatorTableUpdater.sol`](../../../src/contracts/multichain/OperatorTableUpdater.sol) | Singleton | Transparent Proxy |

Libraries and Mixins:

| File | Notes |
| -------- | -------- |
| [`OwnableUpgradeable.sol`](https://github.com/OpenZeppelin/openzeppelin-contracts-upgradeable/blob/v4.9.0/contracts/access/OwnableUpgradeable.sol) | Access control |
| [`SemVerMixin.sol`](../../../src/contracts/mixins/SemVerMixin.sol) | Versioning |
| [`Merkle.sol`](../../../src/contracts/libraries/Merkle.sol) | Merkle proof verification |

## Overview

The `OperatorTableUpdater` is responsible for updating the `GlobalTableRoot` and updating operator tables from merkle proofs against the `GlobalTableRoot`. The contract is deployed on every destination chain. The contract maintains a set of valid global table roots that are confirmed by a designated generator, and allows updating individual operator tables by providing merkle proofs against these roots.

The contract supports both BN254 and ECDSA operator tables and routes updates to the appropriate certificate verifier based on the curve type.

## Parameterization
Upon initialization, the `generator` is updated. The `generator` is represented in storage as an operatorSet. The `generator` should be considered a ghost-operatorSet` since it does not exist in the core protocol, does not have stake backing it, and is not transported to other chains via the multichain protocol. It can only be set upon initialization and a new generator can be set by [privileged role](#updategenerator). This entity is the same across all destination chains. 

The following values are set upon initialization: 

* `generator` is an EigenLabs-run entity that signs off on `globalTableRoots`. The operatorSet is of size 1. The `generator` is always expected to use BN254 signing keys, hence the use of the BN254OperatorSetInfo when setting the generator.
* `globalRootConfirmationThreshold`: 10000. The threshold in basis points required for global root confirmation. Since the operatorSet is of size 1 a single signature is needed.
* `generatorInfo`: The key material needed to verify certificates of the `generator`
* `operatorSetConfig`: A configuration for the `generator` 
    * `maxStalenessPeriod`: 0 (`GENERATOR_MAX_STALENESS_PERIOD`). Set to zero to allow confirmation of generator certificates regardless of `referenceTimestamp`. See [`CertificateVerifier`](./CertificateVerifier.md#overview) for speccifics
    * `owner`: Unused parameter for `Generator`. Set to the address of the `OperatorTableUpdater`
* The `latestReferenceTimestamp` for the `Generator` is 1 (`GENERATOR_REFERENCE_TIMESTAMP`). This value is stored in the `BN254CertificateVerifier`
* The `globalTableRoot` for the `Generator` is `GENERATOR_GLOBAL_TABLE_ROOT`
* The `latestReferenceTimestamp` for the `OperatorTableUpdater` is set to `block.timestamp`. Doing so prevents past certificates for `globalTableRoots` to be used on a new destination chain deployment of the `OperatorTableUpdater`

Operator tables are updated daily on testnet and weekly on mainnet. 
---

## Global Root Confirmation

Global table roots must be confirmed by the `generator` before operator tables can be updated against them.

### `confirmGlobalTableRoot`

```solidity
/**
 * @notice Sets the global table root
 * @param globalTableRootCert certificate of the global table root, signed by the `Generator`
 * @param globalTableRoot merkle root of all operatorSet tables
 * @param referenceTimestamp block timestamp at which the global table root was calculated
 * @param referenceBlockNumber block number, corresponding to the `referenceTimestamp` of the global table root
 * @dev Any entity can submit with a valid certificate signed off by the `Generator`
 * @dev The `msgHash` in the `globalOperatorTableRootCert` is the hash of the `globalTableRoot`, `referenceTimestamp`, and `referenceBlockNumber`
 * @dev The `referenceTimestamp` nested in the `globalTableRootCert` should be `getGeneratorReferenceTimestamp`, whereas
 *      the `referenceTimestamp` passed directly in the calldata is the block timestamp at which the global table root was calculated
 * @dev Reverts for:
 *      - GlobalTableRootInFuture: referenceTimestamp is in the future
 *      - GlobalTableRootStale: referenceTimestamp is not greater than latest reference timestamp
 *      - InvalidMessageHash: certificate messageHash does not match expected EIP-712 hash
 *      - CertificateInvalid: certificate verification failed against confirmation threshold
 * @dev Emits the following events:
 *      - NewGlobalTableRoot: When global table root is successfully confirmed
 */
function confirmGlobalTableRoot(
    BN254Certificate calldata globalTableRootCert,
    bytes32 globalTableRoot,
    uint32 referenceTimestamp,
    uint32 referenceBlockNumber
) external;
```

Confirms a new global table root by verifying a BN254 certificate signed by the `generator`. See [`BN254CertificateVerifier`](./CertificateVerifier.md#bn254certificateverifier) for certificate verification. Roots are append only and cannot be overridden, only [disabled](#disableroot). 

*Effects*:
* Updates `_latestReferenceTimestamp` to the new `referenceTimestamp`
* Sets `_referenceBlockNumbers[referenceTimestamp]` to `referenceBlockNumber`
* Sets `_referenceTimestamps[referenceBlockNumber]` to `referenceTimestamp`
* Sets `_globalTableRoots[referenceTimestamp]` to `globalTableRoot`
* Sets `_isRootValid[globalTableRoot]` to `true`
* Emits a `NewGlobalTableRoot` event

*Requirements*:
* The contract MUST NOT be paused for global root updates
* The `referenceTimestamp` MUST NOT be in the future
* The `referenceTimestamp` MUST be greater than `_latestReferenceTimestamp`
* The certificate's `messageHash` MUST match the expected EIP-712 hash
* The certificate MUST be valid according to the `globalRootConfirmationThreshold`

---

## Operator Table Updates

Once a global root is confirmed, individual operator tables can be updated by providing merkle proofs against the root. 

### `updateOperatorTable`

```solidity
/**
 * @notice Updates an operator table
 * @param referenceTimestamp the reference timestamp of the globalTableRoot
 * @param globalTableRoot the new globalTableRoot
 * @param operatorSetIndex the index of the given operatorSet being updated
 * @param proof the proof of the leaf at index against the globalTableRoot
 * @param operatorTableBytes the bytes of the operator table
 * @dev This function calls `updateOperatorTable` on the `ECDSACertificateVerifier` or `BN254CertificateVerifier`
 *      depending on the `KeyType` of the operatorSet, which is encoded in the `operatorTableBytes`
 * @dev Function silently returns if the `referenceTimestamp` has already been updated for the `operatorSet`
 * @dev Reverts for:
 *      - InvalidRoot: globalTableRoot is disabled or invalid
 *      - InvalidOperatorSet: operatorSet is the generator (not allowed for regular updates)
 *      - TableUpdateForPastTimestamp: referenceTimestamp is not greater than latest for the operatorSet
 *      - InvalidGlobalTableRoot: provided globalTableRoot does not match stored root for referenceTimestamp
 *      - InvalidOperatorSetProof: merkle proof verification failed
 *      - InvalidCurveType: unsupported curve type in operatorTableBytes
 */
function updateOperatorTable(
    uint32 referenceTimestamp,
    bytes32 globalTableRoot,
    uint32 operatorSetIndex,
    bytes calldata proof,
    bytes calldata operatorTableBytes
) external;
```

Updates an operator table by verifying its inclusion in a confirmed global table root via merkle proof. The function decodes the operator table data and routes the update to the appropriate certificate verifier based on the curve type.

*Effects*:
* For BN254 operator sets:
  * Calls `bn254CertificateVerifier.updateOperatorTable` with the decoded operator info
* For ECDSA operator sets:
  * Calls `ecdsaCertificateVerifier.updateOperatorTable` with the decoded operator info

*Requirements*:
* The contract MUST NOT be paused for operator table updates
* The `globalTableRoot` MUST be valid (not disabled)
* The `operatorSet` MUST NOT be the `generator` (generator updates are handled separately)
* The `referenceTimestamp` MUST be greater than the latest timestamp for the operator set
* The merkle proof MUST verify the operator table's inclusion in the global root
* The `globalTableRoot` at `referenceTimestamp` MUST match the provided root
* Meets all requirements in [`ecdsaCertificateVerifier.updateOperatorTable`](./CertificateVerifier.md#updateoperatortable) or [`bn254CertificateVerifier.updateOperatorTable`](./CertificateVerifier.md#updateoperatortable-1)

---

## System Configuration

The `owner` can configure the `generator` and confirmation parameters.

### `updateGenerator`

```solidity
/**
 * @notice Updates the `Generator` to a new operatorSet
 * @param generator The operatorSet which certifies against global roots
 * @param generatorInfo The operatorSetInfo for the generator
 * @dev We have a separate function for updating this operatorSet since it's not transported and updated
 *      in the same way as the other operatorSets
 * @dev Only callable by the owner of the contract
 * @dev Uses GENERATOR_GLOBAL_TABLE_ROOT constant to break circular dependency for certificate verification
 * @dev We ensure that there are no collisions with other reference timestamps because we expect the generator to have an initial reference timestamp of 0
 * @dev The `_latestReferenceTimestamp` is not updated since this root is ONLY used for the `Generator`
 * @dev The `_referenceBlockNumber` and `_referenceTimestamps` mappings are not updated since they are only used for introspection for official operatorSets
 * @dev Reverts for:
 *      - "Ownable: caller is not the owner": caller is not the owner
 *      - InvalidGenerator: generator has a non-zero reference timestamp
 * @dev Emits the following events:
 *      - GeneratorUpdated: When generator is successfully updated
 */
function updateGenerator(
    OperatorSet calldata generator,
    BN254OperatorSetInfo calldata GeneratorInfo,
    OperatorSetConfig calldata GeneratorConfig
) external;
```

Updates the operator set responsible for confirming global table roots. This function can only be called for operatorSets that have an uninitialized `latestReferenceTimestamp` in the `BN254CertificateVerifier`, ensuring that only *new* operatorSets can be the generator. Once set, the `latestReferenceTimestamp` for the generator is always 1 (`GENERATOR_REFERENCE_TIMESTAMP`).

*Effects*:
* Updates `_generator` to the new `operatorSet`
* Calls [`bn254CertificateVerifier.updateOperatorTable`](./CertificateVerifier.md#updateoperatortable-1)
* Emits a `GeneratorUpdated` event
* Sets the `GENERATOR_GLOBAL_TABLE_ROOT` to be valid

*Requirements*:
* Caller MUST be the `owner`
* The `latestReferenceTimestamp` for the `generator` MUST be zero
* Meet all requirements in [`bn254CertificateVerifier.updateOperatorTable`](../destination/CertificateVerifier.md#updateoperatortable-1)

### `setGlobalRootConfirmationThreshold`

```solidity
/**
 * @notice The threshold, in bps, for a global root to be signed off on and updated
 * @dev Only callable by the owner of the contract
 * @dev Reverts for:
 *      - "Ownable: caller is not the owner": caller is not the owner
 *      - InvalidConfirmationThreshold: bps is greater than MAX_BPS (10000)
 * @dev Emits the following events:
 *      - GlobalRootConfirmationThresholdUpdated: When threshold is successfully updated
 */
function setGlobalRootConfirmationThreshold(
    uint16 bps
) external;
```

Sets the stake proportion threshold required for confirming global table roots.

*Effects*:
* Updates `globalRootConfirmationThreshold` to `bps`
* Emits a `GlobalRootConfirmationThresholdUpdated` event

*Requirements*:
* Caller MUST be the `owner`
* `bps` MUST NOT exceed `MAX_BPS` (10000)

### `disableRoot`

```solidity
/**
 * @notice Disables a global table root
 * @param globalTableRoot the global table root to disable
 * @dev Only callable by the pauser
 * @dev Cannot disable the GENERATOR_GLOBAL_TABLE_ROOT
 * @dev Reverts for:
 *      - OnlyPauser: caller is not the pauser
 *      - InvalidRoot: globalTableRoot is already disabled or does not exist
 *      - CannotDisableGeneratorRoot: attempting to disable the generator's global table root
 * @dev Emits the following events:
 *      - GlobalRootDisabled: When global table root is successfully disabled
 */
function disableRoot(
    bytes32 globalTableRoot
) external;
```

Disables a global table root, preventing further operator table updates against it. This function also prevents the `CertificateVerifier` from verifying certificates. The function is intended to prevent a malicious or invalid root from being used by downstream consumers. Once a root is disabled, it cannot be re-enabled. 

*Effects*:
* Sets `_isRootValid[globalTableRoot]` to `false`
* Emits a `GlobalRootDisabled` event

*Requirements*:
* Caller MUST be the `pauser`
* The `globalTableRoot` MUST exist and be currently valid
* The `globalTableRoot` MUST NOT be the `GENERATOR_GLOBAL_TABLE_ROOT`
````

## File: docs/multichain/source/CrossChainRegistry.md
````markdown
## CrossChainRegistry

| File | Type | Proxy |
| -------- | -------- | -------- |
| [`CrossChainRegistry.sol`](../../src/contracts/multichain/CrossChainRegistry.sol) | Singleton | Transparent Proxy |

Libraries and Mixins:

| File | Notes |
| -------- | -------- |
| [`PermissionControllerMixin.sol`](../../../src/contracts/mixins/PermissionControllerMixin.sol) | account delegation |
| [`SemverMixin.sol`](../../../src/contracts/mixins/SemVerMixin.sol) | versioning |
| [`OperatorSetLib.sol`](../../src/contracts/libraries/OperatorSetLib.sol) | encode/decode operator sets |

## Overview

The `CrossChainRegistry` manages the registration/deregistration of operatorSets to the multichain protocol. The contract also exposes read-only functions to calculate an operator table, which is used offchain by the `Generator` to generate a `GlobalTableRoot` and `Transporter` to transport the operator table. See [ELIP-007](https://github.com/eigenfoundation/ELIPs/blob/main/ELIPs/ELIP-007.md) for more information.

*Note: Operator tables are transported to all destination chains, regardless if the operatorSet is consumed on a destination chain.*

```solidity
/**
 * @notice A per-operatorSet configuration struct that is transported from the CrossChainRegistry on L1.
 * @param owner the permissioned owner of the OperatorSet on L2 that can be used by downstream contracts to authorize actions
 * @param maxStalenessPeriod the maximum staleness period of the operatorSet
 *
 * @dev A `maxStalenessPeriod` of 0 completely removes staleness checks, allowing certificates to be validated regardless of their timestamp
 * @dev A nonzero `maxStalenessPeriod` has a floor of the table update cadence, which is the frequency at which operator tables are expected 
 *      to be updated. The table update cadence is set by the owner of the `CrossChainRegistry`
 */
struct OperatorSetConfig {
    address owner;
    uint32 maxStalenessPeriod;
}
```  

## Parameterization
* `SupportedChains` (via `getSupportedChains`) are `Mainnet` and `Base`
    * These are chains to which tables can be transported to
    * On Testnet, the supported chains are `Sepolia` and `Base-Sepolia`
* `TableUpdateCadence` is the frequency at which tables are *expected* to be transported to destination chains. 1 day on testnet. Weekly on mainnet
    * When setting an operator set config, the `maxStalenessPeriod` must be either:
        * 0 (special case allowing certificates to always be valid)
        * Greater than or equal to the table update cadence
    * The table update cadence itself cannot be 0

---

## Create/Remove Generation Reservation
A generation reservation registers the operatorSet to be included in the `GlobalTableRoot` and transported to an avs-defined set of destination chains. AVSs do not have to pay for reservations.  

### `createGenerationReservation`

```solidity
/**
 * @notice Creates a generation reservation, which transports the operator table of an operatorSet to all whitelisted chains
 * @param operatorSet the operatorSet to make a reservation for
 * @param operatorTableCalculator the address of the operatorTableCalculator. This contract is deployed (or a template is used) by the AVS
 *                                to calculate the stake weights for the operatorSet. See `IOperatorTableCalculator` for more details
 * @param config the config to set for the operatorSet, which includes the owner of the operatorSet and the max staleness period
 * @dev Tables are transported at a cadence of `tableUpdateCadence` seconds. The `maxStalenessPeriod` is used to determine the maximum
 * @dev msg.sender must be an authorized caller for operatorSet.avs
 * @dev Once a generation reservation is created, the operator table will be transported to all chains that are whitelisted
 * @dev It is expected that the AVS has:
 *      - Deployed or is using a generalizable `OperatorTableCalculator` to calculate its operator's stake weights
 *      - Set the `KeyType` for the operatorSet in the `KeyRegistrar`, even if the AVS is not using the `KeyRegistrar` for operator key management
 *           - Valid Key Types are given in the `IKeyRegistrarTypes.CurveType` enum. The `KeyType` must not be `NONE`
 *      - Created an operatorSet in the `AllocationManager`
 * @dev Reverts for:
 *      - CurrentlyPaused: Generation reservations are paused
 *      - InvalidPermissions: Caller is not an authorized caller for operatorSet.avs
 *      - InvalidOperatorSet: The operatorSet does not exist in the AllocationManager
 *      - KeyTypeNotSet: The key type is not set for the operatorSet in the KeyRegistrar
 *      - GenerationReservationAlreadyExists: A generation reservation already exists for the operatorSet
 *      - InvalidStalenessPeriod: The maxStalenessPeriod is invalid
 * @dev Emits the following events:
 *      - GenerationReservationCreated: When the generation reservation is successfully created
 *      - OperatorTableCalculatorSet: When the operator table calculator is set for the operatorSet
 *      - OperatorSetConfigSet: When the operator set config is set for the operatorSet
 */
function createGenerationReservation(
    OperatorSet calldata operatorSet,
    IOperatorTableCalculator operatorTableCalculator,
    OperatorSetConfig calldata config
) external;
```

Creates a generation reservation for a given `operatorSet`, which enables the operatorSet to be included in the `GlobalTableRoot` generation and transported to all destination chains. This function sets up the complete configuration for cross-chain operations in a single transaction.

Note that the `operatorTableCalculator` must be deployed by the AVS onto the source chain prior to calling this function.

*Effects*:
* Adds the `operatorSet` to `_activeGenerationReservations`
* Sets the `operatorTableCalculator` for the `operatorSet`
* Sets the `OperatorSetConfig` containing the `owner` and `maxStalenessPeriod`
* Emits a `GenerationReservationCreated` event
* Emits an `OperatorTableCalculatorSet` event
* Emits an `OperatorSetConfigSet` event

*Requirements*:
* The global paused status MUST NOT be set: `PAUSED_GENERATION_RESERVATIONS`
* Caller MUST be an authorized caller for `operatorSet.avs`
* The `operatorSet` MUST exist in the `AllocationManager`
* The `KeyType` of the `operatorSet` MUST be set in the `KeyRegistrar`
* A generation reservation MUST NOT already exist for the `operatorSet`
* The `maxStalenessPeriod` MUST be either:
  * 0 (special case allowing certificates to always be valid)
  * Greater than or equal to the table update cadence
  
### `removeGenerationReservation`

```solidity
/**
 * @notice Removes a generation reservation for a given operatorSet
 * @param operatorSet the operatorSet to remove
 * @dev msg.sender must be an authorized caller for operatorSet.avs
 * @dev Reverts for:
 *      - CurrentlyPaused: Generation reservations are paused
 *      - InvalidPermissions: Caller is not an authorized caller for operatorSet.avs
 *      - InvalidOperatorSet: The operatorSet does not exist in the AllocationManager
 *      - GenerationReservationDoesNotExist: A generation reservation does not exist for the operatorSet
 * @dev Emits the following events:
 *      - OperatorTableCalculatorRemoved: When the operator table calculator is removed
 *      - OperatorSetConfigRemoved: When the operator set config is removed
 *      - GenerationReservationRemoved: When the generation reservation is removed
 */
function removeGenerationReservation(
    OperatorSet calldata operatorSet
) external;
```

Removes a generation reservation for a given `operatorSet` and clears all associated storage including the operator table calculator, operator set config, and transport destinations.

*Effects*:
* Removes the `operatorTableCalculator` mapping for the `operatorSet`
* Removes the `operatorSetConfig` mapping for the `operatorSet`
* Removes the `operatorSet` from `_activeGenerationReservations`
* Emits an `OperatorTableCalculatorRemoved` event
* Emits an `OperatorSetConfigRemoved` event
* Emits a `GenerationReservationRemoved` event

*Requirements*:
* The global paused status MUST NOT be set: `PAUSED_GENERATION_RESERVATIONS`
* Caller MUST be an authorized caller for `operatorSet.avs`
* The `operatorSet` MUST exist in the `AllocationManager`
* A generation reservation MUST exist for the `operatorSet`

---

## Update Configuration
For a given operatorSet, an AVS can set the [`OperatorTableCalculator`](https://github.com/Layr-Labs/eigenlayer-middleware/blob/dev/docs/middlewareV2/OperatorTableCalculator.md) and `OperatorSetConfig`, which is an `owner` and `maxStalenessPeriod` transported to each chain. The [`CertificateVerifier`](../destination/CertificateVerifier.md) has more information on the `maxStalenessPeriod`. 

### `setOperatorTableCalculator`

```solidity
/**
 * @notice Sets the operatorTableCalculator for the operatorSet
 * @param operatorSet the operatorSet whose operatorTableCalculator is desired to be set
 * @param operatorTableCalculator the contract to call to calculate the operator table
 * @dev msg.sender must be an authorized caller for operatorSet.avs
 * @dev operatorSet must have an active reservation
 * @dev Reverts for:
 *      - CurrentlyPaused: Setting the operatorTableCalculator is paused
 *      - InvalidPermissions: Caller is not an authorized caller for operatorSet.avs
 *      - InvalidOperatorSet: The operatorSet does not exist in the AllocationManager
 *      - GenerationReservationDoesNotExist: A generation reservation does not exist for the operatorSet
 * @dev Emits the following events:
 *      - OperatorTableCalculatorSet: When the operator table calculator is successfully set
 */
function setOperatorTableCalculator(
    OperatorSet calldata operatorSet,
    IOperatorTableCalculator operatorTableCalculator
) external;
```

Updates the `operatorTableCalculator` contract for a given `operatorSet`. The `operatorTableCalculator` is deployed by the AVS and is responsible for computing the operator table bytes that will be included in cross-chain transports.

Note that, if the `operatorTableCalculator` fails to comply with the expected interface, the offchain transport system will simply ignore the active generation reservation for this operator set.

For more information on the `operatorTableCalculator`, please see full documentation in the [middleware repository](https://github.com/Layr-Labs/eigenlayer-middleware/tree/dev/docs).

*Effects*:
* Updates the `_operatorTableCalculators` mapping for the `operatorSet`
* Emits an `OperatorTableCalculatorSet` event

*Requirements*:
* The global paused status MUST NOT be set: `PAUSED_OPERATOR_TABLE_CALCULATOR`
* Caller MUST be an authorized caller for `operatorSet.avs`
* The `operatorSet` MUST exist in the `AllocationManager`
* A generation reservation MUST exist for the `operatorSet`

### `setOperatorSetConfig` 

```solidity
/**
 * @notice Sets the operatorSetConfig for a given operatorSet
 * @param operatorSet the operatorSet to set the operatorSetConfig for
 * @param config the config to set, which includes the owner of the operatorSet and the max staleness period
 * @dev msg.sender must be an authorized caller for operatorSet.avs
 * @dev operatorSet must have an active generation reservation
 * @dev The max staleness period is NOT checkpointed and is applied globally regardless of the reference timestamp of a certificate
 * @dev Reverts for:
 *      - CurrentlyPaused: Setting the operatorSetConfig is paused
 *      - InvalidPermissions: Caller is not an authorized caller for operatorSet.avs
 *      - InvalidOperatorSet: The operatorSet does not exist in the AllocationManager
 *      - GenerationReservationDoesNotExist: A generation reservation does not exist for the operatorSet
 *      - InvalidStalenessPeriod: The maxStalenessPeriod is invalid
 * @dev Emits the following events:
 *      - OperatorSetConfigSet: When the operator set config is successfully set
 */
function setOperatorSetConfig(OperatorSet calldata operatorSet, OperatorSetConfig calldata config) external;
```

Updates the operator set configuration for a given `operatorSet`. The config contains an `owner` address and `maxStalenessPeriod` that will be transported to destination chains for use in certificate verification.

*Effects*:
* Updates the `_operatorSetConfigs` mapping with the new `config` containing:
  * `owner`: The permissioned owner of the OperatorSet on L2
  * `maxStalenessPeriod`: The maximum staleness period for the operatorSet
* Emits an `OperatorSetConfigSet` event

*Requirements*:
* The global paused status MUST NOT be set: `PAUSED_OPERATOR_SET_CONFIG`
* Caller MUST be an authorized caller for `operatorSet.avs`
* The `operatorSet` MUST exist in the `AllocationManager`
* A generation reservation MUST exist for the `operatorSet`
* The `maxStalenessPeriod` MUST be either:
  * 0 (special case allowing certificates to always be valid)
  * Greater than or equal to the table update cadence

---

## System Configuration
The `owner` of the `CrossChainRegistry` can update the whitelisted chain IDs. If a chainID is not whitelisted, it cannot be transported to. 

### `addChainIDsToWhitelist`

```solidity
/**
 * @notice Adds chainIDs to the whitelist of chainIDs that are transported to by the multichain protocol
 * @param chainIDs the chainIDs to add to the whitelist
 * @param operatorTableUpdaters the operatorTableUpdaters for each whitelisted chainID
 * @dev msg.sender must be the owner of the CrossChainRegistry
 * @dev Reverts for:
 *      - "Ownable: caller is not the owner": Caller is not the owner of the contract
 *      - CurrentlyPaused: Chain whitelisting is paused
 *      - ArrayLengthMismatch: The chainIDs and operatorTableUpdaters arrays have different lengths
 *      - InvalidChainId: Any chainID is zero
 *      - ChainIDAlreadyWhitelisted: Any chainID is already whitelisted
 * @dev Emits the following events:
 *      - ChainIDAddedToWhitelist: When each chainID is successfully added to the whitelist
 */
function addChainIDsToWhitelist(uint256[] calldata chainIDs, address[] calldata operatorTableUpdaters) external;
```

Adds chain IDs to the global whitelist, enabling them as valid transport destinations. Each chain ID is associated with an `OperatorTableUpdater` address that will be responsible for updating operator tables on that chain. In practice, the `OperatorTableUpdater` address will be the same across all chains. 

*Effects*:
* Adds each `chainID` and its corresponding `operatorTableUpdater` to the `_whitelistedChainIDs` mapping
* Emits a `ChainIDAddedToWhitelist` event for each successfully added chain

*Requirements*:
* Caller MUST be the `owner` of the contract
* The global paused status MUST NOT be set: `PAUSED_CHAIN_WHITELIST`
* The `chainIDs` and `operatorTableUpdaters` arrays MUST have the same length
* Each `chainID` MUST NOT be zero
* Each `chainID` MUST NOT already be whitelisted

### `removeChainIDsFromWhitelist`

```solidity
/**
 * @notice Removes chainIDs from the whitelist of chainIDs
 * @param chainIDs the chainIDs to remove from the whitelist
 * @dev msg.sender must be the owner of the CrossChainRegistry
 * @dev Reverts for:
 *      - "Ownable: caller is not the owner": Caller is not the owner of the contract
 *      - CurrentlyPaused: Chain whitelisting is paused
 *      - ChainIDNotWhitelisted: Any chainID is not currently whitelisted
 * @dev Emits the following events:
 *      - ChainIDRemovedFromWhitelist: When each chainID is successfully removed from the whitelist
 */
function removeChainIDsFromWhitelist(
    uint256[] calldata chainIDs
) external;
```

Removes chain IDs from the global whitelist, preventing them from being used as transport destinations. 

*Effects*:
* Removes each `chainID` from the `_whitelistedChainIDs` mapping
* Emits a `ChainIDRemovedFromWhitelist` event for each successfully removed chain

*Requirements*:
* Caller MUST be the `owner` of the contract
* The global paused status MUST NOT be set: `PAUSED_CHAIN_WHITELIST`
* Each `chainID` MUST be currently whitelisted 

### `setTableUpdateCadence`

```solidity
/**
 * @notice Sets the table update cadence in seconds. This is the frequency at which operator tables are expected to be updated on all destination chains
 * @param tableUpdateCadence the table update cadence
 * @dev msg.sender must be the owner of the CrossChainRegistry
 * @dev The table update cadence cannot be 0
 * @dev Reverts for:
 *      - "Ownable: caller is not the owner": Caller is not the owner of the contract
 *      - InvalidTableUpdateCadence: The tableUpdateCadence is zero
 * @dev Emits the following events:
 *      - TableUpdateCadenceSet: When the table update cadence is successfully set
 */
function setTableUpdateCadence(
    uint32 tableUpdateCadence
) external;
```

Sets the global table update cadence - the cadence at which operator tables are *expected* to be updated. This value acts as a floor for all non-zero `maxStalenessPeriod` values in operator set configurations.

*Effects*:
* Updates the `_tableUpdateCadence` storage variable
* Emits a `TableUpdateCadenceSet` event

*Requirements*:
* Caller MUST be the `owner` of the contract
* The `tableUpdateCadence` MUST be greater than 0

---

## Offchain View Functions

The `Generator` and `Transporter` use the below view functions to generate and transport tables:

1. `getActiveGenerationReservations`: Gets the operatorSets to be included in the `globalTableRoot`

```solidity
/**
 * @notice Gets the active generation reservations
 * @return An array of operatorSets with active generationReservations
 */
function getActiveGenerationReservations() external view returns (OperatorSet[] memory);
```

2. `calculateOperatorTableBytes`: Calculates the operator table bytes, which is then merkleized into the `globalTableRoot` offchain

```solidity
/**
 * @notice Calculates the operatorTableBytes for a given operatorSet
 * @param operatorSet the operatorSet to calculate the operator table for
 * @return the encoded operatorTableBytes containing:
 *         - operatorSet details
 *         - curve type from KeyRegistrar
 *         - operator set configuration
 *         - calculated operator table from the calculator contract
 * @dev This function aggregates data from multiple sources for cross-chain transport
 * @dev Reverts for the operatorTableCalculator contract call fails or reverts
 */
function calculateOperatorTableBytes(
    OperatorSet calldata operatorSet
) external view returns (bytes memory);
```

3. `getSupportedChains`: Gets all chains that can be transported to by the multichain protocol

```solidity
/**
 * @notice Gets the list of chains that are supported by the CrossChainRegistry
 * @return An array of chainIDs that are supported by the CrossChainRegistry
 * @return An array of operatorTableUpdaters corresponding to each chainID
 */
function getSupportedChains() external view returns (uint256[] memory, address[] memory);
```
````

## File: docs/multichain/README.md
````markdown
[elip-008]: https://github.com/eigenfoundation/ELIPs/blob/main/ELIPs/ELIP-008.md

## Multichain Docs

The EigenLayer multichain protocol enables *consumption* of EigenLayer L1 stake on supported destination chains. For launch the source chain is Ethereum Mainnet and the destination chains are Ethereum Mainnet and Base. 

This document provides an overview of system components, contracts, and user roles and is up-to-date with the latest [ELIP-008][elip-008]. Further documentation on the specific contracts can be found in this folder. 

---

### Contents

* [System Diagram](#system-diagram)
* [Source Chain](#source-chain)
    * [`CrossChainRegistry`](#cross-chain-registry)
    * [`OperatorTableCalculator`](#operator-table-calculator)
* [Destination Chain](#destination-chain)
    * [`OperatorTableUpdater`](#operator-table-updater)
    * [`CertificateVerifier`](#certificate-verifier)
* [Roles and Actors](#roles-and-actors)
* [Common User Flows](#common-user-flows)
    * [Register for Generation/Transport](#registering-for-generationtransport)

---

### System Diagram

```mermaid
classDiagram 
direction TD
namespace Source Chain {
		class CrossChainRegistry {
				createGenerationReservation
				removeGenerationReservation
				calculateOperatorTableBytes
		}
    class OperatorTableCalculator {
		    ECDSA/BN254 Table Calculator
	  }
		class EigenLayer Core {
				DelegationManager
				AllocationManager
				KeyRegistrar
				PermissionController
		}
}
namespace Off Chain {
    class Generator {
		    generateGlobalTableRoot
		}
		class Transporter {
				confirmGlobalTableRoot
				updateOperatorTable
		}
}
namespace Destination Chain {
    class OperatorTableUpdater {
		    confirmGlobalTableRoot
		    updateOperatorTable
		}
    class CertificateVerifier {
		    BN254/ECDSA
    }
}


CrossChainRegistry --> OperatorTableCalculator: Reads
OperatorTableCalculator --> EigenLayer Core: Reads
Generator --> CrossChainRegistry: Reads
Transporter --> Generator: Gets Root
Transporter --> OperatorTableUpdater: Confirms Root, Updates Tables
OperatorTableUpdater --> CertificateVerifier: Updates table
```

The protocol proceeds in the following process:

1. AVS deploys `AVSRegistrar` , configures metadata in EL, and gets operator registration
    1. AVS registers for generation/transport calling `CrossChainRegistry.makeGenerationReservation`
    2. The AVS deploys an `OperatorTableCalculator` 
2. At some cadence, the `Generator` process gets all active generations from the `CrossChainRegistry` against the latest `finalizedBlock` 
    1. It then creates and signs a `globalTableRoot` of all operator table commitments
3. The transporter will generate a Certificate to validate that the Eigen Labs Operator signed off on the `globalTableRoot`. The root is then transported to ALL destination chains 
4. Lastly, the transporter will update all Operator Tables with a certificate. The sidecar will generate the proof data to then update tables via the `OperatorTableUpdater`

---

### Source Chain

Source chain contracts are deployed to Ethereum Mainnet. 

#### Cross Chain Registry

| File | Type | Proxy |
| -------- | -------- | -------- |
| [`CrossChainRegistry.sol`](../../src/contracts/multichain/CrossChainRegistry.sol) | Singleton | Transparent proxy |

This contract enables AVSs to register to have their stakes transported to supported destination chains:
* For a given operatorSet, an AVS denotes its operator table calculator and global configuration
* The offchain service calculates and transports each operator table from this contract at a pre-defined cadence

See full documentation in [`/source/CrossChainRegistry.md`](./source/CrossChainRegistry.md). 

#### Operator Table Calculator

These contracts are **deployed by an AVS** and define custom stake weights of operators in an operatorSet. They are segmented by key-type. 

See full documentation in the [middleware repository](https://github.com/Layr-Labs/eigenlayer-middleware/tree/dev/docs).

---

### Destination Chain

Destination chain contracts receive transported stake weights from an offchain service. The supported destination chains are Mainnet and Base. 

#### Operator Table Updater

| File | Type | Proxy |
| -------- | -------- | -------- |
| [`OperatorTableUpdater.sol`](../../src/contracts/multichain/OperatorTableUpdater.sol) | Singleton | Transparent proxy |

The `operatorTableUpdater` carries out two basic functions:
* Updating the `globalTableRoot` via a signed certificate from the *off-chain* `generator`. This is a permissionless function. 
* Updating operator tables via merkle proofs against the `globalTableRoot`. This is a permissionless function. 

See full documentation in [`/destination/OperatorTableUpdater.md`](./destination/OperatorTableUpdater.md). 

#### Certificate Verifier

| File | Type | Proxy |
| -------- | -------- | -------- |
| [`BN254CertificateVerifier`](../../src/contracts/multichain/BN254CertificateVerifier.sol) | Singleton | Transparent proxy |
| [`ECDSACertificateVerifier`](../../src/contracts/multichain/ECDSACertificateVerifier.sol) | Singleton | Transparent proxy |

A `Certificate` is a proof of a task being executed offchain by the operators of an operatorSet. Two types of key material are supported: ECDSA and BN254. 

See full documentation in [`/destination/CertificateVerifier.md`](./destination/CertificateVerifier.md). 

---

### Roles and Actors

#### AVS

An AVS is an entity that uses delegated or slashable security from operators to execute off-chain tasks. Consumers of an AVS utilize the `CertificateVerifier` to validate tasks. 

*Flows:*
* AVSs **register** for transporting their stakes via the `CrossChainRegistry`
* AVSs **deploy** an OperatorTableCalculator for each of their operatorSets

#### Generator

The `Generator` is an EigenLabs-operated entity that calculates and signs off on the `GlobalTableRoot` for all operatorSets that have requested to be transported to a `DestinationChain`. For the pilot program, there is no stake backing the `Generator` and it is not slashable. 

*Offchain Flows:*
* The generator **calculates** and **signs** the `GlobalTableRoot`. Within the contracts, this is referred to as the `generator`. 

#### Transporter

The `Transporter` serves two purposes: 
* **Transport** the `GlobalTableRoot` to all destination chains
* **Transport** operator tables to all destination chains

Note: The Transport of the `GlobalTableRoot` and Operator Tables is *permissionless*. Any entity can transport the `GlobalTableRoot` with a valid certificate from the `Generator`. In addition, any entity can update the table with a valid merkle proof. See the [sidecar](https://github.com/Layr-Labs/sidecar) for how to run a transporter. 

---

### Common User Flows

#### Registering for Generation/Transport

Registering for generation/transport is done by the AVS. The AVS *MUST* set the `KeyType` in the `KeyRegistrar`, even if it is not using the `KeyRegistrar` for storing operator keys. 

![.](../images/multichain-registration.png)
````

## File: docs/permissions/KeyRegistrar.md
````markdown
# KeyRegistrar

| File | Type | Proxy |
| -------- | -------- | -------- |
| [`KeyRegistrar.sol`](../../src/contracts/permissions/KeyRegistrar.sol) | Singleton | Transparent proxy |

The `KeyRegistrar` manages cryptographic keys for operators across different operator sets. It supports both ECDSA and BN254 key types and ensures global uniqueness of keys across all operator sets.

Key features:
* **Per-OperatorSet Configuration**: Each operator set must be configured with a specific curve type before keys can be registered
* **Global Key Registry**: Keys are globally unique - once registered, a key cannot be reused across operatorSets or operators

Keys are stored in a 2-way mapping:
1. (operator, operatorSet) to key
2. keyHash to operator address

See [usage patterns](#usage-patterns) below on user flows. 

---

## Operator Set Configuration

An AVS must configure the operator set with a specific curve type.

### `configureOperatorSet`

```solidity
/**
 * @notice Configures an operator set with curve type
 * @param operatorSet The operator set to configure
 * @param curveType Type of curve (ECDSA, BN254)
 * @dev Only authorized callers for the AVS can configure operator sets
 * @dev Reverts for:
 *      - InvalidPermissions: Caller is not authorized for the AVS (via the PermissionController)
 *      - InvalidCurveType: The curve type is not ECDSA or BN254
 *      - ConfigurationAlreadySet: The operator set is already configured
 * @dev Emits the following events:
 *      - OperatorSetConfigured: When the operator set is successfully configured with a curve type
 */
function configureOperatorSet(OperatorSet memory operatorSet, CurveType curveType) external;
```

Configures an operator set to use a specific cryptographic curve type. This must be called before any keys can be registered for the operator set. 
*Note: Registering for an operatorSet in the core protocol does not require a key to be registered. However, the AVS may have logic that gates registration based on a key being registered in the `KeyRegistrar`.*

*Effects*:
* Sets the curve type for the specified operator set
* Emits an `OperatorSetConfigured` event

*Requirements*:
* Caller MUST be authorized for the AVS (via the `PermissionController`)
* The operator set MUST NOT already be configured
* The curve type MUST be either ECDSA or BN254

---

## Key Registration

Key registration is segmented by curve type: ECDSA and BN254. 

### ECDSA Key Registration

#### `registerKey` (ECDSA)

```solidity
/**
 * @notice Registers a cryptographic key for an operator with a specific operator set
 * @param operator Address of the operator to register key for
 * @param operatorSet The operator set to register the key for
 * @param pubkey Public key bytes. For ECDSA, this is the address of the key. For BN254, this is the G1 and G2 key combined (see `encodeBN254KeyData`)
 * @param signature Signature proving ownership. For ECDSA this is a signature of the `getECDSAKeyRegistrationMessageHash`. For BN254 this is a signature of the `getBN254KeyRegistrationMessageHash`.
 * @dev Can be called by operator directly or by addresses they've authorized via the `PermissionController`
 * @dev There exist no restriction on the state of the operator with respect to the operatorSet. That is, an operator
 *      does not have to be registered for the operator in the `AllocationManager` to register a key for it
 * @dev For ECDSA, we allow a smart contract to be the pubkey (via ERC1271 signatures), but note that the multichain protocol DOES NOT support smart contract signatures
 * @dev Reverts for:
 *      - InvalidPermissions: Caller is not the operator or authorized via the PermissionController
 *      - OperatorSetNotConfigured: The operator set is not configured
 *      - KeyAlreadyRegistered: The operator is already registered for the operatorSet in the KeyRegistrar
 *      - InvalidKeyFormat: For ECDSA: The key is not exactly 20 bytes
 *      - ZeroAddress: For ECDSA: The key is the zero address
 *      - KeyAlreadyRegistered: For ECDSA: The key is already registered globally by hash
 *      - InvalidSignature: For ECDSA: The signature is not valid
 *      - InvalidKeyFormat: For BN254: The key data is not exactly 192 bytes
 *      - InvalidSignature: For BN254: The signature is not exactly 64 bytes
 *      - ZeroPubkey: For BN254: The G1 point is the zero point
 *      - InvalidSignature: For BN254: The signature is not valid
 *      - KeyAlreadyRegistered: For BN254: The key is already registered globally by hash
 * @dev Emits the following events:
 *      - KeyRegistered: When the key is successfully registered for the operator and operatorSet
 */
function registerKey(
    address operator,
    OperatorSet memory operatorSet,
    bytes calldata pubkey,
    bytes calldata signature
) external;
```

There ARE NO restrictions on the state of the operator with respect to the operatorSet. That is, an operator does not have to be registered for the operator in the `AllocationManager` to register a key for it. The contract supports the ERC1271 signature scheme. However, **note that the multichain protocol DOES NOT support smart contract signatures**.  

For ECDSA keys:
- `pubkey`: 20 bytes representing the Ethereum address
- `signature`: EIP-712 signature from the key's private key. Signature is over [`getECDSAKeyRegistrationMessageHash`](#getecdsakeyregistrationmessagehash)

*Effects*:
* Registers the key for the operator in the specified operator set
* Adds the key to the global registry
* Associates the key hash with the operator address
* Emits a `KeyRegistered` event with curve type ECDSA

*Requirements*:
* Caller MUST be the operator or authorized via the `PermissionController`
* The operatorSet MUST be configured
* The operator MUST NOT be already registered for the operatorSet in the `KeyRegistrar`
* The key MUST be exactly 20 bytes
* The key MUST NOT be the zero address
* The key MUST NOT already be registered globally (by hash)
* The signature MUST be valid

#### `getECDSAKeyRegistrationMessageHash`

```solidity
/**
 * @notice Returns the message hash for ECDSA key registration, which must be signed by the operator when registering an ECDSA key
 * @param operator The operator address
 * @param operatorSet The operator set
 * @param keyAddress The address of the key
 * @return The message hash for signing
 */
function getECDSAKeyRegistrationMessageHash(
    address operator,
    OperatorSet memory operatorSet,
    address keyAddress
) external view returns (bytes32);
```

Returns the message hash that must be signed over for ECDSA key registration. 


### BN254 Key Registration

BN254 keys registration requires passing in G1 and G2 points.

#### `registerKey` (BN254)

```solidity
/**
 * @notice Registers a cryptographic key for an operator with a specific operator set
 * @param operator Address of the operator to register key for
 * @param operatorSet The operator set to register the key for
 * @param pubkey Public key bytes. For ECDSA, this is the address of the key. For BN254, this is the G1 and G2 key combined (see `encodeBN254KeyData`)
 * @param signature Signature proving ownership. For ECDSA this is a signature of the `getECDSAKeyRegistrationMessageHash`. For BN254 this is a signature of the `getBN254KeyRegistrationMessageHash`.
 * @dev Can be called by operator directly or by addresses they've authorized via the `PermissionController`
 * @dev There exist no restriction on the state of the operator with respect to the operatorSet. That is, an operator
 *      does not have to be registered for the operator in the `AllocationManager` to register a key for it
 * @dev For ECDSA, we allow a smart contract to be the pubkey (via ERC1271 signatures), but note that the multichain protocol DOES NOT support smart contract signatures
 * @dev Reverts for:
 *      - InvalidPermissions: Caller is not the operator or authorized via the PermissionController
 *      - OperatorSetNotConfigured: The operator set is not configured
 *      - KeyAlreadyRegistered: The operator is already registered for the operatorSet in the KeyRegistrar
 *      - InvalidKeyFormat: For ECDSA: The key is not exactly 20 bytes
 *      - ZeroAddress: For ECDSA: The key is the zero address
 *      - KeyAlreadyRegistered: For ECDSA: The key is already registered globally by hash
 *      - InvalidSignature: For ECDSA: The signature is not valid
 *      - InvalidKeyFormat: For BN254: The key data is not exactly 192 bytes
 *      - InvalidSignature: For BN254: The signature is not exactly 64 bytes
 *      - ZeroPubkey: For BN254: The G1 point is the zero point
 *      - InvalidSignature: For BN254: The signature is not valid
 *      - KeyAlreadyRegistered: For BN254: The key is already registered globally by hash
 * @dev Emits the following events:
 *      - KeyRegistered: When the key is successfully registered for the operator and operatorSet
 */
function registerKey(
    address operator,
    OperatorSet memory operatorSet,
    bytes calldata pubkey,
    bytes calldata signature
) external;
```
There are restrictions on the state of the operator with respect to the operatorSet. That is, an operator does not have to be registered for the operator in the `AllocationManager` to register a key for it. 

For BN254 keys:
- `pubkey`: [Encoded](#encodebn254keydata) BN254 key data containing G1 and G2 points
- `signature`: BN254 signature proving ownership over a set [digest](#getbn254keyregistrationmessagehash)

*Effects*:
* Registers the BN254 key for the operator in the specified operator set
* Adds the key hash to the global registry
* Emits a `KeyRegistered` event with curve type BN254

*Requirements*:
* Caller MUST be the operator or authorized via the `PermissionController`
* The operatorSet MUST be configured
* The operator MUST NOT be already registered for the operatorSet in the `KeyRegistrar`
* The key MUST be exactly 192 bytes 
* The signatures MUST be exactly 64 bytes
* The key MUST contain valid G1 and G2 points
* The G1 point MUST NOT be the zero point
* The key MUST NOT already be registered globally (by hash)
* The signature MUST be valid

#### `encodeBN254KeyData`

```solidity
/**
 * @notice Encodes the BN254 key data into a bytes array
 * @param g1Point The BN254 G1 public key
 * @param g2Point The BN254 G2 public key
 * @return The encoded key data
 */
function encodeBN254KeyData(
    BN254.G1Point memory g1Point,
    BN254.G2Point memory g2Point
) external pure returns (bytes memory);
```

Utility function to properly encode BN254 key data for registration.

#### `getBN254KeyRegistrationMessageHash`

```solidity
/**
 * @notice Returns the message hash for BN254 key registration, which must be signed by the operator when registering a BN254 key
 * @param operator The operator address
 * @param operatorSet The operator set
 * @param keyData The BN254 key data
 * @return The message hash for signing
 */
function getBN254KeyRegistrationMessageHash(
    address operator,
    OperatorSet memory operatorSet,
    bytes calldata keyData
) external view returns (bytes32);
```

Returns the message hash that must be signed over for BN254 key registration. 

---

## Key Deregistration

### `deregisterKey`

```solidity
/**
 * @notice Deregisters a cryptographic key for an operator with a specific operator set
 * @param operator Address of the operator to deregister key for
 * @param operatorSet The operator set to deregister the key from
 * @dev Can be called by the operator directly or by addresses they've authorized via the `PermissionController`
 * @dev Keys remain in global key registry to prevent reuse
 * @dev Reverts for:
 *      - InvalidPermissions: Caller is not authorized for the operator (via the PermissionController)
 *      - OperatorStillSlashable: The operator is still slashable for the AVS
 *      - OperatorSetNotConfigured: The operator set is not configured
 *      - KeyNotFound: The operator does not have a registered key for this operator set
 * @dev Emits the following events:
 *      - KeyDeregistered: When the key is successfully deregistered for the operator and operatorSet
 */
function deregisterKey(address operator, OperatorSet memory operatorSet) external;
```

Removes an operator's key from the specified operator set. Note that the key remains in the global registry to prevent reuse.

*Effects*:
* Removes the key from the operator's record for the operator set
* Emits a `KeyDeregistered` event
* The key remains in the global registry

*Requirements*:
* Caller MUST be authorized for the operator (via the `PermissionController`)
* The operator MUST not be slashable for the AVS, to prevent off-chain race conditions
* The operator set MUST be configured
* The operator MUST have a registered key for this operator set

---

## Usage patterns
The `KeyRegistrar` introduces new operator/avs registration patterns. Note that these registration patterns are **only for AVSs who have opted to use the new [middlewareV2](https://github.com/Layr-Labs/eigenlayer-middleware/tree/dev/docs/middlewareV2) contract architecture.**

### Operator/AVS Registration

```mermaid
sequenceDiagram
    participant OP as Operator
    participant KR as KeyRegistrar
    participant AM as AllocationManager
    participant AVR as AVSRegistrar

    OP->>KR: Tx1: registerKey
    OP->>AM: Tx2: registerForOperatorSets
    AM-->>AVR: registerForOperatorSets
    AVR-->>KR: isRegistered
```


### Deregistration/Key Rotation

Deregistration takes a dependency on the `AllocationManager`. In particular, operators are only allowed to deregister their key from an operatorSet if they are not slashable by said operatorSet. 

To rotate a key, an operator must deregister from the operatorSet, wait until it is not slashable, deregister its key, and then register a new key. If the operator was not slashable, it can rotate its key without a delay. 

```mermaid
sequenceDiagram
    participant OP as Operator
    participant AM as AllocationManager
    participant KR as KeyRegistrar

    OP->>AM: Tx1: deregisterFromOperatorSets
    Note over OP: Wait 14 days<br>(if previously allocated)
    OP->>KR: Tx2: deregisterKey
    OP->>KR: Tx3: registerKey
```
````

## File: docs/permissions/PermissionController.md
````markdown
# PermissionController

| File | Type | Proxy |
| -------- | -------- | -------- |
| [`PermissionController.sol`](../../src/contracts/permissions/PermissionController.sol) | Singleton | Transparent proxy |

The `PermissionController` handles user permissions for protocol contracts which explicitly integrate it. Note that "users" in the context of the `PermissionController` refers to **AVSs** and **operators**; it does *not* refer to **stakers**.

The `PermissionController` is integrated into other core contracts, enabling (for specific methods) AVSs and operators to designate _other accounts_ ("appointees") that can call these methods on their behalf. The core contracts using the `PermissionController` as a dependency are the:
* `DelegationManager`
* `AllocationManager`
* `RewardsCoordinator`

The `PermissionController` defines three different roles:
* [Accounts](#accounts)
* [Admins](#admins)
* [Appointees](#appointees)

---

## Accounts

**Accounts** refer to the Ethereum address through which one interacts with the protocol _if no appointees are set_. From the core contracts' perspective, accounts are the "state holder," i.e. the address referenced in storage when a contract method interacts with state. For example, in the `DelegationManager`, the `operator` address that holds shares in the `operatorShares` mapping is an "account." In the `AllocationManager`, an AVS's "account" is the address under which operator sets are created.

The `PermissionController` allows an account to designate **admins** and/or **appointees** to take certain actions on its behalf. Note that setting up admins/appointees is _optional_, and carries with it a significant responsibility to **ensure the designated actors are intentionally being granted authority**.

Both admins AND appointees can be granted authority to act on an account's behalf. Admins are granted full reign over any `PermissionController`-enabled functions, while appointees must be granted authority to call specific functions on specific contracts. The list of methods that are `PermissionController`-enabled follow.

For operators:
* `AllocationManager.modifyAllocations`
* `AllocationManager.registerForOperatorSets`
* `AllocationManager.deregisterFromOperatorSets`
* `AllocationManager.setAllocationDelay`
* `DelegationManager.modifyOperatorDetails`
* `DelegationManager.updateOperatorMetadataURI`
* `DelegationManager.undelegate`
* `RewardsCoordinator.setClaimerFor`
* `RewardsCoordinator.setClaimerFor`
* `RewardsCoordinator.setOperatorAVSSplit`
* `RewardsCoordinator.setOperatorPISplit`

For AVSs:
* `AllocationManager.slashOperator`
* `AllocationManager.deregisterFromOperatorSets`
* `AllocationManager.setAVSRegistrar`
* `AllocationManager.updateAVSMetadataURI`
* `AllocationManager.createOperatorSets`
* `AllocationManager.addStrategiesToOperatorSet`
* `AllocationManager.removeStrategiesFromOperatorSet`
* `RewardsCoordinator.createOperatorDirectedAVSRewardsSubmission`
* `RewardsCoordinator.setClaimerFor`

### Account Permissions

Account permissions are stored within a struct defined as follows:

```solidity
struct AccountPermissions {
    /// @notice The pending admins of the account
    EnumerableSet.AddressSet pendingAdmins;
    /// @notice The admins of the account
    EnumerableSet.AddressSet admins;
    /// @notice Mapping from an appointee to the list of encoded target & selectors
    mapping(address appointee => EnumerableSet.Bytes32Set) appointeePermissions;
    /// @notice Mapping from encoded target & selector to the list of appointees
    mapping(bytes32 targetSelector => EnumerableSet.AddressSet) permissionAppointees;
}
```

These structs are then stored within a mapping defined as follows, allowing for fetching account permissions for a given account with ease:

```solidity
mapping(address account => AccountPermissions) internal _permissions;
```

By default, no other address can perform an action on behalf of a given account. However, accounts can add admins and/or appointees to give other addresses the ability to act on their behalf.

## Admins

Admins are able to take ANY action on behalf of an original account -- including adding or removing admins. This enables operations like key rotation for operators, or creating a backup admin which is stored on a cold key.

**Note:** by default, an account is its own admin. However, once an admin is added, this is no longer the case; only the admins listed in `_permissions.admins` are admins. If an account wants to both add admins AND continue acting as its own admin, _it must be added to the admins list_.

### Adding an Admin

The relevant functions for admin addition are:

* [`addPendingAdmin`](#addpendingadmin)
* [`removePendingAdmin`](#removependingadmin)
* [`acceptAdmin`](#acceptadmin)

#### `addPendingAdmin`

```solidity
/**
 * @notice Sets a pending admin of an account
 * @param account to set pending admin for
 * @param admin to set
 * @dev Multiple admins can be set for an account
 */
function addPendingAdmin(address account, address admin) external onlyAdmin(account);
```

When adding a new admin, an account or admin must first call `addPendingAdmin()`. Then, the pending admin must call `acceptAdmin()` to complete the process. An account cannot force an admin role upon another account.

Pending admins do not have any particular authority, but are granted the full authority of an admin once they call `acceptAdmin()`.

*Effects*:
* An address is added to the `pendingAdmins` set for the account
* A `PendingAdminAdded` event is emitted specifying the account for which a pending admin was added

*Requirements*:
* The proposed admin MUST NOT already be an admin for the `account`
* The proposed admin MUST NOT be a pending admin for the `account`
* Caller MUST be an admin for the `account`, or the `account` itself if no admin is set

#### `removePendingAdmin`

```solidity
/**
 * @notice Removes a pending admin of an account
 * @param account to remove pending admin for
 * @param admin to remove
 * @dev Only the admin of the account can remove a pending admin
 */
function removePendingAdmin(address account, address admin) external onlyAdmin(account);
```

An account or admin can call `removePendingAdmin()` to prevent a pending admin from accepting their role. However, this will only work if the pending admin has not already called `acceptAdmin()`. If this occurs, an admin can call `removeAdmin` to remove the unwanted admin.

*Effects*:
* An address is removed from the `pendingAdmins` set for the account
* A `PendingAdminRemoved` event is emitted specifying the account for which a pending admin was removed

*Requirements*:
* The proposed admin MUST be a pending admin for the account
* Caller MUST be an admin for the account, or the account's address itself if no admin is set

#### `acceptAdmin`

```solidity
/**
 * @notice Accepts the admin role of an account
 * @param account to accept admin for
 * @dev Only a pending admin for the account can become an admin
 */
function acceptAdmin(address account) external;
```

Called by a pending admin to claim the admin role for an account. The caller must have been previously added as a pending admin.

Note that once an account has successfully added an admin (i.e. the pending admin has called `acceptAdmin()`), **the account's address itself no longer has its default admin privileges**. This behavior benefits accounts seeking to perform a *key rotation*, as adding an admin allows them to remove permissions from their original, potentially compromised, key. If an account wants to retain admin privileges for its own address, it is recommended to first add itself as an admin, then add any other admins as desired.

*Effects*:
* The caller is removed from the `pendingAdmins` set for the account
* The caller is added to the `admins` set for the account
* A `AdminSet` event is emitted specifying the account for which an admin was added

*Requirements*:
* Caller MUST be a pending admin for the account

### Removing an Admin

#### `removeAdmin`

```solidity
/**
 * @notice Remove an admin of an account
 * @param account to remove admin for
 * @param admin to remove
 * @dev Only the admin of the account can remove an admin
 * @dev Reverts when an admin is removed such that no admins are remaining
 */
function removeAdmin(address account, address admin) external onlyAdmin(account);
```

An admin of an account can call `removeAdmin()` to remove any other admins of the same account. However, one admin must always remain for any given account. In other words, once an account has added an admin, it must always have at least one admin in perpetuity.

*Effects*:
* The specified admin is removed from the `admins` set for the account
* An `AdminRemoved` event is emitted specifying the accuont for which an admin was removed

*Requirements*:
* `admins.length()` MUST be greater than 1, such that removing the admin does not remove all admins for the account
* The address to remove MUST be an admin for the account
* Caller MUST be an admin for the account, or the account's address itself if no admin is set

## Appointees

Appointees are able to act as another account *for a specific function for a specific contract*, granting accounts granular access control.

Specifically, an account (or its admins) can grant an appointee access to a specific `selector` (i.e [function](https://solidity-by-example.org/function-selector/)) on a given `target` (i.e. contract). The `target` and `selector` are combined in the form of the `targetSelector` and serve to uniquely identify a permissioned function on a specific contract.

Appointees can be granted access to multiple functions/contracts. Each new `targetSelector` permission granted requires setting the appointee from scratch, and revoking the appointee's permission requires revoking each individual `targetSelector` permission, as described below.

### Adding an Appointee

#### `setAppointee`

```solidity
/**
 * @notice Set an appointee for a given account
 * @param account to set appointee for
 * @param appointee to set
 * @param target to set appointee for
 * @param selector to set appointee for
 * @dev Only the admin of the account can set an appointee
 */
function setAppointee(
    address account,
    address appointee,
    address target,
    bytes4 selector
) external onlyAdmin(account);
```

An account (or its admins) can call `setAppointee()` to give another address the ability to call a specific function on a given contract. That address is then only able to call that specific function on that specific contract on behalf of `account`.

Note that unlike the process to become an admin, there is no requirement for the `appointee` to accept the appointment.

*Effects*:
* The `targetSelector` is added to the specified `appointee` set within the  `appointeePermissions` mapping
* The `appointee` is added to the specified `targetSelector` set within the  `permissionAppointees` mapping
* The `AppointeeSet` event is emitted, specifying the account, appointee, target contract, and function selector

*Requirements*:
* Caller MUST be an admin for the account, or the account's address itself if no admin is set
* The proposed appointee MUST NOT already have permissions for the given `targetSelector`

### Removing an Appointee

#### `removeAppointee`

```solidity
/**
 * Removes an appointee for a given account
 * @param account to remove appointee for
 * @param appointee to remove
 * @param target to remove appointee for
 * @param selector to remove appointee for
 * @dev Only the admin of the account can remove an appointee
 */
function removeAppointee(
    address account,
    address appointee,
    address target,
    bytes4 selector
) external onlyAdmin(account);
```

An account (or its admins) can call `removeAppointee()` to remove an `appointee's` permissions for a given contract/function pair. Note that there does not exist any way currently to atomically remove all permissions for a given appointee, or all appointees for a given function selector - each permission must be revoked individually.

Also note that permissions to specific functions/contracts cannot be revoked for _admins_. Admins always have full access, unless another admin removes them from the admin list.

*Effects*:
* The `targetSelector` is removed from the specified `appointee` set within the  `appointeePermissions` mapping
* The `appointee` is removed from the specified `targetSelector` set within the  `permissionAppointees` mapping
* The `AppointeeRemoved` event is emitted, specifying the account, appointee, target contract, and function selector

*Requirements*:
* Caller MUST be an admin for the account, or the account's address itself if no admin is set
* The proposed appointee MUST already have permissions for the given `targetSelector`
````

## File: docs/README.md
````markdown
[middleware-repo]: https://github.com/Layr-Labs/eigenlayer-middleware/
[elip-002]: https://github.com/eigenfoundation/ELIPs/blob/main/ELIPs/ELIP-002.md

## EigenLayer Docs - v1.3.0 Release

This repo contains the EigenLayer core contracts, which enable restaking of liquid staking tokens (LSTs), beacon chain ETH, and permissionlessly deployed ERC20 Strategies to secure new services called AVSs (actively validated services). For more info on AVSs, check out the EigenLayer middleware contracts [here][middleware-repo].

This document provides an overview of system components, contracts, and user roles and is up-to-date with the latest [ELIP-002][elip-002]. Further documentation on the major system contracts can be found in [/core](./core/).

#### Contents

* [System Components](#system-components)
    * [`EigenPodManager`](#eigenpodmanager)
    * [`StrategyManager`](#strategymanager)
    * [`DelegationManager`](#delegationmanager)
    * [`RewardsCoordinator`](#rewardscoordinator)
    * [`AVSDirectory`](#avsdirectory)
    * [`AllocationManager`](#allocationmanager)
    * [`PermissionController`](#permissioncontroller)
* [Roles and Actors](#roles-and-actors)
* [Common User Flows](#common-user-flows)
    * [Depositing Into EigenLayer](#depositing-into-eigenlayer)
    * [Delegating to an Operator](#delegating-to-an-operator)
    * [Undelegating or Queueing a Withdrawal](#undelegating-or-queueing-a-withdrawal)
    * [Completing a Withdrawal as Shares](#completing-a-withdrawal-as-shares)
    * [Completing a Withdrawal as Tokens](#completing-a-withdrawal-as-tokens)
    * [Withdrawal Processing: Validator Exits](#withdrawal-processing-validator-exits)
    * [Withdrawal Processing: Partial Beacon Chain Withdrawals](#withdrawal-processing-partial-beacon-chain-withdrawals)

### System Components

#### EigenPodManager

| File | Type | Proxy |
| -------- | -------- | -------- |
| [`EigenPodManager.sol`](../src/contracts/pods/EigenPodManager.sol) | Singleton | Transparent proxy |
| [`EigenPod.sol`](../src/contracts/pods/EigenPod.sol) | Instanced, deployed per-user | Beacon proxy |

These contracts work together to enable native ETH restaking:
* Users deploy `EigenPods` via the `EigenPodManager`, which contain beacon chain state proof logic used to verify a validator's withdrawal credentials and current balances. An `EigenPod's` main role is to serve as the fee recipient and/or withdrawal credentials for one or more of a user's validators.
* The `EigenPodManager` handles `EigenPod` creation and accounting+interactions between users with restaked native ETH and the `DelegationManager`.

See full documentation in:
* [`/core/EigenPodManager.md`](./core/EigenPodManager.md)
* [`/core/EigenPod.md`](./core/EigenPod.md)

#### StrategyManager

| File | Type | Proxy |
| -------- | -------- | -------- |
| [`StrategyManager.sol`](../src/contracts/core/StrategyManager.sol) | Singleton | Transparent proxy |
| [`StrategyFactory.sol`](../../src/contracts/core/StrategyFactory.sol) | Singleton | Transparent proxy |
| [`StrategyBaseTVLLimits.sol`](../../src/contracts/strategies/StrategyBaseTVLLimits.sol) | Instanced, one per supported token | - Strategies deployed outside the `StrategyFactory` use transparent proxies <br /> - Anything deployed via the `StrategyFactory` uses a Beacon proxy |

These contracts work together to enable restaking for ERC20 tokens supported by EigenLayer:
* The `StrategyManager` acts as the entry and exit point for any supported tokens in EigenLayer. It handles deposits into LST-specific strategies, and manages accounting+interactions between users with restaked LSTs and the `DelegationManager`.
* `StrategyFactory` allows anyone to deploy strategies to support deposits/withdrawals for new ERC20 tokens
* `StrategyBaseTVLLimits` is deployed as multiple separate instances, one for each supported token. When a user deposits into a strategy through the `StrategyManager`, this contract receives the tokens and awards the user with a proportional quantity of deposit shares in the strategy. When a user withdraws, the strategy contract sends the LSTs back to the user.

See full documentation in [`/core/StrategyManager.md`](./core/StrategyManager.md).

#### DelegationManager

| File | Type | Proxy |
| -------- | -------- | -------- |
| [`DelegationManager.sol`](../src/contracts/core/DelegationManager.sol) | Singleton | Transparent proxy |

The `DelegationManager` sits between the `EigenPodManager` and `StrategyManager` to manage delegation and undelegation of stakers to operators. Its primary features are to allow users to become operators, to keep track of delegated shares to operators across different strategies, and to manage withdrawals on behalf of stakers via the `EigenPodManager` and `StrategyManager`.

The `DelegationManager` is tightly coupled with the `AllocationManager`. The `DelegationManager` ingests information about slashing as part of managing share accounting for stakers whose operators have been slashed. It also receives directives to slash/burn operator shares when an AVS slashes an operator.

See:
* full documentation in [`/core/DelegationManager.md`](./core/DelegationManager.md)
* share accounting documentation in [`/core/accounting/SharesAccounting.md`](./core/accounting/SharesAccounting.md)

#### RewardsCoordinator

| File | Type | Proxy |
| -------- | -------- | -------- |
| [`RewardsCoordinator.sol`](../src/contracts/core/RewardsCoordinator.sol) | Singleton | Transparent proxy |

The `RewardsCoordinator` is the main entry point of submission and claiming of ERC20 rewards in EigenLayer. It carries out three basic functions:
* AVSs (via the AVS's contracts) submit "rewards submissions" to their registered operators and stakers over a specific time period 
* *Off-chain*, the rewards updater will use each RewardsSubmission time period to apply reward amounts to historical staker/operator stake weights. This is consolidated into a merkle root that is posted *on-chain* to the `RewardsCoordinator`, allowing stakers/operators to claim their allocated rewards.
* Stakers/operators can claim rewards posted by the rewards updater.

See full documentation in [`/core/RewardsCoordinator.md`](./core/RewardsCoordinator.md).

#### AVSDirectory

| File | Type | Proxy |
| -------- | -------- | -------- |
| [`AVSDirectory.sol`](../src/contracts/core/AVSDirectory.sol) | Singleton | Transparent proxy |

##### Note: This contract is left unchanged for backwards compatibility. Operator<>AVS Registrations are to be replaced entirely with the `AllocationManager` and this contract will be deprecated in a future release.

Previously, the `AVSDirectory` handled interactions between AVSs and the EigenLayer core contracts. Once registered as an operator in EigenLayer core (via the `DelegationManager`), operators could register with one or more AVSs (via the AVS's contracts) to begin providing services to them offchain. As a part of registering with an AVS, the AVS would record this registration in the core contracts by calling into the `AVSDirectory`. As of the slashing release, this process is now managed by the [`AllocationManager`](#allocationmanager).

See full documentation in [`/core/AVSDirectory.md`](./core/AVSDirectory.md).

For more information on AVS contracts, see the [middleware repo][middleware-repo].

#### AllocationManager

| File | Type | Proxy |
| -------- | -------- | -------- |
| [`AllocationManager.sol`](../src/contracts/core/AllocationManager.sol) | Singleton | Transparent proxy |

The `AllocationManager` is replaces the AVSDirectory with the introduction of _operator sets_ and slashing. It handles several use cases:
* AVSs can create operator sets and can define the EigenLayer Strategies within them
* Operators can register to or deregister from an AVS's operator sets
* Operators can make slashable security commitments to an operator set by allocating a proportion of their total delegated stake for a Strategy to be slashable. Ex. As an operator, I can allocate 50% of my delegated stETH to be slashable by a specific operator set
* AVSs can slash an operator who has allocated to and is registered for one of the AVS's operator sets

See full documentation in [`/core/AllocationManager.md`](./core/AllocationManager.md).

#### PermissionController

| File | Type | Proxy |
| -------- | -------- | -------- |
| [`PermissionController.sol`](../src/contracts/permissions/PermissionController.sol) | Singleton | Transparent proxy |

The `PermissionController` allows AVSs and operators to delegate the ability to call certain core contract functions to other addresses. This delegation ability is not available to stakers, and is not available in ALL core contract functions.

The following core contracts use the `PermissionController` in certain methods:
* `DelegationManager`
* `AllocationManager`
* `RewardsCoordinator`

See full documentation in [`/permissions/PermissionController.md`](./permissions/PermissionController.md).

---

#### Roles and Actors

To see an example of the user flows described in this section, check out our integration tests: [/src/test/integration](../src/test/integration/).

##### Staker

A staker is any party who has assets deposited (or "restaked") into EigenLayer. Currently, these assets can be:
* Native beacon chain ETH (via the EigenPodManager)
* Arbitrary ERC20s (via the StrategyManager)

Stakers can restake any combination of these: a staker may hold ALL of these assets, or only one of them.

*Flows:*
* Stakers **deposit** assets into EigenLayer via either the StrategyManager (for ERC20s) or the EigenPodManager (for beacon chain ETH)
* Stakers **withdraw** assets via the DelegationManager, *no matter what assets they're withdrawing*
* Stakers **delegate** to an operator via the DelegationManager

##### Operator

An operator is a user who helps run the software built on top of EigenLayer (AVSs). operators register in EigenLayer and allow stakers to delegate to them, then opt in to provide various services built on top of EigenLayer. operators may themselves be stakers; these are not mutually exclusive.

*Flows:*
* Users can **register** as an operator via the DelegationManager
* Operators can **deposit** and **withdraw** assets just like stakers can
* Operators can opt in to providing services for an AVS using that AVS's middleware contracts. See the [EigenLayer middleware][middleware-repo] repo for more details.

---

#### Common User Flows

##### Depositing Into EigenLayer

Depositing into EigenLayer varies depending on whether the staker is depositing Native ETH or LSTs:

![.](./images/Staker%20Flow%20Diagrams/Depositing.png)

##### Delegating to an Operator

![.](./images/Staker%20Flow%20Diagrams/Delegating.png)

##### Undelegating or Queueing a Withdrawal

Undelegating from an operator automatically queues a withdrawal that needs to go through the `DelegationManager's` withdrawal delay. Stakers that want to withdraw can choose to `undelegate`, or can simply call `queueWithdrawals` directly.

![.](./images/Staker%20Flow%20Diagrams/Queue%20Withdrawal.png)

##### Completing a Withdrawal as Shares

This flow is mostly useful if a staker wants to change which operator they are delegated to. The staker first needs to undelegate (see above). At this point, they can delegate to a different operator. However, the new operator will only be awarded shares once the staker completes their queued withdrawal "as shares":

![.](./images/Staker%20Flow%20Diagrams/Complete%20Withdrawal%20as%20Shares.png)

##### Completing a Withdrawal as Tokens

Completing a queued withdrawal as tokens is roughly the same for both native ETH and LSTs. 

However, note that *before* a withdrawal can be completed, native ETH stakers will need to perform additional steps, detailed in the diagrams below. 

![.](./images/Staker%20Flow%20Diagrams/Complete%20Withdrawal%20as%20Tokens.png)

##### `EigenPods`: Processing Validator Exits

If a staker wants to fully withdraw from the beacon chain, they need to perform these additional steps before their withdrawal is completable:

![.](./images/Staker%20Flow%20Diagrams/Validator%20Exits.png)

##### `EigenPods`: Processing Validator Yield

As the staker's `EigenPod` accumulates consensus layer or execution layer yield, the `EigenPod's` balance will increase. The staker can Checkpoint their validator to claim this yield as shares, which can either remain staked in EigenLayer or be withdrawn via the `DelegationManager` withdrawal queue:

![.](./images/Staker%20Flow%20Diagrams/Validator%20Yield.png)
````

## File: pkg/bindings/AllocationManager/binding.go
````go
// Code generated - DO NOT EDIT.
// This file is a generated binding and any manual changes will be lost.
⋮----
package AllocationManager
⋮----
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"
)
⋮----
"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
)
⋮----
// IAllocationManagerTypesAllocateParams is an auto generated low-level Go binding around an user-defined struct.
type IAllocationManagerTypesAllocateParams struct {
	OperatorSet   OperatorSet
	Strategies    []common.Address
	NewMagnitudes []uint64
}
⋮----
// IAllocationManagerTypesAllocation is an auto generated low-level Go binding around an user-defined struct.
type IAllocationManagerTypesAllocation struct {
	CurrentMagnitude uint64
	PendingDiff      *big.Int
	EffectBlock      uint32
}
⋮----
// IAllocationManagerTypesCreateSetParams is an auto generated low-level Go binding around an user-defined struct.
type IAllocationManagerTypesCreateSetParams struct {
	OperatorSetId uint32
	Strategies    []common.Address
}
⋮----
// IAllocationManagerTypesCreateSetParamsV2 is an auto generated low-level Go binding around an user-defined struct.
type IAllocationManagerTypesCreateSetParamsV2 struct {
	OperatorSetId uint32
	Strategies    []common.Address
	Slasher       common.Address
}
⋮----
// IAllocationManagerTypesDeregisterParams is an auto generated low-level Go binding around an user-defined struct.
type IAllocationManagerTypesDeregisterParams struct {
	Operator       common.Address
	Avs            common.Address
	OperatorSetIds []uint32
}
⋮----
// IAllocationManagerTypesRegisterParams is an auto generated low-level Go binding around an user-defined struct.
type IAllocationManagerTypesRegisterParams struct {
	Avs            common.Address
	OperatorSetIds []uint32
	Data           []byte
}
⋮----
// IAllocationManagerTypesSlashingParams is an auto generated low-level Go binding around an user-defined struct.
type IAllocationManagerTypesSlashingParams struct {
	Operator      common.Address
	OperatorSetId uint32
	Strategies    []common.Address
	WadsToSlash   []*big.Int
	Description   string
}
⋮----
// OperatorSet is an auto generated low-level Go binding around an user-defined struct.
type OperatorSet struct {
	Avs common.Address
	Id  uint32
}
⋮----
// 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: "0x610180604052348015610010575f5ffd5b50604051615a31380380615a3183398101604081905261002f91610198565b868387878585896001600160a01b03811661005d576040516339b190bb60e11b815260040160405180910390fd5b6001600160a01b0390811660805293841660a05291831660c05263ffffffff90811660e05216610100819052610120529081166101405216610160526100a16100ad565b50505050505050610227565b5f54610100900460ff16156101185760405162461bcd60e51b815260206004820152602760248201527f496e697469616c697a61626c653a20636f6e747261637420697320696e697469604482015266616c697a696e6760c81b606482015260840160405180910390fd5b5f5460ff90811614610167575f805460ff191660ff9081179091556040519081527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b565b6001600160a01b038116811461017d575f5ffd5b50565b805163ffffffff81168114610193575f5ffd5b919050565b5f5f5f5f5f5f5f60e0888a0312156101ae575f5ffd5b87516101b981610169565b60208901519097506101ca81610169565b60408901519096506101db81610169565b60608901519095506101ec81610169565b60808901519094506101fd81610169565b925061020b60a08901610180565b915061021960c08901610180565b905092959891949750929550565b60805160a05160c05160e0516101005161012051610140516101605161571561031c5f395f81816103910152818161097101528181610a5101528181610a8001528181610aca01528181610af501528181610d5101528181610ff501528181612125015261240001525f818161058b015281816119bc01526137c801525f818161067601526136aa01525f81816106e9015261347701525f818161048601528181611325015261174601525f818161087f01526132fd01525f81816108b401528181610ef701528181610f4501528181611c4f0152612eed01525f81816107100152818161264f0152613c8501526157155ff3fe608060405234801561000f575f5ffd5b5060043610610388575f3560e01c80636c9d7c58116101df578063b66bd98911610109578063d7794857116100a9578063f231bd0811610079578063f231bd08146108d6578063f605ce08146106ab578063fabc1cbc146108e9578063fe4b84df146108fc575f5ffd5b8063d779485714610843578063db4df7611461087a578063dc2af692146108a1578063df5cf723146108af575f5ffd5b8063c221d8ae116100e4578063c221d8ae146107f7578063d1a83f541461080a578063d3d96ff41461081d578063d4a3fcce14610830575f5ffd5b8063b66bd989146107a7578063b9fbaed1146107ba578063ba1a84e5146107e9575f5ffd5b80638ce648541161017f578063a9333ec81161014f578063a9333ec8146106ab578063a982182114610781578063adc2e3d914610794578063b2447af7146105db575f5ffd5b80638ce648541461073257806394d7d00c1461074d578063952899ee1461075b578063957dc50b1461076e575f5ffd5b80636e875dba116101ba5780636e875dba1461056b57806379ae50cd1461043b5780637bc1ef61146106e4578063886f11951461070b575f5ffd5b80636c9d7c58146106985780636cfb4481146106ab5780636e3492b5146106d1575f5ffd5b80633dff8e7d116102c057806350feea20116102605780635ac86ab7116102305780635ac86ab7146106335780635c975abb14610656578063670d3ba21461065e57806367aeaa5314610671575f5ffd5b806350feea20146105f7578063547afb871461060a57806356c483e614610618578063595c6a671461062b575f5ffd5b80634657e26a1161029b5780634657e26a146105865780634a10ffe5146105ad5780634b5046ef146105c85780634cfd2939146105db575f5ffd5b80633dff8e7d1461053757806340120dab1461054a5780634177a87c1461056b575f5ffd5b8063261f84e01161032b5780632bab2c4a116103065780632bab2c4a146104dd578063304c10cd146104f057806332a879e4146105035780633635205714610516575f5ffd5b8063261f84e01461046e5780632981eb77146104815780632b453a9a146104bd575f5ffd5b80631352c3e6116103665780631352c3e614610403578063136439dd1461042657806315fe50281461043b578063260dc7581461045b575f5ffd5b80630b156bb61461038c5780630f3df50e146103d057806310e1b9b8146103e3575b5f5ffd5b6103b37f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b0390911681526020015b60405180910390f35b6103b36103de36600461442d565b61090f565b6103f66103f1366004614447565b610950565b6040516103c7919061448e565b6104166104113660046144c1565b610995565b60405190151581526020016103c7565b6104396104343660046144f5565b610a10565b005b61044e61044936600461450c565b610a4a565b6040516103c7919061458a565b61041661046936600461442d565b610a7a565b61043961047c3660046145dc565b610aa4565b6104a87f000000000000000000000000000000000000000000000000000000000000000081565b60405163ffffffff90911681526020016103c7565b6104d06104cb3660046146c1565b610ac3565b6040516103c79190614764565b6104d06104eb3660046147c7565b610aee565b6103b36104fe36600461450c565b610b21565b61043961051136600461484b565b610b50565b6105296105243660046148cb565b610b78565b6040516103c792919061491d565b610439610545366004614a13565b610ccd565b61055d610558366004614a5f565b610d49565b6040516103c7929190614aec565b61057961044936600461442d565b6040516103c79190614b10565b6103b37f000000000000000000000000000000000000000000000000000000000000000081565b6105bb6104cb366004614b5b565b6040516103c79190614ba2565b6104396105d636600461484b565b610d7c565b6105e961046936600461442d565b6040519081526020016103c7565b610439610605366004614be2565b610e18565b6105bb6104cb3660046145dc565b610439610626366004614c40565b610eec565b610439610fdb565b610416610641366004614c6a565b606654600160ff9092169190911b9081161490565b6066546105e9565b61041661066c3660046144c1565b610fef565b6104a87f000000000000000000000000000000000000000000000000000000000000000081565b6104396106a6366004614c8a565b611019565b6106b961066c366004614a5f565b6040516001600160401b0390911681526020016103c7565b6104396106df366004614ccb565b6110af565b6104a87f000000000000000000000000000000000000000000000000000000000000000081565b6103b37f000000000000000000000000000000000000000000000000000000000000000081565b6107406104cb366004614cfc565b6040516103c79190614d3f565b6105bb6104eb366004614d51565b610439610769366004614da8565b61146a565b61043961077c366004614f51565b6118fb565b61043961078f366004614fe1565b611b86565b6104396107a236600461505f565b611c1b565b6104396107b5366004614be2565b611f47565b6107cd6107c836600461450c565b612084565b60408051921515835263ffffffff9091166020830152016103c7565b6105e961046936600461450c565b6105796108053660046144c1565b61211e565b6104396108183660046150a1565b612149565b61043961082b366004614a5f565b612262565b6103b361083e36600461442d565b612372565b61085661085136600461442d565b6123f9565b604080516001600160a01b03909316835263ffffffff9091166020830152016103c7565b6103b37f000000000000000000000000000000000000000000000000000000000000000081565b61041661046936600461450c565b6103b37f000000000000000000000000000000000000000000000000000000000000000081565b6104166108e436600461442d565b612429565b6104396108f73660046144f5565b612448565b61043961090a3660046144f5565b6124b5565b5f5f60a65f61091d856125c6565b815260208101919091526040015f20546001600160a01b0316905080156109445780610949565b620e16e45b9392505050565b604080516060810182525f80825260208201819052918101919091526109497f0000000000000000000000000000000000000000000000000000000000000000612629565b6001600160a01b0382165f908152609e602052604081208190816109b8856125c6565b815260208082019290925260409081015f2081518083019092525460ff8116151580835261010090910463ffffffff1692820192909252915080610a065750806020015163ffffffff164311155b9150505b92915050565b610a1861263a565b6066548181168114610a3d5760405163c61dca5d60e01b815260040160405180910390fd5b610a46826126dd565b5050565b6060610a757f0000000000000000000000000000000000000000000000000000000000000000612629565b919050565b5f610a757f0000000000000000000000000000000000000000000000000000000000000000612629565b82610aae8161271a565b610abd84610545858588612743565b50505050565b60606109497f0000000000000000000000000000000000000000000000000000000000000000612629565b6060610b197f0000000000000000000000000000000000000000000000000000000000000000612629565b949350505050565b6001600160a01b038082165f908152609760205260408120549091168015610b495780610949565b5090919050565b84610b5a8161271a565b610b7086610b6987878a612743565b8585612149565b505050505050565b5f60606001610b86816128ba565b5f6040518060400160405280876001600160a01b03168152602001866020016020810190610bb49190615100565b63ffffffff1690529050610bcb6060860186615119565b9050610bda6040870187615119565b905014610bfa576040516343714afd60e01b815260040160405180910390fd5b60208082015182516001600160a01b03165f90815260989092526040909120610c2c9163ffffffff908116906128e516565b610c4957604051631fb1705560e21b815260040160405180910390fd5b610c5f610c59602087018761450c565b82610995565b610c7c5760405163ebbff49760e01b815260040160405180910390fd5b610c8581612372565b6001600160a01b0316336001600160a01b031614610cb6576040516348f5c3ed60e01b815260040160405180910390fd5b610cc085826128fc565b9350935050509250929050565b81610cd78161271a565b6001600160a01b0383165f90815260a4602052604090205460ff16610d0f576040516348f7dbb960e01b815260040160405180910390fd5b5f5b8251811015610abd57610d4184848381518110610d3057610d3061515e565b6020026020010151620e16e4613057565b600101610d11565b606080610d757f0000000000000000000000000000000000000000000000000000000000000000612629565b9250929050565b5f610d86816128ba565b838214610da6576040516343714afd60e01b815260040160405180910390fd5b5f5b84811015610e0f57610e0787878784818110610dc657610dc661515e565b9050602002016020810190610ddb919061450c565b868685818110610ded57610ded61515e565b9050602002016020810190610e029190615172565b6131c9565b600101610da8565b50505050505050565b83610e228161271a565b6040805180820182526001600160a01b03871680825263ffffffff80881660208085018290525f93845260989052939091209192610e6192916128e516565b610e7e57604051631fb1705560e21b815260040160405180910390fd5b5f5b83811015610e0f57610ee482868684818110610e9e57610e9e61515e565b9050602002016020810190610eb3919061450c565b610edf60405180604001604052808c6001600160a01b031681526020018b63ffffffff16815250612429565b6132cd565b600101610e80565b336001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000161480610fcb57610f268361271a565b6040516336b87bd760e11b81526001600160a01b0384811660048301527f00000000000000000000000000000000000000000000000000000000000000001690636d70f7ae90602401602060405180830381865afa158015610f8a573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610fae9190615193565b610fcb5760405163ccea9e6f60e01b815260040160405180910390fd5b610fd68383836133ad565b505050565b610fe361263a565b610fed5f196126dd565b565b5f610a0a7f0000000000000000000000000000000000000000000000000000000000000000612629565b81516110248161271a565b60208084015184516001600160a01b03165f908152609890925260409091206110569163ffffffff908116906128e516565b61107357604051631fb1705560e21b815260040160405180910390fd5b5f61107d84612372565b6001600160a01b0316036110a45760405163255b0f4160e01b815260040160405180910390fd5b610fd683835f613589565b60026110ba816128ba565b6110cf6110ca602084018461450c565b61378a565b806110e857506110e86110ca604084016020850161450c565b611105576040516348f5c3ed60e01b815260040160405180910390fd5b5f5b6111146040840184615119565b90508110156113d6575f604051806040016040528085602001602081019061113c919061450c565b6001600160a01b031681526020016111576040870187615119565b858181106111675761116761515e565b905060200201602081019061117c9190615100565b63ffffffff1681525090506111c9816020015163ffffffff1660985f8760200160208101906111ab919061450c565b6001600160a01b0316815260208101919091526040015f20906128e5565b6111e657604051631fb1705560e21b815260040160405180910390fd5b609e5f6111f6602087018761450c565b6001600160a01b03166001600160a01b031681526020019081526020015f205f61121f836125c6565b815260208101919091526040015f205460ff1661124f576040516325131d4f60e01b815260040160405180910390fd5b61128961125b826125c6565b609c5f61126b602089018961450c565b6001600160a01b0316815260208101919091526040015f2090613833565b506112c161129a602086018661450c565b609a5f6112a6856125c6565b81526020019081526020015f2061383e90919063ffffffff16565b506112cf602085018561450c565b6001600160a01b03167fad34c3070be1dffbcaa499d000ba2b8d9848aefcac3059df245dd95c4ece14fe8260405161130791906151b2565b60405180910390a2604080518082019091525f81526020810161134a7f0000000000000000000000000000000000000000000000000000000000000000436151d4565b63ffffffff169052609e5f611362602088018861450c565b6001600160a01b03166001600160a01b031681526020019081526020015f205f61138b846125c6565b81526020808201929092526040015f2082518154939092015163ffffffff166101000264ffffffff00199215159290921664ffffffffff199093169290921717905550600101611107565b506113ea6104fe604084016020850161450c565b6001600160a01b031663303ca956611405602085018561450c565b611415604086016020870161450c565b6114226040870187615119565b6040518563ffffffff1660e01b81526004016114419493929190615229565b5f604051808303815f87803b158015611458575f5ffd5b505af1158015610b70573d5f5f3e3d5ffd5b5f611474816128ba565b61147d8361271a565b5f5f5f61148986612084565b91509150816114ab5760405163fa55fc8160e01b815260040160405180910390fd5b91505f90505b83518110156118f4578381815181106114cc576114cc61515e565b602002602001015160400151518482815181106114eb576114eb61515e565b6020026020010151602001515114611516576040516343714afd60e01b815260040160405180910390fd5b5f8482815181106115295761152961515e565b602090810291909101810151518082015181516001600160a01b03165f908152609890935260409092209092506115699163ffffffff908116906128e516565b61158657604051631fb1705560e21b815260040160405180910390fd5b5f6115918783610995565b90505f5b8684815181106115a7576115a761515e565b602002602001015160200151518110156118e9575f8785815181106115ce576115ce61515e565b60200260200101516020015182815181106115eb576115eb61515e565b60200260200101519050611602898261ffff6131c9565b5f5f6116178b611611886125c6565b85613852565b91509150806040015163ffffffff165f1461164557604051630d8fcbe360e41b815260040160405180910390fd5b5f611652878584896139be565b9050611697825f01518c8a8151811061166d5761166d61515e565b602002602001015160400151878151811061168a5761168a61515e565b60200260200101516139f6565b600f0b602083018190525f036116c057604051634606179360e11b815260040160405180910390fd5b5f8260200151600f0b1215611804578015611786576117416116e1886125c6565b6001600160a01b03808f165f90815260a360209081526040808320938a16835292905220908154600160801b90819004600f0b5f818152600180860160205260409091209390935583546001600160801b03908116939091011602179055565b61176b7f0000000000000000000000000000000000000000000000000000000000000000436151d4565b6117769060016151d4565b63ffffffff166040830152611871565b61179883602001518360200151613a0d565b6001600160401b031660208401528a518b90899081106117ba576117ba61515e565b60200260200101516040015185815181106117d7576117d761515e565b6020908102919091018101516001600160401b031683525f9083015263ffffffff43166040830152611871565b5f8260200151600f0b13156118715761182583602001518360200151613a0d565b6001600160401b03908116602085018190528451909116101561185b57604051636c9be0bf60e01b815260040160405180910390fd5b61186589436151d4565b63ffffffff1660408301525b6118868c61187e896125c6565b868686613a2c565b7f1487af5418c47ee5ea45ef4a93398668120890774a9e13487e61e9dc3baf76dd8c88866118bb865f01518760200151613a0d565b86604001516040516118d1959493929190615255565b60405180910390a15050600190920191506115959050565b5050506001016114b1565b5050505050565b5f5b8151811015610a465761197a82828151811061191b5761191b61515e565b60200260200101516020015163ffffffff1660985f8585815181106119425761194261515e565b60200260200101515f01516001600160a01b03166001600160a01b031681526020019081526020015f206128e590919063ffffffff16565b15611b7e575f6001600160a01b03166119ab83838151811061199e5761199e61515e565b6020026020010151612372565b6001600160a01b031603611b7e575f7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663fddbdefd8484815181106119fb576119fb61515e565b6020908102919091010151516040516001600160e01b031960e084901b1681526001600160a01b039091166004820152306024820152633635205760e01b60448201526064015f60405180830381865afa158015611a5b573d5f5f3e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052611a8291908101906152a6565b90505f81515f1480611abe57505f6001600160a01b0316825f81518110611aab57611aab61515e565b60200260200101516001600160a01b0316145b15611ae757838381518110611ad557611ad561515e565b60200260200101515f01519050611b04565b815f81518110611af957611af961515e565b602002602001015190505b611b29848481518110611b1957611b1961515e565b6020026020010151826001613589565b7ff0c8fc7d71f647bd3a88ac369112517f6a4b8038e71913f2d20f71f877dfc725848481518110611b5c57611b5c61515e565b602002602001015182604051611b73929190615335565b60405180910390a150505b6001016118fd565b82611b908161271a565b6001600160a01b0384165f90815260a4602052604090205460ff16611bd2576001600160a01b0384165f90815260a460205260409020805460ff191660011790555b836001600160a01b03167fa89c1dc243d8908a96dd84944bcc97d6bc6ac00dd78e20621576be6a3c9437138484604051611c0d929190615383565b60405180910390a250505050565b6002611c26816128ba565b82611c308161271a565b6040516336b87bd760e11b81526001600160a01b0385811660048301527f00000000000000000000000000000000000000000000000000000000000000001690636d70f7ae90602401602060405180830381865afa158015611c94573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611cb89190615193565b611cd55760405163ccea9e6f60e01b815260040160405180910390fd5b5f5b611ce46020850185615119565b9050811015611eac57604080518082019091525f9080611d07602088018861450c565b6001600160a01b03168152602001868060200190611d259190615119565b85818110611d3557611d3561515e565b9050602002016020810190611d4a9190615100565b63ffffffff90811690915260208083015183516001600160a01b03165f90815260989092526040909120929350611d869291908116906128e516565b611da357604051631fb1705560e21b815260040160405180910390fd5b611dad8682610995565b15611dcb57604051636c6c6e2760e11b815260040160405180910390fd5b611df4611dd7826125c6565b6001600160a01b0388165f908152609c6020526040902090613c64565b50611e2086609a5f611e05856125c6565b81526020019081526020015f20613c6f90919063ffffffff16565b50856001600160a01b03167f43232edf9071753d2321e5fa7e018363ee248e5f2142e6c08edd3265bfb4895e82604051611e5a91906151b2565b60405180910390a26001600160a01b0386165f908152609e60205260408120600191611e85846125c6565b815260208101919091526040015f20805460ff191691151591909117905550600101611cd7565b50611ebd6104fe602085018561450c565b6001600160a01b031663c63fd50285611ed9602087018761450c565b611ee66020880188615119565b611ef360408a018a615396565b6040518763ffffffff1660e01b8152600401611f14969594939291906153d8565b5f604051808303815f87803b158015611f2b575f5ffd5b505af1158015611f3d573d5f5f3e3d5ffd5b5050505050505050565b83611f518161271a565b6040805180820182526001600160a01b03871680825263ffffffff80881660208085018290525f93845260989052939091209192611f9092916128e516565b611fad57604051631fb1705560e21b815260040160405180910390fd5b5f611fb7826125c6565b90505f5b84811015611f3d57612000868683818110611fd857611fd861515e565b9050602002016020810190611fed919061450c565b5f8481526099602052604090209061383e565b61201d576040516331bc342760e11b815260040160405180910390fd5b7f7b4b073d80dcac55a11177d8459ad9f664ceeb91f71f27167bb14f8152a7eeee838787848181106120515761205161515e565b9050602002016020810190612066919061450c565b604051612074929190615335565b60405180910390a1600101611fbb565b6001600160a01b0381165f908152609b602090815260408083208151608081018352905463ffffffff80821680845260ff600160201b8404161515958401869052650100000000008304821694840194909452600160481b9091041660608201819052849391929190158015906121055750826060015163ffffffff164310155b15612114575050604081015160015b9590945092505050565b6060610a0a7f0000000000000000000000000000000000000000000000000000000000000000612629565b836121538161271a565b83518214612174576040516343714afd60e01b815260040160405180910390fd5b6001600160a01b0385165f90815260a4602052604090205460ff166121ac576040516348f7dbb960e01b815260040160405180910390fd5b5f5b8451811015610b70575f8484838181106121ca576121ca61515e565b90506020020160208101906121df919061450c565b90506001600160a01b038116612208576040516339b190bb60e11b815260040160405180910390fd5b620e16e3196001600160a01b03821601612235576040516364be1a3f60e11b815260040160405180910390fd5b6122598787848151811061224b5761224b61515e565b602002602001015183613057565b506001016121ae565b8161226c8161271a565b60405163b526578760e01b81526001600160a01b03848116600483015283169063b526578790602401602060405180830381865afa1580156122b0573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906122d49190615193565b6122f157604051631d0b13c160e31b815260040160405180910390fd5b6001600160a01b038381165f90815260976020526040902080546001600160a01b0319169184169190911790557f2ae945c40c44dc0ec263f95609c3fdc6952e0aefa22d6374e44f2c997acedf858361234981610b21565b604080516001600160a01b039384168152929091166020830152015b60405180910390a1505050565b5f5f60a75f612380856125c6565b815260208082019290925260409081015f20815160608101835281546001600160a01b0390811680835260019093015490811694820194909452600160a01b90930463ffffffff16918301829052919250158015906123e95750816040015163ffffffff164310155b1561094957506020015192915050565b5f5f6124247f0000000000000000000000000000000000000000000000000000000000000000612629565b915091565b5f620e16e46124378361090f565b6001600160a01b0316141592915050565b612450613c83565b606654801982198116146124775760405163c61dca5d60e01b815260040160405180910390fd5b606682905560405182815233907f3582d1828e26bf56bd801502bc021ac0bc8afb57c826e4986b45593c8fad389c9060200160405180910390a25050565b5f54610100900460ff16158080156124d357505f54600160ff909116105b806124ec5750303b1580156124ec57505f5460ff166001145b6125545760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b60648201526084015b60405180910390fd5b5f805460ff191660011790558015612575575f805461ff0019166101001790555b61257e826126dd565b8015610a46575f805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15050565b5f815f0151826020015163ffffffff1660405160200161261192919060609290921b6bffffffffffffffffffffffff1916825260a01b6001600160a01b031916601482015260200190565b604051602081830303815290604052610a0a90615424565b613d3480610fd68363ffffffff8316565b60405163237dfb4760e11b81523360048201527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906346fbf68e90602401602060405180830381865afa15801561269c573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906126c09190615193565b610fed57604051631d77d47760e21b815260040160405180910390fd5b606681905560405181815233907fab40a374bc51de372200a8bc981af8c9ecdc08dfdaef0bb6e09f88f3c616ef3d9060200160405180910390a250565b6127238161378a565b6127405760405163932d94f760e01b815260040160405180910390fd5b50565b60605f836001600160401b0381111561275e5761275e61433d565b6040519080825280602002602001820160405280156127c057816020015b6127ad60405180606001604052805f63ffffffff168152602001606081526020015f6001600160a01b031681525090565b81526020019060019003908161277c5790505b5090505f5b848110156128b15760405180606001604052808787848181106127ea576127ea61515e565b90506020028101906127fc9190615447565b61280a906020810190615100565b63ffffffff1681526020018787848181106128275761282761515e565b90506020028101906128399190615447565b612847906020810190615119565b808060200260200160405190810160405280939291908181526020018383602002808284375f920191909152505050908252506001600160a01b038616602090910152825183908390811061289e5761289e61515e565b60209081029190910101526001016127c5565b50949350505050565b606654600160ff83161b908116036127405760405163840a48d560e01b815260040160405180910390fd5b5f8181526001830160205260408120541515610949565b5f60608161290d6040860186615119565b90506001600160401b038111156129265761292661433d565b60405190808252806020026020018201604052801561294f578160200160208202803683370190505b50905061295f6040860186615119565b90506001600160401b038111156129785761297861433d565b6040519080825280602002602001820160405280156129a1578160200160208202803683370190505b50915060a55f6129b0866125c6565b81526020019081526020015f205f81546129c990615465565b918290555092505f5b6129df6040870187615119565b9050811015612fe957801580612a7257506129fd6040870187615119565b612a0860018461547d565b818110612a1757612a1761515e565b9050602002016020810190612a2c919061450c565b6001600160a01b0316612a426040880188615119565b83818110612a5257612a5261515e565b9050602002016020810190612a67919061450c565b6001600160a01b0316115b612a8f57604051639f1c805360e01b815260040160405180910390fd5b612a9c6060870187615119565b82818110612aac57612aac61515e565b905060200201355f108015612aec5750670de0b6b3a7640000612ad26060880188615119565b83818110612ae257612ae261515e565b9050602002013511155b612b0957604051631353603160e01b815260040160405180910390fd5b612b65612b196040880188615119565b83818110612b2957612b2961515e565b9050602002016020810190612b3e919061450c565b60995f612b4a896125c6565b81526020019081526020015f20613d5290919063ffffffff16565b612b82576040516331bc342760e11b815260040160405180910390fd5b5f80612bd4612b9460208a018a61450c565b612b9d896125c6565b612baa60408c018c615119565b87818110612bba57612bba61515e565b9050602002016020810190612bcf919061450c565b613852565b805191935091506001600160401b03165f03612bf1575050612fe1565b5f612c2c612c0260608b018b615119565b86818110612c1257612c1261515e565b85516001600160401b031692602090910201359050613d73565b8351909150612c476001600160401b03808416908316613d89565b868681518110612c5957612c5961515e565b60200260200101818152505081835f01818151612c769190615490565b6001600160401b0316905250835182908590612c93908390615490565b6001600160401b0316905250602084018051839190612cb3908390615490565b6001600160401b031690525060208301515f600f9190910b1215612dcb575f612d16612ce260608d018d615119565b88818110612cf257612cf261515e565b905060200201358560200151612d07906154af565b6001600160801b031690613d73565b9050806001600160401b031684602001818151612d3391906154d3565b600f0b9052507f1487af5418c47ee5ea45ef4a93398668120890774a9e13487e61e9dc3baf76dd612d6760208d018d61450c565b8b612d7560408f018f615119565b8a818110612d8557612d8561515e565b9050602002016020810190612d9a919061450c565b612dab885f01518960200151613a0d565b8860400151604051612dc1959493929190615255565b60405180910390a1505b612e1d612ddb60208c018c61450c565b612de48b6125c6565b612df160408e018e615119565b89818110612e0157612e0161515e565b9050602002016020810190612e16919061450c565b8787613a2c565b7f1487af5418c47ee5ea45ef4a93398668120890774a9e13487e61e9dc3baf76dd612e4b60208c018c61450c565b8a612e5960408e018e615119565b89818110612e6957612e6961515e565b9050602002016020810190612e7e919061450c565b8651604051612e9294939291904390615255565b60405180910390a1612ee3612eaa60208c018c61450c565b612eb760408d018d615119565b88818110612ec757612ec761515e565b9050602002016020810190612edc919061450c565b8651613d9d565b6001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016635ae679a7612f1f60208d018d61450c565b8b8b8e8060400190612f319190615119565b8b818110612f4157612f4161515e565b9050602002016020810190612f56919061450c565b89516040516001600160e01b031960e088901b168152612f7e95949392918991600401615500565b6020604051808303815f875af1158015612f9a573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612fbe9190615553565b878681518110612fd057612fd061515e565b602002602001018181525050505050505b6001016129d2565b507f80969ad29428d6797ee7aad084f9e4a42a82fc506dcd2ca3b6fb431f85ccebe5613018602087018761450c565b856130266040890189615119565b8561303460808c018c615396565b604051613047979695949392919061556a565b60405180910390a1509250929050565b6040805180820182526001600160a01b038516808252845163ffffffff90811660208085018290525f938452609890529390912091926130989291613c6416565b6130b557604051631fb1705560e21b815260040160405180910390fd5b7f31629285ead2335ae0933f86ed2ae63321f7af77b4e6eaabc42c057880977e6c816040516130e491906151b2565b60405180910390a16001600160a01b038216620e16e414801590613179578260a65f61310f856125c6565b81526020019081526020015f205f6101000a8154816001600160a01b0302191690836001600160a01b031602179055507f90a6fa2a9b79b910872ebca540cf3bd8be827f586e6420c30d8836e30012907e8284604051613170929190615335565b60405180910390a15b5f5b8460200151518110156131b8576131b083866020015183815181106131a2576131a261515e565b6020026020010151846132cd565b60010161317b565b506118f48285604001516001613589565b6001600160a01b038381165f90815260a360209081526040808320938616835292905290812054600f81810b600160801b909204900b035b5f8111801561321357508261ffff1682105b156118f4576001600160a01b038086165f90815260a360209081526040808320938816835292905290812061324790613e1f565b90505f5f613256888489613852565b91509150806040015163ffffffff16431015613274575050506118f4565b6132818884898585613a2c565b6001600160a01b038089165f90815260a360209081526040808320938b168352929052206132ae90613e71565b506132b885615465565b94506132c384615600565b9350505050613201565b801561334f576001600160a01b03821673beac0eeeeeeeeeeeeeeeeeeeeeeeeeeeeeebeac01480159061333257507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316826001600160a01b031614155b61334f57604051632711b74d60e11b815260040160405180910390fd5b61335f8260995f611e05876125c6565b61337c5760405163585cfb2f60e01b815260040160405180910390fd5b7f7ab260fe0af193db5f4986770d831bda4ea46099dc817e8b6716dcae8af8e88b8383604051612365929190615335565b6001600160a01b0383165f908152609b60209081526040918290208251608081018452905463ffffffff808216835260ff600160201b830416151593830193909352650100000000008104831693820193909352600160481b9092041660608201819052158015906134295750806060015163ffffffff164310155b1561344357604081015163ffffffff168152600160208201525b63ffffffff8316604082015281156134725763ffffffff808416825260016020830152431660608201526134b3565b61349c7f0000000000000000000000000000000000000000000000000000000000000000436151d4565b6134a79060016151d4565b63ffffffff1660608201525b6001600160a01b0384165f818152609b60209081526040918290208451815486840151878601516060808a015163ffffffff95861664ffffffffff1990951694909417600160201b93151593909302929092176cffffffffffffffff0000000000191665010000000000918516919091026cffffffff000000000000000000191617600160481b92841692830217909355845195865290881692850192909252918301527f4e85751d6331506c6c62335f207eb31f12a61e570f34f5c17640308785c6d4db91015b60405180910390a150505050565b6001600160a01b0382166135b0576040516339b190bb60e11b815260040160405180910390fd5b5f60a75f6135bd866125c6565b815260208082019290925260409081015f20815160608101835281546001600160a01b03908116825260019092015491821693810193909352600160a01b900463ffffffff16908201819052909150158015906136245750806040015163ffffffff164310155b1561363a5760208101516001600160a01b031681525b80602001516001600160a01b0316836001600160a01b03161480156136685750806040015163ffffffff1643105b156136735750505050565b6001600160a01b038316602082015281156136a5576001600160a01b038316815263ffffffff431660408201526136e6565b6136cf7f0000000000000000000000000000000000000000000000000000000000000000436151d4565b6136da9060016151d4565b63ffffffff1660408201525b8060a75f6136f3876125c6565b815260208082019290925260409081015f20835181546001600160a01b039182166001600160a01b031990911617825592840151600190910180549483015163ffffffff16600160a01b026001600160c01b031990951691909316179290921790558181015190517f3873f29d7a65a4d75f5ba28909172f486216a1420e77c3c2720815951a6b4f579161357b9187918791615615565b604051631beb2b9760e31b81526001600160a01b0382811660048301523360248301523060448301525f80356001600160e01b0319166064840152917f00000000000000000000000000000000000000000000000000000000000000009091169063df595cb890608401602060405180830381865afa15801561380f573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610a0a9190615193565b5f6109498383613eee565b5f610949836001600160a01b038416613eee565b6040805180820182525f80825260208083018290528351606081018552828152808201839052808501839052845180860186526001600160a01b03898116855260a18452868520908816855290925293822092939281906138b290613fd1565b6001600160401b0390811682526001600160a01b038981165f81815260a260209081526040808320948c168084529482528083205486169682019690965291815260a082528481208b8252825284812092815291815290839020835160608101855290549283168152600160401b8304600f0b91810191909152600160c01b90910463ffffffff169181018290529192504310156139545790925090506139b6565b613965815f01518260200151613a0d565b6001600160401b0316815260208101515f600f9190910b12156139a35761399482602001518260200151613a0d565b6001600160401b031660208301525b5f60408201819052602082015290925090505b935093915050565b5f6139cf8460995f612b4a896125c6565b80156139d85750815b80156139ed575082516001600160401b031615155b95945050505050565b5f6109496001600160401b03808516908416615648565b5f610949613a24836001600160401b0386166154d3565b600f0b613fe4565b6020808301516001600160a01b038088165f90815260a284526040808220928816825291909352909120546001600160401b03908116911614613af257602082810180516001600160a01b038881165f81815260a286526040808220938a1680835293875290819020805467ffffffffffffffff19166001600160401b0395861617905593518451918252948101919091529216908201527facf9095feb3a370c9cf692421c69ef320d4db5c66e6a7d29c7694eb02364fc559060600160405180910390a15b6001600160a01b038086165f90815260a060209081526040808320888452825280832093871683529281529082902083518154928501519385015163ffffffff16600160c01b0263ffffffff60c01b196001600160801b038616600160401b026001600160c01b03199095166001600160401b03909316929092179390931716919091179055600f0b15613bd4576001600160a01b0385165f908152609f602090815260408083208784529091529020613bac9084613c6f565b506001600160a01b0385165f908152609d60205260409020613bce9085613c64565b506118f4565b80516001600160401b03165f036118f4576001600160a01b0385165f908152609f602090815260408083208784529091529020613c11908461383e565b506001600160a01b0385165f908152609f602090815260408083208784529091529020613c3d9061404f565b5f036118f4576001600160a01b0385165f908152609d60205260409020610b709085613833565b5f6109498383614058565b5f610949836001600160a01b038416614058565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663eab66d7a6040518163ffffffff1660e01b8152600401602060405180830381865afa158015613cdf573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190613d039190615675565b6001600160a01b0316336001600160a01b031614610fed5760405163794821ff60e01b815260040160405180910390fd5b365f5f375f5f365f845af43d5f5f3e808015613d4e573d5ff35b3d5ffd5b6001600160a01b0381165f9081526001830160205260408120541515610949565b5f6109498383670de0b6b3a764000060016140a4565b5f61094983670de0b6b3a7640000846140fd565b6001600160a01b038084165f90815260a160209081526040808320938616835292905220613dcc9043836141e2565b604080516001600160a01b038086168252841660208201526001600160401b038316918101919091527f1c6458079a41077d003c11faf9bf097e693bd67979e4e6500bac7b29db779b5c90606001612365565b5f613e398254600f81810b600160801b909204900b131590565b15613e5757604051631ed9509560e11b815260040160405180910390fd5b508054600f0b5f9081526001909101602052604090205490565b5f613e8b8254600f81810b600160801b909204900b131590565b15613ea957604051631ed9509560e11b815260040160405180910390fd5b508054600f0b5f818152600180840160205260408220805492905583546fffffffffffffffffffffffffffffffff191692016001600160801b03169190911790915590565b5f8181526001830160205260408120548015613fc8575f613f1060018361547d565b85549091505f90613f239060019061547d565b9050818114613f82575f865f018281548110613f4157613f4161515e565b905f5260205f200154905080875f018481548110613f6157613f6161515e565b5f918252602080832090910192909255918252600188019052604090208390555b8554869080613f9357613f93615690565b600190038181905f5260205f20015f90559055856001015f8681526020019081526020015f205f905560019350505050610a0a565b5f915050610a0a565b5f610a0a82670de0b6b3a76400006141f6565b5f6001600160401b0382111561404b5760405162461bcd60e51b815260206004820152602660248201527f53616665436173743a2076616c756520646f65736e27742066697420696e203660448201526534206269747360d01b606482015260840161254b565b5090565b5f610a0a825490565b5f81815260018301602052604081205461409d57508154600181810184555f848152602080822090930184905584548482528286019093526040902091909155610a0a565b505f610a0a565b5f5f6140b18686866140fd565b905060018360028111156140c7576140c76156a4565b1480156140e357505f84806140de576140de6156b8565b868809115b156139ed576140f36001826156cc565b9695505050505050565b5f80805f19858709858702925082811083820303915050805f036141345783828161412a5761412a6156b8565b0492505050610949565b80841161417b5760405162461bcd60e51b81526020600482015260156024820152744d6174683a206d756c446976206f766572666c6f7760581b604482015260640161254b565b5f8486880960026001871981018816978890046003810283188082028403028082028403028082028403028082028403028082028403029081029092039091025f889003889004909101858311909403939093029303949094049190911702949350505050565b610fd683836001600160401b03841661423a565b81545f9080156142325761421c8461420f60018461547d565b5f91825260209091200190565b54600160201b90046001600160e01b0316610a06565b509092915050565b825480156142f0575f6142528561420f60018561547d565b60408051808201909152905463ffffffff808216808452600160201b9092046001600160e01b0316602084015291925090851610156142a45760405163151b8e3f60e11b815260040160405180910390fd5b805163ffffffff8086169116036142ee57826142c58661420f60018661547d565b80546001600160e01b0392909216600160201b0263ffffffff9092169190911790555050505050565b505b506040805180820190915263ffffffff92831681526001600160e01b03918216602080830191825285546001810187555f968752952091519051909216600160201b029190921617910155565b634e487b7160e01b5f52604160045260245ffd5b604051606081016001600160401b03811182821017156143735761437361433d565b60405290565b604051601f8201601f191681016001600160401b03811182821017156143a1576143a161433d565b604052919050565b6001600160a01b0381168114612740575f5ffd5b803563ffffffff81168114610a75575f5ffd5b5f604082840312156143e0575f5ffd5b604080519081016001600160401b03811182821017156144025761440261433d565b6040529050808235614413816143a9565b8152614421602084016143bd565b60208201525092915050565b5f6040828403121561443d575f5ffd5b61094983836143d0565b5f5f5f60808486031215614459575f5ffd5b8335614464816143a9565b925061447385602086016143d0565b91506060840135614483816143a9565b809150509250925092565b81516001600160401b03168152602080830151600f0b9082015260408083015163ffffffff169082015260608101610a0a565b5f5f606083850312156144d2575f5ffd5b82356144dd816143a9565b91506144ec84602085016143d0565b90509250929050565b5f60208284031215614505575f5ffd5b5035919050565b5f6020828403121561451c575f5ffd5b8135610949816143a9565b80516001600160a01b0316825260209081015163ffffffff16910152565b5f8151808452602084019350602083015f5b828110156145805761456a868351614527565b6040959095019460209190910190600101614557565b5093949350505050565b602081525f6109496020830184614545565b5f5f83601f8401126145ac575f5ffd5b5081356001600160401b038111156145c2575f5ffd5b6020830191508360208260051b8501011115610d75575f5ffd5b5f5f5f604084860312156145ee575f5ffd5b83356145f9816143a9565b925060208401356001600160401b03811115614613575f5ffd5b61461f8682870161459c565b9497909650939450505050565b5f6001600160401b038211156146445761464461433d565b5060051b60200190565b5f82601f83011261465d575f5ffd5b813561467061466b8261462c565b614379565b8082825260208201915060208360051b860101925085831115614691575f5ffd5b602085015b838110156146b75780356146a9816143a9565b835260209283019201614696565b5095945050505050565b5f5f5f608084860312156146d3575f5ffd5b6146dd85856143d0565b925060408401356001600160401b038111156146f7575f5ffd5b6147038682870161464e565b92505060608401356001600160401b0381111561471e575f5ffd5b61472a8682870161464e565b9150509250925092565b5f8151808452602084019350602083015f5b82811015614580578151865260209586019590910190600101614746565b5f602082016020835280845180835260408501915060408160051b8601019250602086015f5b828110156147bb57603f198786030184526147a6858351614734565b9450602093840193919091019060010161478a565b50929695505050505050565b5f5f5f5f60a085870312156147da575f5ffd5b6147e486866143d0565b935060408501356001600160401b038111156147fe575f5ffd5b61480a8782880161464e565b93505060608501356001600160401b03811115614825575f5ffd5b6148318782880161464e565b925050614840608086016143bd565b905092959194509250565b5f5f5f5f5f6060868803121561485f575f5ffd5b853561486a816143a9565b945060208601356001600160401b03811115614884575f5ffd5b6148908882890161459c565b90955093505060408601356001600160401b038111156148ae575f5ffd5b6148ba8882890161459c565b969995985093965092949392505050565b5f5f604083850312156148dc575f5ffd5b82356148e7816143a9565b915060208301356001600160401b03811115614901575f5ffd5b830160a08186031215614912575f5ffd5b809150509250929050565b828152604060208201525f610b196040830184614734565b5f82601f830112614944575f5ffd5b813561495261466b8261462c565b8082825260208201915060208360051b860101925085831115614973575f5ffd5b602085015b838110156146b75780356001600160401b03811115614995575f5ffd5b86016060818903601f190112156149aa575f5ffd5b6149b2614351565b6149be602083016143bd565b815260408201356001600160401b038111156149d8575f5ffd5b6149e78a60208386010161464e565b602083015250606082013591506149fd826143a9565b6040810191909152835260209283019201614978565b5f5f60408385031215614a24575f5ffd5b8235614a2f816143a9565b915060208301356001600160401b03811115614a49575f5ffd5b614a5585828601614935565b9150509250929050565b5f5f60408385031215614a70575f5ffd5b8235614a7b816143a9565b91506020830135614912816143a9565b5f8151808452602084019350602083015f5b8281101561458057614ad686835180516001600160401b03168252602080820151600f0b9083015260409081015163ffffffff16910152565b6060959095019460209190910190600101614a9d565b604081525f614afe6040830185614545565b82810360208401526139ed8185614a8b565b602080825282518282018190525f918401906040840190835b81811015614b505783516001600160a01b0316835260209384019390920191600101614b29565b509095945050505050565b5f5f5f60408486031215614b6d575f5ffd5b83356001600160401b03811115614b82575f5ffd5b614b8e8682870161459c565b9094509250506020840135614483816143a9565b602080825282518282018190525f918401906040840190835b81811015614b505783516001600160401b0316835260209384019390920191600101614bbb565b5f5f5f5f60608587031215614bf5575f5ffd5b8435614c00816143a9565b9350614c0e602086016143bd565b925060408501356001600160401b03811115614c28575f5ffd5b614c348782880161459c565b95989497509550505050565b5f5f60408385031215614c51575f5ffd5b8235614c5c816143a9565b91506144ec602084016143bd565b5f60208284031215614c7a575f5ffd5b813560ff81168114610949575f5ffd5b5f5f60608385031215614c9b575f5ffd5b614ca584846143d0565b91506040830135614912816143a9565b5f60608284031215614cc5575f5ffd5b50919050565b5f60208284031215614cdb575f5ffd5b81356001600160401b03811115614cf0575f5ffd5b610a0684828501614cb5565b5f5f5f60808486031215614d0e575f5ffd5b83356001600160401b03811115614d23575f5ffd5b614d2f8682870161464e565b93505061447385602086016143d0565b602081525f6109496020830184614a8b565b5f5f5f5f60608587031215614d64575f5ffd5b8435614d6f816143a9565b935060208501356001600160401b03811115614d89575f5ffd5b614d958782880161459c565b90945092506148409050604086016143bd565b5f5f60408385031215614db9575f5ffd5b8235614dc4816143a9565b915060208301356001600160401b03811115614dde575f5ffd5b8301601f81018513614dee575f5ffd5b8035614dfc61466b8261462c565b8082825260208201915060208360051b850101925087831115614e1d575f5ffd5b602084015b83811015614f425780356001600160401b03811115614e3f575f5ffd5b85016080818b03601f19011215614e54575f5ffd5b614e5c614351565b614e698b602084016143d0565b815260608201356001600160401b03811115614e83575f5ffd5b614e928c60208386010161464e565b60208301525060808201356001600160401b03811115614eb0575f5ffd5b6020818401019250508a601f830112614ec7575f5ffd5b8135614ed561466b8261462c565b8082825260208201915060208360051b86010192508d831115614ef6575f5ffd5b6020850194505b82851015614f2c5784356001600160401b0381168114614f1b575f5ffd5b825260209485019490910190614efd565b6040840152505084525060209283019201614e22565b50809450505050509250929050565b5f60208284031215614f61575f5ffd5b81356001600160401b03811115614f76575f5ffd5b8201601f81018413614f86575f5ffd5b8035614f9461466b8261462c565b8082825260208201915060208360061b850101925086831115614fb5575f5ffd5b6020840193505b828410156140f357614fce87856143d0565b8252602082019150604084019350614fbc565b5f5f5f60408486031215614ff3575f5ffd5b8335614ffe816143a9565b925060208401356001600160401b03811115615018575f5ffd5b8401601f81018613615028575f5ffd5b80356001600160401b0381111561503d575f5ffd5b86602082840101111561504e575f5ffd5b939660209190910195509293505050565b5f5f60408385031215615070575f5ffd5b823561507b816143a9565b915060208301356001600160401b03811115615095575f5ffd5b614a5585828601614cb5565b5f5f5f5f606085870312156150b4575f5ffd5b84356150bf816143a9565b935060208501356001600160401b038111156150d9575f5ffd5b6150e587828801614935565b93505060408501356001600160401b03811115614c28575f5ffd5b5f60208284031215615110575f5ffd5b610949826143bd565b5f5f8335601e1984360301811261512e575f5ffd5b8301803591506001600160401b03821115615147575f5ffd5b6020019150600581901b3603821315610d75575f5ffd5b634e487b7160e01b5f52603260045260245ffd5b5f60208284031215615182575f5ffd5b813561ffff81168114610949575f5ffd5b5f602082840312156151a3575f5ffd5b81518015158114610949575f5ffd5b60408101610a0a8284614527565b634e487b7160e01b5f52601160045260245ffd5b63ffffffff8181168382160190811115610a0a57610a0a6151c0565b8183526020830192505f815f5b848110156145805763ffffffff615213836143bd565b16865260209586019591909101906001016151fd565b6001600160a01b038581168252841660208201526060604082018190525f906140f390830184866151f0565b6001600160a01b038616815260c081016152726020830187614527565b6001600160a01b039490941660608201526001600160401b0392909216608083015263ffffffff1660a09091015292915050565b5f602082840312156152b6575f5ffd5b81516001600160401b038111156152cb575f5ffd5b8201601f810184136152db575f5ffd5b80516152e961466b8261462c565b8082825260208201915060208360051b85010192508683111561530a575f5ffd5b6020840193505b828410156140f3578351615324816143a9565b825260209384019390910190615311565b606081016153438285614527565b6001600160a01b039290921660409190910152919050565b81835281816020850137505f828201602090810191909152601f909101601f19169091010190565b602081525f610b1960208301848661535b565b5f5f8335601e198436030181126153ab575f5ffd5b8301803591506001600160401b038211156153c4575f5ffd5b602001915036819003821315610d75575f5ffd5b6001600160a01b038781168252861660208201526080604082018190525f9061540490830186886151f0565b828103606084015261541781858761535b565b9998505050505050505050565b80516020808301519190811015614cc5575f1960209190910360031b1b16919050565b5f8235603e1983360301811261545b575f5ffd5b9190910192915050565b5f60018201615476576154766151c0565b5060010190565b81810381811115610a0a57610a0a6151c0565b6001600160401b038281168282160390811115610a0a57610a0a6151c0565b5f81600f0b60016001607f1b031981036154cb576154cb6151c0565b5f0392915050565b600f81810b9083900b0160016001607f1b03811360016001607f1b031982121715610a0a57610a0a6151c0565b6001600160a01b038716815260e0810161551d6020830188614527565b60608201959095526001600160a01b039390931660808401526001600160401b0391821660a08401521660c09091015292915050565b5f60208284031215615563575f5ffd5b5051919050565b6001600160a01b03881681525f60c08201615588602084018a614527565b60c060608401528690528660e083015f5b888110156155c95782356155ac816143a9565b6001600160a01b0316825260209283019290910190600101615599565b5083810360808501526155dc8188614734565b91505082810360a08401526155f281858761535b565b9a9950505050505050505050565b5f8161560e5761560e6151c0565b505f190190565b608081016156238286614527565b6001600160a01b0393909316604082015263ffffffff91909116606090910152919050565b600f82810b9082900b0360016001607f1b0319811260016001607f1b0382131715610a0a57610a0a6151c0565b5f60208284031215615685575f5ffd5b8151610949816143a9565b634e487b7160e01b5f52603160045260245ffd5b634e487b7160e01b5f52602160045260245ffd5b634e487b7160e01b5f52601260045260245ffd5b80820180821115610a0a57610a0a6151c056fea2646970667358221220313f731aa74089873dda9647f8930beed97d68f3d08d646c05246c5f518b6d2c64736f6c634300081e0033",
}
⋮----
// AllocationManagerABI is the input ABI used to generate the binding from.
// Deprecated: Use AllocationManagerMetaData.ABI instead.
var AllocationManagerABI = AllocationManagerMetaData.ABI
⋮----
// AllocationManagerBin is the compiled bytecode used for deploying new contracts.
// Deprecated: Use AllocationManagerMetaData.Bin instead.
var AllocationManagerBin = AllocationManagerMetaData.Bin
⋮----
// DeployAllocationManager deploys a new Ethereum contract, binding an instance of AllocationManager to it.
func DeployAllocationManager(auth *bind.TransactOpts, backend bind.ContractBackend, _allocationManagerView common.Address, _delegation common.Address, _eigenStrategy common.Address, _pauserRegistry common.Address, _permissionController common.Address, _DEALLOCATION_DELAY uint32, _ALLOCATION_CONFIGURATION_DELAY uint32) (common.Address, *types.Transaction, *AllocationManager, error)
⋮----
// AllocationManager is an auto generated Go binding around an Ethereum contract.
type AllocationManager struct {
	AllocationManagerCaller     // Read-only binding to the contract
	AllocationManagerTransactor // Write-only binding to the contract
	AllocationManagerFilterer   // Log filterer for contract events
}
⋮----
AllocationManagerCaller     // Read-only binding to the contract
AllocationManagerTransactor // Write-only binding to the contract
AllocationManagerFilterer   // Log filterer for contract events
⋮----
// AllocationManagerCaller is an auto generated read-only Go binding around an Ethereum contract.
type AllocationManagerCaller struct {
	contract *bind.BoundContract // Generic contract wrapper for the low level calls
}
⋮----
contract *bind.BoundContract // Generic contract wrapper for the low level calls
⋮----
// AllocationManagerTransactor is an auto generated write-only Go binding around an Ethereum contract.
type AllocationManagerTransactor struct {
	contract *bind.BoundContract // Generic contract wrapper for the low level calls
}
⋮----
// AllocationManagerFilterer is an auto generated log filtering Go binding around an Ethereum contract events.
type AllocationManagerFilterer struct {
	contract *bind.BoundContract // Generic contract wrapper for the low level calls
}
⋮----
// AllocationManagerSession is an auto generated Go binding around an Ethereum contract,
// with pre-set call and transact options.
type AllocationManagerSession struct {
	Contract     *AllocationManager // 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
}
⋮----
Contract     *AllocationManager // 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
⋮----
// AllocationManagerCallerSession is an auto generated read-only Go binding around an Ethereum contract,
// with pre-set call options.
type AllocationManagerCallerSession struct {
	Contract *AllocationManagerCaller // Generic contract caller binding to set the session for
	CallOpts bind.CallOpts            // Call options to use throughout this session
}
⋮----
Contract *AllocationManagerCaller // Generic contract caller binding to set the session for
CallOpts bind.CallOpts            // Call options to use throughout this session
⋮----
// AllocationManagerTransactorSession is an auto generated write-only Go binding around an Ethereum contract,
// with pre-set transact options.
type AllocationManagerTransactorSession struct {
	Contract     *AllocationManagerTransactor // Generic contract transactor binding to set the session for
	TransactOpts bind.TransactOpts            // Transaction auth options to use throughout this session
}
⋮----
Contract     *AllocationManagerTransactor // Generic contract transactor binding to set the session for
TransactOpts bind.TransactOpts            // Transaction auth options to use throughout this session
⋮----
// AllocationManagerRaw is an auto generated low-level Go binding around an Ethereum contract.
type AllocationManagerRaw struct {
	Contract *AllocationManager // Generic contract binding to access the raw methods on
}
⋮----
Contract *AllocationManager // Generic contract binding to access the raw methods on
⋮----
// AllocationManagerCallerRaw is an auto generated low-level read-only Go binding around an Ethereum contract.
type AllocationManagerCallerRaw struct {
	Contract *AllocationManagerCaller // Generic read-only contract binding to access the raw methods on
}
⋮----
Contract *AllocationManagerCaller // Generic read-only contract binding to access the raw methods on
⋮----
// AllocationManagerTransactorRaw is an auto generated low-level write-only Go binding around an Ethereum contract.
type AllocationManagerTransactorRaw struct {
	Contract *AllocationManagerTransactor // Generic write-only contract binding to access the raw methods on
}
⋮----
Contract *AllocationManagerTransactor // Generic write-only contract binding to access the raw methods on
⋮----
// NewAllocationManager creates a new instance of AllocationManager, bound to a specific deployed contract.
func NewAllocationManager(address common.Address, backend bind.ContractBackend) (*AllocationManager, error)
⋮----
// NewAllocationManagerCaller creates a new read-only instance of AllocationManager, bound to a specific deployed contract.
func NewAllocationManagerCaller(address common.Address, caller bind.ContractCaller) (*AllocationManagerCaller, error)
⋮----
// NewAllocationManagerTransactor creates a new write-only instance of AllocationManager, bound to a specific deployed contract.
func NewAllocationManagerTransactor(address common.Address, transactor bind.ContractTransactor) (*AllocationManagerTransactor, error)
⋮----
// NewAllocationManagerFilterer creates a new log filterer instance of AllocationManager, bound to a specific deployed contract.
func NewAllocationManagerFilterer(address common.Address, filterer bind.ContractFilterer) (*AllocationManagerFilterer, error)
⋮----
// bindAllocationManager binds a generic wrapper to an already deployed contract.
func bindAllocationManager(address common.Address, caller bind.ContractCaller, transactor bind.ContractTransactor, filterer bind.ContractFilterer) (*bind.BoundContract, error)
⋮----
// 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 (_AllocationManager *AllocationManagerRaw) Call(opts *bind.CallOpts, result *[]interface
⋮----
// Transfer initiates a plain transaction to move funds to the contract, calling
// its default method if one is available.
func (_AllocationManager *AllocationManagerRaw) Transfer(opts *bind.TransactOpts) (*types.Transaction, error)
⋮----
// Transact invokes the (paid) contract method with params as input values.
func (_AllocationManager *AllocationManagerRaw) Transact(opts *bind.TransactOpts, method string, params ...interface
⋮----
// ALLOCATIONCONFIGURATIONDELAY is a free data retrieval call binding the contract method 0x7bc1ef61.
//
// Solidity: function ALLOCATION_CONFIGURATION_DELAY() view returns(uint32)
func (_AllocationManager *AllocationManagerCaller) ALLOCATIONCONFIGURATIONDELAY(opts *bind.CallOpts) (uint32, error)
⋮----
var out []interface{}
⋮----
// DEALLOCATIONDELAY is a free data retrieval call binding the contract method 0x2981eb77.
⋮----
// Solidity: function DEALLOCATION_DELAY() view returns(uint32)
func (_AllocationManager *AllocationManagerCaller) DEALLOCATIONDELAY(opts *bind.CallOpts) (uint32, error)
⋮----
// SLASHERCONFIGURATIONDELAY is a free data retrieval call binding the contract method 0x67aeaa53.
⋮----
// Solidity: function SLASHER_CONFIGURATION_DELAY() view returns(uint32)
func (_AllocationManager *AllocationManagerCaller) SLASHERCONFIGURATIONDELAY(opts *bind.CallOpts) (uint32, error)
⋮----
// Delegation is a free data retrieval call binding the contract method 0xdf5cf723.
⋮----
// Solidity: function delegation() view returns(address)
func (_AllocationManager *AllocationManagerCaller) Delegation(opts *bind.CallOpts) (common.Address, error)
⋮----
// EigenStrategy is a free data retrieval call binding the contract method 0xdb4df761.
⋮----
// Solidity: function eigenStrategy() view returns(address)
func (_AllocationManager *AllocationManagerCaller) EigenStrategy(opts *bind.CallOpts) (common.Address, error)
⋮----
// GetAVSRegistrar is a free data retrieval call binding the contract method 0x304c10cd.
⋮----
// Solidity: function getAVSRegistrar(address avs) view returns(address)
func (_AllocationManager *AllocationManagerCaller) GetAVSRegistrar(opts *bind.CallOpts, avs common.Address) (common.Address, error)
⋮----
// GetAllocatableMagnitude is a free data retrieval call binding the contract method 0x6cfb4481.
⋮----
// Solidity: function getAllocatableMagnitude(address , address ) view returns(uint64 allocatableMagnitude)
func (_AllocationManager *AllocationManagerCaller) GetAllocatableMagnitude(opts *bind.CallOpts, arg0 common.Address, arg1 common.Address) (uint64, error)
⋮----
// GetAllocatedSets is a free data retrieval call binding the contract method 0x15fe5028.
⋮----
// Solidity: function getAllocatedSets(address ) view returns((address,uint32)[] operatorSets)
func (_AllocationManager *AllocationManagerCaller) GetAllocatedSets(opts *bind.CallOpts, arg0 common.Address) ([]OperatorSet, error)
⋮----
// GetAllocatedStake is a free data retrieval call binding the contract method 0x2b453a9a.
⋮----
// Solidity: function getAllocatedStake((address,uint32) , address[] , address[] ) view returns(uint256[][] slashableStake)
func (_AllocationManager *AllocationManagerCaller) GetAllocatedStake(opts *bind.CallOpts, arg0 OperatorSet, arg1 []common.Address, arg2 []common.Address) ([][]*big.Int, error)
⋮----
// GetAllocatedStrategies is a free data retrieval call binding the contract method 0xc221d8ae.
⋮----
// Solidity: function getAllocatedStrategies(address , (address,uint32) ) view returns(address[] strategies)
func (_AllocationManager *AllocationManagerCaller) GetAllocatedStrategies(opts *bind.CallOpts, arg0 common.Address, arg1 OperatorSet) ([]common.Address, error)
⋮----
// GetAllocation is a free data retrieval call binding the contract method 0x10e1b9b8.
⋮----
// Solidity: function getAllocation(address , (address,uint32) , address ) view returns((uint64,int128,uint32) allocation)
func (_AllocationManager *AllocationManagerCaller) GetAllocation(opts *bind.CallOpts, arg0 common.Address, arg1 OperatorSet, arg2 common.Address) (IAllocationManagerTypesAllocation, error)
⋮----
// GetAllocationDelay is a free data retrieval call binding the contract method 0xb9fbaed1.
⋮----
// Solidity: function getAllocationDelay(address operator) view returns(bool, uint32)
func (_AllocationManager *AllocationManagerCaller) GetAllocationDelay(opts *bind.CallOpts, operator common.Address) (bool, uint32, error)
⋮----
// GetAllocations is a free data retrieval call binding the contract method 0x8ce64854.
⋮----
// Solidity: function getAllocations(address[] , (address,uint32) , address ) view returns((uint64,int128,uint32)[] allocations)
func (_AllocationManager *AllocationManagerCaller) GetAllocations(opts *bind.CallOpts, arg0 []common.Address, arg1 OperatorSet, arg2 common.Address) ([]IAllocationManagerTypesAllocation, error)
⋮----
// GetEncumberedMagnitude is a free data retrieval call binding the contract method 0xf605ce08.
⋮----
// Solidity: function getEncumberedMagnitude(address , address ) view returns(uint64 encumberedMagnitude)
func (_AllocationManager *AllocationManagerCaller) GetEncumberedMagnitude(opts *bind.CallOpts, arg0 common.Address, arg1 common.Address) (uint64, error)
⋮----
// GetMaxMagnitude is a free data retrieval call binding the contract method 0xa9333ec8.
⋮----
// Solidity: function getMaxMagnitude(address , address ) view returns(uint64 maxMagnitude)
func (_AllocationManager *AllocationManagerCaller) GetMaxMagnitude(opts *bind.CallOpts, arg0 common.Address, arg1 common.Address) (uint64, error)
⋮----
// GetMaxMagnitudes is a free data retrieval call binding the contract method 0x4a10ffe5.
⋮----
// Solidity: function getMaxMagnitudes(address[] , address ) view returns(uint64[] maxMagnitudes)
func (_AllocationManager *AllocationManagerCaller) GetMaxMagnitudes(opts *bind.CallOpts, arg0 []common.Address, arg1 common.Address) ([]uint64, error)
⋮----
// GetMaxMagnitudes0 is a free data retrieval call binding the contract method 0x547afb87.
⋮----
// Solidity: function getMaxMagnitudes(address , address[] ) view returns(uint64[] maxMagnitudes)
func (_AllocationManager *AllocationManagerCaller) GetMaxMagnitudes0(opts *bind.CallOpts, arg0 common.Address, arg1 []common.Address) ([]uint64, error)
⋮----
// GetMaxMagnitudesAtBlock is a free data retrieval call binding the contract method 0x94d7d00c.
⋮----
// Solidity: function getMaxMagnitudesAtBlock(address , address[] , uint32 ) view returns(uint64[] maxMagnitudes)
func (_AllocationManager *AllocationManagerCaller) GetMaxMagnitudesAtBlock(opts *bind.CallOpts, arg0 common.Address, arg1 []common.Address, arg2 uint32) ([]uint64, error)
⋮----
// GetMemberCount is a free data retrieval call binding the contract method 0xb2447af7.
⋮----
// Solidity: function getMemberCount((address,uint32) ) view returns(uint256 memberCount)
func (_AllocationManager *AllocationManagerCaller) GetMemberCount(opts *bind.CallOpts, arg0 OperatorSet) (*big.Int, error)
⋮----
// GetMembers is a free data retrieval call binding the contract method 0x6e875dba.
⋮----
// Solidity: function getMembers((address,uint32) ) view returns(address[] operators)
func (_AllocationManager *AllocationManagerCaller) GetMembers(opts *bind.CallOpts, arg0 OperatorSet) ([]common.Address, error)
⋮----
// GetMinimumSlashableStake is a free data retrieval call binding the contract method 0x2bab2c4a.
⋮----
// Solidity: function getMinimumSlashableStake((address,uint32) , address[] , address[] , uint32 ) view returns(uint256[][] slashableStake)
func (_AllocationManager *AllocationManagerCaller) GetMinimumSlashableStake(opts *bind.CallOpts, arg0 OperatorSet, arg1 []common.Address, arg2 []common.Address, arg3 uint32) ([][]*big.Int, error)
⋮----
// GetOperatorSetCount is a free data retrieval call binding the contract method 0xba1a84e5.
⋮----
// Solidity: function getOperatorSetCount(address ) view returns(uint256 count)
func (_AllocationManager *AllocationManagerCaller) GetOperatorSetCount(opts *bind.CallOpts, arg0 common.Address) (*big.Int, error)
⋮----
// GetPendingSlasher is a free data retrieval call binding the contract method 0xd7794857.
⋮----
// Solidity: function getPendingSlasher((address,uint32) ) view returns(address pendingSlasher, uint32 effectBlock)
func (_AllocationManager *AllocationManagerCaller) GetPendingSlasher(opts *bind.CallOpts, arg0 OperatorSet) (struct
⋮----
// GetRedistributionRecipient is a free data retrieval call binding the contract method 0x0f3df50e.
⋮----
// Solidity: function getRedistributionRecipient((address,uint32) operatorSet) view returns(address)
func (_AllocationManager *AllocationManagerCaller) GetRedistributionRecipient(opts *bind.CallOpts, operatorSet OperatorSet) (common.Address, error)
⋮----
// GetRegisteredSets is a free data retrieval call binding the contract method 0x79ae50cd.
⋮----
// Solidity: function getRegisteredSets(address ) view returns((address,uint32)[] operatorSets)
func (_AllocationManager *AllocationManagerCaller) GetRegisteredSets(opts *bind.CallOpts, arg0 common.Address) ([]OperatorSet, error)
⋮----
// GetSlashCount is a free data retrieval call binding the contract method 0x4cfd2939.
⋮----
// Solidity: function getSlashCount((address,uint32) ) view returns(uint256 slashCount)
func (_AllocationManager *AllocationManagerCaller) GetSlashCount(opts *bind.CallOpts, arg0 OperatorSet) (*big.Int, error)
⋮----
// GetSlasher is a free data retrieval call binding the contract method 0xd4a3fcce.
⋮----
// Solidity: function getSlasher((address,uint32) operatorSet) view returns(address)
func (_AllocationManager *AllocationManagerCaller) GetSlasher(opts *bind.CallOpts, operatorSet OperatorSet) (common.Address, error)
⋮----
// GetStrategiesInOperatorSet is a free data retrieval call binding the contract method 0x4177a87c.
⋮----
// Solidity: function getStrategiesInOperatorSet((address,uint32) ) view returns(address[] strategies)
func (_AllocationManager *AllocationManagerCaller) GetStrategiesInOperatorSet(opts *bind.CallOpts, arg0 OperatorSet) ([]common.Address, error)
⋮----
// GetStrategyAllocations is a free data retrieval call binding the contract method 0x40120dab.
⋮----
// Solidity: function getStrategyAllocations(address , address ) view returns((address,uint32)[] operatorSets, (uint64,int128,uint32)[] allocations)
func (_AllocationManager *AllocationManagerCaller) GetStrategyAllocations(opts *bind.CallOpts, arg0 common.Address, arg1 common.Address) (struct
⋮----
// IsMemberOfOperatorSet is a free data retrieval call binding the contract method 0x670d3ba2.
⋮----
// Solidity: function isMemberOfOperatorSet(address , (address,uint32) ) view returns(bool result)
func (_AllocationManager *AllocationManagerCaller) IsMemberOfOperatorSet(opts *bind.CallOpts, arg0 common.Address, arg1 OperatorSet) (bool, error)
⋮----
// IsOperatorRedistributable is a free data retrieval call binding the contract method 0xdc2af692.
⋮----
// Solidity: function isOperatorRedistributable(address ) view returns(bool result)
func (_AllocationManager *AllocationManagerCaller) IsOperatorRedistributable(opts *bind.CallOpts, arg0 common.Address) (bool, error)
⋮----
// IsOperatorSet is a free data retrieval call binding the contract method 0x260dc758.
⋮----
// Solidity: function isOperatorSet((address,uint32) ) view returns(bool result)
func (_AllocationManager *AllocationManagerCaller) IsOperatorSet(opts *bind.CallOpts, arg0 OperatorSet) (bool, error)
⋮----
// IsOperatorSlashable is a free data retrieval call binding the contract method 0x1352c3e6.
⋮----
// Solidity: function isOperatorSlashable(address operator, (address,uint32) operatorSet) view returns(bool)
func (_AllocationManager *AllocationManagerCaller) IsOperatorSlashable(opts *bind.CallOpts, operator common.Address, operatorSet OperatorSet) (bool, error)
⋮----
// IsRedistributingOperatorSet is a free data retrieval call binding the contract method 0xf231bd08.
⋮----
// Solidity: function isRedistributingOperatorSet((address,uint32) operatorSet) view returns(bool)
func (_AllocationManager *AllocationManagerCaller) IsRedistributingOperatorSet(opts *bind.CallOpts, operatorSet OperatorSet) (bool, error)
⋮----
// Paused is a free data retrieval call binding the contract method 0x5ac86ab7.
⋮----
// Solidity: function paused(uint8 index) view returns(bool)
func (_AllocationManager *AllocationManagerCaller) Paused(opts *bind.CallOpts, index uint8) (bool, error)
⋮----
// Paused0 is a free data retrieval call binding the contract method 0x5c975abb.
⋮----
// Solidity: function paused() view returns(uint256)
func (_AllocationManager *AllocationManagerCaller) Paused0(opts *bind.CallOpts) (*big.Int, error)
⋮----
// PauserRegistry is a free data retrieval call binding the contract method 0x886f1195.
⋮----
// Solidity: function pauserRegistry() view returns(address)
func (_AllocationManager *AllocationManagerCaller) PauserRegistry(opts *bind.CallOpts) (common.Address, error)
⋮----
// PermissionController is a free data retrieval call binding the contract method 0x4657e26a.
⋮----
// Solidity: function permissionController() view returns(address)
func (_AllocationManager *AllocationManagerCaller) PermissionController(opts *bind.CallOpts) (common.Address, error)
⋮----
// ViewImplementation is a free data retrieval call binding the contract method 0x0b156bb6.
⋮----
// Solidity: function viewImplementation() view returns(address)
func (_AllocationManager *AllocationManagerCaller) ViewImplementation(opts *bind.CallOpts) (common.Address, error)
⋮----
// AddStrategiesToOperatorSet is a paid mutator transaction binding the contract method 0x50feea20.
⋮----
// Solidity: function addStrategiesToOperatorSet(address avs, uint32 operatorSetId, address[] strategies) returns()
func (_AllocationManager *AllocationManagerTransactor) AddStrategiesToOperatorSet(opts *bind.TransactOpts, avs common.Address, operatorSetId uint32, strategies []common.Address) (*types.Transaction, error)
⋮----
// ClearDeallocationQueue is a paid mutator transaction binding the contract method 0x4b5046ef.
⋮----
// Solidity: function clearDeallocationQueue(address operator, address[] strategies, uint16[] numToClear) returns()
func (_AllocationManager *AllocationManagerTransactor) ClearDeallocationQueue(opts *bind.TransactOpts, operator common.Address, strategies []common.Address, numToClear []uint16) (*types.Transaction, error)
⋮----
// CreateOperatorSets is a paid mutator transaction binding the contract method 0x261f84e0.
⋮----
// Solidity: function createOperatorSets(address avs, (uint32,address[])[] params) returns()
func (_AllocationManager *AllocationManagerTransactor) CreateOperatorSets(opts *bind.TransactOpts, avs common.Address, params []IAllocationManagerTypesCreateSetParams) (*types.Transaction, error)
⋮----
// CreateOperatorSets0 is a paid mutator transaction binding the contract method 0x3dff8e7d.
⋮----
// Solidity: function createOperatorSets(address avs, (uint32,address[],address)[] params) returns()
func (_AllocationManager *AllocationManagerTransactor) CreateOperatorSets0(opts *bind.TransactOpts, avs common.Address, params []IAllocationManagerTypesCreateSetParamsV2) (*types.Transaction, error)
⋮----
// CreateRedistributingOperatorSets is a paid mutator transaction binding the contract method 0x32a879e4.
⋮----
// Solidity: function createRedistributingOperatorSets(address avs, (uint32,address[])[] params, address[] redistributionRecipients) returns()
func (_AllocationManager *AllocationManagerTransactor) CreateRedistributingOperatorSets(opts *bind.TransactOpts, avs common.Address, params []IAllocationManagerTypesCreateSetParams, redistributionRecipients []common.Address) (*types.Transaction, error)
⋮----
// CreateRedistributingOperatorSets0 is a paid mutator transaction binding the contract method 0xd1a83f54.
⋮----
// Solidity: function createRedistributingOperatorSets(address avs, (uint32,address[],address)[] params, address[] redistributionRecipients) returns()
func (_AllocationManager *AllocationManagerTransactor) CreateRedistributingOperatorSets0(opts *bind.TransactOpts, avs common.Address, params []IAllocationManagerTypesCreateSetParamsV2, redistributionRecipients []common.Address) (*types.Transaction, error)
⋮----
// DeregisterFromOperatorSets is a paid mutator transaction binding the contract method 0x6e3492b5.
⋮----
// Solidity: function deregisterFromOperatorSets((address,address,uint32[]) params) returns()
func (_AllocationManager *AllocationManagerTransactor) DeregisterFromOperatorSets(opts *bind.TransactOpts, params IAllocationManagerTypesDeregisterParams) (*types.Transaction, error)
⋮----
// Initialize is a paid mutator transaction binding the contract method 0xfe4b84df.
⋮----
// Solidity: function initialize(uint256 initialPausedStatus) returns()
func (_AllocationManager *AllocationManagerTransactor) Initialize(opts *bind.TransactOpts, initialPausedStatus *big.Int) (*types.Transaction, error)
⋮----
// MigrateSlashers is a paid mutator transaction binding the contract method 0x957dc50b.
⋮----
// Solidity: function migrateSlashers((address,uint32)[] operatorSets) returns()
func (_AllocationManager *AllocationManagerTransactor) MigrateSlashers(opts *bind.TransactOpts, operatorSets []OperatorSet) (*types.Transaction, error)
⋮----
// ModifyAllocations is a paid mutator transaction binding the contract method 0x952899ee.
⋮----
// Solidity: function modifyAllocations(address operator, ((address,uint32),address[],uint64[])[] params) returns()
func (_AllocationManager *AllocationManagerTransactor) ModifyAllocations(opts *bind.TransactOpts, operator common.Address, params []IAllocationManagerTypesAllocateParams) (*types.Transaction, error)
⋮----
// Pause is a paid mutator transaction binding the contract method 0x136439dd.
⋮----
// Solidity: function pause(uint256 newPausedStatus) returns()
func (_AllocationManager *AllocationManagerTransactor) Pause(opts *bind.TransactOpts, newPausedStatus *big.Int) (*types.Transaction, error)
⋮----
// PauseAll is a paid mutator transaction binding the contract method 0x595c6a67.
⋮----
// Solidity: function pauseAll() returns()
func (_AllocationManager *AllocationManagerTransactor) PauseAll(opts *bind.TransactOpts) (*types.Transaction, error)
⋮----
// RegisterForOperatorSets is a paid mutator transaction binding the contract method 0xadc2e3d9.
⋮----
// Solidity: function registerForOperatorSets(address operator, (address,uint32[],bytes) params) returns()
func (_AllocationManager *AllocationManagerTransactor) RegisterForOperatorSets(opts *bind.TransactOpts, operator common.Address, params IAllocationManagerTypesRegisterParams) (*types.Transaction, error)
⋮----
// RemoveStrategiesFromOperatorSet is a paid mutator transaction binding the contract method 0xb66bd989.
⋮----
// Solidity: function removeStrategiesFromOperatorSet(address avs, uint32 operatorSetId, address[] strategies) returns()
func (_AllocationManager *AllocationManagerTransactor) RemoveStrategiesFromOperatorSet(opts *bind.TransactOpts, avs common.Address, operatorSetId uint32, strategies []common.Address) (*types.Transaction, error)
⋮----
// SetAVSRegistrar is a paid mutator transaction binding the contract method 0xd3d96ff4.
⋮----
// Solidity: function setAVSRegistrar(address avs, address registrar) returns()
func (_AllocationManager *AllocationManagerTransactor) SetAVSRegistrar(opts *bind.TransactOpts, avs common.Address, registrar common.Address) (*types.Transaction, error)
⋮----
// SetAllocationDelay is a paid mutator transaction binding the contract method 0x56c483e6.
⋮----
// Solidity: function setAllocationDelay(address operator, uint32 delay) returns()
func (_AllocationManager *AllocationManagerTransactor) SetAllocationDelay(opts *bind.TransactOpts, operator common.Address, delay uint32) (*types.Transaction, error)
⋮----
// SlashOperator is a paid mutator transaction binding the contract method 0x36352057.
⋮----
// Solidity: function slashOperator(address avs, (address,uint32,address[],uint256[],string) params) returns(uint256, uint256[])
func (_AllocationManager *AllocationManagerTransactor) SlashOperator(opts *bind.TransactOpts, avs common.Address, params IAllocationManagerTypesSlashingParams) (*types.Transaction, error)
⋮----
// Unpause is a paid mutator transaction binding the contract method 0xfabc1cbc.
⋮----
// Solidity: function unpause(uint256 newPausedStatus) returns()
func (_AllocationManager *AllocationManagerTransactor) Unpause(opts *bind.TransactOpts, newPausedStatus *big.Int) (*types.Transaction, error)
⋮----
// UpdateAVSMetadataURI is a paid mutator transaction binding the contract method 0xa9821821.
⋮----
// Solidity: function updateAVSMetadataURI(address avs, string metadataURI) returns()
func (_AllocationManager *AllocationManagerTransactor) UpdateAVSMetadataURI(opts *bind.TransactOpts, avs common.Address, metadataURI string) (*types.Transaction, error)
⋮----
// UpdateSlasher is a paid mutator transaction binding the contract method 0x6c9d7c58.
⋮----
// Solidity: function updateSlasher((address,uint32) operatorSet, address slasher) returns()
func (_AllocationManager *AllocationManagerTransactor) UpdateSlasher(opts *bind.TransactOpts, operatorSet OperatorSet, slasher common.Address) (*types.Transaction, error)
⋮----
// AllocationManagerAVSMetadataURIUpdatedIterator is returned from FilterAVSMetadataURIUpdated and is used to iterate over the raw logs and unpacked data for AVSMetadataURIUpdated events raised by the AllocationManager contract.
type AllocationManagerAVSMetadataURIUpdatedIterator struct {
	Event *AllocationManagerAVSMetadataURIUpdated // 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
}
⋮----
Event *AllocationManagerAVSMetadataURIUpdated // 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 *AllocationManagerAVSMetadataURIUpdatedIterator) Next() bool
⋮----
// If the iterator failed, stop iterating
⋮----
// If the iterator completed, deliver directly whatever's available
⋮----
// Iterator still in progress, wait for either a data or an error event
⋮----
// Error returns any retrieval or parsing error occurred during filtering.
func (it *AllocationManagerAVSMetadataURIUpdatedIterator) Error() error
⋮----
// Close terminates the iteration process, releasing any pending underlying
// resources.
func (it *AllocationManagerAVSMetadataURIUpdatedIterator) Close() error
⋮----
// AllocationManagerAVSMetadataURIUpdated represents a AVSMetadataURIUpdated event raised by the AllocationManager contract.
type AllocationManagerAVSMetadataURIUpdated struct {
	Avs         common.Address
	MetadataURI string
	Raw         types.Log // Blockchain specific contextual infos
}
⋮----
Raw         types.Log // Blockchain specific contextual infos
⋮----
// FilterAVSMetadataURIUpdated is a free log retrieval operation binding the contract event 0xa89c1dc243d8908a96dd84944bcc97d6bc6ac00dd78e20621576be6a3c943713.
⋮----
// Solidity: event AVSMetadataURIUpdated(address indexed avs, string metadataURI)
func (_AllocationManager *AllocationManagerFilterer) FilterAVSMetadataURIUpdated(opts *bind.FilterOpts, avs []common.Address) (*AllocationManagerAVSMetadataURIUpdatedIterator, error)
⋮----
var avsRule []interface{}
⋮----
// WatchAVSMetadataURIUpdated is a free log subscription operation binding the contract event 0xa89c1dc243d8908a96dd84944bcc97d6bc6ac00dd78e20621576be6a3c943713.
⋮----
func (_AllocationManager *AllocationManagerFilterer) WatchAVSMetadataURIUpdated(opts *bind.WatchOpts, sink chan<- *AllocationManagerAVSMetadataURIUpdated, avs []common.Address) (event.Subscription, error)
⋮----
// New log arrived, parse the event and forward to the user
⋮----
// ParseAVSMetadataURIUpdated is a log parse operation binding the contract event 0xa89c1dc243d8908a96dd84944bcc97d6bc6ac00dd78e20621576be6a3c943713.
⋮----
func (_AllocationManager *AllocationManagerFilterer) ParseAVSMetadataURIUpdated(log types.Log) (*AllocationManagerAVSMetadataURIUpdated, error)
⋮----
// AllocationManagerAVSRegistrarSetIterator is returned from FilterAVSRegistrarSet and is used to iterate over the raw logs and unpacked data for AVSRegistrarSet events raised by the AllocationManager contract.
type AllocationManagerAVSRegistrarSetIterator struct {
	Event *AllocationManagerAVSRegistrarSet // 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
}
⋮----
Event *AllocationManagerAVSRegistrarSet // Event containing the contract specifics and raw log
⋮----
// AllocationManagerAVSRegistrarSet represents a AVSRegistrarSet event raised by the AllocationManager contract.
type AllocationManagerAVSRegistrarSet struct {
	Avs       common.Address
	Registrar common.Address
	Raw       types.Log // Blockchain specific contextual infos
}
⋮----
Raw       types.Log // Blockchain specific contextual infos
⋮----
// FilterAVSRegistrarSet is a free log retrieval operation binding the contract event 0x2ae945c40c44dc0ec263f95609c3fdc6952e0aefa22d6374e44f2c997acedf85.
⋮----
// Solidity: event AVSRegistrarSet(address avs, address registrar)
func (_AllocationManager *AllocationManagerFilterer) FilterAVSRegistrarSet(opts *bind.FilterOpts) (*AllocationManagerAVSRegistrarSetIterator, error)
⋮----
// WatchAVSRegistrarSet is a free log subscription operation binding the contract event 0x2ae945c40c44dc0ec263f95609c3fdc6952e0aefa22d6374e44f2c997acedf85.
⋮----
func (_AllocationManager *AllocationManagerFilterer) WatchAVSRegistrarSet(opts *bind.WatchOpts, sink chan<- *AllocationManagerAVSRegistrarSet) (event.Subscription, error)
⋮----
// ParseAVSRegistrarSet is a log parse operation binding the contract event 0x2ae945c40c44dc0ec263f95609c3fdc6952e0aefa22d6374e44f2c997acedf85.
⋮----
func (_AllocationManager *AllocationManagerFilterer) ParseAVSRegistrarSet(log types.Log) (*AllocationManagerAVSRegistrarSet, error)
⋮----
// AllocationManagerAllocationDelaySetIterator is returned from FilterAllocationDelaySet and is used to iterate over the raw logs and unpacked data for AllocationDelaySet events raised by the AllocationManager contract.
type AllocationManagerAllocationDelaySetIterator struct {
	Event *AllocationManagerAllocationDelaySet // 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
}
⋮----
Event *AllocationManagerAllocationDelaySet // Event containing the contract specifics and raw log
⋮----
// AllocationManagerAllocationDelaySet represents a AllocationDelaySet event raised by the AllocationManager contract.
type AllocationManagerAllocationDelaySet struct {
	Operator    common.Address
	Delay       uint32
	EffectBlock uint32
	Raw         types.Log // Blockchain specific contextual infos
}
⋮----
// FilterAllocationDelaySet is a free log retrieval operation binding the contract event 0x4e85751d6331506c6c62335f207eb31f12a61e570f34f5c17640308785c6d4db.
⋮----
// Solidity: event AllocationDelaySet(address operator, uint32 delay, uint32 effectBlock)
func (_AllocationManager *AllocationManagerFilterer) FilterAllocationDelaySet(opts *bind.FilterOpts) (*AllocationManagerAllocationDelaySetIterator, error)
⋮----
// WatchAllocationDelaySet is a free log subscription operation binding the contract event 0x4e85751d6331506c6c62335f207eb31f12a61e570f34f5c17640308785c6d4db.
⋮----
func (_AllocationManager *AllocationManagerFilterer) WatchAllocationDelaySet(opts *bind.WatchOpts, sink chan<- *AllocationManagerAllocationDelaySet) (event.Subscription, error)
⋮----
// ParseAllocationDelaySet is a log parse operation binding the contract event 0x4e85751d6331506c6c62335f207eb31f12a61e570f34f5c17640308785c6d4db.
⋮----
func (_AllocationManager *AllocationManagerFilterer) ParseAllocationDelaySet(log types.Log) (*AllocationManagerAllocationDelaySet, error)
⋮----
// AllocationManagerAllocationUpdatedIterator is returned from FilterAllocationUpdated and is used to iterate over the raw logs and unpacked data for AllocationUpdated events raised by the AllocationManager contract.
type AllocationManagerAllocationUpdatedIterator struct {
	Event *AllocationManagerAllocationUpdated // 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
}
⋮----
Event *AllocationManagerAllocationUpdated // Event containing the contract specifics and raw log
⋮----
// AllocationManagerAllocationUpdated represents a AllocationUpdated event raised by the AllocationManager contract.
type AllocationManagerAllocationUpdated struct {
	Operator    common.Address
	OperatorSet OperatorSet
	Strategy    common.Address
	Magnitude   uint64
	EffectBlock uint32
	Raw         types.Log // Blockchain specific contextual infos
}
⋮----
// FilterAllocationUpdated is a free log retrieval operation binding the contract event 0x1487af5418c47ee5ea45ef4a93398668120890774a9e13487e61e9dc3baf76dd.
⋮----
// Solidity: event AllocationUpdated(address operator, (address,uint32) operatorSet, address strategy, uint64 magnitude, uint32 effectBlock)
func (_AllocationManager *AllocationManagerFilterer) FilterAllocationUpdated(opts *bind.FilterOpts) (*AllocationManagerAllocationUpdatedIterator, error)
⋮----
// WatchAllocationUpdated is a free log subscription operation binding the contract event 0x1487af5418c47ee5ea45ef4a93398668120890774a9e13487e61e9dc3baf76dd.
⋮----
func (_AllocationManager *AllocationManagerFilterer) WatchAllocationUpdated(opts *bind.WatchOpts, sink chan<- *AllocationManagerAllocationUpdated) (event.Subscription, error)
⋮----
// ParseAllocationUpdated is a log parse operation binding the contract event 0x1487af5418c47ee5ea45ef4a93398668120890774a9e13487e61e9dc3baf76dd.
⋮----
func (_AllocationManager *AllocationManagerFilterer) ParseAllocationUpdated(log types.Log) (*AllocationManagerAllocationUpdated, error)
⋮----
// AllocationManagerEncumberedMagnitudeUpdatedIterator is returned from FilterEncumberedMagnitudeUpdated and is used to iterate over the raw logs and unpacked data for EncumberedMagnitudeUpdated events raised by the AllocationManager contract.
type AllocationManagerEncumberedMagnitudeUpdatedIterator struct {
	Event *AllocationManagerEncumberedMagnitudeUpdated // 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
}
⋮----
Event *AllocationManagerEncumberedMagnitudeUpdated // Event containing the contract specifics and raw log
⋮----
// AllocationManagerEncumberedMagnitudeUpdated represents a EncumberedMagnitudeUpdated event raised by the AllocationManager contract.
type AllocationManagerEncumberedMagnitudeUpdated struct {
	Operator            common.Address
	Strategy            common.Address
	EncumberedMagnitude uint64
	Raw                 types.Log // Blockchain specific contextual infos
}
⋮----
Raw                 types.Log // Blockchain specific contextual infos
⋮----
// FilterEncumberedMagnitudeUpdated is a free log retrieval operation binding the contract event 0xacf9095feb3a370c9cf692421c69ef320d4db5c66e6a7d29c7694eb02364fc55.
⋮----
// Solidity: event EncumberedMagnitudeUpdated(address operator, address strategy, uint64 encumberedMagnitude)
func (_AllocationManager *AllocationManagerFilterer) FilterEncumberedMagnitudeUpdated(opts *bind.FilterOpts) (*AllocationManagerEncumberedMagnitudeUpdatedIterator, error)
⋮----
// WatchEncumberedMagnitudeUpdated is a free log subscription operation binding the contract event 0xacf9095feb3a370c9cf692421c69ef320d4db5c66e6a7d29c7694eb02364fc55.
⋮----
func (_AllocationManager *AllocationManagerFilterer) WatchEncumberedMagnitudeUpdated(opts *bind.WatchOpts, sink chan<- *AllocationManagerEncumberedMagnitudeUpdated) (event.Subscription, error)
⋮----
// ParseEncumberedMagnitudeUpdated is a log parse operation binding the contract event 0xacf9095feb3a370c9cf692421c69ef320d4db5c66e6a7d29c7694eb02364fc55.
⋮----
func (_AllocationManager *AllocationManagerFilterer) ParseEncumberedMagnitudeUpdated(log types.Log) (*AllocationManagerEncumberedMagnitudeUpdated, error)
⋮----
// AllocationManagerInitializedIterator is returned from FilterInitialized and is used to iterate over the raw logs and unpacked data for Initialized events raised by the AllocationManager contract.
type AllocationManagerInitializedIterator struct {
	Event *AllocationManagerInitialized // 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
}
⋮----
Event *AllocationManagerInitialized // Event containing the contract specifics and raw log
⋮----
// AllocationManagerInitialized represents a Initialized event raised by the AllocationManager contract.
type AllocationManagerInitialized struct {
	Version uint8
	Raw     types.Log // Blockchain specific contextual infos
}
⋮----
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 (_AllocationManager *AllocationManagerFilterer) FilterInitialized(opts *bind.FilterOpts) (*AllocationManagerInitializedIterator, error)
⋮----
// WatchInitialized is a free log subscription operation binding the contract event 0x7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb3847402498.
⋮----
func (_AllocationManager *AllocationManagerFilterer) WatchInitialized(opts *bind.WatchOpts, sink chan<- *AllocationManagerInitialized) (event.Subscription, error)
⋮----
// ParseInitialized is a log parse operation binding the contract event 0x7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb3847402498.
⋮----
func (_AllocationManager *AllocationManagerFilterer) ParseInitialized(log types.Log) (*AllocationManagerInitialized, error)
⋮----
// AllocationManagerMaxMagnitudeUpdatedIterator is returned from FilterMaxMagnitudeUpdated and is used to iterate over the raw logs and unpacked data for MaxMagnitudeUpdated events raised by the AllocationManager contract.
type AllocationManagerMaxMagnitudeUpdatedIterator struct {
	Event *AllocationManagerMaxMagnitudeUpdated // 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
}
⋮----
Event *AllocationManagerMaxMagnitudeUpdated // Event containing the contract specifics and raw log
⋮----
// AllocationManagerMaxMagnitudeUpdated represents a MaxMagnitudeUpdated event raised by the AllocationManager contract.
type AllocationManagerMaxMagnitudeUpdated struct {
	Operator     common.Address
	Strategy     common.Address
	MaxMagnitude uint64
	Raw          types.Log // Blockchain specific contextual infos
}
⋮----
Raw          types.Log // Blockchain specific contextual infos
⋮----
// FilterMaxMagnitudeUpdated is a free log retrieval operation binding the contract event 0x1c6458079a41077d003c11faf9bf097e693bd67979e4e6500bac7b29db779b5c.
⋮----
// Solidity: event MaxMagnitudeUpdated(address operator, address strategy, uint64 maxMagnitude)
func (_AllocationManager *AllocationManagerFilterer) FilterMaxMagnitudeUpdated(opts *bind.FilterOpts) (*AllocationManagerMaxMagnitudeUpdatedIterator, error)
⋮----
// WatchMaxMagnitudeUpdated is a free log subscription operation binding the contract event 0x1c6458079a41077d003c11faf9bf097e693bd67979e4e6500bac7b29db779b5c.
⋮----
func (_AllocationManager *AllocationManagerFilterer) WatchMaxMagnitudeUpdated(opts *bind.WatchOpts, sink chan<- *AllocationManagerMaxMagnitudeUpdated) (event.Subscription, error)
⋮----
// ParseMaxMagnitudeUpdated is a log parse operation binding the contract event 0x1c6458079a41077d003c11faf9bf097e693bd67979e4e6500bac7b29db779b5c.
⋮----
func (_AllocationManager *AllocationManagerFilterer) ParseMaxMagnitudeUpdated(log types.Log) (*AllocationManagerMaxMagnitudeUpdated, error)
⋮----
// AllocationManagerOperatorAddedToOperatorSetIterator is returned from FilterOperatorAddedToOperatorSet and is used to iterate over the raw logs and unpacked data for OperatorAddedToOperatorSet events raised by the AllocationManager contract.
type AllocationManagerOperatorAddedToOperatorSetIterator struct {
	Event *AllocationManagerOperatorAddedToOperatorSet // 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
}
⋮----
Event *AllocationManagerOperatorAddedToOperatorSet // Event containing the contract specifics and raw log
⋮----
// AllocationManagerOperatorAddedToOperatorSet represents a OperatorAddedToOperatorSet event raised by the AllocationManager contract.
type AllocationManagerOperatorAddedToOperatorSet struct {
	Operator    common.Address
	OperatorSet OperatorSet
	Raw         types.Log // Blockchain specific contextual infos
}
⋮----
// FilterOperatorAddedToOperatorSet is a free log retrieval operation binding the contract event 0x43232edf9071753d2321e5fa7e018363ee248e5f2142e6c08edd3265bfb4895e.
⋮----
// Solidity: event OperatorAddedToOperatorSet(address indexed operator, (address,uint32) operatorSet)
func (_AllocationManager *AllocationManagerFilterer) FilterOperatorAddedToOperatorSet(opts *bind.FilterOpts, operator []common.Address) (*AllocationManagerOperatorAddedToOperatorSetIterator, error)
⋮----
var operatorRule []interface{}
⋮----
// WatchOperatorAddedToOperatorSet is a free log subscription operation binding the contract event 0x43232edf9071753d2321e5fa7e018363ee248e5f2142e6c08edd3265bfb4895e.
⋮----
func (_AllocationManager *AllocationManagerFilterer) WatchOperatorAddedToOperatorSet(opts *bind.WatchOpts, sink chan<- *AllocationManagerOperatorAddedToOperatorSet, operator []common.Address) (event.Subscription, error)
⋮----
// ParseOperatorAddedToOperatorSet is a log parse operation binding the contract event 0x43232edf9071753d2321e5fa7e018363ee248e5f2142e6c08edd3265bfb4895e.
⋮----
func (_AllocationManager *AllocationManagerFilterer) ParseOperatorAddedToOperatorSet(log types.Log) (*AllocationManagerOperatorAddedToOperatorSet, error)
⋮----
// AllocationManagerOperatorRemovedFromOperatorSetIterator is returned from FilterOperatorRemovedFromOperatorSet and is used to iterate over the raw logs and unpacked data for OperatorRemovedFromOperatorSet events raised by the AllocationManager contract.
type AllocationManagerOperatorRemovedFromOperatorSetIterator struct {
	Event *AllocationManagerOperatorRemovedFromOperatorSet // 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
}
⋮----
Event *AllocationManagerOperatorRemovedFromOperatorSet // Event containing the contract specifics and raw log
⋮----
// AllocationManagerOperatorRemovedFromOperatorSet represents a OperatorRemovedFromOperatorSet event raised by the AllocationManager contract.
type AllocationManagerOperatorRemovedFromOperatorSet struct {
	Operator    common.Address
	OperatorSet OperatorSet
	Raw         types.Log // Blockchain specific contextual infos
}
⋮----
// FilterOperatorRemovedFromOperatorSet is a free log retrieval operation binding the contract event 0xad34c3070be1dffbcaa499d000ba2b8d9848aefcac3059df245dd95c4ece14fe.
⋮----
// Solidity: event OperatorRemovedFromOperatorSet(address indexed operator, (address,uint32) operatorSet)
func (_AllocationManager *AllocationManagerFilterer) FilterOperatorRemovedFromOperatorSet(opts *bind.FilterOpts, operator []common.Address) (*AllocationManagerOperatorRemovedFromOperatorSetIterator, error)
⋮----
// WatchOperatorRemovedFromOperatorSet is a free log subscription operation binding the contract event 0xad34c3070be1dffbcaa499d000ba2b8d9848aefcac3059df245dd95c4ece14fe.
⋮----
func (_AllocationManager *AllocationManagerFilterer) WatchOperatorRemovedFromOperatorSet(opts *bind.WatchOpts, sink chan<- *AllocationManagerOperatorRemovedFromOperatorSet, operator []common.Address) (event.Subscription, error)
⋮----
// ParseOperatorRemovedFromOperatorSet is a log parse operation binding the contract event 0xad34c3070be1dffbcaa499d000ba2b8d9848aefcac3059df245dd95c4ece14fe.
⋮----
func (_AllocationManager *AllocationManagerFilterer) ParseOperatorRemovedFromOperatorSet(log types.Log) (*AllocationManagerOperatorRemovedFromOperatorSet, error)
⋮----
// AllocationManagerOperatorSetCreatedIterator is returned from FilterOperatorSetCreated and is used to iterate over the raw logs and unpacked data for OperatorSetCreated events raised by the AllocationManager contract.
type AllocationManagerOperatorSetCreatedIterator struct {
	Event *AllocationManagerOperatorSetCreated // 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
}
⋮----
Event *AllocationManagerOperatorSetCreated // Event containing the contract specifics and raw log
⋮----
// AllocationManagerOperatorSetCreated represents a OperatorSetCreated event raised by the AllocationManager contract.
type AllocationManagerOperatorSetCreated struct {
	OperatorSet OperatorSet
	Raw         types.Log // Blockchain specific contextual infos
}
⋮----
// FilterOperatorSetCreated is a free log retrieval operation binding the contract event 0x31629285ead2335ae0933f86ed2ae63321f7af77b4e6eaabc42c057880977e6c.
⋮----
// Solidity: event OperatorSetCreated((address,uint32) operatorSet)
func (_AllocationManager *AllocationManagerFilterer) FilterOperatorSetCreated(opts *bind.FilterOpts) (*AllocationManagerOperatorSetCreatedIterator, error)
⋮----
// WatchOperatorSetCreated is a free log subscription operation binding the contract event 0x31629285ead2335ae0933f86ed2ae63321f7af77b4e6eaabc42c057880977e6c.
⋮----
func (_AllocationManager *AllocationManagerFilterer) WatchOperatorSetCreated(opts *bind.WatchOpts, sink chan<- *AllocationManagerOperatorSetCreated) (event.Subscription, error)
⋮----
// ParseOperatorSetCreated is a log parse operation binding the contract event 0x31629285ead2335ae0933f86ed2ae63321f7af77b4e6eaabc42c057880977e6c.
⋮----
func (_AllocationManager *AllocationManagerFilterer) ParseOperatorSetCreated(log types.Log) (*AllocationManagerOperatorSetCreated, error)
⋮----
// AllocationManagerOperatorSlashedIterator is returned from FilterOperatorSlashed and is used to iterate over the raw logs and unpacked data for OperatorSlashed events raised by the AllocationManager contract.
type AllocationManagerOperatorSlashedIterator struct {
	Event *AllocationManagerOperatorSlashed // 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
}
⋮----
Event *AllocationManagerOperatorSlashed // Event containing the contract specifics and raw log
⋮----
// AllocationManagerOperatorSlashed represents a OperatorSlashed event raised by the AllocationManager contract.
type AllocationManagerOperatorSlashed struct {
	Operator    common.Address
	OperatorSet OperatorSet
	Strategies  []common.Address
	WadSlashed  []*big.Int
	Description string
	Raw         types.Log // Blockchain specific contextual infos
}
⋮----
// FilterOperatorSlashed is a free log retrieval operation binding the contract event 0x80969ad29428d6797ee7aad084f9e4a42a82fc506dcd2ca3b6fb431f85ccebe5.
⋮----
// Solidity: event OperatorSlashed(address operator, (address,uint32) operatorSet, address[] strategies, uint256[] wadSlashed, string description)
func (_AllocationManager *AllocationManagerFilterer) FilterOperatorSlashed(opts *bind.FilterOpts) (*AllocationManagerOperatorSlashedIterator, error)
⋮----
// WatchOperatorSlashed is a free log subscription operation binding the contract event 0x80969ad29428d6797ee7aad084f9e4a42a82fc506dcd2ca3b6fb431f85ccebe5.
⋮----
func (_AllocationManager *AllocationManagerFilterer) WatchOperatorSlashed(opts *bind.WatchOpts, sink chan<- *AllocationManagerOperatorSlashed) (event.Subscription, error)
⋮----
// ParseOperatorSlashed is a log parse operation binding the contract event 0x80969ad29428d6797ee7aad084f9e4a42a82fc506dcd2ca3b6fb431f85ccebe5.
⋮----
func (_AllocationManager *AllocationManagerFilterer) ParseOperatorSlashed(log types.Log) (*AllocationManagerOperatorSlashed, error)
⋮----
// AllocationManagerPausedIterator is returned from FilterPaused and is used to iterate over the raw logs and unpacked data for Paused events raised by the AllocationManager contract.
type AllocationManagerPausedIterator struct {
	Event *AllocationManagerPaused // 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
}
⋮----
Event *AllocationManagerPaused // Event containing the contract specifics and raw log
⋮----
// AllocationManagerPaused represents a Paused event raised by the AllocationManager contract.
type AllocationManagerPaused struct {
	Account         common.Address
	NewPausedStatus *big.Int
	Raw             types.Log // Blockchain specific contextual infos
}
⋮----
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 (_AllocationManager *AllocationManagerFilterer) FilterPaused(opts *bind.FilterOpts, account []common.Address) (*AllocationManagerPausedIterator, error)
⋮----
var accountRule []interface{}
⋮----
// WatchPaused is a free log subscription operation binding the contract event 0xab40a374bc51de372200a8bc981af8c9ecdc08dfdaef0bb6e09f88f3c616ef3d.
⋮----
func (_AllocationManager *AllocationManagerFilterer) WatchPaused(opts *bind.WatchOpts, sink chan<- *AllocationManagerPaused, account []common.Address) (event.Subscription, error)
⋮----
// ParsePaused is a log parse operation binding the contract event 0xab40a374bc51de372200a8bc981af8c9ecdc08dfdaef0bb6e09f88f3c616ef3d.
⋮----
func (_AllocationManager *AllocationManagerFilterer) ParsePaused(log types.Log) (*AllocationManagerPaused, error)
⋮----
// AllocationManagerRedistributionAddressSetIterator is returned from FilterRedistributionAddressSet and is used to iterate over the raw logs and unpacked data for RedistributionAddressSet events raised by the AllocationManager contract.
type AllocationManagerRedistributionAddressSetIterator struct {
	Event *AllocationManagerRedistributionAddressSet // 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
}
⋮----
Event *AllocationManagerRedistributionAddressSet // Event containing the contract specifics and raw log
⋮----
// AllocationManagerRedistributionAddressSet represents a RedistributionAddressSet event raised by the AllocationManager contract.
type AllocationManagerRedistributionAddressSet struct {
	OperatorSet             OperatorSet
	RedistributionRecipient common.Address
	Raw                     types.Log // Blockchain specific contextual infos
}
⋮----
Raw                     types.Log // Blockchain specific contextual infos
⋮----
// FilterRedistributionAddressSet is a free log retrieval operation binding the contract event 0x90a6fa2a9b79b910872ebca540cf3bd8be827f586e6420c30d8836e30012907e.
⋮----
// Solidity: event RedistributionAddressSet((address,uint32) operatorSet, address redistributionRecipient)
func (_AllocationManager *AllocationManagerFilterer) FilterRedistributionAddressSet(opts *bind.FilterOpts) (*AllocationManagerRedistributionAddressSetIterator, error)
⋮----
// WatchRedistributionAddressSet is a free log subscription operation binding the contract event 0x90a6fa2a9b79b910872ebca540cf3bd8be827f586e6420c30d8836e30012907e.
⋮----
func (_AllocationManager *AllocationManagerFilterer) WatchRedistributionAddressSet(opts *bind.WatchOpts, sink chan<- *AllocationManagerRedistributionAddressSet) (event.Subscription, error)
⋮----
// ParseRedistributionAddressSet is a log parse operation binding the contract event 0x90a6fa2a9b79b910872ebca540cf3bd8be827f586e6420c30d8836e30012907e.
⋮----
func (_AllocationManager *AllocationManagerFilterer) ParseRedistributionAddressSet(log types.Log) (*AllocationManagerRedistributionAddressSet, error)
⋮----
// AllocationManagerSlasherMigratedIterator is returned from FilterSlasherMigrated and is used to iterate over the raw logs and unpacked data for SlasherMigrated events raised by the AllocationManager contract.
type AllocationManagerSlasherMigratedIterator struct {
	Event *AllocationManagerSlasherMigrated // 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
}
⋮----
Event *AllocationManagerSlasherMigrated // Event containing the contract specifics and raw log
⋮----
// AllocationManagerSlasherMigrated represents a SlasherMigrated event raised by the AllocationManager contract.
type AllocationManagerSlasherMigrated struct {
	OperatorSet OperatorSet
	Slasher     common.Address
	Raw         types.Log // Blockchain specific contextual infos
}
⋮----
// FilterSlasherMigrated is a free log retrieval operation binding the contract event 0xf0c8fc7d71f647bd3a88ac369112517f6a4b8038e71913f2d20f71f877dfc725.
⋮----
// Solidity: event SlasherMigrated((address,uint32) operatorSet, address slasher)
func (_AllocationManager *AllocationManagerFilterer) FilterSlasherMigrated(opts *bind.FilterOpts) (*AllocationManagerSlasherMigratedIterator, error)
⋮----
// WatchSlasherMigrated is a free log subscription operation binding the contract event 0xf0c8fc7d71f647bd3a88ac369112517f6a4b8038e71913f2d20f71f877dfc725.
⋮----
func (_AllocationManager *AllocationManagerFilterer) WatchSlasherMigrated(opts *bind.WatchOpts, sink chan<- *AllocationManagerSlasherMigrated) (event.Subscription, error)
⋮----
// ParseSlasherMigrated is a log parse operation binding the contract event 0xf0c8fc7d71f647bd3a88ac369112517f6a4b8038e71913f2d20f71f877dfc725.
⋮----
func (_AllocationManager *AllocationManagerFilterer) ParseSlasherMigrated(log types.Log) (*AllocationManagerSlasherMigrated, error)
⋮----
// AllocationManagerSlasherUpdatedIterator is returned from FilterSlasherUpdated and is used to iterate over the raw logs and unpacked data for SlasherUpdated events raised by the AllocationManager contract.
type AllocationManagerSlasherUpdatedIterator struct {
	Event *AllocationManagerSlasherUpdated // 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
}
⋮----
Event *AllocationManagerSlasherUpdated // Event containing the contract specifics and raw log
⋮----
// AllocationManagerSlasherUpdated represents a SlasherUpdated event raised by the AllocationManager contract.
type AllocationManagerSlasherUpdated struct {
	OperatorSet OperatorSet
	Slasher     common.Address
	EffectBlock uint32
	Raw         types.Log // Blockchain specific contextual infos
}
⋮----
// FilterSlasherUpdated is a free log retrieval operation binding the contract event 0x3873f29d7a65a4d75f5ba28909172f486216a1420e77c3c2720815951a6b4f57.
⋮----
// Solidity: event SlasherUpdated((address,uint32) operatorSet, address slasher, uint32 effectBlock)
func (_AllocationManager *AllocationManagerFilterer) FilterSlasherUpdated(opts *bind.FilterOpts) (*AllocationManagerSlasherUpdatedIterator, error)
⋮----
// WatchSlasherUpdated is a free log subscription operation binding the contract event 0x3873f29d7a65a4d75f5ba28909172f486216a1420e77c3c2720815951a6b4f57.
⋮----
func (_AllocationManager *AllocationManagerFilterer) WatchSlasherUpdated(opts *bind.WatchOpts, sink chan<- *AllocationManagerSlasherUpdated) (event.Subscription, error)
⋮----
// ParseSlasherUpdated is a log parse operation binding the contract event 0x3873f29d7a65a4d75f5ba28909172f486216a1420e77c3c2720815951a6b4f57.
⋮----
func (_AllocationManager *AllocationManagerFilterer) ParseSlasherUpdated(log types.Log) (*AllocationManagerSlasherUpdated, error)
⋮----
// AllocationManagerStrategyAddedToOperatorSetIterator is returned from FilterStrategyAddedToOperatorSet and is used to iterate over the raw logs and unpacked data for StrategyAddedToOperatorSet events raised by the AllocationManager contract.
type AllocationManagerStrategyAddedToOperatorSetIterator struct {
	Event *AllocationManagerStrategyAddedToOperatorSet // 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
}
⋮----
Event *AllocationManagerStrategyAddedToOperatorSet // Event containing the contract specifics and raw log
⋮----
// AllocationManagerStrategyAddedToOperatorSet represents a StrategyAddedToOperatorSet event raised by the AllocationManager contract.
type AllocationManagerStrategyAddedToOperatorSet struct {
	OperatorSet OperatorSet
	Strategy    common.Address
	Raw         types.Log // Blockchain specific contextual infos
}
⋮----
// FilterStrategyAddedToOperatorSet is a free log retrieval operation binding the contract event 0x7ab260fe0af193db5f4986770d831bda4ea46099dc817e8b6716dcae8af8e88b.
⋮----
// Solidity: event StrategyAddedToOperatorSet((address,uint32) operatorSet, address strategy)
func (_AllocationManager *AllocationManagerFilterer) FilterStrategyAddedToOperatorSet(opts *bind.FilterOpts) (*AllocationManagerStrategyAddedToOperatorSetIterator, error)
⋮----
// WatchStrategyAddedToOperatorSet is a free log subscription operation binding the contract event 0x7ab260fe0af193db5f4986770d831bda4ea46099dc817e8b6716dcae8af8e88b.
⋮----
func (_AllocationManager *AllocationManagerFilterer) WatchStrategyAddedToOperatorSet(opts *bind.WatchOpts, sink chan<- *AllocationManagerStrategyAddedToOperatorSet) (event.Subscription, error)
⋮----
// ParseStrategyAddedToOperatorSet is a log parse operation binding the contract event 0x7ab260fe0af193db5f4986770d831bda4ea46099dc817e8b6716dcae8af8e88b.
⋮----
func (_AllocationManager *AllocationManagerFilterer) ParseStrategyAddedToOperatorSet(log types.Log) (*AllocationManagerStrategyAddedToOperatorSet, error)
⋮----
// AllocationManagerStrategyRemovedFromOperatorSetIterator is returned from FilterStrategyRemovedFromOperatorSet and is used to iterate over the raw logs and unpacked data for StrategyRemovedFromOperatorSet events raised by the AllocationManager contract.
type AllocationManagerStrategyRemovedFromOperatorSetIterator struct {
	Event *AllocationManagerStrategyRemovedFromOperatorSet // 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
}
⋮----
Event *AllocationManagerStrategyRemovedFromOperatorSet // Event containing the contract specifics and raw log
⋮----
// AllocationManagerStrategyRemovedFromOperatorSet represents a StrategyRemovedFromOperatorSet event raised by the AllocationManager contract.
type AllocationManagerStrategyRemovedFromOperatorSet struct {
	OperatorSet OperatorSet
	Strategy    common.Address
	Raw         types.Log // Blockchain specific contextual infos
}
⋮----
// FilterStrategyRemovedFromOperatorSet is a free log retrieval operation binding the contract event 0x7b4b073d80dcac55a11177d8459ad9f664ceeb91f71f27167bb14f8152a7eeee.
⋮----
// Solidity: event StrategyRemovedFromOperatorSet((address,uint32) operatorSet, address strategy)
func (_AllocationManager *AllocationManagerFilterer) FilterStrategyRemovedFromOperatorSet(opts *bind.FilterOpts) (*AllocationManagerStrategyRemovedFromOperatorSetIterator, error)
⋮----
// WatchStrategyRemovedFromOperatorSet is a free log subscription operation binding the contract event 0x7b4b073d80dcac55a11177d8459ad9f664ceeb91f71f27167bb14f8152a7eeee.
⋮----
func (_AllocationManager *AllocationManagerFilterer) WatchStrategyRemovedFromOperatorSet(opts *bind.WatchOpts, sink chan<- *AllocationManagerStrategyRemovedFromOperatorSet) (event.Subscription, error)
⋮----
// ParseStrategyRemovedFromOperatorSet is a log parse operation binding the contract event 0x7b4b073d80dcac55a11177d8459ad9f664ceeb91f71f27167bb14f8152a7eeee.
⋮----
func (_AllocationManager *AllocationManagerFilterer) ParseStrategyRemovedFromOperatorSet(log types.Log) (*AllocationManagerStrategyRemovedFromOperatorSet, error)
⋮----
// AllocationManagerUnpausedIterator is returned from FilterUnpaused and is used to iterate over the raw logs and unpacked data for Unpaused events raised by the AllocationManager contract.
type AllocationManagerUnpausedIterator struct {
	Event *AllocationManagerUnpaused // 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
}
⋮----
Event *AllocationManagerUnpaused // Event containing the contract specifics and raw log
⋮----
// AllocationManagerUnpaused represents a Unpaused event raised by the AllocationManager contract.
type AllocationManagerUnpaused 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 (_AllocationManager *AllocationManagerFilterer) FilterUnpaused(opts *bind.FilterOpts, account []common.Address) (*AllocationManagerUnpausedIterator, error)
⋮----
// WatchUnpaused is a free log subscription operation binding the contract event 0x3582d1828e26bf56bd801502bc021ac0bc8afb57c826e4986b45593c8fad389c.
⋮----
func (_AllocationManager *AllocationManagerFilterer) WatchUnpaused(opts *bind.WatchOpts, sink chan<- *AllocationManagerUnpaused, account []common.Address) (event.Subscription, error)
⋮----
// ParseUnpaused is a log parse operation binding the contract event 0x3582d1828e26bf56bd801502bc021ac0bc8afb57c826e4986b45593c8fad389c.
⋮----
func (_AllocationManager *AllocationManagerFilterer) ParseUnpaused(log types.Log) (*AllocationManagerUnpaused, error)
````

## File: pkg/bindings/AllocationManagerStorage/binding.go
````go
// Code generated - DO NOT EDIT.
// This file is a generated binding and any manual changes will be lost.
⋮----
package AllocationManagerStorage
⋮----
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"
)
⋮----
"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
)
⋮----
// OperatorSet is an auto generated low-level Go binding around an user-defined struct.
type OperatorSet struct {
	Avs common.Address
	Id  uint32
}
⋮----
// AllocationManagerStorageMetaData contains all meta data concerning the AllocationManagerStorage contract.
var AllocationManagerStorageMetaData = &bind.MetaData{
	ABI: "[{\"type\":\"function\",\"name\":\"ALLOCATION_CONFIGURATION_DELAY\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"DEALLOCATION_DELAY\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"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\":\"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}]",
}
⋮----
// AllocationManagerStorageABI is the input ABI used to generate the binding from.
// Deprecated: Use AllocationManagerStorageMetaData.ABI instead.
var AllocationManagerStorageABI = AllocationManagerStorageMetaData.ABI
⋮----
// AllocationManagerStorage is an auto generated Go binding around an Ethereum contract.
type AllocationManagerStorage struct {
	AllocationManagerStorageCaller     // Read-only binding to the contract
	AllocationManagerStorageTransactor // Write-only binding to the contract
	AllocationManagerStorageFilterer   // Log filterer for contract events
}
⋮----
AllocationManagerStorageCaller     // Read-only binding to the contract
AllocationManagerStorageTransactor // Write-only binding to the contract
AllocationManagerStorageFilterer   // Log filterer for contract events
⋮----
// AllocationManagerStorageCaller is an auto generated read-only Go binding around an Ethereum contract.
type AllocationManagerStorageCaller struct {
	contract *bind.BoundContract // Generic contract wrapper for the low level calls
}
⋮----
contract *bind.BoundContract // Generic contract wrapper for the low level calls
⋮----
// AllocationManagerStorageTransactor is an auto generated write-only Go binding around an Ethereum contract.
type AllocationManagerStorageTransactor struct {
	contract *bind.BoundContract // Generic contract wrapper for the low level calls
}
⋮----
// AllocationManagerStorageFilterer is an auto generated log filtering Go binding around an Ethereum contract events.
type AllocationManagerStorageFilterer struct {
	contract *bind.BoundContract // Generic contract wrapper for the low level calls
}
⋮----
// AllocationManagerStorageSession is an auto generated Go binding around an Ethereum contract,
// with pre-set call and transact options.
type AllocationManagerStorageSession struct {
	Contract     *AllocationManagerStorage // 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
}
⋮----
Contract     *AllocationManagerStorage // 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
⋮----
// AllocationManagerStorageCallerSession is an auto generated read-only Go binding around an Ethereum contract,
// with pre-set call options.
type AllocationManagerStorageCallerSession struct {
	Contract *AllocationManagerStorageCaller // Generic contract caller binding to set the session for
	CallOpts bind.CallOpts                   // Call options to use throughout this session
}
⋮----
Contract *AllocationManagerStorageCaller // Generic contract caller binding to set the session for
CallOpts bind.CallOpts                   // Call options to use throughout this session
⋮----
// AllocationManagerStorageTransactorSession is an auto generated write-only Go binding around an Ethereum contract,
// with pre-set transact options.
type AllocationManagerStorageTransactorSession struct {
	Contract     *AllocationManagerStorageTransactor // Generic contract transactor binding to set the session for
	TransactOpts bind.TransactOpts                   // Transaction auth options to use throughout this session
}
⋮----
Contract     *AllocationManagerStorageTransactor // Generic contract transactor binding to set the session for
TransactOpts bind.TransactOpts                   // Transaction auth options to use throughout this session
⋮----
// AllocationManagerStorageRaw is an auto generated low-level Go binding around an Ethereum contract.
type AllocationManagerStorageRaw struct {
	Contract *AllocationManagerStorage // Generic contract binding to access the raw methods on
}
⋮----
Contract *AllocationManagerStorage // Generic contract binding to access the raw methods on
⋮----
// AllocationManagerStorageCallerRaw is an auto generated low-level read-only Go binding around an Ethereum contract.
type AllocationManagerStorageCallerRaw struct {
	Contract *AllocationManagerStorageCaller // Generic read-only contract binding to access the raw methods on
}
⋮----
Contract *AllocationManagerStorageCaller // Generic read-only contract binding to access the raw methods on
⋮----
// AllocationManagerStorageTransactorRaw is an auto generated low-level write-only Go binding around an Ethereum contract.
type AllocationManagerStorageTransactorRaw struct {
	Contract *AllocationManagerStorageTransactor // Generic write-only contract binding to access the raw methods on
}
⋮----
Contract *AllocationManagerStorageTransactor // Generic write-only contract binding to access the raw methods on
⋮----
// NewAllocationManagerStorage creates a new instance of AllocationManagerStorage, bound to a specific deployed contract.
func NewAllocationManagerStorage(address common.Address, backend bind.ContractBackend) (*AllocationManagerStorage, error)
⋮----
// NewAllocationManagerStorageCaller creates a new read-only instance of AllocationManagerStorage, bound to a specific deployed contract.
func NewAllocationManagerStorageCaller(address common.Address, caller bind.ContractCaller) (*AllocationManagerStorageCaller, error)
⋮----
// NewAllocationManagerStorageTransactor creates a new write-only instance of AllocationManagerStorage, bound to a specific deployed contract.
func NewAllocationManagerStorageTransactor(address common.Address, transactor bind.ContractTransactor) (*AllocationManagerStorageTransactor, error)
⋮----
// NewAllocationManagerStorageFilterer creates a new log filterer instance of AllocationManagerStorage, bound to a specific deployed contract.
func NewAllocationManagerStorageFilterer(address common.Address, filterer bind.ContractFilterer) (*AllocationManagerStorageFilterer, error)
⋮----
// bindAllocationManagerStorage binds a generic wrapper to an already deployed contract.
func bindAllocationManagerStorage(address common.Address, caller bind.ContractCaller, transactor bind.ContractTransactor, filterer bind.ContractFilterer) (*bind.BoundContract, error)
⋮----
// 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 (_AllocationManagerStorage *AllocationManagerStorageRaw) Call(opts *bind.CallOpts, result *[]interface
⋮----
// Transfer initiates a plain transaction to move funds to the contract, calling
// its default method if one is available.
func (_AllocationManagerStorage *AllocationManagerStorageRaw) Transfer(opts *bind.TransactOpts) (*types.Transaction, error)
⋮----
// Transact invokes the (paid) contract method with params as input values.
func (_AllocationManagerStorage *AllocationManagerStorageRaw) Transact(opts *bind.TransactOpts, method string, params ...interface
⋮----
// ALLOCATIONCONFIGURATIONDELAY is a free data retrieval call binding the contract method 0x7bc1ef61.
//
// Solidity: function ALLOCATION_CONFIGURATION_DELAY() view returns(uint32)
func (_AllocationManagerStorage *AllocationManagerStorageCaller) ALLOCATIONCONFIGURATIONDELAY(opts *bind.CallOpts) (uint32, error)
⋮----
var out []interface{}
⋮----
// DEALLOCATIONDELAY is a free data retrieval call binding the contract method 0x2981eb77.
⋮----
// Solidity: function DEALLOCATION_DELAY() view returns(uint32)
func (_AllocationManagerStorage *AllocationManagerStorageCaller) DEALLOCATIONDELAY(opts *bind.CallOpts) (uint32, error)
⋮----
// SLASHERCONFIGURATIONDELAY is a free data retrieval call binding the contract method 0x67aeaa53.
⋮----
// Solidity: function SLASHER_CONFIGURATION_DELAY() view returns(uint32)
func (_AllocationManagerStorage *AllocationManagerStorageCaller) SLASHERCONFIGURATIONDELAY(opts *bind.CallOpts) (uint32, error)
⋮----
// Delegation is a free data retrieval call binding the contract method 0xdf5cf723.
⋮----
// Solidity: function delegation() view returns(address)
func (_AllocationManagerStorage *AllocationManagerStorageCaller) Delegation(opts *bind.CallOpts) (common.Address, error)
⋮----
// EigenStrategy is a free data retrieval call binding the contract method 0xdb4df761.
⋮----
// Solidity: function eigenStrategy() view returns(address)
func (_AllocationManagerStorage *AllocationManagerStorageCaller) EigenStrategy(opts *bind.CallOpts) (common.Address, error)
⋮----
// AllocationManagerStorageAVSMetadataURIUpdatedIterator is returned from FilterAVSMetadataURIUpdated and is used to iterate over the raw logs and unpacked data for AVSMetadataURIUpdated events raised by the AllocationManagerStorage contract.
type AllocationManagerStorageAVSMetadataURIUpdatedIterator struct {
	Event *AllocationManagerStorageAVSMetadataURIUpdated // 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
}
⋮----
Event *AllocationManagerStorageAVSMetadataURIUpdated // 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 *AllocationManagerStorageAVSMetadataURIUpdatedIterator) Next() bool
⋮----
// If the iterator failed, stop iterating
⋮----
// If the iterator completed, deliver directly whatever's available
⋮----
// Iterator still in progress, wait for either a data or an error event
⋮----
// Error returns any retrieval or parsing error occurred during filtering.
func (it *AllocationManagerStorageAVSMetadataURIUpdatedIterator) Error() error
⋮----
// Close terminates the iteration process, releasing any pending underlying
// resources.
func (it *AllocationManagerStorageAVSMetadataURIUpdatedIterator) Close() error
⋮----
// AllocationManagerStorageAVSMetadataURIUpdated represents a AVSMetadataURIUpdated event raised by the AllocationManagerStorage contract.
type AllocationManagerStorageAVSMetadataURIUpdated struct {
	Avs         common.Address
	MetadataURI string
	Raw         types.Log // Blockchain specific contextual infos
}
⋮----
Raw         types.Log // Blockchain specific contextual infos
⋮----
// FilterAVSMetadataURIUpdated is a free log retrieval operation binding the contract event 0xa89c1dc243d8908a96dd84944bcc97d6bc6ac00dd78e20621576be6a3c943713.
⋮----
// Solidity: event AVSMetadataURIUpdated(address indexed avs, string metadataURI)
func (_AllocationManagerStorage *AllocationManagerStorageFilterer) FilterAVSMetadataURIUpdated(opts *bind.FilterOpts, avs []common.Address) (*AllocationManagerStorageAVSMetadataURIUpdatedIterator, error)
⋮----
var avsRule []interface{}
⋮----
// WatchAVSMetadataURIUpdated is a free log subscription operation binding the contract event 0xa89c1dc243d8908a96dd84944bcc97d6bc6ac00dd78e20621576be6a3c943713.
⋮----
func (_AllocationManagerStorage *AllocationManagerStorageFilterer) WatchAVSMetadataURIUpdated(opts *bind.WatchOpts, sink chan<- *AllocationManagerStorageAVSMetadataURIUpdated, avs []common.Address) (event.Subscription, error)
⋮----
// New log arrived, parse the event and forward to the user
⋮----
// ParseAVSMetadataURIUpdated is a log parse operation binding the contract event 0xa89c1dc243d8908a96dd84944bcc97d6bc6ac00dd78e20621576be6a3c943713.
⋮----
func (_AllocationManagerStorage *AllocationManagerStorageFilterer) ParseAVSMetadataURIUpdated(log types.Log) (*AllocationManagerStorageAVSMetadataURIUpdated, error)
⋮----
// AllocationManagerStorageAVSRegistrarSetIterator is returned from FilterAVSRegistrarSet and is used to iterate over the raw logs and unpacked data for AVSRegistrarSet events raised by the AllocationManagerStorage contract.
type AllocationManagerStorageAVSRegistrarSetIterator struct {
	Event *AllocationManagerStorageAVSRegistrarSet // 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
}
⋮----
Event *AllocationManagerStorageAVSRegistrarSet // Event containing the contract specifics and raw log
⋮----
// AllocationManagerStorageAVSRegistrarSet represents a AVSRegistrarSet event raised by the AllocationManagerStorage contract.
type AllocationManagerStorageAVSRegistrarSet struct {
	Avs       common.Address
	Registrar common.Address
	Raw       types.Log // Blockchain specific contextual infos
}
⋮----
Raw       types.Log // Blockchain specific contextual infos
⋮----
// FilterAVSRegistrarSet is a free log retrieval operation binding the contract event 0x2ae945c40c44dc0ec263f95609c3fdc6952e0aefa22d6374e44f2c997acedf85.
⋮----
// Solidity: event AVSRegistrarSet(address avs, address registrar)
func (_AllocationManagerStorage *AllocationManagerStorageFilterer) FilterAVSRegistrarSet(opts *bind.FilterOpts) (*AllocationManagerStorageAVSRegistrarSetIterator, error)
⋮----
// WatchAVSRegistrarSet is a free log subscription operation binding the contract event 0x2ae945c40c44dc0ec263f95609c3fdc6952e0aefa22d6374e44f2c997acedf85.
⋮----
func (_AllocationManagerStorage *AllocationManagerStorageFilterer) WatchAVSRegistrarSet(opts *bind.WatchOpts, sink chan<- *AllocationManagerStorageAVSRegistrarSet) (event.Subscription, error)
⋮----
// ParseAVSRegistrarSet is a log parse operation binding the contract event 0x2ae945c40c44dc0ec263f95609c3fdc6952e0aefa22d6374e44f2c997acedf85.
⋮----
func (_AllocationManagerStorage *AllocationManagerStorageFilterer) ParseAVSRegistrarSet(log types.Log) (*AllocationManagerStorageAVSRegistrarSet, error)
⋮----
// AllocationManagerStorageAllocationDelaySetIterator is returned from FilterAllocationDelaySet and is used to iterate over the raw logs and unpacked data for AllocationDelaySet events raised by the AllocationManagerStorage contract.
type AllocationManagerStorageAllocationDelaySetIterator struct {
	Event *AllocationManagerStorageAllocationDelaySet // 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
}
⋮----
Event *AllocationManagerStorageAllocationDelaySet // Event containing the contract specifics and raw log
⋮----
// AllocationManagerStorageAllocationDelaySet represents a AllocationDelaySet event raised by the AllocationManagerStorage contract.
type AllocationManagerStorageAllocationDelaySet struct {
	Operator    common.Address
	Delay       uint32
	EffectBlock uint32
	Raw         types.Log // Blockchain specific contextual infos
}
⋮----
// FilterAllocationDelaySet is a free log retrieval operation binding the contract event 0x4e85751d6331506c6c62335f207eb31f12a61e570f34f5c17640308785c6d4db.
⋮----
// Solidity: event AllocationDelaySet(address operator, uint32 delay, uint32 effectBlock)
func (_AllocationManagerStorage *AllocationManagerStorageFilterer) FilterAllocationDelaySet(opts *bind.FilterOpts) (*AllocationManagerStorageAllocationDelaySetIterator, error)
⋮----
// WatchAllocationDelaySet is a free log subscription operation binding the contract event 0x4e85751d6331506c6c62335f207eb31f12a61e570f34f5c17640308785c6d4db.
⋮----
func (_AllocationManagerStorage *AllocationManagerStorageFilterer) WatchAllocationDelaySet(opts *bind.WatchOpts, sink chan<- *AllocationManagerStorageAllocationDelaySet) (event.Subscription, error)
⋮----
// ParseAllocationDelaySet is a log parse operation binding the contract event 0x4e85751d6331506c6c62335f207eb31f12a61e570f34f5c17640308785c6d4db.
⋮----
func (_AllocationManagerStorage *AllocationManagerStorageFilterer) ParseAllocationDelaySet(log types.Log) (*AllocationManagerStorageAllocationDelaySet, error)
⋮----
// AllocationManagerStorageAllocationUpdatedIterator is returned from FilterAllocationUpdated and is used to iterate over the raw logs and unpacked data for AllocationUpdated events raised by the AllocationManagerStorage contract.
type AllocationManagerStorageAllocationUpdatedIterator struct {
	Event *AllocationManagerStorageAllocationUpdated // 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
}
⋮----
Event *AllocationManagerStorageAllocationUpdated // Event containing the contract specifics and raw log
⋮----
// AllocationManagerStorageAllocationUpdated represents a AllocationUpdated event raised by the AllocationManagerStorage contract.
type AllocationManagerStorageAllocationUpdated struct {
	Operator    common.Address
	OperatorSet OperatorSet
	Strategy    common.Address
	Magnitude   uint64
	EffectBlock uint32
	Raw         types.Log // Blockchain specific contextual infos
}
⋮----
// FilterAllocationUpdated is a free log retrieval operation binding the contract event 0x1487af5418c47ee5ea45ef4a93398668120890774a9e13487e61e9dc3baf76dd.
⋮----
// Solidity: event AllocationUpdated(address operator, (address,uint32) operatorSet, address strategy, uint64 magnitude, uint32 effectBlock)
func (_AllocationManagerStorage *AllocationManagerStorageFilterer) FilterAllocationUpdated(opts *bind.FilterOpts) (*AllocationManagerStorageAllocationUpdatedIterator, error)
⋮----
// WatchAllocationUpdated is a free log subscription operation binding the contract event 0x1487af5418c47ee5ea45ef4a93398668120890774a9e13487e61e9dc3baf76dd.
⋮----
func (_AllocationManagerStorage *AllocationManagerStorageFilterer) WatchAllocationUpdated(opts *bind.WatchOpts, sink chan<- *AllocationManagerStorageAllocationUpdated) (event.Subscription, error)
⋮----
// ParseAllocationUpdated is a log parse operation binding the contract event 0x1487af5418c47ee5ea45ef4a93398668120890774a9e13487e61e9dc3baf76dd.
⋮----
func (_AllocationManagerStorage *AllocationManagerStorageFilterer) ParseAllocationUpdated(log types.Log) (*AllocationManagerStorageAllocationUpdated, error)
⋮----
// AllocationManagerStorageEncumberedMagnitudeUpdatedIterator is returned from FilterEncumberedMagnitudeUpdated and is used to iterate over the raw logs and unpacked data for EncumberedMagnitudeUpdated events raised by the AllocationManagerStorage contract.
type AllocationManagerStorageEncumberedMagnitudeUpdatedIterator struct {
	Event *AllocationManagerStorageEncumberedMagnitudeUpdated // 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
}
⋮----
Event *AllocationManagerStorageEncumberedMagnitudeUpdated // Event containing the contract specifics and raw log
⋮----
// AllocationManagerStorageEncumberedMagnitudeUpdated represents a EncumberedMagnitudeUpdated event raised by the AllocationManagerStorage contract.
type AllocationManagerStorageEncumberedMagnitudeUpdated struct {
	Operator            common.Address
	Strategy            common.Address
	EncumberedMagnitude uint64
	Raw                 types.Log // Blockchain specific contextual infos
}
⋮----
Raw                 types.Log // Blockchain specific contextual infos
⋮----
// FilterEncumberedMagnitudeUpdated is a free log retrieval operation binding the contract event 0xacf9095feb3a370c9cf692421c69ef320d4db5c66e6a7d29c7694eb02364fc55.
⋮----
// Solidity: event EncumberedMagnitudeUpdated(address operator, address strategy, uint64 encumberedMagnitude)
func (_AllocationManagerStorage *AllocationManagerStorageFilterer) FilterEncumberedMagnitudeUpdated(opts *bind.FilterOpts) (*AllocationManagerStorageEncumberedMagnitudeUpdatedIterator, error)
⋮----
// WatchEncumberedMagnitudeUpdated is a free log subscription operation binding the contract event 0xacf9095feb3a370c9cf692421c69ef320d4db5c66e6a7d29c7694eb02364fc55.
⋮----
func (_AllocationManagerStorage *AllocationManagerStorageFilterer) WatchEncumberedMagnitudeUpdated(opts *bind.WatchOpts, sink chan<- *AllocationManagerStorageEncumberedMagnitudeUpdated) (event.Subscription, error)
⋮----
// ParseEncumberedMagnitudeUpdated is a log parse operation binding the contract event 0xacf9095feb3a370c9cf692421c69ef320d4db5c66e6a7d29c7694eb02364fc55.
⋮----
func (_AllocationManagerStorage *AllocationManagerStorageFilterer) ParseEncumberedMagnitudeUpdated(log types.Log) (*AllocationManagerStorageEncumberedMagnitudeUpdated, error)
⋮----
// AllocationManagerStorageMaxMagnitudeUpdatedIterator is returned from FilterMaxMagnitudeUpdated and is used to iterate over the raw logs and unpacked data for MaxMagnitudeUpdated events raised by the AllocationManagerStorage contract.
type AllocationManagerStorageMaxMagnitudeUpdatedIterator struct {
	Event *AllocationManagerStorageMaxMagnitudeUpdated // 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
}
⋮----
Event *AllocationManagerStorageMaxMagnitudeUpdated // Event containing the contract specifics and raw log
⋮----
// AllocationManagerStorageMaxMagnitudeUpdated represents a MaxMagnitudeUpdated event raised by the AllocationManagerStorage contract.
type AllocationManagerStorageMaxMagnitudeUpdated struct {
	Operator     common.Address
	Strategy     common.Address
	MaxMagnitude uint64
	Raw          types.Log // Blockchain specific contextual infos
}
⋮----
Raw          types.Log // Blockchain specific contextual infos
⋮----
// FilterMaxMagnitudeUpdated is a free log retrieval operation binding the contract event 0x1c6458079a41077d003c11faf9bf097e693bd67979e4e6500bac7b29db779b5c.
⋮----
// Solidity: event MaxMagnitudeUpdated(address operator, address strategy, uint64 maxMagnitude)
func (_AllocationManagerStorage *AllocationManagerStorageFilterer) FilterMaxMagnitudeUpdated(opts *bind.FilterOpts) (*AllocationManagerStorageMaxMagnitudeUpdatedIterator, error)
⋮----
// WatchMaxMagnitudeUpdated is a free log subscription operation binding the contract event 0x1c6458079a41077d003c11faf9bf097e693bd67979e4e6500bac7b29db779b5c.
⋮----
func (_AllocationManagerStorage *AllocationManagerStorageFilterer) WatchMaxMagnitudeUpdated(opts *bind.WatchOpts, sink chan<- *AllocationManagerStorageMaxMagnitudeUpdated) (event.Subscription, error)
⋮----
// ParseMaxMagnitudeUpdated is a log parse operation binding the contract event 0x1c6458079a41077d003c11faf9bf097e693bd67979e4e6500bac7b29db779b5c.
⋮----
func (_AllocationManagerStorage *AllocationManagerStorageFilterer) ParseMaxMagnitudeUpdated(log types.Log) (*AllocationManagerStorageMaxMagnitudeUpdated, error)
⋮----
// AllocationManagerStorageOperatorAddedToOperatorSetIterator is returned from FilterOperatorAddedToOperatorSet and is used to iterate over the raw logs and unpacked data for OperatorAddedToOperatorSet events raised by the AllocationManagerStorage contract.
type AllocationManagerStorageOperatorAddedToOperatorSetIterator struct {
	Event *AllocationManagerStorageOperatorAddedToOperatorSet // 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
}
⋮----
Event *AllocationManagerStorageOperatorAddedToOperatorSet // Event containing the contract specifics and raw log
⋮----
// AllocationManagerStorageOperatorAddedToOperatorSet represents a OperatorAddedToOperatorSet event raised by the AllocationManagerStorage contract.
type AllocationManagerStorageOperatorAddedToOperatorSet struct {
	Operator    common.Address
	OperatorSet OperatorSet
	Raw         types.Log // Blockchain specific contextual infos
}
⋮----
// FilterOperatorAddedToOperatorSet is a free log retrieval operation binding the contract event 0x43232edf9071753d2321e5fa7e018363ee248e5f2142e6c08edd3265bfb4895e.
⋮----
// Solidity: event OperatorAddedToOperatorSet(address indexed operator, (address,uint32) operatorSet)
func (_AllocationManagerStorage *AllocationManagerStorageFilterer) FilterOperatorAddedToOperatorSet(opts *bind.FilterOpts, operator []common.Address) (*AllocationManagerStorageOperatorAddedToOperatorSetIterator, error)
⋮----
var operatorRule []interface{}
⋮----
// WatchOperatorAddedToOperatorSet is a free log subscription operation binding the contract event 0x43232edf9071753d2321e5fa7e018363ee248e5f2142e6c08edd3265bfb4895e.
⋮----
func (_AllocationManagerStorage *AllocationManagerStorageFilterer) WatchOperatorAddedToOperatorSet(opts *bind.WatchOpts, sink chan<- *AllocationManagerStorageOperatorAddedToOperatorSet, operator []common.Address) (event.Subscription, error)
⋮----
// ParseOperatorAddedToOperatorSet is a log parse operation binding the contract event 0x43232edf9071753d2321e5fa7e018363ee248e5f2142e6c08edd3265bfb4895e.
⋮----
func (_AllocationManagerStorage *AllocationManagerStorageFilterer) ParseOperatorAddedToOperatorSet(log types.Log) (*AllocationManagerStorageOperatorAddedToOperatorSet, error)
⋮----
// AllocationManagerStorageOperatorRemovedFromOperatorSetIterator is returned from FilterOperatorRemovedFromOperatorSet and is used to iterate over the raw logs and unpacked data for OperatorRemovedFromOperatorSet events raised by the AllocationManagerStorage contract.
type AllocationManagerStorageOperatorRemovedFromOperatorSetIterator struct {
	Event *AllocationManagerStorageOperatorRemovedFromOperatorSet // 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
}
⋮----
Event *AllocationManagerStorageOperatorRemovedFromOperatorSet // Event containing the contract specifics and raw log
⋮----
// AllocationManagerStorageOperatorRemovedFromOperatorSet represents a OperatorRemovedFromOperatorSet event raised by the AllocationManagerStorage contract.
type AllocationManagerStorageOperatorRemovedFromOperatorSet struct {
	Operator    common.Address
	OperatorSet OperatorSet
	Raw         types.Log // Blockchain specific contextual infos
}
⋮----
// FilterOperatorRemovedFromOperatorSet is a free log retrieval operation binding the contract event 0xad34c3070be1dffbcaa499d000ba2b8d9848aefcac3059df245dd95c4ece14fe.
⋮----
// Solidity: event OperatorRemovedFromOperatorSet(address indexed operator, (address,uint32) operatorSet)
func (_AllocationManagerStorage *AllocationManagerStorageFilterer) FilterOperatorRemovedFromOperatorSet(opts *bind.FilterOpts, operator []common.Address) (*AllocationManagerStorageOperatorRemovedFromOperatorSetIterator, error)
⋮----
// WatchOperatorRemovedFromOperatorSet is a free log subscription operation binding the contract event 0xad34c3070be1dffbcaa499d000ba2b8d9848aefcac3059df245dd95c4ece14fe.
⋮----
func (_AllocationManagerStorage *AllocationManagerStorageFilterer) WatchOperatorRemovedFromOperatorSet(opts *bind.WatchOpts, sink chan<- *AllocationManagerStorageOperatorRemovedFromOperatorSet, operator []common.Address) (event.Subscription, error)
⋮----
// ParseOperatorRemovedFromOperatorSet is a log parse operation binding the contract event 0xad34c3070be1dffbcaa499d000ba2b8d9848aefcac3059df245dd95c4ece14fe.
⋮----
func (_AllocationManagerStorage *AllocationManagerStorageFilterer) ParseOperatorRemovedFromOperatorSet(log types.Log) (*AllocationManagerStorageOperatorRemovedFromOperatorSet, error)
⋮----
// AllocationManagerStorageOperatorSetCreatedIterator is returned from FilterOperatorSetCreated and is used to iterate over the raw logs and unpacked data for OperatorSetCreated events raised by the AllocationManagerStorage contract.
type AllocationManagerStorageOperatorSetCreatedIterator struct {
	Event *AllocationManagerStorageOperatorSetCreated // 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
}
⋮----
Event *AllocationManagerStorageOperatorSetCreated // Event containing the contract specifics and raw log
⋮----
// AllocationManagerStorageOperatorSetCreated represents a OperatorSetCreated event raised by the AllocationManagerStorage contract.
type AllocationManagerStorageOperatorSetCreated struct {
	OperatorSet OperatorSet
	Raw         types.Log // Blockchain specific contextual infos
}
⋮----
// FilterOperatorSetCreated is a free log retrieval operation binding the contract event 0x31629285ead2335ae0933f86ed2ae63321f7af77b4e6eaabc42c057880977e6c.
⋮----
// Solidity: event OperatorSetCreated((address,uint32) operatorSet)
func (_AllocationManagerStorage *AllocationManagerStorageFilterer) FilterOperatorSetCreated(opts *bind.FilterOpts) (*AllocationManagerStorageOperatorSetCreatedIterator, error)
⋮----
// WatchOperatorSetCreated is a free log subscription operation binding the contract event 0x31629285ead2335ae0933f86ed2ae63321f7af77b4e6eaabc42c057880977e6c.
⋮----
func (_AllocationManagerStorage *AllocationManagerStorageFilterer) WatchOperatorSetCreated(opts *bind.WatchOpts, sink chan<- *AllocationManagerStorageOperatorSetCreated) (event.Subscription, error)
⋮----
// ParseOperatorSetCreated is a log parse operation binding the contract event 0x31629285ead2335ae0933f86ed2ae63321f7af77b4e6eaabc42c057880977e6c.
⋮----
func (_AllocationManagerStorage *AllocationManagerStorageFilterer) ParseOperatorSetCreated(log types.Log) (*AllocationManagerStorageOperatorSetCreated, error)
⋮----
// AllocationManagerStorageOperatorSlashedIterator is returned from FilterOperatorSlashed and is used to iterate over the raw logs and unpacked data for OperatorSlashed events raised by the AllocationManagerStorage contract.
type AllocationManagerStorageOperatorSlashedIterator struct {
	Event *AllocationManagerStorageOperatorSlashed // 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
}
⋮----
Event *AllocationManagerStorageOperatorSlashed // Event containing the contract specifics and raw log
⋮----
// AllocationManagerStorageOperatorSlashed represents a OperatorSlashed event raised by the AllocationManagerStorage contract.
type AllocationManagerStorageOperatorSlashed struct {
	Operator    common.Address
	OperatorSet OperatorSet
	Strategies  []common.Address
	WadSlashed  []*big.Int
	Description string
	Raw         types.Log // Blockchain specific contextual infos
}
⋮----
// FilterOperatorSlashed is a free log retrieval operation binding the contract event 0x80969ad29428d6797ee7aad084f9e4a42a82fc506dcd2ca3b6fb431f85ccebe5.
⋮----
// Solidity: event OperatorSlashed(address operator, (address,uint32) operatorSet, address[] strategies, uint256[] wadSlashed, string description)
func (_AllocationManagerStorage *AllocationManagerStorageFilterer) FilterOperatorSlashed(opts *bind.FilterOpts) (*AllocationManagerStorageOperatorSlashedIterator, error)
⋮----
// WatchOperatorSlashed is a free log subscription operation binding the contract event 0x80969ad29428d6797ee7aad084f9e4a42a82fc506dcd2ca3b6fb431f85ccebe5.
⋮----
func (_AllocationManagerStorage *AllocationManagerStorageFilterer) WatchOperatorSlashed(opts *bind.WatchOpts, sink chan<- *AllocationManagerStorageOperatorSlashed) (event.Subscription, error)
⋮----
// ParseOperatorSlashed is a log parse operation binding the contract event 0x80969ad29428d6797ee7aad084f9e4a42a82fc506dcd2ca3b6fb431f85ccebe5.
⋮----
func (_AllocationManagerStorage *AllocationManagerStorageFilterer) ParseOperatorSlashed(log types.Log) (*AllocationManagerStorageOperatorSlashed, error)
⋮----
// AllocationManagerStorageRedistributionAddressSetIterator is returned from FilterRedistributionAddressSet and is used to iterate over the raw logs and unpacked data for RedistributionAddressSet events raised by the AllocationManagerStorage contract.
type AllocationManagerStorageRedistributionAddressSetIterator struct {
	Event *AllocationManagerStorageRedistributionAddressSet // 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
}
⋮----
Event *AllocationManagerStorageRedistributionAddressSet // Event containing the contract specifics and raw log
⋮----
// AllocationManagerStorageRedistributionAddressSet represents a RedistributionAddressSet event raised by the AllocationManagerStorage contract.
type AllocationManagerStorageRedistributionAddressSet struct {
	OperatorSet             OperatorSet
	RedistributionRecipient common.Address
	Raw                     types.Log // Blockchain specific contextual infos
}
⋮----
Raw                     types.Log // Blockchain specific contextual infos
⋮----
// FilterRedistributionAddressSet is a free log retrieval operation binding the contract event 0x90a6fa2a9b79b910872ebca540cf3bd8be827f586e6420c30d8836e30012907e.
⋮----
// Solidity: event RedistributionAddressSet((address,uint32) operatorSet, address redistributionRecipient)
func (_AllocationManagerStorage *AllocationManagerStorageFilterer) FilterRedistributionAddressSet(opts *bind.FilterOpts) (*AllocationManagerStorageRedistributionAddressSetIterator, error)
⋮----
// WatchRedistributionAddressSet is a free log subscription operation binding the contract event 0x90a6fa2a9b79b910872ebca540cf3bd8be827f586e6420c30d8836e30012907e.
⋮----
func (_AllocationManagerStorage *AllocationManagerStorageFilterer) WatchRedistributionAddressSet(opts *bind.WatchOpts, sink chan<- *AllocationManagerStorageRedistributionAddressSet) (event.Subscription, error)
⋮----
// ParseRedistributionAddressSet is a log parse operation binding the contract event 0x90a6fa2a9b79b910872ebca540cf3bd8be827f586e6420c30d8836e30012907e.
⋮----
func (_AllocationManagerStorage *AllocationManagerStorageFilterer) ParseRedistributionAddressSet(log types.Log) (*AllocationManagerStorageRedistributionAddressSet, error)
⋮----
// AllocationManagerStorageSlasherMigratedIterator is returned from FilterSlasherMigrated and is used to iterate over the raw logs and unpacked data for SlasherMigrated events raised by the AllocationManagerStorage contract.
type AllocationManagerStorageSlasherMigratedIterator struct {
	Event *AllocationManagerStorageSlasherMigrated // 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
}
⋮----
Event *AllocationManagerStorageSlasherMigrated // Event containing the contract specifics and raw log
⋮----
// AllocationManagerStorageSlasherMigrated represents a SlasherMigrated event raised by the AllocationManagerStorage contract.
type AllocationManagerStorageSlasherMigrated struct {
	OperatorSet OperatorSet
	Slasher     common.Address
	Raw         types.Log // Blockchain specific contextual infos
}
⋮----
// FilterSlasherMigrated is a free log retrieval operation binding the contract event 0xf0c8fc7d71f647bd3a88ac369112517f6a4b8038e71913f2d20f71f877dfc725.
⋮----
// Solidity: event SlasherMigrated((address,uint32) operatorSet, address slasher)
func (_AllocationManagerStorage *AllocationManagerStorageFilterer) FilterSlasherMigrated(opts *bind.FilterOpts) (*AllocationManagerStorageSlasherMigratedIterator, error)
⋮----
// WatchSlasherMigrated is a free log subscription operation binding the contract event 0xf0c8fc7d71f647bd3a88ac369112517f6a4b8038e71913f2d20f71f877dfc725.
⋮----
func (_AllocationManagerStorage *AllocationManagerStorageFilterer) WatchSlasherMigrated(opts *bind.WatchOpts, sink chan<- *AllocationManagerStorageSlasherMigrated) (event.Subscription, error)
⋮----
// ParseSlasherMigrated is a log parse operation binding the contract event 0xf0c8fc7d71f647bd3a88ac369112517f6a4b8038e71913f2d20f71f877dfc725.
⋮----
func (_AllocationManagerStorage *AllocationManagerStorageFilterer) ParseSlasherMigrated(log types.Log) (*AllocationManagerStorageSlasherMigrated, error)
⋮----
// AllocationManagerStorageSlasherUpdatedIterator is returned from FilterSlasherUpdated and is used to iterate over the raw logs and unpacked data for SlasherUpdated events raised by the AllocationManagerStorage contract.
type AllocationManagerStorageSlasherUpdatedIterator struct {
	Event *AllocationManagerStorageSlasherUpdated // 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
}
⋮----
Event *AllocationManagerStorageSlasherUpdated // Event containing the contract specifics and raw log
⋮----
// AllocationManagerStorageSlasherUpdated represents a SlasherUpdated event raised by the AllocationManagerStorage contract.
type AllocationManagerStorageSlasherUpdated struct {
	OperatorSet OperatorSet
	Slasher     common.Address
	EffectBlock uint32
	Raw         types.Log // Blockchain specific contextual infos
}
⋮----
// FilterSlasherUpdated is a free log retrieval operation binding the contract event 0x3873f29d7a65a4d75f5ba28909172f486216a1420e77c3c2720815951a6b4f57.
⋮----
// Solidity: event SlasherUpdated((address,uint32) operatorSet, address slasher, uint32 effectBlock)
func (_AllocationManagerStorage *AllocationManagerStorageFilterer) FilterSlasherUpdated(opts *bind.FilterOpts) (*AllocationManagerStorageSlasherUpdatedIterator, error)
⋮----
// WatchSlasherUpdated is a free log subscription operation binding the contract event 0x3873f29d7a65a4d75f5ba28909172f486216a1420e77c3c2720815951a6b4f57.
⋮----
func (_AllocationManagerStorage *AllocationManagerStorageFilterer) WatchSlasherUpdated(opts *bind.WatchOpts, sink chan<- *AllocationManagerStorageSlasherUpdated) (event.Subscription, error)
⋮----
// ParseSlasherUpdated is a log parse operation binding the contract event 0x3873f29d7a65a4d75f5ba28909172f486216a1420e77c3c2720815951a6b4f57.
⋮----
func (_AllocationManagerStorage *AllocationManagerStorageFilterer) ParseSlasherUpdated(log types.Log) (*AllocationManagerStorageSlasherUpdated, error)
⋮----
// AllocationManagerStorageStrategyAddedToOperatorSetIterator is returned from FilterStrategyAddedToOperatorSet and is used to iterate over the raw logs and unpacked data for StrategyAddedToOperatorSet events raised by the AllocationManagerStorage contract.
type AllocationManagerStorageStrategyAddedToOperatorSetIterator struct {
	Event *AllocationManagerStorageStrategyAddedToOperatorSet // 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
}
⋮----
Event *AllocationManagerStorageStrategyAddedToOperatorSet // Event containing the contract specifics and raw log
⋮----
// AllocationManagerStorageStrategyAddedToOperatorSet represents a StrategyAddedToOperatorSet event raised by the AllocationManagerStorage contract.
type AllocationManagerStorageStrategyAddedToOperatorSet struct {
	OperatorSet OperatorSet
	Strategy    common.Address
	Raw         types.Log // Blockchain specific contextual infos
}
⋮----
// FilterStrategyAddedToOperatorSet is a free log retrieval operation binding the contract event 0x7ab260fe0af193db5f4986770d831bda4ea46099dc817e8b6716dcae8af8e88b.
⋮----
// Solidity: event StrategyAddedToOperatorSet((address,uint32) operatorSet, address strategy)
func (_AllocationManagerStorage *AllocationManagerStorageFilterer) FilterStrategyAddedToOperatorSet(opts *bind.FilterOpts) (*AllocationManagerStorageStrategyAddedToOperatorSetIterator, error)
⋮----
// WatchStrategyAddedToOperatorSet is a free log subscription operation binding the contract event 0x7ab260fe0af193db5f4986770d831bda4ea46099dc817e8b6716dcae8af8e88b.
⋮----
func (_AllocationManagerStorage *AllocationManagerStorageFilterer) WatchStrategyAddedToOperatorSet(opts *bind.WatchOpts, sink chan<- *AllocationManagerStorageStrategyAddedToOperatorSet) (event.Subscription, error)
⋮----
// ParseStrategyAddedToOperatorSet is a log parse operation binding the contract event 0x7ab260fe0af193db5f4986770d831bda4ea46099dc817e8b6716dcae8af8e88b.
⋮----
func (_AllocationManagerStorage *AllocationManagerStorageFilterer) ParseStrategyAddedToOperatorSet(log types.Log) (*AllocationManagerStorageStrategyAddedToOperatorSet, error)
⋮----
// AllocationManagerStorageStrategyRemovedFromOperatorSetIterator is returned from FilterStrategyRemovedFromOperatorSet and is used to iterate over the raw logs and unpacked data for StrategyRemovedFromOperatorSet events raised by the AllocationManagerStorage contract.
type AllocationManagerStorageStrategyRemovedFromOperatorSetIterator struct {
	Event *AllocationManagerStorageStrategyRemovedFromOperatorSet // 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
}
⋮----
Event *AllocationManagerStorageStrategyRemovedFromOperatorSet // Event containing the contract specifics and raw log
⋮----
// AllocationManagerStorageStrategyRemovedFromOperatorSet represents a StrategyRemovedFromOperatorSet event raised by the AllocationManagerStorage contract.
type AllocationManagerStorageStrategyRemovedFromOperatorSet struct {
	OperatorSet OperatorSet
	Strategy    common.Address
	Raw         types.Log // Blockchain specific contextual infos
}
⋮----
// FilterStrategyRemovedFromOperatorSet is a free log retrieval operation binding the contract event 0x7b4b073d80dcac55a11177d8459ad9f664ceeb91f71f27167bb14f8152a7eeee.
⋮----
// Solidity: event StrategyRemovedFromOperatorSet((address,uint32) operatorSet, address strategy)
func (_AllocationManagerStorage *AllocationManagerStorageFilterer) FilterStrategyRemovedFromOperatorSet(opts *bind.FilterOpts) (*AllocationManagerStorageStrategyRemovedFromOperatorSetIterator, error)
⋮----
// WatchStrategyRemovedFromOperatorSet is a free log subscription operation binding the contract event 0x7b4b073d80dcac55a11177d8459ad9f664ceeb91f71f27167bb14f8152a7eeee.
⋮----
func (_AllocationManagerStorage *AllocationManagerStorageFilterer) WatchStrategyRemovedFromOperatorSet(opts *bind.WatchOpts, sink chan<- *AllocationManagerStorageStrategyRemovedFromOperatorSet) (event.Subscription, error)
⋮----
// ParseStrategyRemovedFromOperatorSet is a log parse operation binding the contract event 0x7b4b073d80dcac55a11177d8459ad9f664ceeb91f71f27167bb14f8152a7eeee.
⋮----
func (_AllocationManagerStorage *AllocationManagerStorageFilterer) ParseStrategyRemovedFromOperatorSet(log types.Log) (*AllocationManagerStorageStrategyRemovedFromOperatorSet, error)
````

## File: pkg/bindings/AllocationManagerView/binding.go
````go
// Code generated - DO NOT EDIT.
// This file is a generated binding and any manual changes will be lost.
⋮----
package AllocationManagerView
⋮----
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"
)
⋮----
"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
)
⋮----
// IAllocationManagerTypesAllocation is an auto generated low-level Go binding around an user-defined struct.
type IAllocationManagerTypesAllocation struct {
	CurrentMagnitude uint64
	PendingDiff      *big.Int
	EffectBlock      uint32
}
⋮----
// OperatorSet is an auto generated low-level Go binding around an user-defined struct.
type OperatorSet struct {
	Avs common.Address
	Id  uint32
}
⋮----
// 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: "0x610120604052348015610010575f5ffd5b5060405161277a38038061277a83398101604081905261002f9161008d565b6001600160a01b039384166080529290911660a05263ffffffff90811660c0521660e0819052610100526100e3565b6001600160a01b0381168114610072575f5ffd5b50565b805163ffffffff81168114610088575f5ffd5b919050565b5f5f5f5f608085870312156100a0575f5ffd5b84516100ab8161005e565b60208601519094506100bc8161005e565b92506100ca60408601610075565b91506100d860608601610075565b905092959194509250565b60805160a05160c05160e051610100516126536101275f395f6103d601525f61044e01525f6102ac01525f61056d01525f81816105a701526113e201526126535ff3fe608060405234801561000f575f5ffd5b50600436106101fd575f3560e01c80636e875dba11610114578063ba1a84e5116100a9578063db4df76111610079578063db4df76114610568578063dc2af6921461058f578063df5cf723146105a2578063f231bd08146105c9578063f605ce08146105dc575f5ffd5b8063ba1a84e5146104f8578063c221d8ae1461050b578063d4a3fcce1461051e578063d779485714610531575f5ffd5b806394d7d00c116100e457806394d7d00c14610490578063a9333ec8146104a3578063b2447af7146104b6578063b9fbaed1146104c9575f5ffd5b80636e875dba1461042357806379ae50cd146104365780637bc1ef61146104495780638ce6485414610470575f5ffd5b8063304c10cd116101955780634cfd2939116101655780634cfd29391461038a578063547afb87146103ab578063670d3ba2146103be57806367aeaa53146103d15780636cfb4481146103f8575f5ffd5b8063304c10cd1461031657806340120dab146103295780634177a87c1461034a5780634a10ffe51461036a575f5ffd5b8063260dc758116101d0578063260dc758146102945780632981eb77146102a75780632b453a9a146102e35780632bab2c4a14610303575f5ffd5b80630f3df50e1461020157806310e1b9b8146102315780631352c3e61461025157806315fe502814610274575b5f5ffd5b61021461020f366004611dd8565b6105ef565b6040516001600160a01b0390911681526020015b60405180910390f35b61024461023f366004611df2565b610630565b6040516102289190611e39565b61026461025f366004611e6c565b610669565b6040519015158152602001610228565b610287610282366004611ea0565b6106e4565b6040516102289190611f10565b6102646102a2366004611dd8565b6107fb565b6102ce7f000000000000000000000000000000000000000000000000000000000000000081565b60405163ffffffff9091168152602001610228565b6102f66102f1366004611fb7565b61082c565b604051610228919061202a565b6102f66103113660046120b6565b610842565b610214610324366004611ea0565b6108e1565b61033c61033736600461213a565b610910565b6040516102289291906121d2565b61035d610358366004611dd8565b610a89565b604051610228919061222f565b61037d610378366004612241565b610aad565b6040516102289190612284565b61039d610398366004611dd8565b610b55565b604051908152602001610228565b61037d6103b93660046122cf565b610b77565b6102646103cc366004611e6c565b610c1f565b6102ce7f000000000000000000000000000000000000000000000000000000000000000081565b61040b61040636600461213a565b610c4b565b6040516001600160401b039091168152602001610228565b61035d610431366004611dd8565b610c60565b610287610444366004611ea0565b610c71565b6102ce7f000000000000000000000000000000000000000000000000000000000000000081565b61048361047e366004612311565b610d4b565b6040516102289190612354565b61037d61049e366004612366565b610e07565b61040b6104b136600461213a565b610ef3565b61039d6104c4366004611dd8565b610f22565b6104dc6104d7366004611ea0565b610f44565b60408051921515835263ffffffff909116602083015201610228565b61039d610506366004611ea0565b610fe5565b61035d610519366004611e6c565b611005565b61021461052c366004611dd8565b61102e565b61054461053f366004611dd8565b6110b5565b604080516001600160a01b03909316835263ffffffff909116602083015201610228565b6102147f000000000000000000000000000000000000000000000000000000000000000081565b61026461059d366004611ea0565b611136565b6102147f000000000000000000000000000000000000000000000000000000000000000081565b6102646105d7366004611dd8565b611169565b61040b6105ea36600461213a565b611188565b5f5f60a65f6105fd85611194565b815260208101919091526040015f20546001600160a01b0316905080156106245780610629565b620e16e45b9392505050565b604080516060810182525f808252602082018190529181018290529061065f8561065986611194565b856111f7565b9695505050505050565b6001600160a01b0382165f908152609e6020526040812081908161068c85611194565b815260208082019290925260409081015f2081518083019092525460ff8116151580835261010090910463ffffffff16928201929092529150806106da5750806020015163ffffffff164311155b9150505b92915050565b6001600160a01b0381165f908152609d602052604081206060919061070890611363565b90505f816001600160401b0381111561072357610723611d0d565b60405190808252806020026020018201604052801561076757816020015b604080518082019091525f80825260208201528152602001906001900390816107415790505b5090505f5b828110156107f3576001600160a01b0385165f908152609d602052604090206107ce90610799908361136c565b604080518082019091525f80825260208201525060408051808201909152606082901c815263ffffffff909116602082015290565b8282815181106107e0576107e06123c1565b602090810291909101015260010161076c565b509392505050565b60208082015182516001600160a01b03165f9081526098909252604082206106de9163ffffffff9081169061137716565b606061083a8484844361138e565b949350505050565b60606108508585858561138e565b90505f5b84518110156108d857610880858281518110610872576108726123c1565b602002602001015187610669565b6108d0575f5b84518110156108ce575f8383815181106108a2576108a26123c1565b602002602001015182815181106108bb576108bb6123c1565b6020908102919091010152600101610886565b505b600101610854565b50949350505050565b6001600160a01b038082165f9081526097602052604081205490911680156109095780610629565b5090919050565b6001600160a01b0382165f908152609d60205260408120606091829161093590611363565b90505f816001600160401b0381111561095057610950611d0d565b60405190808252806020026020018201604052801561099457816020015b604080518082019091525f808252602082015281526020019060019003908161096e5790505b5090505f826001600160401b038111156109b0576109b0611d0d565b6040519080825280602002602001820160405280156109f957816020015b604080516060810182525f80825260208083018290529282015282525f199092019101816109ce5790505b5090505f5b83811015610a7c576001600160a01b0388165f908152609d60205260408120610a2b90610799908461136c565b905080848381518110610a4057610a406123c1565b6020026020010181905250610a5689828a610630565b838381518110610a6857610a686123c1565b6020908102919091010152506001016109fe565b5090969095509350505050565b60605f61062960995f610a9b86611194565b81526020019081526020015f2061167b565b60605f83516001600160401b03811115610ac957610ac9611d0d565b604051908082528060200260200182016040528015610af2578160200160208202803683370190505b5090505f5b84518110156107f357610b23858281518110610b1557610b156123c1565b602002602001015185610ef3565b828281518110610b3557610b356123c1565b6001600160401b0390921660209283029190910190910152600101610af7565b5f60a55f610b6284611194565b81526020019081526020015f20549050919050565b60605f82516001600160401b03811115610b9357610b93611d0d565b604051908082528060200260200182016040528015610bbc578160200160208202803683370190505b5090505f5b83518110156107f357610bed85858381518110610be057610be06123c1565b6020026020010151610ef3565b828281518110610bff57610bff6123c1565b6001600160401b0390921660209283029190910190910152600101610bc1565b5f61062983609a5f610c3086611194565b81526020019081526020015f2061168790919063ffffffff16565b5f5f610c5784846116a8565b95945050505050565b60606106de609a5f610a9b85611194565b6001600160a01b0381165f908152609c6020526040812060609190610c9590611363565b90505f816001600160401b03811115610cb057610cb0611d0d565b604051908082528060200260200182016040528015610cf457816020015b604080518082019091525f8082526020820152815260200190600190039081610cce5790505b5090505f5b828110156107f3576001600160a01b0385165f908152609c60205260409020610d2690610799908361136c565b828281518110610d3857610d386123c1565b6020908102919091010152600101610cf9565b60605f84516001600160401b03811115610d6757610d67611d0d565b604051908082528060200260200182016040528015610db057816020015b604080516060810182525f80825260208083018290529282015282525f19909201910181610d855790505b5090505f5b85518110156108d857610de2868281518110610dd357610dd36123c1565b60200260200101518686610630565b828281518110610df457610df46123c1565b6020908102919091010152600101610db5565b60605f83516001600160401b03811115610e2357610e23611d0d565b604051908082528060200260200182016040528015610e4c578160200160208202803683370190505b5090505f5b84518110156108d8576001600160a01b0386165f90815260a1602052604081208651610ec192879291899086908110610e8c57610e8c6123c1565b60200260200101516001600160a01b03166001600160a01b031681526020019081526020015f2061181790919063ffffffff16565b828281518110610ed357610ed36123c1565b6001600160401b0390921660209283029190910190910152600101610e51565b6001600160a01b038083165f90815260a16020908152604080832093851683529290529081206106299061182b565b5f6106de609a5f610f3285611194565b81526020019081526020015f20611363565b6001600160a01b0381165f908152609b602090815260408083208151608081018352905463ffffffff80821680845260ff64010000000084041615159584018690526501000000000083048216948401949094526901000000000000000000909104166060820181905284939192919015801590610fcc5750826060015163ffffffff164310155b15610fdb575050604081015160015b9590945092505050565b6001600160a01b0381165f9081526098602052604081206106de90611363565b6001600160a01b0382165f908152609f60205260408120606091906106da9082610a9b86611194565b5f5f60a75f61103c85611194565b815260208082019290925260409081015f20815160608101835281546001600160a01b0390811680835260019093015490811694820194909452600160a01b90930463ffffffff16918301829052919250158015906110a55750816040015163ffffffff164310155b1561062957506020015192915050565b5f5f5f5f5f60a75f6110c688611194565b815260208082019290925260409081015f20815160608101835281546001600160a01b03908116825260019092015491821693810193909352600160a01b900463ffffffff1690820181905290915043101561112b5780602001519250806040015191505b509094909350915050565b5f5f61114183610c71565b90505f61114d846106e4565b9050611159848361183e565b8061083a575061083a848261183e565b5f620e16e4611177836105ef565b6001600160a01b0316141592915050565b5f5f6108d884846116a8565b5f815f0151826020015163ffffffff166040516020016111df92919060609290921b6bffffffffffffffffffffffff1916825260a01b6001600160a01b031916601482015260200190565b6040516020818303038152906040526106de906123d5565b6040805180820182525f80825260208083018290528351606081018552828152808201839052808501839052845180860186526001600160a01b03898116855260a18452868520908816855290925293822092939281906112579061182b565b6001600160401b0390811682526001600160a01b038981165f81815260a260209081526040808320948c168084529482528083205486169682019690965291815260a082528481208b8252825284812092815291815290839020835160608101855290549283168152600160401b8304600f0b91810191909152600160c01b90910463ffffffff169181018290529192504310156112f957909250905061135b565b61130a815f015182602001516118b6565b6001600160401b0316815260208101515f600f9190910b121561134857611339826020015182602001516118b6565b6001600160401b031660208301525b5f60408201819052602082015290925090505b935093915050565b5f6106de825490565b5f61062983836118d5565b5f8181526001830160205260408120541515610629565b606083516001600160401b038111156113a9576113a9611d0d565b6040519080825280602002602001820160405280156113dc57816020015b60608152602001906001900390816113c75790505b5090505f7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663f0e0e67686866040518363ffffffff1660e01b815260040161142e9291906123fb565b5f60405180830381865afa158015611448573d5f5f3e3d5ffd5b505050506040513d5f823e601f3d908101601f1916820160405261146f919081019061241f565b90505f5b8551811015611671575f86828151811061148f5761148f6123c1565b6020026020010151905085516001600160401b038111156114b2576114b2611d0d565b6040519080825280602002602001820160405280156114db578160200160208202803683370190505b508483815181106114ee576114ee6123c1565b60209081029190910101525f5b8651811015611667575f878281518110611517576115176123c1565b6020908102919091018101516001600160a01b038086165f90815260a18452604080822092841682529190935282209092506115529061182b565b9050806001600160401b03165f0361156b57505061165f565b5f611577858d85610630565b90508863ffffffff16816040015163ffffffff161115801561159f57505f8160200151600f0b125b156115c1576115b5815f015182602001516118b6565b6001600160401b031681525b80515f906115dc906001600160401b039081169085166118fb565b9050611623818989815181106115f4576115f46123c1565b6020026020010151878151811061160d5761160d6123c1565b602002602001015161190f90919063ffffffff16565b898881518110611635576116356123c1565b6020026020010151868151811061164e5761164e6123c1565b602002602001018181525050505050505b6001016114fb565b5050600101611473565b5050949350505050565b60605f61062983611923565b6001600160a01b0381165f9081526001830160205260408120541515610629565b6001600160a01b038281165f81815260a2602090815260408083209486168084529482528083205493835260a38252808320948352939052918220546001600160401b039091169190600f81810b600160801b909204900b03815b818110156117d3576001600160a01b038087165f90815260a360209081526040808320938916835292905290812061173b908361197c565b6001600160a01b038881165f90815260a0602090815260408083208584528252808320938b16835292815290829020825160608101845290546001600160401b0381168252600160401b8104600f0b92820192909252600160c01b90910463ffffffff169181018290529192504310156117b65750506117d3565b6117c48682602001516118b6565b95505050806001019050611703565b506001600160a01b038086165f90815260a16020908152604080832093881683529290522083906118039061182b565b61180d919061253f565b9150509250929050565b5f6106298383670de0b6b3a76400006119eb565b5f6106de82670de0b6b3a7640000611a41565b5f805b82518110156118ad5761186d84848381518110611860576118606123c1565b6020026020010151610669565b80156118965750611896838281518110611889576118896123c1565b6020026020010151611169565b156118a55760019150506106de565b600101611841565b505f9392505050565b5f6106296118cd836001600160401b03861661255e565b600f0b611a79565b5f825f0182815481106118ea576118ea6123c1565b905f5260205f200154905092915050565b5f61062983670de0b6b3a764000084611ae9565b5f6106298383670de0b6b3a7640000611ae9565b6060815f0180548060200260200160405190810160405280929190818152602001828054801561197057602002820191905f5260205f20905b81548152602001906001019080831161195c575b50505050509050919050565b5f5f61199e61198a84611bce565b85546119999190600f0b61259d565b611c37565b8454909150600160801b9004600f90810b9082900b126119d157604051632d0483c560e21b815260040160405180910390fd5b600f0b5f9081526001939093016020525050604090205490565b82545f90816119fc86868385611ca0565b90508015611a3757611a2086611a136001846125c4565b5f91825260209091200190565b5464010000000090046001600160e01b031661065f565b5091949350505050565b81545f908015611a7157611a5a84611a136001846125c4565b5464010000000090046001600160e01b03166106da565b509092915050565b5f6001600160401b03821115611ae55760405162461bcd60e51b815260206004820152602660248201527f53616665436173743a2076616c756520646f65736e27742066697420696e203660448201526534206269747360d01b60648201526084015b60405180910390fd5b5090565b5f80805f19858709858702925082811083820303915050805f03611b2057838281611b1657611b166125d7565b0492505050610629565b808411611b675760405162461bcd60e51b81526020600482015260156024820152744d6174683a206d756c446976206f766572666c6f7760581b6044820152606401611adc565b5f8486880960026001871981018816978890046003810283188082028403028082028403028082028403028082028403028082028403029081029092039091025f889003889004909101858311909403939093029303949094049190911702949350505050565b5f6001600160ff1b03821115611ae55760405162461bcd60e51b815260206004820152602860248201527f53616665436173743a2076616c756520646f65736e27742066697420696e2061604482015267371034b73a191a9b60c11b6064820152608401611adc565b80600f81900b8114611c9b5760405162461bcd60e51b815260206004820152602760248201527f53616665436173743a2076616c756520646f65736e27742066697420696e20316044820152663238206269747360c81b6064820152608401611adc565b919050565b5f5b818310156107f3575f611cb58484611cf3565b5f8781526020902090915063ffffffff86169082015463ffffffff161115611cdf57809250611ced565b611cea8160016125eb565b93505b50611ca2565b5f611d0160028484186125fe565b610629908484166125eb565b634e487b7160e01b5f52604160045260245ffd5b604051601f8201601f191681016001600160401b0381118282101715611d4957611d49611d0d565b604052919050565b6001600160a01b0381168114611d65575f5ffd5b50565b803563ffffffff81168114611c9b575f5ffd5b5f60408284031215611d8b575f5ffd5b604080519081016001600160401b0381118282101715611dad57611dad611d0d565b6040529050808235611dbe81611d51565b8152611dcc60208401611d68565b60208201525092915050565b5f60408284031215611de8575f5ffd5b6106298383611d7b565b5f5f5f60808486031215611e04575f5ffd5b8335611e0f81611d51565b9250611e1e8560208601611d7b565b91506060840135611e2e81611d51565b809150509250925092565b81516001600160401b03168152602080830151600f0b9082015260408083015163ffffffff1690820152606081016106de565b5f5f60608385031215611e7d575f5ffd5b8235611e8881611d51565b9150611e978460208501611d7b565b90509250929050565b5f60208284031215611eb0575f5ffd5b813561062981611d51565b5f8151808452602084019350602083015f5b82811015611f0657815180516001600160a01b0316875260209081015163ffffffff168188015260409096019590910190600101611ecd565b5093949350505050565b602081525f6106296020830184611ebb565b5f6001600160401b03821115611f3a57611f3a611d0d565b5060051b60200190565b5f82601f830112611f53575f5ffd5b8135611f66611f6182611f22565b611d21565b8082825260208201915060208360051b860101925085831115611f87575f5ffd5b602085015b83811015611fad578035611f9f81611d51565b835260209283019201611f8c565b5095945050505050565b5f5f5f60808486031215611fc9575f5ffd5b611fd38585611d7b565b925060408401356001600160401b03811115611fed575f5ffd5b611ff986828701611f44565b92505060608401356001600160401b03811115612014575f5ffd5b61202086828701611f44565b9150509250925092565b5f602082016020835280845180835260408501915060408160051b8601019250602086015f5b828110156120aa57868503603f19018452815180518087526020918201918701905f5b81811015612091578351835260209384019390920191600101612073565b5090965050506020938401939190910190600101612050565b50929695505050505050565b5f5f5f5f60a085870312156120c9575f5ffd5b6120d38686611d7b565b935060408501356001600160401b038111156120ed575f5ffd5b6120f987828801611f44565b93505060608501356001600160401b03811115612114575f5ffd5b61212087828801611f44565b92505061212f60808601611d68565b905092959194509250565b5f5f6040838503121561214b575f5ffd5b823561215681611d51565b9150602083013561216681611d51565b809150509250929050565b5f8151808452602084019350602083015f5b82811015611f06576121bc86835180516001600160401b03168252602080820151600f0b9083015260409081015163ffffffff16910152565b6060959095019460209190910190600101612183565b604081525f6121e46040830185611ebb565b8281036020840152610c578185612171565b5f8151808452602084019350602083015f5b82811015611f065781516001600160a01b0316865260209586019590910190600101612208565b602081525f61062960208301846121f6565b5f5f60408385031215612252575f5ffd5b82356001600160401b03811115612267575f5ffd5b61227385828601611f44565b925050602083013561216681611d51565b602080825282518282018190525f918401906040840190835b818110156122c45783516001600160401b031683526020938401939092019160010161229d565b509095945050505050565b5f5f604083850312156122e0575f5ffd5b82356122eb81611d51565b915060208301356001600160401b03811115612305575f5ffd5b61180d85828601611f44565b5f5f5f60808486031215612323575f5ffd5b83356001600160401b03811115612338575f5ffd5b61234486828701611f44565b935050611e1e8560208601611d7b565b602081525f6106296020830184612171565b5f5f5f60608486031215612378575f5ffd5b833561238381611d51565b925060208401356001600160401b0381111561239d575f5ffd5b6123a986828701611f44565b9250506123b860408501611d68565b90509250925092565b634e487b7160e01b5f52603260045260245ffd5b805160208083015191908110156123f5575f198160200360031b1b821691505b50919050565b604081525f61240d60408301856121f6565b8281036020840152610c5781856121f6565b5f6020828403121561242f575f5ffd5b81516001600160401b03811115612444575f5ffd5b8201601f81018413612454575f5ffd5b8051612462611f6182611f22565b8082825260208201915060208360051b850101925086831115612483575f5ffd5b602084015b838110156125205780516001600160401b038111156124a5575f5ffd5b8501603f810189136124b5575f5ffd5b60208101516124c6611f6182611f22565b808282526020820191506020808460051b8601010192508b8311156124e9575f5ffd5b6040840193505b8284101561250b5783518252602093840193909101906124f0565b86525050602093840193919091019050612488565b509695505050505050565b634e487b7160e01b5f52601160045260245ffd5b6001600160401b0382811682821603908111156106de576106de61252b565b600f81810b9083900b016f7fffffffffffffffffffffffffffffff81136f7fffffffffffffffffffffffffffffff19821217156106de576106de61252b565b8082018281125f8312801582168215821617156125bc576125bc61252b565b505092915050565b818103818111156106de576106de61252b565b634e487b7160e01b5f52601260045260245ffd5b808201808211156106de576106de61252b565b5f8261261857634e487b7160e01b5f52601260045260245ffd5b50049056fea26469706673582212204718eed76a204ea1780faf1b5470936596e03edbc3e4a3dd4a5184e28c26efa364736f6c634300081e0033",
}
⋮----
// AllocationManagerViewABI is the input ABI used to generate the binding from.
// Deprecated: Use AllocationManagerViewMetaData.ABI instead.
var AllocationManagerViewABI = AllocationManagerViewMetaData.ABI
⋮----
// AllocationManagerViewBin is the compiled bytecode used for deploying new contracts.
// Deprecated: Use AllocationManagerViewMetaData.Bin instead.
var AllocationManagerViewBin = AllocationManagerViewMetaData.Bin
⋮----
// DeployAllocationManagerView deploys a new Ethereum contract, binding an instance of AllocationManagerView to it.
func DeployAllocationManagerView(auth *bind.TransactOpts, backend bind.ContractBackend, _delegation common.Address, _eigenStrategy common.Address, _DEALLOCATION_DELAY uint32, _ALLOCATION_CONFIGURATION_DELAY uint32) (common.Address, *types.Transaction, *AllocationManagerView, error)
⋮----
// AllocationManagerView is an auto generated Go binding around an Ethereum contract.
type AllocationManagerView struct {
	AllocationManagerViewCaller     // Read-only binding to the contract
	AllocationManagerViewTransactor // Write-only binding to the contract
	AllocationManagerViewFilterer   // Log filterer for contract events
}
⋮----
AllocationManagerViewCaller     // Read-only binding to the contract
AllocationManagerViewTransactor // Write-only binding to the contract
AllocationManagerViewFilterer   // Log filterer for contract events
⋮----
// AllocationManagerViewCaller is an auto generated read-only Go binding around an Ethereum contract.
type AllocationManagerViewCaller struct {
	contract *bind.BoundContract // Generic contract wrapper for the low level calls
}
⋮----
contract *bind.BoundContract // Generic contract wrapper for the low level calls
⋮----
// AllocationManagerViewTransactor is an auto generated write-only Go binding around an Ethereum contract.
type AllocationManagerViewTransactor struct {
	contract *bind.BoundContract // Generic contract wrapper for the low level calls
}
⋮----
// AllocationManagerViewFilterer is an auto generated log filtering Go binding around an Ethereum contract events.
type AllocationManagerViewFilterer struct {
	contract *bind.BoundContract // Generic contract wrapper for the low level calls
}
⋮----
// AllocationManagerViewSession is an auto generated Go binding around an Ethereum contract,
// with pre-set call and transact options.
type AllocationManagerViewSession struct {
	Contract     *AllocationManagerView // 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
}
⋮----
Contract     *AllocationManagerView // 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
⋮----
// AllocationManagerViewCallerSession is an auto generated read-only Go binding around an Ethereum contract,
// with pre-set call options.
type AllocationManagerViewCallerSession struct {
	Contract *AllocationManagerViewCaller // Generic contract caller binding to set the session for
	CallOpts bind.CallOpts                // Call options to use throughout this session
}
⋮----
Contract *AllocationManagerViewCaller // Generic contract caller binding to set the session for
CallOpts bind.CallOpts                // Call options to use throughout this session
⋮----
// AllocationManagerViewTransactorSession is an auto generated write-only Go binding around an Ethereum contract,
// with pre-set transact options.
type AllocationManagerViewTransactorSession struct {
	Contract     *AllocationManagerViewTransactor // Generic contract transactor binding to set the session for
	TransactOpts bind.TransactOpts                // Transaction auth options to use throughout this session
}
⋮----
Contract     *AllocationManagerViewTransactor // Generic contract transactor binding to set the session for
TransactOpts bind.TransactOpts                // Transaction auth options to use throughout this session
⋮----
// AllocationManagerViewRaw is an auto generated low-level Go binding around an Ethereum contract.
type AllocationManagerViewRaw struct {
	Contract *AllocationManagerView // Generic contract binding to access the raw methods on
}
⋮----
Contract *AllocationManagerView // Generic contract binding to access the raw methods on
⋮----
// AllocationManagerViewCallerRaw is an auto generated low-level read-only Go binding around an Ethereum contract.
type AllocationManagerViewCallerRaw struct {
	Contract *AllocationManagerViewCaller // Generic read-only contract binding to access the raw methods on
}
⋮----
Contract *AllocationManagerViewCaller // Generic read-only contract binding to access the raw methods on
⋮----
// AllocationManagerViewTransactorRaw is an auto generated low-level write-only Go binding around an Ethereum contract.
type AllocationManagerViewTransactorRaw struct {
	Contract *AllocationManagerViewTransactor // Generic write-only contract binding to access the raw methods on
}
⋮----
Contract *AllocationManagerViewTransactor // Generic write-only contract binding to access the raw methods on
⋮----
// NewAllocationManagerView creates a new instance of AllocationManagerView, bound to a specific deployed contract.
func NewAllocationManagerView(address common.Address, backend bind.ContractBackend) (*AllocationManagerView, error)
⋮----
// NewAllocationManagerViewCaller creates a new read-only instance of AllocationManagerView, bound to a specific deployed contract.
func NewAllocationManagerViewCaller(address common.Address, caller bind.ContractCaller) (*AllocationManagerViewCaller, error)
⋮----
// NewAllocationManagerViewTransactor creates a new write-only instance of AllocationManagerView, bound to a specific deployed contract.
func NewAllocationManagerViewTransactor(address common.Address, transactor bind.ContractTransactor) (*AllocationManagerViewTransactor, error)
⋮----
// NewAllocationManagerViewFilterer creates a new log filterer instance of AllocationManagerView, bound to a specific deployed contract.
func NewAllocationManagerViewFilterer(address common.Address, filterer bind.ContractFilterer) (*AllocationManagerViewFilterer, error)
⋮----
// bindAllocationManagerView binds a generic wrapper to an already deployed contract.
func bindAllocationManagerView(address common.Address, caller bind.ContractCaller, transactor bind.ContractTransactor, filterer bind.ContractFilterer) (*bind.BoundContract, error)
⋮----
// 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 (_AllocationManagerView *AllocationManagerViewRaw) Call(opts *bind.CallOpts, result *[]interface
⋮----
// Transfer initiates a plain transaction to move funds to the contract, calling
// its default method if one is available.
func (_AllocationManagerView *AllocationManagerViewRaw) Transfer(opts *bind.TransactOpts) (*types.Transaction, error)
⋮----
// Transact invokes the (paid) contract method with params as input values.
func (_AllocationManagerView *AllocationManagerViewRaw) Transact(opts *bind.TransactOpts, method string, params ...interface
⋮----
// ALLOCATIONCONFIGURATIONDELAY is a free data retrieval call binding the contract method 0x7bc1ef61.
//
// Solidity: function ALLOCATION_CONFIGURATION_DELAY() view returns(uint32)
func (_AllocationManagerView *AllocationManagerViewCaller) ALLOCATIONCONFIGURATIONDELAY(opts *bind.CallOpts) (uint32, error)
⋮----
var out []interface{}
⋮----
// DEALLOCATIONDELAY is a free data retrieval call binding the contract method 0x2981eb77.
⋮----
// Solidity: function DEALLOCATION_DELAY() view returns(uint32)
func (_AllocationManagerView *AllocationManagerViewCaller) DEALLOCATIONDELAY(opts *bind.CallOpts) (uint32, error)
⋮----
// SLASHERCONFIGURATIONDELAY is a free data retrieval call binding the contract method 0x67aeaa53.
⋮----
// Solidity: function SLASHER_CONFIGURATION_DELAY() view returns(uint32)
func (_AllocationManagerView *AllocationManagerViewCaller) SLASHERCONFIGURATIONDELAY(opts *bind.CallOpts) (uint32, error)
⋮----
// Delegation is a free data retrieval call binding the contract method 0xdf5cf723.
⋮----
// Solidity: function delegation() view returns(address)
func (_AllocationManagerView *AllocationManagerViewCaller) Delegation(opts *bind.CallOpts) (common.Address, error)
⋮----
// EigenStrategy is a free data retrieval call binding the contract method 0xdb4df761.
⋮----
// Solidity: function eigenStrategy() view returns(address)
func (_AllocationManagerView *AllocationManagerViewCaller) EigenStrategy(opts *bind.CallOpts) (common.Address, error)
⋮----
// GetAVSRegistrar is a free data retrieval call binding the contract method 0x304c10cd.
⋮----
// Solidity: function getAVSRegistrar(address avs) view returns(address)
func (_AllocationManagerView *AllocationManagerViewCaller) GetAVSRegistrar(opts *bind.CallOpts, avs common.Address) (common.Address, error)
⋮----
// GetAllocatableMagnitude is a free data retrieval call binding the contract method 0x6cfb4481.
⋮----
// Solidity: function getAllocatableMagnitude(address operator, address strategy) view returns(uint64)
func (_AllocationManagerView *AllocationManagerViewCaller) GetAllocatableMagnitude(opts *bind.CallOpts, operator common.Address, strategy common.Address) (uint64, error)
⋮----
// GetAllocatedSets is a free data retrieval call binding the contract method 0x15fe5028.
⋮----
// Solidity: function getAllocatedSets(address operator) view returns((address,uint32)[])
func (_AllocationManagerView *AllocationManagerViewCaller) GetAllocatedSets(opts *bind.CallOpts, operator common.Address) ([]OperatorSet, error)
⋮----
// GetAllocatedStake is a free data retrieval call binding the contract method 0x2b453a9a.
⋮----
// Solidity: function getAllocatedStake((address,uint32) operatorSet, address[] operators, address[] strategies) view returns(uint256[][])
func (_AllocationManagerView *AllocationManagerViewCaller) GetAllocatedStake(opts *bind.CallOpts, operatorSet OperatorSet, operators []common.Address, strategies []common.Address) ([][]*big.Int, error)
⋮----
// GetAllocatedStrategies is a free data retrieval call binding the contract method 0xc221d8ae.
⋮----
// Solidity: function getAllocatedStrategies(address operator, (address,uint32) operatorSet) view returns(address[])
func (_AllocationManagerView *AllocationManagerViewCaller) GetAllocatedStrategies(opts *bind.CallOpts, operator common.Address, operatorSet OperatorSet) ([]common.Address, error)
⋮----
// GetAllocation is a free data retrieval call binding the contract method 0x10e1b9b8.
⋮----
// Solidity: function getAllocation(address operator, (address,uint32) operatorSet, address strategy) view returns((uint64,int128,uint32))
func (_AllocationManagerView *AllocationManagerViewCaller) GetAllocation(opts *bind.CallOpts, operator common.Address, operatorSet OperatorSet, strategy common.Address) (IAllocationManagerTypesAllocation, error)
⋮----
// GetAllocationDelay is a free data retrieval call binding the contract method 0xb9fbaed1.
⋮----
// Solidity: function getAllocationDelay(address operator) view returns(bool, uint32)
func (_AllocationManagerView *AllocationManagerViewCaller) GetAllocationDelay(opts *bind.CallOpts, operator common.Address) (bool, uint32, error)
⋮----
// GetAllocations is a free data retrieval call binding the contract method 0x8ce64854.
⋮----
// Solidity: function getAllocations(address[] operators, (address,uint32) operatorSet, address strategy) view returns((uint64,int128,uint32)[])
func (_AllocationManagerView *AllocationManagerViewCaller) GetAllocations(opts *bind.CallOpts, operators []common.Address, operatorSet OperatorSet, strategy common.Address) ([]IAllocationManagerTypesAllocation, error)
⋮----
// GetEncumberedMagnitude is a free data retrieval call binding the contract method 0xf605ce08.
⋮----
// Solidity: function getEncumberedMagnitude(address operator, address strategy) view returns(uint64)
func (_AllocationManagerView *AllocationManagerViewCaller) GetEncumberedMagnitude(opts *bind.CallOpts, operator common.Address, strategy common.Address) (uint64, error)
⋮----
// GetMaxMagnitude is a free data retrieval call binding the contract method 0xa9333ec8.
⋮----
// Solidity: function getMaxMagnitude(address operator, address strategy) view returns(uint64)
func (_AllocationManagerView *AllocationManagerViewCaller) GetMaxMagnitude(opts *bind.CallOpts, operator common.Address, strategy common.Address) (uint64, error)
⋮----
// GetMaxMagnitudes is a free data retrieval call binding the contract method 0x4a10ffe5.
⋮----
// Solidity: function getMaxMagnitudes(address[] operators, address strategy) view returns(uint64[])
func (_AllocationManagerView *AllocationManagerViewCaller) GetMaxMagnitudes(opts *bind.CallOpts, operators []common.Address, strategy common.Address) ([]uint64, error)
⋮----
// GetMaxMagnitudes0 is a free data retrieval call binding the contract method 0x547afb87.
⋮----
// Solidity: function getMaxMagnitudes(address operator, address[] strategies) view returns(uint64[])
func (_AllocationManagerView *AllocationManagerViewCaller) GetMaxMagnitudes0(opts *bind.CallOpts, operator common.Address, strategies []common.Address) ([]uint64, error)
⋮----
// GetMaxMagnitudesAtBlock is a free data retrieval call binding the contract method 0x94d7d00c.
⋮----
// Solidity: function getMaxMagnitudesAtBlock(address operator, address[] strategies, uint32 blockNumber) view returns(uint64[])
func (_AllocationManagerView *AllocationManagerViewCaller) GetMaxMagnitudesAtBlock(opts *bind.CallOpts, operator common.Address, strategies []common.Address, blockNumber uint32) ([]uint64, error)
⋮----
// GetMemberCount is a free data retrieval call binding the contract method 0xb2447af7.
⋮----
// Solidity: function getMemberCount((address,uint32) operatorSet) view returns(uint256)
func (_AllocationManagerView *AllocationManagerViewCaller) GetMemberCount(opts *bind.CallOpts, operatorSet OperatorSet) (*big.Int, error)
⋮----
// GetMembers is a free data retrieval call binding the contract method 0x6e875dba.
⋮----
// Solidity: function getMembers((address,uint32) operatorSet) view returns(address[])
func (_AllocationManagerView *AllocationManagerViewCaller) GetMembers(opts *bind.CallOpts, operatorSet OperatorSet) ([]common.Address, error)
⋮----
// GetMinimumSlashableStake is a free data retrieval call binding the contract method 0x2bab2c4a.
⋮----
// Solidity: function getMinimumSlashableStake((address,uint32) operatorSet, address[] operators, address[] strategies, uint32 futureBlock) view returns(uint256[][] slashableStake)
func (_AllocationManagerView *AllocationManagerViewCaller) GetMinimumSlashableStake(opts *bind.CallOpts, operatorSet OperatorSet, operators []common.Address, strategies []common.Address, futureBlock uint32) ([][]*big.Int, error)
⋮----
// GetOperatorSetCount is a free data retrieval call binding the contract method 0xba1a84e5.
⋮----
// Solidity: function getOperatorSetCount(address avs) view returns(uint256)
func (_AllocationManagerView *AllocationManagerViewCaller) GetOperatorSetCount(opts *bind.CallOpts, avs common.Address) (*big.Int, error)
⋮----
// GetPendingSlasher is a free data retrieval call binding the contract method 0xd7794857.
⋮----
// Solidity: function getPendingSlasher((address,uint32) operatorSet) view returns(address, uint32)
func (_AllocationManagerView *AllocationManagerViewCaller) GetPendingSlasher(opts *bind.CallOpts, operatorSet OperatorSet) (common.Address, uint32, error)
⋮----
// GetRedistributionRecipient is a free data retrieval call binding the contract method 0x0f3df50e.
⋮----
// Solidity: function getRedistributionRecipient((address,uint32) operatorSet) view returns(address)
func (_AllocationManagerView *AllocationManagerViewCaller) GetRedistributionRecipient(opts *bind.CallOpts, operatorSet OperatorSet) (common.Address, error)
⋮----
// GetRegisteredSets is a free data retrieval call binding the contract method 0x79ae50cd.
⋮----
// Solidity: function getRegisteredSets(address operator) view returns((address,uint32)[])
func (_AllocationManagerView *AllocationManagerViewCaller) GetRegisteredSets(opts *bind.CallOpts, operator common.Address) ([]OperatorSet, error)
⋮----
// GetSlashCount is a free data retrieval call binding the contract method 0x4cfd2939.
⋮----
// Solidity: function getSlashCount((address,uint32) operatorSet) view returns(uint256)
func (_AllocationManagerView *AllocationManagerViewCaller) GetSlashCount(opts *bind.CallOpts, operatorSet OperatorSet) (*big.Int, error)
⋮----
// GetSlasher is a free data retrieval call binding the contract method 0xd4a3fcce.
⋮----
// Solidity: function getSlasher((address,uint32) operatorSet) view returns(address)
func (_AllocationManagerView *AllocationManagerViewCaller) GetSlasher(opts *bind.CallOpts, operatorSet OperatorSet) (common.Address, error)
⋮----
// GetStrategiesInOperatorSet is a free data retrieval call binding the contract method 0x4177a87c.
⋮----
// Solidity: function getStrategiesInOperatorSet((address,uint32) operatorSet) view returns(address[])
func (_AllocationManagerView *AllocationManagerViewCaller) GetStrategiesInOperatorSet(opts *bind.CallOpts, operatorSet OperatorSet) ([]common.Address, error)
⋮----
// GetStrategyAllocations is a free data retrieval call binding the contract method 0x40120dab.
⋮----
// Solidity: function getStrategyAllocations(address operator, address strategy) view returns((address,uint32)[], (uint64,int128,uint32)[])
func (_AllocationManagerView *AllocationManagerViewCaller) GetStrategyAllocations(opts *bind.CallOpts, operator common.Address, strategy common.Address) ([]OperatorSet, []IAllocationManagerTypesAllocation, error)
⋮----
// IsMemberOfOperatorSet is a free data retrieval call binding the contract method 0x670d3ba2.
⋮----
// Solidity: function isMemberOfOperatorSet(address operator, (address,uint32) operatorSet) view returns(bool)
func (_AllocationManagerView *AllocationManagerViewCaller) IsMemberOfOperatorSet(opts *bind.CallOpts, operator common.Address, operatorSet OperatorSet) (bool, error)
⋮----
// IsOperatorRedistributable is a free data retrieval call binding the contract method 0xdc2af692.
⋮----
// Solidity: function isOperatorRedistributable(address operator) view returns(bool)
func (_AllocationManagerView *AllocationManagerViewCaller) IsOperatorRedistributable(opts *bind.CallOpts, operator common.Address) (bool, error)
⋮----
// IsOperatorSet is a free data retrieval call binding the contract method 0x260dc758.
⋮----
// Solidity: function isOperatorSet((address,uint32) operatorSet) view returns(bool)
func (_AllocationManagerView *AllocationManagerViewCaller) IsOperatorSet(opts *bind.CallOpts, operatorSet OperatorSet) (bool, error)
⋮----
// IsOperatorSlashable is a free data retrieval call binding the contract method 0x1352c3e6.
⋮----
// Solidity: function isOperatorSlashable(address operator, (address,uint32) operatorSet) view returns(bool)
func (_AllocationManagerView *AllocationManagerViewCaller) IsOperatorSlashable(opts *bind.CallOpts, operator common.Address, operatorSet OperatorSet) (bool, error)
⋮----
// IsRedistributingOperatorSet is a free data retrieval call binding the contract method 0xf231bd08.
⋮----
// Solidity: function isRedistributingOperatorSet((address,uint32) operatorSet) view returns(bool)
func (_AllocationManagerView *AllocationManagerViewCaller) IsRedistributingOperatorSet(opts *bind.CallOpts, operatorSet OperatorSet) (bool, error)
⋮----
// AllocationManagerViewAVSMetadataURIUpdatedIterator is returned from FilterAVSMetadataURIUpdated and is used to iterate over the raw logs and unpacked data for AVSMetadataURIUpdated events raised by the AllocationManagerView contract.
type AllocationManagerViewAVSMetadataURIUpdatedIterator struct {
	Event *AllocationManagerViewAVSMetadataURIUpdated // 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
}
⋮----
Event *AllocationManagerViewAVSMetadataURIUpdated // 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 *AllocationManagerViewAVSMetadataURIUpdatedIterator) Next() bool
⋮----
// If the iterator failed, stop iterating
⋮----
// If the iterator completed, deliver directly whatever's available
⋮----
// Iterator still in progress, wait for either a data or an error event
⋮----
// Error returns any retrieval or parsing error occurred during filtering.
func (it *AllocationManagerViewAVSMetadataURIUpdatedIterator) Error() error
⋮----
// Close terminates the iteration process, releasing any pending underlying
// resources.
func (it *AllocationManagerViewAVSMetadataURIUpdatedIterator) Close() error
⋮----
// AllocationManagerViewAVSMetadataURIUpdated represents a AVSMetadataURIUpdated event raised by the AllocationManagerView contract.
type AllocationManagerViewAVSMetadataURIUpdated struct {
	Avs         common.Address
	MetadataURI string
	Raw         types.Log // Blockchain specific contextual infos
}
⋮----
Raw         types.Log // Blockchain specific contextual infos
⋮----
// FilterAVSMetadataURIUpdated is a free log retrieval operation binding the contract event 0xa89c1dc243d8908a96dd84944bcc97d6bc6ac00dd78e20621576be6a3c943713.
⋮----
// Solidity: event AVSMetadataURIUpdated(address indexed avs, string metadataURI)
func (_AllocationManagerView *AllocationManagerViewFilterer) FilterAVSMetadataURIUpdated(opts *bind.FilterOpts, avs []common.Address) (*AllocationManagerViewAVSMetadataURIUpdatedIterator, error)
⋮----
var avsRule []interface{}
⋮----
// WatchAVSMetadataURIUpdated is a free log subscription operation binding the contract event 0xa89c1dc243d8908a96dd84944bcc97d6bc6ac00dd78e20621576be6a3c943713.
⋮----
func (_AllocationManagerView *AllocationManagerViewFilterer) WatchAVSMetadataURIUpdated(opts *bind.WatchOpts, sink chan<- *AllocationManagerViewAVSMetadataURIUpdated, avs []common.Address) (event.Subscription, error)
⋮----
// New log arrived, parse the event and forward to the user
⋮----
// ParseAVSMetadataURIUpdated is a log parse operation binding the contract event 0xa89c1dc243d8908a96dd84944bcc97d6bc6ac00dd78e20621576be6a3c943713.
⋮----
func (_AllocationManagerView *AllocationManagerViewFilterer) ParseAVSMetadataURIUpdated(log types.Log) (*AllocationManagerViewAVSMetadataURIUpdated, error)
⋮----
// AllocationManagerViewAVSRegistrarSetIterator is returned from FilterAVSRegistrarSet and is used to iterate over the raw logs and unpacked data for AVSRegistrarSet events raised by the AllocationManagerView contract.
type AllocationManagerViewAVSRegistrarSetIterator struct {
	Event *AllocationManagerViewAVSRegistrarSet // 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
}
⋮----
Event *AllocationManagerViewAVSRegistrarSet // Event containing the contract specifics and raw log
⋮----
// AllocationManagerViewAVSRegistrarSet represents a AVSRegistrarSet event raised by the AllocationManagerView contract.
type AllocationManagerViewAVSRegistrarSet struct {
	Avs       common.Address
	Registrar common.Address
	Raw       types.Log // Blockchain specific contextual infos
}
⋮----
Raw       types.Log // Blockchain specific contextual infos
⋮----
// FilterAVSRegistrarSet is a free log retrieval operation binding the contract event 0x2ae945c40c44dc0ec263f95609c3fdc6952e0aefa22d6374e44f2c997acedf85.
⋮----
// Solidity: event AVSRegistrarSet(address avs, address registrar)
func (_AllocationManagerView *AllocationManagerViewFilterer) FilterAVSRegistrarSet(opts *bind.FilterOpts) (*AllocationManagerViewAVSRegistrarSetIterator, error)
⋮----
// WatchAVSRegistrarSet is a free log subscription operation binding the contract event 0x2ae945c40c44dc0ec263f95609c3fdc6952e0aefa22d6374e44f2c997acedf85.
⋮----
func (_AllocationManagerView *AllocationManagerViewFilterer) WatchAVSRegistrarSet(opts *bind.WatchOpts, sink chan<- *AllocationManagerViewAVSRegistrarSet) (event.Subscription, error)
⋮----
// ParseAVSRegistrarSet is a log parse operation binding the contract event 0x2ae945c40c44dc0ec263f95609c3fdc6952e0aefa22d6374e44f2c997acedf85.
⋮----
func (_AllocationManagerView *AllocationManagerViewFilterer) ParseAVSRegistrarSet(log types.Log) (*AllocationManagerViewAVSRegistrarSet, error)
⋮----
// AllocationManagerViewAllocationDelaySetIterator is returned from FilterAllocationDelaySet and is used to iterate over the raw logs and unpacked data for AllocationDelaySet events raised by the AllocationManagerView contract.
type AllocationManagerViewAllocationDelaySetIterator struct {
	Event *AllocationManagerViewAllocationDelaySet // 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
}
⋮----
Event *AllocationManagerViewAllocationDelaySet // Event containing the contract specifics and raw log
⋮----
// AllocationManagerViewAllocationDelaySet represents a AllocationDelaySet event raised by the AllocationManagerView contract.
type AllocationManagerViewAllocationDelaySet struct {
	Operator    common.Address
	Delay       uint32
	EffectBlock uint32
	Raw         types.Log // Blockchain specific contextual infos
}
⋮----
// FilterAllocationDelaySet is a free log retrieval operation binding the contract event 0x4e85751d6331506c6c62335f207eb31f12a61e570f34f5c17640308785c6d4db.
⋮----
// Solidity: event AllocationDelaySet(address operator, uint32 delay, uint32 effectBlock)
func (_AllocationManagerView *AllocationManagerViewFilterer) FilterAllocationDelaySet(opts *bind.FilterOpts) (*AllocationManagerViewAllocationDelaySetIterator, error)
⋮----
// WatchAllocationDelaySet is a free log subscription operation binding the contract event 0x4e85751d6331506c6c62335f207eb31f12a61e570f34f5c17640308785c6d4db.
⋮----
func (_AllocationManagerView *AllocationManagerViewFilterer) WatchAllocationDelaySet(opts *bind.WatchOpts, sink chan<- *AllocationManagerViewAllocationDelaySet) (event.Subscription, error)
⋮----
// ParseAllocationDelaySet is a log parse operation binding the contract event 0x4e85751d6331506c6c62335f207eb31f12a61e570f34f5c17640308785c6d4db.
⋮----
func (_AllocationManagerView *AllocationManagerViewFilterer) ParseAllocationDelaySet(log types.Log) (*AllocationManagerViewAllocationDelaySet, error)
⋮----
// AllocationManagerViewAllocationUpdatedIterator is returned from FilterAllocationUpdated and is used to iterate over the raw logs and unpacked data for AllocationUpdated events raised by the AllocationManagerView contract.
type AllocationManagerViewAllocationUpdatedIterator struct {
	Event *AllocationManagerViewAllocationUpdated // 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
}
⋮----
Event *AllocationManagerViewAllocationUpdated // Event containing the contract specifics and raw log
⋮----
// AllocationManagerViewAllocationUpdated represents a AllocationUpdated event raised by the AllocationManagerView contract.
type AllocationManagerViewAllocationUpdated struct {
	Operator    common.Address
	OperatorSet OperatorSet
	Strategy    common.Address
	Magnitude   uint64
	EffectBlock uint32
	Raw         types.Log // Blockchain specific contextual infos
}
⋮----
// FilterAllocationUpdated is a free log retrieval operation binding the contract event 0x1487af5418c47ee5ea45ef4a93398668120890774a9e13487e61e9dc3baf76dd.
⋮----
// Solidity: event AllocationUpdated(address operator, (address,uint32) operatorSet, address strategy, uint64 magnitude, uint32 effectBlock)
func (_AllocationManagerView *AllocationManagerViewFilterer) FilterAllocationUpdated(opts *bind.FilterOpts) (*AllocationManagerViewAllocationUpdatedIterator, error)
⋮----
// WatchAllocationUpdated is a free log subscription operation binding the contract event 0x1487af5418c47ee5ea45ef4a93398668120890774a9e13487e61e9dc3baf76dd.
⋮----
func (_AllocationManagerView *AllocationManagerViewFilterer) WatchAllocationUpdated(opts *bind.WatchOpts, sink chan<- *AllocationManagerViewAllocationUpdated) (event.Subscription, error)
⋮----
// ParseAllocationUpdated is a log parse operation binding the contract event 0x1487af5418c47ee5ea45ef4a93398668120890774a9e13487e61e9dc3baf76dd.
⋮----
func (_AllocationManagerView *AllocationManagerViewFilterer) ParseAllocationUpdated(log types.Log) (*AllocationManagerViewAllocationUpdated, error)
⋮----
// AllocationManagerViewEncumberedMagnitudeUpdatedIterator is returned from FilterEncumberedMagnitudeUpdated and is used to iterate over the raw logs and unpacked data for EncumberedMagnitudeUpdated events raised by the AllocationManagerView contract.
type AllocationManagerViewEncumberedMagnitudeUpdatedIterator struct {
	Event *AllocationManagerViewEncumberedMagnitudeUpdated // 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
}
⋮----
Event *AllocationManagerViewEncumberedMagnitudeUpdated // Event containing the contract specifics and raw log
⋮----
// AllocationManagerViewEncumberedMagnitudeUpdated represents a EncumberedMagnitudeUpdated event raised by the AllocationManagerView contract.
type AllocationManagerViewEncumberedMagnitudeUpdated struct {
	Operator            common.Address
	Strategy            common.Address
	EncumberedMagnitude uint64
	Raw                 types.Log // Blockchain specific contextual infos
}
⋮----
Raw                 types.Log // Blockchain specific contextual infos
⋮----
// FilterEncumberedMagnitudeUpdated is a free log retrieval operation binding the contract event 0xacf9095feb3a370c9cf692421c69ef320d4db5c66e6a7d29c7694eb02364fc55.
⋮----
// Solidity: event EncumberedMagnitudeUpdated(address operator, address strategy, uint64 encumberedMagnitude)
func (_AllocationManagerView *AllocationManagerViewFilterer) FilterEncumberedMagnitudeUpdated(opts *bind.FilterOpts) (*AllocationManagerViewEncumberedMagnitudeUpdatedIterator, error)
⋮----
// WatchEncumberedMagnitudeUpdated is a free log subscription operation binding the contract event 0xacf9095feb3a370c9cf692421c69ef320d4db5c66e6a7d29c7694eb02364fc55.
⋮----
func (_AllocationManagerView *AllocationManagerViewFilterer) WatchEncumberedMagnitudeUpdated(opts *bind.WatchOpts, sink chan<- *AllocationManagerViewEncumberedMagnitudeUpdated) (event.Subscription, error)
⋮----
// ParseEncumberedMagnitudeUpdated is a log parse operation binding the contract event 0xacf9095feb3a370c9cf692421c69ef320d4db5c66e6a7d29c7694eb02364fc55.
⋮----
func (_AllocationManagerView *AllocationManagerViewFilterer) ParseEncumberedMagnitudeUpdated(log types.Log) (*AllocationManagerViewEncumberedMagnitudeUpdated, error)
⋮----
// AllocationManagerViewMaxMagnitudeUpdatedIterator is returned from FilterMaxMagnitudeUpdated and is used to iterate over the raw logs and unpacked data for MaxMagnitudeUpdated events raised by the AllocationManagerView contract.
type AllocationManagerViewMaxMagnitudeUpdatedIterator struct {
	Event *AllocationManagerViewMaxMagnitudeUpdated // 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
}
⋮----
Event *AllocationManagerViewMaxMagnitudeUpdated // Event containing the contract specifics and raw log
⋮----
// AllocationManagerViewMaxMagnitudeUpdated represents a MaxMagnitudeUpdated event raised by the AllocationManagerView contract.
type AllocationManagerViewMaxMagnitudeUpdated struct {
	Operator     common.Address
	Strategy     common.Address
	MaxMagnitude uint64
	Raw          types.Log // Blockchain specific contextual infos
}
⋮----
Raw          types.Log // Blockchain specific contextual infos
⋮----
// FilterMaxMagnitudeUpdated is a free log retrieval operation binding the contract event 0x1c6458079a41077d003c11faf9bf097e693bd67979e4e6500bac7b29db779b5c.
⋮----
// Solidity: event MaxMagnitudeUpdated(address operator, address strategy, uint64 maxMagnitude)
func (_AllocationManagerView *AllocationManagerViewFilterer) FilterMaxMagnitudeUpdated(opts *bind.FilterOpts) (*AllocationManagerViewMaxMagnitudeUpdatedIterator, error)
⋮----
// WatchMaxMagnitudeUpdated is a free log subscription operation binding the contract event 0x1c6458079a41077d003c11faf9bf097e693bd67979e4e6500bac7b29db779b5c.
⋮----
func (_AllocationManagerView *AllocationManagerViewFilterer) WatchMaxMagnitudeUpdated(opts *bind.WatchOpts, sink chan<- *AllocationManagerViewMaxMagnitudeUpdated) (event.Subscription, error)
⋮----
// ParseMaxMagnitudeUpdated is a log parse operation binding the contract event 0x1c6458079a41077d003c11faf9bf097e693bd67979e4e6500bac7b29db779b5c.
⋮----
func (_AllocationManagerView *AllocationManagerViewFilterer) ParseMaxMagnitudeUpdated(log types.Log) (*AllocationManagerViewMaxMagnitudeUpdated, error)
⋮----
// AllocationManagerViewOperatorAddedToOperatorSetIterator is returned from FilterOperatorAddedToOperatorSet and is used to iterate over the raw logs and unpacked data for OperatorAddedToOperatorSet events raised by the AllocationManagerView contract.
type AllocationManagerViewOperatorAddedToOperatorSetIterator struct {
	Event *AllocationManagerViewOperatorAddedToOperatorSet // 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
}
⋮----
Event *AllocationManagerViewOperatorAddedToOperatorSet // Event containing the contract specifics and raw log
⋮----
// AllocationManagerViewOperatorAddedToOperatorSet represents a OperatorAddedToOperatorSet event raised by the AllocationManagerView contract.
type AllocationManagerViewOperatorAddedToOperatorSet struct {
	Operator    common.Address
	OperatorSet OperatorSet
	Raw         types.Log // Blockchain specific contextual infos
}
⋮----
// FilterOperatorAddedToOperatorSet is a free log retrieval operation binding the contract event 0x43232edf9071753d2321e5fa7e018363ee248e5f2142e6c08edd3265bfb4895e.
⋮----
// Solidity: event OperatorAddedToOperatorSet(address indexed operator, (address,uint32) operatorSet)
func (_AllocationManagerView *AllocationManagerViewFilterer) FilterOperatorAddedToOperatorSet(opts *bind.FilterOpts, operator []common.Address) (*AllocationManagerViewOperatorAddedToOperatorSetIterator, error)
⋮----
var operatorRule []interface{}
⋮----
// WatchOperatorAddedToOperatorSet is a free log subscription operation binding the contract event 0x43232edf9071753d2321e5fa7e018363ee248e5f2142e6c08edd3265bfb4895e.
⋮----
func (_AllocationManagerView *AllocationManagerViewFilterer) WatchOperatorAddedToOperatorSet(opts *bind.WatchOpts, sink chan<- *AllocationManagerViewOperatorAddedToOperatorSet, operator []common.Address) (event.Subscription, error)
⋮----
// ParseOperatorAddedToOperatorSet is a log parse operation binding the contract event 0x43232edf9071753d2321e5fa7e018363ee248e5f2142e6c08edd3265bfb4895e.
⋮----
func (_AllocationManagerView *AllocationManagerViewFilterer) ParseOperatorAddedToOperatorSet(log types.Log) (*AllocationManagerViewOperatorAddedToOperatorSet, error)
⋮----
// AllocationManagerViewOperatorRemovedFromOperatorSetIterator is returned from FilterOperatorRemovedFromOperatorSet and is used to iterate over the raw logs and unpacked data for OperatorRemovedFromOperatorSet events raised by the AllocationManagerView contract.
type AllocationManagerViewOperatorRemovedFromOperatorSetIterator struct {
	Event *AllocationManagerViewOperatorRemovedFromOperatorSet // 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
}
⋮----
Event *AllocationManagerViewOperatorRemovedFromOperatorSet // Event containing the contract specifics and raw log
⋮----
// AllocationManagerViewOperatorRemovedFromOperatorSet represents a OperatorRemovedFromOperatorSet event raised by the AllocationManagerView contract.
type AllocationManagerViewOperatorRemovedFromOperatorSet struct {
	Operator    common.Address
	OperatorSet OperatorSet
	Raw         types.Log // Blockchain specific contextual infos
}
⋮----
// FilterOperatorRemovedFromOperatorSet is a free log retrieval operation binding the contract event 0xad34c3070be1dffbcaa499d000ba2b8d9848aefcac3059df245dd95c4ece14fe.
⋮----
// Solidity: event OperatorRemovedFromOperatorSet(address indexed operator, (address,uint32) operatorSet)
func (_AllocationManagerView *AllocationManagerViewFilterer) FilterOperatorRemovedFromOperatorSet(opts *bind.FilterOpts, operator []common.Address) (*AllocationManagerViewOperatorRemovedFromOperatorSetIterator, error)
⋮----
// WatchOperatorRemovedFromOperatorSet is a free log subscription operation binding the contract event 0xad34c3070be1dffbcaa499d000ba2b8d9848aefcac3059df245dd95c4ece14fe.
⋮----
func (_AllocationManagerView *AllocationManagerViewFilterer) WatchOperatorRemovedFromOperatorSet(opts *bind.WatchOpts, sink chan<- *AllocationManagerViewOperatorRemovedFromOperatorSet, operator []common.Address) (event.Subscription, error)
⋮----
// ParseOperatorRemovedFromOperatorSet is a log parse operation binding the contract event 0xad34c3070be1dffbcaa499d000ba2b8d9848aefcac3059df245dd95c4ece14fe.
⋮----
func (_AllocationManagerView *AllocationManagerViewFilterer) ParseOperatorRemovedFromOperatorSet(log types.Log) (*AllocationManagerViewOperatorRemovedFromOperatorSet, error)
⋮----
// AllocationManagerViewOperatorSetCreatedIterator is returned from FilterOperatorSetCreated and is used to iterate over the raw logs and unpacked data for OperatorSetCreated events raised by the AllocationManagerView contract.
type AllocationManagerViewOperatorSetCreatedIterator struct {
	Event *AllocationManagerViewOperatorSetCreated // 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
}
⋮----
Event *AllocationManagerViewOperatorSetCreated // Event containing the contract specifics and raw log
⋮----
// AllocationManagerViewOperatorSetCreated represents a OperatorSetCreated event raised by the AllocationManagerView contract.
type AllocationManagerViewOperatorSetCreated struct {
	OperatorSet OperatorSet
	Raw         types.Log // Blockchain specific contextual infos
}
⋮----
// FilterOperatorSetCreated is a free log retrieval operation binding the contract event 0x31629285ead2335ae0933f86ed2ae63321f7af77b4e6eaabc42c057880977e6c.
⋮----
// Solidity: event OperatorSetCreated((address,uint32) operatorSet)
func (_AllocationManagerView *AllocationManagerViewFilterer) FilterOperatorSetCreated(opts *bind.FilterOpts) (*AllocationManagerViewOperatorSetCreatedIterator, error)
⋮----
// WatchOperatorSetCreated is a free log subscription operation binding the contract event 0x31629285ead2335ae0933f86ed2ae63321f7af77b4e6eaabc42c057880977e6c.
⋮----
func (_AllocationManagerView *AllocationManagerViewFilterer) WatchOperatorSetCreated(opts *bind.WatchOpts, sink chan<- *AllocationManagerViewOperatorSetCreated) (event.Subscription, error)
⋮----
// ParseOperatorSetCreated is a log parse operation binding the contract event 0x31629285ead2335ae0933f86ed2ae63321f7af77b4e6eaabc42c057880977e6c.
⋮----
func (_AllocationManagerView *AllocationManagerViewFilterer) ParseOperatorSetCreated(log types.Log) (*AllocationManagerViewOperatorSetCreated, error)
⋮----
// AllocationManagerViewOperatorSlashedIterator is returned from FilterOperatorSlashed and is used to iterate over the raw logs and unpacked data for OperatorSlashed events raised by the AllocationManagerView contract.
type AllocationManagerViewOperatorSlashedIterator struct {
	Event *AllocationManagerViewOperatorSlashed // 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
}
⋮----
Event *AllocationManagerViewOperatorSlashed // Event containing the contract specifics and raw log
⋮----
// AllocationManagerViewOperatorSlashed represents a OperatorSlashed event raised by the AllocationManagerView contract.
type AllocationManagerViewOperatorSlashed struct {
	Operator    common.Address
	OperatorSet OperatorSet
	Strategies  []common.Address
	WadSlashed  []*big.Int
	Description string
	Raw         types.Log // Blockchain specific contextual infos
}
⋮----
// FilterOperatorSlashed is a free log retrieval operation binding the contract event 0x80969ad29428d6797ee7aad084f9e4a42a82fc506dcd2ca3b6fb431f85ccebe5.
⋮----
// Solidity: event OperatorSlashed(address operator, (address,uint32) operatorSet, address[] strategies, uint256[] wadSlashed, string description)
func (_AllocationManagerView *AllocationManagerViewFilterer) FilterOperatorSlashed(opts *bind.FilterOpts) (*AllocationManagerViewOperatorSlashedIterator, error)
⋮----
// WatchOperatorSlashed is a free log subscription operation binding the contract event 0x80969ad29428d6797ee7aad084f9e4a42a82fc506dcd2ca3b6fb431f85ccebe5.
⋮----
func (_AllocationManagerView *AllocationManagerViewFilterer) WatchOperatorSlashed(opts *bind.WatchOpts, sink chan<- *AllocationManagerViewOperatorSlashed) (event.Subscription, error)
⋮----
// ParseOperatorSlashed is a log parse operation binding the contract event 0x80969ad29428d6797ee7aad084f9e4a42a82fc506dcd2ca3b6fb431f85ccebe5.
⋮----
func (_AllocationManagerView *AllocationManagerViewFilterer) ParseOperatorSlashed(log types.Log) (*AllocationManagerViewOperatorSlashed, error)
⋮----
// AllocationManagerViewRedistributionAddressSetIterator is returned from FilterRedistributionAddressSet and is used to iterate over the raw logs and unpacked data for RedistributionAddressSet events raised by the AllocationManagerView contract.
type AllocationManagerViewRedistributionAddressSetIterator struct {
	Event *AllocationManagerViewRedistributionAddressSet // 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
}
⋮----
Event *AllocationManagerViewRedistributionAddressSet // Event containing the contract specifics and raw log
⋮----
// AllocationManagerViewRedistributionAddressSet represents a RedistributionAddressSet event raised by the AllocationManagerView contract.
type AllocationManagerViewRedistributionAddressSet struct {
	OperatorSet             OperatorSet
	RedistributionRecipient common.Address
	Raw                     types.Log // Blockchain specific contextual infos
}
⋮----
Raw                     types.Log // Blockchain specific contextual infos
⋮----
// FilterRedistributionAddressSet is a free log retrieval operation binding the contract event 0x90a6fa2a9b79b910872ebca540cf3bd8be827f586e6420c30d8836e30012907e.
⋮----
// Solidity: event RedistributionAddressSet((address,uint32) operatorSet, address redistributionRecipient)
func (_AllocationManagerView *AllocationManagerViewFilterer) FilterRedistributionAddressSet(opts *bind.FilterOpts) (*AllocationManagerViewRedistributionAddressSetIterator, error)
⋮----
// WatchRedistributionAddressSet is a free log subscription operation binding the contract event 0x90a6fa2a9b79b910872ebca540cf3bd8be827f586e6420c30d8836e30012907e.
⋮----
func (_AllocationManagerView *AllocationManagerViewFilterer) WatchRedistributionAddressSet(opts *bind.WatchOpts, sink chan<- *AllocationManagerViewRedistributionAddressSet) (event.Subscription, error)
⋮----
// ParseRedistributionAddressSet is a log parse operation binding the contract event 0x90a6fa2a9b79b910872ebca540cf3bd8be827f586e6420c30d8836e30012907e.
⋮----
func (_AllocationManagerView *AllocationManagerViewFilterer) ParseRedistributionAddressSet(log types.Log) (*AllocationManagerViewRedistributionAddressSet, error)
⋮----
// AllocationManagerViewSlasherMigratedIterator is returned from FilterSlasherMigrated and is used to iterate over the raw logs and unpacked data for SlasherMigrated events raised by the AllocationManagerView contract.
type AllocationManagerViewSlasherMigratedIterator struct {
	Event *AllocationManagerViewSlasherMigrated // 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
}
⋮----
Event *AllocationManagerViewSlasherMigrated // Event containing the contract specifics and raw log
⋮----
// AllocationManagerViewSlasherMigrated represents a SlasherMigrated event raised by the AllocationManagerView contract.
type AllocationManagerViewSlasherMigrated struct {
	OperatorSet OperatorSet
	Slasher     common.Address
	Raw         types.Log // Blockchain specific contextual infos
}
⋮----
// FilterSlasherMigrated is a free log retrieval operation binding the contract event 0xf0c8fc7d71f647bd3a88ac369112517f6a4b8038e71913f2d20f71f877dfc725.
⋮----
// Solidity: event SlasherMigrated((address,uint32) operatorSet, address slasher)
func (_AllocationManagerView *AllocationManagerViewFilterer) FilterSlasherMigrated(opts *bind.FilterOpts) (*AllocationManagerViewSlasherMigratedIterator, error)
⋮----
// WatchSlasherMigrated is a free log subscription operation binding the contract event 0xf0c8fc7d71f647bd3a88ac369112517f6a4b8038e71913f2d20f71f877dfc725.
⋮----
func (_AllocationManagerView *AllocationManagerViewFilterer) WatchSlasherMigrated(opts *bind.WatchOpts, sink chan<- *AllocationManagerViewSlasherMigrated) (event.Subscription, error)
⋮----
// ParseSlasherMigrated is a log parse operation binding the contract event 0xf0c8fc7d71f647bd3a88ac369112517f6a4b8038e71913f2d20f71f877dfc725.
⋮----
func (_AllocationManagerView *AllocationManagerViewFilterer) ParseSlasherMigrated(log types.Log) (*AllocationManagerViewSlasherMigrated, error)
⋮----
// AllocationManagerViewSlasherUpdatedIterator is returned from FilterSlasherUpdated and is used to iterate over the raw logs and unpacked data for SlasherUpdated events raised by the AllocationManagerView contract.
type AllocationManagerViewSlasherUpdatedIterator struct {
	Event *AllocationManagerViewSlasherUpdated // 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
}
⋮----
Event *AllocationManagerViewSlasherUpdated // Event containing the contract specifics and raw log
⋮----
// AllocationManagerViewSlasherUpdated represents a SlasherUpdated event raised by the AllocationManagerView contract.
type AllocationManagerViewSlasherUpdated struct {
	OperatorSet OperatorSet
	Slasher     common.Address
	EffectBlock uint32
	Raw         types.Log // Blockchain specific contextual infos
}
⋮----
// FilterSlasherUpdated is a free log retrieval operation binding the contract event 0x3873f29d7a65a4d75f5ba28909172f486216a1420e77c3c2720815951a6b4f57.
⋮----
// Solidity: event SlasherUpdated((address,uint32) operatorSet, address slasher, uint32 effectBlock)
func (_AllocationManagerView *AllocationManagerViewFilterer) FilterSlasherUpdated(opts *bind.FilterOpts) (*AllocationManagerViewSlasherUpdatedIterator, error)
⋮----
// WatchSlasherUpdated is a free log subscription operation binding the contract event 0x3873f29d7a65a4d75f5ba28909172f486216a1420e77c3c2720815951a6b4f57.
⋮----
func (_AllocationManagerView *AllocationManagerViewFilterer) WatchSlasherUpdated(opts *bind.WatchOpts, sink chan<- *AllocationManagerViewSlasherUpdated) (event.Subscription, error)
⋮----
// ParseSlasherUpdated is a log parse operation binding the contract event 0x3873f29d7a65a4d75f5ba28909172f486216a1420e77c3c2720815951a6b4f57.
⋮----
func (_AllocationManagerView *AllocationManagerViewFilterer) ParseSlasherUpdated(log types.Log) (*AllocationManagerViewSlasherUpdated, error)
⋮----
// AllocationManagerViewStrategyAddedToOperatorSetIterator is returned from FilterStrategyAddedToOperatorSet and is used to iterate over the raw logs and unpacked data for StrategyAddedToOperatorSet events raised by the AllocationManagerView contract.
type AllocationManagerViewStrategyAddedToOperatorSetIterator struct {
	Event *AllocationManagerViewStrategyAddedToOperatorSet // 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
}
⋮----
Event *AllocationManagerViewStrategyAddedToOperatorSet // Event containing the contract specifics and raw log
⋮----
// AllocationManagerViewStrategyAddedToOperatorSet represents a StrategyAddedToOperatorSet event raised by the AllocationManagerView contract.
type AllocationManagerViewStrategyAddedToOperatorSet struct {
	OperatorSet OperatorSet
	Strategy    common.Address
	Raw         types.Log // Blockchain specific contextual infos
}
⋮----
// FilterStrategyAddedToOperatorSet is a free log retrieval operation binding the contract event 0x7ab260fe0af193db5f4986770d831bda4ea46099dc817e8b6716dcae8af8e88b.
⋮----
// Solidity: event StrategyAddedToOperatorSet((address,uint32) operatorSet, address strategy)
func (_AllocationManagerView *AllocationManagerViewFilterer) FilterStrategyAddedToOperatorSet(opts *bind.FilterOpts) (*AllocationManagerViewStrategyAddedToOperatorSetIterator, error)
⋮----
// WatchStrategyAddedToOperatorSet is a free log subscription operation binding the contract event 0x7ab260fe0af193db5f4986770d831bda4ea46099dc817e8b6716dcae8af8e88b.
⋮----
func (_AllocationManagerView *AllocationManagerViewFilterer) WatchStrategyAddedToOperatorSet(opts *bind.WatchOpts, sink chan<- *AllocationManagerViewStrategyAddedToOperatorSet) (event.Subscription, error)
⋮----
// ParseStrategyAddedToOperatorSet is a log parse operation binding the contract event 0x7ab260fe0af193db5f4986770d831bda4ea46099dc817e8b6716dcae8af8e88b.
⋮----
func (_AllocationManagerView *AllocationManagerViewFilterer) ParseStrategyAddedToOperatorSet(log types.Log) (*AllocationManagerViewStrategyAddedToOperatorSet, error)
⋮----
// AllocationManagerViewStrategyRemovedFromOperatorSetIterator is returned from FilterStrategyRemovedFromOperatorSet and is used to iterate over the raw logs and unpacked data for StrategyRemovedFromOperatorSet events raised by the AllocationManagerView contract.
type AllocationManagerViewStrategyRemovedFromOperatorSetIterator struct {
	Event *AllocationManagerViewStrategyRemovedFromOperatorSet // 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
}
⋮----
Event *AllocationManagerViewStrategyRemovedFromOperatorSet // Event containing the contract specifics and raw log
⋮----
// AllocationManagerViewStrategyRemovedFromOperatorSet represents a StrategyRemovedFromOperatorSet event raised by the AllocationManagerView contract.
type AllocationManagerViewStrategyRemovedFromOperatorSet struct {
	OperatorSet OperatorSet
	Strategy    common.Address
	Raw         types.Log // Blockchain specific contextual infos
}
⋮----
// FilterStrategyRemovedFromOperatorSet is a free log retrieval operation binding the contract event 0x7b4b073d80dcac55a11177d8459ad9f664ceeb91f71f27167bb14f8152a7eeee.
⋮----
// Solidity: event StrategyRemovedFromOperatorSet((address,uint32) operatorSet, address strategy)
func (_AllocationManagerView *AllocationManagerViewFilterer) FilterStrategyRemovedFromOperatorSet(opts *bind.FilterOpts) (*AllocationManagerViewStrategyRemovedFromOperatorSetIterator, error)
⋮----
// WatchStrategyRemovedFromOperatorSet is a free log subscription operation binding the contract event 0x7b4b073d80dcac55a11177d8459ad9f664ceeb91f71f27167bb14f8152a7eeee.
⋮----
func (_AllocationManagerView *AllocationManagerViewFilterer) WatchStrategyRemovedFromOperatorSet(opts *bind.WatchOpts, sink chan<- *AllocationManagerViewStrategyRemovedFromOperatorSet) (event.Subscription, error)
⋮----
// ParseStrategyRemovedFromOperatorSet is a log parse operation binding the contract event 0x7b4b073d80dcac55a11177d8459ad9f664ceeb91f71f27167bb14f8152a7eeee.
⋮----
func (_AllocationManagerView *AllocationManagerViewFilterer) ParseStrategyRemovedFromOperatorSet(log types.Log) (*AllocationManagerViewStrategyRemovedFromOperatorSet, error)
````

## File: pkg/bindings/AVSDirectory/binding.go
````go
// Code generated - DO NOT EDIT.
// This file is a generated binding and any manual changes will be lost.
⋮----
package AVSDirectory
⋮----
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"
)
⋮----
"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
)
⋮----
// ISignatureUtilsMixinTypesSignatureWithSaltAndExpiry is an auto generated low-level Go binding around an user-defined struct.
type ISignatureUtilsMixinTypesSignatureWithSaltAndExpiry struct {
	Signature []byte
	Salt      [32]byte
	Expiry    *big.Int
}
⋮----
// 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: "0x60e060405234801561000f575f5ffd5b5060405161185938038061185983398101604081905261002e916101b3565b808084846001600160a01b038116610059576040516339b190bb60e11b815260040160405180910390fd5b6001600160a01b039081166080521660a0526100748161008a565b60c0525061008290506100d0565b5050506102e4565b5f5f829050601f815111156100bd578260405163305a27a960e01b81526004016100b49190610289565b60405180910390fd5b80516100c8826102be565b179392505050565b5f54610100900460ff16156101375760405162461bcd60e51b815260206004820152602760248201527f496e697469616c697a61626c653a20636f6e747261637420697320696e697469604482015266616c697a696e6760c81b60648201526084016100b4565b5f5460ff90811614610186575f805460ff191660ff9081179091556040519081527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b565b6001600160a01b038116811461019c575f5ffd5b50565b634e487b7160e01b5f52604160045260245ffd5b5f5f5f606084860312156101c5575f5ffd5b83516101d081610188565b60208501519093506101e181610188565b60408501519092506001600160401b038111156101fc575f5ffd5b8401601f8101861361020c575f5ffd5b80516001600160401b038111156102255761022561019f565b604051601f8201601f19908116603f011681016001600160401b03811182821017156102535761025361019f565b60405281815282820160200188101561026a575f5ffd5b8160208401602083015e5f602083830101528093505050509250925092565b602081525f82518060208401528060208501604085015e5f604082850101526040601f19601f83011684010191505092915050565b805160208083015191908110156102de575f198160200360031b1b821691505b50919050565b60805160a05160c05161152f61032a5f395f81816104240152610d4d01525f8181610360015261053901525f818161023c01528181610ac90152610dbc015261152f5ff3fe608060405234801561000f575f5ffd5b5060043610610148575f3560e01c8063a1060c88116100bf578063dce974b911610079578063dce974b914610334578063df5cf7231461035b578063ec76f44214610382578063f2fde38b146103b5578063f698da25146103c8578063fabc1cbc146103d0575f5ffd5b8063a1060c881461029a578063a364f4da146102ad578063a98fb355146102c0578063c825fe68146102d3578063cd6dc687146102fa578063d79aceab1461030d575f5ffd5b80635ac86ab7116101105780635ac86ab7146101fa5780635c975abb1461021d578063715018a61461022f578063886f1195146102375780638da5cb5b146102765780639926ee7d14610287575f5ffd5b8063136439dd1461014c578063374823b51461016157806349075da3146101a357806354fd4d50146101dd578063595c6a67146101f2575b5f5ffd5b61015f61015a3660046110dc565b6103e3565b005b61018e61016f366004611107565b609960209081525f928352604080842090915290825290205460ff1681565b60405190151581526020015b60405180910390f35b6101d06101b1366004611131565b609860209081525f928352604080842090915290825290205460ff1681565b60405161019a919061117c565b6101e561041d565b60405161019a91906111d0565b61015f61044d565b61018e6102083660046111e9565b606654600160ff9092169190911b9081161490565b6066545b60405190815260200161019a565b61015f610461565b61025e7f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b03909116815260200161019a565b6033546001600160a01b031661025e565b61015f610295366004611277565b610472565b6102216102a8366004611364565b610673565b61015f6102bb3660046113a7565b6106f2565b61015f6102ce3660046113c2565b6107b9565b6102217f809c5ac049c45b7a7f050a20f00c16cf63797efbf8b1eb8d749fdfa39ff8f92981565b61015f610308366004611107565b610800565b6102217fda2c89bafdd34776a2b8bb9c83c82f419e20cc8c67207f70edd58249b92661bd81565b6102217f4ee65f64218c67b68da66fd0db16560040a6b973290b9e71912d661ee53fe49581565b61025e7f000000000000000000000000000000000000000000000000000000000000000081565b61015f6103903660046110dc565b335f90815260996020908152604080832093835292905220805460ff19166001179055565b61015f6103c33660046113a7565b61091c565b610221610995565b61015f6103de3660046110dc565b610a4e565b6103eb610ab4565b60665481811681146104105760405163c61dca5d60e01b815260040160405180910390fd5b61041982610b57565b5050565b60606104487f0000000000000000000000000000000000000000000000000000000000000000610b94565b905090565b610455610ab4565b61045f5f19610b57565b565b610469610bd1565b61045f5f610c2b565b5f61047c81610c7c565b6001335f9081526098602090815260408083206001600160a01b038816845290915290205460ff1660018111156104b5576104b5611168565b036104d357604051631aa528bb60e11b815260040160405180910390fd5b6001600160a01b0383165f90815260996020908152604080832085830151845290915290205460ff161561051a57604051630d4c4c9160e21b815260040160405180910390fd5b6040516336b87bd760e11b81526001600160a01b0384811660048301527f00000000000000000000000000000000000000000000000000000000000000001690636d70f7ae90602401602060405180830381865afa15801561057e573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906105a29190611430565b6105bf57604051639f88c8af60e01b815260040160405180910390fd5b6105e3836105d7853386602001518760400151610673565b84516040860151610ca7565b6001600160a01b0383165f81815260996020908152604080832086830151845282528083208054600160ff19918216811790925533808652609885528386208787529094529382902080549094168117909355519092917ff0952b1c65271d819d39983d2abb044b9cace59bcc4d4dd389f586ebdcb15b4191610666919061117c565b60405180910390a3505050565b604080517fda2c89bafdd34776a2b8bb9c83c82f419e20cc8c67207f70edd58249b92661bd60208201526001600160a01b038087169282019290925290841660608201526080810183905260a081018290525f906106e99060c00160405160208183030381529060405280519060200120610cff565b95945050505050565b5f6106fc81610c7c565b6001335f9081526098602090815260408083206001600160a01b038716845290915290205460ff16600181111561073557610735611168565b14610753576040516352df45c960e01b815260040160405180910390fd5b335f8181526098602090815260408083206001600160a01b0387168085529252808320805460ff191690555190917ff0952b1c65271d819d39983d2abb044b9cace59bcc4d4dd389f586ebdcb15b41916107ad919061117c565b60405180910390a35050565b336001600160a01b03167fa89c1dc243d8908a96dd84944bcc97d6bc6ac00dd78e20621576be6a3c94371383836040516107f492919061144f565b60405180910390a25050565b5f54610100900460ff161580801561081e57505f54600160ff909116105b806108375750303b15801561083757505f5460ff166001145b61089f5760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b60648201526084015b60405180910390fd5b5f805460ff1916600117905580156108c0575f805461ff0019166101001790555b6108c982610b57565b6108d283610c2b565b8015610917575f805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b505050565b610924610bd1565b6001600160a01b0381166109895760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610896565b61099281610c2b565b50565b60408051808201909152600a81526922b4b3b2b72630bcb2b960b11b6020909101525f7f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f7f71b625cfad44bac63b13dba07f2e1d6084ee04b6f8752101ece6126d584ee6ea610a02610d45565b805160209182012060408051928301949094529281019190915260608101919091524660808201523060a082015260c00160405160208183030381529060405280519060200120905090565b610a56610dba565b60665480198219811614610a7d5760405163c61dca5d60e01b815260040160405180910390fd5b606682905560405182815233907f3582d1828e26bf56bd801502bc021ac0bc8afb57c826e4986b45593c8fad389c906020016107f4565b60405163237dfb4760e11b81523360048201527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906346fbf68e90602401602060405180830381865afa158015610b16573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610b3a9190611430565b61045f57604051631d77d47760e21b815260040160405180910390fd5b606681905560405181815233907fab40a374bc51de372200a8bc981af8c9ecdc08dfdaef0bb6e09f88f3c616ef3d9060200160405180910390a250565b60605f610ba083610e6b565b6040805160208082528183019092529192505f91906020820181803683375050509182525060208101929092525090565b6033546001600160a01b0316331461045f5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610896565b603380546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a35050565b606654600160ff83161b908116036109925760405163840a48d560e01b815260040160405180910390fd5b42811015610cc857604051630819bdcd60e01b815260040160405180910390fd5b610cdc6001600160a01b0385168484610e98565b610cf957604051638baa579f60e01b815260040160405180910390fd5b50505050565b5f610d08610995565b60405161190160f01b6020820152602281019190915260428101839052606201604051602081830303815290604052805190602001209050919050565b60605f610d717f0000000000000000000000000000000000000000000000000000000000000000610b94565b9050805f81518110610d8557610d8561147d565b016020908101516040516001600160f81b03199091169181019190915260210160405160208183030381529060405291505090565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663eab66d7a6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610e16573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610e3a9190611491565b6001600160a01b0316336001600160a01b03161461045f5760405163794821ff60e01b815260040160405180910390fd5b5f60ff8216601f811115610e9257604051632cd44ac360e21b815260040160405180910390fd5b92915050565b5f5f5f610ea58585610ef6565b90925090505f816004811115610ebd57610ebd611168565b148015610edb5750856001600160a01b0316826001600160a01b0316145b80610eec5750610eec868686610f38565b9695505050505050565b5f5f8251604103610f2a576020830151604084015160608501515f1a610f1e8782858561101f565b94509450505050610f31565b505f905060025b9250929050565b5f5f5f856001600160a01b0316631626ba7e60e01b8686604051602401610f609291906114ac565b60408051601f198184030181529181526020820180516001600160e01b03166001600160e01b0319909416939093179092529051610f9e91906114cc565b5f60405180830381855afa9150503d805f8114610fd6576040519150601f19603f3d011682016040523d82523d5f602084013e610fdb565b606091505b5091509150818015610fef57506020815110155b8015610eec57508051630b135d3f60e11b9061101490830160209081019084016114e2565b149695505050505050565b5f807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a083111561105457505f905060036110d3565b604080515f8082526020820180845289905260ff881692820192909252606081018690526080810185905260019060a0016020604051602081039080840390855afa1580156110a5573d5f5f3e3d5ffd5b5050604051601f1901519150506001600160a01b0381166110cd575f600192509250506110d3565b91505f90505b94509492505050565b5f602082840312156110ec575f5ffd5b5035919050565b6001600160a01b0381168114610992575f5ffd5b5f5f60408385031215611118575f5ffd5b8235611123816110f3565b946020939093013593505050565b5f5f60408385031215611142575f5ffd5b823561114d816110f3565b9150602083013561115d816110f3565b809150509250929050565b634e487b7160e01b5f52602160045260245ffd5b602081016002831061119c57634e487b7160e01b5f52602160045260245ffd5b91905290565b5f81518084528060208401602086015e5f602082860101526020601f19601f83011685010191505092915050565b602081525f6111e260208301846111a2565b9392505050565b5f602082840312156111f9575f5ffd5b813560ff811681146111e2575f5ffd5b634e487b7160e01b5f52604160045260245ffd5b6040516060810167ffffffffffffffff8111828210171561124057611240611209565b60405290565b604051601f8201601f1916810167ffffffffffffffff8111828210171561126f5761126f611209565b604052919050565b5f5f60408385031215611288575f5ffd5b8235611293816110f3565b9150602083013567ffffffffffffffff8111156112ae575f5ffd5b8301606081860312156112bf575f5ffd5b6112c761121d565b813567ffffffffffffffff8111156112dd575f5ffd5b8201601f810187136112ed575f5ffd5b803567ffffffffffffffff81111561130757611307611209565b61131a601f8201601f1916602001611246565b81815288602083850101111561132e575f5ffd5b816020840160208301375f6020928201830152835283810135908301525060409182013591810191909152919491935090915050565b5f5f5f5f60808587031215611377575f5ffd5b8435611382816110f3565b93506020850135611392816110f3565b93969395505050506040820135916060013590565b5f602082840312156113b7575f5ffd5b81356111e2816110f3565b5f5f602083850312156113d3575f5ffd5b823567ffffffffffffffff8111156113e9575f5ffd5b8301601f810185136113f9575f5ffd5b803567ffffffffffffffff81111561140f575f5ffd5b856020828401011115611420575f5ffd5b6020919091019590945092505050565b5f60208284031215611440575f5ffd5b815180151581146111e2575f5ffd5b60208152816020820152818360408301375f818301604090810191909152601f909201601f19160101919050565b634e487b7160e01b5f52603260045260245ffd5b5f602082840312156114a1575f5ffd5b81516111e2816110f3565b828152604060208201525f6114c460408301846111a2565b949350505050565b5f82518060208501845e5f920191825250919050565b5f602082840312156114f2575f5ffd5b505191905056fea26469706673582212204c1e718020b5e4a38dda4e5d9c0f923e3401c11a90171f2535812f908ee1627164736f6c634300081e0033",
}
⋮----
// AVSDirectoryABI is the input ABI used to generate the binding from.
// Deprecated: Use AVSDirectoryMetaData.ABI instead.
var AVSDirectoryABI = AVSDirectoryMetaData.ABI
⋮----
// AVSDirectoryBin is the compiled bytecode used for deploying new contracts.
// Deprecated: Use AVSDirectoryMetaData.Bin instead.
var AVSDirectoryBin = AVSDirectoryMetaData.Bin
⋮----
// DeployAVSDirectory deploys a new Ethereum contract, binding an instance of AVSDirectory to it.
func DeployAVSDirectory(auth *bind.TransactOpts, backend bind.ContractBackend, _delegation common.Address, _pauserRegistry common.Address, _version string) (common.Address, *types.Transaction, *AVSDirectory, error)
⋮----
// AVSDirectory is an auto generated Go binding around an Ethereum contract.
type AVSDirectory struct {
	AVSDirectoryCaller     // Read-only binding to the contract
	AVSDirectoryTransactor // Write-only binding to the contract
	AVSDirectoryFilterer   // Log filterer for contract events
}
⋮----
AVSDirectoryCaller     // Read-only binding to the contract
AVSDirectoryTransactor // Write-only binding to the contract
AVSDirectoryFilterer   // Log filterer for contract events
⋮----
// AVSDirectoryCaller is an auto generated read-only Go binding around an Ethereum contract.
type AVSDirectoryCaller struct {
	contract *bind.BoundContract // Generic contract wrapper for the low level calls
}
⋮----
contract *bind.BoundContract // Generic contract wrapper for the low level calls
⋮----
// AVSDirectoryTransactor is an auto generated write-only Go binding around an Ethereum contract.
type AVSDirectoryTransactor struct {
	contract *bind.BoundContract // Generic contract wrapper for the low level calls
}
⋮----
// AVSDirectoryFilterer is an auto generated log filtering Go binding around an Ethereum contract events.
type AVSDirectoryFilterer struct {
	contract *bind.BoundContract // Generic contract wrapper for the low level calls
}
⋮----
// AVSDirectorySession is an auto generated Go binding around an Ethereum contract,
// with pre-set call and transact options.
type AVSDirectorySession struct {
	Contract     *AVSDirectory     // 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
}
⋮----
Contract     *AVSDirectory     // 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
⋮----
// AVSDirectoryCallerSession is an auto generated read-only Go binding around an Ethereum contract,
// with pre-set call options.
type AVSDirectoryCallerSession struct {
	Contract *AVSDirectoryCaller // Generic contract caller binding to set the session for
	CallOpts bind.CallOpts       // Call options to use throughout this session
}
⋮----
Contract *AVSDirectoryCaller // Generic contract caller binding to set the session for
CallOpts bind.CallOpts       // Call options to use throughout this session
⋮----
// AVSDirectoryTransactorSession is an auto generated write-only Go binding around an Ethereum contract,
// with pre-set transact options.
type AVSDirectoryTransactorSession struct {
	Contract     *AVSDirectoryTransactor // Generic contract transactor binding to set the session for
	TransactOpts bind.TransactOpts       // Transaction auth options to use throughout this session
}
⋮----
Contract     *AVSDirectoryTransactor // Generic contract transactor binding to set the session for
TransactOpts bind.TransactOpts       // Transaction auth options to use throughout this session
⋮----
// AVSDirectoryRaw is an auto generated low-level Go binding around an Ethereum contract.
type AVSDirectoryRaw struct {
	Contract *AVSDirectory // Generic contract binding to access the raw methods on
}
⋮----
Contract *AVSDirectory // Generic contract binding to access the raw methods on
⋮----
// AVSDirectoryCallerRaw is an auto generated low-level read-only Go binding around an Ethereum contract.
type AVSDirectoryCallerRaw struct {
	Contract *AVSDirectoryCaller // Generic read-only contract binding to access the raw methods on
}
⋮----
Contract *AVSDirectoryCaller // Generic read-only contract binding to access the raw methods on
⋮----
// AVSDirectoryTransactorRaw is an auto generated low-level write-only Go binding around an Ethereum contract.
type AVSDirectoryTransactorRaw struct {
	Contract *AVSDirectoryTransactor // Generic write-only contract binding to access the raw methods on
}
⋮----
Contract *AVSDirectoryTransactor // Generic write-only contract binding to access the raw methods on
⋮----
// NewAVSDirectory creates a new instance of AVSDirectory, bound to a specific deployed contract.
func NewAVSDirectory(address common.Address, backend bind.ContractBackend) (*AVSDirectory, error)
⋮----
// NewAVSDirectoryCaller creates a new read-only instance of AVSDirectory, bound to a specific deployed contract.
func NewAVSDirectoryCaller(address common.Address, caller bind.ContractCaller) (*AVSDirectoryCaller, error)
⋮----
// NewAVSDirectoryTransactor creates a new write-only instance of AVSDirectory, bound to a specific deployed contract.
func NewAVSDirectoryTransactor(address common.Address, transactor bind.ContractTransactor) (*AVSDirectoryTransactor, error)
⋮----
// NewAVSDirectoryFilterer creates a new log filterer instance of AVSDirectory, bound to a specific deployed contract.
func NewAVSDirectoryFilterer(address common.Address, filterer bind.ContractFilterer) (*AVSDirectoryFilterer, error)
⋮----
// bindAVSDirectory binds a generic wrapper to an already deployed contract.
func bindAVSDirectory(address common.Address, caller bind.ContractCaller, transactor bind.ContractTransactor, filterer bind.ContractFilterer) (*bind.BoundContract, error)
⋮----
// 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 (_AVSDirectory *AVSDirectoryRaw) Call(opts *bind.CallOpts, result *[]interface
⋮----
// Transfer initiates a plain transaction to move funds to the contract, calling
// its default method if one is available.
func (_AVSDirectory *AVSDirectoryRaw) Transfer(opts *bind.TransactOpts) (*types.Transaction, error)
⋮----
// Transact invokes the (paid) contract method with params as input values.
func (_AVSDirectory *AVSDirectoryRaw) Transact(opts *bind.TransactOpts, method string, params ...interface
⋮----
// OPERATORAVSREGISTRATIONTYPEHASH is a free data retrieval call binding the contract method 0xd79aceab.
//
// Solidity: function OPERATOR_AVS_REGISTRATION_TYPEHASH() view returns(bytes32)
func (_AVSDirectory *AVSDirectoryCaller) OPERATORAVSREGISTRATIONTYPEHASH(opts *bind.CallOpts) ([32]byte, error)
⋮----
var out []interface{}
⋮----
// OPERATORSETFORCEDEREGISTRATIONTYPEHASH is a free data retrieval call binding the contract method 0xdce974b9.
⋮----
// Solidity: function OPERATOR_SET_FORCE_DEREGISTRATION_TYPEHASH() view returns(bytes32)
func (_AVSDirectory *AVSDirectoryCaller) OPERATORSETFORCEDEREGISTRATIONTYPEHASH(opts *bind.CallOpts) ([32]byte, error)
⋮----
// OPERATORSETREGISTRATIONTYPEHASH is a free data retrieval call binding the contract method 0xc825fe68.
⋮----
// Solidity: function OPERATOR_SET_REGISTRATION_TYPEHASH() view returns(bytes32)
func (_AVSDirectory *AVSDirectoryCaller) OPERATORSETREGISTRATIONTYPEHASH(opts *bind.CallOpts) ([32]byte, error)
⋮----
// AvsOperatorStatus is a free data retrieval call binding the contract method 0x49075da3.
⋮----
// Solidity: function avsOperatorStatus(address avs, address operator) view returns(uint8)
func (_AVSDirectory *AVSDirectoryCaller) AvsOperatorStatus(opts *bind.CallOpts, avs common.Address, operator common.Address) (uint8, error)
⋮----
// CalculateOperatorAVSRegistrationDigestHash is a free data retrieval call binding the contract method 0xa1060c88.
⋮----
// Solidity: function calculateOperatorAVSRegistrationDigestHash(address operator, address avs, bytes32 salt, uint256 expiry) view returns(bytes32)
func (_AVSDirectory *AVSDirectoryCaller) CalculateOperatorAVSRegistrationDigestHash(opts *bind.CallOpts, operator common.Address, avs common.Address, salt [32]byte, expiry *big.Int) ([32]byte, error)
⋮----
// Delegation is a free data retrieval call binding the contract method 0xdf5cf723.
⋮----
// Solidity: function delegation() view returns(address)
func (_AVSDirectory *AVSDirectoryCaller) Delegation(opts *bind.CallOpts) (common.Address, error)
⋮----
// DomainSeparator is a free data retrieval call binding the contract method 0xf698da25.
⋮----
// Solidity: function domainSeparator() view returns(bytes32)
func (_AVSDirectory *AVSDirectoryCaller) DomainSeparator(opts *bind.CallOpts) ([32]byte, error)
⋮----
// OperatorSaltIsSpent is a free data retrieval call binding the contract method 0x374823b5.
⋮----
// Solidity: function operatorSaltIsSpent(address operator, bytes32 salt) view returns(bool isSpent)
func (_AVSDirectory *AVSDirectoryCaller) OperatorSaltIsSpent(opts *bind.CallOpts, operator common.Address, salt [32]byte) (bool, error)
⋮----
// Owner is a free data retrieval call binding the contract method 0x8da5cb5b.
⋮----
// Solidity: function owner() view returns(address)
func (_AVSDirectory *AVSDirectoryCaller) Owner(opts *bind.CallOpts) (common.Address, error)
⋮----
// Paused is a free data retrieval call binding the contract method 0x5ac86ab7.
⋮----
// Solidity: function paused(uint8 index) view returns(bool)
func (_AVSDirectory *AVSDirectoryCaller) Paused(opts *bind.CallOpts, index uint8) (bool, error)
⋮----
// Paused0 is a free data retrieval call binding the contract method 0x5c975abb.
⋮----
// Solidity: function paused() view returns(uint256)
func (_AVSDirectory *AVSDirectoryCaller) Paused0(opts *bind.CallOpts) (*big.Int, error)
⋮----
// PauserRegistry is a free data retrieval call binding the contract method 0x886f1195.
⋮----
// Solidity: function pauserRegistry() view returns(address)
func (_AVSDirectory *AVSDirectoryCaller) PauserRegistry(opts *bind.CallOpts) (common.Address, error)
⋮----
// Version is a free data retrieval call binding the contract method 0x54fd4d50.
⋮----
// Solidity: function version() view returns(string)
func (_AVSDirectory *AVSDirectoryCaller) Version(opts *bind.CallOpts) (string, error)
⋮----
// CancelSalt is a paid mutator transaction binding the contract method 0xec76f442.
⋮----
// Solidity: function cancelSalt(bytes32 salt) returns()
func (_AVSDirectory *AVSDirectoryTransactor) CancelSalt(opts *bind.TransactOpts, salt [32]byte) (*types.Transaction, error)
⋮----
// DeregisterOperatorFromAVS is a paid mutator transaction binding the contract method 0xa364f4da.
⋮----
// Solidity: function deregisterOperatorFromAVS(address operator) returns()
func (_AVSDirectory *AVSDirectoryTransactor) DeregisterOperatorFromAVS(opts *bind.TransactOpts, operator common.Address) (*types.Transaction, error)
⋮----
// Initialize is a paid mutator transaction binding the contract method 0xcd6dc687.
⋮----
// Solidity: function initialize(address initialOwner, uint256 initialPausedStatus) returns()
func (_AVSDirectory *AVSDirectoryTransactor) Initialize(opts *bind.TransactOpts, initialOwner common.Address, initialPausedStatus *big.Int) (*types.Transaction, error)
⋮----
// Pause is a paid mutator transaction binding the contract method 0x136439dd.
⋮----
// Solidity: function pause(uint256 newPausedStatus) returns()
func (_AVSDirectory *AVSDirectoryTransactor) Pause(opts *bind.TransactOpts, newPausedStatus *big.Int) (*types.Transaction, error)
⋮----
// PauseAll is a paid mutator transaction binding the contract method 0x595c6a67.
⋮----
// Solidity: function pauseAll() returns()
func (_AVSDirectory *AVSDirectoryTransactor) PauseAll(opts *bind.TransactOpts) (*types.Transaction, error)
⋮----
// RegisterOperatorToAVS is a paid mutator transaction binding the contract method 0x9926ee7d.
⋮----
// Solidity: function registerOperatorToAVS(address operator, (bytes,bytes32,uint256) operatorSignature) returns()
func (_AVSDirectory *AVSDirectoryTransactor) RegisterOperatorToAVS(opts *bind.TransactOpts, operator common.Address, operatorSignature ISignatureUtilsMixinTypesSignatureWithSaltAndExpiry) (*types.Transaction, error)
⋮----
// RenounceOwnership is a paid mutator transaction binding the contract method 0x715018a6.
⋮----
// Solidity: function renounceOwnership() returns()
func (_AVSDirectory *AVSDirectoryTransactor) RenounceOwnership(opts *bind.TransactOpts) (*types.Transaction, error)
⋮----
// TransferOwnership is a paid mutator transaction binding the contract method 0xf2fde38b.
⋮----
// Solidity: function transferOwnership(address newOwner) returns()
func (_AVSDirectory *AVSDirectoryTransactor) TransferOwnership(opts *bind.TransactOpts, newOwner common.Address) (*types.Transaction, error)
⋮----
// Unpause is a paid mutator transaction binding the contract method 0xfabc1cbc.
⋮----
// Solidity: function unpause(uint256 newPausedStatus) returns()
func (_AVSDirectory *AVSDirectoryTransactor) Unpause(opts *bind.TransactOpts, newPausedStatus *big.Int) (*types.Transaction, error)
⋮----
// UpdateAVSMetadataURI is a paid mutator transaction binding the contract method 0xa98fb355.
⋮----
// Solidity: function updateAVSMetadataURI(string metadataURI) returns()
func (_AVSDirectory *AVSDirectoryTransactor) UpdateAVSMetadataURI(opts *bind.TransactOpts, metadataURI string) (*types.Transaction, error)
⋮----
// AVSDirectoryAVSMetadataURIUpdatedIterator is returned from FilterAVSMetadataURIUpdated and is used to iterate over the raw logs and unpacked data for AVSMetadataURIUpdated events raised by the AVSDirectory contract.
type AVSDirectoryAVSMetadataURIUpdatedIterator struct {
	Event *AVSDirectoryAVSMetadataURIUpdated // 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
}
⋮----
Event *AVSDirectoryAVSMetadataURIUpdated // 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 *AVSDirectoryAVSMetadataURIUpdatedIterator) Next() bool
⋮----
// If the iterator failed, stop iterating
⋮----
// If the iterator completed, deliver directly whatever's available
⋮----
// Iterator still in progress, wait for either a data or an error event
⋮----
// Error returns any retrieval or parsing error occurred during filtering.
func (it *AVSDirectoryAVSMetadataURIUpdatedIterator) Error() error
⋮----
// Close terminates the iteration process, releasing any pending underlying
// resources.
func (it *AVSDirectoryAVSMetadataURIUpdatedIterator) Close() error
⋮----
// AVSDirectoryAVSMetadataURIUpdated represents a AVSMetadataURIUpdated event raised by the AVSDirectory contract.
type AVSDirectoryAVSMetadataURIUpdated struct {
	Avs         common.Address
	MetadataURI string
	Raw         types.Log // Blockchain specific contextual infos
}
⋮----
Raw         types.Log // Blockchain specific contextual infos
⋮----
// FilterAVSMetadataURIUpdated is a free log retrieval operation binding the contract event 0xa89c1dc243d8908a96dd84944bcc97d6bc6ac00dd78e20621576be6a3c943713.
⋮----
// Solidity: event AVSMetadataURIUpdated(address indexed avs, string metadataURI)
func (_AVSDirectory *AVSDirectoryFilterer) FilterAVSMetadataURIUpdated(opts *bind.FilterOpts, avs []common.Address) (*AVSDirectoryAVSMetadataURIUpdatedIterator, error)
⋮----
var avsRule []interface{}
⋮----
// WatchAVSMetadataURIUpdated is a free log subscription operation binding the contract event 0xa89c1dc243d8908a96dd84944bcc97d6bc6ac00dd78e20621576be6a3c943713.
⋮----
func (_AVSDirectory *AVSDirectoryFilterer) WatchAVSMetadataURIUpdated(opts *bind.WatchOpts, sink chan<- *AVSDirectoryAVSMetadataURIUpdated, avs []common.Address) (event.Subscription, error)
⋮----
// New log arrived, parse the event and forward to the user
⋮----
// ParseAVSMetadataURIUpdated is a log parse operation binding the contract event 0xa89c1dc243d8908a96dd84944bcc97d6bc6ac00dd78e20621576be6a3c943713.
⋮----
func (_AVSDirectory *AVSDirectoryFilterer) ParseAVSMetadataURIUpdated(log types.Log) (*AVSDirectoryAVSMetadataURIUpdated, error)
⋮----
// AVSDirectoryInitializedIterator is returned from FilterInitialized and is used to iterate over the raw logs and unpacked data for Initialized events raised by the AVSDirectory contract.
type AVSDirectoryInitializedIterator struct {
	Event *AVSDirectoryInitialized // Event containing the contract specifics and raw log

	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
}
⋮----
Event *AVSDirectoryInitialized // Event containing the contract specifics and raw log
⋮----
// AVSDirectoryInitialized represents a Initialized event raised by the AVSDirectory contract.
type AVSDirectoryInitialized struct {
	Version uint8
	Raw     types.Log // Blockchain specific contextual infos
}
⋮----
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 (_AVSDirectory *AVSDirectoryFilterer) FilterInitialized(opts *bind.FilterOpts) (*AVSDirectoryInitializedIterator, error)
⋮----
// WatchInitialized is a free log subscription operation binding the contract event 0x7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb3847402498.
⋮----
func (_AVSDirectory *AVSDirectoryFilterer) WatchInitialized(opts *bind.WatchOpts, sink chan<- *AVSDirectoryInitialized) (event.Subscription, error)
⋮----
// ParseInitialized is a log parse operation binding the contract event 0x7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb3847402498.
⋮----
func (_AVSDirectory *AVSDirectoryFilterer) ParseInitialized(log types.Log) (*AVSDirectoryInitialized, error)
⋮----
// AVSDirectoryOperatorAVSRegistrationStatusUpdatedIterator is returned from FilterOperatorAVSRegistrationStatusUpdated and is used to iterate over the raw logs and unpacked data for OperatorAVSRegistrationStatusUpdated events raised by the AVSDirectory contract.
type AVSDirectoryOperatorAVSRegistrationStatusUpdatedIterator struct {
	Event *AVSDirectoryOperatorAVSRegistrationStatusUpdated // 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
}
⋮----
Event *AVSDirectoryOperatorAVSRegistrationStatusUpdated // Event containing the contract specifics and raw log
⋮----
// AVSDirectoryOperatorAVSRegistrationStatusUpdated represents a OperatorAVSRegistrationStatusUpdated event raised by the AVSDirectory contract.
type AVSDirectoryOperatorAVSRegistrationStatusUpdated struct {
	Operator common.Address
	Avs      common.Address
	Status   uint8
	Raw      types.Log // Blockchain specific contextual infos
}
⋮----
Raw      types.Log // Blockchain specific contextual infos
⋮----
// FilterOperatorAVSRegistrationStatusUpdated is a free log retrieval operation binding the contract event 0xf0952b1c65271d819d39983d2abb044b9cace59bcc4d4dd389f586ebdcb15b41.
⋮----
// Solidity: event OperatorAVSRegistrationStatusUpdated(address indexed operator, address indexed avs, uint8 status)
func (_AVSDirectory *AVSDirectoryFilterer) FilterOperatorAVSRegistrationStatusUpdated(opts *bind.FilterOpts, operator []common.Address, avs []common.Address) (*AVSDirectoryOperatorAVSRegistrationStatusUpdatedIterator, error)
⋮----
var operatorRule []interface{}
⋮----
// WatchOperatorAVSRegistrationStatusUpdated is a free log subscription operation binding the contract event 0xf0952b1c65271d819d39983d2abb044b9cace59bcc4d4dd389f586ebdcb15b41.
⋮----
func (_AVSDirectory *AVSDirectoryFilterer) WatchOperatorAVSRegistrationStatusUpdated(opts *bind.WatchOpts, sink chan<- *AVSDirectoryOperatorAVSRegistrationStatusUpdated, operator []common.Address, avs []common.Address) (event.Subscription, error)
⋮----
// ParseOperatorAVSRegistrationStatusUpdated is a log parse operation binding the contract event 0xf0952b1c65271d819d39983d2abb044b9cace59bcc4d4dd389f586ebdcb15b41.
⋮----
func (_AVSDirectory *AVSDirectoryFilterer) ParseOperatorAVSRegistrationStatusUpdated(log types.Log) (*AVSDirectoryOperatorAVSRegistrationStatusUpdated, error)
⋮----
// AVSDirectoryOwnershipTransferredIterator is returned from FilterOwnershipTransferred and is used to iterate over the raw logs and unpacked data for OwnershipTransferred events raised by the AVSDirectory contract.
type AVSDirectoryOwnershipTransferredIterator struct {
	Event *AVSDirectoryOwnershipTransferred // Event containing the contract specifics and raw log

	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
}
⋮----
Event *AVSDirectoryOwnershipTransferred // Event containing the contract specifics and raw log
⋮----
// AVSDirectoryOwnershipTransferred represents a OwnershipTransferred event raised by the AVSDirectory contract.
type AVSDirectoryOwnershipTransferred struct {
	PreviousOwner common.Address
	NewOwner      common.Address
	Raw           types.Log // Blockchain specific contextual infos
}
⋮----
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 (_AVSDirectory *AVSDirectoryFilterer) FilterOwnershipTransferred(opts *bind.FilterOpts, previousOwner []common.Address, newOwner []common.Address) (*AVSDirectoryOwnershipTransferredIterator, error)
⋮----
var previousOwnerRule []interface{}
⋮----
var newOwnerRule []interface{}
⋮----
// WatchOwnershipTransferred is a free log subscription operation binding the contract event 0x8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0.
⋮----
func (_AVSDirectory *AVSDirectoryFilterer) WatchOwnershipTransferred(opts *bind.WatchOpts, sink chan<- *AVSDirectoryOwnershipTransferred, previousOwner []common.Address, newOwner []common.Address) (event.Subscription, error)
⋮----
// ParseOwnershipTransferred is a log parse operation binding the contract event 0x8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0.
⋮----
func (_AVSDirectory *AVSDirectoryFilterer) ParseOwnershipTransferred(log types.Log) (*AVSDirectoryOwnershipTransferred, error)
⋮----
// AVSDirectoryPausedIterator is returned from FilterPaused and is used to iterate over the raw logs and unpacked data for Paused events raised by the AVSDirectory contract.
type AVSDirectoryPausedIterator struct {
	Event *AVSDirectoryPaused // 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
}
⋮----
Event *AVSDirectoryPaused // Event containing the contract specifics and raw log
⋮----
// AVSDirectoryPaused represents a Paused event raised by the AVSDirectory contract.
type AVSDirectoryPaused struct {
	Account         common.Address
	NewPausedStatus *big.Int
	Raw             types.Log // Blockchain specific contextual infos
}
⋮----
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 (_AVSDirectory *AVSDirectoryFilterer) FilterPaused(opts *bind.FilterOpts, account []common.Address) (*AVSDirectoryPausedIterator, error)
⋮----
var accountRule []interface{}
⋮----
// WatchPaused is a free log subscription operation binding the contract event 0xab40a374bc51de372200a8bc981af8c9ecdc08dfdaef0bb6e09f88f3c616ef3d.
⋮----
func (_AVSDirectory *AVSDirectoryFilterer) WatchPaused(opts *bind.WatchOpts, sink chan<- *AVSDirectoryPaused, account []common.Address) (event.Subscription, error)
⋮----
// ParsePaused is a log parse operation binding the contract event 0xab40a374bc51de372200a8bc981af8c9ecdc08dfdaef0bb6e09f88f3c616ef3d.
⋮----
func (_AVSDirectory *AVSDirectoryFilterer) ParsePaused(log types.Log) (*AVSDirectoryPaused, error)
⋮----
// AVSDirectoryUnpausedIterator is returned from FilterUnpaused and is used to iterate over the raw logs and unpacked data for Unpaused events raised by the AVSDirectory contract.
type AVSDirectoryUnpausedIterator struct {
	Event *AVSDirectoryUnpaused // 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
}
⋮----
Event *AVSDirectoryUnpaused // Event containing the contract specifics and raw log
⋮----
// AVSDirectoryUnpaused represents a Unpaused event raised by the AVSDirectory contract.
type AVSDirectoryUnpaused 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 (_AVSDirectory *AVSDirectoryFilterer) FilterUnpaused(opts *bind.FilterOpts, account []common.Address) (*AVSDirectoryUnpausedIterator, error)
⋮----
// WatchUnpaused is a free log subscription operation binding the contract event 0x3582d1828e26bf56bd801502bc021ac0bc8afb57c826e4986b45593c8fad389c.
⋮----
func (_AVSDirectory *AVSDirectoryFilterer) WatchUnpaused(opts *bind.WatchOpts, sink chan<- *AVSDirectoryUnpaused, account []common.Address) (event.Subscription, error)
⋮----
// ParseUnpaused is a log parse operation binding the contract event 0x3582d1828e26bf56bd801502bc021ac0bc8afb57c826e4986b45593c8fad389c.
⋮----
func (_AVSDirectory *AVSDirectoryFilterer) ParseUnpaused(log types.Log) (*AVSDirectoryUnpaused, error)
````

## File: pkg/bindings/AVSDirectoryStorage/binding.go
````go
// Code generated - DO NOT EDIT.
// This file is a generated binding and any manual changes will be lost.
⋮----
package AVSDirectoryStorage
⋮----
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"
)
⋮----
"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
)
⋮----
// ISignatureUtilsMixinTypesSignatureWithSaltAndExpiry is an auto generated low-level Go binding around an user-defined struct.
type ISignatureUtilsMixinTypesSignatureWithSaltAndExpiry struct {
	Signature []byte
	Salt      [32]byte
	Expiry    *big.Int
}
⋮----
// AVSDirectoryStorageMetaData contains all meta data concerning the AVSDirectoryStorage contract.
var AVSDirectoryStorageMetaData = &bind.MetaData{
	ABI: "[{\"type\":\"function\",\"name\":\"OPERATOR_AVS_REGISTRATION_TYPEHASH\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"OPERATOR_SET_FORCE_DEREGISTRATION_TYPEHASH\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"OPERATOR_SET_REGISTRATION_TYPEHASH\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"avsOperatorStatus\",\"inputs\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint8\",\"internalType\":\"enumIAVSDirectoryTypes.OperatorAVSRegistrationStatus\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"calculateOperatorAVSRegistrationDigestHash\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"salt\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"expiry\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"cancelSalt\",\"inputs\":[{\"name\":\"salt\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"delegation\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIDelegationManager\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"deregisterOperatorFromAVS\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"domainSeparator\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"initialize\",\"inputs\":[{\"name\":\"initialOwner\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"initialPausedStatus\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"operatorSaltIsSpent\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"salt\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"isSpent\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"registerOperatorToAVS\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"operatorSignature\",\"type\":\"tuple\",\"internalType\":\"structISignatureUtilsMixinTypes.SignatureWithSaltAndExpiry\",\"components\":[{\"name\":\"signature\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"salt\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"expiry\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"updateAVSMetadataURI\",\"inputs\":[{\"name\":\"metadataURI\",\"type\":\"string\",\"internalType\":\"string\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"event\",\"name\":\"AVSMetadataURIUpdated\",\"inputs\":[{\"name\":\"avs\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"metadataURI\",\"type\":\"string\",\"indexed\":false,\"internalType\":\"string\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"OperatorAVSRegistrationStatusUpdated\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"avs\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"status\",\"type\":\"uint8\",\"indexed\":false,\"internalType\":\"enumIAVSDirectoryTypes.OperatorAVSRegistrationStatus\"}],\"anonymous\":false},{\"type\":\"error\",\"name\":\"InvalidSignature\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"OperatorAlreadyRegisteredToAVS\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"OperatorNotRegisteredToAVS\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"OperatorNotRegisteredToEigenLayer\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"SaltSpent\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"SignatureExpired\",\"inputs\":[]}]",
}
⋮----
// AVSDirectoryStorageABI is the input ABI used to generate the binding from.
// Deprecated: Use AVSDirectoryStorageMetaData.ABI instead.
var AVSDirectoryStorageABI = AVSDirectoryStorageMetaData.ABI
⋮----
// AVSDirectoryStorage is an auto generated Go binding around an Ethereum contract.
type AVSDirectoryStorage struct {
	AVSDirectoryStorageCaller     // Read-only binding to the contract
	AVSDirectoryStorageTransactor // Write-only binding to the contract
	AVSDirectoryStorageFilterer   // Log filterer for contract events
}
⋮----
AVSDirectoryStorageCaller     // Read-only binding to the contract
AVSDirectoryStorageTransactor // Write-only binding to the contract
AVSDirectoryStorageFilterer   // Log filterer for contract events
⋮----
// AVSDirectoryStorageCaller is an auto generated read-only Go binding around an Ethereum contract.
type AVSDirectoryStorageCaller struct {
	contract *bind.BoundContract // Generic contract wrapper for the low level calls
}
⋮----
contract *bind.BoundContract // Generic contract wrapper for the low level calls
⋮----
// AVSDirectoryStorageTransactor is an auto generated write-only Go binding around an Ethereum contract.
type AVSDirectoryStorageTransactor struct {
	contract *bind.BoundContract // Generic contract wrapper for the low level calls
}
⋮----
// AVSDirectoryStorageFilterer is an auto generated log filtering Go binding around an Ethereum contract events.
type AVSDirectoryStorageFilterer struct {
	contract *bind.BoundContract // Generic contract wrapper for the low level calls
}
⋮----
// AVSDirectoryStorageSession is an auto generated Go binding around an Ethereum contract,
// with pre-set call and transact options.
type AVSDirectoryStorageSession struct {
	Contract     *AVSDirectoryStorage // 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
}
⋮----
Contract     *AVSDirectoryStorage // 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
⋮----
// AVSDirectoryStorageCallerSession is an auto generated read-only Go binding around an Ethereum contract,
// with pre-set call options.
type AVSDirectoryStorageCallerSession struct {
	Contract *AVSDirectoryStorageCaller // Generic contract caller binding to set the session for
	CallOpts bind.CallOpts              // Call options to use throughout this session
}
⋮----
Contract *AVSDirectoryStorageCaller // Generic contract caller binding to set the session for
CallOpts bind.CallOpts              // Call options to use throughout this session
⋮----
// AVSDirectoryStorageTransactorSession is an auto generated write-only Go binding around an Ethereum contract,
// with pre-set transact options.
type AVSDirectoryStorageTransactorSession struct {
	Contract     *AVSDirectoryStorageTransactor // Generic contract transactor binding to set the session for
	TransactOpts bind.TransactOpts              // Transaction auth options to use throughout this session
}
⋮----
Contract     *AVSDirectoryStorageTransactor // Generic contract transactor binding to set the session for
TransactOpts bind.TransactOpts              // Transaction auth options to use throughout this session
⋮----
// AVSDirectoryStorageRaw is an auto generated low-level Go binding around an Ethereum contract.
type AVSDirectoryStorageRaw struct {
	Contract *AVSDirectoryStorage // Generic contract binding to access the raw methods on
}
⋮----
Contract *AVSDirectoryStorage // Generic contract binding to access the raw methods on
⋮----
// AVSDirectoryStorageCallerRaw is an auto generated low-level read-only Go binding around an Ethereum contract.
type AVSDirectoryStorageCallerRaw struct {
	Contract *AVSDirectoryStorageCaller // Generic read-only contract binding to access the raw methods on
}
⋮----
Contract *AVSDirectoryStorageCaller // Generic read-only contract binding to access the raw methods on
⋮----
// AVSDirectoryStorageTransactorRaw is an auto generated low-level write-only Go binding around an Ethereum contract.
type AVSDirectoryStorageTransactorRaw struct {
	Contract *AVSDirectoryStorageTransactor // Generic write-only contract binding to access the raw methods on
}
⋮----
Contract *AVSDirectoryStorageTransactor // Generic write-only contract binding to access the raw methods on
⋮----
// NewAVSDirectoryStorage creates a new instance of AVSDirectoryStorage, bound to a specific deployed contract.
func NewAVSDirectoryStorage(address common.Address, backend bind.ContractBackend) (*AVSDirectoryStorage, error)
⋮----
// NewAVSDirectoryStorageCaller creates a new read-only instance of AVSDirectoryStorage, bound to a specific deployed contract.
func NewAVSDirectoryStorageCaller(address common.Address, caller bind.ContractCaller) (*AVSDirectoryStorageCaller, error)
⋮----
// NewAVSDirectoryStorageTransactor creates a new write-only instance of AVSDirectoryStorage, bound to a specific deployed contract.
func NewAVSDirectoryStorageTransactor(address common.Address, transactor bind.ContractTransactor) (*AVSDirectoryStorageTransactor, error)
⋮----
// NewAVSDirectoryStorageFilterer creates a new log filterer instance of AVSDirectoryStorage, bound to a specific deployed contract.
func NewAVSDirectoryStorageFilterer(address common.Address, filterer bind.ContractFilterer) (*AVSDirectoryStorageFilterer, error)
⋮----
// bindAVSDirectoryStorage binds a generic wrapper to an already deployed contract.
func bindAVSDirectoryStorage(address common.Address, caller bind.ContractCaller, transactor bind.ContractTransactor, filterer bind.ContractFilterer) (*bind.BoundContract, error)
⋮----
// 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 (_AVSDirectoryStorage *AVSDirectoryStorageRaw) Call(opts *bind.CallOpts, result *[]interface
⋮----
// Transfer initiates a plain transaction to move funds to the contract, calling
// its default method if one is available.
func (_AVSDirectoryStorage *AVSDirectoryStorageRaw) Transfer(opts *bind.TransactOpts) (*types.Transaction, error)
⋮----
// Transact invokes the (paid) contract method with params as input values.
func (_AVSDirectoryStorage *AVSDirectoryStorageRaw) Transact(opts *bind.TransactOpts, method string, params ...interface
⋮----
// OPERATORAVSREGISTRATIONTYPEHASH is a free data retrieval call binding the contract method 0xd79aceab.
//
// Solidity: function OPERATOR_AVS_REGISTRATION_TYPEHASH() view returns(bytes32)
func (_AVSDirectoryStorage *AVSDirectoryStorageCaller) OPERATORAVSREGISTRATIONTYPEHASH(opts *bind.CallOpts) ([32]byte, error)
⋮----
var out []interface{}
⋮----
// OPERATORSETFORCEDEREGISTRATIONTYPEHASH is a free data retrieval call binding the contract method 0xdce974b9.
⋮----
// Solidity: function OPERATOR_SET_FORCE_DEREGISTRATION_TYPEHASH() view returns(bytes32)
func (_AVSDirectoryStorage *AVSDirectoryStorageCaller) OPERATORSETFORCEDEREGISTRATIONTYPEHASH(opts *bind.CallOpts) ([32]byte, error)
⋮----
// OPERATORSETREGISTRATIONTYPEHASH is a free data retrieval call binding the contract method 0xc825fe68.
⋮----
// Solidity: function OPERATOR_SET_REGISTRATION_TYPEHASH() view returns(bytes32)
func (_AVSDirectoryStorage *AVSDirectoryStorageCaller) OPERATORSETREGISTRATIONTYPEHASH(opts *bind.CallOpts) ([32]byte, error)
⋮----
// AvsOperatorStatus is a free data retrieval call binding the contract method 0x49075da3.
⋮----
// Solidity: function avsOperatorStatus(address avs, address operator) view returns(uint8)
func (_AVSDirectoryStorage *AVSDirectoryStorageCaller) AvsOperatorStatus(opts *bind.CallOpts, avs common.Address, operator common.Address) (uint8, error)
⋮----
// CalculateOperatorAVSRegistrationDigestHash is a free data retrieval call binding the contract method 0xa1060c88.
⋮----
// Solidity: function calculateOperatorAVSRegistrationDigestHash(address operator, address avs, bytes32 salt, uint256 expiry) view returns(bytes32)
func (_AVSDirectoryStorage *AVSDirectoryStorageCaller) CalculateOperatorAVSRegistrationDigestHash(opts *bind.CallOpts, operator common.Address, avs common.Address, salt [32]byte, expiry *big.Int) ([32]byte, error)
⋮----
// Delegation is a free data retrieval call binding the contract method 0xdf5cf723.
⋮----
// Solidity: function delegation() view returns(address)
func (_AVSDirectoryStorage *AVSDirectoryStorageCaller) Delegation(opts *bind.CallOpts) (common.Address, error)
⋮----
// DomainSeparator is a free data retrieval call binding the contract method 0xf698da25.
⋮----
// Solidity: function domainSeparator() view returns(bytes32)
func (_AVSDirectoryStorage *AVSDirectoryStorageCaller) DomainSeparator(opts *bind.CallOpts) ([32]byte, error)
⋮----
// OperatorSaltIsSpent is a free data retrieval call binding the contract method 0x374823b5.
⋮----
// Solidity: function operatorSaltIsSpent(address operator, bytes32 salt) view returns(bool isSpent)
func (_AVSDirectoryStorage *AVSDirectoryStorageCaller) OperatorSaltIsSpent(opts *bind.CallOpts, operator common.Address, salt [32]byte) (bool, error)
⋮----
// CancelSalt is a paid mutator transaction binding the contract method 0xec76f442.
⋮----
// Solidity: function cancelSalt(bytes32 salt) returns()
func (_AVSDirectoryStorage *AVSDirectoryStorageTransactor) CancelSalt(opts *bind.TransactOpts, salt [32]byte) (*types.Transaction, error)
⋮----
// DeregisterOperatorFromAVS is a paid mutator transaction binding the contract method 0xa364f4da.
⋮----
// Solidity: function deregisterOperatorFromAVS(address operator) returns()
func (_AVSDirectoryStorage *AVSDirectoryStorageTransactor) DeregisterOperatorFromAVS(opts *bind.TransactOpts, operator common.Address) (*types.Transaction, error)
⋮----
// Initialize is a paid mutator transaction binding the contract method 0xcd6dc687.
⋮----
// Solidity: function initialize(address initialOwner, uint256 initialPausedStatus) returns()
func (_AVSDirectoryStorage *AVSDirectoryStorageTransactor) Initialize(opts *bind.TransactOpts, initialOwner common.Address, initialPausedStatus *big.Int) (*types.Transaction, error)
⋮----
// RegisterOperatorToAVS is a paid mutator transaction binding the contract method 0x9926ee7d.
⋮----
// Solidity: function registerOperatorToAVS(address operator, (bytes,bytes32,uint256) operatorSignature) returns()
func (_AVSDirectoryStorage *AVSDirectoryStorageTransactor) RegisterOperatorToAVS(opts *bind.TransactOpts, operator common.Address, operatorSignature ISignatureUtilsMixinTypesSignatureWithSaltAndExpiry) (*types.Transaction, error)
⋮----
// UpdateAVSMetadataURI is a paid mutator transaction binding the contract method 0xa98fb355.
⋮----
// Solidity: function updateAVSMetadataURI(string metadataURI) returns()
func (_AVSDirectoryStorage *AVSDirectoryStorageTransactor) UpdateAVSMetadataURI(opts *bind.TransactOpts, metadataURI string) (*types.Transaction, error)
⋮----
// AVSDirectoryStorageAVSMetadataURIUpdatedIterator is returned from FilterAVSMetadataURIUpdated and is used to iterate over the raw logs and unpacked data for AVSMetadataURIUpdated events raised by the AVSDirectoryStorage contract.
type AVSDirectoryStorageAVSMetadataURIUpdatedIterator struct {
	Event *AVSDirectoryStorageAVSMetadataURIUpdated // 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
}
⋮----
Event *AVSDirectoryStorageAVSMetadataURIUpdated // 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 *AVSDirectoryStorageAVSMetadataURIUpdatedIterator) Next() bool
⋮----
// If the iterator failed, stop iterating
⋮----
// If the iterator completed, deliver directly whatever's available
⋮----
// Iterator still in progress, wait for either a data or an error event
⋮----
// Error returns any retrieval or parsing error occurred during filtering.
func (it *AVSDirectoryStorageAVSMetadataURIUpdatedIterator) Error() error
⋮----
// Close terminates the iteration process, releasing any pending underlying
// resources.
func (it *AVSDirectoryStorageAVSMetadataURIUpdatedIterator) Close() error
⋮----
// AVSDirectoryStorageAVSMetadataURIUpdated represents a AVSMetadataURIUpdated event raised by the AVSDirectoryStorage contract.
type AVSDirectoryStorageAVSMetadataURIUpdated struct {
	Avs         common.Address
	MetadataURI string
	Raw         types.Log // Blockchain specific contextual infos
}
⋮----
Raw         types.Log // Blockchain specific contextual infos
⋮----
// FilterAVSMetadataURIUpdated is a free log retrieval operation binding the contract event 0xa89c1dc243d8908a96dd84944bcc97d6bc6ac00dd78e20621576be6a3c943713.
⋮----
// Solidity: event AVSMetadataURIUpdated(address indexed avs, string metadataURI)
func (_AVSDirectoryStorage *AVSDirectoryStorageFilterer) FilterAVSMetadataURIUpdated(opts *bind.FilterOpts, avs []common.Address) (*AVSDirectoryStorageAVSMetadataURIUpdatedIterator, error)
⋮----
var avsRule []interface{}
⋮----
// WatchAVSMetadataURIUpdated is a free log subscription operation binding the contract event 0xa89c1dc243d8908a96dd84944bcc97d6bc6ac00dd78e20621576be6a3c943713.
⋮----
func (_AVSDirectoryStorage *AVSDirectoryStorageFilterer) WatchAVSMetadataURIUpdated(opts *bind.WatchOpts, sink chan<- *AVSDirectoryStorageAVSMetadataURIUpdated, avs []common.Address) (event.Subscription, error)
⋮----
// New log arrived, parse the event and forward to the user
⋮----
// ParseAVSMetadataURIUpdated is a log parse operation binding the contract event 0xa89c1dc243d8908a96dd84944bcc97d6bc6ac00dd78e20621576be6a3c943713.
⋮----
func (_AVSDirectoryStorage *AVSDirectoryStorageFilterer) ParseAVSMetadataURIUpdated(log types.Log) (*AVSDirectoryStorageAVSMetadataURIUpdated, error)
⋮----
// AVSDirectoryStorageOperatorAVSRegistrationStatusUpdatedIterator is returned from FilterOperatorAVSRegistrationStatusUpdated and is used to iterate over the raw logs and unpacked data for OperatorAVSRegistrationStatusUpdated events raised by the AVSDirectoryStorage contract.
type AVSDirectoryStorageOperatorAVSRegistrationStatusUpdatedIterator struct {
	Event *AVSDirectoryStorageOperatorAVSRegistrationStatusUpdated // Event containing the contract specifics and raw log

	contract *bind.BoundContract // Generic contract to use for unpacking event data
	event    string              // Event name to use for unpacking event data

	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
}
⋮----
Event *AVSDirectoryStorageOperatorAVSRegistrationStatusUpdated // Event containing the contract specifics and raw log
⋮----
// AVSDirectoryStorageOperatorAVSRegistrationStatusUpdated represents a OperatorAVSRegistrationStatusUpdated event raised by the AVSDirectoryStorage contract.
type AVSDirectoryStorageOperatorAVSRegistrationStatusUpdated struct {
	Operator common.Address
	Avs      common.Address
	Status   uint8
	Raw      types.Log // Blockchain specific contextual infos
}
⋮----
Raw      types.Log // Blockchain specific contextual infos
⋮----
// FilterOperatorAVSRegistrationStatusUpdated is a free log retrieval operation binding the contract event 0xf0952b1c65271d819d39983d2abb044b9cace59bcc4d4dd389f586ebdcb15b41.
⋮----
// Solidity: event OperatorAVSRegistrationStatusUpdated(address indexed operator, address indexed avs, uint8 status)
func (_AVSDirectoryStorage *AVSDirectoryStorageFilterer) FilterOperatorAVSRegistrationStatusUpdated(opts *bind.FilterOpts, operator []common.Address, avs []common.Address) (*AVSDirectoryStorageOperatorAVSRegistrationStatusUpdatedIterator, error)
⋮----
var operatorRule []interface{}
⋮----
// WatchOperatorAVSRegistrationStatusUpdated is a free log subscription operation binding the contract event 0xf0952b1c65271d819d39983d2abb044b9cace59bcc4d4dd389f586ebdcb15b41.
⋮----
func (_AVSDirectoryStorage *AVSDirectoryStorageFilterer) WatchOperatorAVSRegistrationStatusUpdated(opts *bind.WatchOpts, sink chan<- *AVSDirectoryStorageOperatorAVSRegistrationStatusUpdated, operator []common.Address, avs []common.Address) (event.Subscription, error)
⋮----
// ParseOperatorAVSRegistrationStatusUpdated is a log parse operation binding the contract event 0xf0952b1c65271d819d39983d2abb044b9cace59bcc4d4dd389f586ebdcb15b41.
⋮----
func (_AVSDirectoryStorage *AVSDirectoryStorageFilterer) ParseOperatorAVSRegistrationStatusUpdated(log types.Log) (*AVSDirectoryStorageOperatorAVSRegistrationStatusUpdated, error)
````

## File: pkg/bindings/BackingEigen/binding.go
````go
// Code generated - DO NOT EDIT.
// This file is a generated binding and any manual changes will be lost.
⋮----
package BackingEigen
⋮----
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"
)
⋮----
"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
)
⋮----
// ERC20VotesUpgradeableCheckpoint is an auto generated low-level Go binding around an user-defined struct.
type ERC20VotesUpgradeableCheckpoint struct {
	FromBlock uint32
	Votes     *big.Int
}
⋮----
// BackingEigenMetaData contains all meta data concerning the BackingEigen contract.
var BackingEigenMetaData = &bind.MetaData{
	ABI: "[{\"type\":\"constructor\",\"inputs\":[{\"name\":\"_EIGEN\",\"type\":\"address\",\"internalType\":\"contractIERC20\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"CLOCK_MODE\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"string\",\"internalType\":\"string\"}],\"stateMutability\":\"pure\"},{\"type\":\"function\",\"name\":\"DOMAIN_SEPARATOR\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"EIGEN\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIERC20\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"allowance\",\"inputs\":[{\"name\":\"owner\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"spender\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"allowedFrom\",\"inputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"allowedTo\",\"inputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"approve\",\"inputs\":[{\"name\":\"spender\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"balanceOf\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"burn\",\"inputs\":[{\"name\":\"amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"checkpoints\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"pos\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"tuple\",\"internalType\":\"structERC20VotesUpgradeable.Checkpoint\",\"components\":[{\"name\":\"fromBlock\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"votes\",\"type\":\"uint224\",\"internalType\":\"uint224\"}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"clock\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint48\",\"internalType\":\"uint48\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"decimals\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint8\",\"internalType\":\"uint8\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"decreaseAllowance\",\"inputs\":[{\"name\":\"spender\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"subtractedValue\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"delegate\",\"inputs\":[{\"name\":\"delegatee\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"delegateBySig\",\"inputs\":[{\"name\":\"delegatee\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"nonce\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"expiry\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"v\",\"type\":\"uint8\",\"internalType\":\"uint8\"},{\"name\":\"r\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"s\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"delegates\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"disableTransferRestrictions\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"eip712Domain\",\"inputs\":[],\"outputs\":[{\"name\":\"fields\",\"type\":\"bytes1\",\"internalType\":\"bytes1\"},{\"name\":\"name\",\"type\":\"string\",\"internalType\":\"string\"},{\"name\":\"version\",\"type\":\"string\",\"internalType\":\"string\"},{\"name\":\"chainId\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"verifyingContract\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"salt\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"extensions\",\"type\":\"uint256[]\",\"internalType\":\"uint256[]\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getPastTotalSupply\",\"inputs\":[{\"name\":\"timepoint\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getPastVotes\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"timepoint\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getVotes\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"increaseAllowance\",\"inputs\":[{\"name\":\"spender\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"addedValue\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"initialize\",\"inputs\":[{\"name\":\"initialOwner\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"isMinter\",\"inputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"mint\",\"inputs\":[{\"name\":\"to\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"name\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"string\",\"internalType\":\"string\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"nonces\",\"inputs\":[{\"name\":\"owner\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"numCheckpoints\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"owner\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"permit\",\"inputs\":[{\"name\":\"owner\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"spender\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"value\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"deadline\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"v\",\"type\":\"uint8\",\"internalType\":\"uint8\"},{\"name\":\"r\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"s\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"renounceOwnership\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"setAllowedFrom\",\"inputs\":[{\"name\":\"from\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"isAllowedFrom\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"setAllowedTo\",\"inputs\":[{\"name\":\"to\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"isAllowedTo\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"setIsMinter\",\"inputs\":[{\"name\":\"minterAddress\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"newStatus\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"symbol\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"string\",\"internalType\":\"string\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"totalSupply\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"transfer\",\"inputs\":[{\"name\":\"to\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"transferFrom\",\"inputs\":[{\"name\":\"from\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"to\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"transferOwnership\",\"inputs\":[{\"name\":\"newOwner\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"transferRestrictionsDisabledAfter\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"event\",\"name\":\"Approval\",\"inputs\":[{\"name\":\"owner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"spender\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"value\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Backed\",\"inputs\":[],\"anonymous\":false},{\"type\":\"event\",\"name\":\"DelegateChanged\",\"inputs\":[{\"name\":\"delegator\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"fromDelegate\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"toDelegate\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"DelegateVotesChanged\",\"inputs\":[{\"name\":\"delegate\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"previousBalance\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"newBalance\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"EIP712DomainChanged\",\"inputs\":[],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Initialized\",\"inputs\":[{\"name\":\"version\",\"type\":\"uint8\",\"indexed\":false,\"internalType\":\"uint8\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"IsMinterModified\",\"inputs\":[{\"name\":\"minterAddress\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"newStatus\",\"type\":\"bool\",\"indexed\":false,\"internalType\":\"bool\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"OwnershipTransferred\",\"inputs\":[{\"name\":\"previousOwner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"newOwner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"SetAllowedFrom\",\"inputs\":[{\"name\":\"from\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"isAllowedFrom\",\"type\":\"bool\",\"indexed\":false,\"internalType\":\"bool\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"SetAllowedTo\",\"inputs\":[{\"name\":\"to\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"isAllowedTo\",\"type\":\"bool\",\"indexed\":false,\"internalType\":\"bool\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Transfer\",\"inputs\":[{\"name\":\"from\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"to\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"value\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"TransferRestrictionsDisabled\",\"inputs\":[],\"anonymous\":false}]",
	Bin: "0x60a060405234801561000f575f5ffd5b50604051612d11380380612d1183398101604081905261002e91610105565b6001600160a01b038116608052610043610049565b50610132565b5f54610100900460ff16156100b45760405162461bcd60e51b815260206004820152602760248201527f496e697469616c697a61626c653a20636f6e747261637420697320696e697469604482015266616c697a696e6760c81b606482015260840160405180910390fd5b5f5460ff90811614610103575f805460ff191660ff9081179091556040519081527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b565b5f60208284031215610115575f5ffd5b81516001600160a01b038116811461012b575f5ffd5b9392505050565b608051612bb261015f5f395f81816105e901528181610dae01528181610dd90152610e040152612bb25ff3fe608060405234801561000f575f5ffd5b506004361061023f575f3560e01c80637ecebe0011610135578063aa271e1a116100b4578063dd62ed3e11610079578063dd62ed3e14610579578063eb415f451461058c578063f1127ed814610594578063f2fde38b146105d1578063fdc371ce146105e4575f5ffd5b8063aa271e1a1461050a578063b8c255941461052d578063c3cda52014610540578063c4d66de814610553578063d505accf14610566575f5ffd5b806395d89b41116100fa57806395d89b41146104bf5780639ab24eb0146104c75780639aec4bae146104da578063a457c2d7146104e4578063a9059cbb146104f7575f5ffd5b80637ecebe001461044e57806384b0196e146104615780638da5cb5b1461047c5780638e539e8c1461048d57806391ddadf4146104a0575f5ffd5b806340c10f19116101c157806366eb399f1161018657806366eb399f146103c05780636fcfff45146103d357806370a08231146103fb578063715018a61461042357806378aa33ba1461042b575f5ffd5b806340c10f191461031a57806342966c681461032d5780634bf5d7e914610340578063587cde1e1461036a5780635c19a95c146103ad575f5ffd5b806323b872dd1161020757806323b872dd146102ca578063313ce567146102dd5780633644e515146102ec57806339509351146102f45780633a46b1a814610307575f5ffd5b80630455e6941461024357806306fdde031461027b578063095ea7b31461029057806318160ddd146102a35780631ffacdef146102b5575b5f5ffd5b610266610251366004612682565b6101316020525f908152604090205460ff1681565b60405190151581526020015b60405180910390f35b61028361060b565b60405161027291906126c9565b61026661029e3660046126db565b61069b565b6067545b604051908152602001610272565b6102c86102c3366004612703565b6106b4565b005b6102666102d836600461273c565b6106ca565b60405160128152602001610272565b6102a76106ed565b6102666103023660046126db565b6106fb565b6102a76103153660046126db565b61071c565b6102c86103283660046126db565b6107a4565b6102c861033b366004612776565b61081f565b60408051808201909152600e81526d06d6f64653d74696d657374616d760941b6020820152610283565b610395610378366004612682565b6001600160a01b039081165f90815260fe60205260409020541690565b6040516001600160a01b039091168152602001610272565b6102c86103bb366004612682565b61082c565b6102c86103ce366004612703565b610836565b6103e66103e1366004612682565b6108ae565b60405163ffffffff9091168152602001610272565b6102a7610409366004612682565b6001600160a01b03165f9081526065602052604090205490565b6102c86108cf565b610266610439366004612682565b6101326020525f908152604090205460ff1681565b6102a761045c366004612682565b6108e2565b6104696108ff565b604051610272979695949392919061278d565b6033546001600160a01b0316610395565b6102a761049b366004612776565b610998565b6104a86109ff565b60405165ffffffffffff9091168152602001610272565b610283610a09565b6102a76104d5366004612682565b610a18565b6102a76101305481565b6102666104f23660046126db565b610a95565b6102666105053660046126db565b610b0f565b610266610518366004612682565b6101336020525f908152604090205460ff1681565b6102c861053b366004612703565b610b1c565b6102c861054e366004612833565b610b2e565b6102c8610561366004612682565b610c63565b6102c8610574366004612887565b610ea5565b6102a76105873660046128ed565b611006565b6102c8611030565b6105a76105a236600461291e565b6110fe565b60408051825163ffffffff1681526020928301516001600160e01b03169281019290925201610272565b6102c86105df366004612682565b61117f565b6103957f000000000000000000000000000000000000000000000000000000000000000081565b60606068805461061a90612950565b80601f016020809104026020016040519081016040528092919081815260200182805461064690612950565b80156106915780601f1061066857610100808354040283529160200191610691565b820191905f5260205f20905b81548152906001019060200180831161067457829003601f168201915b5050505050905090565b5f336106a88185856111f5565b60019150505b92915050565b6106bc611318565b6106c68282611372565b5050565b5f336106d78582856113d2565b6106e285858561144a565b506001949350505050565b5f6106f6611604565b905090565b5f336106a881858561070d8383611006565b6107179190612996565b6111f5565b5f6107256109ff565b65ffffffffffff16821061077c5760405162461bcd60e51b815260206004820152601960248201527804552433230566f7465733a20667574757265206c6f6f6b757603c1b60448201526064015b60405180910390fd5b6001600160a01b0383165f90815260ff6020526040902061079d908361160d565b9392505050565b335f908152610133602052604090205460ff166108155760405162461bcd60e51b815260206004820152602960248201527f4261636b696e67456967656e2e6d696e743a2063616c6c6572206973206e6f7460448201526810309036b4b73a32b960b91b6064820152608401610773565b6106c682826116ee565b6108293382611779565b50565b6108293382611792565b61083e611318565b816001600160a01b03167f0124b12503bddc2616c0f3f54fd23ed283f5ef0c1483a75409e42612176b8bde8260405161087b911515815260200190565b60405180910390a26001600160a01b03919091165f90815261013360205260409020805460ff1916911515919091179055565b6001600160a01b0381165f90815260ff60205260408120546106ae9061180b565b6108d7611318565b6108e05f611873565b565b6001600160a01b0381165f90815260cb60205260408120546106ae565b5f6060805f5f5f60606097545f5f1b14801561091b5750609854155b61095f5760405162461bcd60e51b81526020600482015260156024820152741152540dcc4c8e88155b9a5b9a5d1a585b1a5e9959605a1b6044820152606401610773565b6109676118c4565b61096f6118d3565b604080515f80825260208201909252600f60f81b9b939a50919850469750309650945092509050565b5f6109a16109ff565b65ffffffffffff1682106109f35760405162461bcd60e51b815260206004820152601960248201527804552433230566f7465733a20667574757265206c6f6f6b757603c1b6044820152606401610773565b6106ae6101008361160d565b5f6106f6426118e2565b60606069805461061a90612950565b6001600160a01b0381165f90815260ff60205260408120548015610a83576001600160a01b0383165f90815260ff6020526040902080545f198301908110610a6257610a626129bd565b5f9182526020909120015464010000000090046001600160e01b0316610a85565b5f5b6001600160e01b03169392505050565b5f3381610aa28286611006565b905083811015610b025760405162461bcd60e51b815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f77604482015264207a65726f60d81b6064820152608401610773565b6106e282868684036111f5565b5f336106a881858561144a565b610b24611318565b6106c68282611948565b83421115610b7e5760405162461bcd60e51b815260206004820152601d60248201527f4552433230566f7465733a207369676e617475726520657870697265640000006044820152606401610773565b604080517fe48329057bfd03d55e49b547132e39cffd9c1820ad7b9d4c5307691425d15adf60208201526001600160a01b0388169181019190915260608101869052608081018590525f90610bf790610bef9060a001604051602081830303815290604052805190602001206119a0565b8585856119cc565b9050610c02816119f2565b8614610c505760405162461bcd60e51b815260206004820152601960248201527f4552433230566f7465733a20696e76616c6964206e6f6e6365000000000000006044820152606401610773565b610c5a8188611792565b50505050505050565b5f54610100900460ff1615808015610c8157505f54600160ff909116105b80610c9a5750303b158015610c9a57505f5460ff166001145b610cfd5760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b6064820152608401610773565b5f805460ff191660011790558015610d1e575f805461ff0019166101001790555b610d26611a19565b610d736040518060400160405280600d81526020016c2130b1b5b4b7339022b4b3b2b760991b815250604051806040016040528060068152602001653122a4a3a2a760d11b815250611a47565b610d7c82611873565b610da3604051806040016040528060068152602001653122a4a3a2a760d11b815250611a77565b5f1961013055610dd47f00000000000000000000000000000000000000000000000000000000000000006001611372565b610dff7f00000000000000000000000000000000000000000000000000000000000000006001611948565b610e357f00000000000000000000000000000000000000000000000000000000000000006b05686877afb5cbccbf7340006116ee565b6040517fb7c23c1e2e36f298e9879a88ecfcd07e28fbb439bcfa9c78ca1363ca14370d26905f90a180156106c6575f805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15050565b83421115610ef55760405162461bcd60e51b815260206004820152601d60248201527f45524332305065726d69743a206578706972656420646561646c696e650000006044820152606401610773565b5f7f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c9888888610f238c6119f2565b6040805160208101969096526001600160a01b0394851690860152929091166060840152608083015260a082015260c0810186905260e0016040516020818303038152906040528051906020012090505f610f7d826119a0565b90505f610f8c828787876119cc565b9050896001600160a01b0316816001600160a01b031614610fef5760405162461bcd60e51b815260206004820152601e60248201527f45524332305065726d69743a20696e76616c6964207369676e617475726500006044820152606401610773565b610ffa8a8a8a6111f5565b50505050505050505050565b6001600160a01b039182165f90815260666020908152604080832093909416825291909152205490565b611038611318565b5f1961013054146110ce5760405162461bcd60e51b815260206004820152605460248201527f4261636b696e67456967656e2e64697361626c655472616e736665725265737460448201527f72696374696f6e733a207472616e73666572207265737472696374696f6e7320606482015273185c9948185b1c9958591e48191a5cd8589b195960621b608482015260a401610773565b5f6101308190556040517f2b18986d3ba809db2f13a5d7bf17f60d357b37d9cbb55dd71cbbac8dc4060f649190a1565b604080518082019091525f80825260208201526001600160a01b0383165f90815260ff60205260409020805463ffffffff8416908110611140576111406129bd565b5f9182526020918290206040805180820190915291015463ffffffff8116825264010000000090046001600160e01b0316918101919091529392505050565b611187611318565b6001600160a01b0381166111ec5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610773565b61082981611873565b6001600160a01b0383166112575760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b6064820152608401610773565b6001600160a01b0382166112b85760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b6064820152608401610773565b6001600160a01b038381165f8181526066602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b6033546001600160a01b031633146108e05760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610773565b6001600160a01b0382165f8181526101316020908152604091829020805460ff191685151590811790915591519182527fcf20b1ecb604b0e8888d579c64e8a3b10e590d45c1c2dddb393bed284362227191015b60405180910390a25050565b5f6113dd8484611006565b90505f19811461144457818110156114375760405162461bcd60e51b815260206004820152601d60248201527f45524332303a20696e73756666696369656e7420616c6c6f77616e63650000006044820152606401610773565b61144484848484036111f5565b50505050565b6001600160a01b0383166114ae5760405162461bcd60e51b815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604482015264647265737360d81b6064820152608401610773565b6001600160a01b0382166115105760405162461bcd60e51b815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201526265737360e81b6064820152608401610773565b61151b838383611ac0565b6001600160a01b0383165f90815260656020526040902054818110156115925760405162461bcd60e51b815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e7420657863656564732062604482015265616c616e636560d01b6064820152608401610773565b6001600160a01b038085165f8181526065602052604080822086860390559286168082529083902080548601905591517fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef906115f19086815260200190565b60405180910390a3611444848484611b9c565b5f6106f6611bcd565b81545f9081816005811115611664575f61162684611c40565b61163090856129d1565b5f88815260209020909150869082015463ffffffff16111561165457809150611662565b61165f816001612996565b92505b505b808210156116af575f6116778383611d24565b5f88815260209020909150869082015463ffffffff16111561169b578091506116a9565b6116a6816001612996565b92505b50611664565b80156116d9575f8681526020902081015f19015464010000000090046001600160e01b03166116db565b5f5b6001600160e01b03169695505050505050565b6116f88282611d3e565b6067546001600160e01b03101561176a5760405162461bcd60e51b815260206004820152603060248201527f4552433230566f7465733a20746f74616c20737570706c79207269736b73206f60448201526f766572666c6f77696e6720766f74657360801b6064820152608401610773565b611444610100611e0f83611e1a565b6117838282611f86565b6114446101006120c983611e1a565b6001600160a01b038281165f81815260fe6020818152604080842080546065845282862054949093528787166001600160a01b03198416811790915590519190951694919391928592917f3134e8a2e6d97e929a7e54011ea5485d7d196dd5f0ba4d4ef95803e8e3fc257f9190a46114448284836120d4565b5f63ffffffff82111561186f5760405162461bcd60e51b815260206004820152602660248201527f53616665436173743a2076616c756520646f65736e27742066697420696e203360448201526532206269747360d01b6064820152608401610773565b5090565b603380546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a35050565b60606099805461061a90612950565b6060609a805461061a90612950565b5f65ffffffffffff82111561186f5760405162461bcd60e51b815260206004820152602660248201527f53616665436173743a2076616c756520646f65736e27742066697420696e203460448201526538206269747360d01b6064820152608401610773565b6001600160a01b0382165f8181526101326020908152604091829020805460ff191685151590811790915591519182527f72a561d1af7409467dae4f1e9fc52590a9335a1dda17727e2b6aa8c4db35109b91016113c6565b5f6106ae6119ac611604565b8360405161190160f01b8152600281019290925260228201526042902090565b5f5f5f6119db8787878761220e565b915091506119e8816122cb565b5095945050505050565b6001600160a01b0381165f90815260cb602052604090208054600181018255905b50919050565b5f54610100900460ff16611a3f5760405162461bcd60e51b8152600401610773906129e4565b6108e0612414565b5f54610100900460ff16611a6d5760405162461bcd60e51b8152600401610773906129e4565b6106c68282612443565b5f54610100900460ff16611a9d5760405162461bcd60e51b8152600401610773906129e4565b61082981604051806040016040528060018152602001603160f81b815250612482565b610130544211611b97576001600160a01b0383165f908152610131602052604090205460ff1680611b0957506001600160a01b0382165f908152610132602052604090205460ff165b80611b1b57506001600160a01b038316155b611b975760405162461bcd60e51b815260206004820152604160248201527f4261636b696e67456967656e2e5f6265666f7265546f6b656e5472616e73666560448201527f723a2066726f6d206f7220746f206d7573742062652077686974656c697374656064820152601960fa1b608482015260a401610773565b505050565b6001600160a01b038381165f90815260fe6020526040808220548584168352912054611b97929182169116836120d4565b5f7f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f611bf76124cf565b611bff612527565b60408051602081019490945283019190915260608201524660808201523060a082015260c00160405160208183030381529060405280519060200120905090565b5f815f03611c4f57505f919050565b5f6001611c5b84612557565b901c6001901b90506001818481611c7457611c74612a2f565b048201901c90506001818481611c8c57611c8c612a2f565b048201901c90506001818481611ca457611ca4612a2f565b048201901c90506001818481611cbc57611cbc612a2f565b048201901c90506001818481611cd457611cd4612a2f565b048201901c90506001818481611cec57611cec612a2f565b048201901c90506001818481611d0457611d04612a2f565b048201901c905061079d81828581611d1e57611d1e612a2f565b046125ea565b5f611d326002848418612a43565b61079d90848416612996565b6001600160a01b038216611d945760405162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f2061646472657373006044820152606401610773565b611d9f5f8383611ac0565b8060675f828254611db09190612996565b90915550506001600160a01b0382165f818152606560209081526040808320805486019055518481527fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a36106c65f8383611b9c565b5f61079d8284612996565b82545f908190818115611e64575f8781526020902082015f190160408051808201909152905463ffffffff8116825264010000000090046001600160e01b03166020820152611e78565b604080518082019091525f80825260208201525b905080602001516001600160e01b03169350611e9884868863ffffffff16565b92505f82118015611ec05750611eac6109ff565b65ffffffffffff16815f015163ffffffff16145b15611f0357611ece836125ff565b5f8881526020902083015f190180546001600160e01b03929092166401000000000263ffffffff909216919091179055611f7c565b866040518060400160405280611f27611f1a6109ff565b65ffffffffffff1661180b565b63ffffffff168152602001611f3b866125ff565b6001600160e01b0390811690915282546001810184555f938452602093849020835194909301519091166401000000000263ffffffff909316929092179101555b5050935093915050565b6001600160a01b038216611fe65760405162461bcd60e51b815260206004820152602160248201527f45524332303a206275726e2066726f6d20746865207a65726f206164647265736044820152607360f81b6064820152608401610773565b611ff1825f83611ac0565b6001600160a01b0382165f90815260656020526040902054818110156120645760405162461bcd60e51b815260206004820152602260248201527f45524332303a206275726e20616d6f756e7420657863656564732062616c616e604482015261636560f01b6064820152608401610773565b6001600160a01b0383165f8181526065602090815260408083208686039055606780548790039055518581529192917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a3611b97835f84611b9c565b5f61079d82846129d1565b816001600160a01b0316836001600160a01b0316141580156120f557505f81115b15611b97576001600160a01b03831615612182576001600160a01b0383165f90815260ff60205260408120819061212f906120c985611e1a565b91509150846001600160a01b03167fdec2bacdd2f05b59de34da9b523dff8be42e5e38e818c82fdb0bae774387a7248383604051612177929190918252602082015260400190565b60405180910390a250505b6001600160a01b03821615611b97576001600160a01b0382165f90815260ff6020526040812081906121b790611e0f85611e1a565b91509150836001600160a01b03167fdec2bacdd2f05b59de34da9b523dff8be42e5e38e818c82fdb0bae774387a72483836040516121ff929190918252602082015260400190565b60405180910390a25050505050565b5f807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a083111561224357505f905060036122c2565b604080515f8082526020820180845289905260ff881692820192909252606081018690526080810185905260019060a0016020604051602081039080840390855afa158015612294573d5f5f3e3d5ffd5b5050604051601f1901519150506001600160a01b0381166122bc575f600192509250506122c2565b91505f90505b94509492505050565b5f8160048111156122de576122de612a62565b036122e65750565b60018160048111156122fa576122fa612a62565b036123475760405162461bcd60e51b815260206004820152601860248201527f45434453413a20696e76616c6964207369676e617475726500000000000000006044820152606401610773565b600281600481111561235b5761235b612a62565b036123a85760405162461bcd60e51b815260206004820152601f60248201527f45434453413a20696e76616c6964207369676e6174757265206c656e677468006044820152606401610773565b60038160048111156123bc576123bc612a62565b036108295760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202773272076616c604482015261756560f01b6064820152608401610773565b5f54610100900460ff1661243a5760405162461bcd60e51b8152600401610773906129e4565b6108e033611873565b5f54610100900460ff166124695760405162461bcd60e51b8152600401610773906129e4565b60686124758382612ac1565b506069611b978282612ac1565b5f54610100900460ff166124a85760405162461bcd60e51b8152600401610773906129e4565b60996124b48382612ac1565b50609a6124c18282612ac1565b50505f609781905560985550565b5f5f6124d96118c4565b8051909150156124f0578051602090910120919050565b60975480156124ff5792915050565b7fc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a4709250505090565b5f5f6125316118d3565b805190915015612548578051602090910120919050565b60985480156124ff5792915050565b5f80608083901c1561256b57608092831c92015b604083901c1561257d57604092831c92015b602083901c1561258f57602092831c92015b601083901c156125a157601092831c92015b600883901c156125b357600892831c92015b600483901c156125c557600492831c92015b600283901c156125d757600292831c92015b600183901c156106ae5760010192915050565b5f8183106125f8578161079d565b5090919050565b5f6001600160e01b0382111561186f5760405162461bcd60e51b815260206004820152602760248201527f53616665436173743a2076616c756520646f65736e27742066697420696e20326044820152663234206269747360c81b6064820152608401610773565b80356001600160a01b038116811461267d575f5ffd5b919050565b5f60208284031215612692575f5ffd5b61079d82612667565b5f81518084528060208401602086015e5f602082860101526020601f19601f83011685010191505092915050565b602081525f61079d602083018461269b565b5f5f604083850312156126ec575f5ffd5b6126f583612667565b946020939093013593505050565b5f5f60408385031215612714575f5ffd5b61271d83612667565b915060208301358015158114612731575f5ffd5b809150509250929050565b5f5f5f6060848603121561274e575f5ffd5b61275784612667565b925061276560208501612667565b929592945050506040919091013590565b5f60208284031215612786575f5ffd5b5035919050565b60ff60f81b8816815260e060208201525f6127ab60e083018961269b565b82810360408401526127bd818961269b565b606084018890526001600160a01b038716608085015260a0840186905283810360c0850152845180825260208087019350909101905f5b818110156128125783518352602093840193909201916001016127f4565b50909b9a5050505050505050505050565b803560ff8116811461267d575f5ffd5b5f5f5f5f5f5f60c08789031215612848575f5ffd5b61285187612667565b9550602087013594506040870135935061286d60608801612823565b9598949750929560808101359460a0909101359350915050565b5f5f5f5f5f5f5f60e0888a03121561289d575f5ffd5b6128a688612667565b96506128b460208901612667565b955060408801359450606088013593506128d060808901612823565b9699959850939692959460a0840135945060c09093013592915050565b5f5f604083850312156128fe575f5ffd5b61290783612667565b915061291560208401612667565b90509250929050565b5f5f6040838503121561292f575f5ffd5b61293883612667565b9150602083013563ffffffff81168114612731575f5ffd5b600181811c9082168061296457607f821691505b602082108103611a1357634e487b7160e01b5f52602260045260245ffd5b634e487b7160e01b5f52601160045260245ffd5b808201808211156106ae576106ae612982565b634e487b7160e01b5f52604160045260245ffd5b634e487b7160e01b5f52603260045260245ffd5b818103818111156106ae576106ae612982565b6020808252602b908201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960408201526a6e697469616c697a696e6760a81b606082015260800190565b634e487b7160e01b5f52601260045260245ffd5b5f82612a5d57634e487b7160e01b5f52601260045260245ffd5b500490565b634e487b7160e01b5f52602160045260245ffd5b601f821115611b9757805f5260205f20601f840160051c81016020851015612a9b5750805b601f840160051c820191505b81811015612aba575f8155600101612aa7565b5050505050565b815167ffffffffffffffff811115612adb57612adb6129a9565b612aef81612ae98454612950565b84612a76565b6020601f821160018114612b21575f8315612b0a5750848201515b5f19600385901b1c1916600184901b178455612aba565b5f84815260208120601f198516915b82811015612b505787850151825560209485019460019092019101612b30565b5084821015612b6d57868401515f19600387901b60f8161c191681555b50505050600190811b0190555056fea2646970667358221220d0eeb84061c7e024d6e07caeab52d6bd090be9c2e61dcf10b8d3d372aab2efce64736f6c634300081e0033",
}
⋮----
// BackingEigenABI is the input ABI used to generate the binding from.
// Deprecated: Use BackingEigenMetaData.ABI instead.
var BackingEigenABI = BackingEigenMetaData.ABI
⋮----
// BackingEigenBin is the compiled bytecode used for deploying new contracts.
// Deprecated: Use BackingEigenMetaData.Bin instead.
var BackingEigenBin = BackingEigenMetaData.Bin
⋮----
// DeployBackingEigen deploys a new Ethereum contract, binding an instance of BackingEigen to it.
func DeployBackingEigen(auth *bind.TransactOpts, backend bind.ContractBackend, _EIGEN common.Address) (common.Address, *types.Transaction, *BackingEigen, error)
⋮----
// BackingEigen is an auto generated Go binding around an Ethereum contract.
type BackingEigen struct {
	BackingEigenCaller     // Read-only binding to the contract
	BackingEigenTransactor // Write-only binding to the contract
	BackingEigenFilterer   // Log filterer for contract events
}
⋮----
BackingEigenCaller     // Read-only binding to the contract
BackingEigenTransactor // Write-only binding to the contract
BackingEigenFilterer   // Log filterer for contract events
⋮----
// BackingEigenCaller is an auto generated read-only Go binding around an Ethereum contract.
type BackingEigenCaller struct {
	contract *bind.BoundContract // Generic contract wrapper for the low level calls
}
⋮----
contract *bind.BoundContract // Generic contract wrapper for the low level calls
⋮----
// BackingEigenTransactor is an auto generated write-only Go binding around an Ethereum contract.
type BackingEigenTransactor struct {
	contract *bind.BoundContract // Generic contract wrapper for the low level calls
}
⋮----
// BackingEigenFilterer is an auto generated log filtering Go binding around an Ethereum contract events.
type BackingEigenFilterer struct {
	contract *bind.BoundContract // Generic contract wrapper for the low level calls
}
⋮----
// BackingEigenSession is an auto generated Go binding around an Ethereum contract,
// with pre-set call and transact options.
type BackingEigenSession struct {
	Contract     *BackingEigen     // 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
}
⋮----
Contract     *BackingEigen     // 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
⋮----
// BackingEigenCallerSession is an auto generated read-only Go binding around an Ethereum contract,
// with pre-set call options.
type BackingEigenCallerSession struct {
	Contract *BackingEigenCaller // Generic contract caller binding to set the session for
	CallOpts bind.CallOpts       // Call options to use throughout this session
}
⋮----
Contract *BackingEigenCaller // Generic contract caller binding to set the session for
CallOpts bind.CallOpts       // Call options to use throughout this session
⋮----
// BackingEigenTransactorSession is an auto generated write-only Go binding around an Ethereum contract,
// with pre-set transact options.
type BackingEigenTransactorSession struct {
	Contract     *BackingEigenTransactor // Generic contract transactor binding to set the session for
	TransactOpts bind.TransactOpts       // Transaction auth options to use throughout this session
}
⋮----
Contract     *BackingEigenTransactor // Generic contract transactor binding to set the session for
TransactOpts bind.TransactOpts       // Transaction auth options to use throughout this session
⋮----
// BackingEigenRaw is an auto generated low-level Go binding around an Ethereum contract.
type BackingEigenRaw struct {
	Contract *BackingEigen // Generic contract binding to access the raw methods on
}
⋮----
Contract *BackingEigen // Generic contract binding to access the raw methods on
⋮----
// BackingEigenCallerRaw is an auto generated low-level read-only Go binding around an Ethereum contract.
type BackingEigenCallerRaw struct {
	Contract *BackingEigenCaller // Generic read-only contract binding to access the raw methods on
}
⋮----
Contract *BackingEigenCaller // Generic read-only contract binding to access the raw methods on
⋮----
// BackingEigenTransactorRaw is an auto generated low-level write-only Go binding around an Ethereum contract.
type BackingEigenTransactorRaw struct {
	Contract *BackingEigenTransactor // Generic write-only contract binding to access the raw methods on
}
⋮----
Contract *BackingEigenTransactor // Generic write-only contract binding to access the raw methods on
⋮----
// NewBackingEigen creates a new instance of BackingEigen, bound to a specific deployed contract.
func NewBackingEigen(address common.Address, backend bind.ContractBackend) (*BackingEigen, error)
⋮----
// NewBackingEigenCaller creates a new read-only instance of BackingEigen, bound to a specific deployed contract.
func NewBackingEigenCaller(address common.Address, caller bind.ContractCaller) (*BackingEigenCaller, error)
⋮----
// NewBackingEigenTransactor creates a new write-only instance of BackingEigen, bound to a specific deployed contract.
func NewBackingEigenTransactor(address common.Address, transactor bind.ContractTransactor) (*BackingEigenTransactor, error)
⋮----
// NewBackingEigenFilterer creates a new log filterer instance of BackingEigen, bound to a specific deployed contract.
func NewBackingEigenFilterer(address common.Address, filterer bind.ContractFilterer) (*BackingEigenFilterer, error)
⋮----
// bindBackingEigen binds a generic wrapper to an already deployed contract.
func bindBackingEigen(address common.Address, caller bind.ContractCaller, transactor bind.ContractTransactor, filterer bind.ContractFilterer) (*bind.BoundContract, error)
⋮----
// 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 (_BackingEigen *BackingEigenRaw) Call(opts *bind.CallOpts, result *[]interface
⋮----
// Transfer initiates a plain transaction to move funds to the contract, calling
// its default method if one is available.
func (_BackingEigen *BackingEigenRaw) Transfer(opts *bind.TransactOpts) (*types.Transaction, error)
⋮----
// Transact invokes the (paid) contract method with params as input values.
func (_BackingEigen *BackingEigenRaw) Transact(opts *bind.TransactOpts, method string, params ...interface
⋮----
// CLOCKMODE is a free data retrieval call binding the contract method 0x4bf5d7e9.
//
// Solidity: function CLOCK_MODE() pure returns(string)
func (_BackingEigen *BackingEigenCaller) CLOCKMODE(opts *bind.CallOpts) (string, error)
⋮----
var out []interface{}
⋮----
// DOMAINSEPARATOR is a free data retrieval call binding the contract method 0x3644e515.
⋮----
// Solidity: function DOMAIN_SEPARATOR() view returns(bytes32)
func (_BackingEigen *BackingEigenCaller) DOMAINSEPARATOR(opts *bind.CallOpts) ([32]byte, error)
⋮----
// EIGEN is a free data retrieval call binding the contract method 0xfdc371ce.
⋮----
// Solidity: function EIGEN() view returns(address)
func (_BackingEigen *BackingEigenCaller) EIGEN(opts *bind.CallOpts) (common.Address, error)
⋮----
// Allowance is a free data retrieval call binding the contract method 0xdd62ed3e.
⋮----
// Solidity: function allowance(address owner, address spender) view returns(uint256)
func (_BackingEigen *BackingEigenCaller) Allowance(opts *bind.CallOpts, owner common.Address, spender common.Address) (*big.Int, error)
⋮----
// AllowedFrom is a free data retrieval call binding the contract method 0x0455e694.
⋮----
// Solidity: function allowedFrom(address ) view returns(bool)
func (_BackingEigen *BackingEigenCaller) AllowedFrom(opts *bind.CallOpts, arg0 common.Address) (bool, error)
⋮----
// AllowedTo is a free data retrieval call binding the contract method 0x78aa33ba.
⋮----
// Solidity: function allowedTo(address ) view returns(bool)
func (_BackingEigen *BackingEigenCaller) AllowedTo(opts *bind.CallOpts, arg0 common.Address) (bool, error)
⋮----
// BalanceOf is a free data retrieval call binding the contract method 0x70a08231.
⋮----
// Solidity: function balanceOf(address account) view returns(uint256)
func (_BackingEigen *BackingEigenCaller) BalanceOf(opts *bind.CallOpts, account common.Address) (*big.Int, error)
⋮----
// Checkpoints is a free data retrieval call binding the contract method 0xf1127ed8.
⋮----
// Solidity: function checkpoints(address account, uint32 pos) view returns((uint32,uint224))
func (_BackingEigen *BackingEigenCaller) Checkpoints(opts *bind.CallOpts, account common.Address, pos uint32) (ERC20VotesUpgradeableCheckpoint, error)
⋮----
// Clock is a free data retrieval call binding the contract method 0x91ddadf4.
⋮----
// Solidity: function clock() view returns(uint48)
func (_BackingEigen *BackingEigenCaller) Clock(opts *bind.CallOpts) (*big.Int, error)
⋮----
// Decimals is a free data retrieval call binding the contract method 0x313ce567.
⋮----
// Solidity: function decimals() view returns(uint8)
func (_BackingEigen *BackingEigenCaller) Decimals(opts *bind.CallOpts) (uint8, error)
⋮----
// Delegates is a free data retrieval call binding the contract method 0x587cde1e.
⋮----
// Solidity: function delegates(address account) view returns(address)
func (_BackingEigen *BackingEigenCaller) Delegates(opts *bind.CallOpts, account common.Address) (common.Address, error)
⋮----
// Eip712Domain is a free data retrieval call binding the contract method 0x84b0196e.
⋮----
// Solidity: function eip712Domain() view returns(bytes1 fields, string name, string version, uint256 chainId, address verifyingContract, bytes32 salt, uint256[] extensions)
func (_BackingEigen *BackingEigenCaller) Eip712Domain(opts *bind.CallOpts) (struct
⋮----
// GetPastTotalSupply is a free data retrieval call binding the contract method 0x8e539e8c.
⋮----
// Solidity: function getPastTotalSupply(uint256 timepoint) view returns(uint256)
func (_BackingEigen *BackingEigenCaller) GetPastTotalSupply(opts *bind.CallOpts, timepoint *big.Int) (*big.Int, error)
⋮----
// GetPastVotes is a free data retrieval call binding the contract method 0x3a46b1a8.
⋮----
// Solidity: function getPastVotes(address account, uint256 timepoint) view returns(uint256)
func (_BackingEigen *BackingEigenCaller) GetPastVotes(opts *bind.CallOpts, account common.Address, timepoint *big.Int) (*big.Int, error)
⋮----
// GetVotes is a free data retrieval call binding the contract method 0x9ab24eb0.
⋮----
// Solidity: function getVotes(address account) view returns(uint256)
func (_BackingEigen *BackingEigenCaller) GetVotes(opts *bind.CallOpts, account common.Address) (*big.Int, error)
⋮----
// IsMinter is a free data retrieval call binding the contract method 0xaa271e1a.
⋮----
// Solidity: function isMinter(address ) view returns(bool)
func (_BackingEigen *BackingEigenCaller) IsMinter(opts *bind.CallOpts, arg0 common.Address) (bool, error)
⋮----
// Name is a free data retrieval call binding the contract method 0x06fdde03.
⋮----
// Solidity: function name() view returns(string)
func (_BackingEigen *BackingEigenCaller) Name(opts *bind.CallOpts) (string, error)
⋮----
// Nonces is a free data retrieval call binding the contract method 0x7ecebe00.
⋮----
// Solidity: function nonces(address owner) view returns(uint256)
func (_BackingEigen *BackingEigenCaller) Nonces(opts *bind.CallOpts, owner common.Address) (*big.Int, error)
⋮----
// NumCheckpoints is a free data retrieval call binding the contract method 0x6fcfff45.
⋮----
// Solidity: function numCheckpoints(address account) view returns(uint32)
func (_BackingEigen *BackingEigenCaller) NumCheckpoints(opts *bind.CallOpts, account common.Address) (uint32, error)
⋮----
// Owner is a free data retrieval call binding the contract method 0x8da5cb5b.
⋮----
// Solidity: function owner() view returns(address)
func (_BackingEigen *BackingEigenCaller) Owner(opts *bind.CallOpts) (common.Address, error)
⋮----
// Symbol is a free data retrieval call binding the contract method 0x95d89b41.
⋮----
// Solidity: function symbol() view returns(string)
func (_BackingEigen *BackingEigenCaller) Symbol(opts *bind.CallOpts) (string, error)
⋮----
// TotalSupply is a free data retrieval call binding the contract method 0x18160ddd.
⋮----
// Solidity: function totalSupply() view returns(uint256)
func (_BackingEigen *BackingEigenCaller) TotalSupply(opts *bind.CallOpts) (*big.Int, error)
⋮----
// TransferRestrictionsDisabledAfter is a free data retrieval call binding the contract method 0x9aec4bae.
⋮----
// Solidity: function transferRestrictionsDisabledAfter() view returns(uint256)
func (_BackingEigen *BackingEigenCaller) TransferRestrictionsDisabledAfter(opts *bind.CallOpts) (*big.Int, error)
⋮----
// Approve is a paid mutator transaction binding the contract method 0x095ea7b3.
⋮----
// Solidity: function approve(address spender, uint256 amount) returns(bool)
func (_BackingEigen *BackingEigenTransactor) Approve(opts *bind.TransactOpts, spender common.Address, amount *big.Int) (*types.Transaction, error)
⋮----
// Burn is a paid mutator transaction binding the contract method 0x42966c68.
⋮----
// Solidity: function burn(uint256 amount) returns()
func (_BackingEigen *BackingEigenTransactor) Burn(opts *bind.TransactOpts, amount *big.Int) (*types.Transaction, error)
⋮----
// DecreaseAllowance is a paid mutator transaction binding the contract method 0xa457c2d7.
⋮----
// Solidity: function decreaseAllowance(address spender, uint256 subtractedValue) returns(bool)
func (_BackingEigen *BackingEigenTransactor) DecreaseAllowance(opts *bind.TransactOpts, spender common.Address, subtractedValue *big.Int) (*types.Transaction, error)
⋮----
// Delegate is a paid mutator transaction binding the contract method 0x5c19a95c.
⋮----
// Solidity: function delegate(address delegatee) returns()
func (_BackingEigen *BackingEigenTransactor) Delegate(opts *bind.TransactOpts, delegatee common.Address) (*types.Transaction, error)
⋮----
// DelegateBySig is a paid mutator transaction binding the contract method 0xc3cda520.
⋮----
// Solidity: function delegateBySig(address delegatee, uint256 nonce, uint256 expiry, uint8 v, bytes32 r, bytes32 s) returns()
func (_BackingEigen *BackingEigenTransactor) DelegateBySig(opts *bind.TransactOpts, delegatee common.Address, nonce *big.Int, expiry *big.Int, v uint8, r [32]byte, s [32]byte) (*types.Transaction, error)
⋮----
// DisableTransferRestrictions is a paid mutator transaction binding the contract method 0xeb415f45.
⋮----
// Solidity: function disableTransferRestrictions() returns()
func (_BackingEigen *BackingEigenTransactor) DisableTransferRestrictions(opts *bind.TransactOpts) (*types.Transaction, error)
⋮----
// IncreaseAllowance is a paid mutator transaction binding the contract method 0x39509351.
⋮----
// Solidity: function increaseAllowance(address spender, uint256 addedValue) returns(bool)
func (_BackingEigen *BackingEigenTransactor) IncreaseAllowance(opts *bind.TransactOpts, spender common.Address, addedValue *big.Int) (*types.Transaction, error)
⋮----
// Initialize is a paid mutator transaction binding the contract method 0xc4d66de8.
⋮----
// Solidity: function initialize(address initialOwner) returns()
func (_BackingEigen *BackingEigenTransactor) Initialize(opts *bind.TransactOpts, initialOwner common.Address) (*types.Transaction, error)
⋮----
// Mint is a paid mutator transaction binding the contract method 0x40c10f19.
⋮----
// Solidity: function mint(address to, uint256 amount) returns()
func (_BackingEigen *BackingEigenTransactor) Mint(opts *bind.TransactOpts, to common.Address, amount *big.Int) (*types.Transaction, error)
⋮----
// Permit is a paid mutator transaction binding the contract method 0xd505accf.
⋮----
// Solidity: function permit(address owner, address spender, uint256 value, uint256 deadline, uint8 v, bytes32 r, bytes32 s) returns()
func (_BackingEigen *BackingEigenTransactor) Permit(opts *bind.TransactOpts, owner common.Address, spender common.Address, value *big.Int, deadline *big.Int, v uint8, r [32]byte, s [32]byte) (*types.Transaction, error)
⋮----
// RenounceOwnership is a paid mutator transaction binding the contract method 0x715018a6.
⋮----
// Solidity: function renounceOwnership() returns()
func (_BackingEigen *BackingEigenTransactor) RenounceOwnership(opts *bind.TransactOpts) (*types.Transaction, error)
⋮----
// SetAllowedFrom is a paid mutator transaction binding the contract method 0x1ffacdef.
⋮----
// Solidity: function setAllowedFrom(address from, bool isAllowedFrom) returns()
func (_BackingEigen *BackingEigenTransactor) SetAllowedFrom(opts *bind.TransactOpts, from common.Address, isAllowedFrom bool) (*types.Transaction, error)
⋮----
// SetAllowedTo is a paid mutator transaction binding the contract method 0xb8c25594.
⋮----
// Solidity: function setAllowedTo(address to, bool isAllowedTo) returns()
func (_BackingEigen *BackingEigenTransactor) SetAllowedTo(opts *bind.TransactOpts, to common.Address, isAllowedTo bool) (*types.Transaction, error)
⋮----
// SetIsMinter is a paid mutator transaction binding the contract method 0x66eb399f.
⋮----
// Solidity: function setIsMinter(address minterAddress, bool newStatus) returns()
func (_BackingEigen *BackingEigenTransactor) SetIsMinter(opts *bind.TransactOpts, minterAddress common.Address, newStatus bool) (*types.Transaction, error)
⋮----
// Transfer is a paid mutator transaction binding the contract method 0xa9059cbb.
⋮----
// Solidity: function transfer(address to, uint256 amount) returns(bool)
⋮----
// TransferFrom is a paid mutator transaction binding the contract method 0x23b872dd.
⋮----
// Solidity: function transferFrom(address from, address to, uint256 amount) returns(bool)
func (_BackingEigen *BackingEigenTransactor) TransferFrom(opts *bind.TransactOpts, from common.Address, to common.Address, amount *big.Int) (*types.Transaction, error)
⋮----
// TransferOwnership is a paid mutator transaction binding the contract method 0xf2fde38b.
⋮----
// Solidity: function transferOwnership(address newOwner) returns()
func (_BackingEigen *BackingEigenTransactor) TransferOwnership(opts *bind.TransactOpts, newOwner common.Address) (*types.Transaction, error)
⋮----
// BackingEigenApprovalIterator is returned from FilterApproval and is used to iterate over the raw logs and unpacked data for Approval events raised by the BackingEigen contract.
type BackingEigenApprovalIterator struct {
	Event *BackingEigenApproval // 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
}
⋮----
Event *BackingEigenApproval // 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 *BackingEigenApprovalIterator) Next() bool
⋮----
// If the iterator failed, stop iterating
⋮----
// If the iterator completed, deliver directly whatever's available
⋮----
// Iterator still in progress, wait for either a data or an error event
⋮----
// Error returns any retrieval or parsing error occurred during filtering.
func (it *BackingEigenApprovalIterator) Error() error
⋮----
// Close terminates the iteration process, releasing any pending underlying
// resources.
func (it *BackingEigenApprovalIterator) Close() error
⋮----
// BackingEigenApproval represents a Approval event raised by the BackingEigen contract.
type BackingEigenApproval struct {
	Owner   common.Address
	Spender common.Address
	Value   *big.Int
	Raw     types.Log // Blockchain specific contextual infos
}
⋮----
Raw     types.Log // Blockchain specific contextual infos
⋮----
// FilterApproval is a free log retrieval operation binding the contract event 0x8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925.
⋮----
// Solidity: event Approval(address indexed owner, address indexed spender, uint256 value)
func (_BackingEigen *BackingEigenFilterer) FilterApproval(opts *bind.FilterOpts, owner []common.Address, spender []common.Address) (*BackingEigenApprovalIterator, error)
⋮----
var ownerRule []interface{}
⋮----
var spenderRule []interface{}
⋮----
// WatchApproval is a free log subscription operation binding the contract event 0x8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925.
⋮----
func (_BackingEigen *BackingEigenFilterer) WatchApproval(opts *bind.WatchOpts, sink chan<- *BackingEigenApproval, owner []common.Address, spender []common.Address) (event.Subscription, error)
⋮----
// New log arrived, parse the event and forward to the user
⋮----
// ParseApproval is a log parse operation binding the contract event 0x8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925.
⋮----
func (_BackingEigen *BackingEigenFilterer) ParseApproval(log types.Log) (*BackingEigenApproval, error)
⋮----
// BackingEigenBackedIterator is returned from FilterBacked and is used to iterate over the raw logs and unpacked data for Backed events raised by the BackingEigen contract.
type BackingEigenBackedIterator struct {
	Event *BackingEigenBacked // 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
}
⋮----
Event *BackingEigenBacked // Event containing the contract specifics and raw log
⋮----
// BackingEigenBacked represents a Backed event raised by the BackingEigen contract.
type BackingEigenBacked struct {
	Raw types.Log // Blockchain specific contextual infos
}
⋮----
Raw types.Log // Blockchain specific contextual infos
⋮----
// FilterBacked is a free log retrieval operation binding the contract event 0xb7c23c1e2e36f298e9879a88ecfcd07e28fbb439bcfa9c78ca1363ca14370d26.
⋮----
// Solidity: event Backed()
func (_BackingEigen *BackingEigenFilterer) FilterBacked(opts *bind.FilterOpts) (*BackingEigenBackedIterator, error)
⋮----
// WatchBacked is a free log subscription operation binding the contract event 0xb7c23c1e2e36f298e9879a88ecfcd07e28fbb439bcfa9c78ca1363ca14370d26.
⋮----
func (_BackingEigen *BackingEigenFilterer) WatchBacked(opts *bind.WatchOpts, sink chan<- *BackingEigenBacked) (event.Subscription, error)
⋮----
// ParseBacked is a log parse operation binding the contract event 0xb7c23c1e2e36f298e9879a88ecfcd07e28fbb439bcfa9c78ca1363ca14370d26.
⋮----
func (_BackingEigen *BackingEigenFilterer) ParseBacked(log types.Log) (*BackingEigenBacked, error)
⋮----
// BackingEigenDelegateChangedIterator is returned from FilterDelegateChanged and is used to iterate over the raw logs and unpacked data for DelegateChanged events raised by the BackingEigen contract.
type BackingEigenDelegateChangedIterator struct {
	Event *BackingEigenDelegateChanged // 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
}
⋮----
Event *BackingEigenDelegateChanged // Event containing the contract specifics and raw log
⋮----
// BackingEigenDelegateChanged represents a DelegateChanged event raised by the BackingEigen contract.
type BackingEigenDelegateChanged struct {
	Delegator    common.Address
	FromDelegate common.Address
	ToDelegate   common.Address
	Raw          types.Log // Blockchain specific contextual infos
}
⋮----
Raw          types.Log // Blockchain specific contextual infos
⋮----
// FilterDelegateChanged is a free log retrieval operation binding the contract event 0x3134e8a2e6d97e929a7e54011ea5485d7d196dd5f0ba4d4ef95803e8e3fc257f.
⋮----
// Solidity: event DelegateChanged(address indexed delegator, address indexed fromDelegate, address indexed toDelegate)
func (_BackingEigen *BackingEigenFilterer) FilterDelegateChanged(opts *bind.FilterOpts, delegator []common.Address, fromDelegate []common.Address, toDelegate []common.Address) (*BackingEigenDelegateChangedIterator, error)
⋮----
var delegatorRule []interface{}
⋮----
var fromDelegateRule []interface{}
⋮----
var toDelegateRule []interface{}
⋮----
// WatchDelegateChanged is a free log subscription operation binding the contract event 0x3134e8a2e6d97e929a7e54011ea5485d7d196dd5f0ba4d4ef95803e8e3fc257f.
⋮----
func (_BackingEigen *BackingEigenFilterer) WatchDelegateChanged(opts *bind.WatchOpts, sink chan<- *BackingEigenDelegateChanged, delegator []common.Address, fromDelegate []common.Address, toDelegate []common.Address) (event.Subscription, error)
⋮----
// ParseDelegateChanged is a log parse operation binding the contract event 0x3134e8a2e6d97e929a7e54011ea5485d7d196dd5f0ba4d4ef95803e8e3fc257f.
⋮----
func (_BackingEigen *BackingEigenFilterer) ParseDelegateChanged(log types.Log) (*BackingEigenDelegateChanged, error)
⋮----
// BackingEigenDelegateVotesChangedIterator is returned from FilterDelegateVotesChanged and is used to iterate over the raw logs and unpacked data for DelegateVotesChanged events raised by the BackingEigen contract.
type BackingEigenDelegateVotesChangedIterator struct {
	Event *BackingEigenDelegateVotesChanged // 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
}
⋮----
Event *BackingEigenDelegateVotesChanged // Event containing the contract specifics and raw log
⋮----
// BackingEigenDelegateVotesChanged represents a DelegateVotesChanged event raised by the BackingEigen contract.
type BackingEigenDelegateVotesChanged struct {
	Delegate        common.Address
	PreviousBalance *big.Int
	NewBalance      *big.Int
	Raw             types.Log // Blockchain specific contextual infos
}
⋮----
Raw             types.Log // Blockchain specific contextual infos
⋮----
// FilterDelegateVotesChanged is a free log retrieval operation binding the contract event 0xdec2bacdd2f05b59de34da9b523dff8be42e5e38e818c82fdb0bae774387a724.
⋮----
// Solidity: event DelegateVotesChanged(address indexed delegate, uint256 previousBalance, uint256 newBalance)
func (_BackingEigen *BackingEigenFilterer) FilterDelegateVotesChanged(opts *bind.FilterOpts, delegate []common.Address) (*BackingEigenDelegateVotesChangedIterator, error)
⋮----
var delegateRule []interface{}
⋮----
// WatchDelegateVotesChanged is a free log subscription operation binding the contract event 0xdec2bacdd2f05b59de34da9b523dff8be42e5e38e818c82fdb0bae774387a724.
⋮----
func (_BackingEigen *BackingEigenFilterer) WatchDelegateVotesChanged(opts *bind.WatchOpts, sink chan<- *BackingEigenDelegateVotesChanged, delegate []common.Address) (event.Subscription, error)
⋮----
// ParseDelegateVotesChanged is a log parse operation binding the contract event 0xdec2bacdd2f05b59de34da9b523dff8be42e5e38e818c82fdb0bae774387a724.
⋮----
func (_BackingEigen *BackingEigenFilterer) ParseDelegateVotesChanged(log types.Log) (*BackingEigenDelegateVotesChanged, error)
⋮----
// BackingEigenEIP712DomainChangedIterator is returned from FilterEIP712DomainChanged and is used to iterate over the raw logs and unpacked data for EIP712DomainChanged events raised by the BackingEigen contract.
type BackingEigenEIP712DomainChangedIterator struct {
	Event *BackingEigenEIP712DomainChanged // 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
}
⋮----
Event *BackingEigenEIP712DomainChanged // Event containing the contract specifics and raw log
⋮----
// BackingEigenEIP712DomainChanged represents a EIP712DomainChanged event raised by the BackingEigen contract.
type BackingEigenEIP712DomainChanged struct {
	Raw types.Log // Blockchain specific contextual infos
}
⋮----
// FilterEIP712DomainChanged is a free log retrieval operation binding the contract event 0x0a6387c9ea3628b88a633bb4f3b151770f70085117a15f9bf3787cda53f13d31.
⋮----
// Solidity: event EIP712DomainChanged()
func (_BackingEigen *BackingEigenFilterer) FilterEIP712DomainChanged(opts *bind.FilterOpts) (*BackingEigenEIP712DomainChangedIterator, error)
⋮----
// WatchEIP712DomainChanged is a free log subscription operation binding the contract event 0x0a6387c9ea3628b88a633bb4f3b151770f70085117a15f9bf3787cda53f13d31.
⋮----
func (_BackingEigen *BackingEigenFilterer) WatchEIP712DomainChanged(opts *bind.WatchOpts, sink chan<- *BackingEigenEIP712DomainChanged) (event.Subscription, error)
⋮----
// ParseEIP712DomainChanged is a log parse operation binding the contract event 0x0a6387c9ea3628b88a633bb4f3b151770f70085117a15f9bf3787cda53f13d31.
⋮----
func (_BackingEigen *BackingEigenFilterer) ParseEIP712DomainChanged(log types.Log) (*BackingEigenEIP712DomainChanged, error)
⋮----
// BackingEigenInitializedIterator is returned from FilterInitialized and is used to iterate over the raw logs and unpacked data for Initialized events raised by the BackingEigen contract.
type BackingEigenInitializedIterator struct {
	Event *BackingEigenInitialized // 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
}
⋮----
Event *BackingEigenInitialized // Event containing the contract specifics and raw log
⋮----
// BackingEigenInitialized represents a Initialized event raised by the BackingEigen contract.
type BackingEigenInitialized 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 (_BackingEigen *BackingEigenFilterer) FilterInitialized(opts *bind.FilterOpts) (*BackingEigenInitializedIterator, error)
⋮----
// WatchInitialized is a free log subscription operation binding the contract event 0x7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb3847402498.
⋮----
func (_BackingEigen *BackingEigenFilterer) WatchInitialized(opts *bind.WatchOpts, sink chan<- *BackingEigenInitialized) (event.Subscription, error)
⋮----
// ParseInitialized is a log parse operation binding the contract event 0x7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb3847402498.
⋮----
func (_BackingEigen *BackingEigenFilterer) ParseInitialized(log types.Log) (*BackingEigenInitialized, error)
⋮----
// BackingEigenIsMinterModifiedIterator is returned from FilterIsMinterModified and is used to iterate over the raw logs and unpacked data for IsMinterModified events raised by the BackingEigen contract.
type BackingEigenIsMinterModifiedIterator struct {
	Event *BackingEigenIsMinterModified // 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
}
⋮----
Event *BackingEigenIsMinterModified // Event containing the contract specifics and raw log
⋮----
// BackingEigenIsMinterModified represents a IsMinterModified event raised by the BackingEigen contract.
type BackingEigenIsMinterModified struct {
	MinterAddress common.Address
	NewStatus     bool
	Raw           types.Log // Blockchain specific contextual infos
}
⋮----
Raw           types.Log // Blockchain specific contextual infos
⋮----
// FilterIsMinterModified is a free log retrieval operation binding the contract event 0x0124b12503bddc2616c0f3f54fd23ed283f5ef0c1483a75409e42612176b8bde.
⋮----
// Solidity: event IsMinterModified(address indexed minterAddress, bool newStatus)
func (_BackingEigen *BackingEigenFilterer) FilterIsMinterModified(opts *bind.FilterOpts, minterAddress []common.Address) (*BackingEigenIsMinterModifiedIterator, error)
⋮----
var minterAddressRule []interface{}
⋮----
// WatchIsMinterModified is a free log subscription operation binding the contract event 0x0124b12503bddc2616c0f3f54fd23ed283f5ef0c1483a75409e42612176b8bde.
⋮----
func (_BackingEigen *BackingEigenFilterer) WatchIsMinterModified(opts *bind.WatchOpts, sink chan<- *BackingEigenIsMinterModified, minterAddress []common.Address) (event.Subscription, error)
⋮----
// ParseIsMinterModified is a log parse operation binding the contract event 0x0124b12503bddc2616c0f3f54fd23ed283f5ef0c1483a75409e42612176b8bde.
⋮----
func (_BackingEigen *BackingEigenFilterer) ParseIsMinterModified(log types.Log) (*BackingEigenIsMinterModified, error)
⋮----
// BackingEigenOwnershipTransferredIterator is returned from FilterOwnershipTransferred and is used to iterate over the raw logs and unpacked data for OwnershipTransferred events raised by the BackingEigen contract.
type BackingEigenOwnershipTransferredIterator struct {
	Event *BackingEigenOwnershipTransferred // 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
}
⋮----
Event *BackingEigenOwnershipTransferred // Event containing the contract specifics and raw log
⋮----
// BackingEigenOwnershipTransferred represents a OwnershipTransferred event raised by the BackingEigen contract.
type BackingEigenOwnershipTransferred 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 (_BackingEigen *BackingEigenFilterer) FilterOwnershipTransferred(opts *bind.FilterOpts, previousOwner []common.Address, newOwner []common.Address) (*BackingEigenOwnershipTransferredIterator, error)
⋮----
var previousOwnerRule []interface{}
⋮----
var newOwnerRule []interface{}
⋮----
// WatchOwnershipTransferred is a free log subscription operation binding the contract event 0x8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0.
⋮----
func (_BackingEigen *BackingEigenFilterer) WatchOwnershipTransferred(opts *bind.WatchOpts, sink chan<- *BackingEigenOwnershipTransferred, previousOwner []common.Address, newOwner []common.Address) (event.Subscription, error)
⋮----
// ParseOwnershipTransferred is a log parse operation binding the contract event 0x8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0.
⋮----
func (_BackingEigen *BackingEigenFilterer) ParseOwnershipTransferred(log types.Log) (*BackingEigenOwnershipTransferred, error)
⋮----
// BackingEigenSetAllowedFromIterator is returned from FilterSetAllowedFrom and is used to iterate over the raw logs and unpacked data for SetAllowedFrom events raised by the BackingEigen contract.
type BackingEigenSetAllowedFromIterator struct {
	Event *BackingEigenSetAllowedFrom // 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
}
⋮----
Event *BackingEigenSetAllowedFrom // Event containing the contract specifics and raw log
⋮----
// BackingEigenSetAllowedFrom represents a SetAllowedFrom event raised by the BackingEigen contract.
type BackingEigenSetAllowedFrom struct {
	From          common.Address
	IsAllowedFrom bool
	Raw           types.Log // Blockchain specific contextual infos
}
⋮----
// FilterSetAllowedFrom is a free log retrieval operation binding the contract event 0xcf20b1ecb604b0e8888d579c64e8a3b10e590d45c1c2dddb393bed2843622271.
⋮----
// Solidity: event SetAllowedFrom(address indexed from, bool isAllowedFrom)
func (_BackingEigen *BackingEigenFilterer) FilterSetAllowedFrom(opts *bind.FilterOpts, from []common.Address) (*BackingEigenSetAllowedFromIterator, error)
⋮----
var fromRule []interface{}
⋮----
// WatchSetAllowedFrom is a free log subscription operation binding the contract event 0xcf20b1ecb604b0e8888d579c64e8a3b10e590d45c1c2dddb393bed2843622271.
⋮----
func (_BackingEigen *BackingEigenFilterer) WatchSetAllowedFrom(opts *bind.WatchOpts, sink chan<- *BackingEigenSetAllowedFrom, from []common.Address) (event.Subscription, error)
⋮----
// ParseSetAllowedFrom is a log parse operation binding the contract event 0xcf20b1ecb604b0e8888d579c64e8a3b10e590d45c1c2dddb393bed2843622271.
⋮----
func (_BackingEigen *BackingEigenFilterer) ParseSetAllowedFrom(log types.Log) (*BackingEigenSetAllowedFrom, error)
⋮----
// BackingEigenSetAllowedToIterator is returned from FilterSetAllowedTo and is used to iterate over the raw logs and unpacked data for SetAllowedTo events raised by the BackingEigen contract.
type BackingEigenSetAllowedToIterator struct {
	Event *BackingEigenSetAllowedTo // 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
}
⋮----
Event *BackingEigenSetAllowedTo // Event containing the contract specifics and raw log
⋮----
// BackingEigenSetAllowedTo represents a SetAllowedTo event raised by the BackingEigen contract.
type BackingEigenSetAllowedTo struct {
	To          common.Address
	IsAllowedTo bool
	Raw         types.Log // Blockchain specific contextual infos
}
⋮----
Raw         types.Log // Blockchain specific contextual infos
⋮----
// FilterSetAllowedTo is a free log retrieval operation binding the contract event 0x72a561d1af7409467dae4f1e9fc52590a9335a1dda17727e2b6aa8c4db35109b.
⋮----
// Solidity: event SetAllowedTo(address indexed to, bool isAllowedTo)
func (_BackingEigen *BackingEigenFilterer) FilterSetAllowedTo(opts *bind.FilterOpts, to []common.Address) (*BackingEigenSetAllowedToIterator, error)
⋮----
var toRule []interface{}
⋮----
// WatchSetAllowedTo is a free log subscription operation binding the contract event 0x72a561d1af7409467dae4f1e9fc52590a9335a1dda17727e2b6aa8c4db35109b.
⋮----
func (_BackingEigen *BackingEigenFilterer) WatchSetAllowedTo(opts *bind.WatchOpts, sink chan<- *BackingEigenSetAllowedTo, to []common.Address) (event.Subscription, error)
⋮----
// ParseSetAllowedTo is a log parse operation binding the contract event 0x72a561d1af7409467dae4f1e9fc52590a9335a1dda17727e2b6aa8c4db35109b.
⋮----
func (_BackingEigen *BackingEigenFilterer) ParseSetAllowedTo(log types.Log) (*BackingEigenSetAllowedTo, error)
⋮----
// BackingEigenTransferIterator is returned from FilterTransfer and is used to iterate over the raw logs and unpacked data for Transfer events raised by the BackingEigen contract.
type BackingEigenTransferIterator struct {
	Event *BackingEigenTransfer // 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
}
⋮----
Event *BackingEigenTransfer // Event containing the contract specifics and raw log
⋮----
// BackingEigenTransfer represents a Transfer event raised by the BackingEigen contract.
type BackingEigenTransfer struct {
	From  common.Address
	To    common.Address
	Value *big.Int
	Raw   types.Log // Blockchain specific contextual infos
}
⋮----
Raw   types.Log // Blockchain specific contextual infos
⋮----
// FilterTransfer is a free log retrieval operation binding the contract event 0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef.
⋮----
// Solidity: event Transfer(address indexed from, address indexed to, uint256 value)
func (_BackingEigen *BackingEigenFilterer) FilterTransfer(opts *bind.FilterOpts, from []common.Address, to []common.Address) (*BackingEigenTransferIterator, error)
⋮----
// WatchTransfer is a free log subscription operation binding the contract event 0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef.
⋮----
func (_BackingEigen *BackingEigenFilterer) WatchTransfer(opts *bind.WatchOpts, sink chan<- *BackingEigenTransfer, from []common.Address, to []common.Address) (event.Subscription, error)
⋮----
// ParseTransfer is a log parse operation binding the contract event 0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef.
⋮----
func (_BackingEigen *BackingEigenFilterer) ParseTransfer(log types.Log) (*BackingEigenTransfer, error)
⋮----
// BackingEigenTransferRestrictionsDisabledIterator is returned from FilterTransferRestrictionsDisabled and is used to iterate over the raw logs and unpacked data for TransferRestrictionsDisabled events raised by the BackingEigen contract.
type BackingEigenTransferRestrictionsDisabledIterator struct {
	Event *BackingEigenTransferRestrictionsDisabled // 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
}
⋮----
Event *BackingEigenTransferRestrictionsDisabled // Event containing the contract specifics and raw log
⋮----
// BackingEigenTransferRestrictionsDisabled represents a TransferRestrictionsDisabled event raised by the BackingEigen contract.
type BackingEigenTransferRestrictionsDisabled struct {
	Raw types.Log // Blockchain specific contextual infos
}
⋮----
// FilterTransferRestrictionsDisabled is a free log retrieval operation binding the contract event 0x2b18986d3ba809db2f13a5d7bf17f60d357b37d9cbb55dd71cbbac8dc4060f64.
⋮----
// Solidity: event TransferRestrictionsDisabled()
func (_BackingEigen *BackingEigenFilterer) FilterTransferRestrictionsDisabled(opts *bind.FilterOpts) (*BackingEigenTransferRestrictionsDisabledIterator, error)
⋮----
// WatchTransferRestrictionsDisabled is a free log subscription operation binding the contract event 0x2b18986d3ba809db2f13a5d7bf17f60d357b37d9cbb55dd71cbbac8dc4060f64.
⋮----
func (_BackingEigen *BackingEigenFilterer) WatchTransferRestrictionsDisabled(opts *bind.WatchOpts, sink chan<- *BackingEigenTransferRestrictionsDisabled) (event.Subscription, error)
⋮----
// ParseTransferRestrictionsDisabled is a log parse operation binding the contract event 0x2b18986d3ba809db2f13a5d7bf17f60d357b37d9cbb55dd71cbbac8dc4060f64.
⋮----
func (_BackingEigen *BackingEigenFilterer) ParseTransferRestrictionsDisabled(log types.Log) (*BackingEigenTransferRestrictionsDisabled, error)
````

## File: pkg/bindings/BeaconChainProofs/binding.go
````go
// Code generated - DO NOT EDIT.
// This file is a generated binding and any manual changes will be lost.
⋮----
package BeaconChainProofs
⋮----
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"
)
⋮----
"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
)
⋮----
// BeaconChainProofsMetaData contains all meta data concerning the BeaconChainProofs contract.
var BeaconChainProofsMetaData = &bind.MetaData{
	ABI: "[{\"type\":\"error\",\"name\":\"InvalidProof\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidProofLength\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidValidatorFieldsLength\",\"inputs\":[]}]",
	Bin: "0x60556032600b8282823980515f1a607314602657634e487b7160e01b5f525f60045260245ffd5b305f52607381538281f3fe730000000000000000000000000000000000000000301460806040525f5ffdfea26469706673582212202ed6c0259a8a2116b71d180dd3fa1bbeee51af433dc586314be978e5fbc4094064736f6c634300081e0033",
}
⋮----
// BeaconChainProofsABI is the input ABI used to generate the binding from.
// Deprecated: Use BeaconChainProofsMetaData.ABI instead.
var BeaconChainProofsABI = BeaconChainProofsMetaData.ABI
⋮----
// BeaconChainProofsBin is the compiled bytecode used for deploying new contracts.
// Deprecated: Use BeaconChainProofsMetaData.Bin instead.
var BeaconChainProofsBin = BeaconChainProofsMetaData.Bin
⋮----
// DeployBeaconChainProofs deploys a new Ethereum contract, binding an instance of BeaconChainProofs to it.
func DeployBeaconChainProofs(auth *bind.TransactOpts, backend bind.ContractBackend) (common.Address, *types.Transaction, *BeaconChainProofs, error)
⋮----
// BeaconChainProofs is an auto generated Go binding around an Ethereum contract.
type BeaconChainProofs struct {
	BeaconChainProofsCaller     // Read-only binding to the contract
	BeaconChainProofsTransactor // Write-only binding to the contract
	BeaconChainProofsFilterer   // Log filterer for contract events
}
⋮----
BeaconChainProofsCaller     // Read-only binding to the contract
BeaconChainProofsTransactor // Write-only binding to the contract
BeaconChainProofsFilterer   // Log filterer for contract events
⋮----
// BeaconChainProofsCaller is an auto generated read-only Go binding around an Ethereum contract.
type BeaconChainProofsCaller struct {
	contract *bind.BoundContract // Generic contract wrapper for the low level calls
}
⋮----
contract *bind.BoundContract // Generic contract wrapper for the low level calls
⋮----
// BeaconChainProofsTransactor is an auto generated write-only Go binding around an Ethereum contract.
type BeaconChainProofsTransactor struct {
	contract *bind.BoundContract // Generic contract wrapper for the low level calls
}
⋮----
// BeaconChainProofsFilterer is an auto generated log filtering Go binding around an Ethereum contract events.
type BeaconChainProofsFilterer struct {
	contract *bind.BoundContract // Generic contract wrapper for the low level calls
}
⋮----
// BeaconChainProofsSession is an auto generated Go binding around an Ethereum contract,
// with pre-set call and transact options.
type BeaconChainProofsSession struct {
	Contract     *BeaconChainProofs // 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
}
⋮----
Contract     *BeaconChainProofs // 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
⋮----
// BeaconChainProofsCallerSession is an auto generated read-only Go binding around an Ethereum contract,
// with pre-set call options.
type BeaconChainProofsCallerSession struct {
	Contract *BeaconChainProofsCaller // Generic contract caller binding to set the session for
	CallOpts bind.CallOpts            // Call options to use throughout this session
}
⋮----
Contract *BeaconChainProofsCaller // Generic contract caller binding to set the session for
CallOpts bind.CallOpts            // Call options to use throughout this session
⋮----
// BeaconChainProofsTransactorSession is an auto generated write-only Go binding around an Ethereum contract,
// with pre-set transact options.
type BeaconChainProofsTransactorSession struct {
	Contract     *BeaconChainProofsTransactor // Generic contract transactor binding to set the session for
	TransactOpts bind.TransactOpts            // Transaction auth options to use throughout this session
}
⋮----
Contract     *BeaconChainProofsTransactor // Generic contract transactor binding to set the session for
TransactOpts bind.TransactOpts            // Transaction auth options to use throughout this session
⋮----
// BeaconChainProofsRaw is an auto generated low-level Go binding around an Ethereum contract.
type BeaconChainProofsRaw struct {
	Contract *BeaconChainProofs // Generic contract binding to access the raw methods on
}
⋮----
Contract *BeaconChainProofs // Generic contract binding to access the raw methods on
⋮----
// BeaconChainProofsCallerRaw is an auto generated low-level read-only Go binding around an Ethereum contract.
type BeaconChainProofsCallerRaw struct {
	Contract *BeaconChainProofsCaller // Generic read-only contract binding to access the raw methods on
}
⋮----
Contract *BeaconChainProofsCaller // Generic read-only contract binding to access the raw methods on
⋮----
// BeaconChainProofsTransactorRaw is an auto generated low-level write-only Go binding around an Ethereum contract.
type BeaconChainProofsTransactorRaw struct {
	Contract *BeaconChainProofsTransactor // Generic write-only contract binding to access the raw methods on
}
⋮----
Contract *BeaconChainProofsTransactor // Generic write-only contract binding to access the raw methods on
⋮----
// NewBeaconChainProofs creates a new instance of BeaconChainProofs, bound to a specific deployed contract.
func NewBeaconChainProofs(address common.Address, backend bind.ContractBackend) (*BeaconChainProofs, error)
⋮----
// NewBeaconChainProofsCaller creates a new read-only instance of BeaconChainProofs, bound to a specific deployed contract.
func NewBeaconChainProofsCaller(address common.Address, caller bind.ContractCaller) (*BeaconChainProofsCaller, error)
⋮----
// NewBeaconChainProofsTransactor creates a new write-only instance of BeaconChainProofs, bound to a specific deployed contract.
func NewBeaconChainProofsTransactor(address common.Address, transactor bind.ContractTransactor) (*BeaconChainProofsTransactor, error)
⋮----
// NewBeaconChainProofsFilterer creates a new log filterer instance of BeaconChainProofs, bound to a specific deployed contract.
func NewBeaconChainProofsFilterer(address common.Address, filterer bind.ContractFilterer) (*BeaconChainProofsFilterer, error)
⋮----
// bindBeaconChainProofs binds a generic wrapper to an already deployed contract.
func bindBeaconChainProofs(address common.Address, caller bind.ContractCaller, transactor bind.ContractTransactor, filterer bind.ContractFilterer) (*bind.BoundContract, error)
⋮----
// 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 (_BeaconChainProofs *BeaconChainProofsRaw) Call(opts *bind.CallOpts, result *[]interface
⋮----
// Transfer initiates a plain transaction to move funds to the contract, calling
// its default method if one is available.
func (_BeaconChainProofs *BeaconChainProofsRaw) Transfer(opts *bind.TransactOpts) (*types.Transaction, error)
⋮----
// Transact invokes the (paid) contract method with params as input values.
func (_BeaconChainProofs *BeaconChainProofsRaw) Transact(opts *bind.TransactOpts, method string, params ...interface
````

## File: pkg/bindings/BN254/binding.go
````go
// Code generated - DO NOT EDIT.
// This file is a generated binding and any manual changes will be lost.
⋮----
package BN254
⋮----
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"
)
⋮----
"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
)
⋮----
// BN254MetaData contains all meta data concerning the BN254 contract.
var BN254MetaData = &bind.MetaData{
	ABI: "[{\"type\":\"error\",\"name\":\"ECAddFailed\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ECMulFailed\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ECPairingFailed\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ExpModFailed\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ScalarTooLarge\",\"inputs\":[]}]",
	Bin: "0x60556032600b8282823980515f1a607314602657634e487b7160e01b5f525f60045260245ffd5b305f52607381538281f3fe730000000000000000000000000000000000000000301460806040525f5ffdfea26469706673582212201d0d337e635f73102ddcee593e2237a05a00197e17c35efd8bdeae60b88c423764736f6c634300081e0033",
}
⋮----
// BN254ABI is the input ABI used to generate the binding from.
// Deprecated: Use BN254MetaData.ABI instead.
var BN254ABI = BN254MetaData.ABI
⋮----
// BN254Bin is the compiled bytecode used for deploying new contracts.
// Deprecated: Use BN254MetaData.Bin instead.
var BN254Bin = BN254MetaData.Bin
⋮----
// DeployBN254 deploys a new Ethereum contract, binding an instance of BN254 to it.
func DeployBN254(auth *bind.TransactOpts, backend bind.ContractBackend) (common.Address, *types.Transaction, *BN254, error)
⋮----
// BN254 is an auto generated Go binding around an Ethereum contract.
type BN254 struct {
	BN254Caller     // Read-only binding to the contract
	BN254Transactor // Write-only binding to the contract
	BN254Filterer   // Log filterer for contract events
}
⋮----
BN254Caller     // Read-only binding to the contract
BN254Transactor // Write-only binding to the contract
BN254Filterer   // Log filterer for contract events
⋮----
// BN254Caller is an auto generated read-only Go binding around an Ethereum contract.
type BN254Caller struct {
	contract *bind.BoundContract // Generic contract wrapper for the low level calls
}
⋮----
contract *bind.BoundContract // Generic contract wrapper for the low level calls
⋮----
// BN254Transactor is an auto generated write-only Go binding around an Ethereum contract.
type BN254Transactor struct {
	contract *bind.BoundContract // Generic contract wrapper for the low level calls
}
⋮----
// BN254Filterer is an auto generated log filtering Go binding around an Ethereum contract events.
type BN254Filterer struct {
	contract *bind.BoundContract // Generic contract wrapper for the low level calls
}
⋮----
// BN254Session is an auto generated Go binding around an Ethereum contract,
// with pre-set call and transact options.
type BN254Session struct {
	Contract     *BN254            // 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
}
⋮----
Contract     *BN254            // 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
⋮----
// BN254CallerSession is an auto generated read-only Go binding around an Ethereum contract,
// with pre-set call options.
type BN254CallerSession struct {
	Contract *BN254Caller  // Generic contract caller binding to set the session for
	CallOpts bind.CallOpts // Call options to use throughout this session
}
⋮----
Contract *BN254Caller  // Generic contract caller binding to set the session for
CallOpts bind.CallOpts // Call options to use throughout this session
⋮----
// BN254TransactorSession is an auto generated write-only Go binding around an Ethereum contract,
// with pre-set transact options.
type BN254TransactorSession struct {
	Contract     *BN254Transactor  // Generic contract transactor binding to set the session for
	TransactOpts bind.TransactOpts // Transaction auth options to use throughout this session
}
⋮----
Contract     *BN254Transactor  // Generic contract transactor binding to set the session for
⋮----
// BN254Raw is an auto generated low-level Go binding around an Ethereum contract.
type BN254Raw struct {
	Contract *BN254 // Generic contract binding to access the raw methods on
}
⋮----
Contract *BN254 // Generic contract binding to access the raw methods on
⋮----
// BN254CallerRaw is an auto generated low-level read-only Go binding around an Ethereum contract.
type BN254CallerRaw struct {
	Contract *BN254Caller // Generic read-only contract binding to access the raw methods on
}
⋮----
Contract *BN254Caller // Generic read-only contract binding to access the raw methods on
⋮----
// BN254TransactorRaw is an auto generated low-level write-only Go binding around an Ethereum contract.
type BN254TransactorRaw struct {
	Contract *BN254Transactor // Generic write-only contract binding to access the raw methods on
}
⋮----
Contract *BN254Transactor // Generic write-only contract binding to access the raw methods on
⋮----
// NewBN254 creates a new instance of BN254, bound to a specific deployed contract.
func NewBN254(address common.Address, backend bind.ContractBackend) (*BN254, error)
⋮----
// NewBN254Caller creates a new read-only instance of BN254, bound to a specific deployed contract.
func NewBN254Caller(address common.Address, caller bind.ContractCaller) (*BN254Caller, error)
⋮----
// NewBN254Transactor creates a new write-only instance of BN254, bound to a specific deployed contract.
func NewBN254Transactor(address common.Address, transactor bind.ContractTransactor) (*BN254Transactor, error)
⋮----
// NewBN254Filterer creates a new log filterer instance of BN254, bound to a specific deployed contract.
func NewBN254Filterer(address common.Address, filterer bind.ContractFilterer) (*BN254Filterer, error)
⋮----
// bindBN254 binds a generic wrapper to an already deployed contract.
func bindBN254(address common.Address, caller bind.ContractCaller, transactor bind.ContractTransactor, filterer bind.ContractFilterer) (*bind.BoundContract, error)
⋮----
// 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 (_BN254 *BN254Raw) Call(opts *bind.CallOpts, result *[]interface
⋮----
// Transfer initiates a plain transaction to move funds to the contract, calling
// its default method if one is available.
func (_BN254 *BN254Raw) Transfer(opts *bind.TransactOpts) (*types.Transaction, error)
⋮----
// Transact invokes the (paid) contract method with params as input values.
func (_BN254 *BN254Raw) Transact(opts *bind.TransactOpts, method string, params ...interface
````

## File: pkg/bindings/BN254CertificateVerifier/binding.go
````go
// Code generated - DO NOT EDIT.
// This file is a generated binding and any manual changes will be lost.
⋮----
package BN254CertificateVerifier
⋮----
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"
)
⋮----
"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
)
⋮----
// BN254G1Point is an auto generated low-level Go binding around an user-defined struct.
type BN254G1Point struct {
	X *big.Int
	Y *big.Int
}
⋮----
// BN254G2Point is an auto generated low-level Go binding around an user-defined struct.
type BN254G2Point struct {
	X [2]*big.Int
	Y [2]*big.Int
}
⋮----
// IBN254CertificateVerifierTypesBN254Certificate is an auto generated low-level Go binding around an user-defined struct.
type IBN254CertificateVerifierTypesBN254Certificate struct {
	ReferenceTimestamp uint32
	MessageHash        [32]byte
	Signature          BN254G1Point
	Apk                BN254G2Point
	NonSignerWitnesses []IBN254CertificateVerifierTypesBN254OperatorInfoWitness
}
⋮----
// IBN254CertificateVerifierTypesBN254OperatorInfoWitness is an auto generated low-level Go binding around an user-defined struct.
type IBN254CertificateVerifierTypesBN254OperatorInfoWitness struct {
	OperatorIndex     uint32
	OperatorInfoProof []byte
	OperatorInfo      IOperatorTableCalculatorTypesBN254OperatorInfo
}
⋮----
// ICrossChainRegistryTypesOperatorSetConfig is an auto generated low-level Go binding around an user-defined struct.
type ICrossChainRegistryTypesOperatorSetConfig struct {
	Owner              common.Address
	MaxStalenessPeriod uint32
}
⋮----
// IOperatorTableCalculatorTypesBN254OperatorInfo is an auto generated low-level Go binding around an user-defined struct.
type IOperatorTableCalculatorTypesBN254OperatorInfo struct {
	Pubkey  BN254G1Point
	Weights []*big.Int
}
⋮----
// IOperatorTableCalculatorTypesBN254OperatorSetInfo is an auto generated low-level Go binding around an user-defined struct.
type IOperatorTableCalculatorTypesBN254OperatorSetInfo struct {
	OperatorInfoTreeRoot [32]byte
	NumOperators         *big.Int
	AggregatePubkey      BN254G1Point
	TotalWeights         []*big.Int
}
⋮----
// OperatorSet is an auto generated low-level Go binding around an user-defined struct.
type OperatorSet struct {
	Avs common.Address
	Id  uint32
}
⋮----
// BN254CertificateVerifierMetaData contains all meta data concerning the BN254CertificateVerifier contract.
var BN254CertificateVerifierMetaData = &bind.MetaData{
	ABI: "[{\"type\":\"constructor\",\"inputs\":[{\"name\":\"_operatorTableUpdater\",\"type\":\"address\",\"internalType\":\"contractIOperatorTableUpdater\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"OPERATOR_INFO_LEAF_SALT\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint8\",\"internalType\":\"uint8\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"OPERATOR_TABLE_LEAF_SALT\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint8\",\"internalType\":\"uint8\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"calculateCertificateDigest\",\"inputs\":[{\"name\":\"referenceTimestamp\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"messageHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"pure\"},{\"type\":\"function\",\"name\":\"calculateOperatorInfoLeaf\",\"inputs\":[{\"name\":\"operatorInfo\",\"type\":\"tuple\",\"internalType\":\"structIOperatorTableCalculatorTypes.BN254OperatorInfo\",\"components\":[{\"name\":\"pubkey\",\"type\":\"tuple\",\"internalType\":\"structBN254.G1Point\",\"components\":[{\"name\":\"X\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"Y\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]},{\"name\":\"weights\",\"type\":\"uint256[]\",\"internalType\":\"uint256[]\"}]}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"pure\"},{\"type\":\"function\",\"name\":\"calculateOperatorTableLeaf\",\"inputs\":[{\"name\":\"operatorTableBytes\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"pure\"},{\"type\":\"function\",\"name\":\"getNonsignerOperatorInfo\",\"inputs\":[{\"name\":\"operatorSet\",\"type\":\"tuple\",\"internalType\":\"structOperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]},{\"name\":\"referenceTimestamp\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"operatorIndex\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"tuple\",\"internalType\":\"structIOperatorTableCalculatorTypes.BN254OperatorInfo\",\"components\":[{\"name\":\"pubkey\",\"type\":\"tuple\",\"internalType\":\"structBN254.G1Point\",\"components\":[{\"name\":\"X\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"Y\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]},{\"name\":\"weights\",\"type\":\"uint256[]\",\"internalType\":\"uint256[]\"}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getOperatorCount\",\"inputs\":[{\"name\":\"operatorSet\",\"type\":\"tuple\",\"internalType\":\"structOperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]},{\"name\":\"referenceTimestamp\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getOperatorSetInfo\",\"inputs\":[{\"name\":\"operatorSet\",\"type\":\"tuple\",\"internalType\":\"structOperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]},{\"name\":\"referenceTimestamp\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"tuple\",\"internalType\":\"structIOperatorTableCalculatorTypes.BN254OperatorSetInfo\",\"components\":[{\"name\":\"operatorInfoTreeRoot\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"numOperators\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"aggregatePubkey\",\"type\":\"tuple\",\"internalType\":\"structBN254.G1Point\",\"components\":[{\"name\":\"X\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"Y\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]},{\"name\":\"totalWeights\",\"type\":\"uint256[]\",\"internalType\":\"uint256[]\"}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getOperatorSetOwner\",\"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\":\"getTotalStakeWeights\",\"inputs\":[{\"name\":\"operatorSet\",\"type\":\"tuple\",\"internalType\":\"structOperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]},{\"name\":\"referenceTimestamp\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256[]\",\"internalType\":\"uint256[]\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"isNonsignerCached\",\"inputs\":[{\"name\":\"operatorSet\",\"type\":\"tuple\",\"internalType\":\"structOperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]},{\"name\":\"referenceTimestamp\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"operatorIndex\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"isReferenceTimestampSet\",\"inputs\":[{\"name\":\"operatorSet\",\"type\":\"tuple\",\"internalType\":\"structOperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]},{\"name\":\"referenceTimestamp\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"latestReferenceTimestamp\",\"inputs\":[{\"name\":\"operatorSet\",\"type\":\"tuple\",\"internalType\":\"structOperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]}],\"outputs\":[{\"name\":\"\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"maxOperatorTableStaleness\",\"inputs\":[{\"name\":\"operatorSet\",\"type\":\"tuple\",\"internalType\":\"structOperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]}],\"outputs\":[{\"name\":\"\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"operatorTableUpdater\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIOperatorTableUpdater\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"trySignatureVerification\",\"inputs\":[{\"name\":\"msgHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"aggPubkey\",\"type\":\"tuple\",\"internalType\":\"structBN254.G1Point\",\"components\":[{\"name\":\"X\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"Y\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]},{\"name\":\"apkG2\",\"type\":\"tuple\",\"internalType\":\"structBN254.G2Point\",\"components\":[{\"name\":\"X\",\"type\":\"uint256[2]\",\"internalType\":\"uint256[2]\"},{\"name\":\"Y\",\"type\":\"uint256[2]\",\"internalType\":\"uint256[2]\"}]},{\"name\":\"signature\",\"type\":\"tuple\",\"internalType\":\"structBN254.G1Point\",\"components\":[{\"name\":\"X\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"Y\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]}],\"outputs\":[{\"name\":\"pairingSuccessful\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"signatureValid\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"updateOperatorTable\",\"inputs\":[{\"name\":\"operatorSet\",\"type\":\"tuple\",\"internalType\":\"structOperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]},{\"name\":\"referenceTimestamp\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"operatorSetInfo\",\"type\":\"tuple\",\"internalType\":\"structIOperatorTableCalculatorTypes.BN254OperatorSetInfo\",\"components\":[{\"name\":\"operatorInfoTreeRoot\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"numOperators\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"aggregatePubkey\",\"type\":\"tuple\",\"internalType\":\"structBN254.G1Point\",\"components\":[{\"name\":\"X\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"Y\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]},{\"name\":\"totalWeights\",\"type\":\"uint256[]\",\"internalType\":\"uint256[]\"}]},{\"name\":\"operatorSetConfig\",\"type\":\"tuple\",\"internalType\":\"structICrossChainRegistryTypes.OperatorSetConfig\",\"components\":[{\"name\":\"owner\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"maxStalenessPeriod\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"verifyCertificate\",\"inputs\":[{\"name\":\"operatorSet\",\"type\":\"tuple\",\"internalType\":\"structOperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]},{\"name\":\"cert\",\"type\":\"tuple\",\"internalType\":\"structIBN254CertificateVerifierTypes.BN254Certificate\",\"components\":[{\"name\":\"referenceTimestamp\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"messageHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"signature\",\"type\":\"tuple\",\"internalType\":\"structBN254.G1Point\",\"components\":[{\"name\":\"X\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"Y\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]},{\"name\":\"apk\",\"type\":\"tuple\",\"internalType\":\"structBN254.G2Point\",\"components\":[{\"name\":\"X\",\"type\":\"uint256[2]\",\"internalType\":\"uint256[2]\"},{\"name\":\"Y\",\"type\":\"uint256[2]\",\"internalType\":\"uint256[2]\"}]},{\"name\":\"nonSignerWitnesses\",\"type\":\"tuple[]\",\"internalType\":\"structIBN254CertificateVerifierTypes.BN254OperatorInfoWitness[]\",\"components\":[{\"name\":\"operatorIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"operatorInfoProof\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"operatorInfo\",\"type\":\"tuple\",\"internalType\":\"structIOperatorTableCalculatorTypes.BN254OperatorInfo\",\"components\":[{\"name\":\"pubkey\",\"type\":\"tuple\",\"internalType\":\"structBN254.G1Point\",\"components\":[{\"name\":\"X\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"Y\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]},{\"name\":\"weights\",\"type\":\"uint256[]\",\"internalType\":\"uint256[]\"}]}]}]}],\"outputs\":[{\"name\":\"totalSignedStakeWeights\",\"type\":\"uint256[]\",\"internalType\":\"uint256[]\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"verifyCertificateNominal\",\"inputs\":[{\"name\":\"operatorSet\",\"type\":\"tuple\",\"internalType\":\"structOperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]},{\"name\":\"cert\",\"type\":\"tuple\",\"internalType\":\"structIBN254CertificateVerifierTypes.BN254Certificate\",\"components\":[{\"name\":\"referenceTimestamp\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"messageHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"signature\",\"type\":\"tuple\",\"internalType\":\"structBN254.G1Point\",\"components\":[{\"name\":\"X\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"Y\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]},{\"name\":\"apk\",\"type\":\"tuple\",\"internalType\":\"structBN254.G2Point\",\"components\":[{\"name\":\"X\",\"type\":\"uint256[2]\",\"internalType\":\"uint256[2]\"},{\"name\":\"Y\",\"type\":\"uint256[2]\",\"internalType\":\"uint256[2]\"}]},{\"name\":\"nonSignerWitnesses\",\"type\":\"tuple[]\",\"internalType\":\"structIBN254CertificateVerifierTypes.BN254OperatorInfoWitness[]\",\"components\":[{\"name\":\"operatorIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"operatorInfoProof\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"operatorInfo\",\"type\":\"tuple\",\"internalType\":\"structIOperatorTableCalculatorTypes.BN254OperatorInfo\",\"components\":[{\"name\":\"pubkey\",\"type\":\"tuple\",\"internalType\":\"structBN254.G1Point\",\"components\":[{\"name\":\"X\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"Y\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]},{\"name\":\"weights\",\"type\":\"uint256[]\",\"internalType\":\"uint256[]\"}]}]}]},{\"name\":\"totalStakeNominalThresholds\",\"type\":\"uint256[]\",\"internalType\":\"uint256[]\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"verifyCertificateProportion\",\"inputs\":[{\"name\":\"operatorSet\",\"type\":\"tuple\",\"internalType\":\"structOperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]},{\"name\":\"cert\",\"type\":\"tuple\",\"internalType\":\"structIBN254CertificateVerifierTypes.BN254Certificate\",\"components\":[{\"name\":\"referenceTimestamp\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"messageHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"signature\",\"type\":\"tuple\",\"internalType\":\"structBN254.G1Point\",\"components\":[{\"name\":\"X\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"Y\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]},{\"name\":\"apk\",\"type\":\"tuple\",\"internalType\":\"structBN254.G2Point\",\"components\":[{\"name\":\"X\",\"type\":\"uint256[2]\",\"internalType\":\"uint256[2]\"},{\"name\":\"Y\",\"type\":\"uint256[2]\",\"internalType\":\"uint256[2]\"}]},{\"name\":\"nonSignerWitnesses\",\"type\":\"tuple[]\",\"internalType\":\"structIBN254CertificateVerifierTypes.BN254OperatorInfoWitness[]\",\"components\":[{\"name\":\"operatorIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"operatorInfoProof\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"operatorInfo\",\"type\":\"tuple\",\"internalType\":\"structIOperatorTableCalculatorTypes.BN254OperatorInfo\",\"components\":[{\"name\":\"pubkey\",\"type\":\"tuple\",\"internalType\":\"structBN254.G1Point\",\"components\":[{\"name\":\"X\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"Y\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]},{\"name\":\"weights\",\"type\":\"uint256[]\",\"internalType\":\"uint256[]\"}]}]}]},{\"name\":\"totalStakeProportionThresholds\",\"type\":\"uint16[]\",\"internalType\":\"uint16[]\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"event\",\"name\":\"Initialized\",\"inputs\":[{\"name\":\"version\",\"type\":\"uint8\",\"indexed\":false,\"internalType\":\"uint8\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"MaxStalenessPeriodUpdated\",\"inputs\":[{\"name\":\"operatorSet\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structOperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]},{\"name\":\"maxStalenessPeriod\",\"type\":\"uint32\",\"indexed\":false,\"internalType\":\"uint32\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"OperatorSetOwnerUpdated\",\"inputs\":[{\"name\":\"operatorSet\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structOperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]},{\"name\":\"owner\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"TableUpdated\",\"inputs\":[{\"name\":\"operatorSet\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structOperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]},{\"name\":\"referenceTimestamp\",\"type\":\"uint32\",\"indexed\":false,\"internalType\":\"uint32\"},{\"name\":\"operatorSetInfo\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structIOperatorTableCalculatorTypes.BN254OperatorSetInfo\",\"components\":[{\"name\":\"operatorInfoTreeRoot\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"numOperators\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"aggregatePubkey\",\"type\":\"tuple\",\"internalType\":\"structBN254.G1Point\",\"components\":[{\"name\":\"X\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"Y\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]},{\"name\":\"totalWeights\",\"type\":\"uint256[]\",\"internalType\":\"uint256[]\"}]}],\"anonymous\":false},{\"type\":\"error\",\"name\":\"ArrayLengthMismatch\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"CertificateStale\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ECAddFailed\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ECMulFailed\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ECPairingFailed\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"EmptyRoot\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ExpModFailed\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidIndex\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidOperatorIndex\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidProofLength\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"NonSignerIndicesNotSorted\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"OnlyTableUpdater\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ReferenceTimestampDoesNotExist\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"RootDisabled\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"TableUpdateStale\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"VerificationFailed\",\"inputs\":[]}]",
	Bin: "0x60a060405234801561000f575f5ffd5b50604051612c1d380380612c1d83398101604081905261002e91610105565b6001600160a01b038116608052610043610049565b50610132565b5f54610100900460ff16156100b45760405162461bcd60e51b815260206004820152602760248201527f496e697469616c697a61626c653a20636f6e747261637420697320696e697469604482015266616c697a696e6760c81b606482015260840160405180910390fd5b5f5460ff90811614610103575f805460ff191660ff9081179091556040519081527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b565b5f60208284031215610115575f5ffd5b81516001600160a01b038116811461012b575f5ffd5b9392505050565b608051612ac56101585f395f8181610286015281816107d00152610f680152612ac55ff3fe608060405234801561000f575f5ffd5b5060043610610127575f3560e01c80636141879e116100a9578063a2c902f51161006e578063a2c902f5146102e6578063a2f2e24d146102ee578063cd83a72b14610301578063dd2ae1b914610314578063eb39e68f14610327575f5ffd5b80636141879e146102595780636738c40b1461026c57806368d6e081146102815780637d1d1f5b146102c057806384818920146102d3575f5ffd5b806323c2a3cb116100ef57806323c2a3cb146101d857806326af6a3c146101eb578063538a37901461020b5780635be872741461021e5780635ddb9b5b14610231575f5ffd5b8063017d79741461012b578063080b715014610153578063121409ea14610173578063184674341461018d5780631a18746c146101ae575b5f5ffd5b61013e6101393660046123ad565b610347565b60405190151581526020015b60405180910390f35b610166610161366004612488565b6104d8565b60405161014a91906124d3565b61017b608e81565b60405160ff909116815260200161014a565b6101a061019b36600461250a565b6104ed565b60405190815260200161014a565b6101c16101bc366004612532565b610550565b60408051921515835290151560208301520161014a565b6101a06101e6366004612580565b610571565b6101fe6101f93660046125b2565b6105a7565b60405161014a9190612627565b6101a0610219366004612654565b61065f565b61013e61022c3660046125b2565b6106ae565b61024461023f366004612685565b610779565b60405163ffffffff909116815260200161014a565b610244610267366004612685565b61079f565b61027f61027a3660046126b5565b6107c5565b005b6102a87f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b03909116815260200161014a565b6101666102ce366004612580565b6109ab565b6102a86102e1366004612685565b610a2b565b61017b607581565b6101a06102fc36600461276e565b610a54565b61013e61030f366004612580565b610a6b565b61013e6103223660046127da565b610aa1565b61033a610335366004612580565b610b34565b60405161014a9190612892565b5f5f6103538585610bf9565b90505f61035f86610d96565b5f8181526004602081815260408084208a5163ffffffff1685528252808420815160808101835281548152600182015481850152825180840184526002830154815260038301548186015281840152938101805483518186028101860190945280845296975094959394909360608601938301828280156103fd57602002820191905f5260205f20905b8154815260200190600101908083116103e9575b50505050508152505090505f8160600151905085518451146104325760405163512509d360e11b815260040160405180910390fd5b5f5b84518110156104c7575f612710888381518110610453576104536128a4565b602002602001015161ffff16848481518110610471576104716128a4565b602002602001015161048391906128cc565b61048d91906128f7565b9050808683815181106104a2576104a26128a4565b602002602001015110156104be575f96505050505050506104d1565b50600101610434565b5060019450505050505b9392505050565b60606104e48383610bf9565b90505b92915050565b604080517fd9f77a423768f4b0526fa60a7c732334516a93f1d228dce50ad804ea74ced36e602082015263ffffffff841691810191909152606081018290525f906080015b60405160208183030381529060405280519060200120905092915050565b5f5f61056486848787600162061a80610df9565b9150915094509492505050565b5f5f61057c84610d96565b5f90815260046020908152604080832063ffffffff8716845290915290206001015491505092915050565b6105af611d46565b5f6105b985610d96565b5f81815260056020908152604080832063ffffffff89168452825280832087845282529182902082516080810184528154818501908152600183015460608301528152600282018054855181860281018601909652808652959650909491938584019390929083018282801561064c57602002820191905f5260205f20905b815481526020019060010190808311610638575b5050505050815250509150509392505050565b5f6075826040516020016106739190612627565b60408051601f1981840301815290829052610691929160200161290a565b604051602081830303815290604052805190602001209050919050565b5f5f6106b985610d96565b5f81815260056020908152604080832063ffffffff8916845282528083208784528252808320815160808101835281548184019081526001830154606083015281526002820180548451818702810187019095528085529697509495909491938581019392919083018282801561074d57602002820191905f5260205f20905b815481526020019060010190808311610739575b505050919092525050815151919250501580159061076f575080516020015115155b9695505050505050565b5f5f61078483610d96565b5f9081526003602052604090205463ffffffff169392505050565b5f5f6107aa83610d96565b5f9081526002602052604090205463ffffffff169392505050565b336001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000161461080e5760405163030c1b6b60e11b815260040160405180910390fd5b5f61082661082136879003870187612685565b610d96565b5f8181526003602052604090205490915063ffffffff9081169085161161086057604051632f20889f60e01b815260040160405180910390fd5b5f81815260046020818152604080842063ffffffff891685528252928390208651815581870151600182015592860151805160028501558101516003840155606086015180518794936108b893908501920190611d70565b5050505f818152600360209081526040909120805463ffffffff191663ffffffff87161790556108ea90830183612933565b5f8281526001602090815260409182902080546001600160a01b0319166001600160a01b0394909416939093179092556109299190840190840161294c565b5f828152600260209081526040808320805463ffffffff191663ffffffff958616179055600682528083209388168352929052819020805460ff19166001179055517f93e6bea1c9b5dce4a5c07b00261e956df2a4a253d9ab6ca070ca2037d72ada9e9061099c90879087908790612965565b60405180910390a15050505050565b60605f6109b784610d96565b5f81815260046020818152604080842063ffffffff891685528252928390209091018054835181840281018401909452808452939450919290830182828015610a1d57602002820191905f5260205f20905b815481526020019060010190808311610a09575b505050505091505092915050565b5f5f610a3683610d96565b5f908152600160205260409020546001600160a01b03169392505050565b5f608e8383604051602001610532939291906129b1565b5f5f610a7684610d96565b5f90815260066020908152604080832063ffffffff8716845290915290205460ff1691505092915050565b5f5f610aad8585610bf9565b90508251815114610ad15760405163512509d360e11b815260040160405180910390fd5b5f5b8151811015610b2857838181518110610aee57610aee6128a4565b6020026020010151828281518110610b0857610b086128a4565b60200260200101511015610b20575f925050506104d1565b600101610ad3565b50600195945050505050565b610b3c611db9565b5f610b4684610d96565b5f81815260046020818152604080842063ffffffff8916855282529283902083516080810185528154815260018201548184015284518086018652600283015481526003830154818501528186015292810180548551818502810185019096528086529596509294909360608601939092909190830182828015610be757602002820191905f5260205f20905b815481526020019060010190808311610bd3575b50505050508152505091505092915050565b6060610c03611deb565b610c0c84610d96565b8082528351610c1b9190610ec1565b80515f908152600460208181526040808420875163ffffffff1685528252928390208351608081018552815481526001820154818401528451808601865260028301548152600383015481850152818601529281018054855181850281018501909652808652939491936060860193830182828015610cb757602002820191905f5260205f20905b815481526020019060010190808311610ca3575b505050919092525050506020820181905260600151516001600160401b03811115610ce457610ce4611f19565b604051908082528060200260200182016040528015610d0d578160200160208202803683370190505b5060408201525f5b81602001516060015151811015610d71578160200151606001518181518110610d4057610d406128a4565b602002602001015182604001518281518110610d5e57610d5e6128a4565b6020908102919091010152600101610d15565b50610d7c8184610ffb565b6060820152610d8b8184611158565b604001519392505050565b5f815f0151826020015163ffffffff16604051602001610de192919060609290921b6bffffffffffffffffffffffff1916825260a01b6001600160a01b031916601482015260200190565b6040516020818303038152906040526104e7906129d8565b5f5f5f610e05896111d7565b90505f610e148a89898c611261565b90505f610e2b610e248a84611315565b8b9061137d565b90505f610e6d610e6684610e606040805180820182525f80825260209182015281518083019092526001825260029082015290565b90611315565b859061137d565b90508715610e9257610e8982610e816113f1565b838c8b6114b1565b96509450610eb2565b610ea582610e9e6113f1565b838c6116c5565b95508515610eb257600194505b50505050965096945050505050565b5f8281526002602052604090205463ffffffff16801580610ef15750610ee781836129fb565b63ffffffff164211155b610f0e5760405163640fcd6b60e11b815260040160405180910390fd5b5f83815260066020908152604080832063ffffffff8616845290915290205460ff16610f4d57604051630cad17b760e31b815260040160405180910390fd5b60405163193877e160e21b815263ffffffff831660048201527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906364e1df8490602401602060405180830381865afa158015610fb5573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610fd99190612a17565b610ff657604051631b14174b60e01b815260040160405180910390fd5b505050565b6040805180820182525f80825260209182018190528251808401909352808352908201819052805b836080015151811015611150575f84608001518281518110611047576110476128a4565b602002602001015190505f82111561108357805163ffffffff80851691161161108357604051631d8c4d1760e31b815260040160405180910390fd5b6020808701510151815163ffffffff16106110b1576040516301fa53c760e11b815260040160405180910390fd5b855185515f916110c191846118fc565b80519091506110d190869061137d565b94505f5b8160200151518110156111435787604001515181101561113b5781602001518181518110611105576111056128a4565b602002602001015188604001518281518110611123576111236128a4565b602002602001018181516111379190612a36565b9052505b6001016110d5565b5050519150600101611023565b505092915050565b5f6111786111698460600151611a73565b6020850151604001519061137d565b90505f61118c835f015184602001516104ed565b90505f5f6111a4838587606001518860400151610550565b915091508180156111b25750805b6111cf5760405163439cc0cd60e01b815260040160405180910390fd5b505050505050565b604080518082019091525f80825260208201525f80806112045f516020612a705f395f51905f5286612a49565b90505b61121081611b09565b90935091505f516020612a705f395f51905f528283098303611248576040805180820190915290815260208101919091529392505050565b5f516020612a705f395f51905f52600182089050611207565b8251602080850151845180519083015186840151805190850151875188870151604080519889018e90528801989098526060870195909552608086019390935260a085019190915260c084015260e08301526101008201526101208101919091525f907f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000019061014001604051602081830303815290604052805190602001205f1c61130c9190612a49565b95945050505050565b604080518082019091525f8082526020820152611330611e30565b835181526020808501519082015260408082018490525f908360608460076107d05a03fa9050808061135e57fe5b508061115057604051632319df1960e11b815260040160405180910390fd5b604080518082019091525f8082526020820152611398611e4e565b835181526020808501518183015283516040808401919091529084015160608301525f908360808460066107d05a03fa905080806113d257fe5b50806111505760405163d4b68fd760e01b815260040160405180910390fd5b6113f9611e6c565b50604080516080810182527f198e9393920d483a7260bfb731fb5d25f1aa493335a9e71297e485b7aef312c28183019081527f1800deef121f1e76426a00665e5c4479674322d4f75edadd46debd5cd992f6ed6060830152815281518083019092527f275dc4a288d1afb3cbb1ac09187524c7db36395df7be3b99e673b13a075a65ec82527f1d9befcd05a5323e6da4d435f3b617cdb3af83285c2df711ef39c01571827f9d60208381019190915281019190915290565b6040805180820182528681526020808201869052825180840190935286835282018490525f918291906114e2611e8c565b5f5b6002811015611699575f6114f98260066128cc565b905084826002811061150d5761150d6128a4565b6020020151518361151e835f612a5c565b600c811061152e5761152e6128a4565b6020020152848260028110611545576115456128a4565b6020020151602001518382600161155c9190612a5c565b600c811061156c5761156c6128a4565b6020020152838260028110611583576115836128a4565b6020020151515183611596836002612a5c565b600c81106115a6576115a66128a4565b60200201528382600281106115bd576115bd6128a4565b60200201515160016020020151836115d6836003612a5c565b600c81106115e6576115e66128a4565b60200201528382600281106115fd576115fd6128a4565b6020020151602001515f60028110611617576116176128a4565b602002015183611628836004612a5c565b600c8110611638576116386128a4565b602002015283826002811061164f5761164f6128a4565b60200201516020015160016002811061166a5761166a6128a4565b60200201518361167b836005612a5c565b600c811061168b5761168b6128a4565b6020020152506001016114e4565b506116a2611eab565b5f6020826101808560088cfa9151919c9115159b50909950505050505050505050565b6040805180820182528581526020808201859052825180840190935285835282018390525f916116f3611e8c565b5f5b60028110156118aa575f61170a8260066128cc565b905084826002811061171e5761171e6128a4565b6020020151518361172f835f612a5c565b600c811061173f5761173f6128a4565b6020020152848260028110611756576117566128a4565b6020020151602001518382600161176d9190612a5c565b600c811061177d5761177d6128a4565b6020020152838260028110611794576117946128a4565b60200201515151836117a7836002612a5c565b600c81106117b7576117b76128a4565b60200201528382600281106117ce576117ce6128a4565b60200201515160016020020151836117e7836003612a5c565b600c81106117f7576117f76128a4565b602002015283826002811061180e5761180e6128a4565b6020020151602001515f60028110611828576118286128a4565b602002015183611839836004612a5c565b600c8110611849576118496128a4565b6020020152838260028110611860576118606128a4565b60200201516020015160016002811061187b5761187b6128a4565b60200201518361188c836005612a5c565b600c811061189c5761189c6128a4565b6020020152506001016116f5565b506118b3611eab565b5f6020826101808560086107d05a03fa905080806118cd57fe5b50806118ec576040516324ccc79360e21b815260040160405180910390fd5b5051151598975050505050505050565b611904611d46565b5f84815260056020908152604080832063ffffffff808816855290835281842086519091168452825280832081516080810183528154818401908152600183015460608301528152600282018054845181870281018701909552808552919492938584019390929083018282801561199957602002820191905f5260205f20905b815481526020019060010190808311611985575b5050509190925250508151519192505f9115159050806119bd575081516020015115155b905080611a66575f6119dd8787875f015188604001518960200151611b85565b9050806119fd5760405163439cc0cd60e01b815260040160405180910390fd5b6040808601515f8981526005602090815283822063ffffffff808c1684529082528483208a5190911683528152929020815180518255830151600182015582820151805192939192611a559260028501920190611d70565b509050508460400151935050611a6a565b8192505b50509392505050565b604080518082019091525f80825260208201528151158015611a9757506020820151155b15611ab4575050604080518082019091525f808252602082015290565b6040518060400160405280835f015181526020015f516020612a705f395f51905f528460200151611ae59190612a49565b611afc905f516020612a705f395f51905f52612a36565b905292915050565b919050565b5f80805f516020612a705f395f51905f5260035f516020612a705f395f51905f52865f516020612a705f395f51905f52888909090890505f611b79827f0c19139cb84c680a6e14116da060561765e05aa45a1c72a34f082305b61f3f525f516020612a705f395f51905f52611bd3565b91959194509092505050565b5f5f611b908461065f565b5f88815260046020908152604080832063ffffffff808c168552925290912054919250611bc7908590839085908a811690611c4c16565b98975050505050505050565b5f5f611bdd611eab565b611be5611ec9565b602080825281810181905260408201819052606082018890526080820187905260a082018690528260c08360056107d05a03fa92508280611c2257fe5b5082611c415760405163d51edae360e01b815260040160405180910390fd5b505195945050505050565b5f83611c6b576040516329e7276760e11b815260040160405180910390fd5b83611c77868585611c81565b1495945050505050565b5f83515f03611c915750816104d1565b60208451611c9f9190612a49565b15611cbd576040516313717da960e21b815260040160405180910390fd5b8260205b85518111611d1e57611cd4600285612a49565b5f03611cf557815f528086015160205260405f209150600284049350611d0c565b808601515f528160205260405f2091506002840493505b611d17602082612a5c565b9050611cc1565b508215611d3e576040516363df817160e01b815260040160405180910390fd5b949350505050565b604080516080810182525f91810182815260608201929092529081905b8152602001606081525090565b828054828255905f5260205f20908101928215611da9579160200282015b82811115611da9578251825591602001919060010190611d8e565b50611db5929150611ee7565b5090565b60405180608001604052805f81526020015f8152602001611d6360405180604001604052805f81526020015f81525090565b60405180608001604052805f8152602001611e04611db9565b815260200160608152602001611e2b60405180604001604052805f81526020015f81525090565b905290565b60405180606001604052806003906020820280368337509192915050565b60405180608001604052806004906020820280368337509192915050565b6040518060400160405280611e7f611efb565b8152602001611e2b611efb565b604051806101800160405280600c906020820280368337509192915050565b60405180602001604052806001906020820280368337509192915050565b6040518060c001604052806006906020820280368337509192915050565b5b80821115611db5575f8155600101611ee8565b60405180604001604052806002906020820280368337509192915050565b634e487b7160e01b5f52604160045260245ffd5b604080519081016001600160401b0381118282101715611f4f57611f4f611f19565b60405290565b60405160a081016001600160401b0381118282101715611f4f57611f4f611f19565b604051606081016001600160401b0381118282101715611f4f57611f4f611f19565b604051608081016001600160401b0381118282101715611f4f57611f4f611f19565b604051601f8201601f191681016001600160401b0381118282101715611fe357611fe3611f19565b604052919050565b80356001600160a01b0381168114611b04575f5ffd5b803563ffffffff81168114611b04575f5ffd5b5f60408284031215612024575f5ffd5b61202c611f2d565b905061203782611feb565b815261204560208301612001565b602082015292915050565b5f60408284031215612060575f5ffd5b612068611f2d565b823581526020928301359281019290925250919050565b5f82601f83011261208e575f5ffd5b612096611f2d565b8060408401858111156120a7575f5ffd5b845b818110156120c15780358452602093840193016120a9565b509095945050505050565b5f608082840312156120dc575f5ffd5b6120e4611f2d565b90506120f0838361207f565b8152612045836040840161207f565b5f6001600160401b0382111561211757612117611f19565b5060051b60200190565b5f82601f830112612130575f5ffd5b813561214361213e826120ff565b611fbb565b8082825260208201915060208360051b860101925085831115612164575f5ffd5b602085015b83811015612181578035835260209283019201612169565b5095945050505050565b5f6060828403121561219b575f5ffd5b6121a3611f2d565b90506121af8383612050565b815260408201356001600160401b038111156121c9575f5ffd5b6121d584828501612121565b60208301525092915050565b5f61012082840312156121f2575f5ffd5b6121fa611f55565b905061220582612001565b81526020828101359082015261221e8360408401612050565b604082015261223083608084016120cc565b60608201526101008201356001600160401b0381111561224e575f5ffd5b8201601f8101841361225e575f5ffd5b803561226c61213e826120ff565b8082825260208201915060208360051b85010192508683111561228d575f5ffd5b602084015b8381101561239d5780356001600160401b038111156122af575f5ffd5b85016060818a03601f190112156122c4575f5ffd5b6122cc611f77565b6122d860208301612001565b815260408201356001600160401b038111156122f2575f5ffd5b82016020810190603f018b13612306575f5ffd5b80356001600160401b0381111561231f5761231f611f19565b612332601f8201601f1916602001611fbb565b8181528c6020838501011115612346575f5ffd5b816020840160208301375f6020838301015280602085015250505060608201356001600160401b03811115612379575f5ffd5b6123888b60208386010161218b565b60408301525084525060209283019201612292565b5060808501525091949350505050565b5f5f5f608084860312156123bf575f5ffd5b6123c98585612014565b925060408401356001600160401b038111156123e3575f5ffd5b6123ef868287016121e1565b92505060608401356001600160401b0381111561240a575f5ffd5b8401601f8101861361241a575f5ffd5b803561242861213e826120ff565b8082825260208201915060208360051b850101925088831115612449575f5ffd5b6020840193505b8284101561247a57833561ffff81168114612469575f5ffd5b825260209384019390910190612450565b809450505050509250925092565b5f5f60608385031215612499575f5ffd5b6124a38484612014565b915060408301356001600160401b038111156124bd575f5ffd5b6124c9858286016121e1565b9150509250929050565b602080825282518282018190525f918401906040840190835b818110156120c15783518352602093840193909201916001016124ec565b5f5f6040838503121561251b575f5ffd5b61252483612001565b946020939093013593505050565b5f5f5f5f6101208587031215612546575f5ffd5b843593506125578660208701612050565b925061256686606087016120cc565b91506125758660e08701612050565b905092959194509250565b5f5f60608385031215612591575f5ffd5b61259b8484612014565b91506125a960408401612001565b90509250929050565b5f5f5f608084860312156125c4575f5ffd5b6125ce8585612014565b92506125dc60408501612001565b929592945050506060919091013590565b5f8151808452602084019350602083015f5b8281101561261d5781518652602095860195909101906001016125ff565b5093949350505050565b60208082528251805183830152015160408201525f6020830151606080840152611d3e60808401826125ed565b5f60208284031215612664575f5ffd5b81356001600160401b03811115612679575f5ffd5b611d3e8482850161218b565b5f60408284031215612695575f5ffd5b6104e48383612014565b5f604082840312156126af575f5ffd5b50919050565b5f5f5f5f60c085870312156126c8575f5ffd5b6126d2868661269f565b93506126e060408601612001565b925060608501356001600160401b038111156126fa575f5ffd5b850160a0818803121561270b575f5ffd5b612713611f99565b813581526020808301359082015261272e8860408401612050565b604082015260808201356001600160401b0381111561274b575f5ffd5b61275789828501612121565b60608301525092506125759050866080870161269f565b5f5f6020838503121561277f575f5ffd5b82356001600160401b03811115612794575f5ffd5b8301601f810185136127a4575f5ffd5b80356001600160401b038111156127b9575f5ffd5b8560208284010111156127ca575f5ffd5b6020919091019590945092505050565b5f5f5f608084860312156127ec575f5ffd5b6127f68585612014565b925060408401356001600160401b03811115612810575f5ffd5b61281c868287016121e1565b92505060608401356001600160401b03811115612837575f5ffd5b61284386828701612121565b9150509250925092565b80518252602081015160208301525f6040820151612878604085018280518252602090810151910152565b50606082015160a06080850152611d3e60a08501826125ed565b602081525f6104e4602083018461284d565b634e487b7160e01b5f52603260045260245ffd5b634e487b7160e01b5f52601160045260245ffd5b80820281158282048414176104e7576104e76128b8565b634e487b7160e01b5f52601260045260245ffd5b5f82612905576129056128e3565b500490565b60ff60f81b8360f81b1681525f82518060208501600185015e5f92016001019182525092915050565b5f60208284031215612943575f5ffd5b6104e482611feb565b5f6020828403121561295c575f5ffd5b6104e482612001565b6001600160a01b0361297685611feb565b16815263ffffffff61298a60208601612001565b16602082015263ffffffff83166040820152608060608201525f61130c608083018461284d565b60f884901b6001600160f81b0319168152818360018301375f910160010190815292915050565b805160208083015191908110156126af575f1960209190910360031b1b16919050565b63ffffffff81811683821601908111156104e7576104e76128b8565b5f60208284031215612a27575f5ffd5b815180151581146104d1575f5ffd5b818103818111156104e7576104e76128b8565b5f82612a5757612a576128e3565b500690565b808201808211156104e7576104e76128b856fe30644e72e131a029b85045b68181585d97816a916871ca8d3c208c16d87cfd47a264697066735822122056ea9f2b48634a572f886e8d58b2767c37a4d771c8a5d8656cc16493d5443d1b64736f6c634300081e0033",
}
⋮----
// BN254CertificateVerifierABI is the input ABI used to generate the binding from.
// Deprecated: Use BN254CertificateVerifierMetaData.ABI instead.
var BN254CertificateVerifierABI = BN254CertificateVerifierMetaData.ABI
⋮----
// BN254CertificateVerifierBin is the compiled bytecode used for deploying new contracts.
// Deprecated: Use BN254CertificateVerifierMetaData.Bin instead.
var BN254CertificateVerifierBin = BN254CertificateVerifierMetaData.Bin
⋮----
// DeployBN254CertificateVerifier deploys a new Ethereum contract, binding an instance of BN254CertificateVerifier to it.
func DeployBN254CertificateVerifier(auth *bind.TransactOpts, backend bind.ContractBackend, _operatorTableUpdater common.Address) (common.Address, *types.Transaction, *BN254CertificateVerifier, error)
⋮----
// BN254CertificateVerifier is an auto generated Go binding around an Ethereum contract.
type BN254CertificateVerifier struct {
	BN254CertificateVerifierCaller     // Read-only binding to the contract
	BN254CertificateVerifierTransactor // Write-only binding to the contract
	BN254CertificateVerifierFilterer   // Log filterer for contract events
}
⋮----
BN254CertificateVerifierCaller     // Read-only binding to the contract
BN254CertificateVerifierTransactor // Write-only binding to the contract
BN254CertificateVerifierFilterer   // Log filterer for contract events
⋮----
// BN254CertificateVerifierCaller is an auto generated read-only Go binding around an Ethereum contract.
type BN254CertificateVerifierCaller struct {
	contract *bind.BoundContract // Generic contract wrapper for the low level calls
}
⋮----
contract *bind.BoundContract // Generic contract wrapper for the low level calls
⋮----
// BN254CertificateVerifierTransactor is an auto generated write-only Go binding around an Ethereum contract.
type BN254CertificateVerifierTransactor struct {
	contract *bind.BoundContract // Generic contract wrapper for the low level calls
}
⋮----
// BN254CertificateVerifierFilterer is an auto generated log filtering Go binding around an Ethereum contract events.
type BN254CertificateVerifierFilterer struct {
	contract *bind.BoundContract // Generic contract wrapper for the low level calls
}
⋮----
// BN254CertificateVerifierSession is an auto generated Go binding around an Ethereum contract,
// with pre-set call and transact options.
type BN254CertificateVerifierSession struct {
	Contract     *BN254CertificateVerifier // 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
}
⋮----
Contract     *BN254CertificateVerifier // 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
⋮----
// BN254CertificateVerifierCallerSession is an auto generated read-only Go binding around an Ethereum contract,
// with pre-set call options.
type BN254CertificateVerifierCallerSession struct {
	Contract *BN254CertificateVerifierCaller // Generic contract caller binding to set the session for
	CallOpts bind.CallOpts                   // Call options to use throughout this session
}
⋮----
Contract *BN254CertificateVerifierCaller // Generic contract caller binding to set the session for
CallOpts bind.CallOpts                   // Call options to use throughout this session
⋮----
// BN254CertificateVerifierTransactorSession is an auto generated write-only Go binding around an Ethereum contract,
// with pre-set transact options.
type BN254CertificateVerifierTransactorSession struct {
	Contract     *BN254CertificateVerifierTransactor // Generic contract transactor binding to set the session for
	TransactOpts bind.TransactOpts                   // Transaction auth options to use throughout this session
}
⋮----
Contract     *BN254CertificateVerifierTransactor // Generic contract transactor binding to set the session for
TransactOpts bind.TransactOpts                   // Transaction auth options to use throughout this session
⋮----
// BN254CertificateVerifierRaw is an auto generated low-level Go binding around an Ethereum contract.
type BN254CertificateVerifierRaw struct {
	Contract *BN254CertificateVerifier // Generic contract binding to access the raw methods on
}
⋮----
Contract *BN254CertificateVerifier // Generic contract binding to access the raw methods on
⋮----
// BN254CertificateVerifierCallerRaw is an auto generated low-level read-only Go binding around an Ethereum contract.
type BN254CertificateVerifierCallerRaw struct {
	Contract *BN254CertificateVerifierCaller // Generic read-only contract binding to access the raw methods on
}
⋮----
Contract *BN254CertificateVerifierCaller // Generic read-only contract binding to access the raw methods on
⋮----
// BN254CertificateVerifierTransactorRaw is an auto generated low-level write-only Go binding around an Ethereum contract.
type BN254CertificateVerifierTransactorRaw struct {
	Contract *BN254CertificateVerifierTransactor // Generic write-only contract binding to access the raw methods on
}
⋮----
Contract *BN254CertificateVerifierTransactor // Generic write-only contract binding to access the raw methods on
⋮----
// NewBN254CertificateVerifier creates a new instance of BN254CertificateVerifier, bound to a specific deployed contract.
func NewBN254CertificateVerifier(address common.Address, backend bind.ContractBackend) (*BN254CertificateVerifier, error)
⋮----
// NewBN254CertificateVerifierCaller creates a new read-only instance of BN254CertificateVerifier, bound to a specific deployed contract.
func NewBN254CertificateVerifierCaller(address common.Address, caller bind.ContractCaller) (*BN254CertificateVerifierCaller, error)
⋮----
// NewBN254CertificateVerifierTransactor creates a new write-only instance of BN254CertificateVerifier, bound to a specific deployed contract.
func NewBN254CertificateVerifierTransactor(address common.Address, transactor bind.ContractTransactor) (*BN254CertificateVerifierTransactor, error)
⋮----
// NewBN254CertificateVerifierFilterer creates a new log filterer instance of BN254CertificateVerifier, bound to a specific deployed contract.
func NewBN254CertificateVerifierFilterer(address common.Address, filterer bind.ContractFilterer) (*BN254CertificateVerifierFilterer, error)
⋮----
// bindBN254CertificateVerifier binds a generic wrapper to an already deployed contract.
func bindBN254CertificateVerifier(address common.Address, caller bind.ContractCaller, transactor bind.ContractTransactor, filterer bind.ContractFilterer) (*bind.BoundContract, error)
⋮----
// 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 (_BN254CertificateVerifier *BN254CertificateVerifierRaw) Call(opts *bind.CallOpts, result *[]interface
⋮----
// Transfer initiates a plain transaction to move funds to the contract, calling
// its default method if one is available.
func (_BN254CertificateVerifier *BN254CertificateVerifierRaw) Transfer(opts *bind.TransactOpts) (*types.Transaction, error)
⋮----
// Transact invokes the (paid) contract method with params as input values.
func (_BN254CertificateVerifier *BN254CertificateVerifierRaw) Transact(opts *bind.TransactOpts, method string, params ...interface
⋮----
// OPERATORINFOLEAFSALT is a free data retrieval call binding the contract method 0xa2c902f5.
//
// Solidity: function OPERATOR_INFO_LEAF_SALT() view returns(uint8)
func (_BN254CertificateVerifier *BN254CertificateVerifierCaller) OPERATORINFOLEAFSALT(opts *bind.CallOpts) (uint8, error)
⋮----
var out []interface{}
⋮----
// OPERATORTABLELEAFSALT is a free data retrieval call binding the contract method 0x121409ea.
⋮----
// Solidity: function OPERATOR_TABLE_LEAF_SALT() view returns(uint8)
func (_BN254CertificateVerifier *BN254CertificateVerifierCaller) OPERATORTABLELEAFSALT(opts *bind.CallOpts) (uint8, error)
⋮----
// CalculateCertificateDigest is a free data retrieval call binding the contract method 0x18467434.
⋮----
// Solidity: function calculateCertificateDigest(uint32 referenceTimestamp, bytes32 messageHash) pure returns(bytes32)
func (_BN254CertificateVerifier *BN254CertificateVerifierCaller) CalculateCertificateDigest(opts *bind.CallOpts, referenceTimestamp uint32, messageHash [32]byte) ([32]byte, error)
⋮----
// CalculateOperatorInfoLeaf is a free data retrieval call binding the contract method 0x538a3790.
⋮----
// Solidity: function calculateOperatorInfoLeaf(((uint256,uint256),uint256[]) operatorInfo) pure returns(bytes32)
func (_BN254CertificateVerifier *BN254CertificateVerifierCaller) CalculateOperatorInfoLeaf(opts *bind.CallOpts, operatorInfo IOperatorTableCalculatorTypesBN254OperatorInfo) ([32]byte, error)
⋮----
// CalculateOperatorTableLeaf is a free data retrieval call binding the contract method 0xa2f2e24d.
⋮----
// Solidity: function calculateOperatorTableLeaf(bytes operatorTableBytes) pure returns(bytes32)
func (_BN254CertificateVerifier *BN254CertificateVerifierCaller) CalculateOperatorTableLeaf(opts *bind.CallOpts, operatorTableBytes []byte) ([32]byte, error)
⋮----
// GetNonsignerOperatorInfo is a free data retrieval call binding the contract method 0x26af6a3c.
⋮----
// Solidity: function getNonsignerOperatorInfo((address,uint32) operatorSet, uint32 referenceTimestamp, uint256 operatorIndex) view returns(((uint256,uint256),uint256[]))
func (_BN254CertificateVerifier *BN254CertificateVerifierCaller) GetNonsignerOperatorInfo(opts *bind.CallOpts, operatorSet OperatorSet, referenceTimestamp uint32, operatorIndex *big.Int) (IOperatorTableCalculatorTypesBN254OperatorInfo, error)
⋮----
// GetOperatorCount is a free data retrieval call binding the contract method 0x23c2a3cb.
⋮----
// Solidity: function getOperatorCount((address,uint32) operatorSet, uint32 referenceTimestamp) view returns(uint256)
func (_BN254CertificateVerifier *BN254CertificateVerifierCaller) GetOperatorCount(opts *bind.CallOpts, operatorSet OperatorSet, referenceTimestamp uint32) (*big.Int, error)
⋮----
// GetOperatorSetInfo is a free data retrieval call binding the contract method 0xeb39e68f.
⋮----
// Solidity: function getOperatorSetInfo((address,uint32) operatorSet, uint32 referenceTimestamp) view returns((bytes32,uint256,(uint256,uint256),uint256[]))
func (_BN254CertificateVerifier *BN254CertificateVerifierCaller) GetOperatorSetInfo(opts *bind.CallOpts, operatorSet OperatorSet, referenceTimestamp uint32) (IOperatorTableCalculatorTypesBN254OperatorSetInfo, error)
⋮----
// GetOperatorSetOwner is a free data retrieval call binding the contract method 0x84818920.
⋮----
// Solidity: function getOperatorSetOwner((address,uint32) operatorSet) view returns(address)
func (_BN254CertificateVerifier *BN254CertificateVerifierCaller) GetOperatorSetOwner(opts *bind.CallOpts, operatorSet OperatorSet) (common.Address, error)
⋮----
// GetTotalStakeWeights is a free data retrieval call binding the contract method 0x7d1d1f5b.
⋮----
// Solidity: function getTotalStakeWeights((address,uint32) operatorSet, uint32 referenceTimestamp) view returns(uint256[])
func (_BN254CertificateVerifier *BN254CertificateVerifierCaller) GetTotalStakeWeights(opts *bind.CallOpts, operatorSet OperatorSet, referenceTimestamp uint32) ([]*big.Int, error)
⋮----
// IsNonsignerCached is a free data retrieval call binding the contract method 0x5be87274.
⋮----
// Solidity: function isNonsignerCached((address,uint32) operatorSet, uint32 referenceTimestamp, uint256 operatorIndex) view returns(bool)
func (_BN254CertificateVerifier *BN254CertificateVerifierCaller) IsNonsignerCached(opts *bind.CallOpts, operatorSet OperatorSet, referenceTimestamp uint32, operatorIndex *big.Int) (bool, error)
⋮----
// IsReferenceTimestampSet is a free data retrieval call binding the contract method 0xcd83a72b.
⋮----
// Solidity: function isReferenceTimestampSet((address,uint32) operatorSet, uint32 referenceTimestamp) view returns(bool)
func (_BN254CertificateVerifier *BN254CertificateVerifierCaller) IsReferenceTimestampSet(opts *bind.CallOpts, operatorSet OperatorSet, referenceTimestamp uint32) (bool, error)
⋮----
// LatestReferenceTimestamp is a free data retrieval call binding the contract method 0x5ddb9b5b.
⋮----
// Solidity: function latestReferenceTimestamp((address,uint32) operatorSet) view returns(uint32)
func (_BN254CertificateVerifier *BN254CertificateVerifierCaller) LatestReferenceTimestamp(opts *bind.CallOpts, operatorSet OperatorSet) (uint32, error)
⋮----
// MaxOperatorTableStaleness is a free data retrieval call binding the contract method 0x6141879e.
⋮----
// Solidity: function maxOperatorTableStaleness((address,uint32) operatorSet) view returns(uint32)
func (_BN254CertificateVerifier *BN254CertificateVerifierCaller) MaxOperatorTableStaleness(opts *bind.CallOpts, operatorSet OperatorSet) (uint32, error)
⋮----
// OperatorTableUpdater is a free data retrieval call binding the contract method 0x68d6e081.
⋮----
// Solidity: function operatorTableUpdater() view returns(address)
func (_BN254CertificateVerifier *BN254CertificateVerifierCaller) OperatorTableUpdater(opts *bind.CallOpts) (common.Address, error)
⋮----
// TrySignatureVerification is a free data retrieval call binding the contract method 0x1a18746c.
⋮----
// Solidity: function trySignatureVerification(bytes32 msgHash, (uint256,uint256) aggPubkey, (uint256[2],uint256[2]) apkG2, (uint256,uint256) signature) view returns(bool pairingSuccessful, bool signatureValid)
func (_BN254CertificateVerifier *BN254CertificateVerifierCaller) TrySignatureVerification(opts *bind.CallOpts, msgHash [32]byte, aggPubkey BN254G1Point, apkG2 BN254G2Point, signature BN254G1Point) (struct
⋮----
// UpdateOperatorTable is a paid mutator transaction binding the contract method 0x6738c40b.
⋮----
// Solidity: function updateOperatorTable((address,uint32) operatorSet, uint32 referenceTimestamp, (bytes32,uint256,(uint256,uint256),uint256[]) operatorSetInfo, (address,uint32) operatorSetConfig) returns()
func (_BN254CertificateVerifier *BN254CertificateVerifierTransactor) UpdateOperatorTable(opts *bind.TransactOpts, operatorSet OperatorSet, referenceTimestamp uint32, operatorSetInfo IOperatorTableCalculatorTypesBN254OperatorSetInfo, operatorSetConfig ICrossChainRegistryTypesOperatorSetConfig) (*types.Transaction, error)
⋮----
// VerifyCertificate is a paid mutator transaction binding the contract method 0x080b7150.
⋮----
// Solidity: function verifyCertificate((address,uint32) operatorSet, (uint32,bytes32,(uint256,uint256),(uint256[2],uint256[2]),(uint32,bytes,((uint256,uint256),uint256[]))[]) cert) returns(uint256[] totalSignedStakeWeights)
func (_BN254CertificateVerifier *BN254CertificateVerifierTransactor) VerifyCertificate(opts *bind.TransactOpts, operatorSet OperatorSet, cert IBN254CertificateVerifierTypesBN254Certificate) (*types.Transaction, error)
⋮----
// VerifyCertificateNominal is a paid mutator transaction binding the contract method 0xdd2ae1b9.
⋮----
// Solidity: function verifyCertificateNominal((address,uint32) operatorSet, (uint32,bytes32,(uint256,uint256),(uint256[2],uint256[2]),(uint32,bytes,((uint256,uint256),uint256[]))[]) cert, uint256[] totalStakeNominalThresholds) returns(bool)
func (_BN254CertificateVerifier *BN254CertificateVerifierTransactor) VerifyCertificateNominal(opts *bind.TransactOpts, operatorSet OperatorSet, cert IBN254CertificateVerifierTypesBN254Certificate, totalStakeNominalThresholds []*big.Int) (*types.Transaction, error)
⋮----
// VerifyCertificateProportion is a paid mutator transaction binding the contract method 0x017d7974.
⋮----
// Solidity: function verifyCertificateProportion((address,uint32) operatorSet, (uint32,bytes32,(uint256,uint256),(uint256[2],uint256[2]),(uint32,bytes,((uint256,uint256),uint256[]))[]) cert, uint16[] totalStakeProportionThresholds) returns(bool)
func (_BN254CertificateVerifier *BN254CertificateVerifierTransactor) VerifyCertificateProportion(opts *bind.TransactOpts, operatorSet OperatorSet, cert IBN254CertificateVerifierTypesBN254Certificate, totalStakeProportionThresholds []uint16) (*types.Transaction, error)
⋮----
// BN254CertificateVerifierInitializedIterator is returned from FilterInitialized and is used to iterate over the raw logs and unpacked data for Initialized events raised by the BN254CertificateVerifier contract.
type BN254CertificateVerifierInitializedIterator struct {
	Event *BN254CertificateVerifierInitialized // 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
}
⋮----
Event *BN254CertificateVerifierInitialized // 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 *BN254CertificateVerifierInitializedIterator) Next() bool
⋮----
// If the iterator failed, stop iterating
⋮----
// If the iterator completed, deliver directly whatever's available
⋮----
// Iterator still in progress, wait for either a data or an error event
⋮----
// Error returns any retrieval or parsing error occurred during filtering.
func (it *BN254CertificateVerifierInitializedIterator) Error() error
⋮----
// Close terminates the iteration process, releasing any pending underlying
// resources.
func (it *BN254CertificateVerifierInitializedIterator) Close() error
⋮----
// BN254CertificateVerifierInitialized represents a Initialized event raised by the BN254CertificateVerifier contract.
type BN254CertificateVerifierInitialized struct {
	Version uint8
	Raw     types.Log // Blockchain specific contextual infos
}
⋮----
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 (_BN254CertificateVerifier *BN254CertificateVerifierFilterer) FilterInitialized(opts *bind.FilterOpts) (*BN254CertificateVerifierInitializedIterator, error)
⋮----
// WatchInitialized is a free log subscription operation binding the contract event 0x7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb3847402498.
⋮----
func (_BN254CertificateVerifier *BN254CertificateVerifierFilterer) WatchInitialized(opts *bind.WatchOpts, sink chan<- *BN254CertificateVerifierInitialized) (event.Subscription, error)
⋮----
// New log arrived, parse the event and forward to the user
⋮----
// ParseInitialized is a log parse operation binding the contract event 0x7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb3847402498.
⋮----
func (_BN254CertificateVerifier *BN254CertificateVerifierFilterer) ParseInitialized(log types.Log) (*BN254CertificateVerifierInitialized, error)
⋮----
// BN254CertificateVerifierMaxStalenessPeriodUpdatedIterator is returned from FilterMaxStalenessPeriodUpdated and is used to iterate over the raw logs and unpacked data for MaxStalenessPeriodUpdated events raised by the BN254CertificateVerifier contract.
type BN254CertificateVerifierMaxStalenessPeriodUpdatedIterator struct {
	Event *BN254CertificateVerifierMaxStalenessPeriodUpdated // 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
}
⋮----
Event *BN254CertificateVerifierMaxStalenessPeriodUpdated // Event containing the contract specifics and raw log
⋮----
// BN254CertificateVerifierMaxStalenessPeriodUpdated represents a MaxStalenessPeriodUpdated event raised by the BN254CertificateVerifier contract.
type BN254CertificateVerifierMaxStalenessPeriodUpdated struct {
	OperatorSet        OperatorSet
	MaxStalenessPeriod uint32
	Raw                types.Log // Blockchain specific contextual infos
}
⋮----
Raw                types.Log // Blockchain specific contextual infos
⋮----
// FilterMaxStalenessPeriodUpdated is a free log retrieval operation binding the contract event 0x28539469fbbc8a5482e60966bf9376f7b9d25b2f0a65a9976f6baa3f0e3788da.
⋮----
// Solidity: event MaxStalenessPeriodUpdated((address,uint32) operatorSet, uint32 maxStalenessPeriod)
func (_BN254CertificateVerifier *BN254CertificateVerifierFilterer) FilterMaxStalenessPeriodUpdated(opts *bind.FilterOpts) (*BN254CertificateVerifierMaxStalenessPeriodUpdatedIterator, error)
⋮----
// WatchMaxStalenessPeriodUpdated is a free log subscription operation binding the contract event 0x28539469fbbc8a5482e60966bf9376f7b9d25b2f0a65a9976f6baa3f0e3788da.
⋮----
func (_BN254CertificateVerifier *BN254CertificateVerifierFilterer) WatchMaxStalenessPeriodUpdated(opts *bind.WatchOpts, sink chan<- *BN254CertificateVerifierMaxStalenessPeriodUpdated) (event.Subscription, error)
⋮----
// ParseMaxStalenessPeriodUpdated is a log parse operation binding the contract event 0x28539469fbbc8a5482e60966bf9376f7b9d25b2f0a65a9976f6baa3f0e3788da.
⋮----
func (_BN254CertificateVerifier *BN254CertificateVerifierFilterer) ParseMaxStalenessPeriodUpdated(log types.Log) (*BN254CertificateVerifierMaxStalenessPeriodUpdated, error)
⋮----
// BN254CertificateVerifierOperatorSetOwnerUpdatedIterator is returned from FilterOperatorSetOwnerUpdated and is used to iterate over the raw logs and unpacked data for OperatorSetOwnerUpdated events raised by the BN254CertificateVerifier contract.
type BN254CertificateVerifierOperatorSetOwnerUpdatedIterator struct {
	Event *BN254CertificateVerifierOperatorSetOwnerUpdated // 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
}
⋮----
Event *BN254CertificateVerifierOperatorSetOwnerUpdated // Event containing the contract specifics and raw log
⋮----
// BN254CertificateVerifierOperatorSetOwnerUpdated represents a OperatorSetOwnerUpdated event raised by the BN254CertificateVerifier contract.
type BN254CertificateVerifierOperatorSetOwnerUpdated struct {
	OperatorSet OperatorSet
	Owner       common.Address
	Raw         types.Log // Blockchain specific contextual infos
}
⋮----
Raw         types.Log // Blockchain specific contextual infos
⋮----
// FilterOperatorSetOwnerUpdated is a free log retrieval operation binding the contract event 0x806dc367095c0baf953d7144b7c4376261675ee0b4e0da2761e43673051c7375.
⋮----
// Solidity: event OperatorSetOwnerUpdated((address,uint32) operatorSet, address owner)
func (_BN254CertificateVerifier *BN254CertificateVerifierFilterer) FilterOperatorSetOwnerUpdated(opts *bind.FilterOpts) (*BN254CertificateVerifierOperatorSetOwnerUpdatedIterator, error)
⋮----
// WatchOperatorSetOwnerUpdated is a free log subscription operation binding the contract event 0x806dc367095c0baf953d7144b7c4376261675ee0b4e0da2761e43673051c7375.
⋮----
func (_BN254CertificateVerifier *BN254CertificateVerifierFilterer) WatchOperatorSetOwnerUpdated(opts *bind.WatchOpts, sink chan<- *BN254CertificateVerifierOperatorSetOwnerUpdated) (event.Subscription, error)
⋮----
// ParseOperatorSetOwnerUpdated is a log parse operation binding the contract event 0x806dc367095c0baf953d7144b7c4376261675ee0b4e0da2761e43673051c7375.
⋮----
func (_BN254CertificateVerifier *BN254CertificateVerifierFilterer) ParseOperatorSetOwnerUpdated(log types.Log) (*BN254CertificateVerifierOperatorSetOwnerUpdated, error)
⋮----
// BN254CertificateVerifierTableUpdatedIterator is returned from FilterTableUpdated and is used to iterate over the raw logs and unpacked data for TableUpdated events raised by the BN254CertificateVerifier contract.
type BN254CertificateVerifierTableUpdatedIterator struct {
	Event *BN254CertificateVerifierTableUpdated // 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
}
⋮----
Event *BN254CertificateVerifierTableUpdated // Event containing the contract specifics and raw log
⋮----
// BN254CertificateVerifierTableUpdated represents a TableUpdated event raised by the BN254CertificateVerifier contract.
type BN254CertificateVerifierTableUpdated struct {
	OperatorSet        OperatorSet
	ReferenceTimestamp uint32
	OperatorSetInfo    IOperatorTableCalculatorTypesBN254OperatorSetInfo
	Raw                types.Log // Blockchain specific contextual infos
}
⋮----
// FilterTableUpdated is a free log retrieval operation binding the contract event 0x93e6bea1c9b5dce4a5c07b00261e956df2a4a253d9ab6ca070ca2037d72ada9e.
⋮----
// Solidity: event TableUpdated((address,uint32) operatorSet, uint32 referenceTimestamp, (bytes32,uint256,(uint256,uint256),uint256[]) operatorSetInfo)
func (_BN254CertificateVerifier *BN254CertificateVerifierFilterer) FilterTableUpdated(opts *bind.FilterOpts) (*BN254CertificateVerifierTableUpdatedIterator, error)
⋮----
// WatchTableUpdated is a free log subscription operation binding the contract event 0x93e6bea1c9b5dce4a5c07b00261e956df2a4a253d9ab6ca070ca2037d72ada9e.
⋮----
func (_BN254CertificateVerifier *BN254CertificateVerifierFilterer) WatchTableUpdated(opts *bind.WatchOpts, sink chan<- *BN254CertificateVerifierTableUpdated) (event.Subscription, error)
⋮----
// ParseTableUpdated is a log parse operation binding the contract event 0x93e6bea1c9b5dce4a5c07b00261e956df2a4a253d9ab6ca070ca2037d72ada9e.
⋮----
func (_BN254CertificateVerifier *BN254CertificateVerifierFilterer) ParseTableUpdated(log types.Log) (*BN254CertificateVerifierTableUpdated, error)
````

## File: pkg/bindings/BN254CertificateVerifierStorage/binding.go
````go
// Code generated - DO NOT EDIT.
// This file is a generated binding and any manual changes will be lost.
⋮----
package BN254CertificateVerifierStorage
⋮----
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"
)
⋮----
"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
)
⋮----
// BN254G1Point is an auto generated low-level Go binding around an user-defined struct.
type BN254G1Point struct {
	X *big.Int
	Y *big.Int
}
⋮----
// BN254G2Point is an auto generated low-level Go binding around an user-defined struct.
type BN254G2Point struct {
	X [2]*big.Int
	Y [2]*big.Int
}
⋮----
// IBN254CertificateVerifierTypesBN254Certificate is an auto generated low-level Go binding around an user-defined struct.
type IBN254CertificateVerifierTypesBN254Certificate struct {
	ReferenceTimestamp uint32
	MessageHash        [32]byte
	Signature          BN254G1Point
	Apk                BN254G2Point
	NonSignerWitnesses []IBN254CertificateVerifierTypesBN254OperatorInfoWitness
}
⋮----
// IBN254CertificateVerifierTypesBN254OperatorInfoWitness is an auto generated low-level Go binding around an user-defined struct.
type IBN254CertificateVerifierTypesBN254OperatorInfoWitness struct {
	OperatorIndex     uint32
	OperatorInfoProof []byte
	OperatorInfo      IOperatorTableCalculatorTypesBN254OperatorInfo
}
⋮----
// ICrossChainRegistryTypesOperatorSetConfig is an auto generated low-level Go binding around an user-defined struct.
type ICrossChainRegistryTypesOperatorSetConfig struct {
	Owner              common.Address
	MaxStalenessPeriod uint32
}
⋮----
// IOperatorTableCalculatorTypesBN254OperatorInfo is an auto generated low-level Go binding around an user-defined struct.
type IOperatorTableCalculatorTypesBN254OperatorInfo struct {
	Pubkey  BN254G1Point
	Weights []*big.Int
}
⋮----
// IOperatorTableCalculatorTypesBN254OperatorSetInfo is an auto generated low-level Go binding around an user-defined struct.
type IOperatorTableCalculatorTypesBN254OperatorSetInfo struct {
	OperatorInfoTreeRoot [32]byte
	NumOperators         *big.Int
	AggregatePubkey      BN254G1Point
	TotalWeights         []*big.Int
}
⋮----
// OperatorSet is an auto generated low-level Go binding around an user-defined struct.
type OperatorSet struct {
	Avs common.Address
	Id  uint32
}
⋮----
// BN254CertificateVerifierStorageMetaData contains all meta data concerning the BN254CertificateVerifierStorage contract.
var BN254CertificateVerifierStorageMetaData = &bind.MetaData{
	ABI: "[{\"type\":\"function\",\"name\":\"calculateCertificateDigest\",\"inputs\":[{\"name\":\"referenceTimestamp\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"messageHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"pure\"},{\"type\":\"function\",\"name\":\"getNonsignerOperatorInfo\",\"inputs\":[{\"name\":\"operatorSet\",\"type\":\"tuple\",\"internalType\":\"structOperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]},{\"name\":\"referenceTimestamp\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"operatorIndex\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"tuple\",\"internalType\":\"structIOperatorTableCalculatorTypes.BN254OperatorInfo\",\"components\":[{\"name\":\"pubkey\",\"type\":\"tuple\",\"internalType\":\"structBN254.G1Point\",\"components\":[{\"name\":\"X\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"Y\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]},{\"name\":\"weights\",\"type\":\"uint256[]\",\"internalType\":\"uint256[]\"}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getOperatorCount\",\"inputs\":[{\"name\":\"operatorSet\",\"type\":\"tuple\",\"internalType\":\"structOperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]},{\"name\":\"referenceTimestamp\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getOperatorSetInfo\",\"inputs\":[{\"name\":\"operatorSet\",\"type\":\"tuple\",\"internalType\":\"structOperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]},{\"name\":\"referenceTimestamp\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"tuple\",\"internalType\":\"structIOperatorTableCalculatorTypes.BN254OperatorSetInfo\",\"components\":[{\"name\":\"operatorInfoTreeRoot\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"numOperators\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"aggregatePubkey\",\"type\":\"tuple\",\"internalType\":\"structBN254.G1Point\",\"components\":[{\"name\":\"X\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"Y\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]},{\"name\":\"totalWeights\",\"type\":\"uint256[]\",\"internalType\":\"uint256[]\"}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getOperatorSetOwner\",\"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\":\"getTotalStakeWeights\",\"inputs\":[{\"name\":\"operatorSet\",\"type\":\"tuple\",\"internalType\":\"structOperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]},{\"name\":\"referenceTimestamp\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256[]\",\"internalType\":\"uint256[]\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"isNonsignerCached\",\"inputs\":[{\"name\":\"operatorSet\",\"type\":\"tuple\",\"internalType\":\"structOperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]},{\"name\":\"referenceTimestamp\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"operatorIndex\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"isReferenceTimestampSet\",\"inputs\":[{\"name\":\"operatorSet\",\"type\":\"tuple\",\"internalType\":\"structOperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]},{\"name\":\"referenceTimestamp\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"latestReferenceTimestamp\",\"inputs\":[{\"name\":\"operatorSet\",\"type\":\"tuple\",\"internalType\":\"structOperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]}],\"outputs\":[{\"name\":\"\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"maxOperatorTableStaleness\",\"inputs\":[{\"name\":\"operatorSet\",\"type\":\"tuple\",\"internalType\":\"structOperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]}],\"outputs\":[{\"name\":\"\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"operatorTableUpdater\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIOperatorTableUpdater\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"trySignatureVerification\",\"inputs\":[{\"name\":\"msgHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"aggPubkey\",\"type\":\"tuple\",\"internalType\":\"structBN254.G1Point\",\"components\":[{\"name\":\"X\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"Y\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]},{\"name\":\"apkG2\",\"type\":\"tuple\",\"internalType\":\"structBN254.G2Point\",\"components\":[{\"name\":\"X\",\"type\":\"uint256[2]\",\"internalType\":\"uint256[2]\"},{\"name\":\"Y\",\"type\":\"uint256[2]\",\"internalType\":\"uint256[2]\"}]},{\"name\":\"signature\",\"type\":\"tuple\",\"internalType\":\"structBN254.G1Point\",\"components\":[{\"name\":\"X\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"Y\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]}],\"outputs\":[{\"name\":\"pairingSuccessful\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"signatureValid\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"updateOperatorTable\",\"inputs\":[{\"name\":\"operatorSet\",\"type\":\"tuple\",\"internalType\":\"structOperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]},{\"name\":\"referenceTimestamp\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"operatorSetInfo\",\"type\":\"tuple\",\"internalType\":\"structIOperatorTableCalculatorTypes.BN254OperatorSetInfo\",\"components\":[{\"name\":\"operatorInfoTreeRoot\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"numOperators\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"aggregatePubkey\",\"type\":\"tuple\",\"internalType\":\"structBN254.G1Point\",\"components\":[{\"name\":\"X\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"Y\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]},{\"name\":\"totalWeights\",\"type\":\"uint256[]\",\"internalType\":\"uint256[]\"}]},{\"name\":\"operatorSetConfig\",\"type\":\"tuple\",\"internalType\":\"structICrossChainRegistryTypes.OperatorSetConfig\",\"components\":[{\"name\":\"owner\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"maxStalenessPeriod\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"verifyCertificate\",\"inputs\":[{\"name\":\"operatorSet\",\"type\":\"tuple\",\"internalType\":\"structOperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]},{\"name\":\"cert\",\"type\":\"tuple\",\"internalType\":\"structIBN254CertificateVerifierTypes.BN254Certificate\",\"components\":[{\"name\":\"referenceTimestamp\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"messageHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"signature\",\"type\":\"tuple\",\"internalType\":\"structBN254.G1Point\",\"components\":[{\"name\":\"X\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"Y\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]},{\"name\":\"apk\",\"type\":\"tuple\",\"internalType\":\"structBN254.G2Point\",\"components\":[{\"name\":\"X\",\"type\":\"uint256[2]\",\"internalType\":\"uint256[2]\"},{\"name\":\"Y\",\"type\":\"uint256[2]\",\"internalType\":\"uint256[2]\"}]},{\"name\":\"nonSignerWitnesses\",\"type\":\"tuple[]\",\"internalType\":\"structIBN254CertificateVerifierTypes.BN254OperatorInfoWitness[]\",\"components\":[{\"name\":\"operatorIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"operatorInfoProof\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"operatorInfo\",\"type\":\"tuple\",\"internalType\":\"structIOperatorTableCalculatorTypes.BN254OperatorInfo\",\"components\":[{\"name\":\"pubkey\",\"type\":\"tuple\",\"internalType\":\"structBN254.G1Point\",\"components\":[{\"name\":\"X\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"Y\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]},{\"name\":\"weights\",\"type\":\"uint256[]\",\"internalType\":\"uint256[]\"}]}]}]}],\"outputs\":[{\"name\":\"totalSignedStakeWeights\",\"type\":\"uint256[]\",\"internalType\":\"uint256[]\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"verifyCertificateNominal\",\"inputs\":[{\"name\":\"operatorSet\",\"type\":\"tuple\",\"internalType\":\"structOperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]},{\"name\":\"cert\",\"type\":\"tuple\",\"internalType\":\"structIBN254CertificateVerifierTypes.BN254Certificate\",\"components\":[{\"name\":\"referenceTimestamp\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"messageHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"signature\",\"type\":\"tuple\",\"internalType\":\"structBN254.G1Point\",\"components\":[{\"name\":\"X\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"Y\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]},{\"name\":\"apk\",\"type\":\"tuple\",\"internalType\":\"structBN254.G2Point\",\"components\":[{\"name\":\"X\",\"type\":\"uint256[2]\",\"internalType\":\"uint256[2]\"},{\"name\":\"Y\",\"type\":\"uint256[2]\",\"internalType\":\"uint256[2]\"}]},{\"name\":\"nonSignerWitnesses\",\"type\":\"tuple[]\",\"internalType\":\"structIBN254CertificateVerifierTypes.BN254OperatorInfoWitness[]\",\"components\":[{\"name\":\"operatorIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"operatorInfoProof\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"operatorInfo\",\"type\":\"tuple\",\"internalType\":\"structIOperatorTableCalculatorTypes.BN254OperatorInfo\",\"components\":[{\"name\":\"pubkey\",\"type\":\"tuple\",\"internalType\":\"structBN254.G1Point\",\"components\":[{\"name\":\"X\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"Y\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]},{\"name\":\"weights\",\"type\":\"uint256[]\",\"internalType\":\"uint256[]\"}]}]}]},{\"name\":\"totalStakeNominalThresholds\",\"type\":\"uint256[]\",\"internalType\":\"uint256[]\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"verifyCertificateProportion\",\"inputs\":[{\"name\":\"operatorSet\",\"type\":\"tuple\",\"internalType\":\"structOperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]},{\"name\":\"cert\",\"type\":\"tuple\",\"internalType\":\"structIBN254CertificateVerifierTypes.BN254Certificate\",\"components\":[{\"name\":\"referenceTimestamp\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"messageHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"signature\",\"type\":\"tuple\",\"internalType\":\"structBN254.G1Point\",\"components\":[{\"name\":\"X\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"Y\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]},{\"name\":\"apk\",\"type\":\"tuple\",\"internalType\":\"structBN254.G2Point\",\"components\":[{\"name\":\"X\",\"type\":\"uint256[2]\",\"internalType\":\"uint256[2]\"},{\"name\":\"Y\",\"type\":\"uint256[2]\",\"internalType\":\"uint256[2]\"}]},{\"name\":\"nonSignerWitnesses\",\"type\":\"tuple[]\",\"internalType\":\"structIBN254CertificateVerifierTypes.BN254OperatorInfoWitness[]\",\"components\":[{\"name\":\"operatorIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"operatorInfoProof\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"operatorInfo\",\"type\":\"tuple\",\"internalType\":\"structIOperatorTableCalculatorTypes.BN254OperatorInfo\",\"components\":[{\"name\":\"pubkey\",\"type\":\"tuple\",\"internalType\":\"structBN254.G1Point\",\"components\":[{\"name\":\"X\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"Y\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]},{\"name\":\"weights\",\"type\":\"uint256[]\",\"internalType\":\"uint256[]\"}]}]}]},{\"name\":\"totalStakeProportionThresholds\",\"type\":\"uint16[]\",\"internalType\":\"uint16[]\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"event\",\"name\":\"MaxStalenessPeriodUpdated\",\"inputs\":[{\"name\":\"operatorSet\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structOperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]},{\"name\":\"maxStalenessPeriod\",\"type\":\"uint32\",\"indexed\":false,\"internalType\":\"uint32\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"OperatorSetOwnerUpdated\",\"inputs\":[{\"name\":\"operatorSet\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structOperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]},{\"name\":\"owner\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"TableUpdated\",\"inputs\":[{\"name\":\"operatorSet\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structOperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]},{\"name\":\"referenceTimestamp\",\"type\":\"uint32\",\"indexed\":false,\"internalType\":\"uint32\"},{\"name\":\"operatorSetInfo\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structIOperatorTableCalculatorTypes.BN254OperatorSetInfo\",\"components\":[{\"name\":\"operatorInfoTreeRoot\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"numOperators\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"aggregatePubkey\",\"type\":\"tuple\",\"internalType\":\"structBN254.G1Point\",\"components\":[{\"name\":\"X\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"Y\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]},{\"name\":\"totalWeights\",\"type\":\"uint256[]\",\"internalType\":\"uint256[]\"}]}],\"anonymous\":false},{\"type\":\"error\",\"name\":\"ArrayLengthMismatch\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"CertificateStale\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidOperatorIndex\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"NonSignerIndicesNotSorted\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"OnlyTableUpdater\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ReferenceTimestampDoesNotExist\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"RootDisabled\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"TableUpdateStale\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"VerificationFailed\",\"inputs\":[]}]",
}
⋮----
// BN254CertificateVerifierStorageABI is the input ABI used to generate the binding from.
// Deprecated: Use BN254CertificateVerifierStorageMetaData.ABI instead.
var BN254CertificateVerifierStorageABI = BN254CertificateVerifierStorageMetaData.ABI
⋮----
// BN254CertificateVerifierStorage is an auto generated Go binding around an Ethereum contract.
type BN254CertificateVerifierStorage struct {
	BN254CertificateVerifierStorageCaller     // Read-only binding to the contract
	BN254CertificateVerifierStorageTransactor // Write-only binding to the contract
	BN254CertificateVerifierStorageFilterer   // Log filterer for contract events
}
⋮----
BN254CertificateVerifierStorageCaller     // Read-only binding to the contract
BN254CertificateVerifierStorageTransactor // Write-only binding to the contract
BN254CertificateVerifierStorageFilterer   // Log filterer for contract events
⋮----
// BN254CertificateVerifierStorageCaller is an auto generated read-only Go binding around an Ethereum contract.
type BN254CertificateVerifierStorageCaller struct {
	contract *bind.BoundContract // Generic contract wrapper for the low level calls
}
⋮----
contract *bind.BoundContract // Generic contract wrapper for the low level calls
⋮----
// BN254CertificateVerifierStorageTransactor is an auto generated write-only Go binding around an Ethereum contract.
type BN254CertificateVerifierStorageTransactor struct {
	contract *bind.BoundContract // Generic contract wrapper for the low level calls
}
⋮----
// BN254CertificateVerifierStorageFilterer is an auto generated log filtering Go binding around an Ethereum contract events.
type BN254CertificateVerifierStorageFilterer struct {
	contract *bind.BoundContract // Generic contract wrapper for the low level calls
}
⋮----
// BN254CertificateVerifierStorageSession is an auto generated Go binding around an Ethereum contract,
// with pre-set call and transact options.
type BN254CertificateVerifierStorageSession struct {
	Contract     *BN254CertificateVerifierStorage // 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
}
⋮----
Contract     *BN254CertificateVerifierStorage // 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
⋮----
// BN254CertificateVerifierStorageCallerSession is an auto generated read-only Go binding around an Ethereum contract,
// with pre-set call options.
type BN254CertificateVerifierStorageCallerSession struct {
	Contract *BN254CertificateVerifierStorageCaller // Generic contract caller binding to set the session for
	CallOpts bind.CallOpts                          // Call options to use throughout this session
}
⋮----
Contract *BN254CertificateVerifierStorageCaller // Generic contract caller binding to set the session for
CallOpts bind.CallOpts                          // Call options to use throughout this session
⋮----
// BN254CertificateVerifierStorageTransactorSession is an auto generated write-only Go binding around an Ethereum contract,
// with pre-set transact options.
type BN254CertificateVerifierStorageTransactorSession struct {
	Contract     *BN254CertificateVerifierStorageTransactor // Generic contract transactor binding to set the session for
	TransactOpts bind.TransactOpts                          // Transaction auth options to use throughout this session
}
⋮----
Contract     *BN254CertificateVerifierStorageTransactor // Generic contract transactor binding to set the session for
TransactOpts bind.TransactOpts                          // Transaction auth options to use throughout this session
⋮----
// BN254CertificateVerifierStorageRaw is an auto generated low-level Go binding around an Ethereum contract.
type BN254CertificateVerifierStorageRaw struct {
	Contract *BN254CertificateVerifierStorage // Generic contract binding to access the raw methods on
}
⋮----
Contract *BN254CertificateVerifierStorage // Generic contract binding to access the raw methods on
⋮----
// BN254CertificateVerifierStorageCallerRaw is an auto generated low-level read-only Go binding around an Ethereum contract.
type BN254CertificateVerifierStorageCallerRaw struct {
	Contract *BN254CertificateVerifierStorageCaller // Generic read-only contract binding to access the raw methods on
}
⋮----
Contract *BN254CertificateVerifierStorageCaller // Generic read-only contract binding to access the raw methods on
⋮----
// BN254CertificateVerifierStorageTransactorRaw is an auto generated low-level write-only Go binding around an Ethereum contract.
type BN254CertificateVerifierStorageTransactorRaw struct {
	Contract *BN254CertificateVerifierStorageTransactor // Generic write-only contract binding to access the raw methods on
}
⋮----
Contract *BN254CertificateVerifierStorageTransactor // Generic write-only contract binding to access the raw methods on
⋮----
// NewBN254CertificateVerifierStorage creates a new instance of BN254CertificateVerifierStorage, bound to a specific deployed contract.
func NewBN254CertificateVerifierStorage(address common.Address, backend bind.ContractBackend) (*BN254CertificateVerifierStorage, error)
⋮----
// NewBN254CertificateVerifierStorageCaller creates a new read-only instance of BN254CertificateVerifierStorage, bound to a specific deployed contract.
func NewBN254CertificateVerifierStorageCaller(address common.Address, caller bind.ContractCaller) (*BN254CertificateVerifierStorageCaller, error)
⋮----
// NewBN254CertificateVerifierStorageTransactor creates a new write-only instance of BN254CertificateVerifierStorage, bound to a specific deployed contract.
func NewBN254CertificateVerifierStorageTransactor(address common.Address, transactor bind.ContractTransactor) (*BN254CertificateVerifierStorageTransactor, error)
⋮----
// NewBN254CertificateVerifierStorageFilterer creates a new log filterer instance of BN254CertificateVerifierStorage, bound to a specific deployed contract.
func NewBN254CertificateVerifierStorageFilterer(address common.Address, filterer bind.ContractFilterer) (*BN254CertificateVerifierStorageFilterer, error)
⋮----
// bindBN254CertificateVerifierStorage binds a generic wrapper to an already deployed contract.
func bindBN254CertificateVerifierStorage(address common.Address, caller bind.ContractCaller, transactor bind.ContractTransactor, filterer bind.ContractFilterer) (*bind.BoundContract, error)
⋮----
// 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 (_BN254CertificateVerifierStorage *BN254CertificateVerifierStorageRaw) Call(opts *bind.CallOpts, result *[]interface
⋮----
// Transfer initiates a plain transaction to move funds to the contract, calling
// its default method if one is available.
func (_BN254CertificateVerifierStorage *BN254CertificateVerifierStorageRaw) Transfer(opts *bind.TransactOpts) (*types.Transaction, error)
⋮----
// Transact invokes the (paid) contract method with params as input values.
func (_BN254CertificateVerifierStorage *BN254CertificateVerifierStorageRaw) Transact(opts *bind.TransactOpts, method string, params ...interface
⋮----
// CalculateCertificateDigest is a free data retrieval call binding the contract method 0x18467434.
//
// Solidity: function calculateCertificateDigest(uint32 referenceTimestamp, bytes32 messageHash) pure returns(bytes32)
func (_BN254CertificateVerifierStorage *BN254CertificateVerifierStorageCaller) CalculateCertificateDigest(opts *bind.CallOpts, referenceTimestamp uint32, messageHash [32]byte) ([32]byte, error)
⋮----
var out []interface{}
⋮----
// GetNonsignerOperatorInfo is a free data retrieval call binding the contract method 0x26af6a3c.
⋮----
// Solidity: function getNonsignerOperatorInfo((address,uint32) operatorSet, uint32 referenceTimestamp, uint256 operatorIndex) view returns(((uint256,uint256),uint256[]))
func (_BN254CertificateVerifierStorage *BN254CertificateVerifierStorageCaller) GetNonsignerOperatorInfo(opts *bind.CallOpts, operatorSet OperatorSet, referenceTimestamp uint32, operatorIndex *big.Int) (IOperatorTableCalculatorTypesBN254OperatorInfo, error)
⋮----
// GetOperatorCount is a free data retrieval call binding the contract method 0x23c2a3cb.
⋮----
// Solidity: function getOperatorCount((address,uint32) operatorSet, uint32 referenceTimestamp) view returns(uint256)
func (_BN254CertificateVerifierStorage *BN254CertificateVerifierStorageCaller) GetOperatorCount(opts *bind.CallOpts, operatorSet OperatorSet, referenceTimestamp uint32) (*big.Int, error)
⋮----
// GetOperatorSetInfo is a free data retrieval call binding the contract method 0xeb39e68f.
⋮----
// Solidity: function getOperatorSetInfo((address,uint32) operatorSet, uint32 referenceTimestamp) view returns((bytes32,uint256,(uint256,uint256),uint256[]))
func (_BN254CertificateVerifierStorage *BN254CertificateVerifierStorageCaller) GetOperatorSetInfo(opts *bind.CallOpts, operatorSet OperatorSet, referenceTimestamp uint32) (IOperatorTableCalculatorTypesBN254OperatorSetInfo, error)
⋮----
// GetOperatorSetOwner is a free data retrieval call binding the contract method 0x84818920.
⋮----
// Solidity: function getOperatorSetOwner((address,uint32) operatorSet) view returns(address)
func (_BN254CertificateVerifierStorage *BN254CertificateVerifierStorageCaller) GetOperatorSetOwner(opts *bind.CallOpts, operatorSet OperatorSet) (common.Address, error)
⋮----
// GetTotalStakeWeights is a free data retrieval call binding the contract method 0x7d1d1f5b.
⋮----
// Solidity: function getTotalStakeWeights((address,uint32) operatorSet, uint32 referenceTimestamp) view returns(uint256[])
func (_BN254CertificateVerifierStorage *BN254CertificateVerifierStorageCaller) GetTotalStakeWeights(opts *bind.CallOpts, operatorSet OperatorSet, referenceTimestamp uint32) ([]*big.Int, error)
⋮----
// IsNonsignerCached is a free data retrieval call binding the contract method 0x5be87274.
⋮----
// Solidity: function isNonsignerCached((address,uint32) operatorSet, uint32 referenceTimestamp, uint256 operatorIndex) view returns(bool)
func (_BN254CertificateVerifierStorage *BN254CertificateVerifierStorageCaller) IsNonsignerCached(opts *bind.CallOpts, operatorSet OperatorSet, referenceTimestamp uint32, operatorIndex *big.Int) (bool, error)
⋮----
// IsReferenceTimestampSet is a free data retrieval call binding the contract method 0xcd83a72b.
⋮----
// Solidity: function isReferenceTimestampSet((address,uint32) operatorSet, uint32 referenceTimestamp) view returns(bool)
func (_BN254CertificateVerifierStorage *BN254CertificateVerifierStorageCaller) IsReferenceTimestampSet(opts *bind.CallOpts, operatorSet OperatorSet, referenceTimestamp uint32) (bool, error)
⋮----
// LatestReferenceTimestamp is a free data retrieval call binding the contract method 0x5ddb9b5b.
⋮----
// Solidity: function latestReferenceTimestamp((address,uint32) operatorSet) view returns(uint32)
func (_BN254CertificateVerifierStorage *BN254CertificateVerifierStorageCaller) LatestReferenceTimestamp(opts *bind.CallOpts, operatorSet OperatorSet) (uint32, error)
⋮----
// MaxOperatorTableStaleness is a free data retrieval call binding the contract method 0x6141879e.
⋮----
// Solidity: function maxOperatorTableStaleness((address,uint32) operatorSet) view returns(uint32)
func (_BN254CertificateVerifierStorage *BN254CertificateVerifierStorageCaller) MaxOperatorTableStaleness(opts *bind.CallOpts, operatorSet OperatorSet) (uint32, error)
⋮----
// OperatorTableUpdater is a free data retrieval call binding the contract method 0x68d6e081.
⋮----
// Solidity: function operatorTableUpdater() view returns(address)
func (_BN254CertificateVerifierStorage *BN254CertificateVerifierStorageCaller) OperatorTableUpdater(opts *bind.CallOpts) (common.Address, error)
⋮----
// TrySignatureVerification is a free data retrieval call binding the contract method 0x1a18746c.
⋮----
// Solidity: function trySignatureVerification(bytes32 msgHash, (uint256,uint256) aggPubkey, (uint256[2],uint256[2]) apkG2, (uint256,uint256) signature) view returns(bool pairingSuccessful, bool signatureValid)
func (_BN254CertificateVerifierStorage *BN254CertificateVerifierStorageCaller) TrySignatureVerification(opts *bind.CallOpts, msgHash [32]byte, aggPubkey BN254G1Point, apkG2 BN254G2Point, signature BN254G1Point) (struct
⋮----
// UpdateOperatorTable is a paid mutator transaction binding the contract method 0x6738c40b.
⋮----
// Solidity: function updateOperatorTable((address,uint32) operatorSet, uint32 referenceTimestamp, (bytes32,uint256,(uint256,uint256),uint256[]) operatorSetInfo, (address,uint32) operatorSetConfig) returns()
func (_BN254CertificateVerifierStorage *BN254CertificateVerifierStorageTransactor) UpdateOperatorTable(opts *bind.TransactOpts, operatorSet OperatorSet, referenceTimestamp uint32, operatorSetInfo IOperatorTableCalculatorTypesBN254OperatorSetInfo, operatorSetConfig ICrossChainRegistryTypesOperatorSetConfig) (*types.Transaction, error)
⋮----
// VerifyCertificate is a paid mutator transaction binding the contract method 0x080b7150.
⋮----
// Solidity: function verifyCertificate((address,uint32) operatorSet, (uint32,bytes32,(uint256,uint256),(uint256[2],uint256[2]),(uint32,bytes,((uint256,uint256),uint256[]))[]) cert) returns(uint256[] totalSignedStakeWeights)
func (_BN254CertificateVerifierStorage *BN254CertificateVerifierStorageTransactor) VerifyCertificate(opts *bind.TransactOpts, operatorSet OperatorSet, cert IBN254CertificateVerifierTypesBN254Certificate) (*types.Transaction, error)
⋮----
// VerifyCertificateNominal is a paid mutator transaction binding the contract method 0xdd2ae1b9.
⋮----
// Solidity: function verifyCertificateNominal((address,uint32) operatorSet, (uint32,bytes32,(uint256,uint256),(uint256[2],uint256[2]),(uint32,bytes,((uint256,uint256),uint256[]))[]) cert, uint256[] totalStakeNominalThresholds) returns(bool)
func (_BN254CertificateVerifierStorage *BN254CertificateVerifierStorageTransactor) VerifyCertificateNominal(opts *bind.TransactOpts, operatorSet OperatorSet, cert IBN254CertificateVerifierTypesBN254Certificate, totalStakeNominalThresholds []*big.Int) (*types.Transaction, error)
⋮----
// VerifyCertificateProportion is a paid mutator transaction binding the contract method 0x017d7974.
⋮----
// Solidity: function verifyCertificateProportion((address,uint32) operatorSet, (uint32,bytes32,(uint256,uint256),(uint256[2],uint256[2]),(uint32,bytes,((uint256,uint256),uint256[]))[]) cert, uint16[] totalStakeProportionThresholds) returns(bool)
func (_BN254CertificateVerifierStorage *BN254CertificateVerifierStorageTransactor) VerifyCertificateProportion(opts *bind.TransactOpts, operatorSet OperatorSet, cert IBN254CertificateVerifierTypesBN254Certificate, totalStakeProportionThresholds []uint16) (*types.Transaction, error)
⋮----
// BN254CertificateVerifierStorageMaxStalenessPeriodUpdatedIterator is returned from FilterMaxStalenessPeriodUpdated and is used to iterate over the raw logs and unpacked data for MaxStalenessPeriodUpdated events raised by the BN254CertificateVerifierStorage contract.
type BN254CertificateVerifierStorageMaxStalenessPeriodUpdatedIterator struct {
	Event *BN254CertificateVerifierStorageMaxStalenessPeriodUpdated // 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
}
⋮----
Event *BN254CertificateVerifierStorageMaxStalenessPeriodUpdated // 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 *BN254CertificateVerifierStorageMaxStalenessPeriodUpdatedIterator) Next() bool
⋮----
// If the iterator failed, stop iterating
⋮----
// If the iterator completed, deliver directly whatever's available
⋮----
// Iterator still in progress, wait for either a data or an error event
⋮----
// Error returns any retrieval or parsing error occurred during filtering.
func (it *BN254CertificateVerifierStorageMaxStalenessPeriodUpdatedIterator) Error() error
⋮----
// Close terminates the iteration process, releasing any pending underlying
// resources.
func (it *BN254CertificateVerifierStorageMaxStalenessPeriodUpdatedIterator) Close() error
⋮----
// BN254CertificateVerifierStorageMaxStalenessPeriodUpdated represents a MaxStalenessPeriodUpdated event raised by the BN254CertificateVerifierStorage contract.
type BN254CertificateVerifierStorageMaxStalenessPeriodUpdated struct {
	OperatorSet        OperatorSet
	MaxStalenessPeriod uint32
	Raw                types.Log // Blockchain specific contextual infos
}
⋮----
Raw                types.Log // Blockchain specific contextual infos
⋮----
// FilterMaxStalenessPeriodUpdated is a free log retrieval operation binding the contract event 0x28539469fbbc8a5482e60966bf9376f7b9d25b2f0a65a9976f6baa3f0e3788da.
⋮----
// Solidity: event MaxStalenessPeriodUpdated((address,uint32) operatorSet, uint32 maxStalenessPeriod)
func (_BN254CertificateVerifierStorage *BN254CertificateVerifierStorageFilterer) FilterMaxStalenessPeriodUpdated(opts *bind.FilterOpts) (*BN254CertificateVerifierStorageMaxStalenessPeriodUpdatedIterator, error)
⋮----
// WatchMaxStalenessPeriodUpdated is a free log subscription operation binding the contract event 0x28539469fbbc8a5482e60966bf9376f7b9d25b2f0a65a9976f6baa3f0e3788da.
⋮----
func (_BN254CertificateVerifierStorage *BN254CertificateVerifierStorageFilterer) WatchMaxStalenessPeriodUpdated(opts *bind.WatchOpts, sink chan<- *BN254CertificateVerifierStorageMaxStalenessPeriodUpdated) (event.Subscription, error)
⋮----
// New log arrived, parse the event and forward to the user
⋮----
// ParseMaxStalenessPeriodUpdated is a log parse operation binding the contract event 0x28539469fbbc8a5482e60966bf9376f7b9d25b2f0a65a9976f6baa3f0e3788da.
⋮----
func (_BN254CertificateVerifierStorage *BN254CertificateVerifierStorageFilterer) ParseMaxStalenessPeriodUpdated(log types.Log) (*BN254CertificateVerifierStorageMaxStalenessPeriodUpdated, error)
⋮----
// BN254CertificateVerifierStorageOperatorSetOwnerUpdatedIterator is returned from FilterOperatorSetOwnerUpdated and is used to iterate over the raw logs and unpacked data for OperatorSetOwnerUpdated events raised by the BN254CertificateVerifierStorage contract.
type BN254CertificateVerifierStorageOperatorSetOwnerUpdatedIterator struct {
	Event *BN254CertificateVerifierStorageOperatorSetOwnerUpdated // 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
}
⋮----
Event *BN254CertificateVerifierStorageOperatorSetOwnerUpdated // Event containing the contract specifics and raw log
⋮----
// BN254CertificateVerifierStorageOperatorSetOwnerUpdated represents a OperatorSetOwnerUpdated event raised by the BN254CertificateVerifierStorage contract.
type BN254CertificateVerifierStorageOperatorSetOwnerUpdated struct {
	OperatorSet OperatorSet
	Owner       common.Address
	Raw         types.Log // Blockchain specific contextual infos
}
⋮----
Raw         types.Log // Blockchain specific contextual infos
⋮----
// FilterOperatorSetOwnerUpdated is a free log retrieval operation binding the contract event 0x806dc367095c0baf953d7144b7c4376261675ee0b4e0da2761e43673051c7375.
⋮----
// Solidity: event OperatorSetOwnerUpdated((address,uint32) operatorSet, address owner)
func (_BN254CertificateVerifierStorage *BN254CertificateVerifierStorageFilterer) FilterOperatorSetOwnerUpdated(opts *bind.FilterOpts) (*BN254CertificateVerifierStorageOperatorSetOwnerUpdatedIterator, error)
⋮----
// WatchOperatorSetOwnerUpdated is a free log subscription operation binding the contract event 0x806dc367095c0baf953d7144b7c4376261675ee0b4e0da2761e43673051c7375.
⋮----
func (_BN254CertificateVerifierStorage *BN254CertificateVerifierStorageFilterer) WatchOperatorSetOwnerUpdated(opts *bind.WatchOpts, sink chan<- *BN254CertificateVerifierStorageOperatorSetOwnerUpdated) (event.Subscription, error)
⋮----
// ParseOperatorSetOwnerUpdated is a log parse operation binding the contract event 0x806dc367095c0baf953d7144b7c4376261675ee0b4e0da2761e43673051c7375.
⋮----
func (_BN254CertificateVerifierStorage *BN254CertificateVerifierStorageFilterer) ParseOperatorSetOwnerUpdated(log types.Log) (*BN254CertificateVerifierStorageOperatorSetOwnerUpdated, error)
⋮----
// BN254CertificateVerifierStorageTableUpdatedIterator is returned from FilterTableUpdated and is used to iterate over the raw logs and unpacked data for TableUpdated events raised by the BN254CertificateVerifierStorage contract.
type BN254CertificateVerifierStorageTableUpdatedIterator struct {
	Event *BN254CertificateVerifierStorageTableUpdated // 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
}
⋮----
Event *BN254CertificateVerifierStorageTableUpdated // Event containing the contract specifics and raw log
⋮----
// BN254CertificateVerifierStorageTableUpdated represents a TableUpdated event raised by the BN254CertificateVerifierStorage contract.
type BN254CertificateVerifierStorageTableUpdated struct {
	OperatorSet        OperatorSet
	ReferenceTimestamp uint32
	OperatorSetInfo    IOperatorTableCalculatorTypesBN254OperatorSetInfo
	Raw                types.Log // Blockchain specific contextual infos
}
⋮----
// FilterTableUpdated is a free log retrieval operation binding the contract event 0x93e6bea1c9b5dce4a5c07b00261e956df2a4a253d9ab6ca070ca2037d72ada9e.
⋮----
// Solidity: event TableUpdated((address,uint32) operatorSet, uint32 referenceTimestamp, (bytes32,uint256,(uint256,uint256),uint256[]) operatorSetInfo)
func (_BN254CertificateVerifierStorage *BN254CertificateVerifierStorageFilterer) FilterTableUpdated(opts *bind.FilterOpts) (*BN254CertificateVerifierStorageTableUpdatedIterator, error)
⋮----
// WatchTableUpdated is a free log subscription operation binding the contract event 0x93e6bea1c9b5dce4a5c07b00261e956df2a4a253d9ab6ca070ca2037d72ada9e.
⋮----
func (_BN254CertificateVerifierStorage *BN254CertificateVerifierStorageFilterer) WatchTableUpdated(opts *bind.WatchOpts, sink chan<- *BN254CertificateVerifierStorageTableUpdated) (event.Subscription, error)
⋮----
// ParseTableUpdated is a log parse operation binding the contract event 0x93e6bea1c9b5dce4a5c07b00261e956df2a4a253d9ab6ca070ca2037d72ada9e.
⋮----
func (_BN254CertificateVerifierStorage *BN254CertificateVerifierStorageFilterer) ParseTableUpdated(log types.Log) (*BN254CertificateVerifierStorageTableUpdated, error)
````

## File: pkg/bindings/BN254SignatureVerifier/binding.go
````go
// Code generated - DO NOT EDIT.
// This file is a generated binding and any manual changes will be lost.
⋮----
package BN254SignatureVerifier
⋮----
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"
)
⋮----
"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
)
⋮----
// BN254SignatureVerifierMetaData contains all meta data concerning the BN254SignatureVerifier contract.
var BN254SignatureVerifierMetaData = &bind.MetaData{
	ABI: "[]",
	Bin: "0x60556032600b8282823980515f1a607314602657634e487b7160e01b5f525f60045260245ffd5b305f52607381538281f3fe730000000000000000000000000000000000000000301460806040525f5ffdfea264697066735822122009a35705c5909fec3cf6a454d9830af3ca54cb9091d6942aa4c6e6394676925164736f6c634300081e0033",
}
⋮----
// BN254SignatureVerifierABI is the input ABI used to generate the binding from.
// Deprecated: Use BN254SignatureVerifierMetaData.ABI instead.
var BN254SignatureVerifierABI = BN254SignatureVerifierMetaData.ABI
⋮----
// BN254SignatureVerifierBin is the compiled bytecode used for deploying new contracts.
// Deprecated: Use BN254SignatureVerifierMetaData.Bin instead.
var BN254SignatureVerifierBin = BN254SignatureVerifierMetaData.Bin
⋮----
// DeployBN254SignatureVerifier deploys a new Ethereum contract, binding an instance of BN254SignatureVerifier to it.
func DeployBN254SignatureVerifier(auth *bind.TransactOpts, backend bind.ContractBackend) (common.Address, *types.Transaction, *BN254SignatureVerifier, error)
⋮----
// BN254SignatureVerifier is an auto generated Go binding around an Ethereum contract.
type BN254SignatureVerifier struct {
	BN254SignatureVerifierCaller     // Read-only binding to the contract
	BN254SignatureVerifierTransactor // Write-only binding to the contract
	BN254SignatureVerifierFilterer   // Log filterer for contract events
}
⋮----
BN254SignatureVerifierCaller     // Read-only binding to the contract
BN254SignatureVerifierTransactor // Write-only binding to the contract
BN254SignatureVerifierFilterer   // Log filterer for contract events
⋮----
// BN254SignatureVerifierCaller is an auto generated read-only Go binding around an Ethereum contract.
type BN254SignatureVerifierCaller struct {
	contract *bind.BoundContract // Generic contract wrapper for the low level calls
}
⋮----
contract *bind.BoundContract // Generic contract wrapper for the low level calls
⋮----
// BN254SignatureVerifierTransactor is an auto generated write-only Go binding around an Ethereum contract.
type BN254SignatureVerifierTransactor struct {
	contract *bind.BoundContract // Generic contract wrapper for the low level calls
}
⋮----
// BN254SignatureVerifierFilterer is an auto generated log filtering Go binding around an Ethereum contract events.
type BN254SignatureVerifierFilterer struct {
	contract *bind.BoundContract // Generic contract wrapper for the low level calls
}
⋮----
// BN254SignatureVerifierSession is an auto generated Go binding around an Ethereum contract,
// with pre-set call and transact options.
type BN254SignatureVerifierSession struct {
	Contract     *BN254SignatureVerifier // 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
}
⋮----
Contract     *BN254SignatureVerifier // 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
⋮----
// BN254SignatureVerifierCallerSession is an auto generated read-only Go binding around an Ethereum contract,
// with pre-set call options.
type BN254SignatureVerifierCallerSession struct {
	Contract *BN254SignatureVerifierCaller // Generic contract caller binding to set the session for
	CallOpts bind.CallOpts                 // Call options to use throughout this session
}
⋮----
Contract *BN254SignatureVerifierCaller // Generic contract caller binding to set the session for
CallOpts bind.CallOpts                 // Call options to use throughout this session
⋮----
// BN254SignatureVerifierTransactorSession is an auto generated write-only Go binding around an Ethereum contract,
// with pre-set transact options.
type BN254SignatureVerifierTransactorSession struct {
	Contract     *BN254SignatureVerifierTransactor // Generic contract transactor binding to set the session for
	TransactOpts bind.TransactOpts                 // Transaction auth options to use throughout this session
}
⋮----
Contract     *BN254SignatureVerifierTransactor // Generic contract transactor binding to set the session for
TransactOpts bind.TransactOpts                 // Transaction auth options to use throughout this session
⋮----
// BN254SignatureVerifierRaw is an auto generated low-level Go binding around an Ethereum contract.
type BN254SignatureVerifierRaw struct {
	Contract *BN254SignatureVerifier // Generic contract binding to access the raw methods on
}
⋮----
Contract *BN254SignatureVerifier // Generic contract binding to access the raw methods on
⋮----
// BN254SignatureVerifierCallerRaw is an auto generated low-level read-only Go binding around an Ethereum contract.
type BN254SignatureVerifierCallerRaw struct {
	Contract *BN254SignatureVerifierCaller // Generic read-only contract binding to access the raw methods on
}
⋮----
Contract *BN254SignatureVerifierCaller // Generic read-only contract binding to access the raw methods on
⋮----
// BN254SignatureVerifierTransactorRaw is an auto generated low-level write-only Go binding around an Ethereum contract.
type BN254SignatureVerifierTransactorRaw struct {
	Contract *BN254SignatureVerifierTransactor // Generic write-only contract binding to access the raw methods on
}
⋮----
Contract *BN254SignatureVerifierTransactor // Generic write-only contract binding to access the raw methods on
⋮----
// NewBN254SignatureVerifier creates a new instance of BN254SignatureVerifier, bound to a specific deployed contract.
func NewBN254SignatureVerifier(address common.Address, backend bind.ContractBackend) (*BN254SignatureVerifier, error)
⋮----
// NewBN254SignatureVerifierCaller creates a new read-only instance of BN254SignatureVerifier, bound to a specific deployed contract.
func NewBN254SignatureVerifierCaller(address common.Address, caller bind.ContractCaller) (*BN254SignatureVerifierCaller, error)
⋮----
// NewBN254SignatureVerifierTransactor creates a new write-only instance of BN254SignatureVerifier, bound to a specific deployed contract.
func NewBN254SignatureVerifierTransactor(address common.Address, transactor bind.ContractTransactor) (*BN254SignatureVerifierTransactor, error)
⋮----
// NewBN254SignatureVerifierFilterer creates a new log filterer instance of BN254SignatureVerifier, bound to a specific deployed contract.
func NewBN254SignatureVerifierFilterer(address common.Address, filterer bind.ContractFilterer) (*BN254SignatureVerifierFilterer, error)
⋮----
// bindBN254SignatureVerifier binds a generic wrapper to an already deployed contract.
func bindBN254SignatureVerifier(address common.Address, caller bind.ContractCaller, transactor bind.ContractTransactor, filterer bind.ContractFilterer) (*bind.BoundContract, error)
⋮----
// 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 (_BN254SignatureVerifier *BN254SignatureVerifierRaw) Call(opts *bind.CallOpts, result *[]interface
⋮----
// Transfer initiates a plain transaction to move funds to the contract, calling
// its default method if one is available.
func (_BN254SignatureVerifier *BN254SignatureVerifierRaw) Transfer(opts *bind.TransactOpts) (*types.Transaction, error)
⋮----
// Transact invokes the (paid) contract method with params as input values.
func (_BN254SignatureVerifier *BN254SignatureVerifierRaw) Transact(opts *bind.TransactOpts, method string, params ...interface
````

## File: pkg/bindings/BytesLib/binding.go
````go
// Code generated - DO NOT EDIT.
// This file is a generated binding and any manual changes will be lost.
⋮----
package BytesLib
⋮----
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"
)
⋮----
"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
)
⋮----
// BytesLibMetaData contains all meta data concerning the BytesLib contract.
var BytesLibMetaData = &bind.MetaData{
	ABI: "[{\"type\":\"error\",\"name\":\"OutOfBounds\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"Overflow\",\"inputs\":[]}]",
	Bin: "0x60556032600b8282823980515f1a607314602657634e487b7160e01b5f525f60045260245ffd5b305f52607381538281f3fe730000000000000000000000000000000000000000301460806040525f5ffdfea26469706673582212203ee1cf4e70ed42e70db49ca1d8f71ffd8fde66973bbd68b3a1083aa370f1158f64736f6c634300081b0033",
}
⋮----
// BytesLibABI is the input ABI used to generate the binding from.
// Deprecated: Use BytesLibMetaData.ABI instead.
var BytesLibABI = BytesLibMetaData.ABI
⋮----
// BytesLibBin is the compiled bytecode used for deploying new contracts.
// Deprecated: Use BytesLibMetaData.Bin instead.
var BytesLibBin = BytesLibMetaData.Bin
⋮----
// DeployBytesLib deploys a new Ethereum contract, binding an instance of BytesLib to it.
func DeployBytesLib(auth *bind.TransactOpts, backend bind.ContractBackend) (common.Address, *types.Transaction, *BytesLib, error)
⋮----
// BytesLib is an auto generated Go binding around an Ethereum contract.
type BytesLib struct {
	BytesLibCaller     // Read-only binding to the contract
	BytesLibTransactor // Write-only binding to the contract
	BytesLibFilterer   // Log filterer for contract events
}
⋮----
BytesLibCaller     // Read-only binding to the contract
BytesLibTransactor // Write-only binding to the contract
BytesLibFilterer   // Log filterer for contract events
⋮----
// BytesLibCaller is an auto generated read-only Go binding around an Ethereum contract.
type BytesLibCaller struct {
	contract *bind.BoundContract // Generic contract wrapper for the low level calls
}
⋮----
contract *bind.BoundContract // Generic contract wrapper for the low level calls
⋮----
// BytesLibTransactor is an auto generated write-only Go binding around an Ethereum contract.
type BytesLibTransactor struct {
	contract *bind.BoundContract // Generic contract wrapper for the low level calls
}
⋮----
// BytesLibFilterer is an auto generated log filtering Go binding around an Ethereum contract events.
type BytesLibFilterer struct {
	contract *bind.BoundContract // Generic contract wrapper for the low level calls
}
⋮----
// BytesLibSession is an auto generated Go binding around an Ethereum contract,
// with pre-set call and transact options.
type BytesLibSession struct {
	Contract     *BytesLib         // 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
}
⋮----
Contract     *BytesLib         // 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
⋮----
// BytesLibCallerSession is an auto generated read-only Go binding around an Ethereum contract,
// with pre-set call options.
type BytesLibCallerSession struct {
	Contract *BytesLibCaller // Generic contract caller binding to set the session for
	CallOpts bind.CallOpts   // Call options to use throughout this session
}
⋮----
Contract *BytesLibCaller // Generic contract caller binding to set the session for
CallOpts bind.CallOpts   // Call options to use throughout this session
⋮----
// BytesLibTransactorSession is an auto generated write-only Go binding around an Ethereum contract,
// with pre-set transact options.
type BytesLibTransactorSession struct {
	Contract     *BytesLibTransactor // Generic contract transactor binding to set the session for
	TransactOpts bind.TransactOpts   // Transaction auth options to use throughout this session
}
⋮----
Contract     *BytesLibTransactor // Generic contract transactor binding to set the session for
TransactOpts bind.TransactOpts   // Transaction auth options to use throughout this session
⋮----
// BytesLibRaw is an auto generated low-level Go binding around an Ethereum contract.
type BytesLibRaw struct {
	Contract *BytesLib // Generic contract binding to access the raw methods on
}
⋮----
Contract *BytesLib // Generic contract binding to access the raw methods on
⋮----
// BytesLibCallerRaw is an auto generated low-level read-only Go binding around an Ethereum contract.
type BytesLibCallerRaw struct {
	Contract *BytesLibCaller // Generic read-only contract binding to access the raw methods on
}
⋮----
Contract *BytesLibCaller // Generic read-only contract binding to access the raw methods on
⋮----
// BytesLibTransactorRaw is an auto generated low-level write-only Go binding around an Ethereum contract.
type BytesLibTransactorRaw struct {
	Contract *BytesLibTransactor // Generic write-only contract binding to access the raw methods on
}
⋮----
Contract *BytesLibTransactor // Generic write-only contract binding to access the raw methods on
⋮----
// NewBytesLib creates a new instance of BytesLib, bound to a specific deployed contract.
func NewBytesLib(address common.Address, backend bind.ContractBackend) (*BytesLib, error)
⋮----
// NewBytesLibCaller creates a new read-only instance of BytesLib, bound to a specific deployed contract.
func NewBytesLibCaller(address common.Address, caller bind.ContractCaller) (*BytesLibCaller, error)
⋮----
// NewBytesLibTransactor creates a new write-only instance of BytesLib, bound to a specific deployed contract.
func NewBytesLibTransactor(address common.Address, transactor bind.ContractTransactor) (*BytesLibTransactor, error)
⋮----
// NewBytesLibFilterer creates a new log filterer instance of BytesLib, bound to a specific deployed contract.
func NewBytesLibFilterer(address common.Address, filterer bind.ContractFilterer) (*BytesLibFilterer, error)
⋮----
// bindBytesLib binds a generic wrapper to an already deployed contract.
func bindBytesLib(address common.Address, caller bind.ContractCaller, transactor bind.ContractTransactor, filterer bind.ContractFilterer) (*bind.BoundContract, error)
⋮----
// 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 (_BytesLib *BytesLibRaw) Call(opts *bind.CallOpts, result *[]interface
⋮----
// Transfer initiates a plain transaction to move funds to the contract, calling
// its default method if one is available.
func (_BytesLib *BytesLibRaw) Transfer(opts *bind.TransactOpts) (*types.Transaction, error)
⋮----
// Transact invokes the (paid) contract method with params as input values.
func (_BytesLib *BytesLibRaw) Transact(opts *bind.TransactOpts, method string, params ...interface
````

## File: pkg/bindings/CrossChainRegistry/binding.go
````go
// Code generated - DO NOT EDIT.
// This file is a generated binding and any manual changes will be lost.
⋮----
package CrossChainRegistry
⋮----
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"
)
⋮----
"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
)
⋮----
// ICrossChainRegistryTypesOperatorSetConfig is an auto generated low-level Go binding around an user-defined struct.
type ICrossChainRegistryTypesOperatorSetConfig struct {
	Owner              common.Address
	MaxStalenessPeriod uint32
}
⋮----
// OperatorSet is an auto generated low-level Go binding around an user-defined struct.
type OperatorSet struct {
	Avs common.Address
	Id  uint32
}
⋮----
// 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: "0x610100604052348015610010575f5ffd5b506040516125b73803806125b783398101604081905261002f9161015b565b818484836001600160a01b03811661005a576040516339b190bb60e11b815260040160405180910390fd5b6001600160a01b0390811660805291821660a052811660c0521660e05261007f610088565b505050506101b7565b5f54610100900460ff16156100f35760405162461bcd60e51b815260206004820152602760248201527f496e697469616c697a61626c653a20636f6e747261637420697320696e697469604482015266616c697a696e6760c81b606482015260840160405180910390fd5b5f5460ff90811614610142575f805460ff191660ff9081179091556040519081527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b565b6001600160a01b0381168114610158575f5ffd5b50565b5f5f5f5f6080858703121561016e575f5ffd5b845161017981610144565b602086015190945061018a81610144565b604086015190935061019b81610144565b60608601519092506101ac81610144565b939692955090935050565b60805160a05160c05160e05161238e6102295f395f81816102db0152611a3101525f818161027c015281816109dc015261107001525f81816103db01528181610762015281816108d501528181610b6b0152610fc701525f818161036d015281816116590152611928015261238e5ff3fe608060405234801561000f575f5ffd5b50600436106101c6575f3560e01c8063715018a6116100fe578063ca8aa7c71161009e578063d9a6729e1161006e578063d9a6729e14610438578063dfbd9dfd1461044b578063f2fde38b1461045e578063fabc1cbc14610471575f5ffd5b8063ca8aa7c7146103d6578063d09b978b146103fd578063d504491114610412578063d6db9e2514610425575f5ffd5b80638da5cb5b116100d95780638da5cb5b1461038f578063ac505f4b146103a0578063b186a60e146103b8578063c4bffe2b146103c0575f5ffd5b8063715018a61461034d57806375e4b53914610355578063886f119514610368575f5ffd5b80633ec45c7e11610169578063595c6a6711610144578063595c6a67146102fd5780635ac86ab7146103055780635c975abb146103285780636c55a37f1461033a575f5ffd5b80633ec45c7e1461027757806341ee6d0e146102b65780634657e26a146102d6575f5ffd5b80631ca9142a116101a45780631ca9142a1461020557806321fa7fdc14610218578063277e1e621461024157806336b200de14610254575f5ffd5b806304e98be3146101ca5780630f19aaef146101df578063136439dd146101f2575b5f5ffd5b6101dd6101d8366004611c81565b610484565b005b6101dd6101ed366004611d19565b6105c8565b6101dd610200366004611d55565b6106ee565b6101dd610213366004611d82565b610728565b61022b610226366004611e5b565b61083b565b6040516102389190611e93565b60405180910390f35b6101dd61024f366004611ea1565b61089b565b610267610262366004611e5b565b6109bc565b6040519015158152602001610238565b61029e7f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b039091168152602001610238565b6102c96102c4366004611ed4565b6109d7565b6040516102389190611f1c565b61029e7f000000000000000000000000000000000000000000000000000000000000000081565b6101dd610b1e565b610267610313366004611f2e565b606654600160ff9092169190911b9081161490565b6066545b604051908152602001610238565b6101dd610348366004611ed4565b610b32565b6101dd610d38565b61029e610363366004611e5b565b610d49565b61029e7f000000000000000000000000000000000000000000000000000000000000000081565b6033546001600160a01b031661029e565b609e5460405163ffffffff9091168152602001610238565b61032c610d75565b6103c8610d85565b604051610238929190611f4e565b61029e7f000000000000000000000000000000000000000000000000000000000000000081565b610405610e9b565b6040516102389190611fd7565b6101dd610420366004612024565b610f8e565b6101dd610433366004612068565b6111b7565b610405610446366004612081565b6111cb565b6101dd6104593660046120a1565b611315565b6101dd61046c3660046120e0565b6113bb565b6101dd61047f366004611d55565b611431565b61048c61149e565b6003610497816114f8565b8382146104b75760405163512509d360e11b815260040160405180910390fd5b5f5b848110156105c0575f8686838181106104d4576104d46120fb565b905060200201359050805f036104fd57604051633d23e4d160e11b815260040160405180910390fd5b61053181868685818110610513576105136120fb565b905060200201602081019061052891906120e0565b609b9190611523565b61054e576040516324bf631b60e11b815260040160405180910390fd5b7f7a0a76d85b582b17996dd7371a407aa7a79b870db8539247fba315c7b6beff6281868685818110610582576105826120fb565b905060200201602081019061059791906120e0565b604080519283526001600160a01b0390911660208301520160405180910390a1506001016104b9565b505050505050565b5f54610100900460ff16158080156105e657505f54600160ff909116105b806105ff5750303b1580156105ff57505f5460ff166001145b6106675760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b60648201526084015b60405180910390fd5b5f805460ff191660011790558015610688575f805461ff0019166101001790555b61069184611542565b61069a83611593565b6106a382611607565b80156106e8575f805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b50505050565b6106f6611644565b606654818116811461071b5760405163c61dca5d60e01b815260040160405180910390fd5b61072482611607565b5050565b6001610733816114f8565b61074060208401846120e0565b610749816116e7565b6040516304c1b8eb60e31b815284906001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169063260dc75890610797908490600401612140565b602060405180830381865afa1580156107b2573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906107d6919061214e565b6107f357604051631fb1705560e21b815260040160405180910390fd5b8461080661026236839003830183611e5b565b61082357604051634d2baea960e11b815260040160405180910390fd5b6105c061083536889003880188611e5b565b8661170d565b604080518082019091525f8082526020820152609a5f61085a84611787565b815260208082019290925260409081015f208151808301909252546001600160a01b0381168252600160a01b900463ffffffff169181019190915292915050565b60026108a6816114f8565b6108b360208401846120e0565b6108bc816116e7565b6040516304c1b8eb60e31b815284906001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169063260dc7589061090a908490600401612140565b602060405180830381865afa158015610925573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610949919061214e565b61096657604051631fb1705560e21b815260040160405180910390fd5b8461097961026236839003830183611e5b565b61099657604051634d2baea960e11b815260040160405180910390fd5b6105c06109a836889003880188611e5b565b6109b736889003880188611e5b565b6117ea565b5f6109d16109c983611787565b6097906118b3565b92915050565b6060817f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316637cffe48c846040518263ffffffff1660e01b8152600401610a269190612140565b602060405180830381865afa158015610a41573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610a65919061216d565b610a7761022636869003860186611e5b565b610a8961036336879003870187611e5b565b6001600160a01b03166341ee6d0e866040518263ffffffff1660e01b8152600401610ab49190612140565b5f60405180830381865afa158015610ace573d5f5f3e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052610af5919081019061218b565b604051602001610b089493929190612233565b6040516020818303038152906040529050919050565b610b26611644565b610b305f19611607565b565b5f610b3c816114f8565b610b4960208301836120e0565b610b52816116e7565b6040516304c1b8eb60e31b815283906001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169063260dc75890610ba0908490600401612140565b602060405180830381865afa158015610bbb573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610bdf919061214e565b610bfc57604051631fb1705560e21b815260040160405180910390fd5b83610c0f61026236839003830183611e5b565b610c2c57604051634d2baea960e11b815260040160405180910390fd5b5f610c44610c3f36889003880188611e5b565b611787565b5f818152609960205260409081902080546001600160a01b0319169055519091507fd7811913efd5d98fc7ea0d1fdd022b3d31987815360842d05b1d1cf55578d16a90610c92908890612140565b60405180910390a15f818152609a60205260409081902080546001600160c01b0319169055517f210a1118a869246162804e2a7f21ef808ebd93f4be7ed512014fe29a7a8be02e90610ce5908890612140565b60405180910390a1610cf86097826118ca565b507f4ffdfdd59e9e1e3c301608788f78dd458e61cb8c045ca92b62a7b484c80824fb86604051610d289190612140565b60405180910390a1505050505050565b610d4061149e565b610b305f611542565b5f60995f610d5684611787565b815260208101919091526040015f20546001600160a01b031692915050565b5f610d8060976118d5565b905090565b6060805f610d93609b6118de565b90505f8167ffffffffffffffff811115610daf57610daf611db8565b604051908082528060200260200182016040528015610dd8578160200160208202803683370190505b5090505f8267ffffffffffffffff811115610df557610df5611db8565b604051908082528060200260200182016040528015610e1e578160200160208202803683370190505b5090505f5b83811015610e90575f80610e38609b846118e8565b9150915081858481518110610e4f57610e4f6120fb565b60200260200101818152505080848481518110610e6e57610e6e6120fb565b6001600160a01b03909216602092830291909101909101525050600101610e23565b509094909350915050565b60605f610ea860976118d5565b90505f8167ffffffffffffffff811115610ec457610ec4611db8565b604051908082528060200260200182016040528015610f0857816020015b604080518082019091525f8082526020820152815260200190600190039081610ee25790505b5090505f5b82811015610f87575f610f21609783611905565b90505f610f5d82604080518082019091525f80825260208201525060408051808201909152606082901c815263ffffffff909116602082015290565b905080848481518110610f7257610f726120fb565b60209081029190910101525050600101610f0d565b5092915050565b5f610f98816114f8565b610fa560208501856120e0565b610fae816116e7565b6040516304c1b8eb60e31b815285906001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169063260dc75890610ffc908490600401612140565b602060405180830381865afa158015611017573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061103b919061214e565b61105857604051631fb1705560e21b815260040160405180910390fd5b5f604051631f3ff92360e21b81526001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001690637cffe48c906110a5908a90600401612140565b602060405180830381865afa1580156110c0573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906110e4919061216d565b60028111156110f5576110f561221f565b036111135760405163e57cacbd60e01b815260040160405180910390fd5b611130611128610c3f36899003890189611e5b565b609790611910565b61114d57604051631883461560e01b815260040160405180910390fd5b7f4fb6efec7dd60036ce3a7af8d5c48425019daa0fb61eb471a966a7ac2c6fa6a68660405161117c9190612140565b60405180910390a161119661083536889003880188611e5b565b6105c06111a836889003880188611e5b565b6109b736879003870187611e5b565b6111bf61149e565b6111c881611593565b50565b6060818311156111ee5760405163561ce9bb60e01b815260040160405180910390fd5b6111f860976118d5565b821115611218576040516302da361360e61b815260040160405180910390fd5b5f611223848461229f565b90505f8167ffffffffffffffff81111561123f5761123f611db8565b60405190808252806020026020018201604052801561128357816020015b604080518082019091525f808252602082015281526020019060019003908161125d5790505b5090505f5b8281101561130c575f6112a661129e83896122b2565b609790611905565b90505f6112e282604080518082019091525f80825260208201525060408051808201909152606082901c815263ffffffff909116602082015290565b9050808484815181106112f7576112f76120fb565b60209081029190910101525050600101611288565b50949350505050565b61131d61149e565b6003611328816114f8565b5f5b828110156106e8575f848483818110611345576113456120fb565b90506020020135905061136281609b61191b90919063ffffffff16565b61137f5760405163b3f92ba160e01b815260040160405180910390fd5b6040518181527f6824d36084ecf2cd819b137cb5d837cc6e73afce1e0e348c9fdecaa81d0341e59060200160405180910390a15060010161132a565b6113c361149e565b6001600160a01b0381166114285760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b606482015260840161065e565b6111c881611542565b611439611926565b606654801982198116146114605760405163c61dca5d60e01b815260040160405180910390fd5b606682905560405182815233907f3582d1828e26bf56bd801502bc021ac0bc8afb57c826e4986b45593c8fad389c9060200160405180910390a25050565b6033546001600160a01b03163314610b305760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161065e565b606654600160ff83161b908116036111c85760405163840a48d560e01b815260040160405180910390fd5b5f61153884846001600160a01b0385166119d7565b90505b9392505050565b603380546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a35050565b5f8163ffffffff16116115b9576040516316d98e1b60e31b815260040160405180910390fd5b609e805463ffffffff191663ffffffff83169081179091556040519081527f4fbcd0cca70015b33db8af4aa4f2bd6fd6c1efa9460b8e2333f252c1467a63279060200160405180910390a150565b606681905560405181815233907fab40a374bc51de372200a8bc981af8c9ecdc08dfdaef0bb6e09f88f3c616ef3d9060200160405180910390a250565b60405163237dfb4760e11b81523360048201527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906346fbf68e90602401602060405180830381865afa1580156116a6573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906116ca919061214e565b610b3057604051631d77d47760e21b815260040160405180910390fd5b6116f0816119f3565b6111c85760405163932d94f760e01b815260040160405180910390fd5b8060995f61171a85611787565b81526020019081526020015f205f6101000a8154816001600160a01b0302191690836001600160a01b031602179055507f7f7ccafd92d20fdb39dee184a0dce002a9da420ed0def461f2a027abc9b3f6df828260405161177b9291906122c5565b60405180910390a15050565b5f815f0151826020015163ffffffff166040516020016117d292919060609290921b6bffffffffffffffffffffffff1916825260a01b6001600160a01b031916601482015260200190565b6040516020818303038152906040526109d1906122eb565b602081015163ffffffff1615806118115750609e54602082015163ffffffff918216911610155b61182e57604051632e46483160e11b815260040160405180910390fd5b80609a5f61183b85611787565b815260208082019290925260409081015f2083518154949093015163ffffffff16600160a01b026001600160c01b03199094166001600160a01b0390931692909217929092179055517f3147846ee526009000671c20380b856a633345691300f82585f90034715cf0e29061177b908490849061230e565b5f818152600183016020526040812054151561153b565b5f61153b8383611a9c565b5f6109d1825490565b5f6109d182611b7f565b5f8080806118f68686611b89565b909450925050505b9250929050565b5f61153b8383611bb2565b5f61153b8383611bd8565b5f61153b8383611c24565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663eab66d7a6040518163ffffffff1660e01b8152600401602060405180830381865afa158015611982573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906119a69190612329565b6001600160a01b0316336001600160a01b031614610b305760405163794821ff60e01b815260040160405180910390fd5b5f82815260028401602052604081208290556115388484611910565b604051631beb2b9760e31b81526001600160a01b0382811660048301523360248301523060448301525f80356001600160e01b0319166064840152917f00000000000000000000000000000000000000000000000000000000000000009091169063df595cb890608401602060405180830381865afa158015611a78573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906109d1919061214e565b5f8181526001830160205260408120548015611b76575f611abe60018361229f565b85549091505f90611ad19060019061229f565b9050818114611b30575f865f018281548110611aef57611aef6120fb565b905f5260205f200154905080875f018481548110611b0f57611b0f6120fb565b5f918252602080832090910192909255918252600188019052604090208390555b8554869080611b4157611b41612344565b600190038181905f5260205f20015f90559055856001015f8681526020019081526020015f205f9055600193505050506109d1565b5f9150506109d1565b5f6109d1826118d5565b5f8080611b968585611905565b5f81815260029690960160205260409095205494959350505050565b5f825f018281548110611bc757611bc76120fb565b905f5260205f200154905092915050565b5f818152600183016020526040812054611c1d57508154600181810184555f8481526020808220909301849055845484825282860190935260409020919091556109d1565b505f6109d1565b5f818152600283016020526040812081905561153b83836118ca565b5f5f83601f840112611c50575f5ffd5b50813567ffffffffffffffff811115611c67575f5ffd5b6020830191508360208260051b85010111156118fe575f5ffd5b5f5f5f5f60408587031215611c94575f5ffd5b843567ffffffffffffffff811115611caa575f5ffd5b611cb687828801611c40565b909550935050602085013567ffffffffffffffff811115611cd5575f5ffd5b611ce187828801611c40565b95989497509550505050565b6001600160a01b03811681146111c8575f5ffd5b803563ffffffff81168114611d14575f5ffd5b919050565b5f5f5f60608486031215611d2b575f5ffd5b8335611d3681611ced565b9250611d4460208501611d01565b929592945050506040919091013590565b5f60208284031215611d65575f5ffd5b5035919050565b5f60408284031215611d7c575f5ffd5b50919050565b5f5f60608385031215611d93575f5ffd5b611d9d8484611d6c565b91506040830135611dad81611ced565b809150509250929050565b634e487b7160e01b5f52604160045260245ffd5b604051601f8201601f1916810167ffffffffffffffff81118282101715611df557611df5611db8565b604052919050565b5f60408284031215611e0d575f5ffd5b6040805190810167ffffffffffffffff81118282101715611e3057611e30611db8565b6040529050808235611e4181611ced565b8152611e4f60208401611d01565b60208201525092915050565b5f60408284031215611e6b575f5ffd5b61153b8383611dfd565b80516001600160a01b0316825260209081015163ffffffff16910152565b604081016109d18284611e75565b5f5f60808385031215611eb2575f5ffd5b611ebc8484611d6c565b9150611ecb8460408501611d6c565b90509250929050565b5f60408284031215611ee4575f5ffd5b61153b8383611d6c565b5f81518084528060208401602086015e5f602082860101526020601f19601f83011685010191505092915050565b602081525f61153b6020830184611eee565b5f60208284031215611f3e575f5ffd5b813560ff8116811461153b575f5ffd5b604080825283519082018190525f9060208501906060840190835b81811015611f87578351835260209384019390920191600101611f69565b5050838103602080860191909152855180835291810192508501905f5b81811015611fcb5782516001600160a01b0316845260209384019390920191600101611fa4565b50919695505050505050565b602080825282518282018190525f918401906040840190835b8181101561201957612003838551611e75565b6020939093019260409290920191600101611ff0565b509095945050505050565b5f5f5f60a08486031215612036575f5ffd5b6120408585611d6c565b9250604084013561205081611ced565b915061205f8560608601611d6c565b90509250925092565b5f60208284031215612078575f5ffd5b61153b82611d01565b5f5f60408385031215612092575f5ffd5b50508035926020909101359150565b5f5f602083850312156120b2575f5ffd5b823567ffffffffffffffff8111156120c8575f5ffd5b6120d485828601611c40565b90969095509350505050565b5f602082840312156120f0575f5ffd5b813561153b81611ced565b634e487b7160e01b5f52603260045260245ffd5b803561211a81611ced565b6001600160a01b0316825263ffffffff61213660208301611d01565b1660208301525050565b604081016109d1828461210f565b5f6020828403121561215e575f5ffd5b8151801515811461153b575f5ffd5b5f6020828403121561217d575f5ffd5b81516003811061153b575f5ffd5b5f6020828403121561219b575f5ffd5b815167ffffffffffffffff8111156121b1575f5ffd5b8201601f810184136121c1575f5ffd5b805167ffffffffffffffff8111156121db576121db611db8565b6121ee601f8201601f1916602001611dcc565b818152856020838501011115612202575f5ffd5b8160208401602083015e5f91810160200191909152949350505050565b634e487b7160e01b5f52602160045260245ffd5b61223d818661210f565b5f6003851061225a57634e487b7160e01b5f52602160045260245ffd5b84604083015261226d6060830185611e75565b60c060a083015261228160c0830184611eee565b9695505050505050565b634e487b7160e01b5f52601160045260245ffd5b818103818111156109d1576109d161228b565b808201808211156109d1576109d161228b565b606081016122d38285611e75565b6001600160a01b039290921660409190910152919050565b80516020808301519190811015611d7c575f1960209190910360031b1b16919050565b6080810161231c8285611e75565b61153b6040830184611e75565b5f60208284031215612339575f5ffd5b815161153b81611ced565b634e487b7160e01b5f52603160045260245ffdfea2646970667358221220358d3fadc945696dbb2efb48e4c245b15726a73a5c5dfa892c582f3474600d0364736f6c634300081e0033",
}
⋮----
// CrossChainRegistryABI is the input ABI used to generate the binding from.
// Deprecated: Use CrossChainRegistryMetaData.ABI instead.
var CrossChainRegistryABI = CrossChainRegistryMetaData.ABI
⋮----
// CrossChainRegistryBin is the compiled bytecode used for deploying new contracts.
// Deprecated: Use CrossChainRegistryMetaData.Bin instead.
var CrossChainRegistryBin = CrossChainRegistryMetaData.Bin
⋮----
// DeployCrossChainRegistry deploys a new Ethereum contract, binding an instance of CrossChainRegistry to it.
func DeployCrossChainRegistry(auth *bind.TransactOpts, backend bind.ContractBackend, _allocationManager common.Address, _keyRegistrar common.Address, _permissionController common.Address, _pauserRegistry common.Address) (common.Address, *types.Transaction, *CrossChainRegistry, error)
⋮----
// CrossChainRegistry is an auto generated Go binding around an Ethereum contract.
type CrossChainRegistry struct {
	CrossChainRegistryCaller     // Read-only binding to the contract
	CrossChainRegistryTransactor // Write-only binding to the contract
	CrossChainRegistryFilterer   // Log filterer for contract events
}
⋮----
CrossChainRegistryCaller     // Read-only binding to the contract
CrossChainRegistryTransactor // Write-only binding to the contract
CrossChainRegistryFilterer   // Log filterer for contract events
⋮----
// CrossChainRegistryCaller is an auto generated read-only Go binding around an Ethereum contract.
type CrossChainRegistryCaller struct {
	contract *bind.BoundContract // Generic contract wrapper for the low level calls
}
⋮----
contract *bind.BoundContract // Generic contract wrapper for the low level calls
⋮----
// CrossChainRegistryTransactor is an auto generated write-only Go binding around an Ethereum contract.
type CrossChainRegistryTransactor struct {
	contract *bind.BoundContract // Generic contract wrapper for the low level calls
}
⋮----
// CrossChainRegistryFilterer is an auto generated log filtering Go binding around an Ethereum contract events.
type CrossChainRegistryFilterer struct {
	contract *bind.BoundContract // Generic contract wrapper for the low level calls
}
⋮----
// CrossChainRegistrySession is an auto generated Go binding around an Ethereum contract,
// with pre-set call and transact options.
type CrossChainRegistrySession struct {
	Contract     *CrossChainRegistry // 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
}
⋮----
Contract     *CrossChainRegistry // 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
⋮----
// CrossChainRegistryCallerSession is an auto generated read-only Go binding around an Ethereum contract,
// with pre-set call options.
type CrossChainRegistryCallerSession struct {
	Contract *CrossChainRegistryCaller // Generic contract caller binding to set the session for
	CallOpts bind.CallOpts             // Call options to use throughout this session
}
⋮----
Contract *CrossChainRegistryCaller // Generic contract caller binding to set the session for
CallOpts bind.CallOpts             // Call options to use throughout this session
⋮----
// CrossChainRegistryTransactorSession is an auto generated write-only Go binding around an Ethereum contract,
// with pre-set transact options.
type CrossChainRegistryTransactorSession struct {
	Contract     *CrossChainRegistryTransactor // Generic contract transactor binding to set the session for
	TransactOpts bind.TransactOpts             // Transaction auth options to use throughout this session
}
⋮----
Contract     *CrossChainRegistryTransactor // Generic contract transactor binding to set the session for
TransactOpts bind.TransactOpts             // Transaction auth options to use throughout this session
⋮----
// CrossChainRegistryRaw is an auto generated low-level Go binding around an Ethereum contract.
type CrossChainRegistryRaw struct {
	Contract *CrossChainRegistry // Generic contract binding to access the raw methods on
}
⋮----
Contract *CrossChainRegistry // Generic contract binding to access the raw methods on
⋮----
// CrossChainRegistryCallerRaw is an auto generated low-level read-only Go binding around an Ethereum contract.
type CrossChainRegistryCallerRaw struct {
	Contract *CrossChainRegistryCaller // Generic read-only contract binding to access the raw methods on
}
⋮----
Contract *CrossChainRegistryCaller // Generic read-only contract binding to access the raw methods on
⋮----
// CrossChainRegistryTransactorRaw is an auto generated low-level write-only Go binding around an Ethereum contract.
type CrossChainRegistryTransactorRaw struct {
	Contract *CrossChainRegistryTransactor // Generic write-only contract binding to access the raw methods on
}
⋮----
Contract *CrossChainRegistryTransactor // Generic write-only contract binding to access the raw methods on
⋮----
// NewCrossChainRegistry creates a new instance of CrossChainRegistry, bound to a specific deployed contract.
func NewCrossChainRegistry(address common.Address, backend bind.ContractBackend) (*CrossChainRegistry, error)
⋮----
// NewCrossChainRegistryCaller creates a new read-only instance of CrossChainRegistry, bound to a specific deployed contract.
func NewCrossChainRegistryCaller(address common.Address, caller bind.ContractCaller) (*CrossChainRegistryCaller, error)
⋮----
// NewCrossChainRegistryTransactor creates a new write-only instance of CrossChainRegistry, bound to a specific deployed contract.
func NewCrossChainRegistryTransactor(address common.Address, transactor bind.ContractTransactor) (*CrossChainRegistryTransactor, error)
⋮----
// NewCrossChainRegistryFilterer creates a new log filterer instance of CrossChainRegistry, bound to a specific deployed contract.
func NewCrossChainRegistryFilterer(address common.Address, filterer bind.ContractFilterer) (*CrossChainRegistryFilterer, error)
⋮----
// bindCrossChainRegistry binds a generic wrapper to an already deployed contract.
func bindCrossChainRegistry(address common.Address, caller bind.ContractCaller, transactor bind.ContractTransactor, filterer bind.ContractFilterer) (*bind.BoundContract, error)
⋮----
// 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 (_CrossChainRegistry *CrossChainRegistryRaw) Call(opts *bind.CallOpts, result *[]interface
⋮----
// Transfer initiates a plain transaction to move funds to the contract, calling
// its default method if one is available.
func (_CrossChainRegistry *CrossChainRegistryRaw) Transfer(opts *bind.TransactOpts) (*types.Transaction, error)
⋮----
// Transact invokes the (paid) contract method with params as input values.
func (_CrossChainRegistry *CrossChainRegistryRaw) Transact(opts *bind.TransactOpts, method string, params ...interface
⋮----
// AllocationManager is a free data retrieval call binding the contract method 0xca8aa7c7.
//
// Solidity: function allocationManager() view returns(address)
func (_CrossChainRegistry *CrossChainRegistryCaller) AllocationManager(opts *bind.CallOpts) (common.Address, error)
⋮----
var out []interface{}
⋮----
// CalculateOperatorTableBytes is a free data retrieval call binding the contract method 0x41ee6d0e.
⋮----
// Solidity: function calculateOperatorTableBytes((address,uint32) operatorSet) view returns(bytes)
func (_CrossChainRegistry *CrossChainRegistryCaller) CalculateOperatorTableBytes(opts *bind.CallOpts, operatorSet OperatorSet) ([]byte, error)
⋮----
// GetActiveGenerationReservationCount is a free data retrieval call binding the contract method 0xb186a60e.
⋮----
// Solidity: function getActiveGenerationReservationCount() view returns(uint256)
func (_CrossChainRegistry *CrossChainRegistryCaller) GetActiveGenerationReservationCount(opts *bind.CallOpts) (*big.Int, error)
⋮----
// GetActiveGenerationReservations is a free data retrieval call binding the contract method 0xd09b978b.
⋮----
// Solidity: function getActiveGenerationReservations() view returns((address,uint32)[])
func (_CrossChainRegistry *CrossChainRegistryCaller) GetActiveGenerationReservations(opts *bind.CallOpts) ([]OperatorSet, error)
⋮----
// GetActiveGenerationReservationsByRange is a free data retrieval call binding the contract method 0xd9a6729e.
⋮----
// Solidity: function getActiveGenerationReservationsByRange(uint256 startIndex, uint256 endIndex) view returns((address,uint32)[])
func (_CrossChainRegistry *CrossChainRegistryCaller) GetActiveGenerationReservationsByRange(opts *bind.CallOpts, startIndex *big.Int, endIndex *big.Int) ([]OperatorSet, error)
⋮----
// GetOperatorSetConfig is a free data retrieval call binding the contract method 0x21fa7fdc.
⋮----
// Solidity: function getOperatorSetConfig((address,uint32) operatorSet) view returns((address,uint32))
func (_CrossChainRegistry *CrossChainRegistryCaller) GetOperatorSetConfig(opts *bind.CallOpts, operatorSet OperatorSet) (ICrossChainRegistryTypesOperatorSetConfig, error)
⋮----
// GetOperatorTableCalculator is a free data retrieval call binding the contract method 0x75e4b539.
⋮----
// Solidity: function getOperatorTableCalculator((address,uint32) operatorSet) view returns(address)
func (_CrossChainRegistry *CrossChainRegistryCaller) GetOperatorTableCalculator(opts *bind.CallOpts, operatorSet OperatorSet) (common.Address, error)
⋮----
// GetSupportedChains is a free data retrieval call binding the contract method 0xc4bffe2b.
⋮----
// Solidity: function getSupportedChains() view returns(uint256[], address[])
func (_CrossChainRegistry *CrossChainRegistryCaller) GetSupportedChains(opts *bind.CallOpts) ([]*big.Int, []common.Address, error)
⋮----
// GetTableUpdateCadence is a free data retrieval call binding the contract method 0xac505f4b.
⋮----
// Solidity: function getTableUpdateCadence() view returns(uint32)
func (_CrossChainRegistry *CrossChainRegistryCaller) GetTableUpdateCadence(opts *bind.CallOpts) (uint32, error)
⋮----
// HasActiveGenerationReservation is a free data retrieval call binding the contract method 0x36b200de.
⋮----
// Solidity: function hasActiveGenerationReservation((address,uint32) operatorSet) view returns(bool)
func (_CrossChainRegistry *CrossChainRegistryCaller) HasActiveGenerationReservation(opts *bind.CallOpts, operatorSet OperatorSet) (bool, error)
⋮----
// KeyRegistrar is a free data retrieval call binding the contract method 0x3ec45c7e.
⋮----
// Solidity: function keyRegistrar() view returns(address)
func (_CrossChainRegistry *CrossChainRegistryCaller) KeyRegistrar(opts *bind.CallOpts) (common.Address, error)
⋮----
// Owner is a free data retrieval call binding the contract method 0x8da5cb5b.
⋮----
// Solidity: function owner() view returns(address)
func (_CrossChainRegistry *CrossChainRegistryCaller) Owner(opts *bind.CallOpts) (common.Address, error)
⋮----
// Paused is a free data retrieval call binding the contract method 0x5ac86ab7.
⋮----
// Solidity: function paused(uint8 index) view returns(bool)
func (_CrossChainRegistry *CrossChainRegistryCaller) Paused(opts *bind.CallOpts, index uint8) (bool, error)
⋮----
// Paused0 is a free data retrieval call binding the contract method 0x5c975abb.
⋮----
// Solidity: function paused() view returns(uint256)
func (_CrossChainRegistry *CrossChainRegistryCaller) Paused0(opts *bind.CallOpts) (*big.Int, error)
⋮----
// PauserRegistry is a free data retrieval call binding the contract method 0x886f1195.
⋮----
// Solidity: function pauserRegistry() view returns(address)
func (_CrossChainRegistry *CrossChainRegistryCaller) PauserRegistry(opts *bind.CallOpts) (common.Address, error)
⋮----
// PermissionController is a free data retrieval call binding the contract method 0x4657e26a.
⋮----
// Solidity: function permissionController() view returns(address)
func (_CrossChainRegistry *CrossChainRegistryCaller) PermissionController(opts *bind.CallOpts) (common.Address, error)
⋮----
// AddChainIDsToWhitelist is a paid mutator transaction binding the contract method 0x04e98be3.
⋮----
// Solidity: function addChainIDsToWhitelist(uint256[] chainIDs, address[] operatorTableUpdaters) returns()
func (_CrossChainRegistry *CrossChainRegistryTransactor) AddChainIDsToWhitelist(opts *bind.TransactOpts, chainIDs []*big.Int, operatorTableUpdaters []common.Address) (*types.Transaction, error)
⋮----
// CreateGenerationReservation is a paid mutator transaction binding the contract method 0xd5044911.
⋮----
// Solidity: function createGenerationReservation((address,uint32) operatorSet, address operatorTableCalculator, (address,uint32) config) returns()
func (_CrossChainRegistry *CrossChainRegistryTransactor) CreateGenerationReservation(opts *bind.TransactOpts, operatorSet OperatorSet, operatorTableCalculator common.Address, config ICrossChainRegistryTypesOperatorSetConfig) (*types.Transaction, error)
⋮----
// Initialize is a paid mutator transaction binding the contract method 0x0f19aaef.
⋮----
// Solidity: function initialize(address initialOwner, uint32 initialTableUpdateCadence, uint256 initialPausedStatus) returns()
func (_CrossChainRegistry *CrossChainRegistryTransactor) Initialize(opts *bind.TransactOpts, initialOwner common.Address, initialTableUpdateCadence uint32, initialPausedStatus *big.Int) (*types.Transaction, error)
⋮----
// Pause is a paid mutator transaction binding the contract method 0x136439dd.
⋮----
// Solidity: function pause(uint256 newPausedStatus) returns()
func (_CrossChainRegistry *CrossChainRegistryTransactor) Pause(opts *bind.TransactOpts, newPausedStatus *big.Int) (*types.Transaction, error)
⋮----
// PauseAll is a paid mutator transaction binding the contract method 0x595c6a67.
⋮----
// Solidity: function pauseAll() returns()
func (_CrossChainRegistry *CrossChainRegistryTransactor) PauseAll(opts *bind.TransactOpts) (*types.Transaction, error)
⋮----
// RemoveChainIDsFromWhitelist is a paid mutator transaction binding the contract method 0xdfbd9dfd.
⋮----
// Solidity: function removeChainIDsFromWhitelist(uint256[] chainIDs) returns()
func (_CrossChainRegistry *CrossChainRegistryTransactor) RemoveChainIDsFromWhitelist(opts *bind.TransactOpts, chainIDs []*big.Int) (*types.Transaction, error)
⋮----
// RemoveGenerationReservation is a paid mutator transaction binding the contract method 0x6c55a37f.
⋮----
// Solidity: function removeGenerationReservation((address,uint32) operatorSet) returns()
func (_CrossChainRegistry *CrossChainRegistryTransactor) RemoveGenerationReservation(opts *bind.TransactOpts, operatorSet OperatorSet) (*types.Transaction, error)
⋮----
// RenounceOwnership is a paid mutator transaction binding the contract method 0x715018a6.
⋮----
// Solidity: function renounceOwnership() returns()
func (_CrossChainRegistry *CrossChainRegistryTransactor) RenounceOwnership(opts *bind.TransactOpts) (*types.Transaction, error)
⋮----
// SetOperatorSetConfig is a paid mutator transaction binding the contract method 0x277e1e62.
⋮----
// Solidity: function setOperatorSetConfig((address,uint32) operatorSet, (address,uint32) config) returns()
func (_CrossChainRegistry *CrossChainRegistryTransactor) SetOperatorSetConfig(opts *bind.TransactOpts, operatorSet OperatorSet, config ICrossChainRegistryTypesOperatorSetConfig) (*types.Transaction, error)
⋮----
// SetOperatorTableCalculator is a paid mutator transaction binding the contract method 0x1ca9142a.
⋮----
// Solidity: function setOperatorTableCalculator((address,uint32) operatorSet, address operatorTableCalculator) returns()
func (_CrossChainRegistry *CrossChainRegistryTransactor) SetOperatorTableCalculator(opts *bind.TransactOpts, operatorSet OperatorSet, operatorTableCalculator common.Address) (*types.Transaction, error)
⋮----
// SetTableUpdateCadence is a paid mutator transaction binding the contract method 0xd6db9e25.
⋮----
// Solidity: function setTableUpdateCadence(uint32 tableUpdateCadence) returns()
func (_CrossChainRegistry *CrossChainRegistryTransactor) SetTableUpdateCadence(opts *bind.TransactOpts, tableUpdateCadence uint32) (*types.Transaction, error)
⋮----
// TransferOwnership is a paid mutator transaction binding the contract method 0xf2fde38b.
⋮----
// Solidity: function transferOwnership(address newOwner) returns()
func (_CrossChainRegistry *CrossChainRegistryTransactor) TransferOwnership(opts *bind.TransactOpts, newOwner common.Address) (*types.Transaction, error)
⋮----
// Unpause is a paid mutator transaction binding the contract method 0xfabc1cbc.
⋮----
// Solidity: function unpause(uint256 newPausedStatus) returns()
func (_CrossChainRegistry *CrossChainRegistryTransactor) Unpause(opts *bind.TransactOpts, newPausedStatus *big.Int) (*types.Transaction, error)
⋮----
// CrossChainRegistryChainIDAddedToWhitelistIterator is returned from FilterChainIDAddedToWhitelist and is used to iterate over the raw logs and unpacked data for ChainIDAddedToWhitelist events raised by the CrossChainRegistry contract.
type CrossChainRegistryChainIDAddedToWhitelistIterator struct {
	Event *CrossChainRegistryChainIDAddedToWhitelist // 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
}
⋮----
Event *CrossChainRegistryChainIDAddedToWhitelist // 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 *CrossChainRegistryChainIDAddedToWhitelistIterator) Next() bool
⋮----
// If the iterator failed, stop iterating
⋮----
// If the iterator completed, deliver directly whatever's available
⋮----
// Iterator still in progress, wait for either a data or an error event
⋮----
// Error returns any retrieval or parsing error occurred during filtering.
func (it *CrossChainRegistryChainIDAddedToWhitelistIterator) Error() error
⋮----
// Close terminates the iteration process, releasing any pending underlying
// resources.
func (it *CrossChainRegistryChainIDAddedToWhitelistIterator) Close() error
⋮----
// CrossChainRegistryChainIDAddedToWhitelist represents a ChainIDAddedToWhitelist event raised by the CrossChainRegistry contract.
type CrossChainRegistryChainIDAddedToWhitelist struct {
	ChainID              *big.Int
	OperatorTableUpdater common.Address
	Raw                  types.Log // Blockchain specific contextual infos
}
⋮----
Raw                  types.Log // Blockchain specific contextual infos
⋮----
// FilterChainIDAddedToWhitelist is a free log retrieval operation binding the contract event 0x7a0a76d85b582b17996dd7371a407aa7a79b870db8539247fba315c7b6beff62.
⋮----
// Solidity: event ChainIDAddedToWhitelist(uint256 chainID, address operatorTableUpdater)
func (_CrossChainRegistry *CrossChainRegistryFilterer) FilterChainIDAddedToWhitelist(opts *bind.FilterOpts) (*CrossChainRegistryChainIDAddedToWhitelistIterator, error)
⋮----
// WatchChainIDAddedToWhitelist is a free log subscription operation binding the contract event 0x7a0a76d85b582b17996dd7371a407aa7a79b870db8539247fba315c7b6beff62.
⋮----
func (_CrossChainRegistry *CrossChainRegistryFilterer) WatchChainIDAddedToWhitelist(opts *bind.WatchOpts, sink chan<- *CrossChainRegistryChainIDAddedToWhitelist) (event.Subscription, error)
⋮----
// New log arrived, parse the event and forward to the user
⋮----
// ParseChainIDAddedToWhitelist is a log parse operation binding the contract event 0x7a0a76d85b582b17996dd7371a407aa7a79b870db8539247fba315c7b6beff62.
⋮----
func (_CrossChainRegistry *CrossChainRegistryFilterer) ParseChainIDAddedToWhitelist(log types.Log) (*CrossChainRegistryChainIDAddedToWhitelist, error)
⋮----
// CrossChainRegistryChainIDRemovedFromWhitelistIterator is returned from FilterChainIDRemovedFromWhitelist and is used to iterate over the raw logs and unpacked data for ChainIDRemovedFromWhitelist events raised by the CrossChainRegistry contract.
type CrossChainRegistryChainIDRemovedFromWhitelistIterator struct {
	Event *CrossChainRegistryChainIDRemovedFromWhitelist // 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
}
⋮----
Event *CrossChainRegistryChainIDRemovedFromWhitelist // Event containing the contract specifics and raw log
⋮----
// CrossChainRegistryChainIDRemovedFromWhitelist represents a ChainIDRemovedFromWhitelist event raised by the CrossChainRegistry contract.
type CrossChainRegistryChainIDRemovedFromWhitelist struct {
	ChainID *big.Int
	Raw     types.Log // Blockchain specific contextual infos
}
⋮----
Raw     types.Log // Blockchain specific contextual infos
⋮----
// FilterChainIDRemovedFromWhitelist is a free log retrieval operation binding the contract event 0x6824d36084ecf2cd819b137cb5d837cc6e73afce1e0e348c9fdecaa81d0341e5.
⋮----
// Solidity: event ChainIDRemovedFromWhitelist(uint256 chainID)
func (_CrossChainRegistry *CrossChainRegistryFilterer) FilterChainIDRemovedFromWhitelist(opts *bind.FilterOpts) (*CrossChainRegistryChainIDRemovedFromWhitelistIterator, error)
⋮----
// WatchChainIDRemovedFromWhitelist is a free log subscription operation binding the contract event 0x6824d36084ecf2cd819b137cb5d837cc6e73afce1e0e348c9fdecaa81d0341e5.
⋮----
func (_CrossChainRegistry *CrossChainRegistryFilterer) WatchChainIDRemovedFromWhitelist(opts *bind.WatchOpts, sink chan<- *CrossChainRegistryChainIDRemovedFromWhitelist) (event.Subscription, error)
⋮----
// ParseChainIDRemovedFromWhitelist is a log parse operation binding the contract event 0x6824d36084ecf2cd819b137cb5d837cc6e73afce1e0e348c9fdecaa81d0341e5.
⋮----
func (_CrossChainRegistry *CrossChainRegistryFilterer) ParseChainIDRemovedFromWhitelist(log types.Log) (*CrossChainRegistryChainIDRemovedFromWhitelist, error)
⋮----
// CrossChainRegistryGenerationReservationCreatedIterator is returned from FilterGenerationReservationCreated and is used to iterate over the raw logs and unpacked data for GenerationReservationCreated events raised by the CrossChainRegistry contract.
type CrossChainRegistryGenerationReservationCreatedIterator struct {
	Event *CrossChainRegistryGenerationReservationCreated // 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
}
⋮----
Event *CrossChainRegistryGenerationReservationCreated // Event containing the contract specifics and raw log
⋮----
// CrossChainRegistryGenerationReservationCreated represents a GenerationReservationCreated event raised by the CrossChainRegistry contract.
type CrossChainRegistryGenerationReservationCreated struct {
	OperatorSet OperatorSet
	Raw         types.Log // Blockchain specific contextual infos
}
⋮----
Raw         types.Log // Blockchain specific contextual infos
⋮----
// FilterGenerationReservationCreated is a free log retrieval operation binding the contract event 0x4fb6efec7dd60036ce3a7af8d5c48425019daa0fb61eb471a966a7ac2c6fa6a6.
⋮----
// Solidity: event GenerationReservationCreated((address,uint32) operatorSet)
func (_CrossChainRegistry *CrossChainRegistryFilterer) FilterGenerationReservationCreated(opts *bind.FilterOpts) (*CrossChainRegistryGenerationReservationCreatedIterator, error)
⋮----
// WatchGenerationReservationCreated is a free log subscription operation binding the contract event 0x4fb6efec7dd60036ce3a7af8d5c48425019daa0fb61eb471a966a7ac2c6fa6a6.
⋮----
func (_CrossChainRegistry *CrossChainRegistryFilterer) WatchGenerationReservationCreated(opts *bind.WatchOpts, sink chan<- *CrossChainRegistryGenerationReservationCreated) (event.Subscription, error)
⋮----
// ParseGenerationReservationCreated is a log parse operation binding the contract event 0x4fb6efec7dd60036ce3a7af8d5c48425019daa0fb61eb471a966a7ac2c6fa6a6.
⋮----
func (_CrossChainRegistry *CrossChainRegistryFilterer) ParseGenerationReservationCreated(log types.Log) (*CrossChainRegistryGenerationReservationCreated, error)
⋮----
// CrossChainRegistryGenerationReservationRemovedIterator is returned from FilterGenerationReservationRemoved and is used to iterate over the raw logs and unpacked data for GenerationReservationRemoved events raised by the CrossChainRegistry contract.
type CrossChainRegistryGenerationReservationRemovedIterator struct {
	Event *CrossChainRegistryGenerationReservationRemoved // 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
}
⋮----
Event *CrossChainRegistryGenerationReservationRemoved // Event containing the contract specifics and raw log
⋮----
// CrossChainRegistryGenerationReservationRemoved represents a GenerationReservationRemoved event raised by the CrossChainRegistry contract.
type CrossChainRegistryGenerationReservationRemoved struct {
	OperatorSet OperatorSet
	Raw         types.Log // Blockchain specific contextual infos
}
⋮----
// FilterGenerationReservationRemoved is a free log retrieval operation binding the contract event 0x4ffdfdd59e9e1e3c301608788f78dd458e61cb8c045ca92b62a7b484c80824fb.
⋮----
// Solidity: event GenerationReservationRemoved((address,uint32) operatorSet)
func (_CrossChainRegistry *CrossChainRegistryFilterer) FilterGenerationReservationRemoved(opts *bind.FilterOpts) (*CrossChainRegistryGenerationReservationRemovedIterator, error)
⋮----
// WatchGenerationReservationRemoved is a free log subscription operation binding the contract event 0x4ffdfdd59e9e1e3c301608788f78dd458e61cb8c045ca92b62a7b484c80824fb.
⋮----
func (_CrossChainRegistry *CrossChainRegistryFilterer) WatchGenerationReservationRemoved(opts *bind.WatchOpts, sink chan<- *CrossChainRegistryGenerationReservationRemoved) (event.Subscription, error)
⋮----
// ParseGenerationReservationRemoved is a log parse operation binding the contract event 0x4ffdfdd59e9e1e3c301608788f78dd458e61cb8c045ca92b62a7b484c80824fb.
⋮----
func (_CrossChainRegistry *CrossChainRegistryFilterer) ParseGenerationReservationRemoved(log types.Log) (*CrossChainRegistryGenerationReservationRemoved, error)
⋮----
// CrossChainRegistryInitializedIterator is returned from FilterInitialized and is used to iterate over the raw logs and unpacked data for Initialized events raised by the CrossChainRegistry contract.
type CrossChainRegistryInitializedIterator struct {
	Event *CrossChainRegistryInitialized // 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
}
⋮----
Event *CrossChainRegistryInitialized // Event containing the contract specifics and raw log
⋮----
// CrossChainRegistryInitialized represents a Initialized event raised by the CrossChainRegistry contract.
type CrossChainRegistryInitialized 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 (_CrossChainRegistry *CrossChainRegistryFilterer) FilterInitialized(opts *bind.FilterOpts) (*CrossChainRegistryInitializedIterator, error)
⋮----
// WatchInitialized is a free log subscription operation binding the contract event 0x7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb3847402498.
⋮----
func (_CrossChainRegistry *CrossChainRegistryFilterer) WatchInitialized(opts *bind.WatchOpts, sink chan<- *CrossChainRegistryInitialized) (event.Subscription, error)
⋮----
// ParseInitialized is a log parse operation binding the contract event 0x7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb3847402498.
⋮----
func (_CrossChainRegistry *CrossChainRegistryFilterer) ParseInitialized(log types.Log) (*CrossChainRegistryInitialized, error)
⋮----
// CrossChainRegistryOperatorSetConfigRemovedIterator is returned from FilterOperatorSetConfigRemoved and is used to iterate over the raw logs and unpacked data for OperatorSetConfigRemoved events raised by the CrossChainRegistry contract.
type CrossChainRegistryOperatorSetConfigRemovedIterator struct {
	Event *CrossChainRegistryOperatorSetConfigRemoved // 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
}
⋮----
Event *CrossChainRegistryOperatorSetConfigRemoved // Event containing the contract specifics and raw log
⋮----
// CrossChainRegistryOperatorSetConfigRemoved represents a OperatorSetConfigRemoved event raised by the CrossChainRegistry contract.
type CrossChainRegistryOperatorSetConfigRemoved struct {
	OperatorSet OperatorSet
	Raw         types.Log // Blockchain specific contextual infos
}
⋮----
// FilterOperatorSetConfigRemoved is a free log retrieval operation binding the contract event 0x210a1118a869246162804e2a7f21ef808ebd93f4be7ed512014fe29a7a8be02e.
⋮----
// Solidity: event OperatorSetConfigRemoved((address,uint32) operatorSet)
func (_CrossChainRegistry *CrossChainRegistryFilterer) FilterOperatorSetConfigRemoved(opts *bind.FilterOpts) (*CrossChainRegistryOperatorSetConfigRemovedIterator, error)
⋮----
// WatchOperatorSetConfigRemoved is a free log subscription operation binding the contract event 0x210a1118a869246162804e2a7f21ef808ebd93f4be7ed512014fe29a7a8be02e.
⋮----
func (_CrossChainRegistry *CrossChainRegistryFilterer) WatchOperatorSetConfigRemoved(opts *bind.WatchOpts, sink chan<- *CrossChainRegistryOperatorSetConfigRemoved) (event.Subscription, error)
⋮----
// ParseOperatorSetConfigRemoved is a log parse operation binding the contract event 0x210a1118a869246162804e2a7f21ef808ebd93f4be7ed512014fe29a7a8be02e.
⋮----
func (_CrossChainRegistry *CrossChainRegistryFilterer) ParseOperatorSetConfigRemoved(log types.Log) (*CrossChainRegistryOperatorSetConfigRemoved, error)
⋮----
// CrossChainRegistryOperatorSetConfigSetIterator is returned from FilterOperatorSetConfigSet and is used to iterate over the raw logs and unpacked data for OperatorSetConfigSet events raised by the CrossChainRegistry contract.
type CrossChainRegistryOperatorSetConfigSetIterator struct {
	Event *CrossChainRegistryOperatorSetConfigSet // 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
}
⋮----
Event *CrossChainRegistryOperatorSetConfigSet // Event containing the contract specifics and raw log
⋮----
// CrossChainRegistryOperatorSetConfigSet represents a OperatorSetConfigSet event raised by the CrossChainRegistry contract.
type CrossChainRegistryOperatorSetConfigSet struct {
	OperatorSet OperatorSet
	Config      ICrossChainRegistryTypesOperatorSetConfig
	Raw         types.Log // Blockchain specific contextual infos
}
⋮----
// FilterOperatorSetConfigSet is a free log retrieval operation binding the contract event 0x3147846ee526009000671c20380b856a633345691300f82585f90034715cf0e2.
⋮----
// Solidity: event OperatorSetConfigSet((address,uint32) operatorSet, (address,uint32) config)
func (_CrossChainRegistry *CrossChainRegistryFilterer) FilterOperatorSetConfigSet(opts *bind.FilterOpts) (*CrossChainRegistryOperatorSetConfigSetIterator, error)
⋮----
// WatchOperatorSetConfigSet is a free log subscription operation binding the contract event 0x3147846ee526009000671c20380b856a633345691300f82585f90034715cf0e2.
⋮----
func (_CrossChainRegistry *CrossChainRegistryFilterer) WatchOperatorSetConfigSet(opts *bind.WatchOpts, sink chan<- *CrossChainRegistryOperatorSetConfigSet) (event.Subscription, error)
⋮----
// ParseOperatorSetConfigSet is a log parse operation binding the contract event 0x3147846ee526009000671c20380b856a633345691300f82585f90034715cf0e2.
⋮----
func (_CrossChainRegistry *CrossChainRegistryFilterer) ParseOperatorSetConfigSet(log types.Log) (*CrossChainRegistryOperatorSetConfigSet, error)
⋮----
// CrossChainRegistryOperatorTableCalculatorRemovedIterator is returned from FilterOperatorTableCalculatorRemoved and is used to iterate over the raw logs and unpacked data for OperatorTableCalculatorRemoved events raised by the CrossChainRegistry contract.
type CrossChainRegistryOperatorTableCalculatorRemovedIterator struct {
	Event *CrossChainRegistryOperatorTableCalculatorRemoved // 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
}
⋮----
Event *CrossChainRegistryOperatorTableCalculatorRemoved // Event containing the contract specifics and raw log
⋮----
// CrossChainRegistryOperatorTableCalculatorRemoved represents a OperatorTableCalculatorRemoved event raised by the CrossChainRegistry contract.
type CrossChainRegistryOperatorTableCalculatorRemoved struct {
	OperatorSet OperatorSet
	Raw         types.Log // Blockchain specific contextual infos
}
⋮----
// FilterOperatorTableCalculatorRemoved is a free log retrieval operation binding the contract event 0xd7811913efd5d98fc7ea0d1fdd022b3d31987815360842d05b1d1cf55578d16a.
⋮----
// Solidity: event OperatorTableCalculatorRemoved((address,uint32) operatorSet)
func (_CrossChainRegistry *CrossChainRegistryFilterer) FilterOperatorTableCalculatorRemoved(opts *bind.FilterOpts) (*CrossChainRegistryOperatorTableCalculatorRemovedIterator, error)
⋮----
// WatchOperatorTableCalculatorRemoved is a free log subscription operation binding the contract event 0xd7811913efd5d98fc7ea0d1fdd022b3d31987815360842d05b1d1cf55578d16a.
⋮----
func (_CrossChainRegistry *CrossChainRegistryFilterer) WatchOperatorTableCalculatorRemoved(opts *bind.WatchOpts, sink chan<- *CrossChainRegistryOperatorTableCalculatorRemoved) (event.Subscription, error)
⋮----
// ParseOperatorTableCalculatorRemoved is a log parse operation binding the contract event 0xd7811913efd5d98fc7ea0d1fdd022b3d31987815360842d05b1d1cf55578d16a.
⋮----
func (_CrossChainRegistry *CrossChainRegistryFilterer) ParseOperatorTableCalculatorRemoved(log types.Log) (*CrossChainRegistryOperatorTableCalculatorRemoved, error)
⋮----
// CrossChainRegistryOperatorTableCalculatorSetIterator is returned from FilterOperatorTableCalculatorSet and is used to iterate over the raw logs and unpacked data for OperatorTableCalculatorSet events raised by the CrossChainRegistry contract.
type CrossChainRegistryOperatorTableCalculatorSetIterator struct {
	Event *CrossChainRegistryOperatorTableCalculatorSet // 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
}
⋮----
Event *CrossChainRegistryOperatorTableCalculatorSet // Event containing the contract specifics and raw log
⋮----
// CrossChainRegistryOperatorTableCalculatorSet represents a OperatorTableCalculatorSet event raised by the CrossChainRegistry contract.
type CrossChainRegistryOperatorTableCalculatorSet struct {
	OperatorSet             OperatorSet
	OperatorTableCalculator common.Address
	Raw                     types.Log // Blockchain specific contextual infos
}
⋮----
Raw                     types.Log // Blockchain specific contextual infos
⋮----
// FilterOperatorTableCalculatorSet is a free log retrieval operation binding the contract event 0x7f7ccafd92d20fdb39dee184a0dce002a9da420ed0def461f2a027abc9b3f6df.
⋮----
// Solidity: event OperatorTableCalculatorSet((address,uint32) operatorSet, address operatorTableCalculator)
func (_CrossChainRegistry *CrossChainRegistryFilterer) FilterOperatorTableCalculatorSet(opts *bind.FilterOpts) (*CrossChainRegistryOperatorTableCalculatorSetIterator, error)
⋮----
// WatchOperatorTableCalculatorSet is a free log subscription operation binding the contract event 0x7f7ccafd92d20fdb39dee184a0dce002a9da420ed0def461f2a027abc9b3f6df.
⋮----
func (_CrossChainRegistry *CrossChainRegistryFilterer) WatchOperatorTableCalculatorSet(opts *bind.WatchOpts, sink chan<- *CrossChainRegistryOperatorTableCalculatorSet) (event.Subscription, error)
⋮----
// ParseOperatorTableCalculatorSet is a log parse operation binding the contract event 0x7f7ccafd92d20fdb39dee184a0dce002a9da420ed0def461f2a027abc9b3f6df.
⋮----
func (_CrossChainRegistry *CrossChainRegistryFilterer) ParseOperatorTableCalculatorSet(log types.Log) (*CrossChainRegistryOperatorTableCalculatorSet, error)
⋮----
// CrossChainRegistryOwnershipTransferredIterator is returned from FilterOwnershipTransferred and is used to iterate over the raw logs and unpacked data for OwnershipTransferred events raised by the CrossChainRegistry contract.
type CrossChainRegistryOwnershipTransferredIterator struct {
	Event *CrossChainRegistryOwnershipTransferred // 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
}
⋮----
Event *CrossChainRegistryOwnershipTransferred // Event containing the contract specifics and raw log
⋮----
// CrossChainRegistryOwnershipTransferred represents a OwnershipTransferred event raised by the CrossChainRegistry contract.
type CrossChainRegistryOwnershipTransferred struct {
	PreviousOwner common.Address
	NewOwner      common.Address
	Raw           types.Log // Blockchain specific contextual infos
}
⋮----
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 (_CrossChainRegistry *CrossChainRegistryFilterer) FilterOwnershipTransferred(opts *bind.FilterOpts, previousOwner []common.Address, newOwner []common.Address) (*CrossChainRegistryOwnershipTransferredIterator, error)
⋮----
var previousOwnerRule []interface{}
⋮----
var newOwnerRule []interface{}
⋮----
// WatchOwnershipTransferred is a free log subscription operation binding the contract event 0x8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0.
⋮----
func (_CrossChainRegistry *CrossChainRegistryFilterer) WatchOwnershipTransferred(opts *bind.WatchOpts, sink chan<- *CrossChainRegistryOwnershipTransferred, previousOwner []common.Address, newOwner []common.Address) (event.Subscription, error)
⋮----
// ParseOwnershipTransferred is a log parse operation binding the contract event 0x8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0.
⋮----
func (_CrossChainRegistry *CrossChainRegistryFilterer) ParseOwnershipTransferred(log types.Log) (*CrossChainRegistryOwnershipTransferred, error)
⋮----
// CrossChainRegistryPausedIterator is returned from FilterPaused and is used to iterate over the raw logs and unpacked data for Paused events raised by the CrossChainRegistry contract.
type CrossChainRegistryPausedIterator struct {
	Event *CrossChainRegistryPaused // 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
}
⋮----
Event *CrossChainRegistryPaused // Event containing the contract specifics and raw log
⋮----
// CrossChainRegistryPaused represents a Paused event raised by the CrossChainRegistry contract.
type CrossChainRegistryPaused struct {
	Account         common.Address
	NewPausedStatus *big.Int
	Raw             types.Log // Blockchain specific contextual infos
}
⋮----
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 (_CrossChainRegistry *CrossChainRegistryFilterer) FilterPaused(opts *bind.FilterOpts, account []common.Address) (*CrossChainRegistryPausedIterator, error)
⋮----
var accountRule []interface{}
⋮----
// WatchPaused is a free log subscription operation binding the contract event 0xab40a374bc51de372200a8bc981af8c9ecdc08dfdaef0bb6e09f88f3c616ef3d.
⋮----
func (_CrossChainRegistry *CrossChainRegistryFilterer) WatchPaused(opts *bind.WatchOpts, sink chan<- *CrossChainRegistryPaused, account []common.Address) (event.Subscription, error)
⋮----
// ParsePaused is a log parse operation binding the contract event 0xab40a374bc51de372200a8bc981af8c9ecdc08dfdaef0bb6e09f88f3c616ef3d.
⋮----
func (_CrossChainRegistry *CrossChainRegistryFilterer) ParsePaused(log types.Log) (*CrossChainRegistryPaused, error)
⋮----
// CrossChainRegistryTableUpdateCadenceSetIterator is returned from FilterTableUpdateCadenceSet and is used to iterate over the raw logs and unpacked data for TableUpdateCadenceSet events raised by the CrossChainRegistry contract.
type CrossChainRegistryTableUpdateCadenceSetIterator struct {
	Event *CrossChainRegistryTableUpdateCadenceSet // 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
}
⋮----
Event *CrossChainRegistryTableUpdateCadenceSet // Event containing the contract specifics and raw log
⋮----
// CrossChainRegistryTableUpdateCadenceSet represents a TableUpdateCadenceSet event raised by the CrossChainRegistry contract.
type CrossChainRegistryTableUpdateCadenceSet struct {
	TableUpdateCadence uint32
	Raw                types.Log // Blockchain specific contextual infos
}
⋮----
Raw                types.Log // Blockchain specific contextual infos
⋮----
// FilterTableUpdateCadenceSet is a free log retrieval operation binding the contract event 0x4fbcd0cca70015b33db8af4aa4f2bd6fd6c1efa9460b8e2333f252c1467a6327.
⋮----
// Solidity: event TableUpdateCadenceSet(uint32 tableUpdateCadence)
func (_CrossChainRegistry *CrossChainRegistryFilterer) FilterTableUpdateCadenceSet(opts *bind.FilterOpts) (*CrossChainRegistryTableUpdateCadenceSetIterator, error)
⋮----
// WatchTableUpdateCadenceSet is a free log subscription operation binding the contract event 0x4fbcd0cca70015b33db8af4aa4f2bd6fd6c1efa9460b8e2333f252c1467a6327.
⋮----
func (_CrossChainRegistry *CrossChainRegistryFilterer) WatchTableUpdateCadenceSet(opts *bind.WatchOpts, sink chan<- *CrossChainRegistryTableUpdateCadenceSet) (event.Subscription, error)
⋮----
// ParseTableUpdateCadenceSet is a log parse operation binding the contract event 0x4fbcd0cca70015b33db8af4aa4f2bd6fd6c1efa9460b8e2333f252c1467a6327.
⋮----
func (_CrossChainRegistry *CrossChainRegistryFilterer) ParseTableUpdateCadenceSet(log types.Log) (*CrossChainRegistryTableUpdateCadenceSet, error)
⋮----
// CrossChainRegistryUnpausedIterator is returned from FilterUnpaused and is used to iterate over the raw logs and unpacked data for Unpaused events raised by the CrossChainRegistry contract.
type CrossChainRegistryUnpausedIterator struct {
	Event *CrossChainRegistryUnpaused // 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
}
⋮----
Event *CrossChainRegistryUnpaused // Event containing the contract specifics and raw log
⋮----
// CrossChainRegistryUnpaused represents a Unpaused event raised by the CrossChainRegistry contract.
type CrossChainRegistryUnpaused 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 (_CrossChainRegistry *CrossChainRegistryFilterer) FilterUnpaused(opts *bind.FilterOpts, account []common.Address) (*CrossChainRegistryUnpausedIterator, error)
⋮----
// WatchUnpaused is a free log subscription operation binding the contract event 0x3582d1828e26bf56bd801502bc021ac0bc8afb57c826e4986b45593c8fad389c.
⋮----
func (_CrossChainRegistry *CrossChainRegistryFilterer) WatchUnpaused(opts *bind.WatchOpts, sink chan<- *CrossChainRegistryUnpaused, account []common.Address) (event.Subscription, error)
⋮----
// ParseUnpaused is a log parse operation binding the contract event 0x3582d1828e26bf56bd801502bc021ac0bc8afb57c826e4986b45593c8fad389c.
⋮----
func (_CrossChainRegistry *CrossChainRegistryFilterer) ParseUnpaused(log types.Log) (*CrossChainRegistryUnpaused, error)
````

## File: pkg/bindings/CrossChainRegistryStorage/binding.go
````go
// Code generated - DO NOT EDIT.
// This file is a generated binding and any manual changes will be lost.
⋮----
package CrossChainRegistryStorage
⋮----
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"
)
⋮----
"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
)
⋮----
// ICrossChainRegistryTypesOperatorSetConfig is an auto generated low-level Go binding around an user-defined struct.
type ICrossChainRegistryTypesOperatorSetConfig struct {
	Owner              common.Address
	MaxStalenessPeriod uint32
}
⋮----
// OperatorSet is an auto generated low-level Go binding around an user-defined struct.
type OperatorSet struct {
	Avs common.Address
	Id  uint32
}
⋮----
// CrossChainRegistryStorageMetaData contains all meta data concerning the CrossChainRegistryStorage contract.
var CrossChainRegistryStorageMetaData = &bind.MetaData{
	ABI: "[{\"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\":\"keyRegistrar\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIKeyRegistrar\"}],\"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\":\"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\":\"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\":\"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\":\"TableUpdateCadenceSet\",\"inputs\":[{\"name\":\"tableUpdateCadence\",\"type\":\"uint32\",\"indexed\":false,\"internalType\":\"uint32\"}],\"anonymous\":false},{\"type\":\"error\",\"name\":\"ArrayLengthMismatch\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ChainIDAlreadyWhitelisted\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ChainIDNotWhitelisted\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"EmptyChainIDsArray\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"GenerationReservationAlreadyExists\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"GenerationReservationDoesNotExist\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidChainId\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidEndIndex\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidOperatorSet\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidRange\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidStalenessPeriod\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidTableUpdateCadence\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"KeyTypeNotSet\",\"inputs\":[]}]",
}
⋮----
// CrossChainRegistryStorageABI is the input ABI used to generate the binding from.
// Deprecated: Use CrossChainRegistryStorageMetaData.ABI instead.
var CrossChainRegistryStorageABI = CrossChainRegistryStorageMetaData.ABI
⋮----
// CrossChainRegistryStorage is an auto generated Go binding around an Ethereum contract.
type CrossChainRegistryStorage struct {
	CrossChainRegistryStorageCaller     // Read-only binding to the contract
	CrossChainRegistryStorageTransactor // Write-only binding to the contract
	CrossChainRegistryStorageFilterer   // Log filterer for contract events
}
⋮----
CrossChainRegistryStorageCaller     // Read-only binding to the contract
CrossChainRegistryStorageTransactor // Write-only binding to the contract
CrossChainRegistryStorageFilterer   // Log filterer for contract events
⋮----
// CrossChainRegistryStorageCaller is an auto generated read-only Go binding around an Ethereum contract.
type CrossChainRegistryStorageCaller struct {
	contract *bind.BoundContract // Generic contract wrapper for the low level calls
}
⋮----
contract *bind.BoundContract // Generic contract wrapper for the low level calls
⋮----
// CrossChainRegistryStorageTransactor is an auto generated write-only Go binding around an Ethereum contract.
type CrossChainRegistryStorageTransactor struct {
	contract *bind.BoundContract // Generic contract wrapper for the low level calls
}
⋮----
// CrossChainRegistryStorageFilterer is an auto generated log filtering Go binding around an Ethereum contract events.
type CrossChainRegistryStorageFilterer struct {
	contract *bind.BoundContract // Generic contract wrapper for the low level calls
}
⋮----
// CrossChainRegistryStorageSession is an auto generated Go binding around an Ethereum contract,
// with pre-set call and transact options.
type CrossChainRegistryStorageSession struct {
	Contract     *CrossChainRegistryStorage // 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
}
⋮----
Contract     *CrossChainRegistryStorage // 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
⋮----
// CrossChainRegistryStorageCallerSession is an auto generated read-only Go binding around an Ethereum contract,
// with pre-set call options.
type CrossChainRegistryStorageCallerSession struct {
	Contract *CrossChainRegistryStorageCaller // Generic contract caller binding to set the session for
	CallOpts bind.CallOpts                    // Call options to use throughout this session
}
⋮----
Contract *CrossChainRegistryStorageCaller // Generic contract caller binding to set the session for
CallOpts bind.CallOpts                    // Call options to use throughout this session
⋮----
// CrossChainRegistryStorageTransactorSession is an auto generated write-only Go binding around an Ethereum contract,
// with pre-set transact options.
type CrossChainRegistryStorageTransactorSession struct {
	Contract     *CrossChainRegistryStorageTransactor // Generic contract transactor binding to set the session for
	TransactOpts bind.TransactOpts                    // Transaction auth options to use throughout this session
}
⋮----
Contract     *CrossChainRegistryStorageTransactor // Generic contract transactor binding to set the session for
TransactOpts bind.TransactOpts                    // Transaction auth options to use throughout this session
⋮----
// CrossChainRegistryStorageRaw is an auto generated low-level Go binding around an Ethereum contract.
type CrossChainRegistryStorageRaw struct {
	Contract *CrossChainRegistryStorage // Generic contract binding to access the raw methods on
}
⋮----
Contract *CrossChainRegistryStorage // Generic contract binding to access the raw methods on
⋮----
// CrossChainRegistryStorageCallerRaw is an auto generated low-level read-only Go binding around an Ethereum contract.
type CrossChainRegistryStorageCallerRaw struct {
	Contract *CrossChainRegistryStorageCaller // Generic read-only contract binding to access the raw methods on
}
⋮----
Contract *CrossChainRegistryStorageCaller // Generic read-only contract binding to access the raw methods on
⋮----
// CrossChainRegistryStorageTransactorRaw is an auto generated low-level write-only Go binding around an Ethereum contract.
type CrossChainRegistryStorageTransactorRaw struct {
	Contract *CrossChainRegistryStorageTransactor // Generic write-only contract binding to access the raw methods on
}
⋮----
Contract *CrossChainRegistryStorageTransactor // Generic write-only contract binding to access the raw methods on
⋮----
// NewCrossChainRegistryStorage creates a new instance of CrossChainRegistryStorage, bound to a specific deployed contract.
func NewCrossChainRegistryStorage(address common.Address, backend bind.ContractBackend) (*CrossChainRegistryStorage, error)
⋮----
// NewCrossChainRegistryStorageCaller creates a new read-only instance of CrossChainRegistryStorage, bound to a specific deployed contract.
func NewCrossChainRegistryStorageCaller(address common.Address, caller bind.ContractCaller) (*CrossChainRegistryStorageCaller, error)
⋮----
// NewCrossChainRegistryStorageTransactor creates a new write-only instance of CrossChainRegistryStorage, bound to a specific deployed contract.
func NewCrossChainRegistryStorageTransactor(address common.Address, transactor bind.ContractTransactor) (*CrossChainRegistryStorageTransactor, error)
⋮----
// NewCrossChainRegistryStorageFilterer creates a new log filterer instance of CrossChainRegistryStorage, bound to a specific deployed contract.
func NewCrossChainRegistryStorageFilterer(address common.Address, filterer bind.ContractFilterer) (*CrossChainRegistryStorageFilterer, error)
⋮----
// bindCrossChainRegistryStorage binds a generic wrapper to an already deployed contract.
func bindCrossChainRegistryStorage(address common.Address, caller bind.ContractCaller, transactor bind.ContractTransactor, filterer bind.ContractFilterer) (*bind.BoundContract, error)
⋮----
// 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 (_CrossChainRegistryStorage *CrossChainRegistryStorageRaw) Call(opts *bind.CallOpts, result *[]interface
⋮----
// Transfer initiates a plain transaction to move funds to the contract, calling
// its default method if one is available.
func (_CrossChainRegistryStorage *CrossChainRegistryStorageRaw) Transfer(opts *bind.TransactOpts) (*types.Transaction, error)
⋮----
// Transact invokes the (paid) contract method with params as input values.
func (_CrossChainRegistryStorage *CrossChainRegistryStorageRaw) Transact(opts *bind.TransactOpts, method string, params ...interface
⋮----
// AllocationManager is a free data retrieval call binding the contract method 0xca8aa7c7.
//
// Solidity: function allocationManager() view returns(address)
func (_CrossChainRegistryStorage *CrossChainRegistryStorageCaller) AllocationManager(opts *bind.CallOpts) (common.Address, error)
⋮----
var out []interface{}
⋮----
// CalculateOperatorTableBytes is a free data retrieval call binding the contract method 0x41ee6d0e.
⋮----
// Solidity: function calculateOperatorTableBytes((address,uint32) operatorSet) view returns(bytes)
func (_CrossChainRegistryStorage *CrossChainRegistryStorageCaller) CalculateOperatorTableBytes(opts *bind.CallOpts, operatorSet OperatorSet) ([]byte, error)
⋮----
// GetActiveGenerationReservationCount is a free data retrieval call binding the contract method 0xb186a60e.
⋮----
// Solidity: function getActiveGenerationReservationCount() view returns(uint256)
func (_CrossChainRegistryStorage *CrossChainRegistryStorageCaller) GetActiveGenerationReservationCount(opts *bind.CallOpts) (*big.Int, error)
⋮----
// GetActiveGenerationReservations is a free data retrieval call binding the contract method 0xd09b978b.
⋮----
// Solidity: function getActiveGenerationReservations() view returns((address,uint32)[])
func (_CrossChainRegistryStorage *CrossChainRegistryStorageCaller) GetActiveGenerationReservations(opts *bind.CallOpts) ([]OperatorSet, error)
⋮----
// GetActiveGenerationReservationsByRange is a free data retrieval call binding the contract method 0xd9a6729e.
⋮----
// Solidity: function getActiveGenerationReservationsByRange(uint256 startIndex, uint256 endIndex) view returns((address,uint32)[])
func (_CrossChainRegistryStorage *CrossChainRegistryStorageCaller) GetActiveGenerationReservationsByRange(opts *bind.CallOpts, startIndex *big.Int, endIndex *big.Int) ([]OperatorSet, error)
⋮----
// GetOperatorSetConfig is a free data retrieval call binding the contract method 0x21fa7fdc.
⋮----
// Solidity: function getOperatorSetConfig((address,uint32) operatorSet) view returns((address,uint32))
func (_CrossChainRegistryStorage *CrossChainRegistryStorageCaller) GetOperatorSetConfig(opts *bind.CallOpts, operatorSet OperatorSet) (ICrossChainRegistryTypesOperatorSetConfig, error)
⋮----
// GetOperatorTableCalculator is a free data retrieval call binding the contract method 0x75e4b539.
⋮----
// Solidity: function getOperatorTableCalculator((address,uint32) operatorSet) view returns(address)
func (_CrossChainRegistryStorage *CrossChainRegistryStorageCaller) GetOperatorTableCalculator(opts *bind.CallOpts, operatorSet OperatorSet) (common.Address, error)
⋮----
// GetSupportedChains is a free data retrieval call binding the contract method 0xc4bffe2b.
⋮----
// Solidity: function getSupportedChains() view returns(uint256[], address[])
func (_CrossChainRegistryStorage *CrossChainRegistryStorageCaller) GetSupportedChains(opts *bind.CallOpts) ([]*big.Int, []common.Address, error)
⋮----
// GetTableUpdateCadence is a free data retrieval call binding the contract method 0xac505f4b.
⋮----
// Solidity: function getTableUpdateCadence() view returns(uint32)
func (_CrossChainRegistryStorage *CrossChainRegistryStorageCaller) GetTableUpdateCadence(opts *bind.CallOpts) (uint32, error)
⋮----
// HasActiveGenerationReservation is a free data retrieval call binding the contract method 0x36b200de.
⋮----
// Solidity: function hasActiveGenerationReservation((address,uint32) operatorSet) view returns(bool)
func (_CrossChainRegistryStorage *CrossChainRegistryStorageCaller) HasActiveGenerationReservation(opts *bind.CallOpts, operatorSet OperatorSet) (bool, error)
⋮----
// KeyRegistrar is a free data retrieval call binding the contract method 0x3ec45c7e.
⋮----
// Solidity: function keyRegistrar() view returns(address)
func (_CrossChainRegistryStorage *CrossChainRegistryStorageCaller) KeyRegistrar(opts *bind.CallOpts) (common.Address, error)
⋮----
// AddChainIDsToWhitelist is a paid mutator transaction binding the contract method 0x04e98be3.
⋮----
// Solidity: function addChainIDsToWhitelist(uint256[] chainIDs, address[] operatorTableUpdaters) returns()
func (_CrossChainRegistryStorage *CrossChainRegistryStorageTransactor) AddChainIDsToWhitelist(opts *bind.TransactOpts, chainIDs []*big.Int, operatorTableUpdaters []common.Address) (*types.Transaction, error)
⋮----
// CreateGenerationReservation is a paid mutator transaction binding the contract method 0xd5044911.
⋮----
// Solidity: function createGenerationReservation((address,uint32) operatorSet, address operatorTableCalculator, (address,uint32) config) returns()
func (_CrossChainRegistryStorage *CrossChainRegistryStorageTransactor) CreateGenerationReservation(opts *bind.TransactOpts, operatorSet OperatorSet, operatorTableCalculator common.Address, config ICrossChainRegistryTypesOperatorSetConfig) (*types.Transaction, error)
⋮----
// RemoveChainIDsFromWhitelist is a paid mutator transaction binding the contract method 0xdfbd9dfd.
⋮----
// Solidity: function removeChainIDsFromWhitelist(uint256[] chainIDs) returns()
func (_CrossChainRegistryStorage *CrossChainRegistryStorageTransactor) RemoveChainIDsFromWhitelist(opts *bind.TransactOpts, chainIDs []*big.Int) (*types.Transaction, error)
⋮----
// RemoveGenerationReservation is a paid mutator transaction binding the contract method 0x6c55a37f.
⋮----
// Solidity: function removeGenerationReservation((address,uint32) operatorSet) returns()
func (_CrossChainRegistryStorage *CrossChainRegistryStorageTransactor) RemoveGenerationReservation(opts *bind.TransactOpts, operatorSet OperatorSet) (*types.Transaction, error)
⋮----
// SetOperatorSetConfig is a paid mutator transaction binding the contract method 0x277e1e62.
⋮----
// Solidity: function setOperatorSetConfig((address,uint32) operatorSet, (address,uint32) config) returns()
func (_CrossChainRegistryStorage *CrossChainRegistryStorageTransactor) SetOperatorSetConfig(opts *bind.TransactOpts, operatorSet OperatorSet, config ICrossChainRegistryTypesOperatorSetConfig) (*types.Transaction, error)
⋮----
// SetOperatorTableCalculator is a paid mutator transaction binding the contract method 0x1ca9142a.
⋮----
// Solidity: function setOperatorTableCalculator((address,uint32) operatorSet, address operatorTableCalculator) returns()
func (_CrossChainRegistryStorage *CrossChainRegistryStorageTransactor) SetOperatorTableCalculator(opts *bind.TransactOpts, operatorSet OperatorSet, operatorTableCalculator common.Address) (*types.Transaction, error)
⋮----
// SetTableUpdateCadence is a paid mutator transaction binding the contract method 0xd6db9e25.
⋮----
// Solidity: function setTableUpdateCadence(uint32 tableUpdateCadence) returns()
func (_CrossChainRegistryStorage *CrossChainRegistryStorageTransactor) SetTableUpdateCadence(opts *bind.TransactOpts, tableUpdateCadence uint32) (*types.Transaction, error)
⋮----
// CrossChainRegistryStorageChainIDAddedToWhitelistIterator is returned from FilterChainIDAddedToWhitelist and is used to iterate over the raw logs and unpacked data for ChainIDAddedToWhitelist events raised by the CrossChainRegistryStorage contract.
type CrossChainRegistryStorageChainIDAddedToWhitelistIterator struct {
	Event *CrossChainRegistryStorageChainIDAddedToWhitelist // 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
}
⋮----
Event *CrossChainRegistryStorageChainIDAddedToWhitelist // 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 *CrossChainRegistryStorageChainIDAddedToWhitelistIterator) Next() bool
⋮----
// If the iterator failed, stop iterating
⋮----
// If the iterator completed, deliver directly whatever's available
⋮----
// Iterator still in progress, wait for either a data or an error event
⋮----
// Error returns any retrieval or parsing error occurred during filtering.
func (it *CrossChainRegistryStorageChainIDAddedToWhitelistIterator) Error() error
⋮----
// Close terminates the iteration process, releasing any pending underlying
// resources.
func (it *CrossChainRegistryStorageChainIDAddedToWhitelistIterator) Close() error
⋮----
// CrossChainRegistryStorageChainIDAddedToWhitelist represents a ChainIDAddedToWhitelist event raised by the CrossChainRegistryStorage contract.
type CrossChainRegistryStorageChainIDAddedToWhitelist struct {
	ChainID              *big.Int
	OperatorTableUpdater common.Address
	Raw                  types.Log // Blockchain specific contextual infos
}
⋮----
Raw                  types.Log // Blockchain specific contextual infos
⋮----
// FilterChainIDAddedToWhitelist is a free log retrieval operation binding the contract event 0x7a0a76d85b582b17996dd7371a407aa7a79b870db8539247fba315c7b6beff62.
⋮----
// Solidity: event ChainIDAddedToWhitelist(uint256 chainID, address operatorTableUpdater)
func (_CrossChainRegistryStorage *CrossChainRegistryStorageFilterer) FilterChainIDAddedToWhitelist(opts *bind.FilterOpts) (*CrossChainRegistryStorageChainIDAddedToWhitelistIterator, error)
⋮----
// WatchChainIDAddedToWhitelist is a free log subscription operation binding the contract event 0x7a0a76d85b582b17996dd7371a407aa7a79b870db8539247fba315c7b6beff62.
⋮----
func (_CrossChainRegistryStorage *CrossChainRegistryStorageFilterer) WatchChainIDAddedToWhitelist(opts *bind.WatchOpts, sink chan<- *CrossChainRegistryStorageChainIDAddedToWhitelist) (event.Subscription, error)
⋮----
// New log arrived, parse the event and forward to the user
⋮----
// ParseChainIDAddedToWhitelist is a log parse operation binding the contract event 0x7a0a76d85b582b17996dd7371a407aa7a79b870db8539247fba315c7b6beff62.
⋮----
func (_CrossChainRegistryStorage *CrossChainRegistryStorageFilterer) ParseChainIDAddedToWhitelist(log types.Log) (*CrossChainRegistryStorageChainIDAddedToWhitelist, error)
⋮----
// CrossChainRegistryStorageChainIDRemovedFromWhitelistIterator is returned from FilterChainIDRemovedFromWhitelist and is used to iterate over the raw logs and unpacked data for ChainIDRemovedFromWhitelist events raised by the CrossChainRegistryStorage contract.
type CrossChainRegistryStorageChainIDRemovedFromWhitelistIterator struct {
	Event *CrossChainRegistryStorageChainIDRemovedFromWhitelist // 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
}
⋮----
Event *CrossChainRegistryStorageChainIDRemovedFromWhitelist // Event containing the contract specifics and raw log
⋮----
// CrossChainRegistryStorageChainIDRemovedFromWhitelist represents a ChainIDRemovedFromWhitelist event raised by the CrossChainRegistryStorage contract.
type CrossChainRegistryStorageChainIDRemovedFromWhitelist struct {
	ChainID *big.Int
	Raw     types.Log // Blockchain specific contextual infos
}
⋮----
Raw     types.Log // Blockchain specific contextual infos
⋮----
// FilterChainIDRemovedFromWhitelist is a free log retrieval operation binding the contract event 0x6824d36084ecf2cd819b137cb5d837cc6e73afce1e0e348c9fdecaa81d0341e5.
⋮----
// Solidity: event ChainIDRemovedFromWhitelist(uint256 chainID)
func (_CrossChainRegistryStorage *CrossChainRegistryStorageFilterer) FilterChainIDRemovedFromWhitelist(opts *bind.FilterOpts) (*CrossChainRegistryStorageChainIDRemovedFromWhitelistIterator, error)
⋮----
// WatchChainIDRemovedFromWhitelist is a free log subscription operation binding the contract event 0x6824d36084ecf2cd819b137cb5d837cc6e73afce1e0e348c9fdecaa81d0341e5.
⋮----
func (_CrossChainRegistryStorage *CrossChainRegistryStorageFilterer) WatchChainIDRemovedFromWhitelist(opts *bind.WatchOpts, sink chan<- *CrossChainRegistryStorageChainIDRemovedFromWhitelist) (event.Subscription, error)
⋮----
// ParseChainIDRemovedFromWhitelist is a log parse operation binding the contract event 0x6824d36084ecf2cd819b137cb5d837cc6e73afce1e0e348c9fdecaa81d0341e5.
⋮----
func (_CrossChainRegistryStorage *CrossChainRegistryStorageFilterer) ParseChainIDRemovedFromWhitelist(log types.Log) (*CrossChainRegistryStorageChainIDRemovedFromWhitelist, error)
⋮----
// CrossChainRegistryStorageGenerationReservationCreatedIterator is returned from FilterGenerationReservationCreated and is used to iterate over the raw logs and unpacked data for GenerationReservationCreated events raised by the CrossChainRegistryStorage contract.
type CrossChainRegistryStorageGenerationReservationCreatedIterator struct {
	Event *CrossChainRegistryStorageGenerationReservationCreated // 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
}
⋮----
Event *CrossChainRegistryStorageGenerationReservationCreated // Event containing the contract specifics and raw log
⋮----
// CrossChainRegistryStorageGenerationReservationCreated represents a GenerationReservationCreated event raised by the CrossChainRegistryStorage contract.
type CrossChainRegistryStorageGenerationReservationCreated struct {
	OperatorSet OperatorSet
	Raw         types.Log // Blockchain specific contextual infos
}
⋮----
Raw         types.Log // Blockchain specific contextual infos
⋮----
// FilterGenerationReservationCreated is a free log retrieval operation binding the contract event 0x4fb6efec7dd60036ce3a7af8d5c48425019daa0fb61eb471a966a7ac2c6fa6a6.
⋮----
// Solidity: event GenerationReservationCreated((address,uint32) operatorSet)
func (_CrossChainRegistryStorage *CrossChainRegistryStorageFilterer) FilterGenerationReservationCreated(opts *bind.FilterOpts) (*CrossChainRegistryStorageGenerationReservationCreatedIterator, error)
⋮----
// WatchGenerationReservationCreated is a free log subscription operation binding the contract event 0x4fb6efec7dd60036ce3a7af8d5c48425019daa0fb61eb471a966a7ac2c6fa6a6.
⋮----
func (_CrossChainRegistryStorage *CrossChainRegistryStorageFilterer) WatchGenerationReservationCreated(opts *bind.WatchOpts, sink chan<- *CrossChainRegistryStorageGenerationReservationCreated) (event.Subscription, error)
⋮----
// ParseGenerationReservationCreated is a log parse operation binding the contract event 0x4fb6efec7dd60036ce3a7af8d5c48425019daa0fb61eb471a966a7ac2c6fa6a6.
⋮----
func (_CrossChainRegistryStorage *CrossChainRegistryStorageFilterer) ParseGenerationReservationCreated(log types.Log) (*CrossChainRegistryStorageGenerationReservationCreated, error)
⋮----
// CrossChainRegistryStorageGenerationReservationRemovedIterator is returned from FilterGenerationReservationRemoved and is used to iterate over the raw logs and unpacked data for GenerationReservationRemoved events raised by the CrossChainRegistryStorage contract.
type CrossChainRegistryStorageGenerationReservationRemovedIterator struct {
	Event *CrossChainRegistryStorageGenerationReservationRemoved // 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
}
⋮----
Event *CrossChainRegistryStorageGenerationReservationRemoved // Event containing the contract specifics and raw log
⋮----
// CrossChainRegistryStorageGenerationReservationRemoved represents a GenerationReservationRemoved event raised by the CrossChainRegistryStorage contract.
type CrossChainRegistryStorageGenerationReservationRemoved struct {
	OperatorSet OperatorSet
	Raw         types.Log // Blockchain specific contextual infos
}
⋮----
// FilterGenerationReservationRemoved is a free log retrieval operation binding the contract event 0x4ffdfdd59e9e1e3c301608788f78dd458e61cb8c045ca92b62a7b484c80824fb.
⋮----
// Solidity: event GenerationReservationRemoved((address,uint32) operatorSet)
func (_CrossChainRegistryStorage *CrossChainRegistryStorageFilterer) FilterGenerationReservationRemoved(opts *bind.FilterOpts) (*CrossChainRegistryStorageGenerationReservationRemovedIterator, error)
⋮----
// WatchGenerationReservationRemoved is a free log subscription operation binding the contract event 0x4ffdfdd59e9e1e3c301608788f78dd458e61cb8c045ca92b62a7b484c80824fb.
⋮----
func (_CrossChainRegistryStorage *CrossChainRegistryStorageFilterer) WatchGenerationReservationRemoved(opts *bind.WatchOpts, sink chan<- *CrossChainRegistryStorageGenerationReservationRemoved) (event.Subscription, error)
⋮----
// ParseGenerationReservationRemoved is a log parse operation binding the contract event 0x4ffdfdd59e9e1e3c301608788f78dd458e61cb8c045ca92b62a7b484c80824fb.
⋮----
func (_CrossChainRegistryStorage *CrossChainRegistryStorageFilterer) ParseGenerationReservationRemoved(log types.Log) (*CrossChainRegistryStorageGenerationReservationRemoved, error)
⋮----
// CrossChainRegistryStorageOperatorSetConfigRemovedIterator is returned from FilterOperatorSetConfigRemoved and is used to iterate over the raw logs and unpacked data for OperatorSetConfigRemoved events raised by the CrossChainRegistryStorage contract.
type CrossChainRegistryStorageOperatorSetConfigRemovedIterator struct {
	Event *CrossChainRegistryStorageOperatorSetConfigRemoved // 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
}
⋮----
Event *CrossChainRegistryStorageOperatorSetConfigRemoved // Event containing the contract specifics and raw log
⋮----
// CrossChainRegistryStorageOperatorSetConfigRemoved represents a OperatorSetConfigRemoved event raised by the CrossChainRegistryStorage contract.
type CrossChainRegistryStorageOperatorSetConfigRemoved struct {
	OperatorSet OperatorSet
	Raw         types.Log // Blockchain specific contextual infos
}
⋮----
// FilterOperatorSetConfigRemoved is a free log retrieval operation binding the contract event 0x210a1118a869246162804e2a7f21ef808ebd93f4be7ed512014fe29a7a8be02e.
⋮----
// Solidity: event OperatorSetConfigRemoved((address,uint32) operatorSet)
func (_CrossChainRegistryStorage *CrossChainRegistryStorageFilterer) FilterOperatorSetConfigRemoved(opts *bind.FilterOpts) (*CrossChainRegistryStorageOperatorSetConfigRemovedIterator, error)
⋮----
// WatchOperatorSetConfigRemoved is a free log subscription operation binding the contract event 0x210a1118a869246162804e2a7f21ef808ebd93f4be7ed512014fe29a7a8be02e.
⋮----
func (_CrossChainRegistryStorage *CrossChainRegistryStorageFilterer) WatchOperatorSetConfigRemoved(opts *bind.WatchOpts, sink chan<- *CrossChainRegistryStorageOperatorSetConfigRemoved) (event.Subscription, error)
⋮----
// ParseOperatorSetConfigRemoved is a log parse operation binding the contract event 0x210a1118a869246162804e2a7f21ef808ebd93f4be7ed512014fe29a7a8be02e.
⋮----
func (_CrossChainRegistryStorage *CrossChainRegistryStorageFilterer) ParseOperatorSetConfigRemoved(log types.Log) (*CrossChainRegistryStorageOperatorSetConfigRemoved, error)
⋮----
// CrossChainRegistryStorageOperatorSetConfigSetIterator is returned from FilterOperatorSetConfigSet and is used to iterate over the raw logs and unpacked data for OperatorSetConfigSet events raised by the CrossChainRegistryStorage contract.
type CrossChainRegistryStorageOperatorSetConfigSetIterator struct {
	Event *CrossChainRegistryStorageOperatorSetConfigSet // 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
}
⋮----
Event *CrossChainRegistryStorageOperatorSetConfigSet // Event containing the contract specifics and raw log
⋮----
// CrossChainRegistryStorageOperatorSetConfigSet represents a OperatorSetConfigSet event raised by the CrossChainRegistryStorage contract.
type CrossChainRegistryStorageOperatorSetConfigSet struct {
	OperatorSet OperatorSet
	Config      ICrossChainRegistryTypesOperatorSetConfig
	Raw         types.Log // Blockchain specific contextual infos
}
⋮----
// FilterOperatorSetConfigSet is a free log retrieval operation binding the contract event 0x3147846ee526009000671c20380b856a633345691300f82585f90034715cf0e2.
⋮----
// Solidity: event OperatorSetConfigSet((address,uint32) operatorSet, (address,uint32) config)
func (_CrossChainRegistryStorage *CrossChainRegistryStorageFilterer) FilterOperatorSetConfigSet(opts *bind.FilterOpts) (*CrossChainRegistryStorageOperatorSetConfigSetIterator, error)
⋮----
// WatchOperatorSetConfigSet is a free log subscription operation binding the contract event 0x3147846ee526009000671c20380b856a633345691300f82585f90034715cf0e2.
⋮----
func (_CrossChainRegistryStorage *CrossChainRegistryStorageFilterer) WatchOperatorSetConfigSet(opts *bind.WatchOpts, sink chan<- *CrossChainRegistryStorageOperatorSetConfigSet) (event.Subscription, error)
⋮----
// ParseOperatorSetConfigSet is a log parse operation binding the contract event 0x3147846ee526009000671c20380b856a633345691300f82585f90034715cf0e2.
⋮----
func (_CrossChainRegistryStorage *CrossChainRegistryStorageFilterer) ParseOperatorSetConfigSet(log types.Log) (*CrossChainRegistryStorageOperatorSetConfigSet, error)
⋮----
// CrossChainRegistryStorageOperatorTableCalculatorRemovedIterator is returned from FilterOperatorTableCalculatorRemoved and is used to iterate over the raw logs and unpacked data for OperatorTableCalculatorRemoved events raised by the CrossChainRegistryStorage contract.
type CrossChainRegistryStorageOperatorTableCalculatorRemovedIterator struct {
	Event *CrossChainRegistryStorageOperatorTableCalculatorRemoved // 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
}
⋮----
Event *CrossChainRegistryStorageOperatorTableCalculatorRemoved // Event containing the contract specifics and raw log
⋮----
// CrossChainRegistryStorageOperatorTableCalculatorRemoved represents a OperatorTableCalculatorRemoved event raised by the CrossChainRegistryStorage contract.
type CrossChainRegistryStorageOperatorTableCalculatorRemoved struct {
	OperatorSet OperatorSet
	Raw         types.Log // Blockchain specific contextual infos
}
⋮----
// FilterOperatorTableCalculatorRemoved is a free log retrieval operation binding the contract event 0xd7811913efd5d98fc7ea0d1fdd022b3d31987815360842d05b1d1cf55578d16a.
⋮----
// Solidity: event OperatorTableCalculatorRemoved((address,uint32) operatorSet)
func (_CrossChainRegistryStorage *CrossChainRegistryStorageFilterer) FilterOperatorTableCalculatorRemoved(opts *bind.FilterOpts) (*CrossChainRegistryStorageOperatorTableCalculatorRemovedIterator, error)
⋮----
// WatchOperatorTableCalculatorRemoved is a free log subscription operation binding the contract event 0xd7811913efd5d98fc7ea0d1fdd022b3d31987815360842d05b1d1cf55578d16a.
⋮----
func (_CrossChainRegistryStorage *CrossChainRegistryStorageFilterer) WatchOperatorTableCalculatorRemoved(opts *bind.WatchOpts, sink chan<- *CrossChainRegistryStorageOperatorTableCalculatorRemoved) (event.Subscription, error)
⋮----
// ParseOperatorTableCalculatorRemoved is a log parse operation binding the contract event 0xd7811913efd5d98fc7ea0d1fdd022b3d31987815360842d05b1d1cf55578d16a.
⋮----
func (_CrossChainRegistryStorage *CrossChainRegistryStorageFilterer) ParseOperatorTableCalculatorRemoved(log types.Log) (*CrossChainRegistryStorageOperatorTableCalculatorRemoved, error)
⋮----
// CrossChainRegistryStorageOperatorTableCalculatorSetIterator is returned from FilterOperatorTableCalculatorSet and is used to iterate over the raw logs and unpacked data for OperatorTableCalculatorSet events raised by the CrossChainRegistryStorage contract.
type CrossChainRegistryStorageOperatorTableCalculatorSetIterator struct {
	Event *CrossChainRegistryStorageOperatorTableCalculatorSet // 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
}
⋮----
Event *CrossChainRegistryStorageOperatorTableCalculatorSet // Event containing the contract specifics and raw log
⋮----
// CrossChainRegistryStorageOperatorTableCalculatorSet represents a OperatorTableCalculatorSet event raised by the CrossChainRegistryStorage contract.
type CrossChainRegistryStorageOperatorTableCalculatorSet struct {
	OperatorSet             OperatorSet
	OperatorTableCalculator common.Address
	Raw                     types.Log // Blockchain specific contextual infos
}
⋮----
Raw                     types.Log // Blockchain specific contextual infos
⋮----
// FilterOperatorTableCalculatorSet is a free log retrieval operation binding the contract event 0x7f7ccafd92d20fdb39dee184a0dce002a9da420ed0def461f2a027abc9b3f6df.
⋮----
// Solidity: event OperatorTableCalculatorSet((address,uint32) operatorSet, address operatorTableCalculator)
func (_CrossChainRegistryStorage *CrossChainRegistryStorageFilterer) FilterOperatorTableCalculatorSet(opts *bind.FilterOpts) (*CrossChainRegistryStorageOperatorTableCalculatorSetIterator, error)
⋮----
// WatchOperatorTableCalculatorSet is a free log subscription operation binding the contract event 0x7f7ccafd92d20fdb39dee184a0dce002a9da420ed0def461f2a027abc9b3f6df.
⋮----
func (_CrossChainRegistryStorage *CrossChainRegistryStorageFilterer) WatchOperatorTableCalculatorSet(opts *bind.WatchOpts, sink chan<- *CrossChainRegistryStorageOperatorTableCalculatorSet) (event.Subscription, error)
⋮----
// ParseOperatorTableCalculatorSet is a log parse operation binding the contract event 0x7f7ccafd92d20fdb39dee184a0dce002a9da420ed0def461f2a027abc9b3f6df.
⋮----
func (_CrossChainRegistryStorage *CrossChainRegistryStorageFilterer) ParseOperatorTableCalculatorSet(log types.Log) (*CrossChainRegistryStorageOperatorTableCalculatorSet, error)
⋮----
// CrossChainRegistryStorageTableUpdateCadenceSetIterator is returned from FilterTableUpdateCadenceSet and is used to iterate over the raw logs and unpacked data for TableUpdateCadenceSet events raised by the CrossChainRegistryStorage contract.
type CrossChainRegistryStorageTableUpdateCadenceSetIterator struct {
	Event *CrossChainRegistryStorageTableUpdateCadenceSet // 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
}
⋮----
Event *CrossChainRegistryStorageTableUpdateCadenceSet // Event containing the contract specifics and raw log
⋮----
// CrossChainRegistryStorageTableUpdateCadenceSet represents a TableUpdateCadenceSet event raised by the CrossChainRegistryStorage contract.
type CrossChainRegistryStorageTableUpdateCadenceSet struct {
	TableUpdateCadence uint32
	Raw                types.Log // Blockchain specific contextual infos
}
⋮----
Raw                types.Log // Blockchain specific contextual infos
⋮----
// FilterTableUpdateCadenceSet is a free log retrieval operation binding the contract event 0x4fbcd0cca70015b33db8af4aa4f2bd6fd6c1efa9460b8e2333f252c1467a6327.
⋮----
// Solidity: event TableUpdateCadenceSet(uint32 tableUpdateCadence)
func (_CrossChainRegistryStorage *CrossChainRegistryStorageFilterer) FilterTableUpdateCadenceSet(opts *bind.FilterOpts) (*CrossChainRegistryStorageTableUpdateCadenceSetIterator, error)
⋮----
// WatchTableUpdateCadenceSet is a free log subscription operation binding the contract event 0x4fbcd0cca70015b33db8af4aa4f2bd6fd6c1efa9460b8e2333f252c1467a6327.
⋮----
func (_CrossChainRegistryStorage *CrossChainRegistryStorageFilterer) WatchTableUpdateCadenceSet(opts *bind.WatchOpts, sink chan<- *CrossChainRegistryStorageTableUpdateCadenceSet) (event.Subscription, error)
⋮----
// ParseTableUpdateCadenceSet is a log parse operation binding the contract event 0x4fbcd0cca70015b33db8af4aa4f2bd6fd6c1efa9460b8e2333f252c1467a6327.
⋮----
func (_CrossChainRegistryStorage *CrossChainRegistryStorageFilterer) ParseTableUpdateCadenceSet(log types.Log) (*CrossChainRegistryStorageTableUpdateCadenceSet, error)
````

## File: pkg/bindings/DelegationManager/binding.go
````go
// Code generated - DO NOT EDIT.
// This file is a generated binding and any manual changes will be lost.
⋮----
package DelegationManager
⋮----
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"
)
⋮----
"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
)
⋮----
// IDelegationManagerTypesQueuedWithdrawalParams is an auto generated low-level Go binding around an user-defined struct.
type IDelegationManagerTypesQueuedWithdrawalParams struct {
	Strategies           []common.Address
	DepositShares        []*big.Int
	DeprecatedWithdrawer common.Address
}
⋮----
// IDelegationManagerTypesWithdrawal is an auto generated low-level Go binding around an user-defined struct.
type IDelegationManagerTypesWithdrawal struct {
	Staker       common.Address
	DelegatedTo  common.Address
	Withdrawer   common.Address
	Nonce        *big.Int
	StartBlock   uint32
	Strategies   []common.Address
	ScaledShares []*big.Int
}
⋮----
// ISignatureUtilsMixinTypesSignatureWithExpiry is an auto generated low-level Go binding around an user-defined struct.
type ISignatureUtilsMixinTypesSignatureWithExpiry struct {
	Signature []byte
	Expiry    *big.Int
}
⋮----
// OperatorSet is an auto generated low-level Go binding around an user-defined struct.
type OperatorSet struct {
	Avs common.Address
	Id  uint32
}
⋮----
// 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: "0x610160604052348015610010575f5ffd5b5060405161605338038061605383398101604081905261002f916101d9565b808084898989878a6001600160a01b03811661005e576040516339b190bb60e11b815260040160405180910390fd5b6001600160a01b0390811660805293841660a05291831660c052821660e05263ffffffff16610100521661012052610095816100b0565b61014052506100a490506100f6565b50505050505050610364565b5f5f829050601f815111156100e3578260405163305a27a960e01b81526004016100da9190610309565b60405180910390fd5b80516100ee8261033e565b179392505050565b5f54610100900460ff161561015d5760405162461bcd60e51b815260206004820152602760248201527f496e697469616c697a61626c653a20636f6e747261637420697320696e697469604482015266616c697a696e6760c81b60648201526084016100da565b5f5460ff908116146101ac575f805460ff191660ff9081179091556040519081527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b565b6001600160a01b03811681146101c2575f5ffd5b50565b634e487b7160e01b5f52604160045260245ffd5b5f5f5f5f5f5f5f60e0888a0312156101ef575f5ffd5b87516101fa816101ae565b602089015190975061020b816101ae565b604089015190965061021c816101ae565b606089015190955061022d816101ae565b608089015190945061023e816101ae565b60a089015190935063ffffffff81168114610257575f5ffd5b60c08901519092506001600160401b03811115610272575f5ffd5b88015f601f82018b13610283575f5ffd5b81516001600160401b0381111561029c5761029c6101c5565b604051601f8201601f19908116603f011681016001600160401b03811182821017156102ca576102ca6101c5565b6040528181528382016020018d10156102e1575f5ffd5b8160208501602083015e5f602083830101528092508094505050505092959891949750929550565b602081525f82518060208401528060208501604085015e5f604082850101526040601f19601f83011684010191505092915050565b8051602080830151919081101561035e575f198160200360031b1b821691505b50919050565b60805160a05160c05160e051610100516101205161014051615bfd6104565f395f8181610fc10152613dec01525f81816104120152613a7a01525f8181610703015281816131c7015281816134bd015261367601525f818161075301528181610cf301528181610eb60152818161103901528181611392015281816117f401528181612446015261414c01525f818161043901528181610e34015281816112f10152818161156501528181612d3701528181612f18015261333101525f818161036f01528181610e02015281816114b9015261330b01525f81816105e201528181612afd0152613e5b0152615bfd5ff3fe608060405234801561000f575f5ffd5b50600436106102b1575f3560e01c80636d70f7ae1161017b578063bb45fef2116100e4578063e4cc3f901161009e578063f698da2511610079578063f698da25146107ce578063fabc1cbc146107d6578063fd8aa88d146107e9578063fe4b84df146107fc575f5ffd5b8063e4cc3f9014610788578063eea9064b1461079b578063f0e0e676146107ae575f5ffd5b8063bb45fef2146106b9578063bfae3fd2146106e6578063c448feb8146106f9578063c978f7ac1461072d578063ca8aa7c71461074e578063da8be86414610775575f5ffd5b80639104c319116101355780639104c319146106175780639435bb431461063257806399f5371b14610645578063a178848414610665578063a33a343314610684578063b7f06ebe14610697575f5ffd5b80636d70f7ae1461057a5780636e1744481461058d578063778e55f3146105a057806378296ec5146105ca578063886f1195146105dd5780639004134714610604575f5ffd5b806354b7c96c1161021d5780635c975abb116101d75780635c975abb146104d45780635d975e88146104dc5780635dd68579146104fd57806360a0d1ce1461051e57806365da12641461053157806366d5ba9314610559575f5ffd5b806354b7c96c1461045b57806354fd4d501461046e578063595c6a6714610483578063597b36da1461048b5780635ac86ab71461049e5780635ae679a7146104c1575f5ffd5b806339b70e381161026e57806339b70e381461036a5780633c651cf2146103a95780633cdeb5e0146103bc5780633e28391d146103ea5780634657e26a1461040d5780634665bcda14610434575f5ffd5b806304a4f979146102b55780630b9f487a146102ef5780630dd8dd0214610302578063136439dd1461032257806325df922e146103375780632aa6d88814610357575b5f5ffd5b6102dc7f14bde674c9f64b2ad00eaaee4a8bed1fabef35c7507e3c5b9cfc9436909a2dad81565b6040519081526020015b60405180910390f35b6102dc6102fd366004614a86565b61080f565b610315610310366004614b1d565b610897565b6040516102e69190614b5b565b610335610330366004614b92565b610b09565b005b61034a610345366004614d27565b610b43565b6040516102e69190614dd5565b610335610365366004614e37565b610ca3565b6103917f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b0390911681526020016102e6565b6103356103b7366004614e95565b610df7565b6103916103ca366004614ed8565b6001600160a01b039081165f908152609960205260409020600101541690565b6103fd6103f8366004614ed8565b610f4a565b60405190151581526020016102e6565b6103917f000000000000000000000000000000000000000000000000000000000000000081565b6103917f000000000000000000000000000000000000000000000000000000000000000081565b610335610469366004614ef3565b610f69565b610476610fba565b6040516102e69190614f58565b610335610fea565b6102dc610499366004615026565b610ffe565b6103fd6104ac366004615057565b606654600160ff9092169190911b9081161490565b6102dc6104cf36600461508b565b61102d565b6066546102dc565b6104ef6104ea366004614b92565b61119f565b6040516102e69291906151c0565b61051061050b366004614ed8565b6111bc565b6040516102e6929190615232565b61033561052c36600461529f565b6112e6565b61039161053f366004614ed8565b609a6020525f90815260409020546001600160a01b031681565b61056c610567366004614ed8565b611491565b6040516102e69291906152de565b6103fd610588366004614ed8565b611791565b6102dc61059b366004614ef3565b6117c9565b6102dc6105ae366004614ef3565b609860209081525f928352604080842090915290825290205481565b6103356105d83660046152f0565b611873565b6103917f000000000000000000000000000000000000000000000000000000000000000081565b61034a610612366004615340565b6118ec565b61039173beac0eeeeeeeeeeeeeeeeeeeeeeeeeeeeeebeac081565b61033561064036600461538c565b6119c2565b610658610653366004614b92565b611a7d565b6040516102e69190615428565b6102dc610673366004614ed8565b609f6020525f908152604090205481565b61031561069236600461543a565b611b99565b6103fd6106a5366004614b92565b609e6020525f908152604090205460ff1681565b6103fd6106c7366004615521565b609c60209081525f928352604080842090915290825290205460ff1681565b6102dc6106f4366004614ef3565b611bb1565b60405163ffffffff7f00000000000000000000000000000000000000000000000000000000000000001681526020016102e6565b61074061073b366004615340565b611bed565b6040516102e692919061554b565b6103917f000000000000000000000000000000000000000000000000000000000000000081565b610315610783366004614ed8565b611e7a565b61033561079636600461556a565b611fa3565b6103356107a936600461543a565b611fdb565b6107c16107bc3660046155e8565b612046565b6040516102e69190615695565b6102dc6120eb565b6103356107e4366004614b92565b6121a4565b6103156107f7366004614ed8565b612212565b61033561080a366004614b92565b612235565b604080517f14bde674c9f64b2ad00eaaee4a8bed1fabef35c7507e3c5b9cfc9436909a2dad60208201526001600160a01b03808616928201929092528187166060820152908516608082015260a0810183905260c081018290525f9061088d9060e00160405160208183030381529060405280519060200120612346565b9695505050505050565b606060016108a481612374565b6108ac6123a2565b5f836001600160401b038111156108c5576108c5614ba9565b6040519080825280602002602001820160405280156108ee578160200160208202803683370190505b50335f908152609a60205260408120549192506001600160a01b03909116905b85811015610afa57868682818110610928576109286156a7565b905060200281019061093a91906156bb565b6109489060208101906156d9565b905087878381811061095c5761095c6156a7565b905060200281019061096e91906156bb565b61097890806156d9565b905014610998576040516343714afd60e01b815260040160405180910390fd5b5f610a0233848a8a868181106109b0576109b06156a7565b90506020028101906109c291906156bb565b6109cc90806156d9565b808060200260200160405190810160405280939291908181526020018383602002808284375f920191909152506123fb92505050565b9050610ad433848a8a86818110610a1b57610a1b6156a7565b9050602002810190610a2d91906156bb565b610a3790806156d9565b808060200260200160405190810160405280939291908181526020018383602002808284375f920191909152508e92508d9150889050818110610a7c57610a7c6156a7565b9050602002810190610a8e91906156bb565b610a9c9060208101906156d9565b808060200260200160405190810160405280939291908181526020018383602002808284375f9201919091525088925061254d915050565b848381518110610ae657610ae66156a7565b60209081029190910101525060010161090e565b5050600160c955949350505050565b610b11612ae8565b6066548181168114610b365760405163c61dca5d60e01b815260040160405180910390fd5b610b3f82612b8b565b5050565b6001600160a01b038084165f908152609a60205260408120546060921690610b6c8683876123fb565b90505f85516001600160401b03811115610b8857610b88614ba9565b604051908082528060200260200182016040528015610bb1578160200160208202803683370190505b5090505f5b8651811015610c96576001600160a01b0388165f90815260a260205260408120885182908a9085908110610bec57610bec6156a7565b60200260200101516001600160a01b03166001600160a01b031681526020019081526020015f206040518060200160405290815f820154815250509050610c70878381518110610c3e57610c3e6156a7565b6020026020010151858481518110610c5857610c586156a7565b602002602001015183612bc89092919063ffffffff16565b838381518110610c8257610c826156a7565b602090810291909101015250600101610bb6565b50925050505b9392505050565b610cab6123a2565b610cb433610f4a565b15610cd257604051633bf2b50360e11b815260040160405180910390fd5b604051632b6241f360e11b815233600482015263ffffffff841660248201527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906356c483e6906044015f604051808303815f87803b158015610d3c575f5ffd5b505af1158015610d4e573d5f5f3e3d5ffd5b50505050610d5c3385612be6565b610d663333612c48565b6040516001600160a01b038516815233907fa453db612af59e5521d6ab9284dc3e2d06af286eb1b1b7b771fce4716c19f2c19060200160405180910390a2336001600160a01b03167f02a919ed0e2acad1dd90f17ef2fa4ae5462ee1339170034a8531cca4b67080908383604051610ddf92919061571e565b60405180910390a2610df1600160c955565b50505050565b336001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000161480610e565750336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016145b610e735760405163045206a560e21b815260040160405180910390fd5b610e7b6123a2565b6001600160a01b038481165f908152609a602052604080822054905163152667d960e31b8152908316600482018190528684166024830152927f0000000000000000000000000000000000000000000000000000000000000000169063a9333ec890604401602060405180830381865afa158015610efb573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610f1f919061574c565b90505f610f2d878784612ed1565b9050610f3d838888888886612fb3565b505050610df1600160c955565b6001600160a01b039081165f908152609a602052604090205416151590565b81610f73816130f8565b610f7b6123a2565b610f8483611791565b610fa1576040516325ec6c1f60e01b815260040160405180910390fd5b610fab8383612be6565b610fb5600160c955565b505050565b6060610fe57f000000000000000000000000000000000000000000000000000000000000000061311e565b905090565b610ff2612ae8565b610ffc5f19612b8b565b565b5f816040516020016110109190615428565b604051602081830303815290604052805190602001209050919050565b5f336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614611077576040516323d871a560e01b815260040160405180910390fd5b61107f6123a2565b6001600160a01b038088165f9081526098602090815260408083209388168352929052908120546110bd906001600160401b0380871690861661315b565b90505f6110cc89878787613173565b90506110d8818361577b565b92506110e6895f888561326a565b604080516001600160a01b038881168252602082018690528b16917fdd611f4ef63f4385f1756c86ce1f1f389a9013ba6fa07daba8528291bc2d3c30910160405180910390a2611135866132e4565b6001600160a01b0316633fb99ca5898989876040518563ffffffff1660e01b8152600401611166949392919061578e565b5f604051808303815f87803b15801561117d575f5ffd5b505af115801561118f573d5f5f3e3d5ffd5b50505050505061088d600160c955565b6111a7614947565b60606111b283613356565b9094909350915050565b6060805f6111c984612212565b8051909150806001600160401b038111156111e6576111e6614ba9565b60405190808252806020026020018201604052801561121f57816020015b61120c614947565b8152602001906001900390816112045790505b509350806001600160401b0381111561123a5761123a614ba9565b60405190808252806020026020018201604052801561126d57816020015b60608152602001906001900390816112585790505b5092505f5b818110156112de5761129c83828151811061128f5761128f6156a7565b6020026020010151613356565b8683815181106112ae576112ae6156a7565b602002602001018684815181106112c7576112c76156a7565b602090810291909101019190915252600101611272565b505050915091565b336001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000161461132f57604051633213a66160e21b815260040160405180910390fd5b6113376123a2565b61134083610f4a565b15610fab576001600160a01b038381165f908152609a602052604080822054905163152667d960e31b81529083166004820181905273beac0eeeeeeeeeeeeeeeeeeeeeeeeeeeeeebeac06024830152927f0000000000000000000000000000000000000000000000000000000000000000169063a9333ec890604401602060405180830381865afa1580156113d7573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906113fb919061574c565b6001600160a01b0386165f90815260a26020908152604080832073beac0eeeeeeeeeeeeeeeeeeeeeeeeeeeeeebeac0845282528083208151928301909152548152919250611461866114596001600160401b038087169089166135a9565b8491906135bd565b9050611483848873beac0eeeeeeeeeeeeeeeeeeeeeeeeeeeeeebeac08461326a565b50505050610fb5600160c955565b6040516394f649dd60e01b81526001600160a01b03828116600483015260609182915f9182917f000000000000000000000000000000000000000000000000000000000000000016906394f649dd906024015f60405180830381865afa1580156114fd573d5f5f3e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052611524919081019061583e565b60405163fe243a1760e01b81526001600160a01b03888116600483015273beac0eeeeeeeeeeeeeeeeeeeeeeeeeeeeeebeac060248301529294509092505f917f0000000000000000000000000000000000000000000000000000000000000000169063fe243a1790604401602060405180830381865afa1580156115aa573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906115ce91906158f9565b9050805f036115e257509094909350915050565b5f835160016115f1919061577b565b6001600160401b0381111561160857611608614ba9565b604051908082528060200260200182016040528015611631578160200160208202803683370190505b5090505f84516001611643919061577b565b6001600160401b0381111561165a5761165a614ba9565b604051908082528060200260200182016040528015611683578160200160208202803683370190505b50905073beac0eeeeeeeeeeeeeeeeeeeeeeeeeeeeeebeac0828651815181106116ae576116ae6156a7565b60200260200101906001600160a01b031690816001600160a01b03168152505082818651815181106116e2576116e26156a7565b60209081029190910101525f5b85518110156117835785818151811061170a5761170a6156a7565b6020026020010151838281518110611724576117246156a7565b60200260200101906001600160a01b031690816001600160a01b031681525050848181518110611756576117566156a7565b6020026020010151828281518110611770576117706156a7565b60209081029190910101526001016116ef565b509097909650945050505050565b5f6001600160a01b038216158015906117c357506001600160a01b038083165f818152609a6020526040902054909116145b92915050565b60405163152667d960e31b81526001600160a01b03838116600483015282811660248301525f9182917f0000000000000000000000000000000000000000000000000000000000000000169063a9333ec890604401602060405180830381865afa158015611839573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061185d919061574c565b905061186b8484835f613173565b949350505050565b8261187d816130f8565b61188684611791565b6118a3576040516325ec6c1f60e01b815260040160405180910390fd5b836001600160a01b03167f02a919ed0e2acad1dd90f17ef2fa4ae5462ee1339170034a8531cca4b670809084846040516118de92919061571e565b60405180910390a250505050565b60605f82516001600160401b0381111561190857611908614ba9565b604051908082528060200260200182016040528015611931578160200160208202803683370190505b5090505f5b83518110156119ba576001600160a01b0385165f908152609860205260408120855190919086908490811061196d5761196d6156a7565b60200260200101516001600160a01b03166001600160a01b031681526020019081526020015f20548282815181106119a7576119a76156a7565b6020908102919091010152600101611936565b509392505050565b60026119cd81612374565b6119d56123a2565b855f5b81811015611a6857611a608989838181106119f5576119f56156a7565b9050602002810190611a079190615910565b611a1090615924565b888884818110611a2257611a226156a7565b9050602002810190611a3491906156d9565b888886818110611a4657611a466156a7565b9050602002016020810190611a5b919061592f565b6135db565b6001016119d8565b5050611a74600160c955565b50505050505050565b611a85614947565b5f82815260a46020908152604091829020825160e08101845281546001600160a01b03908116825260018301548116828501526002830154168185015260038201546060820152600482015463ffffffff1660808201526005820180548551818602810186019096528086529194929360a08601939290830182828015611b3357602002820191905f5260205f20905b81546001600160a01b03168152600190910190602001808311611b15575b5050505050815260200160068201805480602002602001604051908101604052809291908181526020018280548015611b8957602002820191905f5260205f20905b815481526020019060010190808311611b75575b5050505050815250509050919050565b6060611ba433611e7a565b9050610c9c848484611fdb565b6001600160a01b038083165f90815260a260209081526040808320938516835292815282822083519182019093529154825290610c9c90613a1d565b60608082516001600160401b03811115611c0957611c09614ba9565b604051908082528060200260200182016040528015611c32578160200160208202803683370190505b50915082516001600160401b03811115611c4e57611c4e614ba9565b604051908082528060200260200182016040528015611c77578160200160208202803683370190505b506001600160a01b038086165f908152609a6020526040812054929350911690611ca28683876123fb565b90505f5b8551811015611e6f575f611cd2878381518110611cc557611cc56156a7565b60200260200101516132e4565b9050806001600160a01b031663fe243a1789898581518110611cf657611cf66156a7565b60200260200101516040518363ffffffff1660e01b8152600401611d309291906001600160a01b0392831681529116602082015260400190565b602060405180830381865afa158015611d4b573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611d6f91906158f9565b858381518110611d8157611d816156a7565b6020026020010181815250505f60a25f8a6001600160a01b03166001600160a01b031681526020019081526020015f205f898581518110611dc457611dc46156a7565b60200260200101516001600160a01b03166001600160a01b031681526020019081526020015f206040518060200160405290815f820154815250509050611e48868481518110611e1657611e166156a7565b6020026020010151858581518110611e3057611e306156a7565b6020026020010151836135bd9092919063ffffffff16565b878481518110611e5a57611e5a6156a7565b60209081029190910101525050600101611ca6565b5050505b9250929050565b6060611e846123a2565b611e8d82610f4a565b611eaa5760405163a5c7c44560e01b815260040160405180910390fd5b611eb382611791565b15611ed1576040516311ca333560e31b815260040160405180910390fd5b336001600160a01b03831614611f89576001600160a01b038083165f908152609a602052604090205416611f0481613a3c565b80611f2a57506001600160a01b038181165f908152609960205260409020600101541633145b611f4757604051631e499a2360e11b815260040160405180910390fd5b806001600160a01b0316836001600160a01b03167ff0eddf07e6ea14f388b47e1e94a0f464ecbd9eed4171130e0fc0e99fb4030a8a60405160405180910390a3505b611f9282613ae5565b9050611f9e600160c955565b919050565b6002611fae81612374565b611fb66123a2565b611fca611fc286615924565b8585856135db565b611fd4600160c955565b5050505050565b611fe36123a2565b611fec33610f4a565b1561200a57604051633bf2b50360e11b815260040160405180910390fd5b61201383611791565b612030576040516325ec6c1f60e01b815260040160405180910390fd5b61203c33848484613d25565b610fab3384612c48565b60605f83516001600160401b0381111561206257612062614ba9565b60405190808252806020026020018201604052801561209557816020015b60608152602001906001900390816120805790505b5090505f5b84518110156119ba576120c68582815181106120b8576120b86156a7565b6020026020010151856118ec565b8282815181106120d8576120d86156a7565b602090810291909101015260010161209a565b60408051808201909152600a81526922b4b3b2b72630bcb2b960b11b6020909101525f7f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f7f71b625cfad44bac63b13dba07f2e1d6084ee04b6f8752101ece6126d584ee6ea612158613de4565b805160209182012060408051928301949094529281019190915260608101919091524660808201523060a082015260c00160405160208183030381529060405280519060200120905090565b6121ac613e59565b606654801982198116146121d35760405163c61dca5d60e01b815260040160405180910390fd5b606682905560405182815233907f3582d1828e26bf56bd801502bc021ac0bc8afb57c826e4986b45593c8fad389c906020015b60405180910390a25050565b6001600160a01b0381165f90815260a3602052604090206060906117c390613f0a565b5f54610100900460ff161580801561225357505f54600160ff909116105b8061226c5750303b15801561226c57505f5460ff166001145b6122d45760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b60648201526084015b60405180910390fd5b5f805460ff1916600117905580156122f5575f805461ff0019166101001790555b6122fe82612b8b565b8015610b3f575f805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15050565b5f61234f6120eb565b60405161190160f01b6020820152602281019190915260428101839052606201611010565b606654600160ff83161b9081160361239f5760405163840a48d560e01b815260040160405180910390fd5b50565b600260c954036123f45760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c0060448201526064016122cb565b600260c955565b60605f82516001600160401b0381111561241757612417614ba9565b604051908082528060200260200182016040528015612440578160200160208202803683370190505b5090505f7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663547afb8786866040518363ffffffff1660e01b815260040161249292919061594a565b5f60405180830381865afa1580156124ac573d5f5f3e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526124d3919081019061596d565b90505f5b84518110156125425761251d878683815181106124f6576124f66156a7565b6020026020010151848481518110612510576125106156a7565b6020026020010151612ed1565b83828151811061252f5761252f6156a7565b60209081029190910101526001016124d7565b509095945050505050565b5f6001600160a01b038616612575576040516339b190bb60e11b815260040160405180910390fd5b83515f036125965760405163796cc52560e01b815260040160405180910390fd5b5f84516001600160401b038111156125b0576125b0614ba9565b6040519080825280602002602001820160405280156125d9578160200160208202803683370190505b5090505f85516001600160401b038111156125f6576125f6614ba9565b60405190808252806020026020018201604052801561261f578160200160208202803683370190505b5090505f5b865181101561291b575f612643888381518110611cc557611cc56156a7565b90505f60a25f8c6001600160a01b03166001600160a01b031681526020019081526020015f205f8a858151811061267c5761267c6156a7565b60200260200101516001600160a01b03166001600160a01b031681526020019081526020015f2090506126f58884815181106126ba576126ba6156a7565b60200260200101518885815181106126d4576126d46156a7565b602090810291909101810151604080519283019052845482529091906135bd565b848481518110612707576127076156a7565b602002602001018181525050612746888481518110612728576127286156a7565b60209081029190910181015160408051928301905283548252613f16565b858481518110612758576127586156a7565b60209081029190910101526001600160a01b038a16156127ed576127af8a8a8581518110612788576127886156a7565b60200260200101518786815181106127a2576127a26156a7565b6020026020010151613f2a565b6127ed8a8c8b86815181106127c6576127c66156a7565b60200260200101518787815181106127e0576127e06156a7565b602002602001015161326a565b5f826001600160a01b031663724af4238d8c8781518110612810576128106156a7565b60200260200101518c888151811061282a5761282a6156a7565b60200260200101516040518463ffffffff1660e01b8152600401612850939291906159fc565b6020604051808303815f875af115801561286c573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061289091906158f9565b9050805f0361290d575f82557f8be932bac54561f27260f95463d9b8ab37e06b2842e5ee2404157cc13df6eb8f8c8b86815181106128d0576128d06156a7565b60200260200101516128f5856040518060200160405290815f82015481525050613a1d565b604051612904939291906159fc565b60405180910390a15b505050806001019050612624565b506001600160a01b0388165f908152609f6020526040812080549182919061294283615a20565b91905055505f6040518060e001604052808b6001600160a01b031681526020018a6001600160a01b031681526020018b6001600160a01b031681526020018381526020014363ffffffff1681526020018981526020018581525090505f6129a882610ffe565b5f818152609e602090815260408083208054600160ff19909116811790915560a4835292819020865181546001600160a01b03199081166001600160a01b039283161783558885015195830180548216968316969096179095559187015160028201805490951692169190911790925560608501516003830155608085015160048301805463ffffffff191663ffffffff90921691909117905560a085015180519394508593612a5e92600585019201906149a0565b5060c08201518051612a7a916006840191602090910190614a03565b5050506001600160a01b038b165f90815260a360205260409020612a9e9082613f94565b507f26b2aae26516e8719ef50ea2f6831a2efbd4e37dccdf0f6936b27bc08e793e30818386604051612ad293929190615a38565b60405180910390a19a9950505050505050505050565b60405163237dfb4760e11b81523360048201527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906346fbf68e90602401602060405180830381865afa158015612b4a573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612b6e9190615a62565b610ffc57604051631d77d47760e21b815260040160405180910390fd5b606681905560405181815233907fab40a374bc51de372200a8bc981af8c9ecdc08dfdaef0bb6e09f88f3c616ef3d9060200160405180910390a250565b5f61186b82612be0612bd987613a1d565b8690613f9f565b90613f9f565b6001600160a01b038281165f8181526099602090815260409182902060010180546001600160a01b0319169486169485179055905192835290917f773b54c04d756fcc5e678111f7d730de3be98192000799eee3d63716055a87c69101612206565b5f612c5281612374565b5f5f612c5d85611491565b915091505f612c6d5f86856123fb565b6001600160a01b038781165f818152609a602052604080822080546001600160a01b031916948b16948517905551939450919290917fc3ee9f2e5fda98e8066a1f745b2df9285f416fe98cf2559cd21484b3d874330491a35f5b8351811015611a745773beac0eeeeeeeeeeeeeeeeeeeeeeeeeeeeeebeac06001600160a01b0316848281518110612d0057612d006156a7565b60200260200101516001600160a01b031603612e705760405163a3d75e0960e01b81526001600160a01b0388811660048301525f917f00000000000000000000000000000000000000000000000000000000000000009091169063a3d75e0990602401602060405180830381865afa158015612d7e573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612da2919061574c565b90505f60a25f8a6001600160a01b03166001600160a01b031681526020019081526020015f205f878581518110612ddb57612ddb6156a7565b60200260200101516001600160a01b03166001600160a01b031681526020019081526020015f206040518060200160405290815f820154815250509050612e4f858481518110612e2d57612e2d6156a7565b6020026020010151836001600160401b0316836135bd9092919063ffffffff16565b858481518110612e6157612e616156a7565b60200260200101818152505050505b612ec98688868481518110612e8757612e876156a7565b60200260200101515f878681518110612ea257612ea26156a7565b6020026020010151878781518110612ebc57612ebc6156a7565b6020026020010151612fb3565b600101612cc7565b5f73beac0eeeeeeeeeeeeeeeeeeeeeeeeeeeeeebeabf196001600160a01b03841601612fa35760405163a3d75e0960e01b81526001600160a01b0385811660048301525f917f00000000000000000000000000000000000000000000000000000000000000009091169063a3d75e0990602401602060405180830381865afa158015612f5f573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612f83919061574c565b9050612f9b6001600160401b038481169083166135a9565b915050610c9c565b506001600160401b031692915050565b805f03612fd357604051630a33bc6960e21b815260040160405180910390fd5b81156130f0576001600160a01b038086165f90815260a26020908152604080832093881683529290522061300981858585613fb3565b6040805160208101909152815481527f8be932bac54561f27260f95463d9b8ab37e06b2842e5ee2404157cc13df6eb8f908790879061304790613a1d565b604051613056939291906159fc565b60405180910390a161306786610f4a565b15611a74576001600160a01b038088165f908152609860209081526040808320938916835292905290812080548592906130a290849061577b565b92505081905550866001600160a01b03167f1ec042c965e2edd7107b51188ee0f383e22e76179041ab3a9d18ff151405166c8787866040516130e6939291906159fc565b60405180910390a2505b505050505050565b61310181613a3c565b61239f5760405163932d94f760e01b815260040160405180910390fd5b60605f61312a83614049565b6040805160208082528183019092529192505f91906020820181803683375050509182525060208101929092525090565b5f6131698483856001614070565b61186b9085615a7d565b5f826001600160401b03165f0361318b57505f61186b565b6001600160a01b038086165f90815260a56020908152604080832093881683529290529081206131ba906140cb565b90505f61322060016131ec7f000000000000000000000000000000000000000000000000000000000000000043615a90565b6131f69190615a90565b6001600160a01b03808a165f90815260a560209081526040808320938c16835292905220906140e5565b90505f61322d8284615a7d565b905061325e613245826001600160401b0389166135a9565b876001600160401b0316876001600160401b031661315b565b98975050505050505050565b6001600160a01b038085165f908152609860209081526040808320938616835292905290812080548392906132a0908490615a7d565b92505081905550836001600160a01b03167f6909600037b75d7b4733aedd815442b5ec018a827751c832aaff64eba5d6d2dd8484846040516118de939291906159fc565b5f6001600160a01b03821673beac0eeeeeeeeeeeeeeeeeeeeeeeeeeeeeebeac01461332f577f00000000000000000000000000000000000000000000000000000000000000006117c3565b7f000000000000000000000000000000000000000000000000000000000000000092915050565b61335e614947565b5f82815260a46020908152604091829020825160e08101845281546001600160a01b0390811682526001830154811682850152600283015416818501526003820154606082810191909152600483015463ffffffff1660808301526005830180548651818702810187019097528087529195929460a0860193929083018282801561341057602002820191905f5260205f20905b81546001600160a01b031681526001909101906020018083116133f2575b505050505081526020016006820180548060200260200160405190810160405280929190818152602001828054801561346657602002820191905f5260205f20905b815481526020019060010190808311613452575b50505050508152505091508160a00151516001600160401b0381111561348e5761348e614ba9565b6040519080825280602002602001820160405280156134b7578160200160208202803683370190505b5090505f7f000000000000000000000000000000000000000000000000000000000000000083608001516134eb9190615aac565b90505f4363ffffffff168263ffffffff161061351c57613517845f015185602001518660a001516123fb565b613533565b613533845f015185602001518660a0015185614101565b90505f5b8460a00151518110156112de576135848560c00151828151811061355d5761355d6156a7565b6020026020010151838381518110613577576135776156a7565b602002602001015161422f565b848281518110613596576135966156a7565b6020908102919091010152600101613537565b5f610c9c8383670de0b6b3a764000061423a565b5f61186b826135d56135ce87613a1d565b86906135a9565b906135a9565b60a0840151518214613600576040516343714afd60e01b815260040160405180910390fd5b83604001516001600160a01b0316336001600160a01b031614613636576040516316110d3560e21b815260040160405180910390fd5b5f61364085610ffe565b5f818152609e602052604090205490915060ff16613671576040516387c9d21960e01b815260040160405180910390fd5b60605f7f000000000000000000000000000000000000000000000000000000000000000087608001516136a49190615aac565b90508063ffffffff164363ffffffff16116136d2576040516378f67ae160e11b815260040160405180910390fd5b6136e9875f015188602001518960a0015184614101565b87516001600160a01b03165f90815260a36020526040902090925061370f91508361431f565b505f82815260a46020526040812080546001600160a01b031990811682556001820180548216905560028201805490911690556003810182905560048101805463ffffffff19169055906137666005830182614a3c565b613773600683015f614a3c565b50505f828152609e602052604090819020805460ff19169055517f1f40400889274ed07b24845e5054a87a0cab969eb1277aafe61ae352e7c32a00906137bc9084815260200190565b60405180910390a185516001600160a01b039081165f908152609a6020526040812054885160a08a015191909316926137f69184906123fb565b90505f5b8860a0015151811015613a12575f6138218a60a001518381518110611cc557611cc56156a7565b90505f6138578b60c00151848151811061383d5761383d6156a7565b6020026020010151878581518110613577576135776156a7565b9050805f03613867575050613a0a565b871561393557816001600160a01b0316632eae418c8c5f01518d60a001518681518110613896576138966156a7565b60200260200101518d8d888181106138b0576138b06156a7565b90506020020160208101906138c59190614ed8565b60405160e085901b6001600160e01b03191681526001600160a01b03938416600482015291831660248301529091166044820152606481018490526084015f604051808303815f87803b15801561391a575f5ffd5b505af115801561392c573d5f5f3e3d5ffd5b50505050613a07565b5f5f836001600160a01b03166350ff72258e5f01518f60a001518881518110613960576139606156a7565b6020026020010151866040518463ffffffff1660e01b8152600401613987939291906159fc565b60408051808303815f875af11580156139a2573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906139c69190615ac8565b91509150613a04878e5f01518f60a0015188815181106139e8576139e86156a7565b602002602001015185858b8b81518110612ebc57612ebc6156a7565b50505b50505b6001016137fa565b505050505050505050565b80515f9015613a2d5781516117c3565b670de0b6b3a764000092915050565b604051631beb2b9760e31b81526001600160a01b0382811660048301523360248301523060448301525f80356001600160e01b0319166064840152917f00000000000000000000000000000000000000000000000000000000000000009091169063df595cb890608401602060405180830381865afa158015613ac1573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906117c39190615a62565b60606001613af281612374565b6001600160a01b038084165f818152609a602052604080822080546001600160a01b0319811690915590519316928392917ffee30966a256b71e14bc0ebfc94315e28ef4a97a7131a9e2b7a310a73af4467691a35f5f613b5186611491565b9150915081515f03613b6557505050613d1f565b81516001600160401b03811115613b7e57613b7e614ba9565b604051908082528060200260200182016040528015613ba7578160200160208202803683370190505b5094505f613bb68785856123fb565b90505f5b8351811015613d19576040805160018082528183019092525f916020808301908036833750506040805160018082528183019092529293505f9291506020808301908036833750506040805160018082528183019092529293505f92915060208083019080368337019050509050868481518110613c3a57613c3a6156a7565b6020026020010151835f81518110613c5457613c546156a7565b60200260200101906001600160a01b031690816001600160a01b031681525050858481518110613c8657613c866156a7565b6020026020010151825f81518110613ca057613ca06156a7565b602002602001018181525050848481518110613cbe57613cbe6156a7565b6020026020010151815f81518110613cd857613cd86156a7565b602002602001018181525050613cf18b8985858561254d565b8a8581518110613d0357613d036156a7565b6020908102919091010152505050600101613bba565b50505050505b50919050565b6001600160a01b038084165f908152609960205260409020600101541680613d4d5750610df1565b6001600160a01b0381165f908152609c6020908152604080832085845290915290205460ff1615613d9157604051630d4c4c9160e21b815260040160405180910390fd5b6001600160a01b0381165f908152609c602090815260408083208584528252909120805460ff19166001179055830151611fd4908290613dd890889088908490889061080f565b8551602087015161432a565b60605f613e107f000000000000000000000000000000000000000000000000000000000000000061311e565b9050805f81518110613e2457613e246156a7565b016020908101516040516001600160f81b03199091169181019190915260210160405160208183030381529060405291505090565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663eab66d7a6040518163ffffffff1660e01b8152600401602060405180830381865afa158015613eb5573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190613ed99190615aea565b6001600160a01b0316336001600160a01b031614610ffc5760405163794821ff60e01b815260040160405180910390fd5b60605f610c9c8361437c565b5f610c9c613f2384613a1d565b83906135a9565b6001600160a01b038084165f90815260a5602090815260408083209386168352929052908120613f59906140cb565b9050610df143613f69848461577b565b6001600160a01b038088165f90815260a560209081526040808320938a1683529290522091906143d5565b5f610c9c83836143e0565b5f610c9c83670de0b6b3a76400008461423a565b825f03613fdf57604080516020810190915284548152613fd8908290612be090613a1d565b8455610df1565b6040805160208101909152845481525f90613ffb9085846135bd565b90505f614008848361577b565b90505f61402384612be061401c888a61577b565b8590613f9f565b80885590505f819003611a745760405163172cec7360e31b815260040160405180910390fd5b5f60ff8216601f8111156117c357604051632cd44ac360e21b815260040160405180910390fd5b5f5f61407d86868661423a565b9050600183600281111561409357614093615b05565b1480156140af57505f84806140aa576140aa615b19565b868809115b156140c2576140bf60018261577b565b90505b95945050505050565b5f6140d6828261442c565b6001600160e01b031692915050565b5f6140f1838383614471565b6001600160e01b03169392505050565b60605f83516001600160401b0381111561411d5761411d614ba9565b604051908082528060200260200182016040528015614146578160200160208202803683370190505b5090505f7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166394d7d00c8787876040518463ffffffff1660e01b815260040161419a93929190615b2d565b5f60405180830381865afa1580156141b4573d5f5f3e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526141db919081019061596d565b90505f5b8551811015614223576141fe888783815181106124f6576124f66156a7565b838281518110614210576142106156a7565b60209081029190910101526001016141df565b50909695505050505050565b5f610c9c83836135a9565b5f80805f19858709858702925082811083820303915050805f036142715783828161426757614267615b19565b0492505050610c9c565b8084116142b85760405162461bcd60e51b81526020600482015260156024820152744d6174683a206d756c446976206f766572666c6f7760581b60448201526064016122cb565b5f8486880960026001871981018816978890046003810283188082028403028082028403028082028403028082028403028082028403029081029092039091025f889003889004909101858311909403939093029303949094049190911702949350505050565b5f610c9c83836144ba565b4281101561434b57604051630819bdcd60e01b815260040160405180910390fd5b61435f6001600160a01b038516848461459d565b610df157604051638baa579f60e01b815260040160405180910390fd5b6060815f018054806020026020016040519081016040528092919081815260200182805480156143c957602002820191905f5260205f20905b8154815260200190600101908083116143b5575b50505050509050919050565b610fb58383836145f1565b5f81815260018301602052604081205461442557508154600181810184555f8481526020808220909301849055845484825282860190935260409020919091556117c3565b505f6117c3565b81545f9080156144695761445284614445600184615a7d565b5f91825260209091200190565b5464010000000090046001600160e01b031661186b565b509092915050565b82545f9081614482868683856146f7565b905080156144b05761449986614445600184615a7d565b5464010000000090046001600160e01b031661088d565b5091949350505050565b5f8181526001830160205260408120548015614594575f6144dc600183615a7d565b85549091505f906144ef90600190615a7d565b905081811461454e575f865f01828154811061450d5761450d6156a7565b905f5260205f200154905080875f01848154811061452d5761452d6156a7565b5f918252602080832090910192909255918252600188019052604090208390555b855486908061455f5761455f615b66565b600190038181905f5260205f20015f90559055856001015f8681526020019081526020015f205f9055600193505050506117c3565b5f9150506117c3565b5f5f5f6145aa858561474a565b90925090505f8160048111156145c2576145c2615b05565b1480156145e05750856001600160a01b0316826001600160a01b0316145b8061088d575061088d868686614789565b825480156146a9575f61460985614445600185615a7d565b60408051808201909152905463ffffffff8082168084526401000000009092046001600160e01b03166020840152919250908516101561465c5760405163151b8e3f60e11b815260040160405180910390fd5b805163ffffffff8086169116036146a7578261467d86614445600186615a7d565b80546001600160e01b03929092166401000000000263ffffffff9092169190911790555050505050565b505b506040805180820190915263ffffffff92831681526001600160e01b03918216602080830191825285546001810187555f968752952091519051909216640100000000029190921617910155565b5f5b818310156119ba575f61470c8484614870565b5f8781526020902090915063ffffffff86169082015463ffffffff16111561473657809250614744565b61474181600161577b565b93505b506146f9565b5f5f825160410361477e576020830151604084015160608501515f1a6147728782858561488a565b94509450505050611e73565b505f90506002611e73565b5f5f5f856001600160a01b0316631626ba7e60e01b86866040516024016147b1929190615b7a565b60408051601f198184030181529181526020820180516001600160e01b03166001600160e01b03199094169390931790925290516147ef9190615b92565b5f60405180830381855afa9150503d805f8114614827576040519150601f19603f3d011682016040523d82523d5f602084013e61482c565b606091505b509150915081801561484057506020815110155b801561088d57508051630b135d3f60e11b9061486590830160209081019084016158f9565b149695505050505050565b5f61487e6002848418615ba8565b610c9c9084841661577b565b5f807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a08311156148bf57505f9050600361493e565b604080515f8082526020820180845289905260ff881692820192909252606081018690526080810185905260019060a0016020604051602081039080840390855afa158015614910573d5f5f3e3d5ffd5b5050604051601f1901519150506001600160a01b038116614938575f6001925092505061493e565b91505f90505b94509492505050565b6040518060e001604052805f6001600160a01b031681526020015f6001600160a01b031681526020015f6001600160a01b031681526020015f81526020015f63ffffffff16815260200160608152602001606081525090565b828054828255905f5260205f209081019282156149f3579160200282015b828111156149f357825182546001600160a01b0319166001600160a01b039091161782556020909201916001909101906149be565b506149ff929150614a53565b5090565b828054828255905f5260205f209081019282156149f3579160200282015b828111156149f3578251825591602001919060010190614a21565b5080545f8255905f5260205f209081019061239f91905b5b808211156149ff575f8155600101614a54565b6001600160a01b038116811461239f575f5ffd5b8035611f9e81614a67565b5f5f5f5f5f60a08688031215614a9a575f5ffd5b8535614aa581614a67565b94506020860135614ab581614a67565b93506040860135614ac581614a67565b94979396509394606081013594506080013592915050565b5f5f83601f840112614aed575f5ffd5b5081356001600160401b03811115614b03575f5ffd5b6020830191508360208260051b8501011115611e73575f5ffd5b5f5f60208385031215614b2e575f5ffd5b82356001600160401b03811115614b43575f5ffd5b614b4f85828601614add565b90969095509350505050565b602080825282518282018190525f918401906040840190835b81811015612542578351835260209384019390920191600101614b74565b5f60208284031215614ba2575f5ffd5b5035919050565b634e487b7160e01b5f52604160045260245ffd5b60405160e081016001600160401b0381118282101715614bdf57614bdf614ba9565b60405290565b604080519081016001600160401b0381118282101715614bdf57614bdf614ba9565b604051601f8201601f191681016001600160401b0381118282101715614c2f57614c2f614ba9565b604052919050565b5f6001600160401b03821115614c4f57614c4f614ba9565b5060051b60200190565b5f82601f830112614c68575f5ffd5b8135614c7b614c7682614c37565b614c07565b8082825260208201915060208360051b860101925085831115614c9c575f5ffd5b602085015b83811015614cc2578035614cb481614a67565b835260209283019201614ca1565b5095945050505050565b5f82601f830112614cdb575f5ffd5b8135614ce9614c7682614c37565b8082825260208201915060208360051b860101925085831115614d0a575f5ffd5b602085015b83811015614cc2578035835260209283019201614d0f565b5f5f5f60608486031215614d39575f5ffd5b8335614d4481614a67565b925060208401356001600160401b03811115614d5e575f5ffd5b614d6a86828701614c59565b92505060408401356001600160401b03811115614d85575f5ffd5b614d9186828701614ccc565b9150509250925092565b5f8151808452602084019350602083015f5b82811015614dcb578151865260209586019590910190600101614dad565b5093949350505050565b602081525f610c9c6020830184614d9b565b803563ffffffff81168114611f9e575f5ffd5b5f5f83601f840112614e0a575f5ffd5b5081356001600160401b03811115614e20575f5ffd5b602083019150836020828501011115611e73575f5ffd5b5f5f5f5f60608587031215614e4a575f5ffd5b8435614e5581614a67565b9350614e6360208601614de7565b925060408501356001600160401b03811115614e7d575f5ffd5b614e8987828801614dfa565b95989497509550505050565b5f5f5f5f60808587031215614ea8575f5ffd5b8435614eb381614a67565b93506020850135614ec381614a67565b93969395505050506040820135916060013590565b5f60208284031215614ee8575f5ffd5b8135610c9c81614a67565b5f5f60408385031215614f04575f5ffd5b8235614f0f81614a67565b91506020830135614f1f81614a67565b809150509250929050565b5f81518084528060208401602086015e5f602082860101526020601f19601f83011685010191505092915050565b602081525f610c9c6020830184614f2a565b5f60e08284031215614f7a575f5ffd5b614f82614bbd565b9050614f8d82614a7b565b8152614f9b60208301614a7b565b6020820152614fac60408301614a7b565b604082015260608281013590820152614fc760808301614de7565b608082015260a08201356001600160401b03811115614fe4575f5ffd5b614ff084828501614c59565b60a08301525060c08201356001600160401b0381111561500e575f5ffd5b61501a84828501614ccc565b60c08301525092915050565b5f60208284031215615036575f5ffd5b81356001600160401b0381111561504b575f5ffd5b61186b84828501614f6a565b5f60208284031215615067575f5ffd5b813560ff81168114610c9c575f5ffd5b6001600160401b038116811461239f575f5ffd5b5f5f5f5f5f5f86880360e08112156150a1575f5ffd5b87356150ac81614a67565b96506040601f19820112156150bf575f5ffd5b506020870194506060870135935060808701356150db81614a67565b925060a08701356150eb81615077565b915060c08701356150fb81615077565b809150509295509295509295565b5f8151808452602084019350602083015f5b82811015614dcb5781516001600160a01b031686526020958601959091019060010161511b565b80516001600160a01b03908116835260208083015182169084015260408083015190911690830152606080820151908301526080808201515f9161518d9085018263ffffffff169052565b5060a082015160e060a08501526151a760e0850182615109565b905060c083015184820360c08601526140c28282614d9b565b604081525f6151d26040830185615142565b82810360208401526140c28185614d9b565b5f82825180855260208501945060208160051b830101602085015f5b8381101561422357601f1985840301885261521c838351614d9b565b6020988901989093509190910190600101615200565b5f604082016040835280855180835260608501915060608160051b8601019250602087015f5b8281101561528957605f19878603018452615274858351615142565b94506020938401939190910190600101615258565b5050505082810360208401526140c281856151e4565b5f5f5f606084860312156152b1575f5ffd5b83356152bc81614a67565b92506020840135915060408401356152d381615077565b809150509250925092565b604081525f6151d26040830185615109565b5f5f5f60408486031215615302575f5ffd5b833561530d81614a67565b925060208401356001600160401b03811115615327575f5ffd5b61533386828701614dfa565b9497909650939450505050565b5f5f60408385031215615351575f5ffd5b823561535c81614a67565b915060208301356001600160401b03811115615376575f5ffd5b61538285828601614c59565b9150509250929050565b5f5f5f5f5f5f606087890312156153a1575f5ffd5b86356001600160401b038111156153b6575f5ffd5b6153c289828a01614add565b90975095505060208701356001600160401b038111156153e0575f5ffd5b6153ec89828a01614add565b90955093505060408701356001600160401b0381111561540a575f5ffd5b61541689828a01614add565b979a9699509497509295939492505050565b602081525f610c9c6020830184615142565b5f5f5f6060848603121561544c575f5ffd5b833561545781614a67565b925060208401356001600160401b03811115615471575f5ffd5b840160408187031215615482575f5ffd5b61548a614be5565b81356001600160401b0381111561549f575f5ffd5b8201601f810188136154af575f5ffd5b80356001600160401b038111156154c8576154c8614ba9565b6154db601f8201601f1916602001614c07565b8181528960208385010111156154ef575f5ffd5b816020840160208301375f60209282018301528352928301359282019290925293969395505050506040919091013590565b5f5f60408385031215615532575f5ffd5b823561553d81614a67565b946020939093013593505050565b604081525f6151d26040830185614d9b565b801515811461239f575f5ffd5b5f5f5f5f6060858703121561557d575f5ffd5b84356001600160401b03811115615592575f5ffd5b850160e081880312156155a3575f5ffd5b935060208501356001600160401b038111156155bd575f5ffd5b6155c987828801614add565b90945092505060408501356155dd8161555d565b939692955090935050565b5f5f604083850312156155f9575f5ffd5b82356001600160401b0381111561560e575f5ffd5b8301601f8101851361561e575f5ffd5b803561562c614c7682614c37565b8082825260208201915060208360051b85010192508783111561564d575f5ffd5b6020840193505b8284101561567857833561566781614a67565b825260209384019390910190615654565b945050505060208301356001600160401b03811115615376575f5ffd5b602081525f610c9c60208301846151e4565b634e487b7160e01b5f52603260045260245ffd5b5f8235605e198336030181126156cf575f5ffd5b9190910192915050565b5f5f8335601e198436030181126156ee575f5ffd5b8301803591506001600160401b03821115615707575f5ffd5b6020019150600581901b3603821315611e73575f5ffd5b60208152816020820152818360408301375f818301604090810191909152601f909201601f19160101919050565b5f6020828403121561575c575f5ffd5b8151610c9c81615077565b634e487b7160e01b5f52601160045260245ffd5b808201808211156117c3576117c3615767565b60a08101853561579d81614a67565b6001600160a01b0316825263ffffffff6157b960208801614de7565b16602083015260408201949094526001600160a01b03929092166060830152608090910152919050565b5f82601f8301126157f2575f5ffd5b8151615800614c7682614c37565b8082825260208201915060208360051b860101925085831115615821575f5ffd5b602085015b83811015614cc2578051835260209283019201615826565b5f5f6040838503121561584f575f5ffd5b82516001600160401b03811115615864575f5ffd5b8301601f81018513615874575f5ffd5b8051615882614c7682614c37565b8082825260208201915060208360051b8501019250878311156158a3575f5ffd5b6020840193505b828410156158ce5783516158bd81614a67565b8252602093840193909101906158aa565b8095505050505060208301516001600160401b038111156158ed575f5ffd5b615382858286016157e3565b5f60208284031215615909575f5ffd5b5051919050565b5f823560de198336030181126156cf575f5ffd5b5f6117c33683614f6a565b5f6020828403121561593f575f5ffd5b8135610c9c8161555d565b6001600160a01b03831681526040602082018190525f9061186b90830184615109565b5f6020828403121561597d575f5ffd5b81516001600160401b03811115615992575f5ffd5b8201601f810184136159a2575f5ffd5b80516159b0614c7682614c37565b8082825260208201915060208360051b8501019250868311156159d1575f5ffd5b6020840193505b8284101561088d5783516159eb81615077565b8252602093840193909101906159d8565b6001600160a01b039384168152919092166020820152604081019190915260600190565b5f60018201615a3157615a31615767565b5060010190565b838152606060208201525f615a506060830185615142565b828103604084015261088d8185614d9b565b5f60208284031215615a72575f5ffd5b8151610c9c8161555d565b818103818111156117c3576117c3615767565b63ffffffff82811682821603908111156117c3576117c3615767565b63ffffffff81811683821601908111156117c3576117c3615767565b5f5f60408385031215615ad9575f5ffd5b505080516020909101519092909150565b5f60208284031215615afa575f5ffd5b8151610c9c81614a67565b634e487b7160e01b5f52602160045260245ffd5b634e487b7160e01b5f52601260045260245ffd5b6001600160a01b03841681526060602082018190525f90615b5090830185615109565b905063ffffffff83166040830152949350505050565b634e487b7160e01b5f52603160045260245ffd5b828152604060208201525f61186b6040830184614f2a565b5f82518060208501845e5f920191825250919050565b5f82615bc257634e487b7160e01b5f52601260045260245ffd5b50049056fea2646970667358221220314e893993879f6da95d5c8d0827e8df59caf389b56c76b8587ef06511fe15bb64736f6c634300081e0033",
}
⋮----
// DelegationManagerABI is the input ABI used to generate the binding from.
// Deprecated: Use DelegationManagerMetaData.ABI instead.
var DelegationManagerABI = DelegationManagerMetaData.ABI
⋮----
// DelegationManagerBin is the compiled bytecode used for deploying new contracts.
// Deprecated: Use DelegationManagerMetaData.Bin instead.
var DelegationManagerBin = DelegationManagerMetaData.Bin
⋮----
// DeployDelegationManager deploys a new Ethereum contract, binding an instance of DelegationManager to it.
func DeployDelegationManager(auth *bind.TransactOpts, backend bind.ContractBackend, _strategyManager common.Address, _eigenPodManager common.Address, _allocationManager common.Address, _pauserRegistry common.Address, _permissionController common.Address, _MIN_WITHDRAWAL_DELAY uint32, _version string) (common.Address, *types.Transaction, *DelegationManager, error)
⋮----
// DelegationManager is an auto generated Go binding around an Ethereum contract.
type DelegationManager struct {
	DelegationManagerCaller     // Read-only binding to the contract
	DelegationManagerTransactor // Write-only binding to the contract
	DelegationManagerFilterer   // Log filterer for contract events
}
⋮----
DelegationManagerCaller     // Read-only binding to the contract
DelegationManagerTransactor // Write-only binding to the contract
DelegationManagerFilterer   // Log filterer for contract events
⋮----
// DelegationManagerCaller is an auto generated read-only Go binding around an Ethereum contract.
type DelegationManagerCaller struct {
	contract *bind.BoundContract // Generic contract wrapper for the low level calls
}
⋮----
contract *bind.BoundContract // Generic contract wrapper for the low level calls
⋮----
// DelegationManagerTransactor is an auto generated write-only Go binding around an Ethereum contract.
type DelegationManagerTransactor struct {
	contract *bind.BoundContract // Generic contract wrapper for the low level calls
}
⋮----
// DelegationManagerFilterer is an auto generated log filtering Go binding around an Ethereum contract events.
type DelegationManagerFilterer struct {
	contract *bind.BoundContract // Generic contract wrapper for the low level calls
}
⋮----
// DelegationManagerSession is an auto generated Go binding around an Ethereum contract,
// with pre-set call and transact options.
type DelegationManagerSession struct {
	Contract     *DelegationManager // 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
}
⋮----
Contract     *DelegationManager // 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
⋮----
// DelegationManagerCallerSession is an auto generated read-only Go binding around an Ethereum contract,
// with pre-set call options.
type DelegationManagerCallerSession struct {
	Contract *DelegationManagerCaller // Generic contract caller binding to set the session for
	CallOpts bind.CallOpts            // Call options to use throughout this session
}
⋮----
Contract *DelegationManagerCaller // Generic contract caller binding to set the session for
CallOpts bind.CallOpts            // Call options to use throughout this session
⋮----
// DelegationManagerTransactorSession is an auto generated write-only Go binding around an Ethereum contract,
// with pre-set transact options.
type DelegationManagerTransactorSession struct {
	Contract     *DelegationManagerTransactor // Generic contract transactor binding to set the session for
	TransactOpts bind.TransactOpts            // Transaction auth options to use throughout this session
}
⋮----
Contract     *DelegationManagerTransactor // Generic contract transactor binding to set the session for
TransactOpts bind.TransactOpts            // Transaction auth options to use throughout this session
⋮----
// DelegationManagerRaw is an auto generated low-level Go binding around an Ethereum contract.
type DelegationManagerRaw struct {
	Contract *DelegationManager // Generic contract binding to access the raw methods on
}
⋮----
Contract *DelegationManager // Generic contract binding to access the raw methods on
⋮----
// DelegationManagerCallerRaw is an auto generated low-level read-only Go binding around an Ethereum contract.
type DelegationManagerCallerRaw struct {
	Contract *DelegationManagerCaller // Generic read-only contract binding to access the raw methods on
}
⋮----
Contract *DelegationManagerCaller // Generic read-only contract binding to access the raw methods on
⋮----
// DelegationManagerTransactorRaw is an auto generated low-level write-only Go binding around an Ethereum contract.
type DelegationManagerTransactorRaw struct {
	Contract *DelegationManagerTransactor // Generic write-only contract binding to access the raw methods on
}
⋮----
Contract *DelegationManagerTransactor // Generic write-only contract binding to access the raw methods on
⋮----
// NewDelegationManager creates a new instance of DelegationManager, bound to a specific deployed contract.
func NewDelegationManager(address common.Address, backend bind.ContractBackend) (*DelegationManager, error)
⋮----
// NewDelegationManagerCaller creates a new read-only instance of DelegationManager, bound to a specific deployed contract.
func NewDelegationManagerCaller(address common.Address, caller bind.ContractCaller) (*DelegationManagerCaller, error)
⋮----
// NewDelegationManagerTransactor creates a new write-only instance of DelegationManager, bound to a specific deployed contract.
func NewDelegationManagerTransactor(address common.Address, transactor bind.ContractTransactor) (*DelegationManagerTransactor, error)
⋮----
// NewDelegationManagerFilterer creates a new log filterer instance of DelegationManager, bound to a specific deployed contract.
func NewDelegationManagerFilterer(address common.Address, filterer bind.ContractFilterer) (*DelegationManagerFilterer, error)
⋮----
// bindDelegationManager binds a generic wrapper to an already deployed contract.
func bindDelegationManager(address common.Address, caller bind.ContractCaller, transactor bind.ContractTransactor, filterer bind.ContractFilterer) (*bind.BoundContract, error)
⋮----
// 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 (_DelegationManager *DelegationManagerRaw) Call(opts *bind.CallOpts, result *[]interface
⋮----
// Transfer initiates a plain transaction to move funds to the contract, calling
// its default method if one is available.
func (_DelegationManager *DelegationManagerRaw) Transfer(opts *bind.TransactOpts) (*types.Transaction, error)
⋮----
// Transact invokes the (paid) contract method with params as input values.
func (_DelegationManager *DelegationManagerRaw) Transact(opts *bind.TransactOpts, method string, params ...interface
⋮----
// DELEGATIONAPPROVALTYPEHASH is a free data retrieval call binding the contract method 0x04a4f979.
//
// Solidity: function DELEGATION_APPROVAL_TYPEHASH() view returns(bytes32)
func (_DelegationManager *DelegationManagerCaller) DELEGATIONAPPROVALTYPEHASH(opts *bind.CallOpts) ([32]byte, error)
⋮----
var out []interface{}
⋮----
// AllocationManager is a free data retrieval call binding the contract method 0xca8aa7c7.
⋮----
// Solidity: function allocationManager() view returns(address)
func (_DelegationManager *DelegationManagerCaller) AllocationManager(opts *bind.CallOpts) (common.Address, error)
⋮----
// BeaconChainETHStrategy is a free data retrieval call binding the contract method 0x9104c319.
⋮----
// Solidity: function beaconChainETHStrategy() view returns(address)
func (_DelegationManager *DelegationManagerCaller) BeaconChainETHStrategy(opts *bind.CallOpts) (common.Address, error)
⋮----
// CalculateDelegationApprovalDigestHash is a free data retrieval call binding the contract method 0x0b9f487a.
⋮----
// Solidity: function calculateDelegationApprovalDigestHash(address staker, address operator, address approver, bytes32 approverSalt, uint256 expiry) view returns(bytes32)
func (_DelegationManager *DelegationManagerCaller) CalculateDelegationApprovalDigestHash(opts *bind.CallOpts, staker common.Address, operator common.Address, approver common.Address, approverSalt [32]byte, expiry *big.Int) ([32]byte, error)
⋮----
// CalculateWithdrawalRoot is a free data retrieval call binding the contract method 0x597b36da.
⋮----
// Solidity: function calculateWithdrawalRoot((address,address,address,uint256,uint32,address[],uint256[]) withdrawal) pure returns(bytes32)
func (_DelegationManager *DelegationManagerCaller) CalculateWithdrawalRoot(opts *bind.CallOpts, withdrawal IDelegationManagerTypesWithdrawal) ([32]byte, error)
⋮----
// ConvertToDepositShares is a free data retrieval call binding the contract method 0x25df922e.
⋮----
// Solidity: function convertToDepositShares(address staker, address[] strategies, uint256[] withdrawableShares) view returns(uint256[])
func (_DelegationManager *DelegationManagerCaller) ConvertToDepositShares(opts *bind.CallOpts, staker common.Address, strategies []common.Address, withdrawableShares []*big.Int) ([]*big.Int, error)
⋮----
// CumulativeWithdrawalsQueued is a free data retrieval call binding the contract method 0xa1788484.
⋮----
// Solidity: function cumulativeWithdrawalsQueued(address staker) view returns(uint256 totalQueued)
func (_DelegationManager *DelegationManagerCaller) CumulativeWithdrawalsQueued(opts *bind.CallOpts, staker common.Address) (*big.Int, error)
⋮----
// DelegatedTo is a free data retrieval call binding the contract method 0x65da1264.
⋮----
// Solidity: function delegatedTo(address staker) view returns(address operator)
func (_DelegationManager *DelegationManagerCaller) DelegatedTo(opts *bind.CallOpts, staker common.Address) (common.Address, error)
⋮----
// DelegationApprover is a free data retrieval call binding the contract method 0x3cdeb5e0.
⋮----
// Solidity: function delegationApprover(address operator) view returns(address)
func (_DelegationManager *DelegationManagerCaller) DelegationApprover(opts *bind.CallOpts, operator common.Address) (common.Address, error)
⋮----
// DelegationApproverSaltIsSpent is a free data retrieval call binding the contract method 0xbb45fef2.
⋮----
// Solidity: function delegationApproverSaltIsSpent(address delegationApprover, bytes32 salt) view returns(bool spent)
func (_DelegationManager *DelegationManagerCaller) DelegationApproverSaltIsSpent(opts *bind.CallOpts, delegationApprover common.Address, salt [32]byte) (bool, error)
⋮----
// DepositScalingFactor is a free data retrieval call binding the contract method 0xbfae3fd2.
⋮----
// Solidity: function depositScalingFactor(address staker, address strategy) view returns(uint256)
func (_DelegationManager *DelegationManagerCaller) DepositScalingFactor(opts *bind.CallOpts, staker common.Address, strategy common.Address) (*big.Int, error)
⋮----
// DomainSeparator is a free data retrieval call binding the contract method 0xf698da25.
⋮----
// Solidity: function domainSeparator() view returns(bytes32)
func (_DelegationManager *DelegationManagerCaller) DomainSeparator(opts *bind.CallOpts) ([32]byte, error)
⋮----
// EigenPodManager is a free data retrieval call binding the contract method 0x4665bcda.
⋮----
// Solidity: function eigenPodManager() view returns(address)
func (_DelegationManager *DelegationManagerCaller) EigenPodManager(opts *bind.CallOpts) (common.Address, error)
⋮----
// GetDepositedShares is a free data retrieval call binding the contract method 0x66d5ba93.
⋮----
// Solidity: function getDepositedShares(address staker) view returns(address[], uint256[])
func (_DelegationManager *DelegationManagerCaller) GetDepositedShares(opts *bind.CallOpts, staker common.Address) ([]common.Address, []*big.Int, error)
⋮----
// GetOperatorShares is a free data retrieval call binding the contract method 0x90041347.
⋮----
// Solidity: function getOperatorShares(address operator, address[] strategies) view returns(uint256[])
func (_DelegationManager *DelegationManagerCaller) GetOperatorShares(opts *bind.CallOpts, operator common.Address, strategies []common.Address) ([]*big.Int, error)
⋮----
// GetOperatorsShares is a free data retrieval call binding the contract method 0xf0e0e676.
⋮----
// Solidity: function getOperatorsShares(address[] operators, address[] strategies) view returns(uint256[][])
func (_DelegationManager *DelegationManagerCaller) GetOperatorsShares(opts *bind.CallOpts, operators []common.Address, strategies []common.Address) ([][]*big.Int, error)
⋮----
// GetQueuedWithdrawal is a free data retrieval call binding the contract method 0x5d975e88.
⋮----
// Solidity: function getQueuedWithdrawal(bytes32 withdrawalRoot) view returns((address,address,address,uint256,uint32,address[],uint256[]) withdrawal, uint256[] shares)
func (_DelegationManager *DelegationManagerCaller) GetQueuedWithdrawal(opts *bind.CallOpts, withdrawalRoot [32]byte) (struct
⋮----
// GetQueuedWithdrawalRoots is a free data retrieval call binding the contract method 0xfd8aa88d.
⋮----
// Solidity: function getQueuedWithdrawalRoots(address staker) view returns(bytes32[])
func (_DelegationManager *DelegationManagerCaller) GetQueuedWithdrawalRoots(opts *bind.CallOpts, staker common.Address) ([][32]byte, error)
⋮----
// GetQueuedWithdrawals is a free data retrieval call binding the contract method 0x5dd68579.
⋮----
// Solidity: function getQueuedWithdrawals(address staker) view returns((address,address,address,uint256,uint32,address[],uint256[])[] withdrawals, uint256[][] shares)
func (_DelegationManager *DelegationManagerCaller) GetQueuedWithdrawals(opts *bind.CallOpts, staker common.Address) (struct
⋮----
// GetSlashableSharesInQueue is a free data retrieval call binding the contract method 0x6e174448.
⋮----
// Solidity: function getSlashableSharesInQueue(address operator, address strategy) view returns(uint256)
func (_DelegationManager *DelegationManagerCaller) GetSlashableSharesInQueue(opts *bind.CallOpts, operator common.Address, strategy common.Address) (*big.Int, error)
⋮----
// GetWithdrawableShares is a free data retrieval call binding the contract method 0xc978f7ac.
⋮----
// Solidity: function getWithdrawableShares(address staker, address[] strategies) view returns(uint256[] withdrawableShares, uint256[] depositShares)
func (_DelegationManager *DelegationManagerCaller) GetWithdrawableShares(opts *bind.CallOpts, staker common.Address, strategies []common.Address) (struct
⋮----
// IsDelegated is a free data retrieval call binding the contract method 0x3e28391d.
⋮----
// Solidity: function isDelegated(address staker) view returns(bool)
func (_DelegationManager *DelegationManagerCaller) IsDelegated(opts *bind.CallOpts, staker common.Address) (bool, error)
⋮----
// IsOperator is a free data retrieval call binding the contract method 0x6d70f7ae.
⋮----
// Solidity: function isOperator(address operator) view returns(bool)
func (_DelegationManager *DelegationManagerCaller) IsOperator(opts *bind.CallOpts, operator common.Address) (bool, error)
⋮----
// MinWithdrawalDelayBlocks is a free data retrieval call binding the contract method 0xc448feb8.
⋮----
// Solidity: function minWithdrawalDelayBlocks() view returns(uint32)
func (_DelegationManager *DelegationManagerCaller) MinWithdrawalDelayBlocks(opts *bind.CallOpts) (uint32, error)
⋮----
// OperatorShares is a free data retrieval call binding the contract method 0x778e55f3.
⋮----
// Solidity: function operatorShares(address operator, address strategy) view returns(uint256 shares)
func (_DelegationManager *DelegationManagerCaller) OperatorShares(opts *bind.CallOpts, operator common.Address, strategy common.Address) (*big.Int, error)
⋮----
// Paused is a free data retrieval call binding the contract method 0x5ac86ab7.
⋮----
// Solidity: function paused(uint8 index) view returns(bool)
func (_DelegationManager *DelegationManagerCaller) Paused(opts *bind.CallOpts, index uint8) (bool, error)
⋮----
// Paused0 is a free data retrieval call binding the contract method 0x5c975abb.
⋮----
// Solidity: function paused() view returns(uint256)
func (_DelegationManager *DelegationManagerCaller) Paused0(opts *bind.CallOpts) (*big.Int, error)
⋮----
// PauserRegistry is a free data retrieval call binding the contract method 0x886f1195.
⋮----
// Solidity: function pauserRegistry() view returns(address)
func (_DelegationManager *DelegationManagerCaller) PauserRegistry(opts *bind.CallOpts) (common.Address, error)
⋮----
// PendingWithdrawals is a free data retrieval call binding the contract method 0xb7f06ebe.
⋮----
// Solidity: function pendingWithdrawals(bytes32 withdrawalRoot) view returns(bool pending)
func (_DelegationManager *DelegationManagerCaller) PendingWithdrawals(opts *bind.CallOpts, withdrawalRoot [32]byte) (bool, error)
⋮----
// PermissionController is a free data retrieval call binding the contract method 0x4657e26a.
⋮----
// Solidity: function permissionController() view returns(address)
func (_DelegationManager *DelegationManagerCaller) PermissionController(opts *bind.CallOpts) (common.Address, error)
⋮----
// QueuedWithdrawals is a free data retrieval call binding the contract method 0x99f5371b.
⋮----
// Solidity: function queuedWithdrawals(bytes32 withdrawalRoot) view returns((address,address,address,uint256,uint32,address[],uint256[]) withdrawal)
func (_DelegationManager *DelegationManagerCaller) QueuedWithdrawals(opts *bind.CallOpts, withdrawalRoot [32]byte) (IDelegationManagerTypesWithdrawal, error)
⋮----
// StrategyManager is a free data retrieval call binding the contract method 0x39b70e38.
⋮----
// Solidity: function strategyManager() view returns(address)
func (_DelegationManager *DelegationManagerCaller) StrategyManager(opts *bind.CallOpts) (common.Address, error)
⋮----
// Version is a free data retrieval call binding the contract method 0x54fd4d50.
⋮----
// Solidity: function version() view returns(string)
func (_DelegationManager *DelegationManagerCaller) Version(opts *bind.CallOpts) (string, error)
⋮----
// CompleteQueuedWithdrawal is a paid mutator transaction binding the contract method 0xe4cc3f90.
⋮----
// Solidity: function completeQueuedWithdrawal((address,address,address,uint256,uint32,address[],uint256[]) withdrawal, address[] tokens, bool receiveAsTokens) returns()
func (_DelegationManager *DelegationManagerTransactor) CompleteQueuedWithdrawal(opts *bind.TransactOpts, withdrawal IDelegationManagerTypesWithdrawal, tokens []common.Address, receiveAsTokens bool) (*types.Transaction, error)
⋮----
// CompleteQueuedWithdrawals is a paid mutator transaction binding the contract method 0x9435bb43.
⋮----
// Solidity: function completeQueuedWithdrawals((address,address,address,uint256,uint32,address[],uint256[])[] withdrawals, address[][] tokens, bool[] receiveAsTokens) returns()
func (_DelegationManager *DelegationManagerTransactor) CompleteQueuedWithdrawals(opts *bind.TransactOpts, withdrawals []IDelegationManagerTypesWithdrawal, tokens [][]common.Address, receiveAsTokens []bool) (*types.Transaction, error)
⋮----
// DecreaseDelegatedShares is a paid mutator transaction binding the contract method 0x60a0d1ce.
⋮----
// Solidity: function decreaseDelegatedShares(address staker, uint256 curDepositShares, uint64 beaconChainSlashingFactorDecrease) returns()
func (_DelegationManager *DelegationManagerTransactor) DecreaseDelegatedShares(opts *bind.TransactOpts, staker common.Address, curDepositShares *big.Int, beaconChainSlashingFactorDecrease uint64) (*types.Transaction, error)
⋮----
// DelegateTo is a paid mutator transaction binding the contract method 0xeea9064b.
⋮----
// Solidity: function delegateTo(address operator, (bytes,uint256) approverSignatureAndExpiry, bytes32 approverSalt) returns()
func (_DelegationManager *DelegationManagerTransactor) DelegateTo(opts *bind.TransactOpts, operator common.Address, approverSignatureAndExpiry ISignatureUtilsMixinTypesSignatureWithExpiry, approverSalt [32]byte) (*types.Transaction, error)
⋮----
// IncreaseDelegatedShares is a paid mutator transaction binding the contract method 0x3c651cf2.
⋮----
// Solidity: function increaseDelegatedShares(address staker, address strategy, uint256 prevDepositShares, uint256 addedShares) returns()
func (_DelegationManager *DelegationManagerTransactor) IncreaseDelegatedShares(opts *bind.TransactOpts, staker common.Address, strategy common.Address, prevDepositShares *big.Int, addedShares *big.Int) (*types.Transaction, error)
⋮----
// Initialize is a paid mutator transaction binding the contract method 0xfe4b84df.
⋮----
// Solidity: function initialize(uint256 initialPausedStatus) returns()
func (_DelegationManager *DelegationManagerTransactor) Initialize(opts *bind.TransactOpts, initialPausedStatus *big.Int) (*types.Transaction, error)
⋮----
// ModifyOperatorDetails is a paid mutator transaction binding the contract method 0x54b7c96c.
⋮----
// Solidity: function modifyOperatorDetails(address operator, address newDelegationApprover) returns()
func (_DelegationManager *DelegationManagerTransactor) ModifyOperatorDetails(opts *bind.TransactOpts, operator common.Address, newDelegationApprover common.Address) (*types.Transaction, error)
⋮----
// Pause is a paid mutator transaction binding the contract method 0x136439dd.
⋮----
// Solidity: function pause(uint256 newPausedStatus) returns()
func (_DelegationManager *DelegationManagerTransactor) Pause(opts *bind.TransactOpts, newPausedStatus *big.Int) (*types.Transaction, error)
⋮----
// PauseAll is a paid mutator transaction binding the contract method 0x595c6a67.
⋮----
// Solidity: function pauseAll() returns()
func (_DelegationManager *DelegationManagerTransactor) PauseAll(opts *bind.TransactOpts) (*types.Transaction, error)
⋮----
// QueueWithdrawals is a paid mutator transaction binding the contract method 0x0dd8dd02.
⋮----
// Solidity: function queueWithdrawals((address[],uint256[],address)[] params) returns(bytes32[])
func (_DelegationManager *DelegationManagerTransactor) QueueWithdrawals(opts *bind.TransactOpts, params []IDelegationManagerTypesQueuedWithdrawalParams) (*types.Transaction, error)
⋮----
// Redelegate is a paid mutator transaction binding the contract method 0xa33a3433.
⋮----
// Solidity: function redelegate(address newOperator, (bytes,uint256) newOperatorApproverSig, bytes32 approverSalt) returns(bytes32[] withdrawalRoots)
func (_DelegationManager *DelegationManagerTransactor) Redelegate(opts *bind.TransactOpts, newOperator common.Address, newOperatorApproverSig ISignatureUtilsMixinTypesSignatureWithExpiry, approverSalt [32]byte) (*types.Transaction, error)
⋮----
// RegisterAsOperator is a paid mutator transaction binding the contract method 0x2aa6d888.
⋮----
// Solidity: function registerAsOperator(address initDelegationApprover, uint32 allocationDelay, string metadataURI) returns()
func (_DelegationManager *DelegationManagerTransactor) RegisterAsOperator(opts *bind.TransactOpts, initDelegationApprover common.Address, allocationDelay uint32, metadataURI string) (*types.Transaction, error)
⋮----
// SlashOperatorShares is a paid mutator transaction binding the contract method 0x5ae679a7.
⋮----
// Solidity: function slashOperatorShares(address operator, (address,uint32) operatorSet, uint256 slashId, address strategy, uint64 prevMaxMagnitude, uint64 newMaxMagnitude) returns(uint256 totalDepositSharesToSlash)
func (_DelegationManager *DelegationManagerTransactor) SlashOperatorShares(opts *bind.TransactOpts, operator common.Address, operatorSet OperatorSet, slashId *big.Int, strategy common.Address, prevMaxMagnitude uint64, newMaxMagnitude uint64) (*types.Transaction, error)
⋮----
// Undelegate is a paid mutator transaction binding the contract method 0xda8be864.
⋮----
// Solidity: function undelegate(address staker) returns(bytes32[] withdrawalRoots)
func (_DelegationManager *DelegationManagerTransactor) Undelegate(opts *bind.TransactOpts, staker common.Address) (*types.Transaction, error)
⋮----
// Unpause is a paid mutator transaction binding the contract method 0xfabc1cbc.
⋮----
// Solidity: function unpause(uint256 newPausedStatus) returns()
func (_DelegationManager *DelegationManagerTransactor) Unpause(opts *bind.TransactOpts, newPausedStatus *big.Int) (*types.Transaction, error)
⋮----
// UpdateOperatorMetadataURI is a paid mutator transaction binding the contract method 0x78296ec5.
⋮----
// Solidity: function updateOperatorMetadataURI(address operator, string metadataURI) returns()
func (_DelegationManager *DelegationManagerTransactor) UpdateOperatorMetadataURI(opts *bind.TransactOpts, operator common.Address, metadataURI string) (*types.Transaction, error)
⋮----
// DelegationManagerDelegationApproverUpdatedIterator is returned from FilterDelegationApproverUpdated and is used to iterate over the raw logs and unpacked data for DelegationApproverUpdated events raised by the DelegationManager contract.
type DelegationManagerDelegationApproverUpdatedIterator struct {
	Event *DelegationManagerDelegationApproverUpdated // 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
}
⋮----
Event *DelegationManagerDelegationApproverUpdated // 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 *DelegationManagerDelegationApproverUpdatedIterator) Next() bool
⋮----
// If the iterator failed, stop iterating
⋮----
// If the iterator completed, deliver directly whatever's available
⋮----
// Iterator still in progress, wait for either a data or an error event
⋮----
// Error returns any retrieval or parsing error occurred during filtering.
func (it *DelegationManagerDelegationApproverUpdatedIterator) Error() error
⋮----
// Close terminates the iteration process, releasing any pending underlying
// resources.
func (it *DelegationManagerDelegationApproverUpdatedIterator) Close() error
⋮----
// DelegationManagerDelegationApproverUpdated represents a DelegationApproverUpdated event raised by the DelegationManager contract.
type DelegationManagerDelegationApproverUpdated struct {
	Operator              common.Address
	NewDelegationApprover common.Address
	Raw                   types.Log // Blockchain specific contextual infos
}
⋮----
Raw                   types.Log // Blockchain specific contextual infos
⋮----
// FilterDelegationApproverUpdated is a free log retrieval operation binding the contract event 0x773b54c04d756fcc5e678111f7d730de3be98192000799eee3d63716055a87c6.
⋮----
// Solidity: event DelegationApproverUpdated(address indexed operator, address newDelegationApprover)
func (_DelegationManager *DelegationManagerFilterer) FilterDelegationApproverUpdated(opts *bind.FilterOpts, operator []common.Address) (*DelegationManagerDelegationApproverUpdatedIterator, error)
⋮----
var operatorRule []interface{}
⋮----
// WatchDelegationApproverUpdated is a free log subscription operation binding the contract event 0x773b54c04d756fcc5e678111f7d730de3be98192000799eee3d63716055a87c6.
⋮----
func (_DelegationManager *DelegationManagerFilterer) WatchDelegationApproverUpdated(opts *bind.WatchOpts, sink chan<- *DelegationManagerDelegationApproverUpdated, operator []common.Address) (event.Subscription, error)
⋮----
// New log arrived, parse the event and forward to the user
⋮----
// ParseDelegationApproverUpdated is a log parse operation binding the contract event 0x773b54c04d756fcc5e678111f7d730de3be98192000799eee3d63716055a87c6.
⋮----
func (_DelegationManager *DelegationManagerFilterer) ParseDelegationApproverUpdated(log types.Log) (*DelegationManagerDelegationApproverUpdated, error)
⋮----
// DelegationManagerDepositScalingFactorUpdatedIterator is returned from FilterDepositScalingFactorUpdated and is used to iterate over the raw logs and unpacked data for DepositScalingFactorUpdated events raised by the DelegationManager contract.
type DelegationManagerDepositScalingFactorUpdatedIterator struct {
	Event *DelegationManagerDepositScalingFactorUpdated // 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
}
⋮----
Event *DelegationManagerDepositScalingFactorUpdated // Event containing the contract specifics and raw log
⋮----
// DelegationManagerDepositScalingFactorUpdated represents a DepositScalingFactorUpdated event raised by the DelegationManager contract.
type DelegationManagerDepositScalingFactorUpdated struct {
	Staker                  common.Address
	Strategy                common.Address
	NewDepositScalingFactor *big.Int
	Raw                     types.Log // Blockchain specific contextual infos
}
⋮----
Raw                     types.Log // Blockchain specific contextual infos
⋮----
// FilterDepositScalingFactorUpdated is a free log retrieval operation binding the contract event 0x8be932bac54561f27260f95463d9b8ab37e06b2842e5ee2404157cc13df6eb8f.
⋮----
// Solidity: event DepositScalingFactorUpdated(address staker, address strategy, uint256 newDepositScalingFactor)
func (_DelegationManager *DelegationManagerFilterer) FilterDepositScalingFactorUpdated(opts *bind.FilterOpts) (*DelegationManagerDepositScalingFactorUpdatedIterator, error)
⋮----
// WatchDepositScalingFactorUpdated is a free log subscription operation binding the contract event 0x8be932bac54561f27260f95463d9b8ab37e06b2842e5ee2404157cc13df6eb8f.
⋮----
func (_DelegationManager *DelegationManagerFilterer) WatchDepositScalingFactorUpdated(opts *bind.WatchOpts, sink chan<- *DelegationManagerDepositScalingFactorUpdated) (event.Subscription, error)
⋮----
// ParseDepositScalingFactorUpdated is a log parse operation binding the contract event 0x8be932bac54561f27260f95463d9b8ab37e06b2842e5ee2404157cc13df6eb8f.
⋮----
func (_DelegationManager *DelegationManagerFilterer) ParseDepositScalingFactorUpdated(log types.Log) (*DelegationManagerDepositScalingFactorUpdated, error)
⋮----
// DelegationManagerInitializedIterator is returned from FilterInitialized and is used to iterate over the raw logs and unpacked data for Initialized events raised by the DelegationManager contract.
type DelegationManagerInitializedIterator struct {
	Event *DelegationManagerInitialized // 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
}
⋮----
Event *DelegationManagerInitialized // Event containing the contract specifics and raw log
⋮----
// DelegationManagerInitialized represents a Initialized event raised by the DelegationManager contract.
type DelegationManagerInitialized struct {
	Version uint8
	Raw     types.Log // Blockchain specific contextual infos
}
⋮----
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 (_DelegationManager *DelegationManagerFilterer) FilterInitialized(opts *bind.FilterOpts) (*DelegationManagerInitializedIterator, error)
⋮----
// WatchInitialized is a free log subscription operation binding the contract event 0x7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb3847402498.
⋮----
func (_DelegationManager *DelegationManagerFilterer) WatchInitialized(opts *bind.WatchOpts, sink chan<- *DelegationManagerInitialized) (event.Subscription, error)
⋮----
// ParseInitialized is a log parse operation binding the contract event 0x7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb3847402498.
⋮----
func (_DelegationManager *DelegationManagerFilterer) ParseInitialized(log types.Log) (*DelegationManagerInitialized, error)
⋮----
// DelegationManagerOperatorMetadataURIUpdatedIterator is returned from FilterOperatorMetadataURIUpdated and is used to iterate over the raw logs and unpacked data for OperatorMetadataURIUpdated events raised by the DelegationManager contract.
type DelegationManagerOperatorMetadataURIUpdatedIterator struct {
	Event *DelegationManagerOperatorMetadataURIUpdated // 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
}
⋮----
Event *DelegationManagerOperatorMetadataURIUpdated // Event containing the contract specifics and raw log
⋮----
// DelegationManagerOperatorMetadataURIUpdated represents a OperatorMetadataURIUpdated event raised by the DelegationManager contract.
type DelegationManagerOperatorMetadataURIUpdated struct {
	Operator    common.Address
	MetadataURI string
	Raw         types.Log // Blockchain specific contextual infos
}
⋮----
Raw         types.Log // Blockchain specific contextual infos
⋮----
// FilterOperatorMetadataURIUpdated is a free log retrieval operation binding the contract event 0x02a919ed0e2acad1dd90f17ef2fa4ae5462ee1339170034a8531cca4b6708090.
⋮----
// Solidity: event OperatorMetadataURIUpdated(address indexed operator, string metadataURI)
func (_DelegationManager *DelegationManagerFilterer) FilterOperatorMetadataURIUpdated(opts *bind.FilterOpts, operator []common.Address) (*DelegationManagerOperatorMetadataURIUpdatedIterator, error)
⋮----
// WatchOperatorMetadataURIUpdated is a free log subscription operation binding the contract event 0x02a919ed0e2acad1dd90f17ef2fa4ae5462ee1339170034a8531cca4b6708090.
⋮----
func (_DelegationManager *DelegationManagerFilterer) WatchOperatorMetadataURIUpdated(opts *bind.WatchOpts, sink chan<- *DelegationManagerOperatorMetadataURIUpdated, operator []common.Address) (event.Subscription, error)
⋮----
// ParseOperatorMetadataURIUpdated is a log parse operation binding the contract event 0x02a919ed0e2acad1dd90f17ef2fa4ae5462ee1339170034a8531cca4b6708090.
⋮----
func (_DelegationManager *DelegationManagerFilterer) ParseOperatorMetadataURIUpdated(log types.Log) (*DelegationManagerOperatorMetadataURIUpdated, error)
⋮----
// DelegationManagerOperatorRegisteredIterator is returned from FilterOperatorRegistered and is used to iterate over the raw logs and unpacked data for OperatorRegistered events raised by the DelegationManager contract.
type DelegationManagerOperatorRegisteredIterator struct {
	Event *DelegationManagerOperatorRegistered // 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
}
⋮----
Event *DelegationManagerOperatorRegistered // Event containing the contract specifics and raw log
⋮----
// DelegationManagerOperatorRegistered represents a OperatorRegistered event raised by the DelegationManager contract.
type DelegationManagerOperatorRegistered struct {
	Operator           common.Address
	DelegationApprover common.Address
	Raw                types.Log // Blockchain specific contextual infos
}
⋮----
Raw                types.Log // Blockchain specific contextual infos
⋮----
// FilterOperatorRegistered is a free log retrieval operation binding the contract event 0xa453db612af59e5521d6ab9284dc3e2d06af286eb1b1b7b771fce4716c19f2c1.
⋮----
// Solidity: event OperatorRegistered(address indexed operator, address delegationApprover)
func (_DelegationManager *DelegationManagerFilterer) FilterOperatorRegistered(opts *bind.FilterOpts, operator []common.Address) (*DelegationManagerOperatorRegisteredIterator, error)
⋮----
// WatchOperatorRegistered is a free log subscription operation binding the contract event 0xa453db612af59e5521d6ab9284dc3e2d06af286eb1b1b7b771fce4716c19f2c1.
⋮----
func (_DelegationManager *DelegationManagerFilterer) WatchOperatorRegistered(opts *bind.WatchOpts, sink chan<- *DelegationManagerOperatorRegistered, operator []common.Address) (event.Subscription, error)
⋮----
// ParseOperatorRegistered is a log parse operation binding the contract event 0xa453db612af59e5521d6ab9284dc3e2d06af286eb1b1b7b771fce4716c19f2c1.
⋮----
func (_DelegationManager *DelegationManagerFilterer) ParseOperatorRegistered(log types.Log) (*DelegationManagerOperatorRegistered, error)
⋮----
// DelegationManagerOperatorSharesDecreasedIterator is returned from FilterOperatorSharesDecreased and is used to iterate over the raw logs and unpacked data for OperatorSharesDecreased events raised by the DelegationManager contract.
type DelegationManagerOperatorSharesDecreasedIterator struct {
	Event *DelegationManagerOperatorSharesDecreased // 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
}
⋮----
Event *DelegationManagerOperatorSharesDecreased // Event containing the contract specifics and raw log
⋮----
// DelegationManagerOperatorSharesDecreased represents a OperatorSharesDecreased event raised by the DelegationManager contract.
type DelegationManagerOperatorSharesDecreased struct {
	Operator common.Address
	Staker   common.Address
	Strategy common.Address
	Shares   *big.Int
	Raw      types.Log // Blockchain specific contextual infos
}
⋮----
Raw      types.Log // Blockchain specific contextual infos
⋮----
// FilterOperatorSharesDecreased is a free log retrieval operation binding the contract event 0x6909600037b75d7b4733aedd815442b5ec018a827751c832aaff64eba5d6d2dd.
⋮----
// Solidity: event OperatorSharesDecreased(address indexed operator, address staker, address strategy, uint256 shares)
func (_DelegationManager *DelegationManagerFilterer) FilterOperatorSharesDecreased(opts *bind.FilterOpts, operator []common.Address) (*DelegationManagerOperatorSharesDecreasedIterator, error)
⋮----
// WatchOperatorSharesDecreased is a free log subscription operation binding the contract event 0x6909600037b75d7b4733aedd815442b5ec018a827751c832aaff64eba5d6d2dd.
⋮----
func (_DelegationManager *DelegationManagerFilterer) WatchOperatorSharesDecreased(opts *bind.WatchOpts, sink chan<- *DelegationManagerOperatorSharesDecreased, operator []common.Address) (event.Subscription, error)
⋮----
// ParseOperatorSharesDecreased is a log parse operation binding the contract event 0x6909600037b75d7b4733aedd815442b5ec018a827751c832aaff64eba5d6d2dd.
⋮----
func (_DelegationManager *DelegationManagerFilterer) ParseOperatorSharesDecreased(log types.Log) (*DelegationManagerOperatorSharesDecreased, error)
⋮----
// DelegationManagerOperatorSharesIncreasedIterator is returned from FilterOperatorSharesIncreased and is used to iterate over the raw logs and unpacked data for OperatorSharesIncreased events raised by the DelegationManager contract.
type DelegationManagerOperatorSharesIncreasedIterator struct {
	Event *DelegationManagerOperatorSharesIncreased // 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
}
⋮----
Event *DelegationManagerOperatorSharesIncreased // Event containing the contract specifics and raw log
⋮----
// DelegationManagerOperatorSharesIncreased represents a OperatorSharesIncreased event raised by the DelegationManager contract.
type DelegationManagerOperatorSharesIncreased struct {
	Operator common.Address
	Staker   common.Address
	Strategy common.Address
	Shares   *big.Int
	Raw      types.Log // Blockchain specific contextual infos
}
⋮----
// FilterOperatorSharesIncreased is a free log retrieval operation binding the contract event 0x1ec042c965e2edd7107b51188ee0f383e22e76179041ab3a9d18ff151405166c.
⋮----
// Solidity: event OperatorSharesIncreased(address indexed operator, address staker, address strategy, uint256 shares)
func (_DelegationManager *DelegationManagerFilterer) FilterOperatorSharesIncreased(opts *bind.FilterOpts, operator []common.Address) (*DelegationManagerOperatorSharesIncreasedIterator, error)
⋮----
// WatchOperatorSharesIncreased is a free log subscription operation binding the contract event 0x1ec042c965e2edd7107b51188ee0f383e22e76179041ab3a9d18ff151405166c.
⋮----
func (_DelegationManager *DelegationManagerFilterer) WatchOperatorSharesIncreased(opts *bind.WatchOpts, sink chan<- *DelegationManagerOperatorSharesIncreased, operator []common.Address) (event.Subscription, error)
⋮----
// ParseOperatorSharesIncreased is a log parse operation binding the contract event 0x1ec042c965e2edd7107b51188ee0f383e22e76179041ab3a9d18ff151405166c.
⋮----
func (_DelegationManager *DelegationManagerFilterer) ParseOperatorSharesIncreased(log types.Log) (*DelegationManagerOperatorSharesIncreased, error)
⋮----
// DelegationManagerOperatorSharesSlashedIterator is returned from FilterOperatorSharesSlashed and is used to iterate over the raw logs and unpacked data for OperatorSharesSlashed events raised by the DelegationManager contract.
type DelegationManagerOperatorSharesSlashedIterator struct {
	Event *DelegationManagerOperatorSharesSlashed // Event containing the contract specifics and raw log

	contract *bind.BoundContract // Generic contract to use for unpacking event data
	event    string              // Event name to use for unpacking event data

	logs chan types.Log        // Log channel receiving the found contract events
	sub  ethereum.Subscription // Subscription for errors, completion and termination
	done bool                  // Whether the subscription completed delivering logs
	fail error                 // Occurred error to stop iteration
}
⋮----
Event *DelegationManagerOperatorSharesSlashed // Event containing the contract specifics and raw log
⋮----
// DelegationManagerOperatorSharesSlashed represents a OperatorSharesSlashed event raised by the DelegationManager contract.
type DelegationManagerOperatorSharesSlashed struct {
	Operator           common.Address
	Strategy           common.Address
	TotalSlashedShares *big.Int
	Raw                types.Log // Blockchain specific contextual infos
}
⋮----
// FilterOperatorSharesSlashed is a free log retrieval operation binding the contract event 0xdd611f4ef63f4385f1756c86ce1f1f389a9013ba6fa07daba8528291bc2d3c30.
⋮----
// Solidity: event OperatorSharesSlashed(address indexed operator, address strategy, uint256 totalSlashedShares)
func (_DelegationManager *DelegationManagerFilterer) FilterOperatorSharesSlashed(opts *bind.FilterOpts, operator []common.Address) (*DelegationManagerOperatorSharesSlashedIterator, error)
⋮----
// WatchOperatorSharesSlashed is a free log subscription operation binding the contract event 0xdd611f4ef63f4385f1756c86ce1f1f389a9013ba6fa07daba8528291bc2d3c30.
⋮----
func (_DelegationManager *DelegationManagerFilterer) WatchOperatorSharesSlashed(opts *bind.WatchOpts, sink chan<- *DelegationManagerOperatorSharesSlashed, operator []common.Address) (event.Subscription, error)
⋮----
// ParseOperatorSharesSlashed is a log parse operation binding the contract event 0xdd611f4ef63f4385f1756c86ce1f1f389a9013ba6fa07daba8528291bc2d3c30.
⋮----
func (_DelegationManager *DelegationManagerFilterer) ParseOperatorSharesSlashed(log types.Log) (*DelegationManagerOperatorSharesSlashed, error)
⋮----
// DelegationManagerPausedIterator is returned from FilterPaused and is used to iterate over the raw logs and unpacked data for Paused events raised by the DelegationManager contract.
type DelegationManagerPausedIterator struct {
	Event *DelegationManagerPaused // 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
}
⋮----
Event *DelegationManagerPaused // Event containing the contract specifics and raw log
⋮----
// DelegationManagerPaused represents a Paused event raised by the DelegationManager contract.
type DelegationManagerPaused struct {
	Account         common.Address
	NewPausedStatus *big.Int
	Raw             types.Log // Blockchain specific contextual infos
}
⋮----
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 (_DelegationManager *DelegationManagerFilterer) FilterPaused(opts *bind.FilterOpts, account []common.Address) (*DelegationManagerPausedIterator, error)
⋮----
var accountRule []interface{}
⋮----
// WatchPaused is a free log subscription operation binding the contract event 0xab40a374bc51de372200a8bc981af8c9ecdc08dfdaef0bb6e09f88f3c616ef3d.
⋮----
func (_DelegationManager *DelegationManagerFilterer) WatchPaused(opts *bind.WatchOpts, sink chan<- *DelegationManagerPaused, account []common.Address) (event.Subscription, error)
⋮----
// ParsePaused is a log parse operation binding the contract event 0xab40a374bc51de372200a8bc981af8c9ecdc08dfdaef0bb6e09f88f3c616ef3d.
⋮----
func (_DelegationManager *DelegationManagerFilterer) ParsePaused(log types.Log) (*DelegationManagerPaused, error)
⋮----
// DelegationManagerSlashingWithdrawalCompletedIterator is returned from FilterSlashingWithdrawalCompleted and is used to iterate over the raw logs and unpacked data for SlashingWithdrawalCompleted events raised by the DelegationManager contract.
type DelegationManagerSlashingWithdrawalCompletedIterator struct {
	Event *DelegationManagerSlashingWithdrawalCompleted // 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
}
⋮----
Event *DelegationManagerSlashingWithdrawalCompleted // Event containing the contract specifics and raw log
⋮----
// DelegationManagerSlashingWithdrawalCompleted represents a SlashingWithdrawalCompleted event raised by the DelegationManager contract.
type DelegationManagerSlashingWithdrawalCompleted struct {
	WithdrawalRoot [32]byte
	Raw            types.Log // Blockchain specific contextual infos
}
⋮----
Raw            types.Log // Blockchain specific contextual infos
⋮----
// FilterSlashingWithdrawalCompleted is a free log retrieval operation binding the contract event 0x1f40400889274ed07b24845e5054a87a0cab969eb1277aafe61ae352e7c32a00.
⋮----
// Solidity: event SlashingWithdrawalCompleted(bytes32 withdrawalRoot)
func (_DelegationManager *DelegationManagerFilterer) FilterSlashingWithdrawalCompleted(opts *bind.FilterOpts) (*DelegationManagerSlashingWithdrawalCompletedIterator, error)
⋮----
// WatchSlashingWithdrawalCompleted is a free log subscription operation binding the contract event 0x1f40400889274ed07b24845e5054a87a0cab969eb1277aafe61ae352e7c32a00.
⋮----
func (_DelegationManager *DelegationManagerFilterer) WatchSlashingWithdrawalCompleted(opts *bind.WatchOpts, sink chan<- *DelegationManagerSlashingWithdrawalCompleted) (event.Subscription, error)
⋮----
// ParseSlashingWithdrawalCompleted is a log parse operation binding the contract event 0x1f40400889274ed07b24845e5054a87a0cab969eb1277aafe61ae352e7c32a00.
⋮----
func (_DelegationManager *DelegationManagerFilterer) ParseSlashingWithdrawalCompleted(log types.Log) (*DelegationManagerSlashingWithdrawalCompleted, error)
⋮----
// DelegationManagerSlashingWithdrawalQueuedIterator is returned from FilterSlashingWithdrawalQueued and is used to iterate over the raw logs and unpacked data for SlashingWithdrawalQueued events raised by the DelegationManager contract.
type DelegationManagerSlashingWithdrawalQueuedIterator struct {
	Event *DelegationManagerSlashingWithdrawalQueued // 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
}
⋮----
Event *DelegationManagerSlashingWithdrawalQueued // Event containing the contract specifics and raw log
⋮----
// DelegationManagerSlashingWithdrawalQueued represents a SlashingWithdrawalQueued event raised by the DelegationManager contract.
type DelegationManagerSlashingWithdrawalQueued struct {
	WithdrawalRoot   [32]byte
	Withdrawal       IDelegationManagerTypesWithdrawal
	SharesToWithdraw []*big.Int
	Raw              types.Log // Blockchain specific contextual infos
}
⋮----
Raw              types.Log // Blockchain specific contextual infos
⋮----
// FilterSlashingWithdrawalQueued is a free log retrieval operation binding the contract event 0x26b2aae26516e8719ef50ea2f6831a2efbd4e37dccdf0f6936b27bc08e793e30.
⋮----
// Solidity: event SlashingWithdrawalQueued(bytes32 withdrawalRoot, (address,address,address,uint256,uint32,address[],uint256[]) withdrawal, uint256[] sharesToWithdraw)
func (_DelegationManager *DelegationManagerFilterer) FilterSlashingWithdrawalQueued(opts *bind.FilterOpts) (*DelegationManagerSlashingWithdrawalQueuedIterator, error)
⋮----
// WatchSlashingWithdrawalQueued is a free log subscription operation binding the contract event 0x26b2aae26516e8719ef50ea2f6831a2efbd4e37dccdf0f6936b27bc08e793e30.
⋮----
func (_DelegationManager *DelegationManagerFilterer) WatchSlashingWithdrawalQueued(opts *bind.WatchOpts, sink chan<- *DelegationManagerSlashingWithdrawalQueued) (event.Subscription, error)
⋮----
// ParseSlashingWithdrawalQueued is a log parse operation binding the contract event 0x26b2aae26516e8719ef50ea2f6831a2efbd4e37dccdf0f6936b27bc08e793e30.
⋮----
func (_DelegationManager *DelegationManagerFilterer) ParseSlashingWithdrawalQueued(log types.Log) (*DelegationManagerSlashingWithdrawalQueued, error)
⋮----
// DelegationManagerStakerDelegatedIterator is returned from FilterStakerDelegated and is used to iterate over the raw logs and unpacked data for StakerDelegated events raised by the DelegationManager contract.
type DelegationManagerStakerDelegatedIterator struct {
	Event *DelegationManagerStakerDelegated // 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
}
⋮----
Event *DelegationManagerStakerDelegated // Event containing the contract specifics and raw log
⋮----
// DelegationManagerStakerDelegated represents a StakerDelegated event raised by the DelegationManager contract.
type DelegationManagerStakerDelegated struct {
	Staker   common.Address
	Operator common.Address
	Raw      types.Log // Blockchain specific contextual infos
}
⋮----
// FilterStakerDelegated is a free log retrieval operation binding the contract event 0xc3ee9f2e5fda98e8066a1f745b2df9285f416fe98cf2559cd21484b3d8743304.
⋮----
// Solidity: event StakerDelegated(address indexed staker, address indexed operator)
func (_DelegationManager *DelegationManagerFilterer) FilterStakerDelegated(opts *bind.FilterOpts, staker []common.Address, operator []common.Address) (*DelegationManagerStakerDelegatedIterator, error)
⋮----
var stakerRule []interface{}
⋮----
// WatchStakerDelegated is a free log subscription operation binding the contract event 0xc3ee9f2e5fda98e8066a1f745b2df9285f416fe98cf2559cd21484b3d8743304.
⋮----
func (_DelegationManager *DelegationManagerFilterer) WatchStakerDelegated(opts *bind.WatchOpts, sink chan<- *DelegationManagerStakerDelegated, staker []common.Address, operator []common.Address) (event.Subscription, error)
⋮----
// ParseStakerDelegated is a log parse operation binding the contract event 0xc3ee9f2e5fda98e8066a1f745b2df9285f416fe98cf2559cd21484b3d8743304.
⋮----
func (_DelegationManager *DelegationManagerFilterer) ParseStakerDelegated(log types.Log) (*DelegationManagerStakerDelegated, error)
⋮----
// DelegationManagerStakerForceUndelegatedIterator is returned from FilterStakerForceUndelegated and is used to iterate over the raw logs and unpacked data for StakerForceUndelegated events raised by the DelegationManager contract.
type DelegationManagerStakerForceUndelegatedIterator struct {
	Event *DelegationManagerStakerForceUndelegated // 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
}
⋮----
Event *DelegationManagerStakerForceUndelegated // Event containing the contract specifics and raw log
⋮----
// DelegationManagerStakerForceUndelegated represents a StakerForceUndelegated event raised by the DelegationManager contract.
type DelegationManagerStakerForceUndelegated struct {
	Staker   common.Address
	Operator common.Address
	Raw      types.Log // Blockchain specific contextual infos
}
⋮----
// FilterStakerForceUndelegated is a free log retrieval operation binding the contract event 0xf0eddf07e6ea14f388b47e1e94a0f464ecbd9eed4171130e0fc0e99fb4030a8a.
⋮----
// Solidity: event StakerForceUndelegated(address indexed staker, address indexed operator)
func (_DelegationManager *DelegationManagerFilterer) FilterStakerForceUndelegated(opts *bind.FilterOpts, staker []common.Address, operator []common.Address) (*DelegationManagerStakerForceUndelegatedIterator, error)
⋮----
// WatchStakerForceUndelegated is a free log subscription operation binding the contract event 0xf0eddf07e6ea14f388b47e1e94a0f464ecbd9eed4171130e0fc0e99fb4030a8a.
⋮----
func (_DelegationManager *DelegationManagerFilterer) WatchStakerForceUndelegated(opts *bind.WatchOpts, sink chan<- *DelegationManagerStakerForceUndelegated, staker []common.Address, operator []common.Address) (event.Subscription, error)
⋮----
// ParseStakerForceUndelegated is a log parse operation binding the contract event 0xf0eddf07e6ea14f388b47e1e94a0f464ecbd9eed4171130e0fc0e99fb4030a8a.
⋮----
func (_DelegationManager *DelegationManagerFilterer) ParseStakerForceUndelegated(log types.Log) (*DelegationManagerStakerForceUndelegated, error)
⋮----
// DelegationManagerStakerUndelegatedIterator is returned from FilterStakerUndelegated and is used to iterate over the raw logs and unpacked data for StakerUndelegated events raised by the DelegationManager contract.
type DelegationManagerStakerUndelegatedIterator struct {
	Event *DelegationManagerStakerUndelegated // 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
}
⋮----
Event *DelegationManagerStakerUndelegated // Event containing the contract specifics and raw log
⋮----
// DelegationManagerStakerUndelegated represents a StakerUndelegated event raised by the DelegationManager contract.
type DelegationManagerStakerUndelegated struct {
	Staker   common.Address
	Operator common.Address
	Raw      types.Log // Blockchain specific contextual infos
}
⋮----
// FilterStakerUndelegated is a free log retrieval operation binding the contract event 0xfee30966a256b71e14bc0ebfc94315e28ef4a97a7131a9e2b7a310a73af44676.
⋮----
// Solidity: event StakerUndelegated(address indexed staker, address indexed operator)
func (_DelegationManager *DelegationManagerFilterer) FilterStakerUndelegated(opts *bind.FilterOpts, staker []common.Address, operator []common.Address) (*DelegationManagerStakerUndelegatedIterator, error)
⋮----
// WatchStakerUndelegated is a free log subscription operation binding the contract event 0xfee30966a256b71e14bc0ebfc94315e28ef4a97a7131a9e2b7a310a73af44676.
⋮----
func (_DelegationManager *DelegationManagerFilterer) WatchStakerUndelegated(opts *bind.WatchOpts, sink chan<- *DelegationManagerStakerUndelegated, staker []common.Address, operator []common.Address) (event.Subscription, error)
⋮----
// ParseStakerUndelegated is a log parse operation binding the contract event 0xfee30966a256b71e14bc0ebfc94315e28ef4a97a7131a9e2b7a310a73af44676.
⋮----
func (_DelegationManager *DelegationManagerFilterer) ParseStakerUndelegated(log types.Log) (*DelegationManagerStakerUndelegated, error)
⋮----
// DelegationManagerUnpausedIterator is returned from FilterUnpaused and is used to iterate over the raw logs and unpacked data for Unpaused events raised by the DelegationManager contract.
type DelegationManagerUnpausedIterator struct {
	Event *DelegationManagerUnpaused // 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
}
⋮----
Event *DelegationManagerUnpaused // Event containing the contract specifics and raw log
⋮----
// DelegationManagerUnpaused represents a Unpaused event raised by the DelegationManager contract.
type DelegationManagerUnpaused 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 (_DelegationManager *DelegationManagerFilterer) FilterUnpaused(opts *bind.FilterOpts, account []common.Address) (*DelegationManagerUnpausedIterator, error)
⋮----
// WatchUnpaused is a free log subscription operation binding the contract event 0x3582d1828e26bf56bd801502bc021ac0bc8afb57c826e4986b45593c8fad389c.
⋮----
func (_DelegationManager *DelegationManagerFilterer) WatchUnpaused(opts *bind.WatchOpts, sink chan<- *DelegationManagerUnpaused, account []common.Address) (event.Subscription, error)
⋮----
// ParseUnpaused is a log parse operation binding the contract event 0x3582d1828e26bf56bd801502bc021ac0bc8afb57c826e4986b45593c8fad389c.
⋮----
func (_DelegationManager *DelegationManagerFilterer) ParseUnpaused(log types.Log) (*DelegationManagerUnpaused, error)
````

## File: pkg/bindings/DelegationManagerStorage/binding.go
````go
// Code generated - DO NOT EDIT.
// This file is a generated binding and any manual changes will be lost.
⋮----
package DelegationManagerStorage
⋮----
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"
)
⋮----
"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
)
⋮----
// IDelegationManagerTypesQueuedWithdrawalParams is an auto generated low-level Go binding around an user-defined struct.
type IDelegationManagerTypesQueuedWithdrawalParams struct {
	Strategies           []common.Address
	DepositShares        []*big.Int
	DeprecatedWithdrawer common.Address
}
⋮----
// IDelegationManagerTypesWithdrawal is an auto generated low-level Go binding around an user-defined struct.
type IDelegationManagerTypesWithdrawal struct {
	Staker       common.Address
	DelegatedTo  common.Address
	Withdrawer   common.Address
	Nonce        *big.Int
	StartBlock   uint32
	Strategies   []common.Address
	ScaledShares []*big.Int
}
⋮----
// ISignatureUtilsMixinTypesSignatureWithExpiry is an auto generated low-level Go binding around an user-defined struct.
type ISignatureUtilsMixinTypesSignatureWithExpiry struct {
	Signature []byte
	Expiry    *big.Int
}
⋮----
// OperatorSet is an auto generated low-level Go binding around an user-defined struct.
type OperatorSet struct {
	Avs common.Address
	Id  uint32
}
⋮----
// DelegationManagerStorageMetaData contains all meta data concerning the DelegationManagerStorage contract.
var DelegationManagerStorageMetaData = &bind.MetaData{
	ABI: "[{\"type\":\"function\",\"name\":\"DELEGATION_APPROVAL_TYPEHASH\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"allocationManager\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIAllocationManager\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"beaconChainETHStrategy\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"calculateDelegationApprovalDigestHash\",\"inputs\":[{\"name\":\"staker\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"_delegationApprover\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"approverSalt\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"expiry\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"calculateWithdrawalRoot\",\"inputs\":[{\"name\":\"withdrawal\",\"type\":\"tuple\",\"internalType\":\"structIDelegationManagerTypes.Withdrawal\",\"components\":[{\"name\":\"staker\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"delegatedTo\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"withdrawer\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"nonce\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"startBlock\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"strategies\",\"type\":\"address[]\",\"internalType\":\"contractIStrategy[]\"},{\"name\":\"scaledShares\",\"type\":\"uint256[]\",\"internalType\":\"uint256[]\"}]}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"pure\"},{\"type\":\"function\",\"name\":\"completeQueuedWithdrawal\",\"inputs\":[{\"name\":\"withdrawal\",\"type\":\"tuple\",\"internalType\":\"structIDelegationManagerTypes.Withdrawal\",\"components\":[{\"name\":\"staker\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"delegatedTo\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"withdrawer\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"nonce\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"startBlock\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"strategies\",\"type\":\"address[]\",\"internalType\":\"contractIStrategy[]\"},{\"name\":\"scaledShares\",\"type\":\"uint256[]\",\"internalType\":\"uint256[]\"}]},{\"name\":\"tokens\",\"type\":\"address[]\",\"internalType\":\"contractIERC20[]\"},{\"name\":\"receiveAsTokens\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"completeQueuedWithdrawals\",\"inputs\":[{\"name\":\"withdrawals\",\"type\":\"tuple[]\",\"internalType\":\"structIDelegationManagerTypes.Withdrawal[]\",\"components\":[{\"name\":\"staker\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"delegatedTo\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"withdrawer\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"nonce\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"startBlock\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"strategies\",\"type\":\"address[]\",\"internalType\":\"contractIStrategy[]\"},{\"name\":\"scaledShares\",\"type\":\"uint256[]\",\"internalType\":\"uint256[]\"}]},{\"name\":\"tokens\",\"type\":\"address[][]\",\"internalType\":\"contractIERC20[][]\"},{\"name\":\"receiveAsTokens\",\"type\":\"bool[]\",\"internalType\":\"bool[]\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"convertToDepositShares\",\"inputs\":[{\"name\":\"staker\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"strategies\",\"type\":\"address[]\",\"internalType\":\"contractIStrategy[]\"},{\"name\":\"withdrawableShares\",\"type\":\"uint256[]\",\"internalType\":\"uint256[]\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256[]\",\"internalType\":\"uint256[]\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"cumulativeWithdrawalsQueued\",\"inputs\":[{\"name\":\"staker\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"totalQueued\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"decreaseDelegatedShares\",\"inputs\":[{\"name\":\"staker\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"curDepositShares\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"beaconChainSlashingFactorDecrease\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"delegateTo\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"approverSignatureAndExpiry\",\"type\":\"tuple\",\"internalType\":\"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\":\"pendingWithdrawals\",\"inputs\":[{\"name\":\"withdrawalRoot\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"pending\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"queueWithdrawals\",\"inputs\":[{\"name\":\"params\",\"type\":\"tuple[]\",\"internalType\":\"structIDelegationManagerTypes.QueuedWithdrawalParams[]\",\"components\":[{\"name\":\"strategies\",\"type\":\"address[]\",\"internalType\":\"contractIStrategy[]\"},{\"name\":\"depositShares\",\"type\":\"uint256[]\",\"internalType\":\"uint256[]\"},{\"name\":\"__deprecated_withdrawer\",\"type\":\"address\",\"internalType\":\"address\"}]}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32[]\",\"internalType\":\"bytes32[]\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"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\":\"updateOperatorMetadataURI\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"metadataURI\",\"type\":\"string\",\"internalType\":\"string\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"event\",\"name\":\"DelegationApproverUpdated\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"newDelegationApprover\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"DepositScalingFactorUpdated\",\"inputs\":[{\"name\":\"staker\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"},{\"name\":\"strategy\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"contractIStrategy\"},{\"name\":\"newDepositScalingFactor\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"OperatorMetadataURIUpdated\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"metadataURI\",\"type\":\"string\",\"indexed\":false,\"internalType\":\"string\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"OperatorRegistered\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"delegationApprover\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"OperatorSharesDecreased\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"staker\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"},{\"name\":\"strategy\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"contractIStrategy\"},{\"name\":\"shares\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"OperatorSharesIncreased\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"staker\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"},{\"name\":\"strategy\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"contractIStrategy\"},{\"name\":\"shares\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"OperatorSharesSlashed\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"strategy\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"contractIStrategy\"},{\"name\":\"totalSlashedShares\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"SlashingWithdrawalCompleted\",\"inputs\":[{\"name\":\"withdrawalRoot\",\"type\":\"bytes32\",\"indexed\":false,\"internalType\":\"bytes32\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"SlashingWithdrawalQueued\",\"inputs\":[{\"name\":\"withdrawalRoot\",\"type\":\"bytes32\",\"indexed\":false,\"internalType\":\"bytes32\"},{\"name\":\"withdrawal\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structIDelegationManagerTypes.Withdrawal\",\"components\":[{\"name\":\"staker\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"delegatedTo\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"withdrawer\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"nonce\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"startBlock\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"strategies\",\"type\":\"address[]\",\"internalType\":\"contractIStrategy[]\"},{\"name\":\"scaledShares\",\"type\":\"uint256[]\",\"internalType\":\"uint256[]\"}]},{\"name\":\"sharesToWithdraw\",\"type\":\"uint256[]\",\"indexed\":false,\"internalType\":\"uint256[]\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"StakerDelegated\",\"inputs\":[{\"name\":\"staker\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"operator\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"StakerForceUndelegated\",\"inputs\":[{\"name\":\"staker\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"operator\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"StakerUndelegated\",\"inputs\":[{\"name\":\"staker\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"operator\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"error\",\"name\":\"ActivelyDelegated\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"CallerCannotUndelegate\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"FullySlashed\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InputArrayLengthMismatch\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InputArrayLengthZero\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidSignature\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"NotActivelyDelegated\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"OnlyAllocationManager\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"OnlyEigenPodManager\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"OnlyStrategyManagerOrEigenPodManager\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"OperatorNotRegistered\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"OperatorsCannotUndelegate\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"SaltSpent\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"SignatureExpired\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"WithdrawalDelayNotElapsed\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"WithdrawalNotQueued\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"WithdrawerNotCaller\",\"inputs\":[]}]",
}
⋮----
// DelegationManagerStorageABI is the input ABI used to generate the binding from.
// Deprecated: Use DelegationManagerStorageMetaData.ABI instead.
var DelegationManagerStorageABI = DelegationManagerStorageMetaData.ABI
⋮----
// DelegationManagerStorage is an auto generated Go binding around an Ethereum contract.
type DelegationManagerStorage struct {
	DelegationManagerStorageCaller     // Read-only binding to the contract
	DelegationManagerStorageTransactor // Write-only binding to the contract
	DelegationManagerStorageFilterer   // Log filterer for contract events
}
⋮----
DelegationManagerStorageCaller     // Read-only binding to the contract
DelegationManagerStorageTransactor // Write-only binding to the contract
DelegationManagerStorageFilterer   // Log filterer for contract events
⋮----
// DelegationManagerStorageCaller is an auto generated read-only Go binding around an Ethereum contract.
type DelegationManagerStorageCaller struct {
	contract *bind.BoundContract // Generic contract wrapper for the low level calls
}
⋮----
contract *bind.BoundContract // Generic contract wrapper for the low level calls
⋮----
// DelegationManagerStorageTransactor is an auto generated write-only Go binding around an Ethereum contract.
type DelegationManagerStorageTransactor struct {
	contract *bind.BoundContract // Generic contract wrapper for the low level calls
}
⋮----
// DelegationManagerStorageFilterer is an auto generated log filtering Go binding around an Ethereum contract events.
type DelegationManagerStorageFilterer struct {
	contract *bind.BoundContract // Generic contract wrapper for the low level calls
}
⋮----
// DelegationManagerStorageSession is an auto generated Go binding around an Ethereum contract,
// with pre-set call and transact options.
type DelegationManagerStorageSession struct {
	Contract     *DelegationManagerStorage // 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
}
⋮----
Contract     *DelegationManagerStorage // 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
⋮----
// DelegationManagerStorageCallerSession is an auto generated read-only Go binding around an Ethereum contract,
// with pre-set call options.
type DelegationManagerStorageCallerSession struct {
	Contract *DelegationManagerStorageCaller // Generic contract caller binding to set the session for
	CallOpts bind.CallOpts                   // Call options to use throughout this session
}
⋮----
Contract *DelegationManagerStorageCaller // Generic contract caller binding to set the session for
CallOpts bind.CallOpts                   // Call options to use throughout this session
⋮----
// DelegationManagerStorageTransactorSession is an auto generated write-only Go binding around an Ethereum contract,
// with pre-set transact options.
type DelegationManagerStorageTransactorSession struct {
	Contract     *DelegationManagerStorageTransactor // Generic contract transactor binding to set the session for
	TransactOpts bind.TransactOpts                   // Transaction auth options to use throughout this session
}
⋮----
Contract     *DelegationManagerStorageTransactor // Generic contract transactor binding to set the session for
TransactOpts bind.TransactOpts                   // Transaction auth options to use throughout this session
⋮----
// DelegationManagerStorageRaw is an auto generated low-level Go binding around an Ethereum contract.
type DelegationManagerStorageRaw struct {
	Contract *DelegationManagerStorage // Generic contract binding to access the raw methods on
}
⋮----
Contract *DelegationManagerStorage // Generic contract binding to access the raw methods on
⋮----
// DelegationManagerStorageCallerRaw is an auto generated low-level read-only Go binding around an Ethereum contract.
type DelegationManagerStorageCallerRaw struct {
	Contract *DelegationManagerStorageCaller // Generic read-only contract binding to access the raw methods on
}
⋮----
Contract *DelegationManagerStorageCaller // Generic read-only contract binding to access the raw methods on
⋮----
// DelegationManagerStorageTransactorRaw is an auto generated low-level write-only Go binding around an Ethereum contract.
type DelegationManagerStorageTransactorRaw struct {
	Contract *DelegationManagerStorageTransactor // Generic write-only contract binding to access the raw methods on
}
⋮----
Contract *DelegationManagerStorageTransactor // Generic write-only contract binding to access the raw methods on
⋮----
// NewDelegationManagerStorage creates a new instance of DelegationManagerStorage, bound to a specific deployed contract.
func NewDelegationManagerStorage(address common.Address, backend bind.ContractBackend) (*DelegationManagerStorage, error)
⋮----
// NewDelegationManagerStorageCaller creates a new read-only instance of DelegationManagerStorage, bound to a specific deployed contract.
func NewDelegationManagerStorageCaller(address common.Address, caller bind.ContractCaller) (*DelegationManagerStorageCaller, error)
⋮----
// NewDelegationManagerStorageTransactor creates a new write-only instance of DelegationManagerStorage, bound to a specific deployed contract.
func NewDelegationManagerStorageTransactor(address common.Address, transactor bind.ContractTransactor) (*DelegationManagerStorageTransactor, error)
⋮----
// NewDelegationManagerStorageFilterer creates a new log filterer instance of DelegationManagerStorage, bound to a specific deployed contract.
func NewDelegationManagerStorageFilterer(address common.Address, filterer bind.ContractFilterer) (*DelegationManagerStorageFilterer, error)
⋮----
// bindDelegationManagerStorage binds a generic wrapper to an already deployed contract.
func bindDelegationManagerStorage(address common.Address, caller bind.ContractCaller, transactor bind.ContractTransactor, filterer bind.ContractFilterer) (*bind.BoundContract, error)
⋮----
// 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 (_DelegationManagerStorage *DelegationManagerStorageRaw) Call(opts *bind.CallOpts, result *[]interface
⋮----
// Transfer initiates a plain transaction to move funds to the contract, calling
// its default method if one is available.
func (_DelegationManagerStorage *DelegationManagerStorageRaw) Transfer(opts *bind.TransactOpts) (*types.Transaction, error)
⋮----
// Transact invokes the (paid) contract method with params as input values.
func (_DelegationManagerStorage *DelegationManagerStorageRaw) Transact(opts *bind.TransactOpts, method string, params ...interface
⋮----
// DELEGATIONAPPROVALTYPEHASH is a free data retrieval call binding the contract method 0x04a4f979.
//
// Solidity: function DELEGATION_APPROVAL_TYPEHASH() view returns(bytes32)
func (_DelegationManagerStorage *DelegationManagerStorageCaller) DELEGATIONAPPROVALTYPEHASH(opts *bind.CallOpts) ([32]byte, error)
⋮----
var out []interface{}
⋮----
// AllocationManager is a free data retrieval call binding the contract method 0xca8aa7c7.
⋮----
// Solidity: function allocationManager() view returns(address)
func (_DelegationManagerStorage *DelegationManagerStorageCaller) AllocationManager(opts *bind.CallOpts) (common.Address, error)
⋮----
// BeaconChainETHStrategy is a free data retrieval call binding the contract method 0x9104c319.
⋮----
// Solidity: function beaconChainETHStrategy() view returns(address)
func (_DelegationManagerStorage *DelegationManagerStorageCaller) BeaconChainETHStrategy(opts *bind.CallOpts) (common.Address, error)
⋮----
// CalculateDelegationApprovalDigestHash is a free data retrieval call binding the contract method 0x0b9f487a.
⋮----
// Solidity: function calculateDelegationApprovalDigestHash(address staker, address operator, address _delegationApprover, bytes32 approverSalt, uint256 expiry) view returns(bytes32)
func (_DelegationManagerStorage *DelegationManagerStorageCaller) CalculateDelegationApprovalDigestHash(opts *bind.CallOpts, staker common.Address, operator common.Address, _delegationApprover common.Address, approverSalt [32]byte, expiry *big.Int) ([32]byte, error)
⋮----
// CalculateWithdrawalRoot is a free data retrieval call binding the contract method 0x597b36da.
⋮----
// Solidity: function calculateWithdrawalRoot((address,address,address,uint256,uint32,address[],uint256[]) withdrawal) pure returns(bytes32)
func (_DelegationManagerStorage *DelegationManagerStorageCaller) CalculateWithdrawalRoot(opts *bind.CallOpts, withdrawal IDelegationManagerTypesWithdrawal) ([32]byte, error)
⋮----
// ConvertToDepositShares is a free data retrieval call binding the contract method 0x25df922e.
⋮----
// Solidity: function convertToDepositShares(address staker, address[] strategies, uint256[] withdrawableShares) view returns(uint256[])
func (_DelegationManagerStorage *DelegationManagerStorageCaller) ConvertToDepositShares(opts *bind.CallOpts, staker common.Address, strategies []common.Address, withdrawableShares []*big.Int) ([]*big.Int, error)
⋮----
// CumulativeWithdrawalsQueued is a free data retrieval call binding the contract method 0xa1788484.
⋮----
// Solidity: function cumulativeWithdrawalsQueued(address staker) view returns(uint256 totalQueued)
func (_DelegationManagerStorage *DelegationManagerStorageCaller) CumulativeWithdrawalsQueued(opts *bind.CallOpts, staker common.Address) (*big.Int, error)
⋮----
// DelegatedTo is a free data retrieval call binding the contract method 0x65da1264.
⋮----
// Solidity: function delegatedTo(address staker) view returns(address operator)
func (_DelegationManagerStorage *DelegationManagerStorageCaller) DelegatedTo(opts *bind.CallOpts, staker common.Address) (common.Address, error)
⋮----
// DelegationApprover is a free data retrieval call binding the contract method 0x3cdeb5e0.
⋮----
// Solidity: function delegationApprover(address operator) view returns(address)
func (_DelegationManagerStorage *DelegationManagerStorageCaller) DelegationApprover(opts *bind.CallOpts, operator common.Address) (common.Address, error)
⋮----
// DelegationApproverSaltIsSpent is a free data retrieval call binding the contract method 0xbb45fef2.
⋮----
// Solidity: function delegationApproverSaltIsSpent(address delegationApprover, bytes32 salt) view returns(bool spent)
func (_DelegationManagerStorage *DelegationManagerStorageCaller) DelegationApproverSaltIsSpent(opts *bind.CallOpts, delegationApprover common.Address, salt [32]byte) (bool, error)
⋮----
// DepositScalingFactor is a free data retrieval call binding the contract method 0xbfae3fd2.
⋮----
// Solidity: function depositScalingFactor(address staker, address strategy) view returns(uint256)
func (_DelegationManagerStorage *DelegationManagerStorageCaller) DepositScalingFactor(opts *bind.CallOpts, staker common.Address, strategy common.Address) (*big.Int, error)
⋮----
// DomainSeparator is a free data retrieval call binding the contract method 0xf698da25.
⋮----
// Solidity: function domainSeparator() view returns(bytes32)
func (_DelegationManagerStorage *DelegationManagerStorageCaller) DomainSeparator(opts *bind.CallOpts) ([32]byte, error)
⋮----
// EigenPodManager is a free data retrieval call binding the contract method 0x4665bcda.
⋮----
// Solidity: function eigenPodManager() view returns(address)
func (_DelegationManagerStorage *DelegationManagerStorageCaller) EigenPodManager(opts *bind.CallOpts) (common.Address, error)
⋮----
// GetDepositedShares is a free data retrieval call binding the contract method 0x66d5ba93.
⋮----
// Solidity: function getDepositedShares(address staker) view returns(address[], uint256[])
func (_DelegationManagerStorage *DelegationManagerStorageCaller) GetDepositedShares(opts *bind.CallOpts, staker common.Address) ([]common.Address, []*big.Int, error)
⋮----
// GetOperatorShares is a free data retrieval call binding the contract method 0x90041347.
⋮----
// Solidity: function getOperatorShares(address operator, address[] strategies) view returns(uint256[])
func (_DelegationManagerStorage *DelegationManagerStorageCaller) GetOperatorShares(opts *bind.CallOpts, operator common.Address, strategies []common.Address) ([]*big.Int, error)
⋮----
// GetOperatorsShares is a free data retrieval call binding the contract method 0xf0e0e676.
⋮----
// Solidity: function getOperatorsShares(address[] operators, address[] strategies) view returns(uint256[][])
func (_DelegationManagerStorage *DelegationManagerStorageCaller) GetOperatorsShares(opts *bind.CallOpts, operators []common.Address, strategies []common.Address) ([][]*big.Int, error)
⋮----
// GetQueuedWithdrawal is a free data retrieval call binding the contract method 0x5d975e88.
⋮----
// Solidity: function getQueuedWithdrawal(bytes32 withdrawalRoot) view returns((address,address,address,uint256,uint32,address[],uint256[]) withdrawal, uint256[] shares)
func (_DelegationManagerStorage *DelegationManagerStorageCaller) GetQueuedWithdrawal(opts *bind.CallOpts, withdrawalRoot [32]byte) (struct
⋮----
// GetQueuedWithdrawalRoots is a free data retrieval call binding the contract method 0xfd8aa88d.
⋮----
// Solidity: function getQueuedWithdrawalRoots(address staker) view returns(bytes32[])
func (_DelegationManagerStorage *DelegationManagerStorageCaller) GetQueuedWithdrawalRoots(opts *bind.CallOpts, staker common.Address) ([][32]byte, error)
⋮----
// GetQueuedWithdrawals is a free data retrieval call binding the contract method 0x5dd68579.
⋮----
// Solidity: function getQueuedWithdrawals(address staker) view returns((address,address,address,uint256,uint32,address[],uint256[])[] withdrawals, uint256[][] shares)
func (_DelegationManagerStorage *DelegationManagerStorageCaller) GetQueuedWithdrawals(opts *bind.CallOpts, staker common.Address) (struct
⋮----
// GetSlashableSharesInQueue is a free data retrieval call binding the contract method 0x6e174448.
⋮----
// Solidity: function getSlashableSharesInQueue(address operator, address strategy) view returns(uint256)
func (_DelegationManagerStorage *DelegationManagerStorageCaller) GetSlashableSharesInQueue(opts *bind.CallOpts, operator common.Address, strategy common.Address) (*big.Int, error)
⋮----
// GetWithdrawableShares is a free data retrieval call binding the contract method 0xc978f7ac.
⋮----
// Solidity: function getWithdrawableShares(address staker, address[] strategies) view returns(uint256[] withdrawableShares, uint256[] depositShares)
func (_DelegationManagerStorage *DelegationManagerStorageCaller) GetWithdrawableShares(opts *bind.CallOpts, staker common.Address, strategies []common.Address) (struct
⋮----
// IsDelegated is a free data retrieval call binding the contract method 0x3e28391d.
⋮----
// Solidity: function isDelegated(address staker) view returns(bool)
func (_DelegationManagerStorage *DelegationManagerStorageCaller) IsDelegated(opts *bind.CallOpts, staker common.Address) (bool, error)
⋮----
// IsOperator is a free data retrieval call binding the contract method 0x6d70f7ae.
⋮----
// Solidity: function isOperator(address operator) view returns(bool)
func (_DelegationManagerStorage *DelegationManagerStorageCaller) IsOperator(opts *bind.CallOpts, operator common.Address) (bool, error)
⋮----
// MinWithdrawalDelayBlocks is a free data retrieval call binding the contract method 0xc448feb8.
⋮----
// Solidity: function minWithdrawalDelayBlocks() view returns(uint32)
func (_DelegationManagerStorage *DelegationManagerStorageCaller) MinWithdrawalDelayBlocks(opts *bind.CallOpts) (uint32, error)
⋮----
// OperatorShares is a free data retrieval call binding the contract method 0x778e55f3.
⋮----
// Solidity: function operatorShares(address operator, address strategy) view returns(uint256 shares)
func (_DelegationManagerStorage *DelegationManagerStorageCaller) OperatorShares(opts *bind.CallOpts, operator common.Address, strategy common.Address) (*big.Int, error)
⋮----
// PendingWithdrawals is a free data retrieval call binding the contract method 0xb7f06ebe.
⋮----
// Solidity: function pendingWithdrawals(bytes32 withdrawalRoot) view returns(bool pending)
func (_DelegationManagerStorage *DelegationManagerStorageCaller) PendingWithdrawals(opts *bind.CallOpts, withdrawalRoot [32]byte) (bool, error)
⋮----
// QueuedWithdrawals is a free data retrieval call binding the contract method 0x99f5371b.
⋮----
// Solidity: function queuedWithdrawals(bytes32 withdrawalRoot) view returns((address,address,address,uint256,uint32,address[],uint256[]) withdrawal)
func (_DelegationManagerStorage *DelegationManagerStorageCaller) QueuedWithdrawals(opts *bind.CallOpts, withdrawalRoot [32]byte) (IDelegationManagerTypesWithdrawal, error)
⋮----
// StrategyManager is a free data retrieval call binding the contract method 0x39b70e38.
⋮----
// Solidity: function strategyManager() view returns(address)
func (_DelegationManagerStorage *DelegationManagerStorageCaller) StrategyManager(opts *bind.CallOpts) (common.Address, error)
⋮----
// CompleteQueuedWithdrawal is a paid mutator transaction binding the contract method 0xe4cc3f90.
⋮----
// Solidity: function completeQueuedWithdrawal((address,address,address,uint256,uint32,address[],uint256[]) withdrawal, address[] tokens, bool receiveAsTokens) returns()
func (_DelegationManagerStorage *DelegationManagerStorageTransactor) CompleteQueuedWithdrawal(opts *bind.TransactOpts, withdrawal IDelegationManagerTypesWithdrawal, tokens []common.Address, receiveAsTokens bool) (*types.Transaction, error)
⋮----
// CompleteQueuedWithdrawals is a paid mutator transaction binding the contract method 0x9435bb43.
⋮----
// Solidity: function completeQueuedWithdrawals((address,address,address,uint256,uint32,address[],uint256[])[] withdrawals, address[][] tokens, bool[] receiveAsTokens) returns()
func (_DelegationManagerStorage *DelegationManagerStorageTransactor) CompleteQueuedWithdrawals(opts *bind.TransactOpts, withdrawals []IDelegationManagerTypesWithdrawal, tokens [][]common.Address, receiveAsTokens []bool) (*types.Transaction, error)
⋮----
// DecreaseDelegatedShares is a paid mutator transaction binding the contract method 0x60a0d1ce.
⋮----
// Solidity: function decreaseDelegatedShares(address staker, uint256 curDepositShares, uint64 beaconChainSlashingFactorDecrease) returns()
func (_DelegationManagerStorage *DelegationManagerStorageTransactor) DecreaseDelegatedShares(opts *bind.TransactOpts, staker common.Address, curDepositShares *big.Int, beaconChainSlashingFactorDecrease uint64) (*types.Transaction, error)
⋮----
// DelegateTo is a paid mutator transaction binding the contract method 0xeea9064b.
⋮----
// Solidity: function delegateTo(address operator, (bytes,uint256) approverSignatureAndExpiry, bytes32 approverSalt) returns()
func (_DelegationManagerStorage *DelegationManagerStorageTransactor) DelegateTo(opts *bind.TransactOpts, operator common.Address, approverSignatureAndExpiry ISignatureUtilsMixinTypesSignatureWithExpiry, approverSalt [32]byte) (*types.Transaction, error)
⋮----
// IncreaseDelegatedShares is a paid mutator transaction binding the contract method 0x3c651cf2.
⋮----
// Solidity: function increaseDelegatedShares(address staker, address strategy, uint256 prevDepositShares, uint256 addedShares) returns()
func (_DelegationManagerStorage *DelegationManagerStorageTransactor) IncreaseDelegatedShares(opts *bind.TransactOpts, staker common.Address, strategy common.Address, prevDepositShares *big.Int, addedShares *big.Int) (*types.Transaction, error)
⋮----
// Initialize is a paid mutator transaction binding the contract method 0xfe4b84df.
⋮----
// Solidity: function initialize(uint256 initialPausedStatus) returns()
func (_DelegationManagerStorage *DelegationManagerStorageTransactor) Initialize(opts *bind.TransactOpts, initialPausedStatus *big.Int) (*types.Transaction, error)
⋮----
// ModifyOperatorDetails is a paid mutator transaction binding the contract method 0x54b7c96c.
⋮----
// Solidity: function modifyOperatorDetails(address operator, address newDelegationApprover) returns()
func (_DelegationManagerStorage *DelegationManagerStorageTransactor) ModifyOperatorDetails(opts *bind.TransactOpts, operator common.Address, newDelegationApprover common.Address) (*types.Transaction, error)
⋮----
// QueueWithdrawals is a paid mutator transaction binding the contract method 0x0dd8dd02.
⋮----
// Solidity: function queueWithdrawals((address[],uint256[],address)[] params) returns(bytes32[])
func (_DelegationManagerStorage *DelegationManagerStorageTransactor) QueueWithdrawals(opts *bind.TransactOpts, params []IDelegationManagerTypesQueuedWithdrawalParams) (*types.Transaction, error)
⋮----
// Redelegate is a paid mutator transaction binding the contract method 0xa33a3433.
⋮----
// Solidity: function redelegate(address newOperator, (bytes,uint256) newOperatorApproverSig, bytes32 approverSalt) returns(bytes32[] withdrawalRoots)
func (_DelegationManagerStorage *DelegationManagerStorageTransactor) Redelegate(opts *bind.TransactOpts, newOperator common.Address, newOperatorApproverSig ISignatureUtilsMixinTypesSignatureWithExpiry, approverSalt [32]byte) (*types.Transaction, error)
⋮----
// RegisterAsOperator is a paid mutator transaction binding the contract method 0x2aa6d888.
⋮----
// Solidity: function registerAsOperator(address initDelegationApprover, uint32 allocationDelay, string metadataURI) returns()
func (_DelegationManagerStorage *DelegationManagerStorageTransactor) RegisterAsOperator(opts *bind.TransactOpts, initDelegationApprover common.Address, allocationDelay uint32, metadataURI string) (*types.Transaction, error)
⋮----
// SlashOperatorShares is a paid mutator transaction binding the contract method 0x5ae679a7.
⋮----
// Solidity: function slashOperatorShares(address operator, (address,uint32) operatorSet, uint256 slashId, address strategy, uint64 prevMaxMagnitude, uint64 newMaxMagnitude) returns(uint256 totalDepositSharesToSlash)
func (_DelegationManagerStorage *DelegationManagerStorageTransactor) SlashOperatorShares(opts *bind.TransactOpts, operator common.Address, operatorSet OperatorSet, slashId *big.Int, strategy common.Address, prevMaxMagnitude uint64, newMaxMagnitude uint64) (*types.Transaction, error)
⋮----
// Undelegate is a paid mutator transaction binding the contract method 0xda8be864.
⋮----
// Solidity: function undelegate(address staker) returns(bytes32[] withdrawalRoots)
func (_DelegationManagerStorage *DelegationManagerStorageTransactor) Undelegate(opts *bind.TransactOpts, staker common.Address) (*types.Transaction, error)
⋮----
// UpdateOperatorMetadataURI is a paid mutator transaction binding the contract method 0x78296ec5.
⋮----
// Solidity: function updateOperatorMetadataURI(address operator, string metadataURI) returns()
func (_DelegationManagerStorage *DelegationManagerStorageTransactor) UpdateOperatorMetadataURI(opts *bind.TransactOpts, operator common.Address, metadataURI string) (*types.Transaction, error)
⋮----
// DelegationManagerStorageDelegationApproverUpdatedIterator is returned from FilterDelegationApproverUpdated and is used to iterate over the raw logs and unpacked data for DelegationApproverUpdated events raised by the DelegationManagerStorage contract.
type DelegationManagerStorageDelegationApproverUpdatedIterator struct {
	Event *DelegationManagerStorageDelegationApproverUpdated // 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
}
⋮----
Event *DelegationManagerStorageDelegationApproverUpdated // 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 *DelegationManagerStorageDelegationApproverUpdatedIterator) Next() bool
⋮----
// If the iterator failed, stop iterating
⋮----
// If the iterator completed, deliver directly whatever's available
⋮----
// Iterator still in progress, wait for either a data or an error event
⋮----
// Error returns any retrieval or parsing error occurred during filtering.
func (it *DelegationManagerStorageDelegationApproverUpdatedIterator) Error() error
⋮----
// Close terminates the iteration process, releasing any pending underlying
// resources.
func (it *DelegationManagerStorageDelegationApproverUpdatedIterator) Close() error
⋮----
// DelegationManagerStorageDelegationApproverUpdated represents a DelegationApproverUpdated event raised by the DelegationManagerStorage contract.
type DelegationManagerStorageDelegationApproverUpdated struct {
	Operator              common.Address
	NewDelegationApprover common.Address
	Raw                   types.Log // Blockchain specific contextual infos
}
⋮----
Raw                   types.Log // Blockchain specific contextual infos
⋮----
// FilterDelegationApproverUpdated is a free log retrieval operation binding the contract event 0x773b54c04d756fcc5e678111f7d730de3be98192000799eee3d63716055a87c6.
⋮----
// Solidity: event DelegationApproverUpdated(address indexed operator, address newDelegationApprover)
func (_DelegationManagerStorage *DelegationManagerStorageFilterer) FilterDelegationApproverUpdated(opts *bind.FilterOpts, operator []common.Address) (*DelegationManagerStorageDelegationApproverUpdatedIterator, error)
⋮----
var operatorRule []interface{}
⋮----
// WatchDelegationApproverUpdated is a free log subscription operation binding the contract event 0x773b54c04d756fcc5e678111f7d730de3be98192000799eee3d63716055a87c6.
⋮----
func (_DelegationManagerStorage *DelegationManagerStorageFilterer) WatchDelegationApproverUpdated(opts *bind.WatchOpts, sink chan<- *DelegationManagerStorageDelegationApproverUpdated, operator []common.Address) (event.Subscription, error)
⋮----
// New log arrived, parse the event and forward to the user
⋮----
// ParseDelegationApproverUpdated is a log parse operation binding the contract event 0x773b54c04d756fcc5e678111f7d730de3be98192000799eee3d63716055a87c6.
⋮----
func (_DelegationManagerStorage *DelegationManagerStorageFilterer) ParseDelegationApproverUpdated(log types.Log) (*DelegationManagerStorageDelegationApproverUpdated, error)
⋮----
// DelegationManagerStorageDepositScalingFactorUpdatedIterator is returned from FilterDepositScalingFactorUpdated and is used to iterate over the raw logs and unpacked data for DepositScalingFactorUpdated events raised by the DelegationManagerStorage contract.
type DelegationManagerStorageDepositScalingFactorUpdatedIterator struct {
	Event *DelegationManagerStorageDepositScalingFactorUpdated // 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
}
⋮----
Event *DelegationManagerStorageDepositScalingFactorUpdated // Event containing the contract specifics and raw log
⋮----
// DelegationManagerStorageDepositScalingFactorUpdated represents a DepositScalingFactorUpdated event raised by the DelegationManagerStorage contract.
type DelegationManagerStorageDepositScalingFactorUpdated struct {
	Staker                  common.Address
	Strategy                common.Address
	NewDepositScalingFactor *big.Int
	Raw                     types.Log // Blockchain specific contextual infos
}
⋮----
Raw                     types.Log // Blockchain specific contextual infos
⋮----
// FilterDepositScalingFactorUpdated is a free log retrieval operation binding the contract event 0x8be932bac54561f27260f95463d9b8ab37e06b2842e5ee2404157cc13df6eb8f.
⋮----
// Solidity: event DepositScalingFactorUpdated(address staker, address strategy, uint256 newDepositScalingFactor)
func (_DelegationManagerStorage *DelegationManagerStorageFilterer) FilterDepositScalingFactorUpdated(opts *bind.FilterOpts) (*DelegationManagerStorageDepositScalingFactorUpdatedIterator, error)
⋮----
// WatchDepositScalingFactorUpdated is a free log subscription operation binding the contract event 0x8be932bac54561f27260f95463d9b8ab37e06b2842e5ee2404157cc13df6eb8f.
⋮----
func (_DelegationManagerStorage *DelegationManagerStorageFilterer) WatchDepositScalingFactorUpdated(opts *bind.WatchOpts, sink chan<- *DelegationManagerStorageDepositScalingFactorUpdated) (event.Subscription, error)
⋮----
// ParseDepositScalingFactorUpdated is a log parse operation binding the contract event 0x8be932bac54561f27260f95463d9b8ab37e06b2842e5ee2404157cc13df6eb8f.
⋮----
func (_DelegationManagerStorage *DelegationManagerStorageFilterer) ParseDepositScalingFactorUpdated(log types.Log) (*DelegationManagerStorageDepositScalingFactorUpdated, error)
⋮----
// DelegationManagerStorageOperatorMetadataURIUpdatedIterator is returned from FilterOperatorMetadataURIUpdated and is used to iterate over the raw logs and unpacked data for OperatorMetadataURIUpdated events raised by the DelegationManagerStorage contract.
type DelegationManagerStorageOperatorMetadataURIUpdatedIterator struct {
	Event *DelegationManagerStorageOperatorMetadataURIUpdated // 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
}
⋮----
Event *DelegationManagerStorageOperatorMetadataURIUpdated // Event containing the contract specifics and raw log
⋮----
// DelegationManagerStorageOperatorMetadataURIUpdated represents a OperatorMetadataURIUpdated event raised by the DelegationManagerStorage contract.
type DelegationManagerStorageOperatorMetadataURIUpdated struct {
	Operator    common.Address
	MetadataURI string
	Raw         types.Log // Blockchain specific contextual infos
}
⋮----
Raw         types.Log // Blockchain specific contextual infos
⋮----
// FilterOperatorMetadataURIUpdated is a free log retrieval operation binding the contract event 0x02a919ed0e2acad1dd90f17ef2fa4ae5462ee1339170034a8531cca4b6708090.
⋮----
// Solidity: event OperatorMetadataURIUpdated(address indexed operator, string metadataURI)
func (_DelegationManagerStorage *DelegationManagerStorageFilterer) FilterOperatorMetadataURIUpdated(opts *bind.FilterOpts, operator []common.Address) (*DelegationManagerStorageOperatorMetadataURIUpdatedIterator, error)
⋮----
// WatchOperatorMetadataURIUpdated is a free log subscription operation binding the contract event 0x02a919ed0e2acad1dd90f17ef2fa4ae5462ee1339170034a8531cca4b6708090.
⋮----
func (_DelegationManagerStorage *DelegationManagerStorageFilterer) WatchOperatorMetadataURIUpdated(opts *bind.WatchOpts, sink chan<- *DelegationManagerStorageOperatorMetadataURIUpdated, operator []common.Address) (event.Subscription, error)
⋮----
// ParseOperatorMetadataURIUpdated is a log parse operation binding the contract event 0x02a919ed0e2acad1dd90f17ef2fa4ae5462ee1339170034a8531cca4b6708090.
⋮----
func (_DelegationManagerStorage *DelegationManagerStorageFilterer) ParseOperatorMetadataURIUpdated(log types.Log) (*DelegationManagerStorageOperatorMetadataURIUpdated, error)
⋮----
// DelegationManagerStorageOperatorRegisteredIterator is returned from FilterOperatorRegistered and is used to iterate over the raw logs and unpacked data for OperatorRegistered events raised by the DelegationManagerStorage contract.
type DelegationManagerStorageOperatorRegisteredIterator struct {
	Event *DelegationManagerStorageOperatorRegistered // 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
}
⋮----
Event *DelegationManagerStorageOperatorRegistered // Event containing the contract specifics and raw log
⋮----
// DelegationManagerStorageOperatorRegistered represents a OperatorRegistered event raised by the DelegationManagerStorage contract.
type DelegationManagerStorageOperatorRegistered struct {
	Operator           common.Address
	DelegationApprover common.Address
	Raw                types.Log // Blockchain specific contextual infos
}
⋮----
Raw                types.Log // Blockchain specific contextual infos
⋮----
// FilterOperatorRegistered is a free log retrieval operation binding the contract event 0xa453db612af59e5521d6ab9284dc3e2d06af286eb1b1b7b771fce4716c19f2c1.
⋮----
// Solidity: event OperatorRegistered(address indexed operator, address delegationApprover)
func (_DelegationManagerStorage *DelegationManagerStorageFilterer) FilterOperatorRegistered(opts *bind.FilterOpts, operator []common.Address) (*DelegationManagerStorageOperatorRegisteredIterator, error)
⋮----
// WatchOperatorRegistered is a free log subscription operation binding the contract event 0xa453db612af59e5521d6ab9284dc3e2d06af286eb1b1b7b771fce4716c19f2c1.
⋮----
func (_DelegationManagerStorage *DelegationManagerStorageFilterer) WatchOperatorRegistered(opts *bind.WatchOpts, sink chan<- *DelegationManagerStorageOperatorRegistered, operator []common.Address) (event.Subscription, error)
⋮----
// ParseOperatorRegistered is a log parse operation binding the contract event 0xa453db612af59e5521d6ab9284dc3e2d06af286eb1b1b7b771fce4716c19f2c1.
⋮----
func (_DelegationManagerStorage *DelegationManagerStorageFilterer) ParseOperatorRegistered(log types.Log) (*DelegationManagerStorageOperatorRegistered, error)
⋮----
// DelegationManagerStorageOperatorSharesDecreasedIterator is returned from FilterOperatorSharesDecreased and is used to iterate over the raw logs and unpacked data for OperatorSharesDecreased events raised by the DelegationManagerStorage contract.
type DelegationManagerStorageOperatorSharesDecreasedIterator struct {
	Event *DelegationManagerStorageOperatorSharesDecreased // 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
}
⋮----
Event *DelegationManagerStorageOperatorSharesDecreased // Event containing the contract specifics and raw log
⋮----
// DelegationManagerStorageOperatorSharesDecreased represents a OperatorSharesDecreased event raised by the DelegationManagerStorage contract.
type DelegationManagerStorageOperatorSharesDecreased struct {
	Operator common.Address
	Staker   common.Address
	Strategy common.Address
	Shares   *big.Int
	Raw      types.Log // Blockchain specific contextual infos
}
⋮----
Raw      types.Log // Blockchain specific contextual infos
⋮----
// FilterOperatorSharesDecreased is a free log retrieval operation binding the contract event 0x6909600037b75d7b4733aedd815442b5ec018a827751c832aaff64eba5d6d2dd.
⋮----
// Solidity: event OperatorSharesDecreased(address indexed operator, address staker, address strategy, uint256 shares)
func (_DelegationManagerStorage *DelegationManagerStorageFilterer) FilterOperatorSharesDecreased(opts *bind.FilterOpts, operator []common.Address) (*DelegationManagerStorageOperatorSharesDecreasedIterator, error)
⋮----
// WatchOperatorSharesDecreased is a free log subscription operation binding the contract event 0x6909600037b75d7b4733aedd815442b5ec018a827751c832aaff64eba5d6d2dd.
⋮----
func (_DelegationManagerStorage *DelegationManagerStorageFilterer) WatchOperatorSharesDecreased(opts *bind.WatchOpts, sink chan<- *DelegationManagerStorageOperatorSharesDecreased, operator []common.Address) (event.Subscription, error)
⋮----
// ParseOperatorSharesDecreased is a log parse operation binding the contract event 0x6909600037b75d7b4733aedd815442b5ec018a827751c832aaff64eba5d6d2dd.
⋮----
func (_DelegationManagerStorage *DelegationManagerStorageFilterer) ParseOperatorSharesDecreased(log types.Log) (*DelegationManagerStorageOperatorSharesDecreased, error)
⋮----
// DelegationManagerStorageOperatorSharesIncreasedIterator is returned from FilterOperatorSharesIncreased and is used to iterate over the raw logs and unpacked data for OperatorSharesIncreased events raised by the DelegationManagerStorage contract.
type DelegationManagerStorageOperatorSharesIncreasedIterator struct {
	Event *DelegationManagerStorageOperatorSharesIncreased // 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
}
⋮----
Event *DelegationManagerStorageOperatorSharesIncreased // Event containing the contract specifics and raw log
⋮----
// DelegationManagerStorageOperatorSharesIncreased represents a OperatorSharesIncreased event raised by the DelegationManagerStorage contract.
type DelegationManagerStorageOperatorSharesIncreased struct {
	Operator common.Address
	Staker   common.Address
	Strategy common.Address
	Shares   *big.Int
	Raw      types.Log // Blockchain specific contextual infos
}
⋮----
// FilterOperatorSharesIncreased is a free log retrieval operation binding the contract event 0x1ec042c965e2edd7107b51188ee0f383e22e76179041ab3a9d18ff151405166c.
⋮----
// Solidity: event OperatorSharesIncreased(address indexed operator, address staker, address strategy, uint256 shares)
func (_DelegationManagerStorage *DelegationManagerStorageFilterer) FilterOperatorSharesIncreased(opts *bind.FilterOpts, operator []common.Address) (*DelegationManagerStorageOperatorSharesIncreasedIterator, error)
⋮----
// WatchOperatorSharesIncreased is a free log subscription operation binding the contract event 0x1ec042c965e2edd7107b51188ee0f383e22e76179041ab3a9d18ff151405166c.
⋮----
func (_DelegationManagerStorage *DelegationManagerStorageFilterer) WatchOperatorSharesIncreased(opts *bind.WatchOpts, sink chan<- *DelegationManagerStorageOperatorSharesIncreased, operator []common.Address) (event.Subscription, error)
⋮----
// ParseOperatorSharesIncreased is a log parse operation binding the contract event 0x1ec042c965e2edd7107b51188ee0f383e22e76179041ab3a9d18ff151405166c.
⋮----
func (_DelegationManagerStorage *DelegationManagerStorageFilterer) ParseOperatorSharesIncreased(log types.Log) (*DelegationManagerStorageOperatorSharesIncreased, error)
⋮----
// DelegationManagerStorageOperatorSharesSlashedIterator is returned from FilterOperatorSharesSlashed and is used to iterate over the raw logs and unpacked data for OperatorSharesSlashed events raised by the DelegationManagerStorage contract.
type DelegationManagerStorageOperatorSharesSlashedIterator struct {
	Event *DelegationManagerStorageOperatorSharesSlashed // Event containing the contract specifics and raw log

	contract *bind.BoundContract // Generic contract to use for unpacking event data
	event    string              // Event name to use for unpacking event data

	logs chan types.Log        // Log channel receiving the found contract events
	sub  ethereum.Subscription // Subscription for errors, completion and termination
	done bool                  // Whether the subscription completed delivering logs
	fail error                 // Occurred error to stop iteration
}
⋮----
Event *DelegationManagerStorageOperatorSharesSlashed // Event containing the contract specifics and raw log
⋮----
// DelegationManagerStorageOperatorSharesSlashed represents a OperatorSharesSlashed event raised by the DelegationManagerStorage contract.
type DelegationManagerStorageOperatorSharesSlashed struct {
	Operator           common.Address
	Strategy           common.Address
	TotalSlashedShares *big.Int
	Raw                types.Log // Blockchain specific contextual infos
}
⋮----
// FilterOperatorSharesSlashed is a free log retrieval operation binding the contract event 0xdd611f4ef63f4385f1756c86ce1f1f389a9013ba6fa07daba8528291bc2d3c30.
⋮----
// Solidity: event OperatorSharesSlashed(address indexed operator, address strategy, uint256 totalSlashedShares)
func (_DelegationManagerStorage *DelegationManagerStorageFilterer) FilterOperatorSharesSlashed(opts *bind.FilterOpts, operator []common.Address) (*DelegationManagerStorageOperatorSharesSlashedIterator, error)
⋮----
// WatchOperatorSharesSlashed is a free log subscription operation binding the contract event 0xdd611f4ef63f4385f1756c86ce1f1f389a9013ba6fa07daba8528291bc2d3c30.
⋮----
func (_DelegationManagerStorage *DelegationManagerStorageFilterer) WatchOperatorSharesSlashed(opts *bind.WatchOpts, sink chan<- *DelegationManagerStorageOperatorSharesSlashed, operator []common.Address) (event.Subscription, error)
⋮----
// ParseOperatorSharesSlashed is a log parse operation binding the contract event 0xdd611f4ef63f4385f1756c86ce1f1f389a9013ba6fa07daba8528291bc2d3c30.
⋮----
func (_DelegationManagerStorage *DelegationManagerStorageFilterer) ParseOperatorSharesSlashed(log types.Log) (*DelegationManagerStorageOperatorSharesSlashed, error)
⋮----
// DelegationManagerStorageSlashingWithdrawalCompletedIterator is returned from FilterSlashingWithdrawalCompleted and is used to iterate over the raw logs and unpacked data for SlashingWithdrawalCompleted events raised by the DelegationManagerStorage contract.
type DelegationManagerStorageSlashingWithdrawalCompletedIterator struct {
	Event *DelegationManagerStorageSlashingWithdrawalCompleted // Event containing the contract specifics and raw log

	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
}
⋮----
Event *DelegationManagerStorageSlashingWithdrawalCompleted // Event containing the contract specifics and raw log
⋮----
// DelegationManagerStorageSlashingWithdrawalCompleted represents a SlashingWithdrawalCompleted event raised by the DelegationManagerStorage contract.
type DelegationManagerStorageSlashingWithdrawalCompleted struct {
	WithdrawalRoot [32]byte
	Raw            types.Log // Blockchain specific contextual infos
}
⋮----
Raw            types.Log // Blockchain specific contextual infos
⋮----
// FilterSlashingWithdrawalCompleted is a free log retrieval operation binding the contract event 0x1f40400889274ed07b24845e5054a87a0cab969eb1277aafe61ae352e7c32a00.
⋮----
// Solidity: event SlashingWithdrawalCompleted(bytes32 withdrawalRoot)
func (_DelegationManagerStorage *DelegationManagerStorageFilterer) FilterSlashingWithdrawalCompleted(opts *bind.FilterOpts) (*DelegationManagerStorageSlashingWithdrawalCompletedIterator, error)
⋮----
// WatchSlashingWithdrawalCompleted is a free log subscription operation binding the contract event 0x1f40400889274ed07b24845e5054a87a0cab969eb1277aafe61ae352e7c32a00.
⋮----
func (_DelegationManagerStorage *DelegationManagerStorageFilterer) WatchSlashingWithdrawalCompleted(opts *bind.WatchOpts, sink chan<- *DelegationManagerStorageSlashingWithdrawalCompleted) (event.Subscription, error)
⋮----
// ParseSlashingWithdrawalCompleted is a log parse operation binding the contract event 0x1f40400889274ed07b24845e5054a87a0cab969eb1277aafe61ae352e7c32a00.
⋮----
func (_DelegationManagerStorage *DelegationManagerStorageFilterer) ParseSlashingWithdrawalCompleted(log types.Log) (*DelegationManagerStorageSlashingWithdrawalCompleted, error)
⋮----
// DelegationManagerStorageSlashingWithdrawalQueuedIterator is returned from FilterSlashingWithdrawalQueued and is used to iterate over the raw logs and unpacked data for SlashingWithdrawalQueued events raised by the DelegationManagerStorage contract.
type DelegationManagerStorageSlashingWithdrawalQueuedIterator struct {
	Event *DelegationManagerStorageSlashingWithdrawalQueued // 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
}
⋮----
Event *DelegationManagerStorageSlashingWithdrawalQueued // Event containing the contract specifics and raw log
⋮----
// DelegationManagerStorageSlashingWithdrawalQueued represents a SlashingWithdrawalQueued event raised by the DelegationManagerStorage contract.
type DelegationManagerStorageSlashingWithdrawalQueued struct {
	WithdrawalRoot   [32]byte
	Withdrawal       IDelegationManagerTypesWithdrawal
	SharesToWithdraw []*big.Int
	Raw              types.Log // Blockchain specific contextual infos
}
⋮----
Raw              types.Log // Blockchain specific contextual infos
⋮----
// FilterSlashingWithdrawalQueued is a free log retrieval operation binding the contract event 0x26b2aae26516e8719ef50ea2f6831a2efbd4e37dccdf0f6936b27bc08e793e30.
⋮----
// Solidity: event SlashingWithdrawalQueued(bytes32 withdrawalRoot, (address,address,address,uint256,uint32,address[],uint256[]) withdrawal, uint256[] sharesToWithdraw)
func (_DelegationManagerStorage *DelegationManagerStorageFilterer) FilterSlashingWithdrawalQueued(opts *bind.FilterOpts) (*DelegationManagerStorageSlashingWithdrawalQueuedIterator, error)
⋮----
// WatchSlashingWithdrawalQueued is a free log subscription operation binding the contract event 0x26b2aae26516e8719ef50ea2f6831a2efbd4e37dccdf0f6936b27bc08e793e30.
⋮----
func (_DelegationManagerStorage *DelegationManagerStorageFilterer) WatchSlashingWithdrawalQueued(opts *bind.WatchOpts, sink chan<- *DelegationManagerStorageSlashingWithdrawalQueued) (event.Subscription, error)
⋮----
// ParseSlashingWithdrawalQueued is a log parse operation binding the contract event 0x26b2aae26516e8719ef50ea2f6831a2efbd4e37dccdf0f6936b27bc08e793e30.
⋮----
func (_DelegationManagerStorage *DelegationManagerStorageFilterer) ParseSlashingWithdrawalQueued(log types.Log) (*DelegationManagerStorageSlashingWithdrawalQueued, error)
⋮----
// DelegationManagerStorageStakerDelegatedIterator is returned from FilterStakerDelegated and is used to iterate over the raw logs and unpacked data for StakerDelegated events raised by the DelegationManagerStorage contract.
type DelegationManagerStorageStakerDelegatedIterator struct {
	Event *DelegationManagerStorageStakerDelegated // 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
}
⋮----
Event *DelegationManagerStorageStakerDelegated // Event containing the contract specifics and raw log
⋮----
// DelegationManagerStorageStakerDelegated represents a StakerDelegated event raised by the DelegationManagerStorage contract.
type DelegationManagerStorageStakerDelegated struct {
	Staker   common.Address
	Operator common.Address
	Raw      types.Log // Blockchain specific contextual infos
}
⋮----
// FilterStakerDelegated is a free log retrieval operation binding the contract event 0xc3ee9f2e5fda98e8066a1f745b2df9285f416fe98cf2559cd21484b3d8743304.
⋮----
// Solidity: event StakerDelegated(address indexed staker, address indexed operator)
func (_DelegationManagerStorage *DelegationManagerStorageFilterer) FilterStakerDelegated(opts *bind.FilterOpts, staker []common.Address, operator []common.Address) (*DelegationManagerStorageStakerDelegatedIterator, error)
⋮----
var stakerRule []interface{}
⋮----
// WatchStakerDelegated is a free log subscription operation binding the contract event 0xc3ee9f2e5fda98e8066a1f745b2df9285f416fe98cf2559cd21484b3d8743304.
⋮----
func (_DelegationManagerStorage *DelegationManagerStorageFilterer) WatchStakerDelegated(opts *bind.WatchOpts, sink chan<- *DelegationManagerStorageStakerDelegated, staker []common.Address, operator []common.Address) (event.Subscription, error)
⋮----
// ParseStakerDelegated is a log parse operation binding the contract event 0xc3ee9f2e5fda98e8066a1f745b2df9285f416fe98cf2559cd21484b3d8743304.
⋮----
func (_DelegationManagerStorage *DelegationManagerStorageFilterer) ParseStakerDelegated(log types.Log) (*DelegationManagerStorageStakerDelegated, error)
⋮----
// DelegationManagerStorageStakerForceUndelegatedIterator is returned from FilterStakerForceUndelegated and is used to iterate over the raw logs and unpacked data for StakerForceUndelegated events raised by the DelegationManagerStorage contract.
type DelegationManagerStorageStakerForceUndelegatedIterator struct {
	Event *DelegationManagerStorageStakerForceUndelegated // 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
}
⋮----
Event *DelegationManagerStorageStakerForceUndelegated // Event containing the contract specifics and raw log
⋮----
// DelegationManagerStorageStakerForceUndelegated represents a StakerForceUndelegated event raised by the DelegationManagerStorage contract.
type DelegationManagerStorageStakerForceUndelegated struct {
	Staker   common.Address
	Operator common.Address
	Raw      types.Log // Blockchain specific contextual infos
}
⋮----
// FilterStakerForceUndelegated is a free log retrieval operation binding the contract event 0xf0eddf07e6ea14f388b47e1e94a0f464ecbd9eed4171130e0fc0e99fb4030a8a.
⋮----
// Solidity: event StakerForceUndelegated(address indexed staker, address indexed operator)
func (_DelegationManagerStorage *DelegationManagerStorageFilterer) FilterStakerForceUndelegated(opts *bind.FilterOpts, staker []common.Address, operator []common.Address) (*DelegationManagerStorageStakerForceUndelegatedIterator, error)
⋮----
// WatchStakerForceUndelegated is a free log subscription operation binding the contract event 0xf0eddf07e6ea14f388b47e1e94a0f464ecbd9eed4171130e0fc0e99fb4030a8a.
⋮----
func (_DelegationManagerStorage *DelegationManagerStorageFilterer) WatchStakerForceUndelegated(opts *bind.WatchOpts, sink chan<- *DelegationManagerStorageStakerForceUndelegated, staker []common.Address, operator []common.Address) (event.Subscription, error)
⋮----
// ParseStakerForceUndelegated is a log parse operation binding the contract event 0xf0eddf07e6ea14f388b47e1e94a0f464ecbd9eed4171130e0fc0e99fb4030a8a.
⋮----
func (_DelegationManagerStorage *DelegationManagerStorageFilterer) ParseStakerForceUndelegated(log types.Log) (*DelegationManagerStorageStakerForceUndelegated, error)
⋮----
// DelegationManagerStorageStakerUndelegatedIterator is returned from FilterStakerUndelegated and is used to iterate over the raw logs and unpacked data for StakerUndelegated events raised by the DelegationManagerStorage contract.
type DelegationManagerStorageStakerUndelegatedIterator struct {
	Event *DelegationManagerStorageStakerUndelegated // 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
}
⋮----
Event *DelegationManagerStorageStakerUndelegated // Event containing the contract specifics and raw log
⋮----
// DelegationManagerStorageStakerUndelegated represents a StakerUndelegated event raised by the DelegationManagerStorage contract.
type DelegationManagerStorageStakerUndelegated struct {
	Staker   common.Address
	Operator common.Address
	Raw      types.Log // Blockchain specific contextual infos
}
⋮----
// FilterStakerUndelegated is a free log retrieval operation binding the contract event 0xfee30966a256b71e14bc0ebfc94315e28ef4a97a7131a9e2b7a310a73af44676.
⋮----
// Solidity: event StakerUndelegated(address indexed staker, address indexed operator)
func (_DelegationManagerStorage *DelegationManagerStorageFilterer) FilterStakerUndelegated(opts *bind.FilterOpts, staker []common.Address, operator []common.Address) (*DelegationManagerStorageStakerUndelegatedIterator, error)
⋮----
// WatchStakerUndelegated is a free log subscription operation binding the contract event 0xfee30966a256b71e14bc0ebfc94315e28ef4a97a7131a9e2b7a310a73af44676.
⋮----
func (_DelegationManagerStorage *DelegationManagerStorageFilterer) WatchStakerUndelegated(opts *bind.WatchOpts, sink chan<- *DelegationManagerStorageStakerUndelegated, staker []common.Address, operator []common.Address) (event.Subscription, error)
⋮----
// ParseStakerUndelegated is a log parse operation binding the contract event 0xfee30966a256b71e14bc0ebfc94315e28ef4a97a7131a9e2b7a310a73af44676.
⋮----
func (_DelegationManagerStorage *DelegationManagerStorageFilterer) ParseStakerUndelegated(log types.Log) (*DelegationManagerStorageStakerUndelegated, error)
````

## File: pkg/bindings/Deprecated_OwnableUpgradeable/binding.go
````go
// Code generated - DO NOT EDIT.
// This file is a generated binding and any manual changes will be lost.
⋮----
package Deprecated_OwnableUpgradeable
⋮----
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"
)
⋮----
"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
)
⋮----
// DeprecatedOwnableUpgradeableMetaData contains all meta data concerning the DeprecatedOwnableUpgradeable contract.
var DeprecatedOwnableUpgradeableMetaData = &bind.MetaData{
	ABI: "[{\"type\":\"event\",\"name\":\"Initialized\",\"inputs\":[{\"name\":\"version\",\"type\":\"uint8\",\"indexed\":false,\"internalType\":\"uint8\"}],\"anonymous\":false}]",
}
⋮----
// DeprecatedOwnableUpgradeableABI is the input ABI used to generate the binding from.
// Deprecated: Use DeprecatedOwnableUpgradeableMetaData.ABI instead.
var DeprecatedOwnableUpgradeableABI = DeprecatedOwnableUpgradeableMetaData.ABI
⋮----
// DeprecatedOwnableUpgradeable is an auto generated Go binding around an Ethereum contract.
type DeprecatedOwnableUpgradeable struct {
	DeprecatedOwnableUpgradeableCaller     // Read-only binding to the contract
	DeprecatedOwnableUpgradeableTransactor // Write-only binding to the contract
	DeprecatedOwnableUpgradeableFilterer   // Log filterer for contract events
}
⋮----
DeprecatedOwnableUpgradeableCaller     // Read-only binding to the contract
DeprecatedOwnableUpgradeableTransactor // Write-only binding to the contract
DeprecatedOwnableUpgradeableFilterer   // Log filterer for contract events
⋮----
// DeprecatedOwnableUpgradeableCaller is an auto generated read-only Go binding around an Ethereum contract.
type DeprecatedOwnableUpgradeableCaller struct {
	contract *bind.BoundContract // Generic contract wrapper for the low level calls
}
⋮----
contract *bind.BoundContract // Generic contract wrapper for the low level calls
⋮----
// DeprecatedOwnableUpgradeableTransactor is an auto generated write-only Go binding around an Ethereum contract.
type DeprecatedOwnableUpgradeableTransactor struct {
	contract *bind.BoundContract // Generic contract wrapper for the low level calls
}
⋮----
// DeprecatedOwnableUpgradeableFilterer is an auto generated log filtering Go binding around an Ethereum contract events.
type DeprecatedOwnableUpgradeableFilterer struct {
	contract *bind.BoundContract // Generic contract wrapper for the low level calls
}
⋮----
// DeprecatedOwnableUpgradeableSession is an auto generated Go binding around an Ethereum contract,
// with pre-set call and transact options.
type DeprecatedOwnableUpgradeableSession struct {
	Contract     *DeprecatedOwnableUpgradeable // 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
}
⋮----
Contract     *DeprecatedOwnableUpgradeable // 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
⋮----
// DeprecatedOwnableUpgradeableCallerSession is an auto generated read-only Go binding around an Ethereum contract,
// with pre-set call options.
type DeprecatedOwnableUpgradeableCallerSession struct {
	Contract *DeprecatedOwnableUpgradeableCaller // Generic contract caller binding to set the session for
	CallOpts bind.CallOpts                       // Call options to use throughout this session
}
⋮----
Contract *DeprecatedOwnableUpgradeableCaller // Generic contract caller binding to set the session for
CallOpts bind.CallOpts                       // Call options to use throughout this session
⋮----
// DeprecatedOwnableUpgradeableTransactorSession is an auto generated write-only Go binding around an Ethereum contract,
// with pre-set transact options.
type DeprecatedOwnableUpgradeableTransactorSession struct {
	Contract     *DeprecatedOwnableUpgradeableTransactor // Generic contract transactor binding to set the session for
	TransactOpts bind.TransactOpts                       // Transaction auth options to use throughout this session
}
⋮----
Contract     *DeprecatedOwnableUpgradeableTransactor // Generic contract transactor binding to set the session for
TransactOpts bind.TransactOpts                       // Transaction auth options to use throughout this session
⋮----
// DeprecatedOwnableUpgradeableRaw is an auto generated low-level Go binding around an Ethereum contract.
type DeprecatedOwnableUpgradeableRaw struct {
	Contract *DeprecatedOwnableUpgradeable // Generic contract binding to access the raw methods on
}
⋮----
Contract *DeprecatedOwnableUpgradeable // Generic contract binding to access the raw methods on
⋮----
// DeprecatedOwnableUpgradeableCallerRaw is an auto generated low-level read-only Go binding around an Ethereum contract.
type DeprecatedOwnableUpgradeableCallerRaw struct {
	Contract *DeprecatedOwnableUpgradeableCaller // Generic read-only contract binding to access the raw methods on
}
⋮----
Contract *DeprecatedOwnableUpgradeableCaller // Generic read-only contract binding to access the raw methods on
⋮----
// DeprecatedOwnableUpgradeableTransactorRaw is an auto generated low-level write-only Go binding around an Ethereum contract.
type DeprecatedOwnableUpgradeableTransactorRaw struct {
	Contract *DeprecatedOwnableUpgradeableTransactor // Generic write-only contract binding to access the raw methods on
}
⋮----
Contract *DeprecatedOwnableUpgradeableTransactor // Generic write-only contract binding to access the raw methods on
⋮----
// NewDeprecatedOwnableUpgradeable creates a new instance of DeprecatedOwnableUpgradeable, bound to a specific deployed contract.
func NewDeprecatedOwnableUpgradeable(address common.Address, backend bind.ContractBackend) (*DeprecatedOwnableUpgradeable, error)
⋮----
// NewDeprecatedOwnableUpgradeableCaller creates a new read-only instance of DeprecatedOwnableUpgradeable, bound to a specific deployed contract.
func NewDeprecatedOwnableUpgradeableCaller(address common.Address, caller bind.ContractCaller) (*DeprecatedOwnableUpgradeableCaller, error)
⋮----
// NewDeprecatedOwnableUpgradeableTransactor creates a new write-only instance of DeprecatedOwnableUpgradeable, bound to a specific deployed contract.
func NewDeprecatedOwnableUpgradeableTransactor(address common.Address, transactor bind.ContractTransactor) (*DeprecatedOwnableUpgradeableTransactor, error)
⋮----
// NewDeprecatedOwnableUpgradeableFilterer creates a new log filterer instance of DeprecatedOwnableUpgradeable, bound to a specific deployed contract.
func NewDeprecatedOwnableUpgradeableFilterer(address common.Address, filterer bind.ContractFilterer) (*DeprecatedOwnableUpgradeableFilterer, error)
⋮----
// bindDeprecatedOwnableUpgradeable binds a generic wrapper to an already deployed contract.
func bindDeprecatedOwnableUpgradeable(address common.Address, caller bind.ContractCaller, transactor bind.ContractTransactor, filterer bind.ContractFilterer) (*bind.BoundContract, error)
⋮----
// 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 (_DeprecatedOwnableUpgradeable *DeprecatedOwnableUpgradeableRaw) Call(opts *bind.CallOpts, result *[]interface
⋮----
// Transfer initiates a plain transaction to move funds to the contract, calling
// its default method if one is available.
func (_DeprecatedOwnableUpgradeable *DeprecatedOwnableUpgradeableRaw) Transfer(opts *bind.TransactOpts) (*types.Transaction, error)
⋮----
// Transact invokes the (paid) contract method with params as input values.
func (_DeprecatedOwnableUpgradeable *DeprecatedOwnableUpgradeableRaw) Transact(opts *bind.TransactOpts, method string, params ...interface
⋮----
// DeprecatedOwnableUpgradeableInitializedIterator is returned from FilterInitialized and is used to iterate over the raw logs and unpacked data for Initialized events raised by the DeprecatedOwnableUpgradeable contract.
type DeprecatedOwnableUpgradeableInitializedIterator struct {
	Event *DeprecatedOwnableUpgradeableInitialized // 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
}
⋮----
Event *DeprecatedOwnableUpgradeableInitialized // 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 *DeprecatedOwnableUpgradeableInitializedIterator) Next() bool
⋮----
// If the iterator failed, stop iterating
⋮----
// If the iterator completed, deliver directly whatever's available
⋮----
// Iterator still in progress, wait for either a data or an error event
⋮----
// Error returns any retrieval or parsing error occurred during filtering.
func (it *DeprecatedOwnableUpgradeableInitializedIterator) Error() error
⋮----
// Close terminates the iteration process, releasing any pending underlying
// resources.
func (it *DeprecatedOwnableUpgradeableInitializedIterator) Close() error
⋮----
// DeprecatedOwnableUpgradeableInitialized represents a Initialized event raised by the DeprecatedOwnableUpgradeable contract.
type DeprecatedOwnableUpgradeableInitialized struct {
	Version uint8
	Raw     types.Log // Blockchain specific contextual infos
}
⋮----
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 (_DeprecatedOwnableUpgradeable *DeprecatedOwnableUpgradeableFilterer) FilterInitialized(opts *bind.FilterOpts) (*DeprecatedOwnableUpgradeableInitializedIterator, error)
⋮----
// WatchInitialized is a free log subscription operation binding the contract event 0x7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb3847402498.
⋮----
func (_DeprecatedOwnableUpgradeable *DeprecatedOwnableUpgradeableFilterer) WatchInitialized(opts *bind.WatchOpts, sink chan<- *DeprecatedOwnableUpgradeableInitialized) (event.Subscription, error)
⋮----
// New log arrived, parse the event and forward to the user
⋮----
// ParseInitialized is a log parse operation binding the contract event 0x7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb3847402498.
⋮----
func (_DeprecatedOwnableUpgradeable *DeprecatedOwnableUpgradeableFilterer) ParseInitialized(log types.Log) (*DeprecatedOwnableUpgradeableInitialized, error)
````

## File: pkg/bindings/DurationVaultStrategy/binding.go
````go
// 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"
)
⋮----
"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)
⋮----
// 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     // 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
}
⋮----
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
}
⋮----
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
}
⋮----
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
}
⋮----
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
}
⋮----
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
}
⋮----
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
}
⋮----
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)
⋮----
// 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)
⋮----
// 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)
⋮----
// 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)
⋮----
// 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)
⋮----
// 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
⋮----
// 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)
⋮----
// Transact invokes the (paid) contract method with params as input values.
func (_DurationVaultStrategy *DurationVaultStrategyRaw) Transact(opts *bind.TransactOpts, method string, params ...interface
⋮----
// 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{}
⋮----
// 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)
⋮----
// 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)
⋮----
// 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
⋮----
// 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
⋮----
// 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)
⋮----
// 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)
⋮----
// 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)
⋮----
// 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)
⋮----
// 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)
⋮----
// 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)
⋮----
// 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)
⋮----
// 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)
⋮----
// 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)
⋮----
// 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)
⋮----
// 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)
⋮----
// 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)
⋮----
// 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)
⋮----
// 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
⋮----
// 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)
⋮----
// 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)
⋮----
// 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)
⋮----
// 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)
⋮----
// 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)
⋮----
// 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)
⋮----
// 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)
⋮----
// 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)
⋮----
// 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)
⋮----
// 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)
⋮----
// 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)
⋮----
// 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)
⋮----
// 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)
⋮----
// 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)
⋮----
// 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)
⋮----
// 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)
⋮----
// 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)
⋮----
// 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)
⋮----
// 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)
⋮----
// 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)
⋮----
// 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)
⋮----
// 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)
⋮----
// 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)
⋮----
// 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)
⋮----
// 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)
⋮----
// 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)
⋮----
// 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)
⋮----
// 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)
⋮----
// 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)
⋮----
// 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)
⋮----
// 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)
⋮----
// 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)
⋮----
// 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)
⋮----
// 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)
⋮----
// 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)
⋮----
// 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)
⋮----
// 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)
⋮----
// 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)
⋮----
// 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
}
⋮----
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 the iterator completed, deliver directly whatever's available
⋮----
// Iterator still in progress, wait for either a data or an error event
⋮----
// Error returns any retrieval or parsing error occurred during filtering.
func (it *DurationVaultStrategyDeallocateAttemptedIterator) Error() error
⋮----
// Close terminates the iteration process, releasing any pending underlying
// resources.
func (it *DurationVaultStrategyDeallocateAttemptedIterator) Close() error
⋮----
// DurationVaultStrategyDeallocateAttempted represents a DeallocateAttempted event raised by the DurationVaultStrategy contract.
type DurationVaultStrategyDeallocateAttempted struct {
	Success bool
	Raw     types.Log // Blockchain specific contextual infos
}
⋮----
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)
⋮----
// WatchDeallocateAttempted is a free log subscription operation binding the contract event 0x72f957da7daaea6b52e4ff7820cb464206fd51e9f502f3027f45b5017caf4c8b.
⋮----
func (_DurationVaultStrategy *DurationVaultStrategyFilterer) WatchDeallocateAttempted(opts *bind.WatchOpts, sink chan<- *DurationVaultStrategyDeallocateAttempted) (event.Subscription, error)
⋮----
// New log arrived, parse the event and forward to the user
⋮----
// ParseDeallocateAttempted is a log parse operation binding the contract event 0x72f957da7daaea6b52e4ff7820cb464206fd51e9f502f3027f45b5017caf4c8b.
⋮----
func (_DurationVaultStrategy *DurationVaultStrategyFilterer) ParseDeallocateAttempted(log types.Log) (*DurationVaultStrategyDeallocateAttempted, error)
⋮----
// 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
}
⋮----
Event *DurationVaultStrategyDeregisterAttempted // Event containing the contract specifics and raw log
⋮----
// 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)
⋮----
// WatchDeregisterAttempted is a free log subscription operation binding the contract event 0xd0791dbc9180cb64588d7eb7658a1022dcf734b8825eb7eec68bd9516872d168.
⋮----
func (_DurationVaultStrategy *DurationVaultStrategyFilterer) WatchDeregisterAttempted(opts *bind.WatchOpts, sink chan<- *DurationVaultStrategyDeregisterAttempted) (event.Subscription, error)
⋮----
// ParseDeregisterAttempted is a log parse operation binding the contract event 0xd0791dbc9180cb64588d7eb7658a1022dcf734b8825eb7eec68bd9516872d168.
⋮----
func (_DurationVaultStrategy *DurationVaultStrategyFilterer) ParseDeregisterAttempted(log types.Log) (*DurationVaultStrategyDeregisterAttempted, error)
⋮----
// 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
}
⋮----
Event *DurationVaultStrategyExchangeRateEmitted // Event containing the contract specifics and raw log
⋮----
// DurationVaultStrategyExchangeRateEmitted represents a ExchangeRateEmitted event raised by the DurationVaultStrategy contract.
type DurationVaultStrategyExchangeRateEmitted struct {
	Rate *big.Int
	Raw  types.Log // Blockchain specific contextual infos
}
⋮----
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)
⋮----
// WatchExchangeRateEmitted is a free log subscription operation binding the contract event 0xd2494f3479e5da49d386657c292c610b5b01df313d07c62eb0cfa49924a31be8.
⋮----
func (_DurationVaultStrategy *DurationVaultStrategyFilterer) WatchExchangeRateEmitted(opts *bind.WatchOpts, sink chan<- *DurationVaultStrategyExchangeRateEmitted) (event.Subscription, error)
⋮----
// ParseExchangeRateEmitted is a log parse operation binding the contract event 0xd2494f3479e5da49d386657c292c610b5b01df313d07c62eb0cfa49924a31be8.
⋮----
func (_DurationVaultStrategy *DurationVaultStrategyFilterer) ParseExchangeRateEmitted(log types.Log) (*DurationVaultStrategyExchangeRateEmitted, error)
⋮----
// 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
}
⋮----
Event *DurationVaultStrategyInitialized // Event containing the contract specifics and raw log
⋮----
// 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)
⋮----
// WatchInitialized is a free log subscription operation binding the contract event 0x7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb3847402498.
⋮----
func (_DurationVaultStrategy *DurationVaultStrategyFilterer) WatchInitialized(opts *bind.WatchOpts, sink chan<- *DurationVaultStrategyInitialized) (event.Subscription, error)
⋮----
// ParseInitialized is a log parse operation binding the contract event 0x7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb3847402498.
⋮----
func (_DurationVaultStrategy *DurationVaultStrategyFilterer) ParseInitialized(log types.Log) (*DurationVaultStrategyInitialized, error)
⋮----
// 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
}
⋮----
Event *DurationVaultStrategyMaxPerDepositUpdated // Event containing the contract specifics and raw log
⋮----
// 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
}
⋮----
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)
⋮----
// WatchMaxPerDepositUpdated is a free log subscription operation binding the contract event 0xf97ed4e083acac67830025ecbc756d8fe847cdbdca4cee3fe1e128e98b54ecb5.
⋮----
func (_DurationVaultStrategy *DurationVaultStrategyFilterer) WatchMaxPerDepositUpdated(opts *bind.WatchOpts, sink chan<- *DurationVaultStrategyMaxPerDepositUpdated) (event.Subscription, error)
⋮----
// ParseMaxPerDepositUpdated is a log parse operation binding the contract event 0xf97ed4e083acac67830025ecbc756d8fe847cdbdca4cee3fe1e128e98b54ecb5.
⋮----
func (_DurationVaultStrategy *DurationVaultStrategyFilterer) ParseMaxPerDepositUpdated(log types.Log) (*DurationVaultStrategyMaxPerDepositUpdated, error)
⋮----
// 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
}
⋮----
Event *DurationVaultStrategyMaxTotalDepositsUpdated // Event containing the contract specifics and raw log
⋮----
// 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)
⋮----
// WatchMaxTotalDepositsUpdated is a free log subscription operation binding the contract event 0x6ab181e0440bfbf4bacdf2e99674735ce6638005490688c5f994f5399353e452.
⋮----
func (_DurationVaultStrategy *DurationVaultStrategyFilterer) WatchMaxTotalDepositsUpdated(opts *bind.WatchOpts, sink chan<- *DurationVaultStrategyMaxTotalDepositsUpdated) (event.Subscription, error)
⋮----
// ParseMaxTotalDepositsUpdated is a log parse operation binding the contract event 0x6ab181e0440bfbf4bacdf2e99674735ce6638005490688c5f994f5399353e452.
⋮----
func (_DurationVaultStrategy *DurationVaultStrategyFilterer) ParseMaxTotalDepositsUpdated(log types.Log) (*DurationVaultStrategyMaxTotalDepositsUpdated, error)
⋮----
// 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
}
⋮----
Event *DurationVaultStrategyMetadataURIUpdated // Event containing the contract specifics and raw log
⋮----
// DurationVaultStrategyMetadataURIUpdated represents a MetadataURIUpdated event raised by the DurationVaultStrategy contract.
type DurationVaultStrategyMetadataURIUpdated struct {
	NewMetadataURI string
	Raw            types.Log // Blockchain specific contextual infos
}
⋮----
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)
⋮----
// WatchMetadataURIUpdated is a free log subscription operation binding the contract event 0xefafb90526da1636e1335eac0151301742fb755d986954c613b90e891778ba39.
⋮----
func (_DurationVaultStrategy *DurationVaultStrategyFilterer) WatchMetadataURIUpdated(opts *bind.WatchOpts, sink chan<- *DurationVaultStrategyMetadataURIUpdated) (event.Subscription, error)
⋮----
// ParseMetadataURIUpdated is a log parse operation binding the contract event 0xefafb90526da1636e1335eac0151301742fb755d986954c613b90e891778ba39.
⋮----
func (_DurationVaultStrategy *DurationVaultStrategyFilterer) ParseMetadataURIUpdated(log types.Log) (*DurationVaultStrategyMetadataURIUpdated, error)
⋮----
// 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
}
⋮----
Event *DurationVaultStrategyPaused // Event containing the contract specifics and raw log
⋮----
// 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
}
⋮----
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{}
⋮----
// WatchPaused is a free log subscription operation binding the contract event 0xab40a374bc51de372200a8bc981af8c9ecdc08dfdaef0bb6e09f88f3c616ef3d.
⋮----
func (_DurationVaultStrategy *DurationVaultStrategyFilterer) WatchPaused(opts *bind.WatchOpts, sink chan<- *DurationVaultStrategyPaused, account []common.Address) (event.Subscription, error)
⋮----
// ParsePaused is a log parse operation binding the contract event 0xab40a374bc51de372200a8bc981af8c9ecdc08dfdaef0bb6e09f88f3c616ef3d.
⋮----
func (_DurationVaultStrategy *DurationVaultStrategyFilterer) ParsePaused(log types.Log) (*DurationVaultStrategyPaused, error)
⋮----
// 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
}
⋮----
Event *DurationVaultStrategyStrategyTokenSet // Event containing the contract specifics and raw log
⋮----
// 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
}
⋮----
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)
⋮----
// WatchStrategyTokenSet is a free log subscription operation binding the contract event 0x1c540707b00eb5427b6b774fc799d756516a54aee108b64b327acc55af557507.
⋮----
func (_DurationVaultStrategy *DurationVaultStrategyFilterer) WatchStrategyTokenSet(opts *bind.WatchOpts, sink chan<- *DurationVaultStrategyStrategyTokenSet) (event.Subscription, error)
⋮----
// ParseStrategyTokenSet is a log parse operation binding the contract event 0x1c540707b00eb5427b6b774fc799d756516a54aee108b64b327acc55af557507.
⋮----
func (_DurationVaultStrategy *DurationVaultStrategyFilterer) ParseStrategyTokenSet(log types.Log) (*DurationVaultStrategyStrategyTokenSet, error)
⋮----
// 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
}
⋮----
Event *DurationVaultStrategyUnpaused // Event containing the contract specifics and raw log
⋮----
// 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)
⋮----
// WatchUnpaused is a free log subscription operation binding the contract event 0x3582d1828e26bf56bd801502bc021ac0bc8afb57c826e4986b45593c8fad389c.
⋮----
func (_DurationVaultStrategy *DurationVaultStrategyFilterer) WatchUnpaused(opts *bind.WatchOpts, sink chan<- *DurationVaultStrategyUnpaused, account []common.Address) (event.Subscription, error)
⋮----
// ParseUnpaused is a log parse operation binding the contract event 0x3582d1828e26bf56bd801502bc021ac0bc8afb57c826e4986b45593c8fad389c.
⋮----
func (_DurationVaultStrategy *DurationVaultStrategyFilterer) ParseUnpaused(log types.Log) (*DurationVaultStrategyUnpaused, error)
⋮----
// 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
}
⋮----
Event *DurationVaultStrategyVaultAdvancedToWithdrawals // Event containing the contract specifics and raw log
⋮----
// 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
}
⋮----
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{}
⋮----
// WatchVaultAdvancedToWithdrawals is a free log subscription operation binding the contract event 0x96c49d03ef64591194500229a104cd087b2d45c68234c96444c3a2a6abb0bb97.
⋮----
func (_DurationVaultStrategy *DurationVaultStrategyFilterer) WatchVaultAdvancedToWithdrawals(opts *bind.WatchOpts, sink chan<- *DurationVaultStrategyVaultAdvancedToWithdrawals, arbitrator []common.Address) (event.Subscription, error)
⋮----
// ParseVaultAdvancedToWithdrawals is a log parse operation binding the contract event 0x96c49d03ef64591194500229a104cd087b2d45c68234c96444c3a2a6abb0bb97.
⋮----
func (_DurationVaultStrategy *DurationVaultStrategyFilterer) ParseVaultAdvancedToWithdrawals(log types.Log) (*DurationVaultStrategyVaultAdvancedToWithdrawals, error)
⋮----
// 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
}
⋮----
Event *DurationVaultStrategyVaultInitialized // Event containing the contract specifics and raw log
⋮----
// 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{}
⋮----
var underlyingTokenRule []interface{}
⋮----
// WatchVaultInitialized is a free log subscription operation binding the contract event 0xbdbff63632f473bb2a7c6a4aafbc096b71fbda12e22c6b51643bfd64f13d2b9e.
⋮----
func (_DurationVaultStrategy *DurationVaultStrategyFilterer) WatchVaultInitialized(opts *bind.WatchOpts, sink chan<- *DurationVaultStrategyVaultInitialized, vaultAdmin []common.Address, arbitrator []common.Address, underlyingToken []common.Address) (event.Subscription, error)
⋮----
// ParseVaultInitialized is a log parse operation binding the contract event 0xbdbff63632f473bb2a7c6a4aafbc096b71fbda12e22c6b51643bfd64f13d2b9e.
⋮----
func (_DurationVaultStrategy *DurationVaultStrategyFilterer) ParseVaultInitialized(log types.Log) (*DurationVaultStrategyVaultInitialized, error)
⋮----
// 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
}
⋮----
Event *DurationVaultStrategyVaultLocked // Event containing the contract specifics and raw log
⋮----
// 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)
⋮----
// WatchVaultLocked is a free log subscription operation binding the contract event 0x42cd6d7338516695d9c9ff8969dbdcf89ce22e3f2f76fda2fc11e973fe4860e4.
⋮----
func (_DurationVaultStrategy *DurationVaultStrategyFilterer) WatchVaultLocked(opts *bind.WatchOpts, sink chan<- *DurationVaultStrategyVaultLocked) (event.Subscription, error)
⋮----
// ParseVaultLocked is a log parse operation binding the contract event 0x42cd6d7338516695d9c9ff8969dbdcf89ce22e3f2f76fda2fc11e973fe4860e4.
⋮----
func (_DurationVaultStrategy *DurationVaultStrategyFilterer) ParseVaultLocked(log types.Log) (*DurationVaultStrategyVaultLocked, error)
⋮----
// 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
}
⋮----
Event *DurationVaultStrategyVaultMatured // Event containing the contract specifics and raw log
⋮----
// DurationVaultStrategyVaultMatured represents a VaultMatured event raised by the DurationVaultStrategy contract.
type DurationVaultStrategyVaultMatured struct {
	MaturedAt uint32
	Raw       types.Log // Blockchain specific contextual infos
}
⋮----
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)
⋮----
// WatchVaultMatured is a free log subscription operation binding the contract event 0xff979382d3040b1602e0a02f0f2a454b2250aa36e891d2da0ceb95d70d11a8f2.
⋮----
func (_DurationVaultStrategy *DurationVaultStrategyFilterer) WatchVaultMatured(opts *bind.WatchOpts, sink chan<- *DurationVaultStrategyVaultMatured) (event.Subscription, error)
⋮----
// ParseVaultMatured is a log parse operation binding the contract event 0xff979382d3040b1602e0a02f0f2a454b2250aa36e891d2da0ceb95d70d11a8f2.
⋮----
func (_DurationVaultStrategy *DurationVaultStrategyFilterer) ParseVaultMatured(log types.Log) (*DurationVaultStrategyVaultMatured, error)
````

## File: pkg/bindings/DurationVaultStrategyStorage/binding.go
````go
// 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"
)
⋮----
"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     // 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
}
⋮----
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
}
⋮----
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
}
⋮----
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
}
⋮----
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
}
⋮----
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
}
⋮----
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
}
⋮----
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)
⋮----
// 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)
⋮----
// 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)
⋮----
// 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)
⋮----
// 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)
⋮----
// 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
⋮----
// 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)
⋮----
// Transact invokes the (paid) contract method with params as input values.
func (_DurationVaultStrategyStorage *DurationVaultStrategyStorageRaw) Transact(opts *bind.TransactOpts, method string, params ...interface
⋮----
// 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{}
⋮----
// 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)
⋮----
// 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)
⋮----
// 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)
⋮----
// 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)
⋮----
// 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)
⋮----
// 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)
⋮----
// 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)
⋮----
// 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)
⋮----
// 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)
⋮----
// 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)
⋮----
// 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)
⋮----
// 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)
⋮----
// 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)
⋮----
// 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)
⋮----
// 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
⋮----
// 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)
⋮----
// 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)
⋮----
// 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)
⋮----
// 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)
⋮----
// 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)
⋮----
// 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)
⋮----
// 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)
⋮----
// 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)
⋮----
// 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)
⋮----
// 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)
⋮----
// 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)
⋮----
// 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)
⋮----
// 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)
⋮----
// 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)
⋮----
// 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)
⋮----
// 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)
⋮----
// 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)
⋮----
// 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)
⋮----
// 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)
⋮----
// 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)
⋮----
// 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)
⋮----
// 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)
⋮----
// 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)
⋮----
// 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)
⋮----
// 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)
⋮----
// 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)
⋮----
// 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)
⋮----
// 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)
⋮----
// 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)
⋮----
// 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
}
⋮----
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 the iterator completed, deliver directly whatever's available
⋮----
// Iterator still in progress, wait for either a data or an error event
⋮----
// Error returns any retrieval or parsing error occurred during filtering.
func (it *DurationVaultStrategyStorageDeallocateAttemptedIterator) Error() error
⋮----
// Close terminates the iteration process, releasing any pending underlying
// resources.
func (it *DurationVaultStrategyStorageDeallocateAttemptedIterator) Close() error
⋮----
// DurationVaultStrategyStorageDeallocateAttempted represents a DeallocateAttempted event raised by the DurationVaultStrategyStorage contract.
type DurationVaultStrategyStorageDeallocateAttempted struct {
	Success bool
	Raw     types.Log // Blockchain specific contextual infos
}
⋮----
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)
⋮----
// WatchDeallocateAttempted is a free log subscription operation binding the contract event 0x72f957da7daaea6b52e4ff7820cb464206fd51e9f502f3027f45b5017caf4c8b.
⋮----
func (_DurationVaultStrategyStorage *DurationVaultStrategyStorageFilterer) WatchDeallocateAttempted(opts *bind.WatchOpts, sink chan<- *DurationVaultStrategyStorageDeallocateAttempted) (event.Subscription, error)
⋮----
// New log arrived, parse the event and forward to the user
⋮----
// ParseDeallocateAttempted is a log parse operation binding the contract event 0x72f957da7daaea6b52e4ff7820cb464206fd51e9f502f3027f45b5017caf4c8b.
⋮----
func (_DurationVaultStrategyStorage *DurationVaultStrategyStorageFilterer) ParseDeallocateAttempted(log types.Log) (*DurationVaultStrategyStorageDeallocateAttempted, error)
⋮----
// 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
}
⋮----
Event *DurationVaultStrategyStorageDeregisterAttempted // Event containing the contract specifics and raw log
⋮----
// 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)
⋮----
// WatchDeregisterAttempted is a free log subscription operation binding the contract event 0xd0791dbc9180cb64588d7eb7658a1022dcf734b8825eb7eec68bd9516872d168.
⋮----
func (_DurationVaultStrategyStorage *DurationVaultStrategyStorageFilterer) WatchDeregisterAttempted(opts *bind.WatchOpts, sink chan<- *DurationVaultStrategyStorageDeregisterAttempted) (event.Subscription, error)
⋮----
// ParseDeregisterAttempted is a log parse operation binding the contract event 0xd0791dbc9180cb64588d7eb7658a1022dcf734b8825eb7eec68bd9516872d168.
⋮----
func (_DurationVaultStrategyStorage *DurationVaultStrategyStorageFilterer) ParseDeregisterAttempted(log types.Log) (*DurationVaultStrategyStorageDeregisterAttempted, error)
⋮----
// 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
}
⋮----
Event *DurationVaultStrategyStorageExchangeRateEmitted // Event containing the contract specifics and raw log
⋮----
// DurationVaultStrategyStorageExchangeRateEmitted represents a ExchangeRateEmitted event raised by the DurationVaultStrategyStorage contract.
type DurationVaultStrategyStorageExchangeRateEmitted struct {
	Rate *big.Int
	Raw  types.Log // Blockchain specific contextual infos
}
⋮----
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)
⋮----
// WatchExchangeRateEmitted is a free log subscription operation binding the contract event 0xd2494f3479e5da49d386657c292c610b5b01df313d07c62eb0cfa49924a31be8.
⋮----
func (_DurationVaultStrategyStorage *DurationVaultStrategyStorageFilterer) WatchExchangeRateEmitted(opts *bind.WatchOpts, sink chan<- *DurationVaultStrategyStorageExchangeRateEmitted) (event.Subscription, error)
⋮----
// ParseExchangeRateEmitted is a log parse operation binding the contract event 0xd2494f3479e5da49d386657c292c610b5b01df313d07c62eb0cfa49924a31be8.
⋮----
func (_DurationVaultStrategyStorage *DurationVaultStrategyStorageFilterer) ParseExchangeRateEmitted(log types.Log) (*DurationVaultStrategyStorageExchangeRateEmitted, error)
⋮----
// 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
}
⋮----
Event *DurationVaultStrategyStorageMaxPerDepositUpdated // Event containing the contract specifics and raw log
⋮----
// 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
}
⋮----
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)
⋮----
// WatchMaxPerDepositUpdated is a free log subscription operation binding the contract event 0xf97ed4e083acac67830025ecbc756d8fe847cdbdca4cee3fe1e128e98b54ecb5.
⋮----
func (_DurationVaultStrategyStorage *DurationVaultStrategyStorageFilterer) WatchMaxPerDepositUpdated(opts *bind.WatchOpts, sink chan<- *DurationVaultStrategyStorageMaxPerDepositUpdated) (event.Subscription, error)
⋮----
// ParseMaxPerDepositUpdated is a log parse operation binding the contract event 0xf97ed4e083acac67830025ecbc756d8fe847cdbdca4cee3fe1e128e98b54ecb5.
⋮----
func (_DurationVaultStrategyStorage *DurationVaultStrategyStorageFilterer) ParseMaxPerDepositUpdated(log types.Log) (*DurationVaultStrategyStorageMaxPerDepositUpdated, error)
⋮----
// 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
}
⋮----
Event *DurationVaultStrategyStorageMaxTotalDepositsUpdated // Event containing the contract specifics and raw log
⋮----
// 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)
⋮----
// WatchMaxTotalDepositsUpdated is a free log subscription operation binding the contract event 0x6ab181e0440bfbf4bacdf2e99674735ce6638005490688c5f994f5399353e452.
⋮----
func (_DurationVaultStrategyStorage *DurationVaultStrategyStorageFilterer) WatchMaxTotalDepositsUpdated(opts *bind.WatchOpts, sink chan<- *DurationVaultStrategyStorageMaxTotalDepositsUpdated) (event.Subscription, error)
⋮----
// ParseMaxTotalDepositsUpdated is a log parse operation binding the contract event 0x6ab181e0440bfbf4bacdf2e99674735ce6638005490688c5f994f5399353e452.
⋮----
func (_DurationVaultStrategyStorage *DurationVaultStrategyStorageFilterer) ParseMaxTotalDepositsUpdated(log types.Log) (*DurationVaultStrategyStorageMaxTotalDepositsUpdated, error)
⋮----
// 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
}
⋮----
Event *DurationVaultStrategyStorageMetadataURIUpdated // Event containing the contract specifics and raw log
⋮----
// DurationVaultStrategyStorageMetadataURIUpdated represents a MetadataURIUpdated event raised by the DurationVaultStrategyStorage contract.
type DurationVaultStrategyStorageMetadataURIUpdated struct {
	NewMetadataURI string
	Raw            types.Log // Blockchain specific contextual infos
}
⋮----
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)
⋮----
// WatchMetadataURIUpdated is a free log subscription operation binding the contract event 0xefafb90526da1636e1335eac0151301742fb755d986954c613b90e891778ba39.
⋮----
func (_DurationVaultStrategyStorage *DurationVaultStrategyStorageFilterer) WatchMetadataURIUpdated(opts *bind.WatchOpts, sink chan<- *DurationVaultStrategyStorageMetadataURIUpdated) (event.Subscription, error)
⋮----
// ParseMetadataURIUpdated is a log parse operation binding the contract event 0xefafb90526da1636e1335eac0151301742fb755d986954c613b90e891778ba39.
⋮----
func (_DurationVaultStrategyStorage *DurationVaultStrategyStorageFilterer) ParseMetadataURIUpdated(log types.Log) (*DurationVaultStrategyStorageMetadataURIUpdated, error)
⋮----
// 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
}
⋮----
Event *DurationVaultStrategyStorageStrategyTokenSet // Event containing the contract specifics and raw log
⋮----
// 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
}
⋮----
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)
⋮----
// WatchStrategyTokenSet is a free log subscription operation binding the contract event 0x1c540707b00eb5427b6b774fc799d756516a54aee108b64b327acc55af557507.
⋮----
func (_DurationVaultStrategyStorage *DurationVaultStrategyStorageFilterer) WatchStrategyTokenSet(opts *bind.WatchOpts, sink chan<- *DurationVaultStrategyStorageStrategyTokenSet) (event.Subscription, error)
⋮----
// ParseStrategyTokenSet is a log parse operation binding the contract event 0x1c540707b00eb5427b6b774fc799d756516a54aee108b64b327acc55af557507.
⋮----
func (_DurationVaultStrategyStorage *DurationVaultStrategyStorageFilterer) ParseStrategyTokenSet(log types.Log) (*DurationVaultStrategyStorageStrategyTokenSet, error)
⋮----
// 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
}
⋮----
Event *DurationVaultStrategyStorageVaultAdvancedToWithdrawals // Event containing the contract specifics and raw log
⋮----
// 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
}
⋮----
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{}
⋮----
// WatchVaultAdvancedToWithdrawals is a free log subscription operation binding the contract event 0x96c49d03ef64591194500229a104cd087b2d45c68234c96444c3a2a6abb0bb97.
⋮----
func (_DurationVaultStrategyStorage *DurationVaultStrategyStorageFilterer) WatchVaultAdvancedToWithdrawals(opts *bind.WatchOpts, sink chan<- *DurationVaultStrategyStorageVaultAdvancedToWithdrawals, arbitrator []common.Address) (event.Subscription, error)
⋮----
// ParseVaultAdvancedToWithdrawals is a log parse operation binding the contract event 0x96c49d03ef64591194500229a104cd087b2d45c68234c96444c3a2a6abb0bb97.
⋮----
func (_DurationVaultStrategyStorage *DurationVaultStrategyStorageFilterer) ParseVaultAdvancedToWithdrawals(log types.Log) (*DurationVaultStrategyStorageVaultAdvancedToWithdrawals, error)
⋮----
// 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
}
⋮----
Event *DurationVaultStrategyStorageVaultInitialized // Event containing the contract specifics and raw log
⋮----
// 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
}
⋮----
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{}
⋮----
var underlyingTokenRule []interface{}
⋮----
// WatchVaultInitialized is a free log subscription operation binding the contract event 0xbdbff63632f473bb2a7c6a4aafbc096b71fbda12e22c6b51643bfd64f13d2b9e.
⋮----
func (_DurationVaultStrategyStorage *DurationVaultStrategyStorageFilterer) WatchVaultInitialized(opts *bind.WatchOpts, sink chan<- *DurationVaultStrategyStorageVaultInitialized, vaultAdmin []common.Address, arbitrator []common.Address, underlyingToken []common.Address) (event.Subscription, error)
⋮----
// ParseVaultInitialized is a log parse operation binding the contract event 0xbdbff63632f473bb2a7c6a4aafbc096b71fbda12e22c6b51643bfd64f13d2b9e.
⋮----
func (_DurationVaultStrategyStorage *DurationVaultStrategyStorageFilterer) ParseVaultInitialized(log types.Log) (*DurationVaultStrategyStorageVaultInitialized, error)
⋮----
// 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
}
⋮----
Event *DurationVaultStrategyStorageVaultLocked // Event containing the contract specifics and raw log
⋮----
// 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)
⋮----
// WatchVaultLocked is a free log subscription operation binding the contract event 0x42cd6d7338516695d9c9ff8969dbdcf89ce22e3f2f76fda2fc11e973fe4860e4.
⋮----
func (_DurationVaultStrategyStorage *DurationVaultStrategyStorageFilterer) WatchVaultLocked(opts *bind.WatchOpts, sink chan<- *DurationVaultStrategyStorageVaultLocked) (event.Subscription, error)
⋮----
// ParseVaultLocked is a log parse operation binding the contract event 0x42cd6d7338516695d9c9ff8969dbdcf89ce22e3f2f76fda2fc11e973fe4860e4.
⋮----
func (_DurationVaultStrategyStorage *DurationVaultStrategyStorageFilterer) ParseVaultLocked(log types.Log) (*DurationVaultStrategyStorageVaultLocked, error)
⋮----
// 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
}
⋮----
Event *DurationVaultStrategyStorageVaultMatured // Event containing the contract specifics and raw log
⋮----
// DurationVaultStrategyStorageVaultMatured represents a VaultMatured event raised by the DurationVaultStrategyStorage contract.
type DurationVaultStrategyStorageVaultMatured struct {
	MaturedAt uint32
	Raw       types.Log // Blockchain specific contextual infos
}
⋮----
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)
⋮----
// WatchVaultMatured is a free log subscription operation binding the contract event 0xff979382d3040b1602e0a02f0f2a454b2250aa36e891d2da0ceb95d70d11a8f2.
⋮----
func (_DurationVaultStrategyStorage *DurationVaultStrategyStorageFilterer) WatchVaultMatured(opts *bind.WatchOpts, sink chan<- *DurationVaultStrategyStorageVaultMatured) (event.Subscription, error)
⋮----
// ParseVaultMatured is a log parse operation binding the contract event 0xff979382d3040b1602e0a02f0f2a454b2250aa36e891d2da0ceb95d70d11a8f2.
⋮----
func (_DurationVaultStrategyStorage *DurationVaultStrategyStorageFilterer) ParseVaultMatured(log types.Log) (*DurationVaultStrategyStorageVaultMatured, error)
````

## File: pkg/bindings/ECDSACertificateVerifier/binding.go
````go
// Code generated - DO NOT EDIT.
// This file is a generated binding and any manual changes will be lost.
⋮----
package ECDSACertificateVerifier
⋮----
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"
)
⋮----
"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
)
⋮----
// ICrossChainRegistryTypesOperatorSetConfig is an auto generated low-level Go binding around an user-defined struct.
type ICrossChainRegistryTypesOperatorSetConfig struct {
	Owner              common.Address
	MaxStalenessPeriod uint32
}
⋮----
// IECDSACertificateVerifierTypesECDSACertificate is an auto generated low-level Go binding around an user-defined struct.
type IECDSACertificateVerifierTypesECDSACertificate struct {
	ReferenceTimestamp uint32
	MessageHash        [32]byte
	Sig                []byte
}
⋮----
// IOperatorTableCalculatorTypesECDSAOperatorInfo is an auto generated low-level Go binding around an user-defined struct.
type IOperatorTableCalculatorTypesECDSAOperatorInfo struct {
	Pubkey  common.Address
	Weights []*big.Int
}
⋮----
// OperatorSet is an auto generated low-level Go binding around an user-defined struct.
type OperatorSet struct {
	Avs common.Address
	Id  uint32
}
⋮----
// ECDSACertificateVerifierMetaData contains all meta data concerning the ECDSACertificateVerifier contract.
var ECDSACertificateVerifierMetaData = &bind.MetaData{
	ABI: "[{\"type\":\"constructor\",\"inputs\":[{\"name\":\"_operatorTableUpdater\",\"type\":\"address\",\"internalType\":\"contractIOperatorTableUpdater\"},{\"name\":\"_version\",\"type\":\"string\",\"internalType\":\"string\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"calculateCertificateDigest\",\"inputs\":[{\"name\":\"referenceTimestamp\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"messageHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"calculateCertificateDigestBytes\",\"inputs\":[{\"name\":\"referenceTimestamp\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"messageHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"domainSeparator\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getOperatorCount\",\"inputs\":[{\"name\":\"operatorSet\",\"type\":\"tuple\",\"internalType\":\"structOperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]},{\"name\":\"referenceTimestamp\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getOperatorInfo\",\"inputs\":[{\"name\":\"operatorSet\",\"type\":\"tuple\",\"internalType\":\"structOperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]},{\"name\":\"referenceTimestamp\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"operatorIndex\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"tuple\",\"internalType\":\"structIOperatorTableCalculatorTypes.ECDSAOperatorInfo\",\"components\":[{\"name\":\"pubkey\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"weights\",\"type\":\"uint256[]\",\"internalType\":\"uint256[]\"}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getOperatorInfos\",\"inputs\":[{\"name\":\"operatorSet\",\"type\":\"tuple\",\"internalType\":\"structOperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]},{\"name\":\"referenceTimestamp\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"tuple[]\",\"internalType\":\"structIOperatorTableCalculatorTypes.ECDSAOperatorInfo[]\",\"components\":[{\"name\":\"pubkey\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"weights\",\"type\":\"uint256[]\",\"internalType\":\"uint256[]\"}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getOperatorSetOwner\",\"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\":\"getTotalStakeWeights\",\"inputs\":[{\"name\":\"operatorSet\",\"type\":\"tuple\",\"internalType\":\"structOperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]},{\"name\":\"referenceTimestamp\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256[]\",\"internalType\":\"uint256[]\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"isReferenceTimestampSet\",\"inputs\":[{\"name\":\"operatorSet\",\"type\":\"tuple\",\"internalType\":\"structOperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]},{\"name\":\"referenceTimestamp\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"latestReferenceTimestamp\",\"inputs\":[{\"name\":\"operatorSet\",\"type\":\"tuple\",\"internalType\":\"structOperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]}],\"outputs\":[{\"name\":\"\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"maxOperatorTableStaleness\",\"inputs\":[{\"name\":\"operatorSet\",\"type\":\"tuple\",\"internalType\":\"structOperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]}],\"outputs\":[{\"name\":\"\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"operatorTableUpdater\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIOperatorTableUpdater\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"updateOperatorTable\",\"inputs\":[{\"name\":\"operatorSet\",\"type\":\"tuple\",\"internalType\":\"structOperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]},{\"name\":\"referenceTimestamp\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"operatorInfos\",\"type\":\"tuple[]\",\"internalType\":\"structIOperatorTableCalculatorTypes.ECDSAOperatorInfo[]\",\"components\":[{\"name\":\"pubkey\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"weights\",\"type\":\"uint256[]\",\"internalType\":\"uint256[]\"}]},{\"name\":\"operatorSetConfig\",\"type\":\"tuple\",\"internalType\":\"structICrossChainRegistryTypes.OperatorSetConfig\",\"components\":[{\"name\":\"owner\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"maxStalenessPeriod\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"verifyCertificate\",\"inputs\":[{\"name\":\"operatorSet\",\"type\":\"tuple\",\"internalType\":\"structOperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]},{\"name\":\"cert\",\"type\":\"tuple\",\"internalType\":\"structIECDSACertificateVerifierTypes.ECDSACertificate\",\"components\":[{\"name\":\"referenceTimestamp\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"messageHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"sig\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256[]\",\"internalType\":\"uint256[]\"},{\"name\":\"\",\"type\":\"address[]\",\"internalType\":\"address[]\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"verifyCertificateNominal\",\"inputs\":[{\"name\":\"operatorSet\",\"type\":\"tuple\",\"internalType\":\"structOperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]},{\"name\":\"cert\",\"type\":\"tuple\",\"internalType\":\"structIECDSACertificateVerifierTypes.ECDSACertificate\",\"components\":[{\"name\":\"referenceTimestamp\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"messageHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"sig\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]},{\"name\":\"totalStakeNominalThresholds\",\"type\":\"uint256[]\",\"internalType\":\"uint256[]\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"\",\"type\":\"address[]\",\"internalType\":\"address[]\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"verifyCertificateProportion\",\"inputs\":[{\"name\":\"operatorSet\",\"type\":\"tuple\",\"internalType\":\"structOperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]},{\"name\":\"cert\",\"type\":\"tuple\",\"internalType\":\"structIECDSACertificateVerifierTypes.ECDSACertificate\",\"components\":[{\"name\":\"referenceTimestamp\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"messageHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"sig\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]},{\"name\":\"totalStakeProportionThresholds\",\"type\":\"uint16[]\",\"internalType\":\"uint16[]\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"\",\"type\":\"address[]\",\"internalType\":\"address[]\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"version\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"string\",\"internalType\":\"string\"}],\"stateMutability\":\"view\"},{\"type\":\"event\",\"name\":\"Initialized\",\"inputs\":[{\"name\":\"version\",\"type\":\"uint8\",\"indexed\":false,\"internalType\":\"uint8\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"MaxStalenessPeriodUpdated\",\"inputs\":[{\"name\":\"operatorSet\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structOperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]},{\"name\":\"maxStalenessPeriod\",\"type\":\"uint32\",\"indexed\":false,\"internalType\":\"uint32\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"OperatorSetOwnerUpdated\",\"inputs\":[{\"name\":\"operatorSet\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structOperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]},{\"name\":\"owner\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"TableUpdated\",\"inputs\":[{\"name\":\"operatorSet\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structOperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]},{\"name\":\"referenceTimestamp\",\"type\":\"uint32\",\"indexed\":false,\"internalType\":\"uint32\"},{\"name\":\"operatorInfos\",\"type\":\"tuple[]\",\"indexed\":false,\"internalType\":\"structIOperatorTableCalculatorTypes.ECDSAOperatorInfo[]\",\"components\":[{\"name\":\"pubkey\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"weights\",\"type\":\"uint256[]\",\"internalType\":\"uint256[]\"}]}],\"anonymous\":false},{\"type\":\"error\",\"name\":\"ArrayLengthMismatch\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"CertificateStale\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"IndexOutOfBounds\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidShortString\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidSignature\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidSignatureLength\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"OnlyTableUpdater\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"OperatorCountZero\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ReferenceTimestampDoesNotExist\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"RootDisabled\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"SignatureExpired\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"SignersNotOrdered\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"StringTooLong\",\"inputs\":[{\"name\":\"str\",\"type\":\"string\",\"internalType\":\"string\"}]},{\"type\":\"error\",\"name\":\"TableUpdateStale\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"VerificationFailed\",\"inputs\":[]}]",
	Bin: "0x60c060405234801561000f575f5ffd5b5060405161231938038061231983398101604081905261002e9161016d565b6001600160a01b03821660805280806100468161005b565b60a0525061005490506100a1565b5050610297565b5f5f829050601f8151111561008e578260405163305a27a960e01b8152600401610085919061023c565b60405180910390fd5b805161009982610271565b179392505050565b5f54610100900460ff16156101085760405162461bcd60e51b815260206004820152602760248201527f496e697469616c697a61626c653a20636f6e747261637420697320696e697469604482015266616c697a696e6760c81b6064820152608401610085565b5f5460ff90811614610157575f805460ff191660ff9081179091556040519081527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b565b634e487b7160e01b5f52604160045260245ffd5b5f5f6040838503121561017e575f5ffd5b82516001600160a01b0381168114610194575f5ffd5b60208401519092506001600160401b038111156101af575f5ffd5b8301601f810185136101bf575f5ffd5b80516001600160401b038111156101d8576101d8610159565b604051601f8201601f19908116603f011681016001600160401b038111828210171561020657610206610159565b60405281815282820160200187101561021d575f5ffd5b8160208401602083015e5f602083830101528093505050509250929050565b602081525f82518060208401528060208501604085015e5f604082850101526040601f19601f83011684010191505092915050565b80516020808301519190811015610291575f198160200360031b1b821691505b50919050565b60805160a05161204c6102cd5f395f8181610342015261104601525f81816101ad015281816103760152610ee4015261204c5ff3fe608060405234801561000f575f5ffd5b5060043610610106575f3560e01c80637c85ac4c1161009e578063be86e0b21161006e578063be86e0b21461026e578063c0da24201461028f578063cd83a72b146102a2578063e49613fc146102c5578063f698da25146102e5575f5ffd5b80637c85ac4c146101fa5780637d1d1f5b1461021a57806380c7d3f31461023a578063848189201461025b575f5ffd5b80635ddb9b5b116100d95780635ddb9b5b1461016d5780636141879e1461019557806368d6e081146101a8578063702ca531146101e7575f5ffd5b8063184674341461010a57806323c2a3cb1461013057806354fd4d501461014357806356d482f514610158575b5f5ffd5b61011d61011836600461161c565b6102ed565b6040519081526020015b60405180910390f35b61011d61013e3660046116fc565b610308565b61014b61033b565b604051610127919061175c565b61016b6101663660046117cb565b61036b565b005b61018061017b36600461183d565b610582565b60405163ffffffff9091168152602001610127565b6101806101a336600461183d565b6105a8565b6101cf7f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b039091168152602001610127565b61014b6101f536600461161c565b6105ce565b61020d6102083660046116fc565b610665565b60405161012791906118ac565b61022d61022836600461190f565b6107c3565b6040516101279190611964565b61024d610248366004611986565b610986565b604051610127929190611a0a565b6101cf61026936600461183d565b6109a4565b61028161027c366004611a37565b6109cd565b604051610127929190611b1d565b61028161029d366004611b3f565b610a6d565b6102b56102b03660046116fc565b610b6f565b6040519015158152602001610127565b6102d86102d3366004611bb5565b610ba5565b6040516101279190611bf0565b61011d610c9e565b5f6102f883836105ce565b8051906020012090505b92915050565b5f5f61031384610d5e565b5f90815260046020908152604080832063ffffffff8716845290915290205491505092915050565b60606103667f0000000000000000000000000000000000000000000000000000000000000000610dc1565b905090565b336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146103b45760405163030c1b6b60e11b815260040160405180910390fd5b5f6103cc6103c73688900388018861183d565b610d5e565b5f8181526003602052604090205490915063ffffffff9081169086161161040657604051632f20889f60e01b815260040160405180910390fd5b5f81815260046020908152604080832063ffffffff8916845290915281208490555b8381101561048e5784848281811061044257610442611c02565b90506020028101906104549190611c16565b5f83815260056020908152604080832063ffffffff8b168452825280832085845290915290206104848282611c5f565b5050600101610428565b505f818152600360209081526040909120805463ffffffff191663ffffffff88161790556104be90830183611d62565b5f8281526001602090815260409182902080546001600160a01b0319166001600160a01b0394909416939093179092556104fd91908401908401611d7d565b5f828152600260209081526040808320805463ffffffff191663ffffffff958616179055600682528083209389168352929052819020805460ff19166001179055517f4f588da9ec57976194a79b5594f8f8782923d93013df2b9ed12fe125805011ef90610572908890889088908890611d96565b60405180910390a1505050505050565b5f5f61058d83610d5e565b5f9081526003602052604090205463ffffffff169392505050565b5f5f6105b383610d5e565b5f9081526002602052604090205463ffffffff169392505050565b604080517fda346acb3ce99e7c5132bf8cafb159ad8085970ebfdba78007ef0fe163063d1460208083019190915263ffffffff85168284015260608083018590528351808403820181526080909301909352815191012061062d610c9e565b60405161190160f01b602082015260228101919091526042810182905260620160405160208183030381529060405291505092915050565b60605f61067184610d5e565b5f81815260046020908152604080832063ffffffff8089168552925282205492935082166001600160401b038111156106ac576106ac611644565b6040519080825280602002602001820160405280156106f157816020015b604080518082019091525f8152606060208201528152602001906001900390816106ca5790505b5090505f5b8263ffffffff168110156107b9575f84815260056020908152604080832063ffffffff8a16845282528083208484528252918290208251808401845281546001600160a01b031681526001820180548551818602810186019096528086529194929385810193929083018282801561078b57602002820191905f5260205f20905b815481526020019060010190808311610777575b5050505050815250508282815181106107a6576107a6611c02565b60209081029190910101526001016106f6565b5095945050505050565b60605f6107d86103c73686900386018661183d565b5f81815260046020908152604080832063ffffffff881684529091529020549091508061081857604051631029081560e21b815260040160405180910390fd5b5f82815260056020908152604080832063ffffffff88168452825280832083805290915281206001015490816001600160401b0381111561085b5761085b611644565b604051908082528060200260200182016040528015610884578160200160208202803683370190505b5090505f5b8381101561097b575f85815260056020908152604080832063ffffffff8b16845282528083208484528252808320600101805482518185028101850190935280835291929091908301828280156108fd57602002820191905f5260205f20905b8154815260200190600101908083116108e9575b509394505f93505050505b81518110801561091757508481105b156109715781818151811061092e5761092e611c02565b602002602001015184828151811061094857610948611c02565b6020026020010181815161095c9190611ec9565b9052508061096981611edc565b915050610908565b5050600101610889565b509695505050505050565b6060805f5f6109958686610dfe565b909450925050505b9250929050565b5f5f6109af83610d5e565b5f908152600160205260409020546001600160a01b03169392505050565b5f60605f5f6109dc8787610dfe565b915091508451825114610a025760405163512509d360e11b815260040160405180910390fd5b5f5b8251811015610a5c57858181518110610a1f57610a1f611c02565b6020026020010151838281518110610a3957610a39611c02565b60200260200101511015610a5457505f93509150610a659050565b600101610a04565b50600193509150505b935093915050565b5f60605f5f610a7c8888610dfe565b90925090505f610a938961022860208b018b611d7d565b83519091508614610ab75760405163512509d360e11b815260040160405180910390fd5b5f5b8351811015610b5b575f612710898984818110610ad857610ad8611c02565b9050602002016020810190610aed9190611ef4565b61ffff16848481518110610b0357610b03611c02565b6020026020010151610b159190611c48565b610b1f9190611f29565b905080858381518110610b3457610b34611c02565b60200260200101511015610b52575f84965096505050505050610b66565b50600101610ab9565b506001945090925050505b94509492505050565b5f5f610b7a84610d5e565b5f90815260066020908152604080832063ffffffff8716845290915290205460ff1691505092915050565b604080518082019091525f8152606060208201525f610bc385610d5e565b5f81815260046020908152604080832063ffffffff891684529091529020549091508310610c0457604051634e23d03560e01b815260040160405180910390fd5b5f81815260056020908152604080832063ffffffff8816845282528083208684528252918290208251808401845281546001600160a01b0316815260018201805485518186028101860190965280865291949293858101939290830182828015610c8b57602002820191905f5260205f20905b815481526020019060010190808311610c77575b5050505050815250509150509392505050565b60408051808201909152600a81526922b4b3b2b72630bcb2b960b11b6020909101525f7f91ab3d17e3a50a9d89e63fd30b92be7f5336b03b287bb946787a83a9d62a27667f71b625cfad44bac63b13dba07f2e1d6084ee04b6f8752101ece6126d584ee6ea610d0b61103e565b8051602091820120604051610d43949392309101938452602084019290925260408301526001600160a01b0316606082015260800190565b60405160208183030381529060405280519060200120905090565b5f815f0151826020015163ffffffff16604051602001610da992919060609290921b6bffffffffffffffffffffffff1916825260a01b6001600160a01b031916601482015260200190565b60405160208183030381529060405261030290611f3c565b60605f610dcd836110b3565b6040805160208082528183019092529192505f91906020820181803683375050509182525060208101929092525090565b6060805f610e146103c73687900387018761183d565b5f8181526002602052604090205490915063ffffffff161580610e6a57505f8181526002602090815260409091205463ffffffff1690610e5690860186611d7d565b610e609190611f5f565b63ffffffff164211155b610e875760405163640fcd6b60e11b815260040160405180910390fd5b5f81815260066020908152604082209190610ea490870187611d7d565b63ffffffff16815260208101919091526040015f205460ff16610eda57604051630cad17b760e31b815260040160405180910390fd5b6001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000166364e1df84610f166020870187611d7d565b6040516001600160e01b031960e084901b16815263ffffffff919091166004820152602401602060405180830381865afa158015610f56573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610f7a9190611f7b565b610f9757604051631b14174b60e01b815260040160405180910390fd5b5f610fb2610fa86020870187611d7d565b86602001356102ed565b90505f610fff82610fc66040890189611f9a565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f920191909152506110da92505050565b90505f6110138861022860208a018a611d7d565b5190505f61102f8561102860208b018b611d7d565b85856112e1565b99929850919650505050505050565b60605f61106a7f0000000000000000000000000000000000000000000000000000000000000000610dc1565b9050805f8151811061107e5761107e611c02565b016020908101516040516001600160f81b03199091169181019190915260210160405160208183030381529060405291505090565b5f60ff8216601f81111561030257604051632cd44ac360e21b815260040160405180910390fd5b60605f82511180156110f75750604182516110f59190611fdc565b155b61111457604051634be6321b60e01b815260040160405180910390fd5b5f604183516111239190611f29565b9050806001600160401b0381111561113d5761113d611644565b604051908082528060200260200182016040528015611166578160200160208202803683370190505b5091505f5b818110156112d957604080516041808252608082019092525f916020820181803683370190505090505f5b60418110156112015785816111ac856041611c48565b6111b69190611ec9565b815181106111c6576111c6611c02565b602001015160f81c60f81b8282815181106111e3576111e3611c02565b60200101906001600160f81b03191690815f1a905350600101611196565b505f5f61120e888461150b565b90925090505f81600481111561122657611226611fef565b1461124457604051638baa579f60e01b815260040160405180910390fd5b831580611285575085611258600186612003565b8151811061126857611268611c02565b60200260200101516001600160a01b0316826001600160a01b0316115b6112a257604051630b550c5760e41b815260040160405180910390fd5b818685815181106112b5576112b5611c02565b6001600160a01b03929092166020928302919091019091015250505060010161116b565b505092915050565b5f84815260046020908152604080832063ffffffff87168452909152902054606090826001600160401b0381111561131b5761131b611644565b604051908082528060200260200182016040528015611344578160200160208202803683370190505b5091505f5b8451811015611501575f85828151811061136557611365611c02565b602002602001015190505f5f905061139860405180604001604052805f6001600160a01b03168152602001606081525090565b5f5b85811015611461575f8b815260056020908152604080832063ffffffff8e16845282528083208484528252918290208251808401845281546001600160a01b031681526001820180548551818602810186019096528086529194929385810193929083018282801561142957602002820191905f5260205f20905b815481526020019060010190808311611415575b5050505050815250509150836001600160a01b0316825f01516001600160a01b0316036114595760019250611461565b60010161139a565b50816114805760405163439cc0cd60e01b815260040160405180910390fd5b60208101515f5b81518110801561149657508881105b156114f0578181815181106114ad576114ad611c02565b60200260200101518882815181106114c7576114c7611c02565b602002602001018181516114db9190611ec9565b905250806114e881611edc565b915050611487565b505060019093019250611349915050565b5050949350505050565b5f5f825160410361153f576020830151604084015160608501515f1a6115338782858561154a565b9450945050505061099d565b505f9050600261099d565b5f807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a083111561157f57505f90506003610b66565b604080515f8082526020820180845289905260ff881692820192909252606081018690526080810185905260019060a0016020604051602081039080840390855afa1580156115d0573d5f5f3e3d5ffd5b5050604051601f1901519150506001600160a01b0381166115f8575f60019250925050610b66565b965f9650945050505050565b803563ffffffff81168114611617575f5ffd5b919050565b5f5f6040838503121561162d575f5ffd5b61163683611604565b946020939093013593505050565b634e487b7160e01b5f52604160045260245ffd5b604051601f8201601f191681016001600160401b038111828210171561168057611680611644565b604052919050565b6001600160a01b038116811461169c575f5ffd5b50565b5f604082840312156116af575f5ffd5b604080519081016001600160401b03811182821017156116d1576116d1611644565b60405290508082356116e281611688565b81526116f060208401611604565b60208201525092915050565b5f5f6060838503121561170d575f5ffd5b611717848461169f565b915061172560408401611604565b90509250929050565b5f81518084528060208401602086015e5f602082860101526020601f19601f83011685010191505092915050565b602081525f61176e602083018461172e565b9392505050565b5f60408284031215611785575f5ffd5b50919050565b5f5f83601f84011261179b575f5ffd5b5081356001600160401b038111156117b1575f5ffd5b6020830191508360208260051b850101111561099d575f5ffd5b5f5f5f5f5f60c086880312156117df575f5ffd5b6117e98787611775565b94506117f760408701611604565b935060608601356001600160401b03811115611811575f5ffd5b61181d8882890161178b565b909450925061183190508760808801611775565b90509295509295909350565b5f6040828403121561184d575f5ffd5b61176e838361169f565b80516001600160a01b03168252602080820151604082850181905281519085018190525f929190910190829060608601905b808310156107b95783518252602082019150602084019350600183019250611889565b5f602082016020835280845180835260408501915060408160051b8601019250602086015f5b8281101561190357603f198786030184526118ee858351611857565b945060209384019391909101906001016118d2565b50929695505050505050565b5f5f60608385031215611920575f5ffd5b6117178484611775565b5f8151808452602084019350602083015f5b8281101561195a57815186526020958601959091019060010161193c565b5093949350505050565b602081525f61176e602083018461192a565b5f60608284031215611785575f5ffd5b5f5f60608385031215611997575f5ffd5b6119a18484611775565b915060408301356001600160401b038111156119bb575f5ffd5b6119c785828601611976565b9150509250929050565b5f8151808452602084019350602083015f5b8281101561195a5781516001600160a01b03168652602095860195909101906001016119e3565b604081525f611a1c604083018561192a565b8281036020840152611a2e81856119d1565b95945050505050565b5f5f5f60808486031215611a49575f5ffd5b611a538585611775565b925060408401356001600160401b03811115611a6d575f5ffd5b611a7986828701611976565b92505060608401356001600160401b03811115611a94575f5ffd5b8401601f81018613611aa4575f5ffd5b80356001600160401b03811115611abd57611abd611644565b8060051b611acd60208201611658565b91825260208184018101929081019089841115611ae8575f5ffd5b6020850194505b83851015611b0e57843580835260209586019590935090910190611aef565b80955050505050509250925092565b8215158152604060208201525f611b3760408301846119d1565b949350505050565b5f5f5f5f60808587031215611b52575f5ffd5b611b5c8686611775565b935060408501356001600160401b03811115611b76575f5ffd5b611b8287828801611976565b93505060608501356001600160401b03811115611b9d575f5ffd5b611ba98782880161178b565b95989497509550505050565b5f5f5f60808486031215611bc7575f5ffd5b611bd1858561169f565b9250611bdf60408501611604565b929592945050506060919091013590565b602081525f61176e6020830184611857565b634e487b7160e01b5f52603260045260245ffd5b5f8235603e19833603018112611c2a575f5ffd5b9190910192915050565b634e487b7160e01b5f52601160045260245ffd5b808202811582820484141761030257610302611c34565b8135611c6a81611688565b81546001600160a01b0319166001600160a01b0391909116178155602082013536839003601e19018112611c9c575f5ffd5b820180356001600160401b03811115611cb3575f5ffd5b6020820191508060051b3603821315611cca575f5ffd5b600183016001600160401b03821115611ce557611ce5611644565b68010000000000000000821115611cfe57611cfe611644565b805482825580831015611d33575f828152602090208381019082015b80821015611d30575f8255600182019150611d1a565b50505b505f90815260208120905b82811015611d5a57833582820155602090930192600101611d3e565b505050505050565b5f60208284031215611d72575f5ffd5b813561176e81611688565b5f60208284031215611d8d575f5ffd5b61176e82611604565b5f608082018635611da681611688565b6001600160a01b0316835263ffffffff611dc260208901611604565b16602084015263ffffffff861660408401526080606084015283905260a0600584901b83018101908301855f603e1936839003015b87821015611eba57868503609f190184528235818112611e15575f5ffd5b89018035611e2281611688565b6001600160a01b03168652602081013536829003601e19018112611e44575f5ffd5b016020810190356001600160401b03811115611e5e575f5ffd5b8060051b803603831315611e70575f5ffd5b60406020890181905288018290526001600160fb1b03821115611e91575f5ffd5b808360608a01376060818901019750505050602083019250602084019350600182019150611df7565b50929998505050505050505050565b8082018082111561030257610302611c34565b5f60018201611eed57611eed611c34565b5060010190565b5f60208284031215611f04575f5ffd5b813561ffff8116811461176e575f5ffd5b634e487b7160e01b5f52601260045260245ffd5b5f82611f3757611f37611f15565b500490565b80516020808301519190811015611785575f1960209190910360031b1b16919050565b63ffffffff818116838216019081111561030257610302611c34565b5f60208284031215611f8b575f5ffd5b8151801515811461176e575f5ffd5b5f5f8335601e19843603018112611faf575f5ffd5b8301803591506001600160401b03821115611fc8575f5ffd5b60200191503681900382131561099d575f5ffd5b5f82611fea57611fea611f15565b500690565b634e487b7160e01b5f52602160045260245ffd5b8181038181111561030257610302611c3456fea2646970667358221220130a28b55cb8194abc8abd4e87fece54e43e26db1df665630e4335fa7d96e82864736f6c634300081e0033",
}
⋮----
// ECDSACertificateVerifierABI is the input ABI used to generate the binding from.
// Deprecated: Use ECDSACertificateVerifierMetaData.ABI instead.
var ECDSACertificateVerifierABI = ECDSACertificateVerifierMetaData.ABI
⋮----
// ECDSACertificateVerifierBin is the compiled bytecode used for deploying new contracts.
// Deprecated: Use ECDSACertificateVerifierMetaData.Bin instead.
var ECDSACertificateVerifierBin = ECDSACertificateVerifierMetaData.Bin
⋮----
// DeployECDSACertificateVerifier deploys a new Ethereum contract, binding an instance of ECDSACertificateVerifier to it.
func DeployECDSACertificateVerifier(auth *bind.TransactOpts, backend bind.ContractBackend, _operatorTableUpdater common.Address, _version string) (common.Address, *types.Transaction, *ECDSACertificateVerifier, error)
⋮----
// ECDSACertificateVerifier is an auto generated Go binding around an Ethereum contract.
type ECDSACertificateVerifier struct {
	ECDSACertificateVerifierCaller     // Read-only binding to the contract
	ECDSACertificateVerifierTransactor // Write-only binding to the contract
	ECDSACertificateVerifierFilterer   // Log filterer for contract events
}
⋮----
ECDSACertificateVerifierCaller     // Read-only binding to the contract
ECDSACertificateVerifierTransactor // Write-only binding to the contract
ECDSACertificateVerifierFilterer   // Log filterer for contract events
⋮----
// ECDSACertificateVerifierCaller is an auto generated read-only Go binding around an Ethereum contract.
type ECDSACertificateVerifierCaller struct {
	contract *bind.BoundContract // Generic contract wrapper for the low level calls
}
⋮----
contract *bind.BoundContract // Generic contract wrapper for the low level calls
⋮----
// ECDSACertificateVerifierTransactor is an auto generated write-only Go binding around an Ethereum contract.
type ECDSACertificateVerifierTransactor struct {
	contract *bind.BoundContract // Generic contract wrapper for the low level calls
}
⋮----
// ECDSACertificateVerifierFilterer is an auto generated log filtering Go binding around an Ethereum contract events.
type ECDSACertificateVerifierFilterer struct {
	contract *bind.BoundContract // Generic contract wrapper for the low level calls
}
⋮----
// ECDSACertificateVerifierSession is an auto generated Go binding around an Ethereum contract,
// with pre-set call and transact options.
type ECDSACertificateVerifierSession struct {
	Contract     *ECDSACertificateVerifier // 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
}
⋮----
Contract     *ECDSACertificateVerifier // 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
⋮----
// ECDSACertificateVerifierCallerSession is an auto generated read-only Go binding around an Ethereum contract,
// with pre-set call options.
type ECDSACertificateVerifierCallerSession struct {
	Contract *ECDSACertificateVerifierCaller // Generic contract caller binding to set the session for
	CallOpts bind.CallOpts                   // Call options to use throughout this session
}
⋮----
Contract *ECDSACertificateVerifierCaller // Generic contract caller binding to set the session for
CallOpts bind.CallOpts                   // Call options to use throughout this session
⋮----
// ECDSACertificateVerifierTransactorSession is an auto generated write-only Go binding around an Ethereum contract,
// with pre-set transact options.
type ECDSACertificateVerifierTransactorSession struct {
	Contract     *ECDSACertificateVerifierTransactor // Generic contract transactor binding to set the session for
	TransactOpts bind.TransactOpts                   // Transaction auth options to use throughout this session
}
⋮----
Contract     *ECDSACertificateVerifierTransactor // Generic contract transactor binding to set the session for
TransactOpts bind.TransactOpts                   // Transaction auth options to use throughout this session
⋮----
// ECDSACertificateVerifierRaw is an auto generated low-level Go binding around an Ethereum contract.
type ECDSACertificateVerifierRaw struct {
	Contract *ECDSACertificateVerifier // Generic contract binding to access the raw methods on
}
⋮----
Contract *ECDSACertificateVerifier // Generic contract binding to access the raw methods on
⋮----
// ECDSACertificateVerifierCallerRaw is an auto generated low-level read-only Go binding around an Ethereum contract.
type ECDSACertificateVerifierCallerRaw struct {
	Contract *ECDSACertificateVerifierCaller // Generic read-only contract binding to access the raw methods on
}
⋮----
Contract *ECDSACertificateVerifierCaller // Generic read-only contract binding to access the raw methods on
⋮----
// ECDSACertificateVerifierTransactorRaw is an auto generated low-level write-only Go binding around an Ethereum contract.
type ECDSACertificateVerifierTransactorRaw struct {
	Contract *ECDSACertificateVerifierTransactor // Generic write-only contract binding to access the raw methods on
}
⋮----
Contract *ECDSACertificateVerifierTransactor // Generic write-only contract binding to access the raw methods on
⋮----
// NewECDSACertificateVerifier creates a new instance of ECDSACertificateVerifier, bound to a specific deployed contract.
func NewECDSACertificateVerifier(address common.Address, backend bind.ContractBackend) (*ECDSACertificateVerifier, error)
⋮----
// NewECDSACertificateVerifierCaller creates a new read-only instance of ECDSACertificateVerifier, bound to a specific deployed contract.
func NewECDSACertificateVerifierCaller(address common.Address, caller bind.ContractCaller) (*ECDSACertificateVerifierCaller, error)
⋮----
// NewECDSACertificateVerifierTransactor creates a new write-only instance of ECDSACertificateVerifier, bound to a specific deployed contract.
func NewECDSACertificateVerifierTransactor(address common.Address, transactor bind.ContractTransactor) (*ECDSACertificateVerifierTransactor, error)
⋮----
// NewECDSACertificateVerifierFilterer creates a new log filterer instance of ECDSACertificateVerifier, bound to a specific deployed contract.
func NewECDSACertificateVerifierFilterer(address common.Address, filterer bind.ContractFilterer) (*ECDSACertificateVerifierFilterer, error)
⋮----
// bindECDSACertificateVerifier binds a generic wrapper to an already deployed contract.
func bindECDSACertificateVerifier(address common.Address, caller bind.ContractCaller, transactor bind.ContractTransactor, filterer bind.ContractFilterer) (*bind.BoundContract, error)
⋮----
// 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 (_ECDSACertificateVerifier *ECDSACertificateVerifierRaw) Call(opts *bind.CallOpts, result *[]interface
⋮----
// Transfer initiates a plain transaction to move funds to the contract, calling
// its default method if one is available.
func (_ECDSACertificateVerifier *ECDSACertificateVerifierRaw) Transfer(opts *bind.TransactOpts) (*types.Transaction, error)
⋮----
// Transact invokes the (paid) contract method with params as input values.
func (_ECDSACertificateVerifier *ECDSACertificateVerifierRaw) Transact(opts *bind.TransactOpts, method string, params ...interface
⋮----
// CalculateCertificateDigest is a free data retrieval call binding the contract method 0x18467434.
//
// Solidity: function calculateCertificateDigest(uint32 referenceTimestamp, bytes32 messageHash) view returns(bytes32)
func (_ECDSACertificateVerifier *ECDSACertificateVerifierCaller) CalculateCertificateDigest(opts *bind.CallOpts, referenceTimestamp uint32, messageHash [32]byte) ([32]byte, error)
⋮----
var out []interface{}
⋮----
// CalculateCertificateDigestBytes is a free data retrieval call binding the contract method 0x702ca531.
⋮----
// Solidity: function calculateCertificateDigestBytes(uint32 referenceTimestamp, bytes32 messageHash) view returns(bytes)
func (_ECDSACertificateVerifier *ECDSACertificateVerifierCaller) CalculateCertificateDigestBytes(opts *bind.CallOpts, referenceTimestamp uint32, messageHash [32]byte) ([]byte, error)
⋮----
// DomainSeparator is a free data retrieval call binding the contract method 0xf698da25.
⋮----
// Solidity: function domainSeparator() view returns(bytes32)
func (_ECDSACertificateVerifier *ECDSACertificateVerifierCaller) DomainSeparator(opts *bind.CallOpts) ([32]byte, error)
⋮----
// GetOperatorCount is a free data retrieval call binding the contract method 0x23c2a3cb.
⋮----
// Solidity: function getOperatorCount((address,uint32) operatorSet, uint32 referenceTimestamp) view returns(uint256)
func (_ECDSACertificateVerifier *ECDSACertificateVerifierCaller) GetOperatorCount(opts *bind.CallOpts, operatorSet OperatorSet, referenceTimestamp uint32) (*big.Int, error)
⋮----
// GetOperatorInfo is a free data retrieval call binding the contract method 0xe49613fc.
⋮----
// Solidity: function getOperatorInfo((address,uint32) operatorSet, uint32 referenceTimestamp, uint256 operatorIndex) view returns((address,uint256[]))
func (_ECDSACertificateVerifier *ECDSACertificateVerifierCaller) GetOperatorInfo(opts *bind.CallOpts, operatorSet OperatorSet, referenceTimestamp uint32, operatorIndex *big.Int) (IOperatorTableCalculatorTypesECDSAOperatorInfo, error)
⋮----
// GetOperatorInfos is a free data retrieval call binding the contract method 0x7c85ac4c.
⋮----
// Solidity: function getOperatorInfos((address,uint32) operatorSet, uint32 referenceTimestamp) view returns((address,uint256[])[])
func (_ECDSACertificateVerifier *ECDSACertificateVerifierCaller) GetOperatorInfos(opts *bind.CallOpts, operatorSet OperatorSet, referenceTimestamp uint32) ([]IOperatorTableCalculatorTypesECDSAOperatorInfo, error)
⋮----
// GetOperatorSetOwner is a free data retrieval call binding the contract method 0x84818920.
⋮----
// Solidity: function getOperatorSetOwner((address,uint32) operatorSet) view returns(address)
func (_ECDSACertificateVerifier *ECDSACertificateVerifierCaller) GetOperatorSetOwner(opts *bind.CallOpts, operatorSet OperatorSet) (common.Address, error)
⋮----
// GetTotalStakeWeights is a free data retrieval call binding the contract method 0x7d1d1f5b.
⋮----
// Solidity: function getTotalStakeWeights((address,uint32) operatorSet, uint32 referenceTimestamp) view returns(uint256[])
func (_ECDSACertificateVerifier *ECDSACertificateVerifierCaller) GetTotalStakeWeights(opts *bind.CallOpts, operatorSet OperatorSet, referenceTimestamp uint32) ([]*big.Int, error)
⋮----
// IsReferenceTimestampSet is a free data retrieval call binding the contract method 0xcd83a72b.
⋮----
// Solidity: function isReferenceTimestampSet((address,uint32) operatorSet, uint32 referenceTimestamp) view returns(bool)
func (_ECDSACertificateVerifier *ECDSACertificateVerifierCaller) IsReferenceTimestampSet(opts *bind.CallOpts, operatorSet OperatorSet, referenceTimestamp uint32) (bool, error)
⋮----
// LatestReferenceTimestamp is a free data retrieval call binding the contract method 0x5ddb9b5b.
⋮----
// Solidity: function latestReferenceTimestamp((address,uint32) operatorSet) view returns(uint32)
func (_ECDSACertificateVerifier *ECDSACertificateVerifierCaller) LatestReferenceTimestamp(opts *bind.CallOpts, operatorSet OperatorSet) (uint32, error)
⋮----
// MaxOperatorTableStaleness is a free data retrieval call binding the contract method 0x6141879e.
⋮----
// Solidity: function maxOperatorTableStaleness((address,uint32) operatorSet) view returns(uint32)
func (_ECDSACertificateVerifier *ECDSACertificateVerifierCaller) MaxOperatorTableStaleness(opts *bind.CallOpts, operatorSet OperatorSet) (uint32, error)
⋮----
// OperatorTableUpdater is a free data retrieval call binding the contract method 0x68d6e081.
⋮----
// Solidity: function operatorTableUpdater() view returns(address)
func (_ECDSACertificateVerifier *ECDSACertificateVerifierCaller) OperatorTableUpdater(opts *bind.CallOpts) (common.Address, error)
⋮----
// VerifyCertificate is a free data retrieval call binding the contract method 0x80c7d3f3.
⋮----
// Solidity: function verifyCertificate((address,uint32) operatorSet, (uint32,bytes32,bytes) cert) view returns(uint256[], address[])
func (_ECDSACertificateVerifier *ECDSACertificateVerifierCaller) VerifyCertificate(opts *bind.CallOpts, operatorSet OperatorSet, cert IECDSACertificateVerifierTypesECDSACertificate) ([]*big.Int, []common.Address, error)
⋮----
// VerifyCertificateNominal is a free data retrieval call binding the contract method 0xbe86e0b2.
⋮----
// Solidity: function verifyCertificateNominal((address,uint32) operatorSet, (uint32,bytes32,bytes) cert, uint256[] totalStakeNominalThresholds) view returns(bool, address[])
func (_ECDSACertificateVerifier *ECDSACertificateVerifierCaller) VerifyCertificateNominal(opts *bind.CallOpts, operatorSet OperatorSet, cert IECDSACertificateVerifierTypesECDSACertificate, totalStakeNominalThresholds []*big.Int) (bool, []common.Address, error)
⋮----
// VerifyCertificateProportion is a free data retrieval call binding the contract method 0xc0da2420.
⋮----
// Solidity: function verifyCertificateProportion((address,uint32) operatorSet, (uint32,bytes32,bytes) cert, uint16[] totalStakeProportionThresholds) view returns(bool, address[])
func (_ECDSACertificateVerifier *ECDSACertificateVerifierCaller) VerifyCertificateProportion(opts *bind.CallOpts, operatorSet OperatorSet, cert IECDSACertificateVerifierTypesECDSACertificate, totalStakeProportionThresholds []uint16) (bool, []common.Address, error)
⋮----
// Version is a free data retrieval call binding the contract method 0x54fd4d50.
⋮----
// Solidity: function version() view returns(string)
func (_ECDSACertificateVerifier *ECDSACertificateVerifierCaller) Version(opts *bind.CallOpts) (string, error)
⋮----
// UpdateOperatorTable is a paid mutator transaction binding the contract method 0x56d482f5.
⋮----
// Solidity: function updateOperatorTable((address,uint32) operatorSet, uint32 referenceTimestamp, (address,uint256[])[] operatorInfos, (address,uint32) operatorSetConfig) returns()
func (_ECDSACertificateVerifier *ECDSACertificateVerifierTransactor) UpdateOperatorTable(opts *bind.TransactOpts, operatorSet OperatorSet, referenceTimestamp uint32, operatorInfos []IOperatorTableCalculatorTypesECDSAOperatorInfo, operatorSetConfig ICrossChainRegistryTypesOperatorSetConfig) (*types.Transaction, error)
⋮----
// ECDSACertificateVerifierInitializedIterator is returned from FilterInitialized and is used to iterate over the raw logs and unpacked data for Initialized events raised by the ECDSACertificateVerifier contract.
type ECDSACertificateVerifierInitializedIterator struct {
	Event *ECDSACertificateVerifierInitialized // 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
}
⋮----
Event *ECDSACertificateVerifierInitialized // 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 *ECDSACertificateVerifierInitializedIterator) Next() bool
⋮----
// If the iterator failed, stop iterating
⋮----
// If the iterator completed, deliver directly whatever's available
⋮----
// Iterator still in progress, wait for either a data or an error event
⋮----
// Error returns any retrieval or parsing error occurred during filtering.
func (it *ECDSACertificateVerifierInitializedIterator) Error() error
⋮----
// Close terminates the iteration process, releasing any pending underlying
// resources.
func (it *ECDSACertificateVerifierInitializedIterator) Close() error
⋮----
// ECDSACertificateVerifierInitialized represents a Initialized event raised by the ECDSACertificateVerifier contract.
type ECDSACertificateVerifierInitialized struct {
	Version uint8
	Raw     types.Log // Blockchain specific contextual infos
}
⋮----
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 (_ECDSACertificateVerifier *ECDSACertificateVerifierFilterer) FilterInitialized(opts *bind.FilterOpts) (*ECDSACertificateVerifierInitializedIterator, error)
⋮----
// WatchInitialized is a free log subscription operation binding the contract event 0x7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb3847402498.
⋮----
func (_ECDSACertificateVerifier *ECDSACertificateVerifierFilterer) WatchInitialized(opts *bind.WatchOpts, sink chan<- *ECDSACertificateVerifierInitialized) (event.Subscription, error)
⋮----
// New log arrived, parse the event and forward to the user
⋮----
// ParseInitialized is a log parse operation binding the contract event 0x7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb3847402498.
⋮----
func (_ECDSACertificateVerifier *ECDSACertificateVerifierFilterer) ParseInitialized(log types.Log) (*ECDSACertificateVerifierInitialized, error)
⋮----
// ECDSACertificateVerifierMaxStalenessPeriodUpdatedIterator is returned from FilterMaxStalenessPeriodUpdated and is used to iterate over the raw logs and unpacked data for MaxStalenessPeriodUpdated events raised by the ECDSACertificateVerifier contract.
type ECDSACertificateVerifierMaxStalenessPeriodUpdatedIterator struct {
	Event *ECDSACertificateVerifierMaxStalenessPeriodUpdated // 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
}
⋮----
Event *ECDSACertificateVerifierMaxStalenessPeriodUpdated // Event containing the contract specifics and raw log
⋮----
// ECDSACertificateVerifierMaxStalenessPeriodUpdated represents a MaxStalenessPeriodUpdated event raised by the ECDSACertificateVerifier contract.
type ECDSACertificateVerifierMaxStalenessPeriodUpdated struct {
	OperatorSet        OperatorSet
	MaxStalenessPeriod uint32
	Raw                types.Log // Blockchain specific contextual infos
}
⋮----
Raw                types.Log // Blockchain specific contextual infos
⋮----
// FilterMaxStalenessPeriodUpdated is a free log retrieval operation binding the contract event 0x28539469fbbc8a5482e60966bf9376f7b9d25b2f0a65a9976f6baa3f0e3788da.
⋮----
// Solidity: event MaxStalenessPeriodUpdated((address,uint32) operatorSet, uint32 maxStalenessPeriod)
func (_ECDSACertificateVerifier *ECDSACertificateVerifierFilterer) FilterMaxStalenessPeriodUpdated(opts *bind.FilterOpts) (*ECDSACertificateVerifierMaxStalenessPeriodUpdatedIterator, error)
⋮----
// WatchMaxStalenessPeriodUpdated is a free log subscription operation binding the contract event 0x28539469fbbc8a5482e60966bf9376f7b9d25b2f0a65a9976f6baa3f0e3788da.
⋮----
func (_ECDSACertificateVerifier *ECDSACertificateVerifierFilterer) WatchMaxStalenessPeriodUpdated(opts *bind.WatchOpts, sink chan<- *ECDSACertificateVerifierMaxStalenessPeriodUpdated) (event.Subscription, error)
⋮----
// ParseMaxStalenessPeriodUpdated is a log parse operation binding the contract event 0x28539469fbbc8a5482e60966bf9376f7b9d25b2f0a65a9976f6baa3f0e3788da.
⋮----
func (_ECDSACertificateVerifier *ECDSACertificateVerifierFilterer) ParseMaxStalenessPeriodUpdated(log types.Log) (*ECDSACertificateVerifierMaxStalenessPeriodUpdated, error)
⋮----
// ECDSACertificateVerifierOperatorSetOwnerUpdatedIterator is returned from FilterOperatorSetOwnerUpdated and is used to iterate over the raw logs and unpacked data for OperatorSetOwnerUpdated events raised by the ECDSACertificateVerifier contract.
type ECDSACertificateVerifierOperatorSetOwnerUpdatedIterator struct {
	Event *ECDSACertificateVerifierOperatorSetOwnerUpdated // 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
}
⋮----
Event *ECDSACertificateVerifierOperatorSetOwnerUpdated // Event containing the contract specifics and raw log
⋮----
// ECDSACertificateVerifierOperatorSetOwnerUpdated represents a OperatorSetOwnerUpdated event raised by the ECDSACertificateVerifier contract.
type ECDSACertificateVerifierOperatorSetOwnerUpdated struct {
	OperatorSet OperatorSet
	Owner       common.Address
	Raw         types.Log // Blockchain specific contextual infos
}
⋮----
Raw         types.Log // Blockchain specific contextual infos
⋮----
// FilterOperatorSetOwnerUpdated is a free log retrieval operation binding the contract event 0x806dc367095c0baf953d7144b7c4376261675ee0b4e0da2761e43673051c7375.
⋮----
// Solidity: event OperatorSetOwnerUpdated((address,uint32) operatorSet, address owner)
func (_ECDSACertificateVerifier *ECDSACertificateVerifierFilterer) FilterOperatorSetOwnerUpdated(opts *bind.FilterOpts) (*ECDSACertificateVerifierOperatorSetOwnerUpdatedIterator, error)
⋮----
// WatchOperatorSetOwnerUpdated is a free log subscription operation binding the contract event 0x806dc367095c0baf953d7144b7c4376261675ee0b4e0da2761e43673051c7375.
⋮----
func (_ECDSACertificateVerifier *ECDSACertificateVerifierFilterer) WatchOperatorSetOwnerUpdated(opts *bind.WatchOpts, sink chan<- *ECDSACertificateVerifierOperatorSetOwnerUpdated) (event.Subscription, error)
⋮----
// ParseOperatorSetOwnerUpdated is a log parse operation binding the contract event 0x806dc367095c0baf953d7144b7c4376261675ee0b4e0da2761e43673051c7375.
⋮----
func (_ECDSACertificateVerifier *ECDSACertificateVerifierFilterer) ParseOperatorSetOwnerUpdated(log types.Log) (*ECDSACertificateVerifierOperatorSetOwnerUpdated, error)
⋮----
// ECDSACertificateVerifierTableUpdatedIterator is returned from FilterTableUpdated and is used to iterate over the raw logs and unpacked data for TableUpdated events raised by the ECDSACertificateVerifier contract.
type ECDSACertificateVerifierTableUpdatedIterator struct {
	Event *ECDSACertificateVerifierTableUpdated // 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
}
⋮----
Event *ECDSACertificateVerifierTableUpdated // Event containing the contract specifics and raw log
⋮----
// ECDSACertificateVerifierTableUpdated represents a TableUpdated event raised by the ECDSACertificateVerifier contract.
type ECDSACertificateVerifierTableUpdated struct {
	OperatorSet        OperatorSet
	ReferenceTimestamp uint32
	OperatorInfos      []IOperatorTableCalculatorTypesECDSAOperatorInfo
	Raw                types.Log // Blockchain specific contextual infos
}
⋮----
// FilterTableUpdated is a free log retrieval operation binding the contract event 0x4f588da9ec57976194a79b5594f8f8782923d93013df2b9ed12fe125805011ef.
⋮----
// Solidity: event TableUpdated((address,uint32) operatorSet, uint32 referenceTimestamp, (address,uint256[])[] operatorInfos)
func (_ECDSACertificateVerifier *ECDSACertificateVerifierFilterer) FilterTableUpdated(opts *bind.FilterOpts) (*ECDSACertificateVerifierTableUpdatedIterator, error)
⋮----
// WatchTableUpdated is a free log subscription operation binding the contract event 0x4f588da9ec57976194a79b5594f8f8782923d93013df2b9ed12fe125805011ef.
⋮----
func (_ECDSACertificateVerifier *ECDSACertificateVerifierFilterer) WatchTableUpdated(opts *bind.WatchOpts, sink chan<- *ECDSACertificateVerifierTableUpdated) (event.Subscription, error)
⋮----
// ParseTableUpdated is a log parse operation binding the contract event 0x4f588da9ec57976194a79b5594f8f8782923d93013df2b9ed12fe125805011ef.
⋮----
func (_ECDSACertificateVerifier *ECDSACertificateVerifierFilterer) ParseTableUpdated(log types.Log) (*ECDSACertificateVerifierTableUpdated, error)
````

## File: pkg/bindings/ECDSACertificateVerifierStorage/binding.go
````go
// Code generated - DO NOT EDIT.
// This file is a generated binding and any manual changes will be lost.
⋮----
package ECDSACertificateVerifierStorage
⋮----
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"
)
⋮----
"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
)
⋮----
// ICrossChainRegistryTypesOperatorSetConfig is an auto generated low-level Go binding around an user-defined struct.
type ICrossChainRegistryTypesOperatorSetConfig struct {
	Owner              common.Address
	MaxStalenessPeriod uint32
}
⋮----
// IECDSACertificateVerifierTypesECDSACertificate is an auto generated low-level Go binding around an user-defined struct.
type IECDSACertificateVerifierTypesECDSACertificate struct {
	ReferenceTimestamp uint32
	MessageHash        [32]byte
	Sig                []byte
}
⋮----
// IOperatorTableCalculatorTypesECDSAOperatorInfo is an auto generated low-level Go binding around an user-defined struct.
type IOperatorTableCalculatorTypesECDSAOperatorInfo struct {
	Pubkey  common.Address
	Weights []*big.Int
}
⋮----
// OperatorSet is an auto generated low-level Go binding around an user-defined struct.
type OperatorSet struct {
	Avs common.Address
	Id  uint32
}
⋮----
// ECDSACertificateVerifierStorageMetaData contains all meta data concerning the ECDSACertificateVerifierStorage contract.
var ECDSACertificateVerifierStorageMetaData = &bind.MetaData{
	ABI: "[{\"type\":\"function\",\"name\":\"calculateCertificateDigest\",\"inputs\":[{\"name\":\"referenceTimestamp\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"messageHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"calculateCertificateDigestBytes\",\"inputs\":[{\"name\":\"referenceTimestamp\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"messageHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"domainSeparator\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getOperatorCount\",\"inputs\":[{\"name\":\"operatorSet\",\"type\":\"tuple\",\"internalType\":\"structOperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]},{\"name\":\"referenceTimestamp\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getOperatorInfo\",\"inputs\":[{\"name\":\"operatorSet\",\"type\":\"tuple\",\"internalType\":\"structOperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]},{\"name\":\"referenceTimestamp\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"operatorIndex\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"tuple\",\"internalType\":\"structIOperatorTableCalculatorTypes.ECDSAOperatorInfo\",\"components\":[{\"name\":\"pubkey\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"weights\",\"type\":\"uint256[]\",\"internalType\":\"uint256[]\"}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getOperatorInfos\",\"inputs\":[{\"name\":\"operatorSet\",\"type\":\"tuple\",\"internalType\":\"structOperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]},{\"name\":\"referenceTimestamp\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"tuple[]\",\"internalType\":\"structIOperatorTableCalculatorTypes.ECDSAOperatorInfo[]\",\"components\":[{\"name\":\"pubkey\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"weights\",\"type\":\"uint256[]\",\"internalType\":\"uint256[]\"}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getOperatorSetOwner\",\"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\":\"getTotalStakeWeights\",\"inputs\":[{\"name\":\"operatorSet\",\"type\":\"tuple\",\"internalType\":\"structOperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]},{\"name\":\"referenceTimestamp\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256[]\",\"internalType\":\"uint256[]\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"isReferenceTimestampSet\",\"inputs\":[{\"name\":\"operatorSet\",\"type\":\"tuple\",\"internalType\":\"structOperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]},{\"name\":\"referenceTimestamp\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"latestReferenceTimestamp\",\"inputs\":[{\"name\":\"operatorSet\",\"type\":\"tuple\",\"internalType\":\"structOperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]}],\"outputs\":[{\"name\":\"\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"maxOperatorTableStaleness\",\"inputs\":[{\"name\":\"operatorSet\",\"type\":\"tuple\",\"internalType\":\"structOperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]}],\"outputs\":[{\"name\":\"\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"operatorTableUpdater\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIOperatorTableUpdater\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"updateOperatorTable\",\"inputs\":[{\"name\":\"operatorSet\",\"type\":\"tuple\",\"internalType\":\"structOperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]},{\"name\":\"referenceTimestamp\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"operatorInfos\",\"type\":\"tuple[]\",\"internalType\":\"structIOperatorTableCalculatorTypes.ECDSAOperatorInfo[]\",\"components\":[{\"name\":\"pubkey\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"weights\",\"type\":\"uint256[]\",\"internalType\":\"uint256[]\"}]},{\"name\":\"operatorSetConfig\",\"type\":\"tuple\",\"internalType\":\"structICrossChainRegistryTypes.OperatorSetConfig\",\"components\":[{\"name\":\"owner\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"maxStalenessPeriod\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"verifyCertificate\",\"inputs\":[{\"name\":\"operatorSet\",\"type\":\"tuple\",\"internalType\":\"structOperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]},{\"name\":\"cert\",\"type\":\"tuple\",\"internalType\":\"structIECDSACertificateVerifierTypes.ECDSACertificate\",\"components\":[{\"name\":\"referenceTimestamp\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"messageHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"sig\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]}],\"outputs\":[{\"name\":\"totalSignedStakeWeights\",\"type\":\"uint256[]\",\"internalType\":\"uint256[]\"},{\"name\":\"signers\",\"type\":\"address[]\",\"internalType\":\"address[]\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"verifyCertificateNominal\",\"inputs\":[{\"name\":\"operatorSet\",\"type\":\"tuple\",\"internalType\":\"structOperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]},{\"name\":\"cert\",\"type\":\"tuple\",\"internalType\":\"structIECDSACertificateVerifierTypes.ECDSACertificate\",\"components\":[{\"name\":\"referenceTimestamp\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"messageHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"sig\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]},{\"name\":\"totalStakeNominalThresholds\",\"type\":\"uint256[]\",\"internalType\":\"uint256[]\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"signers\",\"type\":\"address[]\",\"internalType\":\"address[]\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"verifyCertificateProportion\",\"inputs\":[{\"name\":\"operatorSet\",\"type\":\"tuple\",\"internalType\":\"structOperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]},{\"name\":\"cert\",\"type\":\"tuple\",\"internalType\":\"structIECDSACertificateVerifierTypes.ECDSACertificate\",\"components\":[{\"name\":\"referenceTimestamp\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"messageHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"sig\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]},{\"name\":\"totalStakeProportionThresholds\",\"type\":\"uint16[]\",\"internalType\":\"uint16[]\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"signers\",\"type\":\"address[]\",\"internalType\":\"address[]\"}],\"stateMutability\":\"view\"},{\"type\":\"event\",\"name\":\"MaxStalenessPeriodUpdated\",\"inputs\":[{\"name\":\"operatorSet\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structOperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]},{\"name\":\"maxStalenessPeriod\",\"type\":\"uint32\",\"indexed\":false,\"internalType\":\"uint32\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"OperatorSetOwnerUpdated\",\"inputs\":[{\"name\":\"operatorSet\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structOperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]},{\"name\":\"owner\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"TableUpdated\",\"inputs\":[{\"name\":\"operatorSet\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structOperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]},{\"name\":\"referenceTimestamp\",\"type\":\"uint32\",\"indexed\":false,\"internalType\":\"uint32\"},{\"name\":\"operatorInfos\",\"type\":\"tuple[]\",\"indexed\":false,\"internalType\":\"structIOperatorTableCalculatorTypes.ECDSAOperatorInfo[]\",\"components\":[{\"name\":\"pubkey\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"weights\",\"type\":\"uint256[]\",\"internalType\":\"uint256[]\"}]}],\"anonymous\":false},{\"type\":\"error\",\"name\":\"ArrayLengthMismatch\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"CertificateStale\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"IndexOutOfBounds\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidSignatureLength\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"OnlyTableUpdater\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"OperatorCountZero\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ReferenceTimestampDoesNotExist\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"RootDisabled\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"SignersNotOrdered\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"TableUpdateStale\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"VerificationFailed\",\"inputs\":[]}]",
}
⋮----
// ECDSACertificateVerifierStorageABI is the input ABI used to generate the binding from.
// Deprecated: Use ECDSACertificateVerifierStorageMetaData.ABI instead.
var ECDSACertificateVerifierStorageABI = ECDSACertificateVerifierStorageMetaData.ABI
⋮----
// ECDSACertificateVerifierStorage is an auto generated Go binding around an Ethereum contract.
type ECDSACertificateVerifierStorage struct {
	ECDSACertificateVerifierStorageCaller     // Read-only binding to the contract
	ECDSACertificateVerifierStorageTransactor // Write-only binding to the contract
	ECDSACertificateVerifierStorageFilterer   // Log filterer for contract events
}
⋮----
ECDSACertificateVerifierStorageCaller     // Read-only binding to the contract
ECDSACertificateVerifierStorageTransactor // Write-only binding to the contract
ECDSACertificateVerifierStorageFilterer   // Log filterer for contract events
⋮----
// ECDSACertificateVerifierStorageCaller is an auto generated read-only Go binding around an Ethereum contract.
type ECDSACertificateVerifierStorageCaller struct {
	contract *bind.BoundContract // Generic contract wrapper for the low level calls
}
⋮----
contract *bind.BoundContract // Generic contract wrapper for the low level calls
⋮----
// ECDSACertificateVerifierStorageTransactor is an auto generated write-only Go binding around an Ethereum contract.
type ECDSACertificateVerifierStorageTransactor struct {
	contract *bind.BoundContract // Generic contract wrapper for the low level calls
}
⋮----
// ECDSACertificateVerifierStorageFilterer is an auto generated log filtering Go binding around an Ethereum contract events.
type ECDSACertificateVerifierStorageFilterer struct {
	contract *bind.BoundContract // Generic contract wrapper for the low level calls
}
⋮----
// ECDSACertificateVerifierStorageSession is an auto generated Go binding around an Ethereum contract,
// with pre-set call and transact options.
type ECDSACertificateVerifierStorageSession struct {
	Contract     *ECDSACertificateVerifierStorage // 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
}
⋮----
Contract     *ECDSACertificateVerifierStorage // 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
⋮----
// ECDSACertificateVerifierStorageCallerSession is an auto generated read-only Go binding around an Ethereum contract,
// with pre-set call options.
type ECDSACertificateVerifierStorageCallerSession struct {
	Contract *ECDSACertificateVerifierStorageCaller // Generic contract caller binding to set the session for
	CallOpts bind.CallOpts                          // Call options to use throughout this session
}
⋮----
Contract *ECDSACertificateVerifierStorageCaller // Generic contract caller binding to set the session for
CallOpts bind.CallOpts                          // Call options to use throughout this session
⋮----
// ECDSACertificateVerifierStorageTransactorSession is an auto generated write-only Go binding around an Ethereum contract,
// with pre-set transact options.
type ECDSACertificateVerifierStorageTransactorSession struct {
	Contract     *ECDSACertificateVerifierStorageTransactor // Generic contract transactor binding to set the session for
	TransactOpts bind.TransactOpts                          // Transaction auth options to use throughout this session
}
⋮----
Contract     *ECDSACertificateVerifierStorageTransactor // Generic contract transactor binding to set the session for
TransactOpts bind.TransactOpts                          // Transaction auth options to use throughout this session
⋮----
// ECDSACertificateVerifierStorageRaw is an auto generated low-level Go binding around an Ethereum contract.
type ECDSACertificateVerifierStorageRaw struct {
	Contract *ECDSACertificateVerifierStorage // Generic contract binding to access the raw methods on
}
⋮----
Contract *ECDSACertificateVerifierStorage // Generic contract binding to access the raw methods on
⋮----
// ECDSACertificateVerifierStorageCallerRaw is an auto generated low-level read-only Go binding around an Ethereum contract.
type ECDSACertificateVerifierStorageCallerRaw struct {
	Contract *ECDSACertificateVerifierStorageCaller // Generic read-only contract binding to access the raw methods on
}
⋮----
Contract *ECDSACertificateVerifierStorageCaller // Generic read-only contract binding to access the raw methods on
⋮----
// ECDSACertificateVerifierStorageTransactorRaw is an auto generated low-level write-only Go binding around an Ethereum contract.
type ECDSACertificateVerifierStorageTransactorRaw struct {
	Contract *ECDSACertificateVerifierStorageTransactor // Generic write-only contract binding to access the raw methods on
}
⋮----
Contract *ECDSACertificateVerifierStorageTransactor // Generic write-only contract binding to access the raw methods on
⋮----
// NewECDSACertificateVerifierStorage creates a new instance of ECDSACertificateVerifierStorage, bound to a specific deployed contract.
func NewECDSACertificateVerifierStorage(address common.Address, backend bind.ContractBackend) (*ECDSACertificateVerifierStorage, error)
⋮----
// NewECDSACertificateVerifierStorageCaller creates a new read-only instance of ECDSACertificateVerifierStorage, bound to a specific deployed contract.
func NewECDSACertificateVerifierStorageCaller(address common.Address, caller bind.ContractCaller) (*ECDSACertificateVerifierStorageCaller, error)
⋮----
// NewECDSACertificateVerifierStorageTransactor creates a new write-only instance of ECDSACertificateVerifierStorage, bound to a specific deployed contract.
func NewECDSACertificateVerifierStorageTransactor(address common.Address, transactor bind.ContractTransactor) (*ECDSACertificateVerifierStorageTransactor, error)
⋮----
// NewECDSACertificateVerifierStorageFilterer creates a new log filterer instance of ECDSACertificateVerifierStorage, bound to a specific deployed contract.
func NewECDSACertificateVerifierStorageFilterer(address common.Address, filterer bind.ContractFilterer) (*ECDSACertificateVerifierStorageFilterer, error)
⋮----
// bindECDSACertificateVerifierStorage binds a generic wrapper to an already deployed contract.
func bindECDSACertificateVerifierStorage(address common.Address, caller bind.ContractCaller, transactor bind.ContractTransactor, filterer bind.ContractFilterer) (*bind.BoundContract, error)
⋮----
// 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 (_ECDSACertificateVerifierStorage *ECDSACertificateVerifierStorageRaw) Call(opts *bind.CallOpts, result *[]interface
⋮----
// Transfer initiates a plain transaction to move funds to the contract, calling
// its default method if one is available.
func (_ECDSACertificateVerifierStorage *ECDSACertificateVerifierStorageRaw) Transfer(opts *bind.TransactOpts) (*types.Transaction, error)
⋮----
// Transact invokes the (paid) contract method with params as input values.
func (_ECDSACertificateVerifierStorage *ECDSACertificateVerifierStorageRaw) Transact(opts *bind.TransactOpts, method string, params ...interface
⋮----
// CalculateCertificateDigest is a free data retrieval call binding the contract method 0x18467434.
//
// Solidity: function calculateCertificateDigest(uint32 referenceTimestamp, bytes32 messageHash) view returns(bytes32)
func (_ECDSACertificateVerifierStorage *ECDSACertificateVerifierStorageCaller) CalculateCertificateDigest(opts *bind.CallOpts, referenceTimestamp uint32, messageHash [32]byte) ([32]byte, error)
⋮----
var out []interface{}
⋮----
// CalculateCertificateDigestBytes is a free data retrieval call binding the contract method 0x702ca531.
⋮----
// Solidity: function calculateCertificateDigestBytes(uint32 referenceTimestamp, bytes32 messageHash) view returns(bytes)
func (_ECDSACertificateVerifierStorage *ECDSACertificateVerifierStorageCaller) CalculateCertificateDigestBytes(opts *bind.CallOpts, referenceTimestamp uint32, messageHash [32]byte) ([]byte, error)
⋮----
// DomainSeparator is a free data retrieval call binding the contract method 0xf698da25.
⋮----
// Solidity: function domainSeparator() view returns(bytes32)
func (_ECDSACertificateVerifierStorage *ECDSACertificateVerifierStorageCaller) DomainSeparator(opts *bind.CallOpts) ([32]byte, error)
⋮----
// GetOperatorCount is a free data retrieval call binding the contract method 0x23c2a3cb.
⋮----
// Solidity: function getOperatorCount((address,uint32) operatorSet, uint32 referenceTimestamp) view returns(uint256)
func (_ECDSACertificateVerifierStorage *ECDSACertificateVerifierStorageCaller) GetOperatorCount(opts *bind.CallOpts, operatorSet OperatorSet, referenceTimestamp uint32) (*big.Int, error)
⋮----
// GetOperatorInfo is a free data retrieval call binding the contract method 0xe49613fc.
⋮----
// Solidity: function getOperatorInfo((address,uint32) operatorSet, uint32 referenceTimestamp, uint256 operatorIndex) view returns((address,uint256[]))
func (_ECDSACertificateVerifierStorage *ECDSACertificateVerifierStorageCaller) GetOperatorInfo(opts *bind.CallOpts, operatorSet OperatorSet, referenceTimestamp uint32, operatorIndex *big.Int) (IOperatorTableCalculatorTypesECDSAOperatorInfo, error)
⋮----
// GetOperatorInfos is a free data retrieval call binding the contract method 0x7c85ac4c.
⋮----
// Solidity: function getOperatorInfos((address,uint32) operatorSet, uint32 referenceTimestamp) view returns((address,uint256[])[])
func (_ECDSACertificateVerifierStorage *ECDSACertificateVerifierStorageCaller) GetOperatorInfos(opts *bind.CallOpts, operatorSet OperatorSet, referenceTimestamp uint32) ([]IOperatorTableCalculatorTypesECDSAOperatorInfo, error)
⋮----
// GetOperatorSetOwner is a free data retrieval call binding the contract method 0x84818920.
⋮----
// Solidity: function getOperatorSetOwner((address,uint32) operatorSet) view returns(address)
func (_ECDSACertificateVerifierStorage *ECDSACertificateVerifierStorageCaller) GetOperatorSetOwner(opts *bind.CallOpts, operatorSet OperatorSet) (common.Address, error)
⋮----
// GetTotalStakeWeights is a free data retrieval call binding the contract method 0x7d1d1f5b.
⋮----
// Solidity: function getTotalStakeWeights((address,uint32) operatorSet, uint32 referenceTimestamp) view returns(uint256[])
func (_ECDSACertificateVerifierStorage *ECDSACertificateVerifierStorageCaller) GetTotalStakeWeights(opts *bind.CallOpts, operatorSet OperatorSet, referenceTimestamp uint32) ([]*big.Int, error)
⋮----
// IsReferenceTimestampSet is a free data retrieval call binding the contract method 0xcd83a72b.
⋮----
// Solidity: function isReferenceTimestampSet((address,uint32) operatorSet, uint32 referenceTimestamp) view returns(bool)
func (_ECDSACertificateVerifierStorage *ECDSACertificateVerifierStorageCaller) IsReferenceTimestampSet(opts *bind.CallOpts, operatorSet OperatorSet, referenceTimestamp uint32) (bool, error)
⋮----
// LatestReferenceTimestamp is a free data retrieval call binding the contract method 0x5ddb9b5b.
⋮----
// Solidity: function latestReferenceTimestamp((address,uint32) operatorSet) view returns(uint32)
func (_ECDSACertificateVerifierStorage *ECDSACertificateVerifierStorageCaller) LatestReferenceTimestamp(opts *bind.CallOpts, operatorSet OperatorSet) (uint32, error)
⋮----
// MaxOperatorTableStaleness is a free data retrieval call binding the contract method 0x6141879e.
⋮----
// Solidity: function maxOperatorTableStaleness((address,uint32) operatorSet) view returns(uint32)
func (_ECDSACertificateVerifierStorage *ECDSACertificateVerifierStorageCaller) MaxOperatorTableStaleness(opts *bind.CallOpts, operatorSet OperatorSet) (uint32, error)
⋮----
// OperatorTableUpdater is a free data retrieval call binding the contract method 0x68d6e081.
⋮----
// Solidity: function operatorTableUpdater() view returns(address)
func (_ECDSACertificateVerifierStorage *ECDSACertificateVerifierStorageCaller) OperatorTableUpdater(opts *bind.CallOpts) (common.Address, error)
⋮----
// VerifyCertificate is a free data retrieval call binding the contract method 0x80c7d3f3.
⋮----
// Solidity: function verifyCertificate((address,uint32) operatorSet, (uint32,bytes32,bytes) cert) view returns(uint256[] totalSignedStakeWeights, address[] signers)
func (_ECDSACertificateVerifierStorage *ECDSACertificateVerifierStorageCaller) VerifyCertificate(opts *bind.CallOpts, operatorSet OperatorSet, cert IECDSACertificateVerifierTypesECDSACertificate) (struct
⋮----
// VerifyCertificateNominal is a free data retrieval call binding the contract method 0xbe86e0b2.
⋮----
// Solidity: function verifyCertificateNominal((address,uint32) operatorSet, (uint32,bytes32,bytes) cert, uint256[] totalStakeNominalThresholds) view returns(bool, address[] signers)
func (_ECDSACertificateVerifierStorage *ECDSACertificateVerifierStorageCaller) VerifyCertificateNominal(opts *bind.CallOpts, operatorSet OperatorSet, cert IECDSACertificateVerifierTypesECDSACertificate, totalStakeNominalThresholds []*big.Int) (bool, []common.Address, error)
⋮----
// VerifyCertificateProportion is a free data retrieval call binding the contract method 0xc0da2420.
⋮----
// Solidity: function verifyCertificateProportion((address,uint32) operatorSet, (uint32,bytes32,bytes) cert, uint16[] totalStakeProportionThresholds) view returns(bool, address[] signers)
func (_ECDSACertificateVerifierStorage *ECDSACertificateVerifierStorageCaller) VerifyCertificateProportion(opts *bind.CallOpts, operatorSet OperatorSet, cert IECDSACertificateVerifierTypesECDSACertificate, totalStakeProportionThresholds []uint16) (bool, []common.Address, error)
⋮----
// UpdateOperatorTable is a paid mutator transaction binding the contract method 0x56d482f5.
⋮----
// Solidity: function updateOperatorTable((address,uint32) operatorSet, uint32 referenceTimestamp, (address,uint256[])[] operatorInfos, (address,uint32) operatorSetConfig) returns()
func (_ECDSACertificateVerifierStorage *ECDSACertificateVerifierStorageTransactor) UpdateOperatorTable(opts *bind.TransactOpts, operatorSet OperatorSet, referenceTimestamp uint32, operatorInfos []IOperatorTableCalculatorTypesECDSAOperatorInfo, operatorSetConfig ICrossChainRegistryTypesOperatorSetConfig) (*types.Transaction, error)
⋮----
// ECDSACertificateVerifierStorageMaxStalenessPeriodUpdatedIterator is returned from FilterMaxStalenessPeriodUpdated and is used to iterate over the raw logs and unpacked data for MaxStalenessPeriodUpdated events raised by the ECDSACertificateVerifierStorage contract.
type ECDSACertificateVerifierStorageMaxStalenessPeriodUpdatedIterator struct {
	Event *ECDSACertificateVerifierStorageMaxStalenessPeriodUpdated // 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
}
⋮----
Event *ECDSACertificateVerifierStorageMaxStalenessPeriodUpdated // 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 *ECDSACertificateVerifierStorageMaxStalenessPeriodUpdatedIterator) Next() bool
⋮----
// If the iterator failed, stop iterating
⋮----
// If the iterator completed, deliver directly whatever's available
⋮----
// Iterator still in progress, wait for either a data or an error event
⋮----
// Error returns any retrieval or parsing error occurred during filtering.
func (it *ECDSACertificateVerifierStorageMaxStalenessPeriodUpdatedIterator) Error() error
⋮----
// Close terminates the iteration process, releasing any pending underlying
// resources.
func (it *ECDSACertificateVerifierStorageMaxStalenessPeriodUpdatedIterator) Close() error
⋮----
// ECDSACertificateVerifierStorageMaxStalenessPeriodUpdated represents a MaxStalenessPeriodUpdated event raised by the ECDSACertificateVerifierStorage contract.
type ECDSACertificateVerifierStorageMaxStalenessPeriodUpdated struct {
	OperatorSet        OperatorSet
	MaxStalenessPeriod uint32
	Raw                types.Log // Blockchain specific contextual infos
}
⋮----
Raw                types.Log // Blockchain specific contextual infos
⋮----
// FilterMaxStalenessPeriodUpdated is a free log retrieval operation binding the contract event 0x28539469fbbc8a5482e60966bf9376f7b9d25b2f0a65a9976f6baa3f0e3788da.
⋮----
// Solidity: event MaxStalenessPeriodUpdated((address,uint32) operatorSet, uint32 maxStalenessPeriod)
func (_ECDSACertificateVerifierStorage *ECDSACertificateVerifierStorageFilterer) FilterMaxStalenessPeriodUpdated(opts *bind.FilterOpts) (*ECDSACertificateVerifierStorageMaxStalenessPeriodUpdatedIterator, error)
⋮----
// WatchMaxStalenessPeriodUpdated is a free log subscription operation binding the contract event 0x28539469fbbc8a5482e60966bf9376f7b9d25b2f0a65a9976f6baa3f0e3788da.
⋮----
func (_ECDSACertificateVerifierStorage *ECDSACertificateVerifierStorageFilterer) WatchMaxStalenessPeriodUpdated(opts *bind.WatchOpts, sink chan<- *ECDSACertificateVerifierStorageMaxStalenessPeriodUpdated) (event.Subscription, error)
⋮----
// New log arrived, parse the event and forward to the user
⋮----
// ParseMaxStalenessPeriodUpdated is a log parse operation binding the contract event 0x28539469fbbc8a5482e60966bf9376f7b9d25b2f0a65a9976f6baa3f0e3788da.
⋮----
func (_ECDSACertificateVerifierStorage *ECDSACertificateVerifierStorageFilterer) ParseMaxStalenessPeriodUpdated(log types.Log) (*ECDSACertificateVerifierStorageMaxStalenessPeriodUpdated, error)
⋮----
// ECDSACertificateVerifierStorageOperatorSetOwnerUpdatedIterator is returned from FilterOperatorSetOwnerUpdated and is used to iterate over the raw logs and unpacked data for OperatorSetOwnerUpdated events raised by the ECDSACertificateVerifierStorage contract.
type ECDSACertificateVerifierStorageOperatorSetOwnerUpdatedIterator struct {
	Event *ECDSACertificateVerifierStorageOperatorSetOwnerUpdated // 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
}
⋮----
Event *ECDSACertificateVerifierStorageOperatorSetOwnerUpdated // Event containing the contract specifics and raw log
⋮----
// ECDSACertificateVerifierStorageOperatorSetOwnerUpdated represents a OperatorSetOwnerUpdated event raised by the ECDSACertificateVerifierStorage contract.
type ECDSACertificateVerifierStorageOperatorSetOwnerUpdated struct {
	OperatorSet OperatorSet
	Owner       common.Address
	Raw         types.Log // Blockchain specific contextual infos
}
⋮----
Raw         types.Log // Blockchain specific contextual infos
⋮----
// FilterOperatorSetOwnerUpdated is a free log retrieval operation binding the contract event 0x806dc367095c0baf953d7144b7c4376261675ee0b4e0da2761e43673051c7375.
⋮----
// Solidity: event OperatorSetOwnerUpdated((address,uint32) operatorSet, address owner)
func (_ECDSACertificateVerifierStorage *ECDSACertificateVerifierStorageFilterer) FilterOperatorSetOwnerUpdated(opts *bind.FilterOpts) (*ECDSACertificateVerifierStorageOperatorSetOwnerUpdatedIterator, error)
⋮----
// WatchOperatorSetOwnerUpdated is a free log subscription operation binding the contract event 0x806dc367095c0baf953d7144b7c4376261675ee0b4e0da2761e43673051c7375.
⋮----
func (_ECDSACertificateVerifierStorage *ECDSACertificateVerifierStorageFilterer) WatchOperatorSetOwnerUpdated(opts *bind.WatchOpts, sink chan<- *ECDSACertificateVerifierStorageOperatorSetOwnerUpdated) (event.Subscription, error)
⋮----
// ParseOperatorSetOwnerUpdated is a log parse operation binding the contract event 0x806dc367095c0baf953d7144b7c4376261675ee0b4e0da2761e43673051c7375.
⋮----
func (_ECDSACertificateVerifierStorage *ECDSACertificateVerifierStorageFilterer) ParseOperatorSetOwnerUpdated(log types.Log) (*ECDSACertificateVerifierStorageOperatorSetOwnerUpdated, error)
⋮----
// ECDSACertificateVerifierStorageTableUpdatedIterator is returned from FilterTableUpdated and is used to iterate over the raw logs and unpacked data for TableUpdated events raised by the ECDSACertificateVerifierStorage contract.
type ECDSACertificateVerifierStorageTableUpdatedIterator struct {
	Event *ECDSACertificateVerifierStorageTableUpdated // 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
}
⋮----
Event *ECDSACertificateVerifierStorageTableUpdated // Event containing the contract specifics and raw log
⋮----
// ECDSACertificateVerifierStorageTableUpdated represents a TableUpdated event raised by the ECDSACertificateVerifierStorage contract.
type ECDSACertificateVerifierStorageTableUpdated struct {
	OperatorSet        OperatorSet
	ReferenceTimestamp uint32
	OperatorInfos      []IOperatorTableCalculatorTypesECDSAOperatorInfo
	Raw                types.Log // Blockchain specific contextual infos
}
⋮----
// FilterTableUpdated is a free log retrieval operation binding the contract event 0x4f588da9ec57976194a79b5594f8f8782923d93013df2b9ed12fe125805011ef.
⋮----
// Solidity: event TableUpdated((address,uint32) operatorSet, uint32 referenceTimestamp, (address,uint256[])[] operatorInfos)
func (_ECDSACertificateVerifierStorage *ECDSACertificateVerifierStorageFilterer) FilterTableUpdated(opts *bind.FilterOpts) (*ECDSACertificateVerifierStorageTableUpdatedIterator, error)
⋮----
// WatchTableUpdated is a free log subscription operation binding the contract event 0x4f588da9ec57976194a79b5594f8f8782923d93013df2b9ed12fe125805011ef.
⋮----
func (_ECDSACertificateVerifierStorage *ECDSACertificateVerifierStorageFilterer) WatchTableUpdated(opts *bind.WatchOpts, sink chan<- *ECDSACertificateVerifierStorageTableUpdated) (event.Subscription, error)
⋮----
// ParseTableUpdated is a log parse operation binding the contract event 0x4f588da9ec57976194a79b5594f8f8782923d93013df2b9ed12fe125805011ef.
⋮----
func (_ECDSACertificateVerifierStorage *ECDSACertificateVerifierStorageFilterer) ParseTableUpdated(log types.Log) (*ECDSACertificateVerifierStorageTableUpdated, error)
````

## File: pkg/bindings/Eigen/binding.go
````go
// Code generated - DO NOT EDIT.
// This file is a generated binding and any manual changes will be lost.
⋮----
package Eigen
⋮----
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"
)
⋮----
"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
)
⋮----
// ERC20VotesUpgradeableCheckpoint is an auto generated low-level Go binding around an user-defined struct.
type ERC20VotesUpgradeableCheckpoint struct {
	FromBlock uint32
	Votes     *big.Int
}
⋮----
// EigenMetaData contains all meta data concerning the Eigen contract.
var EigenMetaData = &bind.MetaData{
	ABI: "[{\"type\":\"constructor\",\"inputs\":[{\"name\":\"_bEIGEN\",\"type\":\"address\",\"internalType\":\"contractIERC20\"},{\"name\":\"_version\",\"type\":\"string\",\"internalType\":\"string\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"CLOCK_MODE\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"string\",\"internalType\":\"string\"}],\"stateMutability\":\"pure\"},{\"type\":\"function\",\"name\":\"DOMAIN_SEPARATOR\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"allowance\",\"inputs\":[{\"name\":\"owner\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"spender\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"allowedFrom\",\"inputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"allowedTo\",\"inputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"approve\",\"inputs\":[{\"name\":\"spender\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"bEIGEN\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIERC20\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"balanceOf\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"checkpoints\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"pos\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"tuple\",\"internalType\":\"structERC20VotesUpgradeable.Checkpoint\",\"components\":[{\"name\":\"fromBlock\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"votes\",\"type\":\"uint224\",\"internalType\":\"uint224\"}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"clock\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint48\",\"internalType\":\"uint48\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"decimals\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint8\",\"internalType\":\"uint8\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"decreaseAllowance\",\"inputs\":[{\"name\":\"spender\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"subtractedValue\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"delegate\",\"inputs\":[{\"name\":\"delegatee\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"delegateBySig\",\"inputs\":[{\"name\":\"delegatee\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"nonce\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"expiry\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"v\",\"type\":\"uint8\",\"internalType\":\"uint8\"},{\"name\":\"r\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"s\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"delegates\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"disableTransferRestrictions\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"eip712Domain\",\"inputs\":[],\"outputs\":[{\"name\":\"fields\",\"type\":\"bytes1\",\"internalType\":\"bytes1\"},{\"name\":\"name\",\"type\":\"string\",\"internalType\":\"string\"},{\"name\":\"version\",\"type\":\"string\",\"internalType\":\"string\"},{\"name\":\"chainId\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"verifyingContract\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"salt\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"extensions\",\"type\":\"uint256[]\",\"internalType\":\"uint256[]\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getPastTotalSupply\",\"inputs\":[{\"name\":\"timepoint\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getPastVotes\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"timepoint\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getVotes\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"increaseAllowance\",\"inputs\":[{\"name\":\"spender\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"addedValue\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"initialize\",\"inputs\":[{\"name\":\"initialOwner\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"minters\",\"type\":\"address[]\",\"internalType\":\"address[]\"},{\"name\":\"mintingAllowances\",\"type\":\"uint256[]\",\"internalType\":\"uint256[]\"},{\"name\":\"mintAllowedAfters\",\"type\":\"uint256[]\",\"internalType\":\"uint256[]\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"mint\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"mintAllowedAfter\",\"inputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"mintingAllowance\",\"inputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"multisend\",\"inputs\":[{\"name\":\"receivers\",\"type\":\"address[]\",\"internalType\":\"address[]\"},{\"name\":\"amounts\",\"type\":\"uint256[]\",\"internalType\":\"uint256[]\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"name\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"string\",\"internalType\":\"string\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"nonces\",\"inputs\":[{\"name\":\"owner\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"numCheckpoints\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"owner\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"permit\",\"inputs\":[{\"name\":\"owner\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"spender\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"value\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"deadline\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"v\",\"type\":\"uint8\",\"internalType\":\"uint8\"},{\"name\":\"r\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"s\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"renounceOwnership\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"setAllowedFrom\",\"inputs\":[{\"name\":\"from\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"isAllowedFrom\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"setAllowedTo\",\"inputs\":[{\"name\":\"to\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"isAllowedTo\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"symbol\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"string\",\"internalType\":\"string\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"totalSupply\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"transfer\",\"inputs\":[{\"name\":\"to\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"transferFrom\",\"inputs\":[{\"name\":\"from\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"to\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"transferOwnership\",\"inputs\":[{\"name\":\"newOwner\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"transferRestrictionsDisabledAfter\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"unwrap\",\"inputs\":[{\"name\":\"amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"version\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"string\",\"internalType\":\"string\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"wrap\",\"inputs\":[{\"name\":\"amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"event\",\"name\":\"Approval\",\"inputs\":[{\"name\":\"owner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"spender\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"value\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"DelegateChanged\",\"inputs\":[{\"name\":\"delegator\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"fromDelegate\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"toDelegate\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"DelegateVotesChanged\",\"inputs\":[{\"name\":\"delegate\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"previousBalance\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"newBalance\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"EIP712DomainChanged\",\"inputs\":[],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Initialized\",\"inputs\":[{\"name\":\"version\",\"type\":\"uint8\",\"indexed\":false,\"internalType\":\"uint8\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Mint\",\"inputs\":[{\"name\":\"minter\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"OwnershipTransferred\",\"inputs\":[{\"name\":\"previousOwner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"newOwner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"SetAllowedFrom\",\"inputs\":[{\"name\":\"from\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"isAllowedFrom\",\"type\":\"bool\",\"indexed\":false,\"internalType\":\"bool\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"SetAllowedTo\",\"inputs\":[{\"name\":\"to\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"isAllowedTo\",\"type\":\"bool\",\"indexed\":false,\"internalType\":\"bool\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"TokenUnwrapped\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"TokenWrapped\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"amount\",\"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},{\"type\":\"event\",\"name\":\"TransferRestrictionsDisabled\",\"inputs\":[],\"anonymous\":false},{\"type\":\"error\",\"name\":\"InvalidShortString\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"StringTooLong\",\"inputs\":[{\"name\":\"str\",\"type\":\"string\",\"internalType\":\"string\"}]}]",
	Bin: "0x60c060405234801561000f575f5ffd5b5060405161379b38038061379b83398101604081905261002e9161016a565b8061003881610058565b608052506001600160a01b03821660a05261005161009e565b5050610294565b5f5f829050601f8151111561008b578260405163305a27a960e01b81526004016100829190610239565b60405180910390fd5b80516100968261026e565b179392505050565b5f54610100900460ff16156101055760405162461bcd60e51b815260206004820152602760248201527f496e697469616c697a61626c653a20636f6e747261637420697320696e697469604482015266616c697a696e6760c81b6064820152608401610082565b5f5460ff90811614610154575f805460ff191660ff9081179091556040519081527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b565b634e487b7160e01b5f52604160045260245ffd5b5f5f6040838503121561017b575f5ffd5b82516001600160a01b0381168114610191575f5ffd5b60208401519092506001600160401b038111156101ac575f5ffd5b8301601f810185136101bc575f5ffd5b80516001600160401b038111156101d5576101d5610156565b604051601f8201601f19908116603f011681016001600160401b038111828210171561020357610203610156565b60405281815282820160200187101561021a575f5ffd5b8160208401602083015e5f602083830101528093505050509250929050565b602081525f82518060208401528060208501604085015e5f604082850101526040601f19601f83011684010191505092915050565b8051602080830151919081101561028e575f198160200360031b1b821691505b50919050565b60805160a0516134d16102ca5f395f818161034c01528181610852015281816114dd01526115fb01525f610a1401526134d15ff3fe608060405234801561000f575f5ffd5b5060043610610260575f3560e01c80637ecebe001161014b578063a9059cbb116100bf578063dd62ed3e11610084578063dd62ed3e146105cc578063de0e9a3e146105df578063ea598cb0146105f2578063eb415f4514610605578063f1127ed81461060d578063f2fde38b1461064a575f5ffd5b8063a9059cbb1461056d578063aad41a4114610580578063b8c2559414610593578063c3cda520146105a6578063d505accf146105b9575f5ffd5b806391ddadf41161011057806391ddadf41461050357806395d89b41146105225780639ab24eb01461052a5780639aec4bae1461053d578063a457c2d714610547578063a7d1195d1461055a575f5ffd5b80637ecebe001461049157806381b97161146104a457806384b0196e146104c45780638da5cb5b146104df5780638e539e8c146104f0575f5ffd5b80633a46b1a8116101e2578063587cde1e116101a7578063587cde1e146103d85780635c19a95c146104035780636fcfff451461041657806370a082311461043e578063715018a61461046657806378aa33ba1461046e575f5ffd5b80633a46b1a8146103345780633f4da4c6146103475780634bf5d7e91461038657806353957125146103b057806354fd4d50146103d0575f5ffd5b80631ffacdef116102285780631ffacdef146102e457806323b872dd146102f7578063313ce5671461030a5780633644e515146103195780633950935114610321575f5ffd5b80630455e6941461026457806306fdde031461029c578063095ea7b3146102b15780631249c58b146102c457806318160ddd146102ce575b5f5ffd5b610287610272366004612d08565b6101336020525f908152604090205460ff1681565b60405190151581526020015b60405180910390f35b6102a461065d565b6040516102939190612d4f565b6102876102bf366004612d61565b6106ed565b6102cc610706565b005b6102d661084f565b604051908152602001610293565b6102cc6102f2366004612d96565b6108d5565b610287610305366004612dcb565b61093d565b60405160128152602001610293565b6102d6610960565b61028761032f366004612d61565b610969565b6102d6610342366004612d61565b61098a565b61036e7f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b039091168152602001610293565b60408051808201909152600e81526d06d6f64653d74696d657374616d760941b60208201526102a4565b6102d66103be366004612d08565b6101306020525f908152604090205481565b6102a4610a0d565b61036e6103e6366004612d08565b6001600160a01b039081165f90815260fe60205260409020541690565b6102cc610411366004612d08565b610a38565b610429610424366004612d08565b610a45565b60405163ffffffff9091168152602001610293565b6102d661044c366004612d08565b6001600160a01b03165f9081526065602052604090205490565b6102cc610a66565b61028761047c366004612d08565b6101346020525f908152604090205460ff1681565b6102d661049f366004612d08565b610a79565b6102d66104b2366004612d08565b6101316020525f908152604090205481565b6104cc610a96565b6040516102939796959493929190612e05565b6033546001600160a01b031661036e565b6102d66104fe366004612e9b565b610b2f565b61050b610b96565b60405165ffffffffffff9091168152602001610293565b6102a4610ba0565b6102d6610538366004612d08565b610baf565b6102d66101325481565b610287610555366004612d61565b610c2c565b6102cc610568366004612f7a565b610ca6565b61028761057b366004612d61565b6110ba565b6102cc61058e3660046130bf565b6110c7565b6102cc6105a1366004612d96565b611197565b6102cc6105b436600461313b565b6111f7565b6102cc6105c736600461318f565b61132c565b6102d66105da3660046131f5565b61148d565b6102cc6105ed366004612e9b565b6114b7565b6102cc610600366004612e9b565b6115d9565b6102cc611700565b61062061061b366004613226565b6117c7565b60408051825163ffffffff1681526020928301516001600160e01b03169281019290925201610293565b6102cc610658366004612d08565b611848565b60606068805461066c90613258565b80601f016020809104026020016040519081016040528092919081815260200182805461069890613258565b80156106e35780601f106106ba576101008083540402835291602001916106e3565b820191905f5260205f20905b8154815290600101906020018083116106c657829003601f168201915b5050505050905090565b5f336106fa8185856118be565b60019150505b92915050565b335f908152610131602052604090205461077f5760405162461bcd60e51b815260206004820152602f60248201527f456967656e2e6d696e743a206d73672e73656e64657220686173206e6f206d6960448201526e6e74696e6720616c6c6f77616e636560881b60648201526084015b60405180910390fd5b335f908152610130602052604090205442116107f75760405162461bcd60e51b815260206004820152603160248201527f456967656e2e6d696e743a206d73672e73656e646572206973206e6f7420616c6044820152701b1bddd959081d1bc81b5a5b9d081e595d607a1b6064820152608401610776565b335f8181526101316020526040812080549190559061081690826119e1565b60405181815233907f0f6798a560793a54c3bcfe86a93cde1e73087d944c0ea20544137d4121396885906020015b60405180910390a250565b5f7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166318160ddd6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156108ac573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906108d0919061328a565b905090565b6108dd611a77565b6001600160a01b0382165f8181526101336020908152604091829020805460ff191685151590811790915591519182527fcf20b1ecb604b0e8888d579c64e8a3b10e590d45c1c2dddb393bed284362227191015b60405180910390a25050565b5f3361094a858285611ad1565b610955858585611b43565b506001949350505050565b5f6108d0611cfd565b5f336106fa81858561097b838361148d565b61098591906132b5565b6118be565b5f610993610b96565b65ffffffffffff1682106109e55760405162461bcd60e51b815260206004820152601960248201527804552433230566f7465733a20667574757265206c6f6f6b757603c1b6044820152606401610776565b6001600160a01b0383165f90815260ff60205260409020610a069083611d06565b9392505050565b60606108d07f0000000000000000000000000000000000000000000000000000000000000000611de7565b610a423382611e24565b50565b6001600160a01b0381165f90815260ff602052604081205461070090611e9d565b610a6e611a77565b610a775f611f05565b565b6001600160a01b0381165f90815260cb6020526040812054610700565b5f6060805f5f5f60606097545f5f1b148015610ab25750609854155b610af65760405162461bcd60e51b81526020600482015260156024820152741152540dcc4c8e88155b9a5b9a5d1a585b1a5e9959605a1b6044820152606401610776565b610afe611f56565b610b06611f65565b604080515f80825260208201909252600f60f81b9b939a50919850469750309650945092509050565b5f610b38610b96565b65ffffffffffff168210610b8a5760405162461bcd60e51b815260206004820152601960248201527804552433230566f7465733a20667574757265206c6f6f6b757603c1b6044820152606401610776565b61070061010083611d06565b5f6108d042611f74565b60606069805461066c90613258565b6001600160a01b0381165f90815260ff60205260408120548015610c1a576001600160a01b0383165f90815260ff6020526040902080545f198301908110610bf957610bf96132c8565b5f9182526020909120015464010000000090046001600160e01b0316610c1c565b5f5b6001600160e01b03169392505050565b5f3381610c39828661148d565b905083811015610c995760405162461bcd60e51b815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f77604482015264207a65726f60d81b6064820152608401610776565b61095582868684036118be565b5f54610100900460ff1615808015610cc457505f54600160ff909116105b80610cdd5750303b158015610cdd57505f5460ff166001145b610d405760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b6064820152608401610776565b5f805460ff191660011790558015610d61575f805461ff0019166101001790555b610d69611fda565b610dad6040518060400160405280600581526020016422b4b3b2b760d91b8152506040518060400160405280600581526020016422a4a3a2a760d91b815250612008565b610db685611f05565b610ddc6040518060400160405280600581526020016422a4a3a2a760d91b81525061203c565b8251845114610e635760405162461bcd60e51b815260206004820152604760248201527f456967656e2e696e697469616c697a653a206d696e7465727320616e64206d6960448201527f6e74696e67416c6c6f77616e636573206d757374206265207468652073616d65606482015266040d8cadccee8d60cb1b608482015260a401610776565b8151845114610eea5760405162461bcd60e51b815260206004820152604760248201527f456967656e2e696e697469616c697a653a206d696e7465727320616e64206d6960448201527f6e74416c6c6f776564416674657273206d757374206265207468652073616d65606482015266040d8cadccee8d60cb1b608482015260a401610776565b5f5b845181101561106757838181518110610f0757610f076132c8565b60200260200101516101315f878481518110610f2557610f256132c8565b60200260200101516001600160a01b03166001600160a01b031681526020019081526020015f2081905550828181518110610f6257610f626132c8565b60200260200101516101305f878481518110610f8057610f806132c8565b60200260200101516001600160a01b03166001600160a01b031681526020019081526020015f208190555060016101335f878481518110610fc357610fc36132c8565b60200260200101516001600160a01b03166001600160a01b031681526020019081526020015f205f6101000a81548160ff021916908315150217905550848181518110611012576110126132c8565b60200260200101516001600160a01b03167fcf20b1ecb604b0e8888d579c64e8a3b10e590d45c1c2dddb393bed28436222716001604051611057911515815260200190565b60405180910390a2600101610eec565b505f196101325580156110b3575f805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b5050505050565b5f336106fa818585611b43565b82811461113c5760405162461bcd60e51b815260206004820152603e60248201527f456967656e2e6d756c746973656e643a2072656365697665727320616e64206160448201527f6d6f756e7473206d757374206265207468652073616d65206c656e67746800006064820152608401610776565b5f5b838110156110b35761118f3386868481811061115c5761115c6132c8565b90506020020160208101906111719190612d08565b858585818110611183576111836132c8565b90506020020135611b43565b60010161113e565b61119f611a77565b6001600160a01b0382165f8181526101346020908152604091829020805460ff191685151590811790915591519182527f72a561d1af7409467dae4f1e9fc52590a9335a1dda17727e2b6aa8c4db35109b9101610931565b834211156112475760405162461bcd60e51b815260206004820152601d60248201527f4552433230566f7465733a207369676e617475726520657870697265640000006044820152606401610776565b604080517fe48329057bfd03d55e49b547132e39cffd9c1820ad7b9d4c5307691425d15adf60208201526001600160a01b0388169181019190915260608101869052608081018590525f906112c0906112b89060a00160405160208183030381529060405280519060200120612085565b8585856120b1565b90506112cb816120d7565b86146113195760405162461bcd60e51b815260206004820152601960248201527f4552433230566f7465733a20696e76616c6964206e6f6e6365000000000000006044820152606401610776565b6113238188611e24565b50505050505050565b8342111561137c5760405162461bcd60e51b815260206004820152601d60248201527f45524332305065726d69743a206578706972656420646561646c696e650000006044820152606401610776565b5f7f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c98888886113aa8c6120d7565b6040805160208101969096526001600160a01b0394851690860152929091166060840152608083015260a082015260c0810186905260e0016040516020818303038152906040528051906020012090505f61140482612085565b90505f611413828787876120b1565b9050896001600160a01b0316816001600160a01b0316146114765760405162461bcd60e51b815260206004820152601e60248201527f45524332305065726d69743a20696e76616c6964207369676e617475726500006044820152606401610776565b6114818a8a8a6118be565b50505050505050505050565b6001600160a01b039182165f90815260666020908152604080832093909416825291909152205490565b6114c133826120fe565b60405163a9059cbb60e01b8152336004820152602481018290527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03169063a9059cbb906044016020604051808303815f875af115801561152b573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061154f91906132dc565b6115a75760405162461bcd60e51b8152602060048201526024808201527f456967656e2e756e777261703a2062454947454e207472616e736665722066616044820152631a5b195960e21b6064820152608401610776565b60405181815233907f7f8146ca1ae17ad17561461ef221d97c8160bfddcae0edb68f53ce8dc5ce4af390602001610844565b6040516323b872dd60e01b8152336004820152306024820152604481018290527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906323b872dd906064016020604051808303815f875af1158015611649573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061166d91906132dc565b6116c45760405162461bcd60e51b815260206004820152602260248201527f456967656e2e777261703a2062454947454e207472616e73666572206661696c604482015261195960f21b6064820152608401610776565b6116ce33826119e1565b60405181815233907f2273a99739c31a37346636a3013c2cedebee7cd5b4c560faded39d298c1dd45c90602001610844565b611708611a77565b5f1961013254146117975760405162461bcd60e51b815260206004820152604d60248201527f456967656e2e64697361626c655472616e736665725265737472696374696f6e60448201527f733a207472616e73666572207265737472696374696f6e732061726520616c7260648201526c1958591e48191a5cd8589b1959609a1b608482015260a401610776565b5f6101328190556040517f2b18986d3ba809db2f13a5d7bf17f60d357b37d9cbb55dd71cbbac8dc4060f649190a1565b604080518082019091525f80825260208201526001600160a01b0383165f90815260ff60205260409020805463ffffffff8416908110611809576118096132c8565b5f9182526020918290206040805180820190915291015463ffffffff8116825264010000000090046001600160e01b0316918101919091529392505050565b611850611a77565b6001600160a01b0381166118b55760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610776565b610a4281611f05565b6001600160a01b0383166119205760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b6064820152608401610776565b6001600160a01b0382166119815760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b6064820152608401610776565b6001600160a01b038381165f8181526066602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b6119eb8282612117565b6001600160e01b036119fb61084f565b1115611a625760405162461bcd60e51b815260206004820152603060248201527f4552433230566f7465733a20746f74616c20737570706c79207269736b73206f60448201526f766572666c6f77696e6720766f74657360801b6064820152608401610776565b611a716101006121e8836121f3565b50505050565b6033546001600160a01b03163314610a775760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610776565b5f611adc848461148d565b90505f198114611a715781811015611b365760405162461bcd60e51b815260206004820152601d60248201527f45524332303a20696e73756666696369656e7420616c6c6f77616e63650000006044820152606401610776565b611a7184848484036118be565b6001600160a01b038316611ba75760405162461bcd60e51b815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604482015264647265737360d81b6064820152608401610776565b6001600160a01b038216611c095760405162461bcd60e51b815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201526265737360e81b6064820152608401610776565b611c1483838361235f565b6001600160a01b0383165f9081526065602052604090205481811015611c8b5760405162461bcd60e51b815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e7420657863656564732062604482015265616c616e636560d01b6064820152608401610776565b6001600160a01b038085165f8181526065602052604080822086860390559286168082529083902080548601905591517fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef90611cea9086815260200190565b60405180910390a3611a71848484612443565b5f6108d0612474565b81545f9081816005811115611d5d575f611d1f846124e7565b611d2990856132f7565b5f88815260209020909150869082015463ffffffff161115611d4d57809150611d5b565b611d588160016132b5565b92505b505b80821015611da8575f611d7083836125cb565b5f88815260209020909150869082015463ffffffff161115611d9457809150611da2565b611d9f8160016132b5565b92505b50611d5d565b8015611dd2575f8681526020902081015f19015464010000000090046001600160e01b0316611dd4565b5f5b6001600160e01b03169695505050505050565b60605f611df3836125e5565b6040805160208082528183019092529192505f91906020820181803683375050509182525060208101929092525090565b6001600160a01b038281165f81815260fe6020818152604080842080546065845282862054949093528787166001600160a01b03198416811790915590519190951694919391928592917f3134e8a2e6d97e929a7e54011ea5485d7d196dd5f0ba4d4ef95803e8e3fc257f9190a4611a7182848361260c565b5f63ffffffff821115611f015760405162461bcd60e51b815260206004820152602660248201527f53616665436173743a2076616c756520646f65736e27742066697420696e203360448201526532206269747360d01b6064820152608401610776565b5090565b603380546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a35050565b60606099805461066c90613258565b6060609a805461066c90613258565b5f65ffffffffffff821115611f015760405162461bcd60e51b815260206004820152602660248201527f53616665436173743a2076616c756520646f65736e27742066697420696e203460448201526538206269747360d01b6064820152608401610776565b5f54610100900460ff166120005760405162461bcd60e51b81526004016107769061330a565b610a77612746565b5f54610100900460ff1661202e5760405162461bcd60e51b81526004016107769061330a565b6120388282612775565b5050565b5f54610100900460ff166120625760405162461bcd60e51b81526004016107769061330a565b610a4281604051806040016040528060018152602001603160f81b8152506127b4565b5f610700612091611cfd565b8360405161190160f01b8152600281019290925260228201526042902090565b5f5f5f6120c087878787612801565b915091506120cd816128be565b5095945050505050565b6001600160a01b0381165f90815260cb602052604090208054600181018255905b50919050565b6121088282612a07565b611a71610100612b4a836121f3565b6001600160a01b03821661216d5760405162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f2061646472657373006044820152606401610776565b6121785f838361235f565b8060675f82825461218991906132b5565b90915550506001600160a01b0382165f818152606560209081526040808320805486019055518481527fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a36120385f8383612443565b5f610a0682846132b5565b82545f90819081811561223d575f8781526020902082015f190160408051808201909152905463ffffffff8116825264010000000090046001600160e01b03166020820152612251565b604080518082019091525f80825260208201525b905080602001516001600160e01b0316935061227184868863ffffffff16565b92505f821180156122995750612285610b96565b65ffffffffffff16815f015163ffffffff16145b156122dc576122a783612b55565b5f8881526020902083015f190180546001600160e01b03929092166401000000000263ffffffff909216919091179055612355565b8660405180604001604052806123006122f3610b96565b65ffffffffffff16611e9d565b63ffffffff16815260200161231486612b55565b6001600160e01b0390811690915282546001810184555f938452602093849020835194909301519091166401000000000263ffffffff909316929092179101555b5050935093915050565b61013254421161243e576001600160a01b038316158061238657506001600160a01b038216155b806123a957506001600160a01b0383165f908152610133602052604090205460ff165b806123cc57506001600160a01b0382165f908152610134602052604090205460ff165b61243e5760405162461bcd60e51b815260206004820152603a60248201527f456967656e2e5f6265666f7265546f6b656e5472616e736665723a2066726f6d60448201527f206f7220746f206d7573742062652077686974656c69737465640000000000006064820152608401610776565b505050565b6001600160a01b038381165f90815260fe602052604080822054858416835291205461243e9291821691168361260c565b5f7f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f61249e612bbd565b6124a6612c15565b60408051602081019490945283019190915260608201524660808201523060a082015260c00160405160208183030381529060405280519060200120905090565b5f815f036124f657505f919050565b5f600161250284612c45565b901c6001901b9050600181848161251b5761251b613355565b048201901c9050600181848161253357612533613355565b048201901c9050600181848161254b5761254b613355565b048201901c9050600181848161256357612563613355565b048201901c9050600181848161257b5761257b613355565b048201901c9050600181848161259357612593613355565b048201901c905060018184816125ab576125ab613355565b048201901c9050610a06818285816125c5576125c5613355565b04612cd8565b5f6125d96002848418613369565b610a06908484166132b5565b5f60ff8216601f81111561070057604051632cd44ac360e21b815260040160405180910390fd5b816001600160a01b0316836001600160a01b03161415801561262d57505f81115b1561243e576001600160a01b038316156126ba576001600160a01b0383165f90815260ff60205260408120819061266790612b4a856121f3565b91509150846001600160a01b03167fdec2bacdd2f05b59de34da9b523dff8be42e5e38e818c82fdb0bae774387a72483836040516126af929190918252602082015260400190565b60405180910390a250505b6001600160a01b0382161561243e576001600160a01b0382165f90815260ff6020526040812081906126ef906121e8856121f3565b91509150836001600160a01b03167fdec2bacdd2f05b59de34da9b523dff8be42e5e38e818c82fdb0bae774387a7248383604051612737929190918252602082015260400190565b60405180910390a25050505050565b5f54610100900460ff1661276c5760405162461bcd60e51b81526004016107769061330a565b610a7733611f05565b5f54610100900460ff1661279b5760405162461bcd60e51b81526004016107769061330a565b60686127a783826133cc565b50606961243e82826133cc565b5f54610100900460ff166127da5760405162461bcd60e51b81526004016107769061330a565b60996127e683826133cc565b50609a6127f382826133cc565b50505f609781905560985550565b5f807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a083111561283657505f905060036128b5565b604080515f8082526020820180845289905260ff881692820192909252606081018690526080810185905260019060a0016020604051602081039080840390855afa158015612887573d5f5f3e3d5ffd5b5050604051601f1901519150506001600160a01b0381166128af575f600192509250506128b5565b91505f90505b94509492505050565b5f8160048111156128d1576128d1613487565b036128d95750565b60018160048111156128ed576128ed613487565b0361293a5760405162461bcd60e51b815260206004820152601860248201527f45434453413a20696e76616c6964207369676e617475726500000000000000006044820152606401610776565b600281600481111561294e5761294e613487565b0361299b5760405162461bcd60e51b815260206004820152601f60248201527f45434453413a20696e76616c6964207369676e6174757265206c656e677468006044820152606401610776565b60038160048111156129af576129af613487565b03610a425760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202773272076616c604482015261756560f01b6064820152608401610776565b6001600160a01b038216612a675760405162461bcd60e51b815260206004820152602160248201527f45524332303a206275726e2066726f6d20746865207a65726f206164647265736044820152607360f81b6064820152608401610776565b612a72825f8361235f565b6001600160a01b0382165f9081526065602052604090205481811015612ae55760405162461bcd60e51b815260206004820152602260248201527f45524332303a206275726e20616d6f756e7420657863656564732062616c616e604482015261636560f01b6064820152608401610776565b6001600160a01b0383165f8181526065602090815260408083208686039055606780548790039055518581529192917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a361243e835f84612443565b5f610a0682846132f7565b5f6001600160e01b03821115611f015760405162461bcd60e51b815260206004820152602760248201527f53616665436173743a2076616c756520646f65736e27742066697420696e20326044820152663234206269747360c81b6064820152608401610776565b5f5f612bc7611f56565b805190915015612bde578051602090910120919050565b6097548015612bed5792915050565b7fc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a4709250505090565b5f5f612c1f611f65565b805190915015612c36578051602090910120919050565b6098548015612bed5792915050565b5f80608083901c15612c5957608092831c92015b604083901c15612c6b57604092831c92015b602083901c15612c7d57602092831c92015b601083901c15612c8f57601092831c92015b600883901c15612ca157600892831c92015b600483901c15612cb357600492831c92015b600283901c15612cc557600292831c92015b600183901c156107005760010192915050565b5f818310612ce65781610a06565b5090919050565b80356001600160a01b0381168114612d03575f5ffd5b919050565b5f60208284031215612d18575f5ffd5b610a0682612ced565b5f81518084528060208401602086015e5f602082860101526020601f19601f83011685010191505092915050565b602081525f610a066020830184612d21565b5f5f60408385031215612d72575f5ffd5b612d7b83612ced565b946020939093013593505050565b8015158114610a42575f5ffd5b5f5f60408385031215612da7575f5ffd5b612db083612ced565b91506020830135612dc081612d89565b809150509250929050565b5f5f5f60608486031215612ddd575f5ffd5b612de684612ced565b9250612df460208501612ced565b929592945050506040919091013590565b60ff60f81b8816815260e060208201525f612e2360e0830189612d21565b8281036040840152612e358189612d21565b606084018890526001600160a01b038716608085015260a0840186905283810360c0850152845180825260208087019350909101905f5b81811015612e8a578351835260209384019390920191600101612e6c565b50909b9a5050505050505050505050565b5f60208284031215612eab575f5ffd5b5035919050565b634e487b7160e01b5f52604160045260245ffd5b604051601f8201601f1916810167ffffffffffffffff81118282101715612eef57612eef612eb2565b604052919050565b5f67ffffffffffffffff821115612f1057612f10612eb2565b5060051b60200190565b5f82601f830112612f29575f5ffd5b8135612f3c612f3782612ef7565b612ec6565b8082825260208201915060208360051b860101925085831115612f5d575f5ffd5b602085015b838110156120cd578035835260209283019201612f62565b5f5f5f5f60808587031215612f8d575f5ffd5b612f9685612ced565b9350602085013567ffffffffffffffff811115612fb1575f5ffd5b8501601f81018713612fc1575f5ffd5b8035612fcf612f3782612ef7565b8082825260208201915060208360051b850101925089831115612ff0575f5ffd5b6020840193505b828410156130195761300884612ced565b825260209384019390910190612ff7565b9550505050604085013567ffffffffffffffff811115613037575f5ffd5b61304387828801612f1a565b925050606085013567ffffffffffffffff81111561305f575f5ffd5b61306b87828801612f1a565b91505092959194509250565b5f5f83601f840112613087575f5ffd5b50813567ffffffffffffffff81111561309e575f5ffd5b6020830191508360208260051b85010111156130b8575f5ffd5b9250929050565b5f5f5f5f604085870312156130d2575f5ffd5b843567ffffffffffffffff8111156130e8575f5ffd5b6130f487828801613077565b909550935050602085013567ffffffffffffffff811115613113575f5ffd5b61311f87828801613077565b95989497509550505050565b803560ff81168114612d03575f5ffd5b5f5f5f5f5f5f60c08789031215613150575f5ffd5b61315987612ced565b955060208701359450604087013593506131756060880161312b565b9598949750929560808101359460a0909101359350915050565b5f5f5f5f5f5f5f60e0888a0312156131a5575f5ffd5b6131ae88612ced565b96506131bc60208901612ced565b955060408801359450606088013593506131d86080890161312b565b9699959850939692959460a0840135945060c09093013592915050565b5f5f60408385031215613206575f5ffd5b61320f83612ced565b915061321d60208401612ced565b90509250929050565b5f5f60408385031215613237575f5ffd5b61324083612ced565b9150602083013563ffffffff81168114612dc0575f5ffd5b600181811c9082168061326c57607f821691505b6020821081036120f857634e487b7160e01b5f52602260045260245ffd5b5f6020828403121561329a575f5ffd5b5051919050565b634e487b7160e01b5f52601160045260245ffd5b80820180821115610700576107006132a1565b634e487b7160e01b5f52603260045260245ffd5b5f602082840312156132ec575f5ffd5b8151610a0681612d89565b81810381811115610700576107006132a1565b6020808252602b908201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960408201526a6e697469616c697a696e6760a81b606082015260800190565b634e487b7160e01b5f52601260045260245ffd5b5f8261338357634e487b7160e01b5f52601260045260245ffd5b500490565b601f82111561243e57805f5260205f20601f840160051c810160208510156133ad5750805b601f840160051c820191505b818110156110b3575f81556001016133b9565b815167ffffffffffffffff8111156133e6576133e6612eb2565b6133fa816133f48454613258565b84613388565b6020601f82116001811461342c575f83156134155750848201515b5f19600385901b1c1916600184901b1784556110b3565b5f84815260208120601f198516915b8281101561345b578785015182556020948501946001909201910161343b565b508482101561347857868401515f19600387901b60f8161c191681555b50505050600190811b01905550565b634e487b7160e01b5f52602160045260245ffdfea2646970667358221220139f8076160116bffae91ab9c53619b38a77772769caa771728ee4963d8a555e64736f6c634300081e0033",
}
⋮----
// EigenABI is the input ABI used to generate the binding from.
// Deprecated: Use EigenMetaData.ABI instead.
var EigenABI = EigenMetaData.ABI
⋮----
// EigenBin is the compiled bytecode used for deploying new contracts.
// Deprecated: Use EigenMetaData.Bin instead.
var EigenBin = EigenMetaData.Bin
⋮----
// DeployEigen deploys a new Ethereum contract, binding an instance of Eigen to it.
func DeployEigen(auth *bind.TransactOpts, backend bind.ContractBackend, _bEIGEN common.Address, _version string) (common.Address, *types.Transaction, *Eigen, error)
⋮----
// Eigen is an auto generated Go binding around an Ethereum contract.
type Eigen struct {
	EigenCaller     // Read-only binding to the contract
	EigenTransactor // Write-only binding to the contract
	EigenFilterer   // Log filterer for contract events
}
⋮----
EigenCaller     // Read-only binding to the contract
EigenTransactor // Write-only binding to the contract
EigenFilterer   // Log filterer for contract events
⋮----
// EigenCaller is an auto generated read-only Go binding around an Ethereum contract.
type EigenCaller struct {
	contract *bind.BoundContract // Generic contract wrapper for the low level calls
}
⋮----
contract *bind.BoundContract // Generic contract wrapper for the low level calls
⋮----
// EigenTransactor is an auto generated write-only Go binding around an Ethereum contract.
type EigenTransactor struct {
	contract *bind.BoundContract // Generic contract wrapper for the low level calls
}
⋮----
// EigenFilterer is an auto generated log filtering Go binding around an Ethereum contract events.
type EigenFilterer struct {
	contract *bind.BoundContract // Generic contract wrapper for the low level calls
}
⋮----
// EigenSession is an auto generated Go binding around an Ethereum contract,
// with pre-set call and transact options.
type EigenSession struct {
	Contract     *Eigen            // 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
}
⋮----
Contract     *Eigen            // 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
⋮----
// EigenCallerSession is an auto generated read-only Go binding around an Ethereum contract,
// with pre-set call options.
type EigenCallerSession struct {
	Contract *EigenCaller  // Generic contract caller binding to set the session for
	CallOpts bind.CallOpts // Call options to use throughout this session
}
⋮----
Contract *EigenCaller  // Generic contract caller binding to set the session for
CallOpts bind.CallOpts // Call options to use throughout this session
⋮----
// EigenTransactorSession is an auto generated write-only Go binding around an Ethereum contract,
// with pre-set transact options.
type EigenTransactorSession struct {
	Contract     *EigenTransactor  // Generic contract transactor binding to set the session for
	TransactOpts bind.TransactOpts // Transaction auth options to use throughout this session
}
⋮----
Contract     *EigenTransactor  // Generic contract transactor binding to set the session for
⋮----
// EigenRaw is an auto generated low-level Go binding around an Ethereum contract.
type EigenRaw struct {
	Contract *Eigen // Generic contract binding to access the raw methods on
}
⋮----
Contract *Eigen // Generic contract binding to access the raw methods on
⋮----
// EigenCallerRaw is an auto generated low-level read-only Go binding around an Ethereum contract.
type EigenCallerRaw struct {
	Contract *EigenCaller // Generic read-only contract binding to access the raw methods on
}
⋮----
Contract *EigenCaller // Generic read-only contract binding to access the raw methods on
⋮----
// EigenTransactorRaw is an auto generated low-level write-only Go binding around an Ethereum contract.
type EigenTransactorRaw struct {
	Contract *EigenTransactor // Generic write-only contract binding to access the raw methods on
}
⋮----
Contract *EigenTransactor // Generic write-only contract binding to access the raw methods on
⋮----
// NewEigen creates a new instance of Eigen, bound to a specific deployed contract.
func NewEigen(address common.Address, backend bind.ContractBackend) (*Eigen, error)
⋮----
// NewEigenCaller creates a new read-only instance of Eigen, bound to a specific deployed contract.
func NewEigenCaller(address common.Address, caller bind.ContractCaller) (*EigenCaller, error)
⋮----
// NewEigenTransactor creates a new write-only instance of Eigen, bound to a specific deployed contract.
func NewEigenTransactor(address common.Address, transactor bind.ContractTransactor) (*EigenTransactor, error)
⋮----
// NewEigenFilterer creates a new log filterer instance of Eigen, bound to a specific deployed contract.
func NewEigenFilterer(address common.Address, filterer bind.ContractFilterer) (*EigenFilterer, error)
⋮----
// bindEigen binds a generic wrapper to an already deployed contract.
func bindEigen(address common.Address, caller bind.ContractCaller, transactor bind.ContractTransactor, filterer bind.ContractFilterer) (*bind.BoundContract, error)
⋮----
// 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 (_Eigen *EigenRaw) Call(opts *bind.CallOpts, result *[]interface
⋮----
// Transfer initiates a plain transaction to move funds to the contract, calling
// its default method if one is available.
func (_Eigen *EigenRaw) Transfer(opts *bind.TransactOpts) (*types.Transaction, error)
⋮----
// Transact invokes the (paid) contract method with params as input values.
func (_Eigen *EigenRaw) Transact(opts *bind.TransactOpts, method string, params ...interface
⋮----
// CLOCKMODE is a free data retrieval call binding the contract method 0x4bf5d7e9.
//
// Solidity: function CLOCK_MODE() pure returns(string)
func (_Eigen *EigenCaller) CLOCKMODE(opts *bind.CallOpts) (string, error)
⋮----
var out []interface{}
⋮----
// DOMAINSEPARATOR is a free data retrieval call binding the contract method 0x3644e515.
⋮----
// Solidity: function DOMAIN_SEPARATOR() view returns(bytes32)
func (_Eigen *EigenCaller) DOMAINSEPARATOR(opts *bind.CallOpts) ([32]byte, error)
⋮----
// Allowance is a free data retrieval call binding the contract method 0xdd62ed3e.
⋮----
// Solidity: function allowance(address owner, address spender) view returns(uint256)
func (_Eigen *EigenCaller) Allowance(opts *bind.CallOpts, owner common.Address, spender common.Address) (*big.Int, error)
⋮----
// AllowedFrom is a free data retrieval call binding the contract method 0x0455e694.
⋮----
// Solidity: function allowedFrom(address ) view returns(bool)
func (_Eigen *EigenCaller) AllowedFrom(opts *bind.CallOpts, arg0 common.Address) (bool, error)
⋮----
// AllowedTo is a free data retrieval call binding the contract method 0x78aa33ba.
⋮----
// Solidity: function allowedTo(address ) view returns(bool)
func (_Eigen *EigenCaller) AllowedTo(opts *bind.CallOpts, arg0 common.Address) (bool, error)
⋮----
// BEIGEN is a free data retrieval call binding the contract method 0x3f4da4c6.
⋮----
// Solidity: function bEIGEN() view returns(address)
func (_Eigen *EigenCaller) BEIGEN(opts *bind.CallOpts) (common.Address, error)
⋮----
// BalanceOf is a free data retrieval call binding the contract method 0x70a08231.
⋮----
// Solidity: function balanceOf(address account) view returns(uint256)
func (_Eigen *EigenCaller) BalanceOf(opts *bind.CallOpts, account common.Address) (*big.Int, error)
⋮----
// Checkpoints is a free data retrieval call binding the contract method 0xf1127ed8.
⋮----
// Solidity: function checkpoints(address account, uint32 pos) view returns((uint32,uint224))
func (_Eigen *EigenCaller) Checkpoints(opts *bind.CallOpts, account common.Address, pos uint32) (ERC20VotesUpgradeableCheckpoint, error)
⋮----
// Clock is a free data retrieval call binding the contract method 0x91ddadf4.
⋮----
// Solidity: function clock() view returns(uint48)
func (_Eigen *EigenCaller) Clock(opts *bind.CallOpts) (*big.Int, error)
⋮----
// Decimals is a free data retrieval call binding the contract method 0x313ce567.
⋮----
// Solidity: function decimals() view returns(uint8)
func (_Eigen *EigenCaller) Decimals(opts *bind.CallOpts) (uint8, error)
⋮----
// Delegates is a free data retrieval call binding the contract method 0x587cde1e.
⋮----
// Solidity: function delegates(address account) view returns(address)
func (_Eigen *EigenCaller) Delegates(opts *bind.CallOpts, account common.Address) (common.Address, error)
⋮----
// Eip712Domain is a free data retrieval call binding the contract method 0x84b0196e.
⋮----
// Solidity: function eip712Domain() view returns(bytes1 fields, string name, string version, uint256 chainId, address verifyingContract, bytes32 salt, uint256[] extensions)
func (_Eigen *EigenCaller) Eip712Domain(opts *bind.CallOpts) (struct
⋮----
// GetPastTotalSupply is a free data retrieval call binding the contract method 0x8e539e8c.
⋮----
// Solidity: function getPastTotalSupply(uint256 timepoint) view returns(uint256)
func (_Eigen *EigenCaller) GetPastTotalSupply(opts *bind.CallOpts, timepoint *big.Int) (*big.Int, error)
⋮----
// GetPastVotes is a free data retrieval call binding the contract method 0x3a46b1a8.
⋮----
// Solidity: function getPastVotes(address account, uint256 timepoint) view returns(uint256)
func (_Eigen *EigenCaller) GetPastVotes(opts *bind.CallOpts, account common.Address, timepoint *big.Int) (*big.Int, error)
⋮----
// GetVotes is a free data retrieval call binding the contract method 0x9ab24eb0.
⋮----
// Solidity: function getVotes(address account) view returns(uint256)
func (_Eigen *EigenCaller) GetVotes(opts *bind.CallOpts, account common.Address) (*big.Int, error)
⋮----
// MintAllowedAfter is a free data retrieval call binding the contract method 0x53957125.
⋮----
// Solidity: function mintAllowedAfter(address ) view returns(uint256)
func (_Eigen *EigenCaller) MintAllowedAfter(opts *bind.CallOpts, arg0 common.Address) (*big.Int, error)
⋮----
// MintingAllowance is a free data retrieval call binding the contract method 0x81b97161.
⋮----
// Solidity: function mintingAllowance(address ) view returns(uint256)
func (_Eigen *EigenCaller) MintingAllowance(opts *bind.CallOpts, arg0 common.Address) (*big.Int, error)
⋮----
// Name is a free data retrieval call binding the contract method 0x06fdde03.
⋮----
// Solidity: function name() view returns(string)
func (_Eigen *EigenCaller) Name(opts *bind.CallOpts) (string, error)
⋮----
// Nonces is a free data retrieval call binding the contract method 0x7ecebe00.
⋮----
// Solidity: function nonces(address owner) view returns(uint256)
func (_Eigen *EigenCaller) Nonces(opts *bind.CallOpts, owner common.Address) (*big.Int, error)
⋮----
// NumCheckpoints is a free data retrieval call binding the contract method 0x6fcfff45.
⋮----
// Solidity: function numCheckpoints(address account) view returns(uint32)
func (_Eigen *EigenCaller) NumCheckpoints(opts *bind.CallOpts, account common.Address) (uint32, error)
⋮----
// Owner is a free data retrieval call binding the contract method 0x8da5cb5b.
⋮----
// Solidity: function owner() view returns(address)
func (_Eigen *EigenCaller) Owner(opts *bind.CallOpts) (common.Address, error)
⋮----
// Symbol is a free data retrieval call binding the contract method 0x95d89b41.
⋮----
// Solidity: function symbol() view returns(string)
func (_Eigen *EigenCaller) Symbol(opts *bind.CallOpts) (string, error)
⋮----
// TotalSupply is a free data retrieval call binding the contract method 0x18160ddd.
⋮----
// Solidity: function totalSupply() view returns(uint256)
func (_Eigen *EigenCaller) TotalSupply(opts *bind.CallOpts) (*big.Int, error)
⋮----
// TransferRestrictionsDisabledAfter is a free data retrieval call binding the contract method 0x9aec4bae.
⋮----
// Solidity: function transferRestrictionsDisabledAfter() view returns(uint256)
func (_Eigen *EigenCaller) TransferRestrictionsDisabledAfter(opts *bind.CallOpts) (*big.Int, error)
⋮----
// Version is a free data retrieval call binding the contract method 0x54fd4d50.
⋮----
// Solidity: function version() view returns(string)
func (_Eigen *EigenCaller) Version(opts *bind.CallOpts) (string, error)
⋮----
// Approve is a paid mutator transaction binding the contract method 0x095ea7b3.
⋮----
// Solidity: function approve(address spender, uint256 amount) returns(bool)
func (_Eigen *EigenTransactor) Approve(opts *bind.TransactOpts, spender common.Address, amount *big.Int) (*types.Transaction, error)
⋮----
// DecreaseAllowance is a paid mutator transaction binding the contract method 0xa457c2d7.
⋮----
// Solidity: function decreaseAllowance(address spender, uint256 subtractedValue) returns(bool)
func (_Eigen *EigenTransactor) DecreaseAllowance(opts *bind.TransactOpts, spender common.Address, subtractedValue *big.Int) (*types.Transaction, error)
⋮----
// Delegate is a paid mutator transaction binding the contract method 0x5c19a95c.
⋮----
// Solidity: function delegate(address delegatee) returns()
func (_Eigen *EigenTransactor) Delegate(opts *bind.TransactOpts, delegatee common.Address) (*types.Transaction, error)
⋮----
// DelegateBySig is a paid mutator transaction binding the contract method 0xc3cda520.
⋮----
// Solidity: function delegateBySig(address delegatee, uint256 nonce, uint256 expiry, uint8 v, bytes32 r, bytes32 s) returns()
func (_Eigen *EigenTransactor) DelegateBySig(opts *bind.TransactOpts, delegatee common.Address, nonce *big.Int, expiry *big.Int, v uint8, r [32]byte, s [32]byte) (*types.Transaction, error)
⋮----
// DisableTransferRestrictions is a paid mutator transaction binding the contract method 0xeb415f45.
⋮----
// Solidity: function disableTransferRestrictions() returns()
func (_Eigen *EigenTransactor) DisableTransferRestrictions(opts *bind.TransactOpts) (*types.Transaction, error)
⋮----
// IncreaseAllowance is a paid mutator transaction binding the contract method 0x39509351.
⋮----
// Solidity: function increaseAllowance(address spender, uint256 addedValue) returns(bool)
func (_Eigen *EigenTransactor) IncreaseAllowance(opts *bind.TransactOpts, spender common.Address, addedValue *big.Int) (*types.Transaction, error)
⋮----
// Initialize is a paid mutator transaction binding the contract method 0xa7d1195d.
⋮----
// Solidity: function initialize(address initialOwner, address[] minters, uint256[] mintingAllowances, uint256[] mintAllowedAfters) returns()
func (_Eigen *EigenTransactor) Initialize(opts *bind.TransactOpts, initialOwner common.Address, minters []common.Address, mintingAllowances []*big.Int, mintAllowedAfters []*big.Int) (*types.Transaction, error)
⋮----
// Mint is a paid mutator transaction binding the contract method 0x1249c58b.
⋮----
// Solidity: function mint() returns()
func (_Eigen *EigenTransactor) Mint(opts *bind.TransactOpts) (*types.Transaction, error)
⋮----
// Multisend is a paid mutator transaction binding the contract method 0xaad41a41.
⋮----
// Solidity: function multisend(address[] receivers, uint256[] amounts) returns()
func (_Eigen *EigenTransactor) Multisend(opts *bind.TransactOpts, receivers []common.Address, amounts []*big.Int) (*types.Transaction, error)
⋮----
// Permit is a paid mutator transaction binding the contract method 0xd505accf.
⋮----
// Solidity: function permit(address owner, address spender, uint256 value, uint256 deadline, uint8 v, bytes32 r, bytes32 s) returns()
func (_Eigen *EigenTransactor) Permit(opts *bind.TransactOpts, owner common.Address, spender common.Address, value *big.Int, deadline *big.Int, v uint8, r [32]byte, s [32]byte) (*types.Transaction, error)
⋮----
// RenounceOwnership is a paid mutator transaction binding the contract method 0x715018a6.
⋮----
// Solidity: function renounceOwnership() returns()
func (_Eigen *EigenTransactor) RenounceOwnership(opts *bind.TransactOpts) (*types.Transaction, error)
⋮----
// SetAllowedFrom is a paid mutator transaction binding the contract method 0x1ffacdef.
⋮----
// Solidity: function setAllowedFrom(address from, bool isAllowedFrom) returns()
func (_Eigen *EigenTransactor) SetAllowedFrom(opts *bind.TransactOpts, from common.Address, isAllowedFrom bool) (*types.Transaction, error)
⋮----
// SetAllowedTo is a paid mutator transaction binding the contract method 0xb8c25594.
⋮----
// Solidity: function setAllowedTo(address to, bool isAllowedTo) returns()
func (_Eigen *EigenTransactor) SetAllowedTo(opts *bind.TransactOpts, to common.Address, isAllowedTo bool) (*types.Transaction, error)
⋮----
// Transfer is a paid mutator transaction binding the contract method 0xa9059cbb.
⋮----
// Solidity: function transfer(address to, uint256 amount) returns(bool)
⋮----
// TransferFrom is a paid mutator transaction binding the contract method 0x23b872dd.
⋮----
// Solidity: function transferFrom(address from, address to, uint256 amount) returns(bool)
func (_Eigen *EigenTransactor) TransferFrom(opts *bind.TransactOpts, from common.Address, to common.Address, amount *big.Int) (*types.Transaction, error)
⋮----
// TransferOwnership is a paid mutator transaction binding the contract method 0xf2fde38b.
⋮----
// Solidity: function transferOwnership(address newOwner) returns()
func (_Eigen *EigenTransactor) TransferOwnership(opts *bind.TransactOpts, newOwner common.Address) (*types.Transaction, error)
⋮----
// Unwrap is a paid mutator transaction binding the contract method 0xde0e9a3e.
⋮----
// Solidity: function unwrap(uint256 amount) returns()
func (_Eigen *EigenTransactor) Unwrap(opts *bind.TransactOpts, amount *big.Int) (*types.Transaction, error)
⋮----
// Wrap is a paid mutator transaction binding the contract method 0xea598cb0.
⋮----
// Solidity: function wrap(uint256 amount) returns()
func (_Eigen *EigenTransactor) Wrap(opts *bind.TransactOpts, amount *big.Int) (*types.Transaction, error)
⋮----
// EigenApprovalIterator is returned from FilterApproval and is used to iterate over the raw logs and unpacked data for Approval events raised by the Eigen contract.
type EigenApprovalIterator struct {
	Event *EigenApproval // 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
}
⋮----
Event *EigenApproval // 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 *EigenApprovalIterator) Next() bool
⋮----
// If the iterator failed, stop iterating
⋮----
// If the iterator completed, deliver directly whatever's available
⋮----
// Iterator still in progress, wait for either a data or an error event
⋮----
// Error returns any retrieval or parsing error occurred during filtering.
func (it *EigenApprovalIterator) Error() error
⋮----
// Close terminates the iteration process, releasing any pending underlying
// resources.
func (it *EigenApprovalIterator) Close() error
⋮----
// EigenApproval represents a Approval event raised by the Eigen contract.
type EigenApproval struct {
	Owner   common.Address
	Spender common.Address
	Value   *big.Int
	Raw     types.Log // Blockchain specific contextual infos
}
⋮----
Raw     types.Log // Blockchain specific contextual infos
⋮----
// FilterApproval is a free log retrieval operation binding the contract event 0x8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925.
⋮----
// Solidity: event Approval(address indexed owner, address indexed spender, uint256 value)
func (_Eigen *EigenFilterer) FilterApproval(opts *bind.FilterOpts, owner []common.Address, spender []common.Address) (*EigenApprovalIterator, error)
⋮----
var ownerRule []interface{}
⋮----
var spenderRule []interface{}
⋮----
// WatchApproval is a free log subscription operation binding the contract event 0x8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925.
⋮----
func (_Eigen *EigenFilterer) WatchApproval(opts *bind.WatchOpts, sink chan<- *EigenApproval, owner []common.Address, spender []common.Address) (event.Subscription, error)
⋮----
// New log arrived, parse the event and forward to the user
⋮----
// ParseApproval is a log parse operation binding the contract event 0x8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925.
⋮----
func (_Eigen *EigenFilterer) ParseApproval(log types.Log) (*EigenApproval, error)
⋮----
// EigenDelegateChangedIterator is returned from FilterDelegateChanged and is used to iterate over the raw logs and unpacked data for DelegateChanged events raised by the Eigen contract.
type EigenDelegateChangedIterator struct {
	Event *EigenDelegateChanged // 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
}
⋮----
Event *EigenDelegateChanged // Event containing the contract specifics and raw log
⋮----
// EigenDelegateChanged represents a DelegateChanged event raised by the Eigen contract.
type EigenDelegateChanged struct {
	Delegator    common.Address
	FromDelegate common.Address
	ToDelegate   common.Address
	Raw          types.Log // Blockchain specific contextual infos
}
⋮----
Raw          types.Log // Blockchain specific contextual infos
⋮----
// FilterDelegateChanged is a free log retrieval operation binding the contract event 0x3134e8a2e6d97e929a7e54011ea5485d7d196dd5f0ba4d4ef95803e8e3fc257f.
⋮----
// Solidity: event DelegateChanged(address indexed delegator, address indexed fromDelegate, address indexed toDelegate)
func (_Eigen *EigenFilterer) FilterDelegateChanged(opts *bind.FilterOpts, delegator []common.Address, fromDelegate []common.Address, toDelegate []common.Address) (*EigenDelegateChangedIterator, error)
⋮----
var delegatorRule []interface{}
⋮----
var fromDelegateRule []interface{}
⋮----
var toDelegateRule []interface{}
⋮----
// WatchDelegateChanged is a free log subscription operation binding the contract event 0x3134e8a2e6d97e929a7e54011ea5485d7d196dd5f0ba4d4ef95803e8e3fc257f.
⋮----
func (_Eigen *EigenFilterer) WatchDelegateChanged(opts *bind.WatchOpts, sink chan<- *EigenDelegateChanged, delegator []common.Address, fromDelegate []common.Address, toDelegate []common.Address) (event.Subscription, error)
⋮----
// ParseDelegateChanged is a log parse operation binding the contract event 0x3134e8a2e6d97e929a7e54011ea5485d7d196dd5f0ba4d4ef95803e8e3fc257f.
⋮----
func (_Eigen *EigenFilterer) ParseDelegateChanged(log types.Log) (*EigenDelegateChanged, error)
⋮----
// EigenDelegateVotesChangedIterator is returned from FilterDelegateVotesChanged and is used to iterate over the raw logs and unpacked data for DelegateVotesChanged events raised by the Eigen contract.
type EigenDelegateVotesChangedIterator struct {
	Event *EigenDelegateVotesChanged // 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
}
⋮----
Event *EigenDelegateVotesChanged // Event containing the contract specifics and raw log
⋮----
// EigenDelegateVotesChanged represents a DelegateVotesChanged event raised by the Eigen contract.
type EigenDelegateVotesChanged struct {
	Delegate        common.Address
	PreviousBalance *big.Int
	NewBalance      *big.Int
	Raw             types.Log // Blockchain specific contextual infos
}
⋮----
Raw             types.Log // Blockchain specific contextual infos
⋮----
// FilterDelegateVotesChanged is a free log retrieval operation binding the contract event 0xdec2bacdd2f05b59de34da9b523dff8be42e5e38e818c82fdb0bae774387a724.
⋮----
// Solidity: event DelegateVotesChanged(address indexed delegate, uint256 previousBalance, uint256 newBalance)
func (_Eigen *EigenFilterer) FilterDelegateVotesChanged(opts *bind.FilterOpts, delegate []common.Address) (*EigenDelegateVotesChangedIterator, error)
⋮----
var delegateRule []interface{}
⋮----
// WatchDelegateVotesChanged is a free log subscription operation binding the contract event 0xdec2bacdd2f05b59de34da9b523dff8be42e5e38e818c82fdb0bae774387a724.
⋮----
func (_Eigen *EigenFilterer) WatchDelegateVotesChanged(opts *bind.WatchOpts, sink chan<- *EigenDelegateVotesChanged, delegate []common.Address) (event.Subscription, error)
⋮----
// ParseDelegateVotesChanged is a log parse operation binding the contract event 0xdec2bacdd2f05b59de34da9b523dff8be42e5e38e818c82fdb0bae774387a724.
⋮----
func (_Eigen *EigenFilterer) ParseDelegateVotesChanged(log types.Log) (*EigenDelegateVotesChanged, error)
⋮----
// EigenEIP712DomainChangedIterator is returned from FilterEIP712DomainChanged and is used to iterate over the raw logs and unpacked data for EIP712DomainChanged events raised by the Eigen contract.
type EigenEIP712DomainChangedIterator struct {
	Event *EigenEIP712DomainChanged // 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
}
⋮----
Event *EigenEIP712DomainChanged // Event containing the contract specifics and raw log
⋮----
// EigenEIP712DomainChanged represents a EIP712DomainChanged event raised by the Eigen contract.
type EigenEIP712DomainChanged struct {
	Raw types.Log // Blockchain specific contextual infos
}
⋮----
Raw types.Log // Blockchain specific contextual infos
⋮----
// FilterEIP712DomainChanged is a free log retrieval operation binding the contract event 0x0a6387c9ea3628b88a633bb4f3b151770f70085117a15f9bf3787cda53f13d31.
⋮----
// Solidity: event EIP712DomainChanged()
func (_Eigen *EigenFilterer) FilterEIP712DomainChanged(opts *bind.FilterOpts) (*EigenEIP712DomainChangedIterator, error)
⋮----
// WatchEIP712DomainChanged is a free log subscription operation binding the contract event 0x0a6387c9ea3628b88a633bb4f3b151770f70085117a15f9bf3787cda53f13d31.
⋮----
func (_Eigen *EigenFilterer) WatchEIP712DomainChanged(opts *bind.WatchOpts, sink chan<- *EigenEIP712DomainChanged) (event.Subscription, error)
⋮----
// ParseEIP712DomainChanged is a log parse operation binding the contract event 0x0a6387c9ea3628b88a633bb4f3b151770f70085117a15f9bf3787cda53f13d31.
⋮----
func (_Eigen *EigenFilterer) ParseEIP712DomainChanged(log types.Log) (*EigenEIP712DomainChanged, error)
⋮----
// EigenInitializedIterator is returned from FilterInitialized and is used to iterate over the raw logs and unpacked data for Initialized events raised by the Eigen contract.
type EigenInitializedIterator struct {
	Event *EigenInitialized // 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
}
⋮----
Event *EigenInitialized // Event containing the contract specifics and raw log
⋮----
// EigenInitialized represents a Initialized event raised by the Eigen contract.
type EigenInitialized 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 (_Eigen *EigenFilterer) FilterInitialized(opts *bind.FilterOpts) (*EigenInitializedIterator, error)
⋮----
// WatchInitialized is a free log subscription operation binding the contract event 0x7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb3847402498.
⋮----
func (_Eigen *EigenFilterer) WatchInitialized(opts *bind.WatchOpts, sink chan<- *EigenInitialized) (event.Subscription, error)
⋮----
// ParseInitialized is a log parse operation binding the contract event 0x7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb3847402498.
⋮----
func (_Eigen *EigenFilterer) ParseInitialized(log types.Log) (*EigenInitialized, error)
⋮----
// EigenMintIterator is returned from FilterMint and is used to iterate over the raw logs and unpacked data for Mint events raised by the Eigen contract.
type EigenMintIterator struct {
	Event *EigenMint // 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
}
⋮----
Event *EigenMint // Event containing the contract specifics and raw log
⋮----
// EigenMint represents a Mint event raised by the Eigen contract.
type EigenMint struct {
	Minter common.Address
	Amount *big.Int
	Raw    types.Log // Blockchain specific contextual infos
}
⋮----
Raw    types.Log // Blockchain specific contextual infos
⋮----
// FilterMint is a free log retrieval operation binding the contract event 0x0f6798a560793a54c3bcfe86a93cde1e73087d944c0ea20544137d4121396885.
⋮----
// Solidity: event Mint(address indexed minter, uint256 amount)
func (_Eigen *EigenFilterer) FilterMint(opts *bind.FilterOpts, minter []common.Address) (*EigenMintIterator, error)
⋮----
var minterRule []interface{}
⋮----
// WatchMint is a free log subscription operation binding the contract event 0x0f6798a560793a54c3bcfe86a93cde1e73087d944c0ea20544137d4121396885.
⋮----
func (_Eigen *EigenFilterer) WatchMint(opts *bind.WatchOpts, sink chan<- *EigenMint, minter []common.Address) (event.Subscription, error)
⋮----
// ParseMint is a log parse operation binding the contract event 0x0f6798a560793a54c3bcfe86a93cde1e73087d944c0ea20544137d4121396885.
⋮----
func (_Eigen *EigenFilterer) ParseMint(log types.Log) (*EigenMint, error)
⋮----
// EigenOwnershipTransferredIterator is returned from FilterOwnershipTransferred and is used to iterate over the raw logs and unpacked data for OwnershipTransferred events raised by the Eigen contract.
type EigenOwnershipTransferredIterator struct {
	Event *EigenOwnershipTransferred // 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
}
⋮----
Event *EigenOwnershipTransferred // Event containing the contract specifics and raw log
⋮----
// EigenOwnershipTransferred represents a OwnershipTransferred event raised by the Eigen contract.
type EigenOwnershipTransferred struct {
	PreviousOwner common.Address
	NewOwner      common.Address
	Raw           types.Log // Blockchain specific contextual infos
}
⋮----
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 (_Eigen *EigenFilterer) FilterOwnershipTransferred(opts *bind.FilterOpts, previousOwner []common.Address, newOwner []common.Address) (*EigenOwnershipTransferredIterator, error)
⋮----
var previousOwnerRule []interface{}
⋮----
var newOwnerRule []interface{}
⋮----
// WatchOwnershipTransferred is a free log subscription operation binding the contract event 0x8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0.
⋮----
func (_Eigen *EigenFilterer) WatchOwnershipTransferred(opts *bind.WatchOpts, sink chan<- *EigenOwnershipTransferred, previousOwner []common.Address, newOwner []common.Address) (event.Subscription, error)
⋮----
// ParseOwnershipTransferred is a log parse operation binding the contract event 0x8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0.
⋮----
func (_Eigen *EigenFilterer) ParseOwnershipTransferred(log types.Log) (*EigenOwnershipTransferred, error)
⋮----
// EigenSetAllowedFromIterator is returned from FilterSetAllowedFrom and is used to iterate over the raw logs and unpacked data for SetAllowedFrom events raised by the Eigen contract.
type EigenSetAllowedFromIterator struct {
	Event *EigenSetAllowedFrom // 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
}
⋮----
Event *EigenSetAllowedFrom // Event containing the contract specifics and raw log
⋮----
// EigenSetAllowedFrom represents a SetAllowedFrom event raised by the Eigen contract.
type EigenSetAllowedFrom struct {
	From          common.Address
	IsAllowedFrom bool
	Raw           types.Log // Blockchain specific contextual infos
}
⋮----
// FilterSetAllowedFrom is a free log retrieval operation binding the contract event 0xcf20b1ecb604b0e8888d579c64e8a3b10e590d45c1c2dddb393bed2843622271.
⋮----
// Solidity: event SetAllowedFrom(address indexed from, bool isAllowedFrom)
func (_Eigen *EigenFilterer) FilterSetAllowedFrom(opts *bind.FilterOpts, from []common.Address) (*EigenSetAllowedFromIterator, error)
⋮----
var fromRule []interface{}
⋮----
// WatchSetAllowedFrom is a free log subscription operation binding the contract event 0xcf20b1ecb604b0e8888d579c64e8a3b10e590d45c1c2dddb393bed2843622271.
⋮----
func (_Eigen *EigenFilterer) WatchSetAllowedFrom(opts *bind.WatchOpts, sink chan<- *EigenSetAllowedFrom, from []common.Address) (event.Subscription, error)
⋮----
// ParseSetAllowedFrom is a log parse operation binding the contract event 0xcf20b1ecb604b0e8888d579c64e8a3b10e590d45c1c2dddb393bed2843622271.
⋮----
func (_Eigen *EigenFilterer) ParseSetAllowedFrom(log types.Log) (*EigenSetAllowedFrom, error)
⋮----
// EigenSetAllowedToIterator is returned from FilterSetAllowedTo and is used to iterate over the raw logs and unpacked data for SetAllowedTo events raised by the Eigen contract.
type EigenSetAllowedToIterator struct {
	Event *EigenSetAllowedTo // 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
}
⋮----
Event *EigenSetAllowedTo // Event containing the contract specifics and raw log
⋮----
// EigenSetAllowedTo represents a SetAllowedTo event raised by the Eigen contract.
type EigenSetAllowedTo struct {
	To          common.Address
	IsAllowedTo bool
	Raw         types.Log // Blockchain specific contextual infos
}
⋮----
Raw         types.Log // Blockchain specific contextual infos
⋮----
// FilterSetAllowedTo is a free log retrieval operation binding the contract event 0x72a561d1af7409467dae4f1e9fc52590a9335a1dda17727e2b6aa8c4db35109b.
⋮----
// Solidity: event SetAllowedTo(address indexed to, bool isAllowedTo)
func (_Eigen *EigenFilterer) FilterSetAllowedTo(opts *bind.FilterOpts, to []common.Address) (*EigenSetAllowedToIterator, error)
⋮----
var toRule []interface{}
⋮----
// WatchSetAllowedTo is a free log subscription operation binding the contract event 0x72a561d1af7409467dae4f1e9fc52590a9335a1dda17727e2b6aa8c4db35109b.
⋮----
func (_Eigen *EigenFilterer) WatchSetAllowedTo(opts *bind.WatchOpts, sink chan<- *EigenSetAllowedTo, to []common.Address) (event.Subscription, error)
⋮----
// ParseSetAllowedTo is a log parse operation binding the contract event 0x72a561d1af7409467dae4f1e9fc52590a9335a1dda17727e2b6aa8c4db35109b.
⋮----
func (_Eigen *EigenFilterer) ParseSetAllowedTo(log types.Log) (*EigenSetAllowedTo, error)
⋮----
// EigenTokenUnwrappedIterator is returned from FilterTokenUnwrapped and is used to iterate over the raw logs and unpacked data for TokenUnwrapped events raised by the Eigen contract.
type EigenTokenUnwrappedIterator struct {
	Event *EigenTokenUnwrapped // 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
}
⋮----
Event *EigenTokenUnwrapped // Event containing the contract specifics and raw log
⋮----
// EigenTokenUnwrapped represents a TokenUnwrapped event raised by the Eigen contract.
type EigenTokenUnwrapped struct {
	Account common.Address
	Amount  *big.Int
	Raw     types.Log // Blockchain specific contextual infos
}
⋮----
// FilterTokenUnwrapped is a free log retrieval operation binding the contract event 0x7f8146ca1ae17ad17561461ef221d97c8160bfddcae0edb68f53ce8dc5ce4af3.
⋮----
// Solidity: event TokenUnwrapped(address indexed account, uint256 amount)
func (_Eigen *EigenFilterer) FilterTokenUnwrapped(opts *bind.FilterOpts, account []common.Address) (*EigenTokenUnwrappedIterator, error)
⋮----
var accountRule []interface{}
⋮----
// WatchTokenUnwrapped is a free log subscription operation binding the contract event 0x7f8146ca1ae17ad17561461ef221d97c8160bfddcae0edb68f53ce8dc5ce4af3.
⋮----
func (_Eigen *EigenFilterer) WatchTokenUnwrapped(opts *bind.WatchOpts, sink chan<- *EigenTokenUnwrapped, account []common.Address) (event.Subscription, error)
⋮----
// ParseTokenUnwrapped is a log parse operation binding the contract event 0x7f8146ca1ae17ad17561461ef221d97c8160bfddcae0edb68f53ce8dc5ce4af3.
⋮----
func (_Eigen *EigenFilterer) ParseTokenUnwrapped(log types.Log) (*EigenTokenUnwrapped, error)
⋮----
// EigenTokenWrappedIterator is returned from FilterTokenWrapped and is used to iterate over the raw logs and unpacked data for TokenWrapped events raised by the Eigen contract.
type EigenTokenWrappedIterator struct {
	Event *EigenTokenWrapped // 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
}
⋮----
Event *EigenTokenWrapped // Event containing the contract specifics and raw log
⋮----
// EigenTokenWrapped represents a TokenWrapped event raised by the Eigen contract.
type EigenTokenWrapped struct {
	Account common.Address
	Amount  *big.Int
	Raw     types.Log // Blockchain specific contextual infos
}
⋮----
// FilterTokenWrapped is a free log retrieval operation binding the contract event 0x2273a99739c31a37346636a3013c2cedebee7cd5b4c560faded39d298c1dd45c.
⋮----
// Solidity: event TokenWrapped(address indexed account, uint256 amount)
func (_Eigen *EigenFilterer) FilterTokenWrapped(opts *bind.FilterOpts, account []common.Address) (*EigenTokenWrappedIterator, error)
⋮----
// WatchTokenWrapped is a free log subscription operation binding the contract event 0x2273a99739c31a37346636a3013c2cedebee7cd5b4c560faded39d298c1dd45c.
⋮----
func (_Eigen *EigenFilterer) WatchTokenWrapped(opts *bind.WatchOpts, sink chan<- *EigenTokenWrapped, account []common.Address) (event.Subscription, error)
⋮----
// ParseTokenWrapped is a log parse operation binding the contract event 0x2273a99739c31a37346636a3013c2cedebee7cd5b4c560faded39d298c1dd45c.
⋮----
func (_Eigen *EigenFilterer) ParseTokenWrapped(log types.Log) (*EigenTokenWrapped, error)
⋮----
// EigenTransferIterator is returned from FilterTransfer and is used to iterate over the raw logs and unpacked data for Transfer events raised by the Eigen contract.
type EigenTransferIterator struct {
	Event *EigenTransfer // 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
}
⋮----
Event *EigenTransfer // Event containing the contract specifics and raw log
⋮----
// EigenTransfer represents a Transfer event raised by the Eigen contract.
type EigenTransfer struct {
	From  common.Address
	To    common.Address
	Value *big.Int
	Raw   types.Log // Blockchain specific contextual infos
}
⋮----
Raw   types.Log // Blockchain specific contextual infos
⋮----
// FilterTransfer is a free log retrieval operation binding the contract event 0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef.
⋮----
// Solidity: event Transfer(address indexed from, address indexed to, uint256 value)
func (_Eigen *EigenFilterer) FilterTransfer(opts *bind.FilterOpts, from []common.Address, to []common.Address) (*EigenTransferIterator, error)
⋮----
// WatchTransfer is a free log subscription operation binding the contract event 0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef.
⋮----
func (_Eigen *EigenFilterer) WatchTransfer(opts *bind.WatchOpts, sink chan<- *EigenTransfer, from []common.Address, to []common.Address) (event.Subscription, error)
⋮----
// ParseTransfer is a log parse operation binding the contract event 0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef.
⋮----
func (_Eigen *EigenFilterer) ParseTransfer(log types.Log) (*EigenTransfer, error)
⋮----
// EigenTransferRestrictionsDisabledIterator is returned from FilterTransferRestrictionsDisabled and is used to iterate over the raw logs and unpacked data for TransferRestrictionsDisabled events raised by the Eigen contract.
type EigenTransferRestrictionsDisabledIterator struct {
	Event *EigenTransferRestrictionsDisabled // 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
}
⋮----
Event *EigenTransferRestrictionsDisabled // Event containing the contract specifics and raw log
⋮----
// EigenTransferRestrictionsDisabled represents a TransferRestrictionsDisabled event raised by the Eigen contract.
type EigenTransferRestrictionsDisabled struct {
	Raw types.Log // Blockchain specific contextual infos
}
⋮----
// FilterTransferRestrictionsDisabled is a free log retrieval operation binding the contract event 0x2b18986d3ba809db2f13a5d7bf17f60d357b37d9cbb55dd71cbbac8dc4060f64.
⋮----
// Solidity: event TransferRestrictionsDisabled()
func (_Eigen *EigenFilterer) FilterTransferRestrictionsDisabled(opts *bind.FilterOpts) (*EigenTransferRestrictionsDisabledIterator, error)
⋮----
// WatchTransferRestrictionsDisabled is a free log subscription operation binding the contract event 0x2b18986d3ba809db2f13a5d7bf17f60d357b37d9cbb55dd71cbbac8dc4060f64.
⋮----
func (_Eigen *EigenFilterer) WatchTransferRestrictionsDisabled(opts *bind.WatchOpts, sink chan<- *EigenTransferRestrictionsDisabled) (event.Subscription, error)
⋮----
// ParseTransferRestrictionsDisabled is a log parse operation binding the contract event 0x2b18986d3ba809db2f13a5d7bf17f60d357b37d9cbb55dd71cbbac8dc4060f64.
⋮----
func (_Eigen *EigenFilterer) ParseTransferRestrictionsDisabled(log types.Log) (*EigenTransferRestrictionsDisabled, error)
````

## File: pkg/bindings/EigenPod/binding.go
````go
// Code generated - DO NOT EDIT.
// This file is a generated binding and any manual changes will be lost.
⋮----
package EigenPod
⋮----
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"
)
⋮----
"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
)
⋮----
// BeaconChainProofsBalanceContainerProof is an auto generated low-level Go binding around an user-defined struct.
type BeaconChainProofsBalanceContainerProof struct {
	BalanceContainerRoot [32]byte
	Proof                []byte
}
⋮----
// BeaconChainProofsBalanceProof is an auto generated low-level Go binding around an user-defined struct.
type BeaconChainProofsBalanceProof struct {
	PubkeyHash  [32]byte
	BalanceRoot [32]byte
	Proof       []byte
}
⋮----
// BeaconChainProofsStateRootProof is an auto generated low-level Go binding around an user-defined struct.
type BeaconChainProofsStateRootProof struct {
	BeaconStateRoot [32]byte
	Proof           []byte
}
⋮----
// BeaconChainProofsValidatorProof is an auto generated low-level Go binding around an user-defined struct.
type BeaconChainProofsValidatorProof struct {
	ValidatorFields [][32]byte
	Proof           []byte
}
⋮----
// IEigenPodTypesCheckpoint is an auto generated low-level Go binding around an user-defined struct.
type IEigenPodTypesCheckpoint struct {
	BeaconBlockRoot       [32]byte
	ProofsRemaining       *big.Int
	PodBalanceGwei        uint64
	BalanceDeltasGwei     int64
	PrevBeaconBalanceGwei uint64
}
⋮----
// IEigenPodTypesConsolidationRequest is an auto generated low-level Go binding around an user-defined struct.
type IEigenPodTypesConsolidationRequest struct {
	SrcPubkey    []byte
	TargetPubkey []byte
}
⋮----
// IEigenPodTypesValidatorInfo is an auto generated low-level Go binding around an user-defined struct.
type IEigenPodTypesValidatorInfo struct {
	ValidatorIndex      uint64
	RestakedBalanceGwei uint64
	LastCheckpointedAt  uint64
	Status              uint8
}
⋮----
// IEigenPodTypesWithdrawalRequest is an auto generated low-level Go binding around an user-defined struct.
type IEigenPodTypesWithdrawalRequest struct {
	Pubkey     []byte
	AmountGwei uint64
}
⋮----
// 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: "0x60c060405234801561000f575f5ffd5b5060405161473838038061473883398101604081905261002e91610123565b6001600160a01b03808316608052811660a052610049610050565b505061015b565b5f54610100900460ff16156100bb5760405162461bcd60e51b815260206004820152602760248201527f496e697469616c697a61626c653a20636f6e747261637420697320696e697469604482015266616c697a696e6760c81b606482015260840160405180910390fd5b5f5460ff9081161461010a575f805460ff191660ff9081179091556040519081527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b565b6001600160a01b0381168114610120575f5ffd5b50565b5f5f60408385031215610134575f5ffd5b825161013f8161010c565b60208401519092506101508161010c565b809150509250929050565b60805160a05161455a6101de5f395f818161031e015281816106a801528181610750015281816109fe01528181610dbf01528181610fb9015281816110990152818161159a01528181611641015281816118ca01528181611c1801528181611d4c0152818161222201526130ef01525f818161054e01526116aa015261455a5ff3fe6080604052600436106101b2575f3560e01c80636c0d2d5a116100e7578063c44e30dc11610087578063d06d558711610062578063d06d558714610613578063dda3346c14610632578063ee94d67c14610651578063f074ba6214610670575f5ffd5b8063c44e30dc146105c1578063c4907442146105d5578063c4d66de8146105f4575f5ffd5b806374cdd798116100c257806374cdd7981461053d57806388676cad146105705780639b4e46341461058f578063b522538a146105a2575f5ffd5b80636c0d2d5a146104bd5780636fcd0e53146104dc5780637439841f14610508575f5ffd5b806342ecff2a1161015257806352396a591161012d57806352396a591461042b578063587533571461045f57806358eaee791461047e5780636691954e146104aa575f5ffd5b806342ecff2a146102e75780634665bcda1461030d57806347d2837214610340575f5ffd5b80632340e8d31161018d5780632340e8d31461026f5780633474aa16146102845780633f5fa57a146102b55780633f65cf19146102c8575f5ffd5b8063039157d2146101f05780630b18ff66146102115780631e5155331461024d575f5ffd5b366101ec576040513481527f6fdd3dbdb173299608c0aa9f368735857c8842b581f8389238bf05bd04b3bf499060200160405180910390a1005b5f5ffd5b3480156101fb575f5ffd5b5061020f61020a366004613a01565b61068f565b005b34801561021c575f5ffd5b50603354610230906001600160a01b031681565b6040516001600160a01b0390911681526020015b60405180910390f35b348015610258575f5ffd5b506102616109c4565b604051908152602001610244565b34801561027a575f5ffd5b5061026160395481565b34801561028f575f5ffd5b506034546001600160401b03165b6040516001600160401b039091168152602001610244565b61020f6102c3366004613abc565b6109e5565b3480156102d3575f5ffd5b5061020f6102e2366004613afa565b610d66565b3480156102f2575f5ffd5b50603a5461029d90600160401b90046001600160401b031681565b348015610318575f5ffd5b506102307f000000000000000000000000000000000000000000000000000000000000000081565b34801561034b575f5ffd5b506103d06040805160a0810182525f80825260208201819052918101829052606081018290526080810191909152506040805160a081018252603c548152603d5462ffffff811660208301526001600160401b0363010000008204811693830193909352600160581b810460070b6060830152600160981b9004909116608082015290565b60405161024491905f60a0820190508251825262ffffff60208401511660208301526001600160401b036040840151166040830152606083015160070b60608301526001600160401b03608084015116608083015292915050565b348015610436575f5ffd5b5061029d610445366004613bd1565b603b6020525f90815260409020546001600160401b031681565b34801561046a575f5ffd5b50603e54610230906001600160a01b031681565b348015610489575f5ffd5b5061049d610498366004613c29565b61101e565b6040516102449190613c8f565b61020f6104b8366004613abc565b611080565b3480156104c8575f5ffd5b506102616104d7366004613bd1565b611388565b3480156104e7575f5ffd5b506104fb6104f6366004613c9d565b611496565b6040516102449190613cb4565b348015610513575f5ffd5b5061049d610522366004613c9d565b5f90815260366020526040902054600160c01b900460ff1690565b348015610548575f5ffd5b506102307f000000000000000000000000000000000000000000000000000000000000000081565b34801561057b575f5ffd5b5061020f61058a366004613d14565b611541565b61020f61059d366004613d2f565b611636565b3480156105ad575f5ffd5b506104fb6105bc366004613c29565b6117b4565b3480156105cc575f5ffd5b506102616118a3565b3480156105e0575f5ffd5b5061020f6105ef366004613dc4565b6118bf565b3480156105ff575f5ffd5b5061020f61060e366004613dee565b6119f6565b34801561061e575f5ffd5b5061020f61062d366004613dee565b611b40565b34801561063d575f5ffd5b5061020f61064c366004613ed9565b611bd4565b34801561065c575f5ffd5b50603a5461029d906001600160401b031681565b34801561067b575f5ffd5b5061020f61068a366004613fab565b611d33565b604051635ac86ab760e01b8152600660048201819052907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031690635ac86ab790602401602060405180830381865afa1580156106f5573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906107199190614012565b156107375760405163840a48d560e01b815260040160405180910390fd5b604051635ac86ab760e01b8152600860048201819052907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031690635ac86ab790602401602060405180830381865afa15801561079d573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906107c19190614012565b156107df5760405163840a48d560e01b815260040160405180910390fd5b5f6108236107ed858061402d565b808060200260200160405190810160405280939291908181526020018383602002808284375f9201919091525061212f92505050565b5f818152603660209081526040808320815160808101835281546001600160401b038082168352600160401b8204811695830195909552600160801b8104909416928101929092529394509192906060830190600160c01b900460ff16600281111561089157610891613c5b565b60028111156108a2576108a2613c5b565b81525050905080604001516001600160401b0316876001600160401b0316116108de576040516337e07ffd60e01b815260040160405180910390fd5b6001816060015160028111156108f6576108f6613c5b565b146109145760405163d49e19a760e01b815260040160405180910390fd5b610957610921868061402d565b808060200260200160405190810160405280939291908181526020018383602002808284375f9201919091525061215192505050565b6109745760405163161ce5ed60e31b815260040160405180910390fd5b61098661098088611388565b87612179565b6109b26109928861221e565b873561099e888061402d565b6109ab60208b018b614072565b87516122f5565b6109bb5f612429565b50505050505050565b5f6109e071bbddc7ce488642fb579f8b00f3a5900072516125a9565b905090565b604051635ac86ab760e01b8152600a60048201819052907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031690635ac86ab790602401602060405180830381865afa158015610a4b573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610a6f9190614012565b15610a8d5760405163840a48d560e01b815260040160405180910390fd5b6033546001600160a01b0316331480610ab05750603e546001600160a01b031633145b610acd5760405163427a777960e01b815260040160405180910390fd5b5f610ad66118a3565b90505f610ae384836140c8565b905080341015610b065760405163356680b760e01b815260040160405180910390fd5b5f610b1182346140df565b90505f5b85811015610d4d5736878783818110610b3057610b306140f2565b9050602002810190610b429190614106565b90505f610b8b610b528380614072565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f9201919091525061262f92505050565b905060015f82815260366020526040902054600160c01b900460ff166002811115610bb857610bb8613c5b565b14610bd65760405163d49e19a760e01b815260040160405180910390fd5b5f610be18380614072565b610bf16040860160208701613bd1565b604051602001610c0393929190614124565b60405160208183030381529060405290505f710961ef480eb55e80d19ad83579a64c0070026001600160a01b03168883604051610c40919061415c565b5f6040518083038185875af1925050503d805f8114610c7a576040519150601f19603f3d011682016040523d82523d5f602084013e610c7f565b606091505b5050905080610ca15760405163fc52d48360e01b815260040160405180910390fd5b610cb16040850160208601613bd1565b6001600160401b03165f03610cef5760405183907f60d8ca014d4765a2b8b389e25714cb1cef83b574222911a01d90c1bd69d2d320905f90a2610d3d565b827f8b2737bb64ab2f2dc09552dfa1c250399e6a42c7ea9f0e1c658f5d65d708ec05610d216040870160208801613bd1565b6040516001600160401b03909116815260200160405180910390a25b505060019092019150610b159050565b508015610d5e57610d5e33826126c0565b505050505050565b6033546001600160a01b0316331480610d895750603e546001600160a01b031633145b610da65760405163427a777960e01b815260040160405180910390fd5b604051635ac86ab760e01b8152600260048201819052907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031690635ac86ab790602401602060405180830381865afa158015610e0c573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610e309190614012565b15610e4e5760405163840a48d560e01b815260040160405180910390fd5b8584148015610e5c57508382145b610e79576040516343714afd60e01b815260040160405180910390fd5b603a546001600160401b03600160401b9091048116908a1611610eaf576040516337e07ffd60e01b815260040160405180910390fd5b603a546001600160401b03908116908a1611610ede576040516335e7f6b760e01b815260040160405180910390fd5b610ef0610eea8a611388565b89612179565b5f805b87811015610f8957610f758b8b358b8b85818110610f1357610f136140f2565b9050602002016020810190610f289190614167565b8a8a86818110610f3a57610f3a6140f2565b9050602002810190610f4c9190614072565b8a8a88818110610f5e57610f5e6140f2565b9050602002810190610f70919061402d565b6127d5565b610f7f908361418b565b9150600101610ef3565b5060335460405163a1ca780b60e01b81526001600160a01b0391821660048201525f6024820152604481018390527f00000000000000000000000000000000000000000000000000000000000000009091169063a1ca780b906064015f604051808303815f87803b158015610ffc575f5ffd5b505af115801561100e573d5f5f3e3d5ffd5b5050505050505050505050505050565b5f5f61105e84848080601f0160208091040260200160405190810160405280939291908181526020018383808284375f9201919091525061262f92505050565b5f90815260366020526040902054600160c01b900460ff169150505b92915050565b604051635ac86ab760e01b8152600960048201819052907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031690635ac86ab790602401602060405180830381865afa1580156110e6573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061110a9190614012565b156111285760405163840a48d560e01b815260040160405180910390fd5b6033546001600160a01b031633148061114b5750603e546001600160a01b031633145b6111685760405163427a777960e01b815260040160405180910390fd5b5f6111716109c4565b90505f61117e84836140c8565b9050803410156111a15760405163356680b760e01b815260040160405180910390fd5b5f6111ac82346140df565b90505f5b85811015610d4d57368787838181106111cb576111cb6140f2565b90506020028101906111dd9190614106565b90505f6111ed610b528380614072565b90505f611200610b526020850185614072565b905060015f82815260366020526040902054600160c01b900460ff16600281111561122d5761122d613c5b565b1461124b5760405163d49e19a760e01b815260040160405180910390fd5b5f6112568480614072565b6112636020870187614072565b604051602001611276949392919061419e565b60405160208183030381529060405290505f71bbddc7ce488642fb579f8b00f3a5900072516001600160a01b031689836040516112b3919061415c565b5f6040518083038185875af1925050503d805f81146112ed576040519150601f19603f3d011682016040523d82523d5f602084013e6112f2565b606091505b50509050806113145760405163fc52d48360e01b815260040160405180910390fd5b82840361134a5760405184907fc97b965b92ae7fd20095fe8eb7b99f81f95f8c4adffb22a19116d8eb2846b016905f90a2611377565b604051839085907f42f9c9db2ca443e9ec62f4588bd0c9b241065c02c2a8001ac164ae1282dc7b94905f90a35b5050600190930192506111b0915050565b5f611396611fff600c6140c8565b6113a96001600160401b038416426140df565b106113c757604051637944e66d60e11b815260040160405180910390fd5b604080516001600160401b03841660208201525f918291720f3df6d732807ef1319fb7b8bb8522d0beac02910160408051601f198184030181529082905261140e9161415c565b5f60405180830381855afa9150503d805f8114611446576040519150601f19603f3d011682016040523d82523d5f602084013e61144b565b606091505b509150915081801561145d57505f8151115b61147a5760405163558ad0a360e01b815260040160405180910390fd5b8080602001905181019061148e91906141bd565b949350505050565b6114bd604080516080810182525f8082526020820181905291810182905290606082015290565b5f82815260366020908152604091829020825160808101845281546001600160401b038082168352600160401b8204811694830194909452600160801b810490931693810193909352906060830190600160c01b900460ff16600281111561152757611527613c5b565b600281111561153857611538613c5b565b90525092915050565b6033546001600160a01b03163314806115645750603e546001600160a01b031633145b6115815760405163427a777960e01b815260040160405180910390fd5b604051635ac86ab760e01b8152600660048201819052907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031690635ac86ab790602401602060405180830381865afa1580156115e7573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061160b9190614012565b156116295760405163840a48d560e01b815260040160405180910390fd5b61163282612429565b5050565b336001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000161461167f57604051633213a66160e21b815260040160405180910390fd5b346801bc16d674ec800000146116a85760405163049696b360e31b815260040160405180910390fd5b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663228951186801bc16d674ec80000087876116eb612cd6565b8888886040518863ffffffff1660e01b815260040161170f9695949392919061422a565b5f604051808303818588803b158015611726575f5ffd5b505af1158015611738573d5f5f3e3d5ffd5b50505050507fa01003766d3cd97cf2ade5429690bf5d206be7fb01ef9d3a0089ecf67bc1121961179c86868080601f0160208091040260200160405190810160405280939291908181526020018383808284375f9201919091525061262f92505050565b60405190815260200160405180910390a15050505050565b6117db604080516080810182525f8082526020820181905291810182905290606082015290565b60365f61181c85858080601f0160208091040260200160405190810160405280939291908181526020018383808284375f9201919091525061262f92505050565b815260208082019290925260409081015f20815160808101835281546001600160401b038082168352600160401b8204811695830195909552600160801b81049094169281019290925290916060830190600160c01b900460ff16600281111561188857611888613c5b565b600281111561189957611899613c5b565b9052509392505050565b5f6109e0710961ef480eb55e80d19ad83579a64c0070026125a9565b336001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000161461190857604051633213a66160e21b815260040160405180910390fd5b5f611917633b9aca008361428c565b9050611930633b9aca006001600160401b0383166140c8565b6034549092506001600160401b039081169082161115611963576040516302c6f54760e21b815260040160405180910390fd5b603480548291905f906119809084906001600160401b031661429f565b92506101000a8154816001600160401b0302191690836001600160401b03160217905550826001600160a01b03167f8947fd2ce07ef9cc302c4e8f0461015615d91ce851564839e91cc804c2f49d8e836040516119df91815260200190565b60405180910390a26119f183836126c0565b505050565b5f54610100900460ff1615808015611a1457505f54600160ff909116105b80611a2d5750303b158015611a2d57505f5460ff166001145b611a955760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b60648201526084015b60405180910390fd5b5f805460ff191660011790558015611ab6575f805461ff0019166101001790555b6001600160a01b038216611add576040516339b190bb60e11b815260040160405180910390fd5b603380546001600160a01b0319166001600160a01b0384161790558015611632575f805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15050565b6033546001600160a01b03163314611b6b5760405163719f370360e11b815260040160405180910390fd5b603e54604080516001600160a01b03928316815291831660208301527ffb8129080a19d34dceac04ba253fc50304dc86c729bd63cdca4a969ad19a5eac910160405180910390a1603e80546001600160a01b0319166001600160a01b0392909216919091179055565b6033546001600160a01b03163314611bff5760405163719f370360e11b815260040160405180910390fd5b604051635ac86ab760e01b8152600560048201819052907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031690635ac86ab790602401602060405180830381865afa158015611c65573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611c899190614012565b15611ca75760405163840a48d560e01b815260040160405180910390fd5b8251845114611cc9576040516343714afd60e01b815260040160405180910390fd5b5f5b8451811015611d2c57611d2483858381518110611cea57611cea6140f2565b6020026020010151878481518110611d0457611d046140f2565b60200260200101516001600160a01b0316612d069092919063ffffffff16565b600101611ccb565b5050505050565b604051635ac86ab760e01b8152600760048201819052907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031690635ac86ab790602401602060405180830381865afa158015611d99573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611dbd9190614012565b15611ddb5760405163840a48d560e01b815260040160405180910390fd5b603a54600160401b90046001600160401b03165f819003611e0f57604051631a544f4960e01b815260040160405180910390fd5b6040805160a081018252603c548152603d5462ffffff811660208301526001600160401b0363010000008204811693830193909352600160581b810460070b6060830152600160981b90049091166080820152611e76611e6e8361221e565b825188612d58565b5f805b858110156120d65736878783818110611e9457611e946140f2565b9050602002810190611ea691906142be565b80355f908152603660209081526040808320815160808101835281546001600160401b038082168352600160401b8204811695830195909552600160801b8104909416928101929092529394509192906060830190600160c01b900460ff166002811115611f1657611f16613c5b565b6002811115611f2757611f27613c5b565b9052509050600181606001516002811115611f4457611f44613c5b565b14611f505750506120ce565b856001600160401b031681604001516001600160401b031610611f745750506120ce565b5f8080611f84848a8f3588612e19565b60208b0180519396509194509250611f9b826142d2565b62ffffff16905250608088018051849190611fb79083906142ef565b6001600160401b0316905250606088018051839190611fd790839061430e565b60070b905250611fe781886142ef565b85355f908152603660209081526040918290208751815492890151938901516001600160401b03908116600160801b0267ffffffffffffffff60801b19958216600160401b026001600160801b0319909516919092161792909217928316821781556060880151939a50879390929091839160ff60c01b1990911668ffffffffffffffffff60801b1990911617600160c01b83600281111561208b5761208b613c5b565b021790555050604051863591506001600160401b038b16907fe4866335761a51dcaff766448ab0af6064291ee5dc94e68492bb9cd757c1e350905f90a350505050505b600101611e79565b506001600160401b038084165f908152603b6020526040812080548493919291612102918591166142ef565b92506101000a8154816001600160401b0302191690836001600160401b031602179055506109bb82612f2f565b5f815f81518110612142576121426140f2565b60200260200101519050919050565b5f81600381518110612165576121656140f2565b60200260200101515f5f1b14159050919050565b612185600360206140c8565b6121926020830183614072565b9050146121b2576040516313717da960e21b815260040160405180910390fd5b6122016121c26020830183614072565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f920191909152508692505084359050600361314f565b611632576040516309bde33960e01b815260040160405180910390fd5b5f5f7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316632704351a6040518163ffffffff1660e01b8152600401602060405180830381865afa15801561227c573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906122a0919061433d565b9050806001600160401b03165f036122cb576040516341a02cc960e01b815260040160405180910390fd5b806001600160401b0316836001600160401b031611156122ec5760016122ee565b5f5b9392505050565b600884146123165760405163200591bd60e01b815260040160405180910390fd5b5f61232088613184565b90508061232f6028600161418b565b612339919061418b565b6123449060206140c8565b8314612363576040516313717da960e21b815260040160405180910390fd5b5f61239f8787808060200260200160405190810160405280939291908181526020018383602002808284375f920191909152506131ac92505050565b90505f64ffffffffff84166123b66028600161418b565b600b901b17905061240086868080601f0160208091040260200160405190810160405280939291908181526020018383808284375f920191909152508d925086915085905061314f565b61241d576040516309bde33960e01b815260040160405180910390fd5b50505050505050505050565b603a54600160401b90046001600160401b0316156124595760405162be9bc360e81b815260040160405180910390fd5b603a546001600160401b03428116911603612487576040516367db5b8b60e01b815260040160405180910390fd5b6034545f906001600160401b03166124a3633b9aca004761428c565b6124ad919061429f565b90508180156124c357506001600160401b038116155b156124e1576040516332dea95960e21b815260040160405180910390fd5b5f6040518060a001604052806124f642611388565b815260395462ffffff1660208201526001600160401b0380851660408301525f60608301819052608090920191909152603a805442909216600160401b026fffffffffffffffff000000000000000019909216919091179055905061255a81612f2f565b805160208083015160405162ffffff90911681526001600160401b034216917f575796133bbed337e5b39aa49a30dc2556a91e0c6c2af4b7b886ae77ebef1076910160405180910390a3505050565b5f5f5f836001600160a01b03166040515f60405180830381855afa9150503d805f81146125f1576040519150601f19603f3d011682016040523d82523d5f602084013e6125f6565b606091505b5091509150818015612609575080516020145b6126265760405163c90158af60e01b815260040160405180910390fd5b61148e81614358565b5f815160301461265257604051634f88323960e11b815260040160405180910390fd5b6040516002906126689084905f9060200161437b565b60408051601f19818403018152908290526126829161415c565b602060405180830381855afa15801561269d573d5f5f3e3d5ffd5b5050506040513d601f19601f8201168201806040525081019061107a91906141bd565b804710156127105760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a20696e73756666696369656e742062616c616e63650000006044820152606401611a8c565b5f826001600160a01b0316826040515f6040518083038185875af1925050503d805f8114612759576040519150601f19603f3d011682016040523d82523d5f602084013e61275e565b606091505b50509050806119f15760405162461bcd60e51b815260206004820152603a60248201527f416464726573733a20756e61626c6520746f2073656e642076616c75652c207260448201527f6563697069656e74206d617920686176652072657665727465640000000000006064820152608401611a8c565b5f5f6128128484808060200260200160405190810160405280939291908181526020018383602002808284375f9201919091525061212f92505050565b5f818152603660209081526040808320815160808101835281546001600160401b038082168352600160401b8204811695830195909552600160801b8104909416928101929092529394509192906060830190600160c01b900460ff16600281111561288057612880613c5b565b600281111561289157612891613c5b565b90525090505f816060015160028111156128ad576128ad613c5b565b146128cb576040516335e09e9d60e01b815260040160405180910390fd5b6001600160401b0380166129108686808060200260200160405190810160405280939291908181526020018383602002808284375f9201919091525061347a92505050565b6001600160401b03160361293757604051631958236d60e21b815260040160405180910390fd5b6001600160401b03801661297c8686808060200260200160405190810160405280939291908181526020018383602002808284375f9201919091525061349e92505050565b6001600160401b0316146129a357604051632eade63760e01b815260040160405180910390fd5b6129ab612cd6565b6129b490614358565b6129ef8686808060200260200160405190810160405280939291908181526020018383602002808284375f920191909152506134b592505050565b1480612a4457506129fe6134c9565b612a0790614358565b612a428686808060200260200160405190810160405280939291908181526020018383602002808284375f920191909152506134b592505050565b145b612a6157604051633772dd5360e11b815260040160405180910390fd5b5f612a9d8686808060200260200160405190810160405280939291908181526020018383602002808284375f920191909152506134e592505050565b9050612ab6612aab8c61221e565b8b88888c8c8f6122f5565b60398054905f612ac58361439f565b9091555050603a545f90600160401b90046001600160401b031615612afc57603a54600160401b90046001600160401b0316612b09565b603a546001600160401b03165b6040805160808101825264ffffffffff8d1681526001600160401b03858116602083015283169181019190915290915060608101600190525f858152603660209081526040918290208351815492850151938501516001600160401b03908116600160801b0267ffffffffffffffff60801b19958216600160401b026001600160801b031990951691909216179290921792831682178155606084015190929091839160ff60c01b1990911668ffffffffffffffffff60801b1990911617600160c01b836002811115612bde57612bde613c5b565b021790555050603d8054849250601390612c09908490600160981b90046001600160401b03166142ef565b92506101000a8154816001600160401b0302191690836001600160401b031602179055507f101790c2993f6a4d962bd17c786126823ba1c4cf04ff4cccb2659d50fb20aee884604051612c5e91815260200190565b60405180910390a1604080518581526001600160401b03838116602083015284168183015290517fcdae700d7241bc027168c53cf6f889763b0a2c88a65d77fc13a8a9fef0d8605f9181900360600190a1612cc6633b9aca006001600160401b0384166140c8565b9c9b505050505050505050505050565b604051606090612cf290600160f81b905f9030906020016143b7565b604051602081830303815290604052905090565b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b031663a9059cbb60e01b1790526119f19084906134fc565b5f612d6284613184565b9050612d6f81600361418b565b612d7a9060206140c8565b612d876020840184614072565b905014612da7576040516313717da960e21b815260040160405180910390fd5b6003811b600c17612dfc612dbe6020850185614072565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f9201919091525088925050863590508461314f565b611d2c576040516309bde33960e01b815260040160405180910390fd5b5f5f5f866020015192505f612e3286895f0151876135cf565b9050836001600160401b0316816001600160401b031614612ea657612e5784826143f5565b60408051873581526001600160401b038a8116602083015284168183015290519194507fcdae700d7241bc027168c53cf6f889763b0a2c88a65d77fc13a8a9fef0d8605f919081900360600190a15b6001600160401b0380821660208a0181905290881660408a01525f03612f245760398054905f612ed583614424565b909155505060026060890152612eea83614439565b6040519092508535906001600160401b038916907f5ce0aa04ae51d52da6e680fbe0336d2e2432f7c3dc2d4f3193204c57b9072107905f90a35b509450945094915050565b8051603c556020810151603d805460408401516060850151608086015162ffffff9095166affffffffffffffffffffff19909316831763010000006001600160401b0393841602176fffffffffffffffffffffffffffffffff60581b1916600160581b9183169190910267ffffffffffffffff60981b191617600160981b919094160292909217905515612fc05750565b60808101516034545f91612fdc916001600160401b03166142ef565b90505f82606001518360400151612ff3919061430e565b60408401516034805492935090915f906130179084906001600160401b03166142ef565b82546101009290920a6001600160401b03818102199093169183160217909155603a8054600160401b810483166001600160801b03199091161790555f915061306790633b9aca009085166140c8565b90505f61307c633b9aca00600785900b61445e565b603a546040518281529192506001600160401b0316907f525408c201bc1576eb44116f6478f1c2a54775b19a043bcfdc708364f74f8e449060200160405180910390a260335460405163a1ca780b60e01b81526001600160a01b03918216600482015260248101849052604481018390527f00000000000000000000000000000000000000000000000000000000000000009091169063a1ca780b906064015f604051808303815f87803b158015613132575f5ffd5b505af1158015613144573d5f5f3e3d5ffd5b505050505050505050565b5f8361316e576040516329e7276760e11b815260040160405180910390fd5b8361317a8685856136ad565b1495945050505050565b5f8082600181111561319857613198613c5b565b146131a457600661107a565b600592915050565b5f60018251116131cf5760405163f8ef036760e01b815260040160405180910390fd5b6131d982516137a0565b6131f65760405163f6558f5160e01b815260040160405180910390fd5b5f60028351613205919061428c565b90505f816001600160401b0381111561322057613220613e09565b604051908082528060200260200182016040528015613249578160200160208202803683370190505b5090505f5b828110156133435760028561326383836140c8565b81518110613273576132736140f2565b60200260200101518683600261328991906140c8565b61329490600161418b565b815181106132a4576132a46140f2565b60200260200101516040516020016132c6929190918252602082015260400190565b60408051601f19818403018152908290526132e09161415c565b602060405180830381855afa1580156132fb573d5f5f3e3d5ffd5b5050506040513d601f19601f8201168201806040525081019061331e91906141bd565b828281518110613330576133306140f2565b602090810291909101015260010161324e565b505b816001146134575761335860028361428c565b91505f5b828110156134515760028261337183836140c8565b81518110613381576133816140f2565b60200260200101518383600261339791906140c8565b6133a290600161418b565b815181106133b2576133b26140f2565b60200260200101516040516020016133d4929190918252602082015260400190565b60408051601f19818403018152908290526133ee9161415c565b602060405180830381855afa158015613409573d5f5f3e3d5ffd5b5050506040513d601f19601f8201168201806040525081019061342c91906141bd565b82828151811061343e5761343e6140f2565b602090810291909101015260010161335c565b50613345565b805f81518110613469576134696140f2565b602002602001015192505050919050565b5f61107a82600581518110613491576134916140f2565b60200260200101516137bf565b5f61107a82600681518110613491576134916140f2565b5f81600181518110612142576121426140f2565b604051606090612cf290600160f91b905f9030906020016143b7565b5f61107a82600281518110613491576134916140f2565b5f613550826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b03166138269092919063ffffffff16565b905080515f14806135705750808060200190518101906135709190614012565b6119f15760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b6064820152608401611a8c565b5f6135dc6026600161418b565b6135e79060206140c8565b6135f46040840184614072565b905014613614576040516313717da960e21b815260040160405180910390fd5b5f61362060048561448d565b64ffffffffff1690506136796136396040850185614072565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f92019190915250899250505060208601358461314f565b613696576040516309bde33960e01b815260040160405180910390fd5b6136a4836020013585613834565b95945050505050565b5f83515f141580156136ca5750602084516136c891906144b6565b155b6136e7576040516313717da960e21b815260040160405180910390fd5b604080516020808201909252848152905b855181116137775761370b6002856144b6565b5f0361373d5781515f528086015160205260208260405f60026107d05a03fa613732575f5ffd5b600284049350613765565b808601515f52815160205260208260405f60026107d05a03fa61375e575f5ffd5b6002840493505b61377060208261418b565b90506136f8565b508215613797576040516363df817160e01b815260040160405180910390fd5b51949350505050565b5f811580159061107a57506137b66001836140df565b82161592915050565b60f881901c60e882901c61ff00161760d882901c62ff0000161760c882901c63ff000000161764ff0000000060b883901c161765ff000000000060a883901c161766ff000000000000609883901c161767ff0000000000000060889290921c919091161790565b606061148e84845f85613860565b5f806138416004846144c9565b61384c9060406144f2565b64ffffffffff16905061148e84821b6137bf565b6060824710156138c15760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6044820152651c8818d85b1b60d21b6064820152608401611a8c565b5f5f866001600160a01b031685876040516138dc919061415c565b5f6040518083038185875af1925050503d805f8114613916576040519150601f19603f3d011682016040523d82523d5f602084013e61391b565b606091505b509150915061392c87838387613937565b979650505050505050565b606083156139a55782515f0361399e576001600160a01b0385163b61399e5760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401611a8c565b508161148e565b61148e83838151156139ba5781518083602001fd5b8060405162461bcd60e51b8152600401611a8c9190614512565b6001600160401b03811681146139e8575f5ffd5b50565b5f604082840312156139fb575f5ffd5b50919050565b5f5f5f60608486031215613a13575f5ffd5b8335613a1e816139d4565b925060208401356001600160401b03811115613a38575f5ffd5b613a44868287016139eb565b92505060408401356001600160401b03811115613a5f575f5ffd5b613a6b868287016139eb565b9150509250925092565b5f5f83601f840112613a85575f5ffd5b5081356001600160401b03811115613a9b575f5ffd5b6020830191508360208260051b8501011115613ab5575f5ffd5b9250929050565b5f5f60208385031215613acd575f5ffd5b82356001600160401b03811115613ae2575f5ffd5b613aee85828601613a75565b90969095509350505050565b5f5f5f5f5f5f5f5f60a0898b031215613b11575f5ffd5b8835613b1c816139d4565b975060208901356001600160401b03811115613b36575f5ffd5b613b428b828c016139eb565b97505060408901356001600160401b03811115613b5d575f5ffd5b613b698b828c01613a75565b90975095505060608901356001600160401b03811115613b87575f5ffd5b613b938b828c01613a75565b90955093505060808901356001600160401b03811115613bb1575f5ffd5b613bbd8b828c01613a75565b999c989b5096995094979396929594505050565b5f60208284031215613be1575f5ffd5b81356122ee816139d4565b5f5f83601f840112613bfc575f5ffd5b5081356001600160401b03811115613c12575f5ffd5b602083019150836020828501011115613ab5575f5ffd5b5f5f60208385031215613c3a575f5ffd5b82356001600160401b03811115613c4f575f5ffd5b613aee85828601613bec565b634e487b7160e01b5f52602160045260245ffd5b60038110613c8b57634e487b7160e01b5f52602160045260245ffd5b9052565b6020810161107a8284613c6f565b5f60208284031215613cad575f5ffd5b5035919050565b5f6080820190506001600160401b0383511682526001600160401b0360208401511660208301526001600160401b0360408401511660408301526060830151613d006060840182613c6f565b5092915050565b80151581146139e8575f5ffd5b5f60208284031215613d24575f5ffd5b81356122ee81613d07565b5f5f5f5f5f60608688031215613d43575f5ffd5b85356001600160401b03811115613d58575f5ffd5b613d6488828901613bec565b90965094505060208601356001600160401b03811115613d82575f5ffd5b613d8e88828901613bec565b96999598509660400135949350505050565b6001600160a01b03811681146139e8575f5ffd5b8035613dbf81613da0565b919050565b5f5f60408385031215613dd5575f5ffd5b8235613de081613da0565b946020939093013593505050565b5f60208284031215613dfe575f5ffd5b81356122ee81613da0565b634e487b7160e01b5f52604160045260245ffd5b604051601f8201601f191681016001600160401b0381118282101715613e4557613e45613e09565b604052919050565b5f6001600160401b03821115613e6557613e65613e09565b5060051b60200190565b5f82601f830112613e7e575f5ffd5b8135613e91613e8c82613e4d565b613e1d565b8082825260208201915060208360051b860101925085831115613eb2575f5ffd5b602085015b83811015613ecf578035835260209283019201613eb7565b5095945050505050565b5f5f5f60608486031215613eeb575f5ffd5b83356001600160401b03811115613f00575f5ffd5b8401601f81018613613f10575f5ffd5b8035613f1e613e8c82613e4d565b8082825260208201915060208360051b850101925088831115613f3f575f5ffd5b6020840193505b82841015613f6a578335613f5981613da0565b825260209384019390910190613f46565b955050505060208401356001600160401b03811115613f87575f5ffd5b613f9386828701613e6f565b925050613fa260408501613db4565b90509250925092565b5f5f5f60408486031215613fbd575f5ffd5b83356001600160401b03811115613fd2575f5ffd5b613fde868287016139eb565b93505060208401356001600160401b03811115613ff9575f5ffd5b61400586828701613a75565b9497909650939450505050565b5f60208284031215614022575f5ffd5b81516122ee81613d07565b5f5f8335601e19843603018112614042575f5ffd5b8301803591506001600160401b0382111561405b575f5ffd5b6020019150600581901b3603821315613ab5575f5ffd5b5f5f8335601e19843603018112614087575f5ffd5b8301803591506001600160401b038211156140a0575f5ffd5b602001915036819003821315613ab5575f5ffd5b634e487b7160e01b5f52601160045260245ffd5b808202811582820484141761107a5761107a6140b4565b8181038181111561107a5761107a6140b4565b634e487b7160e01b5f52603260045260245ffd5b5f8235603e1983360301811261411a575f5ffd5b9190910192915050565b8284823760c09190911b6001600160c01b0319169101908152600801919050565b5f81518060208401855e5f93019283525090919050565b5f6122ee8284614145565b5f60208284031215614177575f5ffd5b813564ffffffffff811681146122ee575f5ffd5b8082018082111561107a5761107a6140b4565b838582375f8482015f8152838582375f93019283525090949350505050565b5f602082840312156141cd575f5ffd5b5051919050565b81835281816020850137505f828201602090810191909152601f909101601f19169091010190565b5f81518084528060208401602086015e5f602082860101526020601f19601f83011685010191505092915050565b608081525f61423d60808301888a6141d4565b828103602084015261424f81886141fc565b905082810360408401526142648186886141d4565b915050826060830152979650505050505050565b634e487b7160e01b5f52601260045260245ffd5b5f8261429a5761429a614278565b500490565b6001600160401b03828116828216039081111561107a5761107a6140b4565b5f8235605e1983360301811261411a575f5ffd5b5f62ffffff8216806142e6576142e66140b4565b5f190192915050565b6001600160401b03818116838216019081111561107a5761107a6140b4565b600781810b9083900b01677fffffffffffffff8113677fffffffffffffff198212171561107a5761107a6140b4565b5f6020828403121561434d575f5ffd5b81516122ee816139d4565b805160208083015191908110156139fb575f1960209190910360031b1b16919050565b5f6143868285614145565b6001600160801b03199390931683525050601001919050565b5f600182016143b0576143b06140b4565b5060010190565b6001600160f81b03199390931683526001600160a81b031991909116600183015260601b6bffffffffffffffffffffffff1916600c82015260200190565b600782810b9082900b03677fffffffffffffff198112677fffffffffffffff8213171561107a5761107a6140b4565b5f81614432576144326140b4565b505f190190565b5f8160070b677fffffffffffffff198103614456576144566140b4565b5f0392915050565b8082025f8212600160ff1b84141615614479576144796140b4565b818105831482151761107a5761107a6140b4565b5f64ffffffffff8316806144a3576144a3614278565b8064ffffffffff84160491505092915050565b5f826144c4576144c4614278565b500690565b5f64ffffffffff8316806144df576144df614278565b8064ffffffffff84160691505092915050565b64ffffffffff8181168382160290811690818114613d0057613d006140b4565b602081525f6122ee60208301846141fc56fea264697066735822122022ac72dc71b8b3783a93600a5ae563424e60edb4cc798a4c6154766a9ff893d164736f6c634300081e0033",
}
⋮----
// EigenPodABI is the input ABI used to generate the binding from.
// Deprecated: Use EigenPodMetaData.ABI instead.
var EigenPodABI = EigenPodMetaData.ABI
⋮----
// EigenPodBin is the compiled bytecode used for deploying new contracts.
// Deprecated: Use EigenPodMetaData.Bin instead.
var EigenPodBin = EigenPodMetaData.Bin
⋮----
// DeployEigenPod deploys a new Ethereum contract, binding an instance of EigenPod to it.
func DeployEigenPod(auth *bind.TransactOpts, backend bind.ContractBackend, _ethPOS common.Address, _eigenPodManager common.Address) (common.Address, *types.Transaction, *EigenPod, error)
⋮----
// EigenPod is an auto generated Go binding around an Ethereum contract.
type EigenPod struct {
	EigenPodCaller     // Read-only binding to the contract
	EigenPodTransactor // Write-only binding to the contract
	EigenPodFilterer   // Log filterer for contract events
}
⋮----
EigenPodCaller     // Read-only binding to the contract
EigenPodTransactor // Write-only binding to the contract
EigenPodFilterer   // Log filterer for contract events
⋮----
// EigenPodCaller is an auto generated read-only Go binding around an Ethereum contract.
type EigenPodCaller struct {
	contract *bind.BoundContract // Generic contract wrapper for the low level calls
}
⋮----
contract *bind.BoundContract // Generic contract wrapper for the low level calls
⋮----
// EigenPodTransactor is an auto generated write-only Go binding around an Ethereum contract.
type EigenPodTransactor struct {
	contract *bind.BoundContract // Generic contract wrapper for the low level calls
}
⋮----
// EigenPodFilterer is an auto generated log filtering Go binding around an Ethereum contract events.
type EigenPodFilterer struct {
	contract *bind.BoundContract // Generic contract wrapper for the low level calls
}
⋮----
// EigenPodSession is an auto generated Go binding around an Ethereum contract,
// with pre-set call and transact options.
type EigenPodSession struct {
	Contract     *EigenPod         // 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
}
⋮----
Contract     *EigenPod         // 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
⋮----
// EigenPodCallerSession is an auto generated read-only Go binding around an Ethereum contract,
// with pre-set call options.
type EigenPodCallerSession struct {
	Contract *EigenPodCaller // Generic contract caller binding to set the session for
	CallOpts bind.CallOpts   // Call options to use throughout this session
}
⋮----
Contract *EigenPodCaller // Generic contract caller binding to set the session for
CallOpts bind.CallOpts   // Call options to use throughout this session
⋮----
// EigenPodTransactorSession is an auto generated write-only Go binding around an Ethereum contract,
// with pre-set transact options.
type EigenPodTransactorSession struct {
	Contract     *EigenPodTransactor // Generic contract transactor binding to set the session for
	TransactOpts bind.TransactOpts   // Transaction auth options to use throughout this session
}
⋮----
Contract     *EigenPodTransactor // Generic contract transactor binding to set the session for
TransactOpts bind.TransactOpts   // Transaction auth options to use throughout this session
⋮----
// EigenPodRaw is an auto generated low-level Go binding around an Ethereum contract.
type EigenPodRaw struct {
	Contract *EigenPod // Generic contract binding to access the raw methods on
}
⋮----
Contract *EigenPod // Generic contract binding to access the raw methods on
⋮----
// EigenPodCallerRaw is an auto generated low-level read-only Go binding around an Ethereum contract.
type EigenPodCallerRaw struct {
	Contract *EigenPodCaller // Generic read-only contract binding to access the raw methods on
}
⋮----
Contract *EigenPodCaller // Generic read-only contract binding to access the raw methods on
⋮----
// EigenPodTransactorRaw is an auto generated low-level write-only Go binding around an Ethereum contract.
type EigenPodTransactorRaw struct {
	Contract *EigenPodTransactor // Generic write-only contract binding to access the raw methods on
}
⋮----
Contract *EigenPodTransactor // Generic write-only contract binding to access the raw methods on
⋮----
// NewEigenPod creates a new instance of EigenPod, bound to a specific deployed contract.
func NewEigenPod(address common.Address, backend bind.ContractBackend) (*EigenPod, error)
⋮----
// NewEigenPodCaller creates a new read-only instance of EigenPod, bound to a specific deployed contract.
func NewEigenPodCaller(address common.Address, caller bind.ContractCaller) (*EigenPodCaller, error)
⋮----
// NewEigenPodTransactor creates a new write-only instance of EigenPod, bound to a specific deployed contract.
func NewEigenPodTransactor(address common.Address, transactor bind.ContractTransactor) (*EigenPodTransactor, error)
⋮----
// NewEigenPodFilterer creates a new log filterer instance of EigenPod, bound to a specific deployed contract.
func NewEigenPodFilterer(address common.Address, filterer bind.ContractFilterer) (*EigenPodFilterer, error)
⋮----
// bindEigenPod binds a generic wrapper to an already deployed contract.
func bindEigenPod(address common.Address, caller bind.ContractCaller, transactor bind.ContractTransactor, filterer bind.ContractFilterer) (*bind.BoundContract, error)
⋮----
// 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 (_EigenPod *EigenPodRaw) Call(opts *bind.CallOpts, result *[]interface
⋮----
// Transfer initiates a plain transaction to move funds to the contract, calling
// its default method if one is available.
func (_EigenPod *EigenPodRaw) Transfer(opts *bind.TransactOpts) (*types.Transaction, error)
⋮----
// Transact invokes the (paid) contract method with params as input values.
func (_EigenPod *EigenPodRaw) Transact(opts *bind.TransactOpts, method string, params ...interface
⋮----
// ActiveValidatorCount is a free data retrieval call binding the contract method 0x2340e8d3.
//
// Solidity: function activeValidatorCount() view returns(uint256)
func (_EigenPod *EigenPodCaller) ActiveValidatorCount(opts *bind.CallOpts) (*big.Int, error)
⋮----
var out []interface{}
⋮----
// CheckpointBalanceExitedGwei is a free data retrieval call binding the contract method 0x52396a59.
⋮----
// Solidity: function checkpointBalanceExitedGwei(uint64 ) view returns(uint64)
func (_EigenPod *EigenPodCaller) CheckpointBalanceExitedGwei(opts *bind.CallOpts, arg0 uint64) (uint64, error)
⋮----
// CurrentCheckpoint is a free data retrieval call binding the contract method 0x47d28372.
⋮----
// Solidity: function currentCheckpoint() view returns((bytes32,uint24,uint64,int64,uint64))
func (_EigenPod *EigenPodCaller) CurrentCheckpoint(opts *bind.CallOpts) (IEigenPodTypesCheckpoint, error)
⋮----
// CurrentCheckpointTimestamp is a free data retrieval call binding the contract method 0x42ecff2a.
⋮----
// Solidity: function currentCheckpointTimestamp() view returns(uint64)
func (_EigenPod *EigenPodCaller) CurrentCheckpointTimestamp(opts *bind.CallOpts) (uint64, error)
⋮----
// EigenPodManager is a free data retrieval call binding the contract method 0x4665bcda.
⋮----
// Solidity: function eigenPodManager() view returns(address)
func (_EigenPod *EigenPodCaller) EigenPodManager(opts *bind.CallOpts) (common.Address, error)
⋮----
// EthPOS is a free data retrieval call binding the contract method 0x74cdd798.
⋮----
// Solidity: function ethPOS() view returns(address)
func (_EigenPod *EigenPodCaller) EthPOS(opts *bind.CallOpts) (common.Address, error)
⋮----
// GetConsolidationRequestFee is a free data retrieval call binding the contract method 0x1e515533.
⋮----
// Solidity: function getConsolidationRequestFee() view returns(uint256)
func (_EigenPod *EigenPodCaller) GetConsolidationRequestFee(opts *bind.CallOpts) (*big.Int, error)
⋮----
// GetParentBlockRoot is a free data retrieval call binding the contract method 0x6c0d2d5a.
⋮----
// Solidity: function getParentBlockRoot(uint64 timestamp) view returns(bytes32)
func (_EigenPod *EigenPodCaller) GetParentBlockRoot(opts *bind.CallOpts, timestamp uint64) ([32]byte, error)
⋮----
// GetWithdrawalRequestFee is a free data retrieval call binding the contract method 0xc44e30dc.
⋮----
// Solidity: function getWithdrawalRequestFee() view returns(uint256)
func (_EigenPod *EigenPodCaller) GetWithdrawalRequestFee(opts *bind.CallOpts) (*big.Int, error)
⋮----
// LastCheckpointTimestamp is a free data retrieval call binding the contract method 0xee94d67c.
⋮----
// Solidity: function lastCheckpointTimestamp() view returns(uint64)
func (_EigenPod *EigenPodCaller) LastCheckpointTimestamp(opts *bind.CallOpts) (uint64, error)
⋮----
// PodOwner is a free data retrieval call binding the contract method 0x0b18ff66.
⋮----
// Solidity: function podOwner() view returns(address)
func (_EigenPod *EigenPodCaller) PodOwner(opts *bind.CallOpts) (common.Address, error)
⋮----
// ProofSubmitter is a free data retrieval call binding the contract method 0x58753357.
⋮----
// Solidity: function proofSubmitter() view returns(address)
func (_EigenPod *EigenPodCaller) ProofSubmitter(opts *bind.CallOpts) (common.Address, error)
⋮----
// ValidatorPubkeyHashToInfo is a free data retrieval call binding the contract method 0x6fcd0e53.
⋮----
// Solidity: function validatorPubkeyHashToInfo(bytes32 validatorPubkeyHash) view returns((uint64,uint64,uint64,uint8))
func (_EigenPod *EigenPodCaller) ValidatorPubkeyHashToInfo(opts *bind.CallOpts, validatorPubkeyHash [32]byte) (IEigenPodTypesValidatorInfo, error)
⋮----
// ValidatorPubkeyToInfo is a free data retrieval call binding the contract method 0xb522538a.
⋮----
// Solidity: function validatorPubkeyToInfo(bytes validatorPubkey) view returns((uint64,uint64,uint64,uint8))
func (_EigenPod *EigenPodCaller) ValidatorPubkeyToInfo(opts *bind.CallOpts, validatorPubkey []byte) (IEigenPodTypesValidatorInfo, error)
⋮----
// ValidatorStatus is a free data retrieval call binding the contract method 0x58eaee79.
⋮----
// Solidity: function validatorStatus(bytes validatorPubkey) view returns(uint8)
func (_EigenPod *EigenPodCaller) ValidatorStatus(opts *bind.CallOpts, validatorPubkey []byte) (uint8, error)
⋮----
// ValidatorStatus0 is a free data retrieval call binding the contract method 0x7439841f.
⋮----
// Solidity: function validatorStatus(bytes32 pubkeyHash) view returns(uint8)
func (_EigenPod *EigenPodCaller) ValidatorStatus0(opts *bind.CallOpts, pubkeyHash [32]byte) (uint8, error)
⋮----
// WithdrawableRestakedExecutionLayerGwei is a free data retrieval call binding the contract method 0x3474aa16.
⋮----
// Solidity: function withdrawableRestakedExecutionLayerGwei() view returns(uint64)
func (_EigenPod *EigenPodCaller) WithdrawableRestakedExecutionLayerGwei(opts *bind.CallOpts) (uint64, error)
⋮----
// Initialize is a paid mutator transaction binding the contract method 0xc4d66de8.
⋮----
// Solidity: function initialize(address _podOwner) returns()
func (_EigenPod *EigenPodTransactor) Initialize(opts *bind.TransactOpts, _podOwner common.Address) (*types.Transaction, error)
⋮----
// RecoverTokens is a paid mutator transaction binding the contract method 0xdda3346c.
⋮----
// Solidity: function recoverTokens(address[] tokenList, uint256[] amountsToWithdraw, address recipient) returns()
func (_EigenPod *EigenPodTransactor) RecoverTokens(opts *bind.TransactOpts, tokenList []common.Address, amountsToWithdraw []*big.Int, recipient common.Address) (*types.Transaction, error)
⋮----
// RequestConsolidation is a paid mutator transaction binding the contract method 0x6691954e.
⋮----
// Solidity: function requestConsolidation((bytes,bytes)[] requests) payable returns()
func (_EigenPod *EigenPodTransactor) RequestConsolidation(opts *bind.TransactOpts, requests []IEigenPodTypesConsolidationRequest) (*types.Transaction, error)
⋮----
// RequestWithdrawal is a paid mutator transaction binding the contract method 0x3f5fa57a.
⋮----
// Solidity: function requestWithdrawal((bytes,uint64)[] requests) payable returns()
func (_EigenPod *EigenPodTransactor) RequestWithdrawal(opts *bind.TransactOpts, requests []IEigenPodTypesWithdrawalRequest) (*types.Transaction, error)
⋮----
// SetProofSubmitter is a paid mutator transaction binding the contract method 0xd06d5587.
⋮----
// Solidity: function setProofSubmitter(address newProofSubmitter) returns()
func (_EigenPod *EigenPodTransactor) SetProofSubmitter(opts *bind.TransactOpts, newProofSubmitter common.Address) (*types.Transaction, error)
⋮----
// Stake is a paid mutator transaction binding the contract method 0x9b4e4634.
⋮----
// Solidity: function stake(bytes pubkey, bytes signature, bytes32 depositDataRoot) payable returns()
func (_EigenPod *EigenPodTransactor) Stake(opts *bind.TransactOpts, pubkey []byte, signature []byte, depositDataRoot [32]byte) (*types.Transaction, error)
⋮----
// StartCheckpoint is a paid mutator transaction binding the contract method 0x88676cad.
⋮----
// Solidity: function startCheckpoint(bool revertIfNoBalance) returns()
func (_EigenPod *EigenPodTransactor) StartCheckpoint(opts *bind.TransactOpts, revertIfNoBalance bool) (*types.Transaction, error)
⋮----
// VerifyCheckpointProofs is a paid mutator transaction binding the contract method 0xf074ba62.
⋮----
// Solidity: function verifyCheckpointProofs((bytes32,bytes) balanceContainerProof, (bytes32,bytes32,bytes)[] proofs) returns()
func (_EigenPod *EigenPodTransactor) VerifyCheckpointProofs(opts *bind.TransactOpts, balanceContainerProof BeaconChainProofsBalanceContainerProof, proofs []BeaconChainProofsBalanceProof) (*types.Transaction, error)
⋮----
// VerifyStaleBalance is a paid mutator transaction binding the contract method 0x039157d2.
⋮----
// Solidity: function verifyStaleBalance(uint64 beaconTimestamp, (bytes32,bytes) stateRootProof, (bytes32[],bytes) proof) returns()
func (_EigenPod *EigenPodTransactor) VerifyStaleBalance(opts *bind.TransactOpts, beaconTimestamp uint64, stateRootProof BeaconChainProofsStateRootProof, proof BeaconChainProofsValidatorProof) (*types.Transaction, error)
⋮----
// VerifyWithdrawalCredentials is a paid mutator transaction binding the contract method 0x3f65cf19.
⋮----
// Solidity: function verifyWithdrawalCredentials(uint64 beaconTimestamp, (bytes32,bytes) stateRootProof, uint40[] validatorIndices, bytes[] validatorFieldsProofs, bytes32[][] validatorFields) returns()
func (_EigenPod *EigenPodTransactor) VerifyWithdrawalCredentials(opts *bind.TransactOpts, beaconTimestamp uint64, stateRootProof BeaconChainProofsStateRootProof, validatorIndices []*big.Int, validatorFieldsProofs [][]byte, validatorFields [][][32]byte) (*types.Transaction, error)
⋮----
// WithdrawRestakedBeaconChainETH is a paid mutator transaction binding the contract method 0xc4907442.
⋮----
// Solidity: function withdrawRestakedBeaconChainETH(address recipient, uint256 amountWei) returns()
func (_EigenPod *EigenPodTransactor) WithdrawRestakedBeaconChainETH(opts *bind.TransactOpts, recipient common.Address, amountWei *big.Int) (*types.Transaction, error)
⋮----
// Receive is a paid mutator transaction binding the contract receive function.
⋮----
// Solidity: receive() payable returns()
func (_EigenPod *EigenPodTransactor) Receive(opts *bind.TransactOpts) (*types.Transaction, error)
⋮----
return _EigenPod.contract.RawTransact(opts, nil) // calldata is disallowed for receive function
⋮----
// EigenPodCheckpointCreatedIterator is returned from FilterCheckpointCreated and is used to iterate over the raw logs and unpacked data for CheckpointCreated events raised by the EigenPod contract.
type EigenPodCheckpointCreatedIterator struct {
	Event *EigenPodCheckpointCreated // 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
}
⋮----
Event *EigenPodCheckpointCreated // 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 *EigenPodCheckpointCreatedIterator) Next() bool
⋮----
// If the iterator failed, stop iterating
⋮----
// If the iterator completed, deliver directly whatever's available
⋮----
// Iterator still in progress, wait for either a data or an error event
⋮----
// Error returns any retrieval or parsing error occurred during filtering.
func (it *EigenPodCheckpointCreatedIterator) Error() error
⋮----
// Close terminates the iteration process, releasing any pending underlying
// resources.
func (it *EigenPodCheckpointCreatedIterator) Close() error
⋮----
// EigenPodCheckpointCreated represents a CheckpointCreated event raised by the EigenPod contract.
type EigenPodCheckpointCreated struct {
	CheckpointTimestamp uint64
	BeaconBlockRoot     [32]byte
	ValidatorCount      *big.Int
	Raw                 types.Log // Blockchain specific contextual infos
}
⋮----
Raw                 types.Log // Blockchain specific contextual infos
⋮----
// FilterCheckpointCreated is a free log retrieval operation binding the contract event 0x575796133bbed337e5b39aa49a30dc2556a91e0c6c2af4b7b886ae77ebef1076.
⋮----
// Solidity: event CheckpointCreated(uint64 indexed checkpointTimestamp, bytes32 indexed beaconBlockRoot, uint256 validatorCount)
func (_EigenPod *EigenPodFilterer) FilterCheckpointCreated(opts *bind.FilterOpts, checkpointTimestamp []uint64, beaconBlockRoot [][32]byte) (*EigenPodCheckpointCreatedIterator, error)
⋮----
var checkpointTimestampRule []interface{}
⋮----
var beaconBlockRootRule []interface{}
⋮----
// WatchCheckpointCreated is a free log subscription operation binding the contract event 0x575796133bbed337e5b39aa49a30dc2556a91e0c6c2af4b7b886ae77ebef1076.
⋮----
func (_EigenPod *EigenPodFilterer) WatchCheckpointCreated(opts *bind.WatchOpts, sink chan<- *EigenPodCheckpointCreated, checkpointTimestamp []uint64, beaconBlockRoot [][32]byte) (event.Subscription, error)
⋮----
// New log arrived, parse the event and forward to the user
⋮----
// ParseCheckpointCreated is a log parse operation binding the contract event 0x575796133bbed337e5b39aa49a30dc2556a91e0c6c2af4b7b886ae77ebef1076.
⋮----
func (_EigenPod *EigenPodFilterer) ParseCheckpointCreated(log types.Log) (*EigenPodCheckpointCreated, error)
⋮----
// EigenPodCheckpointFinalizedIterator is returned from FilterCheckpointFinalized and is used to iterate over the raw logs and unpacked data for CheckpointFinalized events raised by the EigenPod contract.
type EigenPodCheckpointFinalizedIterator struct {
	Event *EigenPodCheckpointFinalized // 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
}
⋮----
Event *EigenPodCheckpointFinalized // Event containing the contract specifics and raw log
⋮----
// EigenPodCheckpointFinalized represents a CheckpointFinalized event raised by the EigenPod contract.
type EigenPodCheckpointFinalized struct {
	CheckpointTimestamp uint64
	TotalShareDeltaWei  *big.Int
	Raw                 types.Log // Blockchain specific contextual infos
}
⋮----
// FilterCheckpointFinalized is a free log retrieval operation binding the contract event 0x525408c201bc1576eb44116f6478f1c2a54775b19a043bcfdc708364f74f8e44.
⋮----
// Solidity: event CheckpointFinalized(uint64 indexed checkpointTimestamp, int256 totalShareDeltaWei)
func (_EigenPod *EigenPodFilterer) FilterCheckpointFinalized(opts *bind.FilterOpts, checkpointTimestamp []uint64) (*EigenPodCheckpointFinalizedIterator, error)
⋮----
// WatchCheckpointFinalized is a free log subscription operation binding the contract event 0x525408c201bc1576eb44116f6478f1c2a54775b19a043bcfdc708364f74f8e44.
⋮----
func (_EigenPod *EigenPodFilterer) WatchCheckpointFinalized(opts *bind.WatchOpts, sink chan<- *EigenPodCheckpointFinalized, checkpointTimestamp []uint64) (event.Subscription, error)
⋮----
// ParseCheckpointFinalized is a log parse operation binding the contract event 0x525408c201bc1576eb44116f6478f1c2a54775b19a043bcfdc708364f74f8e44.
⋮----
func (_EigenPod *EigenPodFilterer) ParseCheckpointFinalized(log types.Log) (*EigenPodCheckpointFinalized, error)
⋮----
// EigenPodConsolidationRequestedIterator is returned from FilterConsolidationRequested and is used to iterate over the raw logs and unpacked data for ConsolidationRequested events raised by the EigenPod contract.
type EigenPodConsolidationRequestedIterator struct {
	Event *EigenPodConsolidationRequested // 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
}
⋮----
Event *EigenPodConsolidationRequested // Event containing the contract specifics and raw log
⋮----
// EigenPodConsolidationRequested represents a ConsolidationRequested event raised by the EigenPod contract.
type EigenPodConsolidationRequested struct {
	SourcePubkeyHash [32]byte
	TargetPubkeyHash [32]byte
	Raw              types.Log // Blockchain specific contextual infos
}
⋮----
Raw              types.Log // Blockchain specific contextual infos
⋮----
// FilterConsolidationRequested is a free log retrieval operation binding the contract event 0x42f9c9db2ca443e9ec62f4588bd0c9b241065c02c2a8001ac164ae1282dc7b94.
⋮----
// Solidity: event ConsolidationRequested(bytes32 indexed sourcePubkeyHash, bytes32 indexed targetPubkeyHash)
func (_EigenPod *EigenPodFilterer) FilterConsolidationRequested(opts *bind.FilterOpts, sourcePubkeyHash [][32]byte, targetPubkeyHash [][32]byte) (*EigenPodConsolidationRequestedIterator, error)
⋮----
var sourcePubkeyHashRule []interface{}
⋮----
var targetPubkeyHashRule []interface{}
⋮----
// WatchConsolidationRequested is a free log subscription operation binding the contract event 0x42f9c9db2ca443e9ec62f4588bd0c9b241065c02c2a8001ac164ae1282dc7b94.
⋮----
func (_EigenPod *EigenPodFilterer) WatchConsolidationRequested(opts *bind.WatchOpts, sink chan<- *EigenPodConsolidationRequested, sourcePubkeyHash [][32]byte, targetPubkeyHash [][32]byte) (event.Subscription, error)
⋮----
// ParseConsolidationRequested is a log parse operation binding the contract event 0x42f9c9db2ca443e9ec62f4588bd0c9b241065c02c2a8001ac164ae1282dc7b94.
⋮----
func (_EigenPod *EigenPodFilterer) ParseConsolidationRequested(log types.Log) (*EigenPodConsolidationRequested, error)
⋮----
// EigenPodEigenPodStakedIterator is returned from FilterEigenPodStaked and is used to iterate over the raw logs and unpacked data for EigenPodStaked events raised by the EigenPod contract.
type EigenPodEigenPodStakedIterator struct {
	Event *EigenPodEigenPodStaked // 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
}
⋮----
Event *EigenPodEigenPodStaked // Event containing the contract specifics and raw log
⋮----
// EigenPodEigenPodStaked represents a EigenPodStaked event raised by the EigenPod contract.
type EigenPodEigenPodStaked struct {
	PubkeyHash [32]byte
	Raw        types.Log // Blockchain specific contextual infos
}
⋮----
Raw        types.Log // Blockchain specific contextual infos
⋮----
// FilterEigenPodStaked is a free log retrieval operation binding the contract event 0xa01003766d3cd97cf2ade5429690bf5d206be7fb01ef9d3a0089ecf67bc11219.
⋮----
// Solidity: event EigenPodStaked(bytes32 pubkeyHash)
func (_EigenPod *EigenPodFilterer) FilterEigenPodStaked(opts *bind.FilterOpts) (*EigenPodEigenPodStakedIterator, error)
⋮----
// WatchEigenPodStaked is a free log subscription operation binding the contract event 0xa01003766d3cd97cf2ade5429690bf5d206be7fb01ef9d3a0089ecf67bc11219.
⋮----
func (_EigenPod *EigenPodFilterer) WatchEigenPodStaked(opts *bind.WatchOpts, sink chan<- *EigenPodEigenPodStaked) (event.Subscription, error)
⋮----
// ParseEigenPodStaked is a log parse operation binding the contract event 0xa01003766d3cd97cf2ade5429690bf5d206be7fb01ef9d3a0089ecf67bc11219.
⋮----
func (_EigenPod *EigenPodFilterer) ParseEigenPodStaked(log types.Log) (*EigenPodEigenPodStaked, error)
⋮----
// EigenPodExitRequestedIterator is returned from FilterExitRequested and is used to iterate over the raw logs and unpacked data for ExitRequested events raised by the EigenPod contract.
type EigenPodExitRequestedIterator struct {
	Event *EigenPodExitRequested // 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
}
⋮----
Event *EigenPodExitRequested // Event containing the contract specifics and raw log
⋮----
// EigenPodExitRequested represents a ExitRequested event raised by the EigenPod contract.
type EigenPodExitRequested struct {
	ValidatorPubkeyHash [32]byte
	Raw                 types.Log // Blockchain specific contextual infos
}
⋮----
// FilterExitRequested is a free log retrieval operation binding the contract event 0x60d8ca014d4765a2b8b389e25714cb1cef83b574222911a01d90c1bd69d2d320.
⋮----
// Solidity: event ExitRequested(bytes32 indexed validatorPubkeyHash)
func (_EigenPod *EigenPodFilterer) FilterExitRequested(opts *bind.FilterOpts, validatorPubkeyHash [][32]byte) (*EigenPodExitRequestedIterator, error)
⋮----
var validatorPubkeyHashRule []interface{}
⋮----
// WatchExitRequested is a free log subscription operation binding the contract event 0x60d8ca014d4765a2b8b389e25714cb1cef83b574222911a01d90c1bd69d2d320.
⋮----
func (_EigenPod *EigenPodFilterer) WatchExitRequested(opts *bind.WatchOpts, sink chan<- *EigenPodExitRequested, validatorPubkeyHash [][32]byte) (event.Subscription, error)
⋮----
// ParseExitRequested is a log parse operation binding the contract event 0x60d8ca014d4765a2b8b389e25714cb1cef83b574222911a01d90c1bd69d2d320.
⋮----
func (_EigenPod *EigenPodFilterer) ParseExitRequested(log types.Log) (*EigenPodExitRequested, error)
⋮----
// EigenPodInitializedIterator is returned from FilterInitialized and is used to iterate over the raw logs and unpacked data for Initialized events raised by the EigenPod contract.
type EigenPodInitializedIterator struct {
	Event *EigenPodInitialized // 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
}
⋮----
Event *EigenPodInitialized // Event containing the contract specifics and raw log
⋮----
// EigenPodInitialized represents a Initialized event raised by the EigenPod contract.
type EigenPodInitialized struct {
	Version uint8
	Raw     types.Log // Blockchain specific contextual infos
}
⋮----
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 (_EigenPod *EigenPodFilterer) FilterInitialized(opts *bind.FilterOpts) (*EigenPodInitializedIterator, error)
⋮----
// WatchInitialized is a free log subscription operation binding the contract event 0x7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb3847402498.
⋮----
func (_EigenPod *EigenPodFilterer) WatchInitialized(opts *bind.WatchOpts, sink chan<- *EigenPodInitialized) (event.Subscription, error)
⋮----
// ParseInitialized is a log parse operation binding the contract event 0x7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb3847402498.
⋮----
func (_EigenPod *EigenPodFilterer) ParseInitialized(log types.Log) (*EigenPodInitialized, error)
⋮----
// EigenPodNonBeaconChainETHReceivedIterator is returned from FilterNonBeaconChainETHReceived and is used to iterate over the raw logs and unpacked data for NonBeaconChainETHReceived events raised by the EigenPod contract.
type EigenPodNonBeaconChainETHReceivedIterator struct {
	Event *EigenPodNonBeaconChainETHReceived // 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
}
⋮----
Event *EigenPodNonBeaconChainETHReceived // Event containing the contract specifics and raw log
⋮----
// EigenPodNonBeaconChainETHReceived represents a NonBeaconChainETHReceived event raised by the EigenPod contract.
type EigenPodNonBeaconChainETHReceived struct {
	AmountReceived *big.Int
	Raw            types.Log // Blockchain specific contextual infos
}
⋮----
Raw            types.Log // Blockchain specific contextual infos
⋮----
// FilterNonBeaconChainETHReceived is a free log retrieval operation binding the contract event 0x6fdd3dbdb173299608c0aa9f368735857c8842b581f8389238bf05bd04b3bf49.
⋮----
// Solidity: event NonBeaconChainETHReceived(uint256 amountReceived)
func (_EigenPod *EigenPodFilterer) FilterNonBeaconChainETHReceived(opts *bind.FilterOpts) (*EigenPodNonBeaconChainETHReceivedIterator, error)
⋮----
// WatchNonBeaconChainETHReceived is a free log subscription operation binding the contract event 0x6fdd3dbdb173299608c0aa9f368735857c8842b581f8389238bf05bd04b3bf49.
⋮----
func (_EigenPod *EigenPodFilterer) WatchNonBeaconChainETHReceived(opts *bind.WatchOpts, sink chan<- *EigenPodNonBeaconChainETHReceived) (event.Subscription, error)
⋮----
// ParseNonBeaconChainETHReceived is a log parse operation binding the contract event 0x6fdd3dbdb173299608c0aa9f368735857c8842b581f8389238bf05bd04b3bf49.
⋮----
func (_EigenPod *EigenPodFilterer) ParseNonBeaconChainETHReceived(log types.Log) (*EigenPodNonBeaconChainETHReceived, error)
⋮----
// EigenPodProofSubmitterUpdatedIterator is returned from FilterProofSubmitterUpdated and is used to iterate over the raw logs and unpacked data for ProofSubmitterUpdated events raised by the EigenPod contract.
type EigenPodProofSubmitterUpdatedIterator struct {
	Event *EigenPodProofSubmitterUpdated // 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
}
⋮----
Event *EigenPodProofSubmitterUpdated // Event containing the contract specifics and raw log
⋮----
// EigenPodProofSubmitterUpdated represents a ProofSubmitterUpdated event raised by the EigenPod contract.
type EigenPodProofSubmitterUpdated struct {
	PrevProofSubmitter common.Address
	NewProofSubmitter  common.Address
	Raw                types.Log // Blockchain specific contextual infos
}
⋮----
Raw                types.Log // Blockchain specific contextual infos
⋮----
// FilterProofSubmitterUpdated is a free log retrieval operation binding the contract event 0xfb8129080a19d34dceac04ba253fc50304dc86c729bd63cdca4a969ad19a5eac.
⋮----
// Solidity: event ProofSubmitterUpdated(address prevProofSubmitter, address newProofSubmitter)
func (_EigenPod *EigenPodFilterer) FilterProofSubmitterUpdated(opts *bind.FilterOpts) (*EigenPodProofSubmitterUpdatedIterator, error)
⋮----
// WatchProofSubmitterUpdated is a free log subscription operation binding the contract event 0xfb8129080a19d34dceac04ba253fc50304dc86c729bd63cdca4a969ad19a5eac.
⋮----
func (_EigenPod *EigenPodFilterer) WatchProofSubmitterUpdated(opts *bind.WatchOpts, sink chan<- *EigenPodProofSubmitterUpdated) (event.Subscription, error)
⋮----
// ParseProofSubmitterUpdated is a log parse operation binding the contract event 0xfb8129080a19d34dceac04ba253fc50304dc86c729bd63cdca4a969ad19a5eac.
⋮----
func (_EigenPod *EigenPodFilterer) ParseProofSubmitterUpdated(log types.Log) (*EigenPodProofSubmitterUpdated, error)
⋮----
// EigenPodRestakedBeaconChainETHWithdrawnIterator is returned from FilterRestakedBeaconChainETHWithdrawn and is used to iterate over the raw logs and unpacked data for RestakedBeaconChainETHWithdrawn events raised by the EigenPod contract.
type EigenPodRestakedBeaconChainETHWithdrawnIterator struct {
	Event *EigenPodRestakedBeaconChainETHWithdrawn // 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
}
⋮----
Event *EigenPodRestakedBeaconChainETHWithdrawn // Event containing the contract specifics and raw log
⋮----
// EigenPodRestakedBeaconChainETHWithdrawn represents a RestakedBeaconChainETHWithdrawn event raised by the EigenPod contract.
type EigenPodRestakedBeaconChainETHWithdrawn struct {
	Recipient common.Address
	Amount    *big.Int
	Raw       types.Log // Blockchain specific contextual infos
}
⋮----
Raw       types.Log // Blockchain specific contextual infos
⋮----
// FilterRestakedBeaconChainETHWithdrawn is a free log retrieval operation binding the contract event 0x8947fd2ce07ef9cc302c4e8f0461015615d91ce851564839e91cc804c2f49d8e.
⋮----
// Solidity: event RestakedBeaconChainETHWithdrawn(address indexed recipient, uint256 amount)
func (_EigenPod *EigenPodFilterer) FilterRestakedBeaconChainETHWithdrawn(opts *bind.FilterOpts, recipient []common.Address) (*EigenPodRestakedBeaconChainETHWithdrawnIterator, error)
⋮----
var recipientRule []interface{}
⋮----
// WatchRestakedBeaconChainETHWithdrawn is a free log subscription operation binding the contract event 0x8947fd2ce07ef9cc302c4e8f0461015615d91ce851564839e91cc804c2f49d8e.
⋮----
func (_EigenPod *EigenPodFilterer) WatchRestakedBeaconChainETHWithdrawn(opts *bind.WatchOpts, sink chan<- *EigenPodRestakedBeaconChainETHWithdrawn, recipient []common.Address) (event.Subscription, error)
⋮----
// ParseRestakedBeaconChainETHWithdrawn is a log parse operation binding the contract event 0x8947fd2ce07ef9cc302c4e8f0461015615d91ce851564839e91cc804c2f49d8e.
⋮----
func (_EigenPod *EigenPodFilterer) ParseRestakedBeaconChainETHWithdrawn(log types.Log) (*EigenPodRestakedBeaconChainETHWithdrawn, error)
⋮----
// EigenPodSwitchToCompoundingRequestedIterator is returned from FilterSwitchToCompoundingRequested and is used to iterate over the raw logs and unpacked data for SwitchToCompoundingRequested events raised by the EigenPod contract.
type EigenPodSwitchToCompoundingRequestedIterator struct {
	Event *EigenPodSwitchToCompoundingRequested // 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
}
⋮----
Event *EigenPodSwitchToCompoundingRequested // Event containing the contract specifics and raw log
⋮----
// EigenPodSwitchToCompoundingRequested represents a SwitchToCompoundingRequested event raised by the EigenPod contract.
type EigenPodSwitchToCompoundingRequested struct {
	ValidatorPubkeyHash [32]byte
	Raw                 types.Log // Blockchain specific contextual infos
}
⋮----
// FilterSwitchToCompoundingRequested is a free log retrieval operation binding the contract event 0xc97b965b92ae7fd20095fe8eb7b99f81f95f8c4adffb22a19116d8eb2846b016.
⋮----
// Solidity: event SwitchToCompoundingRequested(bytes32 indexed validatorPubkeyHash)
func (_EigenPod *EigenPodFilterer) FilterSwitchToCompoundingRequested(opts *bind.FilterOpts, validatorPubkeyHash [][32]byte) (*EigenPodSwitchToCompoundingRequestedIterator, error)
⋮----
// WatchSwitchToCompoundingRequested is a free log subscription operation binding the contract event 0xc97b965b92ae7fd20095fe8eb7b99f81f95f8c4adffb22a19116d8eb2846b016.
⋮----
func (_EigenPod *EigenPodFilterer) WatchSwitchToCompoundingRequested(opts *bind.WatchOpts, sink chan<- *EigenPodSwitchToCompoundingRequested, validatorPubkeyHash [][32]byte) (event.Subscription, error)
⋮----
// ParseSwitchToCompoundingRequested is a log parse operation binding the contract event 0xc97b965b92ae7fd20095fe8eb7b99f81f95f8c4adffb22a19116d8eb2846b016.
⋮----
func (_EigenPod *EigenPodFilterer) ParseSwitchToCompoundingRequested(log types.Log) (*EigenPodSwitchToCompoundingRequested, error)
⋮----
// EigenPodValidatorBalanceUpdatedIterator is returned from FilterValidatorBalanceUpdated and is used to iterate over the raw logs and unpacked data for ValidatorBalanceUpdated events raised by the EigenPod contract.
type EigenPodValidatorBalanceUpdatedIterator struct {
	Event *EigenPodValidatorBalanceUpdated // 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
}
⋮----
Event *EigenPodValidatorBalanceUpdated // Event containing the contract specifics and raw log
⋮----
// EigenPodValidatorBalanceUpdated represents a ValidatorBalanceUpdated event raised by the EigenPod contract.
type EigenPodValidatorBalanceUpdated struct {
	PubkeyHash              [32]byte
	BalanceTimestamp        uint64
	NewValidatorBalanceGwei uint64
	Raw                     types.Log // Blockchain specific contextual infos
}
⋮----
Raw                     types.Log // Blockchain specific contextual infos
⋮----
// FilterValidatorBalanceUpdated is a free log retrieval operation binding the contract event 0xcdae700d7241bc027168c53cf6f889763b0a2c88a65d77fc13a8a9fef0d8605f.
⋮----
// Solidity: event ValidatorBalanceUpdated(bytes32 pubkeyHash, uint64 balanceTimestamp, uint64 newValidatorBalanceGwei)
func (_EigenPod *EigenPodFilterer) FilterValidatorBalanceUpdated(opts *bind.FilterOpts) (*EigenPodValidatorBalanceUpdatedIterator, error)
⋮----
// WatchValidatorBalanceUpdated is a free log subscription operation binding the contract event 0xcdae700d7241bc027168c53cf6f889763b0a2c88a65d77fc13a8a9fef0d8605f.
⋮----
func (_EigenPod *EigenPodFilterer) WatchValidatorBalanceUpdated(opts *bind.WatchOpts, sink chan<- *EigenPodValidatorBalanceUpdated) (event.Subscription, error)
⋮----
// ParseValidatorBalanceUpdated is a log parse operation binding the contract event 0xcdae700d7241bc027168c53cf6f889763b0a2c88a65d77fc13a8a9fef0d8605f.
⋮----
func (_EigenPod *EigenPodFilterer) ParseValidatorBalanceUpdated(log types.Log) (*EigenPodValidatorBalanceUpdated, error)
⋮----
// EigenPodValidatorCheckpointedIterator is returned from FilterValidatorCheckpointed and is used to iterate over the raw logs and unpacked data for ValidatorCheckpointed events raised by the EigenPod contract.
type EigenPodValidatorCheckpointedIterator struct {
	Event *EigenPodValidatorCheckpointed // 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
}
⋮----
Event *EigenPodValidatorCheckpointed // Event containing the contract specifics and raw log
⋮----
// EigenPodValidatorCheckpointed represents a ValidatorCheckpointed event raised by the EigenPod contract.
type EigenPodValidatorCheckpointed struct {
	CheckpointTimestamp uint64
	PubkeyHash          [32]byte
	Raw                 types.Log // Blockchain specific contextual infos
}
⋮----
// FilterValidatorCheckpointed is a free log retrieval operation binding the contract event 0xe4866335761a51dcaff766448ab0af6064291ee5dc94e68492bb9cd757c1e350.
⋮----
// Solidity: event ValidatorCheckpointed(uint64 indexed checkpointTimestamp, bytes32 indexed pubkeyHash)
func (_EigenPod *EigenPodFilterer) FilterValidatorCheckpointed(opts *bind.FilterOpts, checkpointTimestamp []uint64, pubkeyHash [][32]byte) (*EigenPodValidatorCheckpointedIterator, error)
⋮----
var pubkeyHashRule []interface{}
⋮----
// WatchValidatorCheckpointed is a free log subscription operation binding the contract event 0xe4866335761a51dcaff766448ab0af6064291ee5dc94e68492bb9cd757c1e350.
⋮----
func (_EigenPod *EigenPodFilterer) WatchValidatorCheckpointed(opts *bind.WatchOpts, sink chan<- *EigenPodValidatorCheckpointed, checkpointTimestamp []uint64, pubkeyHash [][32]byte) (event.Subscription, error)
⋮----
// ParseValidatorCheckpointed is a log parse operation binding the contract event 0xe4866335761a51dcaff766448ab0af6064291ee5dc94e68492bb9cd757c1e350.
⋮----
func (_EigenPod *EigenPodFilterer) ParseValidatorCheckpointed(log types.Log) (*EigenPodValidatorCheckpointed, error)
⋮----
// EigenPodValidatorRestakedIterator is returned from FilterValidatorRestaked and is used to iterate over the raw logs and unpacked data for ValidatorRestaked events raised by the EigenPod contract.
type EigenPodValidatorRestakedIterator struct {
	Event *EigenPodValidatorRestaked // 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
}
⋮----
Event *EigenPodValidatorRestaked // Event containing the contract specifics and raw log
⋮----
// EigenPodValidatorRestaked represents a ValidatorRestaked event raised by the EigenPod contract.
type EigenPodValidatorRestaked struct {
	PubkeyHash [32]byte
	Raw        types.Log // Blockchain specific contextual infos
}
⋮----
// FilterValidatorRestaked is a free log retrieval operation binding the contract event 0x101790c2993f6a4d962bd17c786126823ba1c4cf04ff4cccb2659d50fb20aee8.
⋮----
// Solidity: event ValidatorRestaked(bytes32 pubkeyHash)
func (_EigenPod *EigenPodFilterer) FilterValidatorRestaked(opts *bind.FilterOpts) (*EigenPodValidatorRestakedIterator, error)
⋮----
// WatchValidatorRestaked is a free log subscription operation binding the contract event 0x101790c2993f6a4d962bd17c786126823ba1c4cf04ff4cccb2659d50fb20aee8.
⋮----
func (_EigenPod *EigenPodFilterer) WatchValidatorRestaked(opts *bind.WatchOpts, sink chan<- *EigenPodValidatorRestaked) (event.Subscription, error)
⋮----
// ParseValidatorRestaked is a log parse operation binding the contract event 0x101790c2993f6a4d962bd17c786126823ba1c4cf04ff4cccb2659d50fb20aee8.
⋮----
func (_EigenPod *EigenPodFilterer) ParseValidatorRestaked(log types.Log) (*EigenPodValidatorRestaked, error)
⋮----
// EigenPodValidatorWithdrawnIterator is returned from FilterValidatorWithdrawn and is used to iterate over the raw logs and unpacked data for ValidatorWithdrawn events raised by the EigenPod contract.
type EigenPodValidatorWithdrawnIterator struct {
	Event *EigenPodValidatorWithdrawn // 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
}
⋮----
Event *EigenPodValidatorWithdrawn // Event containing the contract specifics and raw log
⋮----
// EigenPodValidatorWithdrawn represents a ValidatorWithdrawn event raised by the EigenPod contract.
type EigenPodValidatorWithdrawn struct {
	CheckpointTimestamp uint64
	PubkeyHash          [32]byte
	Raw                 types.Log // Blockchain specific contextual infos
}
⋮----
// FilterValidatorWithdrawn is a free log retrieval operation binding the contract event 0x5ce0aa04ae51d52da6e680fbe0336d2e2432f7c3dc2d4f3193204c57b9072107.
⋮----
// Solidity: event ValidatorWithdrawn(uint64 indexed checkpointTimestamp, bytes32 indexed pubkeyHash)
func (_EigenPod *EigenPodFilterer) FilterValidatorWithdrawn(opts *bind.FilterOpts, checkpointTimestamp []uint64, pubkeyHash [][32]byte) (*EigenPodValidatorWithdrawnIterator, error)
⋮----
// WatchValidatorWithdrawn is a free log subscription operation binding the contract event 0x5ce0aa04ae51d52da6e680fbe0336d2e2432f7c3dc2d4f3193204c57b9072107.
⋮----
func (_EigenPod *EigenPodFilterer) WatchValidatorWithdrawn(opts *bind.WatchOpts, sink chan<- *EigenPodValidatorWithdrawn, checkpointTimestamp []uint64, pubkeyHash [][32]byte) (event.Subscription, error)
⋮----
// ParseValidatorWithdrawn is a log parse operation binding the contract event 0x5ce0aa04ae51d52da6e680fbe0336d2e2432f7c3dc2d4f3193204c57b9072107.
⋮----
func (_EigenPod *EigenPodFilterer) ParseValidatorWithdrawn(log types.Log) (*EigenPodValidatorWithdrawn, error)
⋮----
// EigenPodWithdrawalRequestedIterator is returned from FilterWithdrawalRequested and is used to iterate over the raw logs and unpacked data for WithdrawalRequested events raised by the EigenPod contract.
type EigenPodWithdrawalRequestedIterator struct {
	Event *EigenPodWithdrawalRequested // 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
}
⋮----
Event *EigenPodWithdrawalRequested // Event containing the contract specifics and raw log
⋮----
// EigenPodWithdrawalRequested represents a WithdrawalRequested event raised by the EigenPod contract.
type EigenPodWithdrawalRequested struct {
	ValidatorPubkeyHash  [32]byte
	WithdrawalAmountGwei uint64
	Raw                  types.Log // Blockchain specific contextual infos
}
⋮----
Raw                  types.Log // Blockchain specific contextual infos
⋮----
// FilterWithdrawalRequested is a free log retrieval operation binding the contract event 0x8b2737bb64ab2f2dc09552dfa1c250399e6a42c7ea9f0e1c658f5d65d708ec05.
⋮----
// Solidity: event WithdrawalRequested(bytes32 indexed validatorPubkeyHash, uint64 withdrawalAmountGwei)
func (_EigenPod *EigenPodFilterer) FilterWithdrawalRequested(opts *bind.FilterOpts, validatorPubkeyHash [][32]byte) (*EigenPodWithdrawalRequestedIterator, error)
⋮----
// WatchWithdrawalRequested is a free log subscription operation binding the contract event 0x8b2737bb64ab2f2dc09552dfa1c250399e6a42c7ea9f0e1c658f5d65d708ec05.
⋮----
func (_EigenPod *EigenPodFilterer) WatchWithdrawalRequested(opts *bind.WatchOpts, sink chan<- *EigenPodWithdrawalRequested, validatorPubkeyHash [][32]byte) (event.Subscription, error)
⋮----
// ParseWithdrawalRequested is a log parse operation binding the contract event 0x8b2737bb64ab2f2dc09552dfa1c250399e6a42c7ea9f0e1c658f5d65d708ec05.
⋮----
func (_EigenPod *EigenPodFilterer) ParseWithdrawalRequested(log types.Log) (*EigenPodWithdrawalRequested, error)
````

## File: pkg/bindings/EigenPodManager/binding.go
````go
// Code generated - DO NOT EDIT.
// This file is a generated binding and any manual changes will be lost.
⋮----
package EigenPodManager
⋮----
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"
)
⋮----
"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
)
⋮----
// OperatorSet is an auto generated low-level Go binding around an user-defined struct.
type OperatorSet struct {
	Avs common.Address
	Id  uint32
}
⋮----
// 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: "0x610100604052348015610010575f5ffd5b50604051612ca0380380612ca083398101604081905261002f9161015c565b838383836001600160a01b03811661005a576040516339b190bb60e11b815260040160405180910390fd5b6001600160a01b0390811660805292831660a05290821660c0521660e052610080610089565b505050506101b8565b5f54610100900460ff16156100f45760405162461bcd60e51b815260206004820152602760248201527f496e697469616c697a61626c653a20636f6e747261637420697320696e697469604482015266616c697a696e6760c81b606482015260840160405180910390fd5b5f5460ff90811614610143575f805460ff191660ff9081179091556040519081527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b565b6001600160a01b0381168114610159575f5ffd5b50565b5f5f5f5f6080858703121561016f575f5ffd5b845161017a81610145565b602086015190945061018b81610145565b604086015190935061019c81610145565b60608601519092506101ad81610145565b939692955090935050565b60805160a05160c05160e051612a6f6102315f395f81816105e00152818161074f015281816109a801528181610a4e01528181610ba901528181610f260152610fdb01525f81816102800152818161107101526117ce01525f61041f01525f81816104660152818161143901526119eb0152612a6f5ff3fe6080604052600436106101e6575f3560e01c8063886f119511610108578063a6a509be1161009d578063f2fde38b1161006d578063f2fde38b14610602578063f5d4fed314610621578063f6848d2414610636578063fabc1cbc1461066f578063fe243a171461068e575f5ffd5b8063a6a509be14610570578063cd6dc68714610585578063d48e8894146105a4578063ea4d3c9b146105cf575f5ffd5b80639ba06275116100d85780639ba06275146104df578063a1ca780b14610513578063a38406a314610532578063a3d75e0914610551575f5ffd5b8063886f1195146104555780638da5cb5b146104885780639104c319146104a55780639b4e4634146104cc575f5ffd5b8063595edbcb1161017e578063715018a61161014e578063715018a6146103db578063724af423146103ef57806374cdd7981461040e57806384d8106214610441575f5ffd5b8063595edbcb146103405780635a26fbf41461035f5780635ac86ab71461037e5780635c975abb146103bd575f5ffd5b80632eae418c116101b95780632eae418c146102ba5780633fb99ca5146102d957806350ff7225146102f8578063595c6a671461032c575f5ffd5b80630d1e9de1146101ea578063136439dd1461020b5780632704351a1461022a578063292b7b2b1461026f575b5f5ffd5b3480156101f5575f5ffd5b50610209610204366004611cbe565b6106ad565b005b348015610216575f5ffd5b50610209610225366004611cd9565b61070a565b348015610235575f5ffd5b50609f5461025190600160a01b900467ffffffffffffffff1681565b60405167ffffffffffffffff90911681526020015b60405180910390f35b34801561027a575f5ffd5b506102a27f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b039091168152602001610266565b3480156102c5575f5ffd5b506102096102d4366004611cf0565b610744565b3480156102e4575f5ffd5b506102096102f3366004611d3e565b61099d565b348015610303575f5ffd5b50610317610312366004611d88565b610a41565b60408051928352602083019190915201610266565b348015610337575f5ffd5b50610209610af1565b34801561034b575f5ffd5b50609f546102a2906001600160a01b031681565b34801561036a575f5ffd5b50610209610379366004611dc6565b610b05565b348015610389575f5ffd5b506103ad610398366004611ded565b606654600160ff9092169190911b9081161490565b6040519015158152602001610266565b3480156103c8575f5ffd5b506066545b604051908152602001610266565b3480156103e6575f5ffd5b50610209610b8c565b3480156103fa575f5ffd5b506103cd610409366004611d88565b610b9d565b348015610419575f5ffd5b506102a27f000000000000000000000000000000000000000000000000000000000000000081565b34801561044c575f5ffd5b506102a2610ce2565b348015610460575f5ffd5b506102a27f000000000000000000000000000000000000000000000000000000000000000081565b348015610493575f5ffd5b506033546001600160a01b03166102a2565b3480156104b0575f5ffd5b506102a273beac0eeeeeeeeeeeeeeeeeeeeeeeeeeeeeebeac081565b6102096104da366004611e4b565b610d45565b3480156104ea575f5ffd5b506102a26104f9366004611cbe565b60986020525f90815260409020546001600160a01b031681565b34801561051e575f5ffd5b5061020961052d366004611ebe565b610df6565b34801561053d575f5ffd5b506102a261054c366004611cbe565b611017565b34801561055c575f5ffd5b5061025161056b366004611cbe565b6110e8565b34801561057b575f5ffd5b506103cd60995481565b348015610590575f5ffd5b5061020961059f366004611ef0565b611148565b3480156105af575f5ffd5b506103cd6105be366004611cbe565b609b6020525f908152604090205481565b3480156105da575f5ffd5b506102a27f000000000000000000000000000000000000000000000000000000000000000081565b34801561060d575f5ffd5b5061020961061c366004611cbe565b611264565b34801561062c575f5ffd5b506103cd609e5481565b348015610641575f5ffd5b506103ad610650366004611cbe565b6001600160a01b039081165f9081526098602052604090205416151590565b34801561067a575f5ffd5b50610209610689366004611cd9565b6112dd565b348015610699575f5ffd5b506103cd6106a8366004611f1a565b61134a565b6106b56113ca565b609f80546001600160a01b0319166001600160a01b0383169081179091556040519081527f7025c71a9fe60d709e71b377dc5f7c72c3e1d8539f8022574254e736ceca01e5906020015b60405180910390a150565b610712611424565b60665481811681146107375760405163c61dca5d60e01b815260040160405180910390fd5b610740826114c7565b5050565b336001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000161461078d5760405163f739589b60e01b815260040160405180910390fd5b610795611504565b6001600160a01b03831673beac0eeeeeeeeeeeeeeeeeeeeeeeeeeeeeebeac0146107d257604051632711b74d60e11b815260040160405180910390fd5b6001600160a01b0384166107f9576040516339b190bb60e11b815260040160405180910390fd5b5f81136108195760405163ef147de160e01b815260040160405180910390fd5b6001600160a01b0384165f908152609b6020526040812054908290821215610913575f61084583611f65565b90505f8185111561086357508061085c8186611f7f565b9250610869565b505f9150835b5f6108748286611f92565b6001600160a01b038a165f818152609b60205260409081902083905551919250907f4e2b791dedccd9fb30141b088cabf5c14a8912b52f59375c95c010700b8c6193906108c49085815260200190565b60405180910390a2886001600160a01b03167fd4def76d6d2bed6f14d5cd9af73cc2913d618d00edde42432e81c09bfe0770988260405161090791815260200190565b60405180910390a25050505b801561098b576001600160a01b038681165f81815260986020526040908190205490516362483a2160e11b81526004810192909252602482018490529091169063c4907442906044015b5f604051808303815f87803b158015610974575f5ffd5b505af1158015610986573d5f5f3e3d5ffd5b505050505b5050610997600160c955565b50505050565b336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146109e65760405163f739589b60e01b815260040160405180910390fd5b6109ee611504565b80609e5f8282546109ff9190611fb9565b90915550506040518181527f1ed04b7fd262c0d9e50fa02957f32a81a151f03baaa367faeedc7521b001c4a49060200160405180910390a1610997600160c955565b5f80336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614610a8c5760405163f739589b60e01b815260040160405180910390fd5b610a94611504565b6001600160a01b03841673beac0eeeeeeeeeeeeeeeeeeeeeeeeeeeeeebeac014610ad157604051632711b74d60e11b815260040160405180910390fd5b610adb858461155d565b91509150610ae9600160c955565b935093915050565b610af9611424565b610b035f196114c7565b565b609f546001600160a01b03163314610b3057604051630986113760e41b815260040160405180910390fd5b609f805467ffffffffffffffff60a01b1916600160a01b67ffffffffffffffff8416908102919091179091556040519081527f1bc8f042a52db3a437620dea4548f2031fb2a16dd8d3b0b854295528dd2cdd33906020016106ff565b610b946113ca565b610b035f6116a4565b5f336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614610be75760405163f739589b60e01b815260040160405180910390fd5b610bef611504565b6001600160a01b03831673beac0eeeeeeeeeeeeeeeeeeeeeeeeeeeeeebeac014610c2c57604051632711b74d60e11b815260040160405180910390fd5b5f610c36836116f5565b6001600160a01b0386165f908152609b6020526040902054610c589190611fcc565b90505f811215610c7b5760405163ef147de160e01b815260040160405180910390fd5b6001600160a01b0385165f818152609b602052604090819020839055517fd4def76d6d2bed6f14d5cd9af73cc2913d618d00edde42432e81c09bfe07709890610cc79084815260200190565b60405180910390a29050610cdb600160c955565b9392505050565b5f5f610ced8161175e565b610cf5611504565b335f908152609860205260409020546001600160a01b031615610d2b5760405163031a852160e21b815260040160405180910390fd5b5f610d34611789565b925050610d41600160c955565b5090565b5f610d4f8161175e565b610d57611504565b335f908152609860205260409020546001600160a01b031680610d7f57610d7c611789565b90505b6040516326d3918d60e21b81526001600160a01b03821690639b4e4634903490610db5908b908b908b908b908b9060040161201a565b5f604051808303818588803b158015610dcc575f5ffd5b505af1158015610dde573d5f5f3e3d5ffd5b505050505050610dee600160c955565b505050505050565b6001600160a01b038084165f908152609860205260409020548491163314610e31576040516312e16d7160e11b815260040160405180910390fd5b610e39611504565b6001600160a01b038416610e60576040516339b190bb60e11b815260040160405180910390fd5b610e6e633b9aca0083612067565b15610e8c576040516347d072bb60e11b815260040160405180910390fd5b6001600160a01b0384165f908152609b602052604081205490811215610ec557604051634b692bcf60e01b815260040160405180910390fd5b5f831315610f86575f5f610ed9878661155d565b604051631e328e7960e11b81526001600160a01b038a8116600483015273beac0eeeeeeeeeeeeeeeeeeeeeeeeeeeeeebeac0602483015260448201849052606482018390529294509092507f000000000000000000000000000000000000000000000000000000000000000090911690633c651cf2906084015f604051808303815f87803b158015610f69575f5ffd5b505af1158015610f7b573d5f5f3e3d5ffd5b50505050505061100c565b5f83121561100c575f610fa28686610f9d87611f65565b6118e4565b60405163305068e760e11b81526001600160a01b0388811660048301526024820185905267ffffffffffffffff831660448301529192507f0000000000000000000000000000000000000000000000000000000000000000909116906360a0d1ce9060640161095d565b50610997600160c955565b6001600160a01b038082165f90815260986020526040812054909116806110e2576110df836001600160a01b03165f1b60405180610940016040528061090e815260200161212c61090e9139604080516001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000166020820152808201919091525f606082015260800160408051601f19818403018152908290526110c4929160200161209d565b604051602081830303815290604052805190602001206119dd565b90505b92915050565b6001600160a01b0381165f908152609d6020908152604080832081518083019092525460ff8116151580835261010090910467ffffffffffffffff16928201929092529061113e57670de0b6b3a7640000610cdb565b6020015192915050565b5f54610100900460ff161580801561116657505f54600160ff909116105b8061117f5750303b15801561117f57505f5460ff166001145b6111e75760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b60648201526084015b60405180910390fd5b5f805460ff191660011790558015611208575f805461ff0019166101001790555b611211836116a4565b61121a826114c7565b801561125f575f805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b505050565b61126c6113ca565b6001600160a01b0381166112d15760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084016111de565b6112da816116a4565b50565b6112e56119e9565b6066548019821981161461130c5760405163c61dca5d60e01b815260040160405180910390fd5b606682905560405182815233907f3582d1828e26bf56bd801502bc021ac0bc8afb57c826e4986b45593c8fad389c9060200160405180910390a25050565b5f6001600160a01b03821673beac0eeeeeeeeeeeeeeeeeeeeeeeeeeeeeebeac01461138857604051632711b74d60e11b815260040160405180910390fd5b6001600160a01b0383165f908152609b6020526040812054126113c2576001600160a01b0383165f908152609b60205260409020546110df565b505f92915050565b6033546001600160a01b03163314610b035760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016111de565b60405163237dfb4760e11b81523360048201527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906346fbf68e90602401602060405180830381865afa158015611486573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906114aa91906120b9565b610b0357604051631d77d47760e21b815260040160405180910390fd5b606681905560405181815233907fab40a374bc51de372200a8bc981af8c9ecdc08dfdaef0bb6e09f88f3c616ef3d9060200160405180910390a250565b600260c954036115565760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c0060448201526064016111de565b600260c955565b5f806001600160a01b038416611586576040516339b190bb60e11b815260040160405180910390fd5b5f8312156115a75760405163ef147de160e01b815260040160405180910390fd5b6001600160a01b0384165f908152609b602052604081205484916115cb8383611f92565b6001600160a01b0388165f818152609b60205260409081902083905551919250907f4e2b791dedccd9fb30141b088cabf5c14a8912b52f59375c95c010700b8c61939061161b9086815260200190565b60405180910390a2866001600160a01b03167fd4def76d6d2bed6f14d5cd9af73cc2913d618d00edde42432e81c09bfe0770988260405161165e91815260200190565b60405180910390a25f811361167b575f5f9450945050505061169d565b5f821215611690575f9450925061169d915050565b50925083915061169d9050565b9250929050565b603380546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a35050565b5f6001600160ff1b03821115610d415760405162461bcd60e51b815260206004820152602860248201527f53616665436173743a2076616c756520646f65736e27742066697420696e2061604482015267371034b73a191a9b60c11b60648201526084016111de565b606654600160ff83161b908116036112da5760405163840a48d560e01b815260040160405180910390fd5b5f60995f8154611798906120d8565b9091555060408051610940810190915261090e8082525f91611835918391339161212c6020830139604080516001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000166020820152808201919091525f606082015260800160408051601f1981840301815290829052611821929160200161209d565b604051602081830303815290604052611a9a565b60405163189acdbd60e31b81523360048201529091506001600160a01b0382169063c4d66de8906024015f604051808303815f87803b158015611876575f5ffd5b505af1158015611888573d5f5f3e3d5ffd5b5050335f8181526098602052604080822080546001600160a01b0319166001600160a01b038816908117909155905192945092507f21c99d0db02213c32fff5b05cf0a718ab5f858802b91498f80d82270289d856a91a3919050565b5f806118f08385611f7f565b90505f6118fc866110e8565b90505f61191467ffffffffffffffff83168488611b9c565b90505f61192182846120f0565b6040805180820182526001815267ffffffffffffffff85811660208084018281526001600160a01b038f165f818152609d845287902095518654925168ffffffffffffffffff1990931690151568ffffffffffffffff001916176101009286169290920291909117909455845193845291881691830191909152918101919091529091507fb160ab8589bf47dc04ea11b50d46678d21590cea2ed3e454e7bd3e41510f98cf9060600160405180910390a1979650505050505050565b5f6110df838330611c81565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663eab66d7a6040518163ffffffff1660e01b8152600401602060405180830381865afa158015611a45573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611a699190612110565b6001600160a01b0316336001600160a01b031614610b035760405163794821ff60e01b815260040160405180910390fd5b5f83471015611aeb5760405162461bcd60e51b815260206004820152601d60248201527f437265617465323a20696e73756666696369656e742062616c616e636500000060448201526064016111de565b81515f03611b3b5760405162461bcd60e51b815260206004820181905260248201527f437265617465323a2062797465636f6465206c656e677468206973207a65726f60448201526064016111de565b8282516020840186f590506001600160a01b038116610cdb5760405162461bcd60e51b815260206004820152601960248201527f437265617465323a204661696c6564206f6e206465706c6f790000000000000060448201526064016111de565b5f80805f19858709858702925082811083820303915050805f03611bd357838281611bc957611bc9612053565b0492505050610cdb565b808411611c1a5760405162461bcd60e51b81526020600482015260156024820152744d6174683a206d756c446976206f766572666c6f7760581b60448201526064016111de565b5f8486880960026001871981018816978890046003810283188082028403028082028403028082028403028082028403028082028403029081029092039091025f889003889004909101858311909403939093029303949094049190911702949350505050565b5f604051836040820152846020820152828152600b8101905060ff815360559020949350505050565b6001600160a01b03811681146112da575f5ffd5b5f60208284031215611cce575f5ffd5b8135610cdb81611caa565b5f60208284031215611ce9575f5ffd5b5035919050565b5f5f5f5f60808587031215611d03575f5ffd5b8435611d0e81611caa565b93506020850135611d1e81611caa565b92506040850135611d2e81611caa565b9396929550929360600135925050565b5f5f5f5f84860360a0811215611d52575f5ffd5b6040811215611d5f575f5ffd5b50849350604084013592506060840135611d7881611caa565b9396929550929360800135925050565b5f5f5f60608486031215611d9a575f5ffd5b8335611da581611caa565b92506020840135611db581611caa565b929592945050506040919091013590565b5f60208284031215611dd6575f5ffd5b813567ffffffffffffffff81168114610cdb575f5ffd5b5f60208284031215611dfd575f5ffd5b813560ff81168114610cdb575f5ffd5b5f5f83601f840112611e1d575f5ffd5b50813567ffffffffffffffff811115611e34575f5ffd5b60208301915083602082850101111561169d575f5ffd5b5f5f5f5f5f60608688031215611e5f575f5ffd5b853567ffffffffffffffff811115611e75575f5ffd5b611e8188828901611e0d565b909650945050602086013567ffffffffffffffff811115611ea0575f5ffd5b611eac88828901611e0d565b96999598509660400135949350505050565b5f5f5f60608486031215611ed0575f5ffd5b8335611edb81611caa565b95602085013595506040909401359392505050565b5f5f60408385031215611f01575f5ffd5b8235611f0c81611caa565b946020939093013593505050565b5f5f60408385031215611f2b575f5ffd5b8235611f3681611caa565b91506020830135611f4681611caa565b809150509250929050565b634e487b7160e01b5f52601160045260245ffd5b5f600160ff1b8201611f7957611f79611f51565b505f0390565b818103818111156110e2576110e2611f51565b8082018281125f831280158216821582161715611fb157611fb1611f51565b505092915050565b808201808211156110e2576110e2611f51565b8181035f831280158383131683831282161715611feb57611feb611f51565b5092915050565b81835281816020850137505f828201602090810191909152601f909101601f19169091010190565b606081525f61202d606083018789611ff2565b8281036020840152612040818688611ff2565b9150508260408301529695505050505050565b634e487b7160e01b5f52601260045260245ffd5b5f8261208157634e487b7160e01b5f52601260045260245ffd5b500790565b5f81518060208401855e5f93019283525090919050565b5f6120b16120ab8386612086565b84612086565b949350505050565b5f602082840312156120c9575f5ffd5b81518015158114610cdb575f5ffd5b5f600182016120e9576120e9611f51565b5060010190565b67ffffffffffffffff82811682821603908111156110e2576110e2611f51565b5f60208284031215612120575f5ffd5b8151610cdb81611caa56fe608060405260405161090e38038061090e83398101604081905261002291610460565b61002e82826000610035565b505061058a565b61003e83610100565b6040516001600160a01b038416907f1cf3b03a6cf19fa2baba4df148e9dcabedea7f8a5c07840e207e5c089be95d3e90600090a260008251118061007f5750805b156100fb576100f9836001600160a01b0316635c60da1b6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156100c5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906100e99190610520565b836102a360201b6100291760201c565b505b505050565b610113816102cf60201b6100551760201c565b6101725760405162461bcd60e51b815260206004820152602560248201527f455243313936373a206e657720626561636f6e206973206e6f74206120636f6e6044820152641d1c9858dd60da1b60648201526084015b60405180910390fd5b6101e6816001600160a01b0316635c60da1b6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156101b3573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906101d79190610520565b6102cf60201b6100551760201c565b61024b5760405162461bcd60e51b815260206004820152603060248201527f455243313936373a20626561636f6e20696d706c656d656e746174696f6e206960448201526f1cc81b9bdd08184818dbdb9d1c9858dd60821b6064820152608401610169565b806102827fa3f0ad74e5423aebfd80d3ef4346578335a9a72aeaee59ff6cb3582b35133d5060001b6102de60201b6100641760201c565b80546001600160a01b0319166001600160a01b039290921691909117905550565b60606102c883836040518060600160405280602781526020016108e7602791396102e1565b9392505050565b6001600160a01b03163b151590565b90565b6060600080856001600160a01b0316856040516102fe919061053b565b600060405180830381855af49150503d8060008114610339576040519150601f19603f3d011682016040523d82523d6000602084013e61033e565b606091505b5090925090506103508683838761035a565b9695505050505050565b606083156103c65782516103bf576001600160a01b0385163b6103bf5760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610169565b50816103d0565b6103d083836103d8565b949350505050565b8151156103e85781518083602001fd5b8060405162461bcd60e51b81526004016101699190610557565b80516001600160a01b038116811461041957600080fd5b919050565b634e487b7160e01b600052604160045260246000fd5b60005b8381101561044f578181015183820152602001610437565b838111156100f95750506000910152565b6000806040838503121561047357600080fd5b61047c83610402565b60208401519092506001600160401b038082111561049957600080fd5b818501915085601f8301126104ad57600080fd5b8151818111156104bf576104bf61041e565b604051601f8201601f19908116603f011681019083821181831017156104e7576104e761041e565b8160405282815288602084870101111561050057600080fd5b610511836020830160208801610434565b80955050505050509250929050565b60006020828403121561053257600080fd5b6102c882610402565b6000825161054d818460208701610434565b9190910192915050565b6020815260008251806020840152610576816040850160208701610434565b601f01601f19169190910160400192915050565b61034e806105996000396000f3fe60806040523661001357610011610017565b005b6100115b610027610022610067565b610100565b565b606061004e83836040518060600160405280602781526020016102f260279139610124565b9392505050565b6001600160a01b03163b151590565b90565b600061009a7fa3f0ad74e5423aebfd80d3ef4346578335a9a72aeaee59ff6cb3582b35133d50546001600160a01b031690565b6001600160a01b0316635c60da1b6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156100d7573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906100fb9190610249565b905090565b3660008037600080366000845af43d6000803e80801561011f573d6000f35b3d6000fd5b6060600080856001600160a01b03168560405161014191906102a2565b600060405180830381855af49150503d806000811461017c576040519150601f19603f3d011682016040523d82523d6000602084013e610181565b606091505b50915091506101928683838761019c565b9695505050505050565b6060831561020d578251610206576001600160a01b0385163b6102065760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e747261637400000060448201526064015b60405180910390fd5b5081610217565b610217838361021f565b949350505050565b81511561022f5781518083602001fd5b8060405162461bcd60e51b81526004016101fd91906102be565b60006020828403121561025b57600080fd5b81516001600160a01b038116811461004e57600080fd5b60005b8381101561028d578181015183820152602001610275565b8381111561029c576000848401525b50505050565b600082516102b4818460208701610272565b9190910192915050565b60208152600082518060208401526102dd816040850160208701610272565b601f01601f1916919091016040019291505056fe416464726573733a206c6f772d6c6576656c2064656c65676174652063616c6c206661696c6564a2646970667358221220d51e81d3bc5ed20a26aeb05dce7e825c503b2061aa78628027300c8d65b9d89a64736f6c634300080c0033416464726573733a206c6f772d6c6576656c2064656c65676174652063616c6c206661696c6564a2646970667358221220fbc50b663db261986708ae3cc41f798b18bab8ae5eff153cd10fa1145a54d59764736f6c634300081e0033",
}
⋮----
// EigenPodManagerABI is the input ABI used to generate the binding from.
// Deprecated: Use EigenPodManagerMetaData.ABI instead.
var EigenPodManagerABI = EigenPodManagerMetaData.ABI
⋮----
// EigenPodManagerBin is the compiled bytecode used for deploying new contracts.
// Deprecated: Use EigenPodManagerMetaData.Bin instead.
var EigenPodManagerBin = EigenPodManagerMetaData.Bin
⋮----
// DeployEigenPodManager deploys a new Ethereum contract, binding an instance of EigenPodManager to it.
func DeployEigenPodManager(auth *bind.TransactOpts, backend bind.ContractBackend, _ethPOS common.Address, _eigenPodBeacon common.Address, _delegationManager common.Address, _pauserRegistry common.Address) (common.Address, *types.Transaction, *EigenPodManager, error)
⋮----
// EigenPodManager is an auto generated Go binding around an Ethereum contract.
type EigenPodManager struct {
	EigenPodManagerCaller     // Read-only binding to the contract
	EigenPodManagerTransactor // Write-only binding to the contract
	EigenPodManagerFilterer   // Log filterer for contract events
}
⋮----
EigenPodManagerCaller     // Read-only binding to the contract
EigenPodManagerTransactor // Write-only binding to the contract
EigenPodManagerFilterer   // Log filterer for contract events
⋮----
// EigenPodManagerCaller is an auto generated read-only Go binding around an Ethereum contract.
type EigenPodManagerCaller struct {
	contract *bind.BoundContract // Generic contract wrapper for the low level calls
}
⋮----
contract *bind.BoundContract // Generic contract wrapper for the low level calls
⋮----
// EigenPodManagerTransactor is an auto generated write-only Go binding around an Ethereum contract.
type EigenPodManagerTransactor struct {
	contract *bind.BoundContract // Generic contract wrapper for the low level calls
}
⋮----
// EigenPodManagerFilterer is an auto generated log filtering Go binding around an Ethereum contract events.
type EigenPodManagerFilterer struct {
	contract *bind.BoundContract // Generic contract wrapper for the low level calls
}
⋮----
// EigenPodManagerSession is an auto generated Go binding around an Ethereum contract,
// with pre-set call and transact options.
type EigenPodManagerSession struct {
	Contract     *EigenPodManager  // 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
}
⋮----
Contract     *EigenPodManager  // 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
⋮----
// EigenPodManagerCallerSession is an auto generated read-only Go binding around an Ethereum contract,
// with pre-set call options.
type EigenPodManagerCallerSession struct {
	Contract *EigenPodManagerCaller // Generic contract caller binding to set the session for
	CallOpts bind.CallOpts          // Call options to use throughout this session
}
⋮----
Contract *EigenPodManagerCaller // Generic contract caller binding to set the session for
CallOpts bind.CallOpts          // Call options to use throughout this session
⋮----
// EigenPodManagerTransactorSession is an auto generated write-only Go binding around an Ethereum contract,
// with pre-set transact options.
type EigenPodManagerTransactorSession struct {
	Contract     *EigenPodManagerTransactor // Generic contract transactor binding to set the session for
	TransactOpts bind.TransactOpts          // Transaction auth options to use throughout this session
}
⋮----
Contract     *EigenPodManagerTransactor // Generic contract transactor binding to set the session for
TransactOpts bind.TransactOpts          // Transaction auth options to use throughout this session
⋮----
// EigenPodManagerRaw is an auto generated low-level Go binding around an Ethereum contract.
type EigenPodManagerRaw struct {
	Contract *EigenPodManager // Generic contract binding to access the raw methods on
}
⋮----
Contract *EigenPodManager // Generic contract binding to access the raw methods on
⋮----
// EigenPodManagerCallerRaw is an auto generated low-level read-only Go binding around an Ethereum contract.
type EigenPodManagerCallerRaw struct {
	Contract *EigenPodManagerCaller // Generic read-only contract binding to access the raw methods on
}
⋮----
Contract *EigenPodManagerCaller // Generic read-only contract binding to access the raw methods on
⋮----
// EigenPodManagerTransactorRaw is an auto generated low-level write-only Go binding around an Ethereum contract.
type EigenPodManagerTransactorRaw struct {
	Contract *EigenPodManagerTransactor // Generic write-only contract binding to access the raw methods on
}
⋮----
Contract *EigenPodManagerTransactor // Generic write-only contract binding to access the raw methods on
⋮----
// NewEigenPodManager creates a new instance of EigenPodManager, bound to a specific deployed contract.
func NewEigenPodManager(address common.Address, backend bind.ContractBackend) (*EigenPodManager, error)
⋮----
// NewEigenPodManagerCaller creates a new read-only instance of EigenPodManager, bound to a specific deployed contract.
func NewEigenPodManagerCaller(address common.Address, caller bind.ContractCaller) (*EigenPodManagerCaller, error)
⋮----
// NewEigenPodManagerTransactor creates a new write-only instance of EigenPodManager, bound to a specific deployed contract.
func NewEigenPodManagerTransactor(address common.Address, transactor bind.ContractTransactor) (*EigenPodManagerTransactor, error)
⋮----
// NewEigenPodManagerFilterer creates a new log filterer instance of EigenPodManager, bound to a specific deployed contract.
func NewEigenPodManagerFilterer(address common.Address, filterer bind.ContractFilterer) (*EigenPodManagerFilterer, error)
⋮----
// bindEigenPodManager binds a generic wrapper to an already deployed contract.
func bindEigenPodManager(address common.Address, caller bind.ContractCaller, transactor bind.ContractTransactor, filterer bind.ContractFilterer) (*bind.BoundContract, error)
⋮----
// 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 (_EigenPodManager *EigenPodManagerRaw) Call(opts *bind.CallOpts, result *[]interface
⋮----
// Transfer initiates a plain transaction to move funds to the contract, calling
// its default method if one is available.
func (_EigenPodManager *EigenPodManagerRaw) Transfer(opts *bind.TransactOpts) (*types.Transaction, error)
⋮----
// Transact invokes the (paid) contract method with params as input values.
func (_EigenPodManager *EigenPodManagerRaw) Transact(opts *bind.TransactOpts, method string, params ...interface
⋮----
// BeaconChainETHStrategy is a free data retrieval call binding the contract method 0x9104c319.
//
// Solidity: function beaconChainETHStrategy() view returns(address)
func (_EigenPodManager *EigenPodManagerCaller) BeaconChainETHStrategy(opts *bind.CallOpts) (common.Address, error)
⋮----
var out []interface{}
⋮----
// BeaconChainSlashingFactor is a free data retrieval call binding the contract method 0xa3d75e09.
⋮----
// Solidity: function beaconChainSlashingFactor(address podOwner) view returns(uint64)
func (_EigenPodManager *EigenPodManagerCaller) BeaconChainSlashingFactor(opts *bind.CallOpts, podOwner common.Address) (uint64, error)
⋮----
// BurnableETHShares is a free data retrieval call binding the contract method 0xf5d4fed3.
⋮----
// Solidity: function burnableETHShares() view returns(uint256)
func (_EigenPodManager *EigenPodManagerCaller) BurnableETHShares(opts *bind.CallOpts) (*big.Int, error)
⋮----
// DelegationManager is a free data retrieval call binding the contract method 0xea4d3c9b.
⋮----
// Solidity: function delegationManager() view returns(address)
func (_EigenPodManager *EigenPodManagerCaller) DelegationManager(opts *bind.CallOpts) (common.Address, error)
⋮----
// EigenPodBeacon is a free data retrieval call binding the contract method 0x292b7b2b.
⋮----
// Solidity: function eigenPodBeacon() view returns(address)
func (_EigenPodManager *EigenPodManagerCaller) EigenPodBeacon(opts *bind.CallOpts) (common.Address, error)
⋮----
// EthPOS is a free data retrieval call binding the contract method 0x74cdd798.
⋮----
// Solidity: function ethPOS() view returns(address)
func (_EigenPodManager *EigenPodManagerCaller) EthPOS(opts *bind.CallOpts) (common.Address, error)
⋮----
// GetPod is a free data retrieval call binding the contract method 0xa38406a3.
⋮----
// Solidity: function getPod(address podOwner) view returns(address)
func (_EigenPodManager *EigenPodManagerCaller) GetPod(opts *bind.CallOpts, podOwner common.Address) (common.Address, error)
⋮----
// HasPod is a free data retrieval call binding the contract method 0xf6848d24.
⋮----
// Solidity: function hasPod(address podOwner) view returns(bool)
func (_EigenPodManager *EigenPodManagerCaller) HasPod(opts *bind.CallOpts, podOwner common.Address) (bool, error)
⋮----
// NumPods is a free data retrieval call binding the contract method 0xa6a509be.
⋮----
// Solidity: function numPods() view returns(uint256)
func (_EigenPodManager *EigenPodManagerCaller) NumPods(opts *bind.CallOpts) (*big.Int, error)
⋮----
// Owner is a free data retrieval call binding the contract method 0x8da5cb5b.
⋮----
// Solidity: function owner() view returns(address)
func (_EigenPodManager *EigenPodManagerCaller) Owner(opts *bind.CallOpts) (common.Address, error)
⋮----
// OwnerToPod is a free data retrieval call binding the contract method 0x9ba06275.
⋮----
// Solidity: function ownerToPod(address podOwner) view returns(address)
func (_EigenPodManager *EigenPodManagerCaller) OwnerToPod(opts *bind.CallOpts, podOwner common.Address) (common.Address, error)
⋮----
// Paused is a free data retrieval call binding the contract method 0x5ac86ab7.
⋮----
// Solidity: function paused(uint8 index) view returns(bool)
func (_EigenPodManager *EigenPodManagerCaller) Paused(opts *bind.CallOpts, index uint8) (bool, error)
⋮----
// Paused0 is a free data retrieval call binding the contract method 0x5c975abb.
⋮----
// Solidity: function paused() view returns(uint256)
func (_EigenPodManager *EigenPodManagerCaller) Paused0(opts *bind.CallOpts) (*big.Int, error)
⋮----
// PauserRegistry is a free data retrieval call binding the contract method 0x886f1195.
⋮----
// Solidity: function pauserRegistry() view returns(address)
func (_EigenPodManager *EigenPodManagerCaller) PauserRegistry(opts *bind.CallOpts) (common.Address, error)
⋮----
// PectraForkTimestamp is a free data retrieval call binding the contract method 0x2704351a.
⋮----
// Solidity: function pectraForkTimestamp() view returns(uint64)
func (_EigenPodManager *EigenPodManagerCaller) PectraForkTimestamp(opts *bind.CallOpts) (uint64, error)
⋮----
// PodOwnerDepositShares is a free data retrieval call binding the contract method 0xd48e8894.
⋮----
// Solidity: function podOwnerDepositShares(address podOwner) view returns(int256 shares)
func (_EigenPodManager *EigenPodManagerCaller) PodOwnerDepositShares(opts *bind.CallOpts, podOwner common.Address) (*big.Int, error)
⋮----
// ProofTimestampSetter is a free data retrieval call binding the contract method 0x595edbcb.
⋮----
// Solidity: function proofTimestampSetter() view returns(address)
func (_EigenPodManager *EigenPodManagerCaller) ProofTimestampSetter(opts *bind.CallOpts) (common.Address, error)
⋮----
// StakerDepositShares is a free data retrieval call binding the contract method 0xfe243a17.
⋮----
// Solidity: function stakerDepositShares(address user, address strategy) view returns(uint256 depositShares)
func (_EigenPodManager *EigenPodManagerCaller) StakerDepositShares(opts *bind.CallOpts, user common.Address, strategy common.Address) (*big.Int, error)
⋮----
// AddShares is a paid mutator transaction binding the contract method 0x50ff7225.
⋮----
// Solidity: function addShares(address staker, address strategy, uint256 shares) returns(uint256, uint256)
func (_EigenPodManager *EigenPodManagerTransactor) AddShares(opts *bind.TransactOpts, staker common.Address, strategy common.Address, shares *big.Int) (*types.Transaction, error)
⋮----
// CreatePod is a paid mutator transaction binding the contract method 0x84d81062.
⋮----
// Solidity: function createPod() returns(address)
func (_EigenPodManager *EigenPodManagerTransactor) CreatePod(opts *bind.TransactOpts) (*types.Transaction, error)
⋮----
// IncreaseBurnOrRedistributableShares is a paid mutator transaction binding the contract method 0x3fb99ca5.
⋮----
// Solidity: function increaseBurnOrRedistributableShares((address,uint32) , uint256 , address , uint256 addedSharesToBurn) returns()
func (_EigenPodManager *EigenPodManagerTransactor) IncreaseBurnOrRedistributableShares(opts *bind.TransactOpts, arg0 OperatorSet, arg1 *big.Int, arg2 common.Address, addedSharesToBurn *big.Int) (*types.Transaction, error)
⋮----
// Initialize is a paid mutator transaction binding the contract method 0xcd6dc687.
⋮----
// Solidity: function initialize(address initialOwner, uint256 _initPausedStatus) returns()
func (_EigenPodManager *EigenPodManagerTransactor) Initialize(opts *bind.TransactOpts, initialOwner common.Address, _initPausedStatus *big.Int) (*types.Transaction, error)
⋮----
// Pause is a paid mutator transaction binding the contract method 0x136439dd.
⋮----
// Solidity: function pause(uint256 newPausedStatus) returns()
func (_EigenPodManager *EigenPodManagerTransactor) Pause(opts *bind.TransactOpts, newPausedStatus *big.Int) (*types.Transaction, error)
⋮----
// PauseAll is a paid mutator transaction binding the contract method 0x595c6a67.
⋮----
// Solidity: function pauseAll() returns()
func (_EigenPodManager *EigenPodManagerTransactor) PauseAll(opts *bind.TransactOpts) (*types.Transaction, error)
⋮----
// RecordBeaconChainETHBalanceUpdate is a paid mutator transaction binding the contract method 0xa1ca780b.
⋮----
// Solidity: function recordBeaconChainETHBalanceUpdate(address podOwner, uint256 prevRestakedBalanceWei, int256 balanceDeltaWei) returns()
func (_EigenPodManager *EigenPodManagerTransactor) RecordBeaconChainETHBalanceUpdate(opts *bind.TransactOpts, podOwner common.Address, prevRestakedBalanceWei *big.Int, balanceDeltaWei *big.Int) (*types.Transaction, error)
⋮----
// RemoveDepositShares is a paid mutator transaction binding the contract method 0x724af423.
⋮----
// Solidity: function removeDepositShares(address staker, address strategy, uint256 depositSharesToRemove) returns(uint256)
func (_EigenPodManager *EigenPodManagerTransactor) RemoveDepositShares(opts *bind.TransactOpts, staker common.Address, strategy common.Address, depositSharesToRemove *big.Int) (*types.Transaction, error)
⋮----
// RenounceOwnership is a paid mutator transaction binding the contract method 0x715018a6.
⋮----
// Solidity: function renounceOwnership() returns()
func (_EigenPodManager *EigenPodManagerTransactor) RenounceOwnership(opts *bind.TransactOpts) (*types.Transaction, error)
⋮----
// SetPectraForkTimestamp is a paid mutator transaction binding the contract method 0x5a26fbf4.
⋮----
// Solidity: function setPectraForkTimestamp(uint64 timestamp) returns()
func (_EigenPodManager *EigenPodManagerTransactor) SetPectraForkTimestamp(opts *bind.TransactOpts, timestamp uint64) (*types.Transaction, error)
⋮----
// SetProofTimestampSetter is a paid mutator transaction binding the contract method 0x0d1e9de1.
⋮----
// Solidity: function setProofTimestampSetter(address newProofTimestampSetter) returns()
func (_EigenPodManager *EigenPodManagerTransactor) SetProofTimestampSetter(opts *bind.TransactOpts, newProofTimestampSetter common.Address) (*types.Transaction, error)
⋮----
// Stake is a paid mutator transaction binding the contract method 0x9b4e4634.
⋮----
// Solidity: function stake(bytes pubkey, bytes signature, bytes32 depositDataRoot) payable returns()
func (_EigenPodManager *EigenPodManagerTransactor) Stake(opts *bind.TransactOpts, pubkey []byte, signature []byte, depositDataRoot [32]byte) (*types.Transaction, error)
⋮----
// TransferOwnership is a paid mutator transaction binding the contract method 0xf2fde38b.
⋮----
// Solidity: function transferOwnership(address newOwner) returns()
func (_EigenPodManager *EigenPodManagerTransactor) TransferOwnership(opts *bind.TransactOpts, newOwner common.Address) (*types.Transaction, error)
⋮----
// Unpause is a paid mutator transaction binding the contract method 0xfabc1cbc.
⋮----
// Solidity: function unpause(uint256 newPausedStatus) returns()
func (_EigenPodManager *EigenPodManagerTransactor) Unpause(opts *bind.TransactOpts, newPausedStatus *big.Int) (*types.Transaction, error)
⋮----
// WithdrawSharesAsTokens is a paid mutator transaction binding the contract method 0x2eae418c.
⋮----
// Solidity: function withdrawSharesAsTokens(address staker, address strategy, address , uint256 shares) returns()
func (_EigenPodManager *EigenPodManagerTransactor) WithdrawSharesAsTokens(opts *bind.TransactOpts, staker common.Address, strategy common.Address, arg2 common.Address, shares *big.Int) (*types.Transaction, error)
⋮----
// EigenPodManagerBeaconChainETHDepositedIterator is returned from FilterBeaconChainETHDeposited and is used to iterate over the raw logs and unpacked data for BeaconChainETHDeposited events raised by the EigenPodManager contract.
type EigenPodManagerBeaconChainETHDepositedIterator struct {
	Event *EigenPodManagerBeaconChainETHDeposited // 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
}
⋮----
Event *EigenPodManagerBeaconChainETHDeposited // 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 *EigenPodManagerBeaconChainETHDepositedIterator) Next() bool
⋮----
// If the iterator failed, stop iterating
⋮----
// If the iterator completed, deliver directly whatever's available
⋮----
// Iterator still in progress, wait for either a data or an error event
⋮----
// Error returns any retrieval or parsing error occurred during filtering.
func (it *EigenPodManagerBeaconChainETHDepositedIterator) Error() error
⋮----
// Close terminates the iteration process, releasing any pending underlying
// resources.
func (it *EigenPodManagerBeaconChainETHDepositedIterator) Close() error
⋮----
// EigenPodManagerBeaconChainETHDeposited represents a BeaconChainETHDeposited event raised by the EigenPodManager contract.
type EigenPodManagerBeaconChainETHDeposited struct {
	PodOwner common.Address
	Amount   *big.Int
	Raw      types.Log // Blockchain specific contextual infos
}
⋮----
Raw      types.Log // Blockchain specific contextual infos
⋮----
// FilterBeaconChainETHDeposited is a free log retrieval operation binding the contract event 0x35a85cabc603f48abb2b71d9fbd8adea7c449d7f0be900ae7a2986ea369c3d0d.
⋮----
// Solidity: event BeaconChainETHDeposited(address indexed podOwner, uint256 amount)
func (_EigenPodManager *EigenPodManagerFilterer) FilterBeaconChainETHDeposited(opts *bind.FilterOpts, podOwner []common.Address) (*EigenPodManagerBeaconChainETHDepositedIterator, error)
⋮----
var podOwnerRule []interface{}
⋮----
// WatchBeaconChainETHDeposited is a free log subscription operation binding the contract event 0x35a85cabc603f48abb2b71d9fbd8adea7c449d7f0be900ae7a2986ea369c3d0d.
⋮----
func (_EigenPodManager *EigenPodManagerFilterer) WatchBeaconChainETHDeposited(opts *bind.WatchOpts, sink chan<- *EigenPodManagerBeaconChainETHDeposited, podOwner []common.Address) (event.Subscription, error)
⋮----
// New log arrived, parse the event and forward to the user
⋮----
// ParseBeaconChainETHDeposited is a log parse operation binding the contract event 0x35a85cabc603f48abb2b71d9fbd8adea7c449d7f0be900ae7a2986ea369c3d0d.
⋮----
func (_EigenPodManager *EigenPodManagerFilterer) ParseBeaconChainETHDeposited(log types.Log) (*EigenPodManagerBeaconChainETHDeposited, error)
⋮----
// EigenPodManagerBeaconChainETHWithdrawalCompletedIterator is returned from FilterBeaconChainETHWithdrawalCompleted and is used to iterate over the raw logs and unpacked data for BeaconChainETHWithdrawalCompleted events raised by the EigenPodManager contract.
type EigenPodManagerBeaconChainETHWithdrawalCompletedIterator struct {
	Event *EigenPodManagerBeaconChainETHWithdrawalCompleted // 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
}
⋮----
Event *EigenPodManagerBeaconChainETHWithdrawalCompleted // Event containing the contract specifics and raw log
⋮----
// EigenPodManagerBeaconChainETHWithdrawalCompleted represents a BeaconChainETHWithdrawalCompleted event raised by the EigenPodManager contract.
type EigenPodManagerBeaconChainETHWithdrawalCompleted struct {
	PodOwner         common.Address
	Shares           *big.Int
	Nonce            *big.Int
	DelegatedAddress common.Address
	Withdrawer       common.Address
	WithdrawalRoot   [32]byte
	Raw              types.Log // Blockchain specific contextual infos
}
⋮----
Raw              types.Log // Blockchain specific contextual infos
⋮----
// FilterBeaconChainETHWithdrawalCompleted is a free log retrieval operation binding the contract event 0xa6bab1d55a361fcea2eee2bc9491e4f01e6cf333df03c9c4f2c144466429f7d6.
⋮----
// Solidity: event BeaconChainETHWithdrawalCompleted(address indexed podOwner, uint256 shares, uint96 nonce, address delegatedAddress, address withdrawer, bytes32 withdrawalRoot)
func (_EigenPodManager *EigenPodManagerFilterer) FilterBeaconChainETHWithdrawalCompleted(opts *bind.FilterOpts, podOwner []common.Address) (*EigenPodManagerBeaconChainETHWithdrawalCompletedIterator, error)
⋮----
// WatchBeaconChainETHWithdrawalCompleted is a free log subscription operation binding the contract event 0xa6bab1d55a361fcea2eee2bc9491e4f01e6cf333df03c9c4f2c144466429f7d6.
⋮----
func (_EigenPodManager *EigenPodManagerFilterer) WatchBeaconChainETHWithdrawalCompleted(opts *bind.WatchOpts, sink chan<- *EigenPodManagerBeaconChainETHWithdrawalCompleted, podOwner []common.Address) (event.Subscription, error)
⋮----
// ParseBeaconChainETHWithdrawalCompleted is a log parse operation binding the contract event 0xa6bab1d55a361fcea2eee2bc9491e4f01e6cf333df03c9c4f2c144466429f7d6.
⋮----
func (_EigenPodManager *EigenPodManagerFilterer) ParseBeaconChainETHWithdrawalCompleted(log types.Log) (*EigenPodManagerBeaconChainETHWithdrawalCompleted, error)
⋮----
// EigenPodManagerBeaconChainSlashingFactorDecreasedIterator is returned from FilterBeaconChainSlashingFactorDecreased and is used to iterate over the raw logs and unpacked data for BeaconChainSlashingFactorDecreased events raised by the EigenPodManager contract.
type EigenPodManagerBeaconChainSlashingFactorDecreasedIterator struct {
	Event *EigenPodManagerBeaconChainSlashingFactorDecreased // 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
}
⋮----
Event *EigenPodManagerBeaconChainSlashingFactorDecreased // Event containing the contract specifics and raw log
⋮----
// EigenPodManagerBeaconChainSlashingFactorDecreased represents a BeaconChainSlashingFactorDecreased event raised by the EigenPodManager contract.
type EigenPodManagerBeaconChainSlashingFactorDecreased struct {
	Staker                        common.Address
	PrevBeaconChainSlashingFactor uint64
	NewBeaconChainSlashingFactor  uint64
	Raw                           types.Log // Blockchain specific contextual infos
}
⋮----
Raw                           types.Log // Blockchain specific contextual infos
⋮----
// FilterBeaconChainSlashingFactorDecreased is a free log retrieval operation binding the contract event 0xb160ab8589bf47dc04ea11b50d46678d21590cea2ed3e454e7bd3e41510f98cf.
⋮----
// Solidity: event BeaconChainSlashingFactorDecreased(address staker, uint64 prevBeaconChainSlashingFactor, uint64 newBeaconChainSlashingFactor)
func (_EigenPodManager *EigenPodManagerFilterer) FilterBeaconChainSlashingFactorDecreased(opts *bind.FilterOpts) (*EigenPodManagerBeaconChainSlashingFactorDecreasedIterator, error)
⋮----
// WatchBeaconChainSlashingFactorDecreased is a free log subscription operation binding the contract event 0xb160ab8589bf47dc04ea11b50d46678d21590cea2ed3e454e7bd3e41510f98cf.
⋮----
func (_EigenPodManager *EigenPodManagerFilterer) WatchBeaconChainSlashingFactorDecreased(opts *bind.WatchOpts, sink chan<- *EigenPodManagerBeaconChainSlashingFactorDecreased) (event.Subscription, error)
⋮----
// ParseBeaconChainSlashingFactorDecreased is a log parse operation binding the contract event 0xb160ab8589bf47dc04ea11b50d46678d21590cea2ed3e454e7bd3e41510f98cf.
⋮----
func (_EigenPodManager *EigenPodManagerFilterer) ParseBeaconChainSlashingFactorDecreased(log types.Log) (*EigenPodManagerBeaconChainSlashingFactorDecreased, error)
⋮----
// EigenPodManagerBurnableETHSharesIncreasedIterator is returned from FilterBurnableETHSharesIncreased and is used to iterate over the raw logs and unpacked data for BurnableETHSharesIncreased events raised by the EigenPodManager contract.
type EigenPodManagerBurnableETHSharesIncreasedIterator struct {
	Event *EigenPodManagerBurnableETHSharesIncreased // 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
}
⋮----
Event *EigenPodManagerBurnableETHSharesIncreased // Event containing the contract specifics and raw log
⋮----
// EigenPodManagerBurnableETHSharesIncreased represents a BurnableETHSharesIncreased event raised by the EigenPodManager contract.
type EigenPodManagerBurnableETHSharesIncreased struct {
	Shares *big.Int
	Raw    types.Log // Blockchain specific contextual infos
}
⋮----
Raw    types.Log // Blockchain specific contextual infos
⋮----
// FilterBurnableETHSharesIncreased is a free log retrieval operation binding the contract event 0x1ed04b7fd262c0d9e50fa02957f32a81a151f03baaa367faeedc7521b001c4a4.
⋮----
// Solidity: event BurnableETHSharesIncreased(uint256 shares)
func (_EigenPodManager *EigenPodManagerFilterer) FilterBurnableETHSharesIncreased(opts *bind.FilterOpts) (*EigenPodManagerBurnableETHSharesIncreasedIterator, error)
⋮----
// WatchBurnableETHSharesIncreased is a free log subscription operation binding the contract event 0x1ed04b7fd262c0d9e50fa02957f32a81a151f03baaa367faeedc7521b001c4a4.
⋮----
func (_EigenPodManager *EigenPodManagerFilterer) WatchBurnableETHSharesIncreased(opts *bind.WatchOpts, sink chan<- *EigenPodManagerBurnableETHSharesIncreased) (event.Subscription, error)
⋮----
// ParseBurnableETHSharesIncreased is a log parse operation binding the contract event 0x1ed04b7fd262c0d9e50fa02957f32a81a151f03baaa367faeedc7521b001c4a4.
⋮----
func (_EigenPodManager *EigenPodManagerFilterer) ParseBurnableETHSharesIncreased(log types.Log) (*EigenPodManagerBurnableETHSharesIncreased, error)
⋮----
// EigenPodManagerInitializedIterator is returned from FilterInitialized and is used to iterate over the raw logs and unpacked data for Initialized events raised by the EigenPodManager contract.
type EigenPodManagerInitializedIterator struct {
	Event *EigenPodManagerInitialized // 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
}
⋮----
Event *EigenPodManagerInitialized // Event containing the contract specifics and raw log
⋮----
// EigenPodManagerInitialized represents a Initialized event raised by the EigenPodManager contract.
type EigenPodManagerInitialized struct {
	Version uint8
	Raw     types.Log // Blockchain specific contextual infos
}
⋮----
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 (_EigenPodManager *EigenPodManagerFilterer) FilterInitialized(opts *bind.FilterOpts) (*EigenPodManagerInitializedIterator, error)
⋮----
// WatchInitialized is a free log subscription operation binding the contract event 0x7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb3847402498.
⋮----
func (_EigenPodManager *EigenPodManagerFilterer) WatchInitialized(opts *bind.WatchOpts, sink chan<- *EigenPodManagerInitialized) (event.Subscription, error)
⋮----
// ParseInitialized is a log parse operation binding the contract event 0x7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb3847402498.
⋮----
func (_EigenPodManager *EigenPodManagerFilterer) ParseInitialized(log types.Log) (*EigenPodManagerInitialized, error)
⋮----
// EigenPodManagerNewTotalSharesIterator is returned from FilterNewTotalShares and is used to iterate over the raw logs and unpacked data for NewTotalShares events raised by the EigenPodManager contract.
type EigenPodManagerNewTotalSharesIterator struct {
	Event *EigenPodManagerNewTotalShares // 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
}
⋮----
Event *EigenPodManagerNewTotalShares // Event containing the contract specifics and raw log
⋮----
// EigenPodManagerNewTotalShares represents a NewTotalShares event raised by the EigenPodManager contract.
type EigenPodManagerNewTotalShares struct {
	PodOwner       common.Address
	NewTotalShares *big.Int
	Raw            types.Log // Blockchain specific contextual infos
}
⋮----
Raw            types.Log // Blockchain specific contextual infos
⋮----
// FilterNewTotalShares is a free log retrieval operation binding the contract event 0xd4def76d6d2bed6f14d5cd9af73cc2913d618d00edde42432e81c09bfe077098.
⋮----
// Solidity: event NewTotalShares(address indexed podOwner, int256 newTotalShares)
func (_EigenPodManager *EigenPodManagerFilterer) FilterNewTotalShares(opts *bind.FilterOpts, podOwner []common.Address) (*EigenPodManagerNewTotalSharesIterator, error)
⋮----
// WatchNewTotalShares is a free log subscription operation binding the contract event 0xd4def76d6d2bed6f14d5cd9af73cc2913d618d00edde42432e81c09bfe077098.
⋮----
func (_EigenPodManager *EigenPodManagerFilterer) WatchNewTotalShares(opts *bind.WatchOpts, sink chan<- *EigenPodManagerNewTotalShares, podOwner []common.Address) (event.Subscription, error)
⋮----
// ParseNewTotalShares is a log parse operation binding the contract event 0xd4def76d6d2bed6f14d5cd9af73cc2913d618d00edde42432e81c09bfe077098.
⋮----
func (_EigenPodManager *EigenPodManagerFilterer) ParseNewTotalShares(log types.Log) (*EigenPodManagerNewTotalShares, error)
⋮----
// EigenPodManagerOwnershipTransferredIterator is returned from FilterOwnershipTransferred and is used to iterate over the raw logs and unpacked data for OwnershipTransferred events raised by the EigenPodManager contract.
type EigenPodManagerOwnershipTransferredIterator struct {
	Event *EigenPodManagerOwnershipTransferred // 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
}
⋮----
Event *EigenPodManagerOwnershipTransferred // Event containing the contract specifics and raw log
⋮----
// EigenPodManagerOwnershipTransferred represents a OwnershipTransferred event raised by the EigenPodManager contract.
type EigenPodManagerOwnershipTransferred struct {
	PreviousOwner common.Address
	NewOwner      common.Address
	Raw           types.Log // Blockchain specific contextual infos
}
⋮----
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 (_EigenPodManager *EigenPodManagerFilterer) FilterOwnershipTransferred(opts *bind.FilterOpts, previousOwner []common.Address, newOwner []common.Address) (*EigenPodManagerOwnershipTransferredIterator, error)
⋮----
var previousOwnerRule []interface{}
⋮----
var newOwnerRule []interface{}
⋮----
// WatchOwnershipTransferred is a free log subscription operation binding the contract event 0x8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0.
⋮----
func (_EigenPodManager *EigenPodManagerFilterer) WatchOwnershipTransferred(opts *bind.WatchOpts, sink chan<- *EigenPodManagerOwnershipTransferred, previousOwner []common.Address, newOwner []common.Address) (event.Subscription, error)
⋮----
// ParseOwnershipTransferred is a log parse operation binding the contract event 0x8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0.
⋮----
func (_EigenPodManager *EigenPodManagerFilterer) ParseOwnershipTransferred(log types.Log) (*EigenPodManagerOwnershipTransferred, error)
⋮----
// EigenPodManagerPausedIterator is returned from FilterPaused and is used to iterate over the raw logs and unpacked data for Paused events raised by the EigenPodManager contract.
type EigenPodManagerPausedIterator struct {
	Event *EigenPodManagerPaused // 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
}
⋮----
Event *EigenPodManagerPaused // Event containing the contract specifics and raw log
⋮----
// EigenPodManagerPaused represents a Paused event raised by the EigenPodManager contract.
type EigenPodManagerPaused struct {
	Account         common.Address
	NewPausedStatus *big.Int
	Raw             types.Log // Blockchain specific contextual infos
}
⋮----
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 (_EigenPodManager *EigenPodManagerFilterer) FilterPaused(opts *bind.FilterOpts, account []common.Address) (*EigenPodManagerPausedIterator, error)
⋮----
var accountRule []interface{}
⋮----
// WatchPaused is a free log subscription operation binding the contract event 0xab40a374bc51de372200a8bc981af8c9ecdc08dfdaef0bb6e09f88f3c616ef3d.
⋮----
func (_EigenPodManager *EigenPodManagerFilterer) WatchPaused(opts *bind.WatchOpts, sink chan<- *EigenPodManagerPaused, account []common.Address) (event.Subscription, error)
⋮----
// ParsePaused is a log parse operation binding the contract event 0xab40a374bc51de372200a8bc981af8c9ecdc08dfdaef0bb6e09f88f3c616ef3d.
⋮----
func (_EigenPodManager *EigenPodManagerFilterer) ParsePaused(log types.Log) (*EigenPodManagerPaused, error)
⋮----
// EigenPodManagerPectraForkTimestampSetIterator is returned from FilterPectraForkTimestampSet and is used to iterate over the raw logs and unpacked data for PectraForkTimestampSet events raised by the EigenPodManager contract.
type EigenPodManagerPectraForkTimestampSetIterator struct {
	Event *EigenPodManagerPectraForkTimestampSet // 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
}
⋮----
Event *EigenPodManagerPectraForkTimestampSet // Event containing the contract specifics and raw log
⋮----
// EigenPodManagerPectraForkTimestampSet represents a PectraForkTimestampSet event raised by the EigenPodManager contract.
type EigenPodManagerPectraForkTimestampSet struct {
	NewPectraForkTimestamp uint64
	Raw                    types.Log // Blockchain specific contextual infos
}
⋮----
Raw                    types.Log // Blockchain specific contextual infos
⋮----
// FilterPectraForkTimestampSet is a free log retrieval operation binding the contract event 0x1bc8f042a52db3a437620dea4548f2031fb2a16dd8d3b0b854295528dd2cdd33.
⋮----
// Solidity: event PectraForkTimestampSet(uint64 newPectraForkTimestamp)
func (_EigenPodManager *EigenPodManagerFilterer) FilterPectraForkTimestampSet(opts *bind.FilterOpts) (*EigenPodManagerPectraForkTimestampSetIterator, error)
⋮----
// WatchPectraForkTimestampSet is a free log subscription operation binding the contract event 0x1bc8f042a52db3a437620dea4548f2031fb2a16dd8d3b0b854295528dd2cdd33.
⋮----
func (_EigenPodManager *EigenPodManagerFilterer) WatchPectraForkTimestampSet(opts *bind.WatchOpts, sink chan<- *EigenPodManagerPectraForkTimestampSet) (event.Subscription, error)
⋮----
// ParsePectraForkTimestampSet is a log parse operation binding the contract event 0x1bc8f042a52db3a437620dea4548f2031fb2a16dd8d3b0b854295528dd2cdd33.
⋮----
func (_EigenPodManager *EigenPodManagerFilterer) ParsePectraForkTimestampSet(log types.Log) (*EigenPodManagerPectraForkTimestampSet, error)
⋮----
// EigenPodManagerPodDeployedIterator is returned from FilterPodDeployed and is used to iterate over the raw logs and unpacked data for PodDeployed events raised by the EigenPodManager contract.
type EigenPodManagerPodDeployedIterator struct {
	Event *EigenPodManagerPodDeployed // 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
}
⋮----
Event *EigenPodManagerPodDeployed // Event containing the contract specifics and raw log
⋮----
// EigenPodManagerPodDeployed represents a PodDeployed event raised by the EigenPodManager contract.
type EigenPodManagerPodDeployed struct {
	EigenPod common.Address
	PodOwner common.Address
	Raw      types.Log // Blockchain specific contextual infos
}
⋮----
// FilterPodDeployed is a free log retrieval operation binding the contract event 0x21c99d0db02213c32fff5b05cf0a718ab5f858802b91498f80d82270289d856a.
⋮----
// Solidity: event PodDeployed(address indexed eigenPod, address indexed podOwner)
func (_EigenPodManager *EigenPodManagerFilterer) FilterPodDeployed(opts *bind.FilterOpts, eigenPod []common.Address, podOwner []common.Address) (*EigenPodManagerPodDeployedIterator, error)
⋮----
var eigenPodRule []interface{}
⋮----
// WatchPodDeployed is a free log subscription operation binding the contract event 0x21c99d0db02213c32fff5b05cf0a718ab5f858802b91498f80d82270289d856a.
⋮----
func (_EigenPodManager *EigenPodManagerFilterer) WatchPodDeployed(opts *bind.WatchOpts, sink chan<- *EigenPodManagerPodDeployed, eigenPod []common.Address, podOwner []common.Address) (event.Subscription, error)
⋮----
// ParsePodDeployed is a log parse operation binding the contract event 0x21c99d0db02213c32fff5b05cf0a718ab5f858802b91498f80d82270289d856a.
⋮----
func (_EigenPodManager *EigenPodManagerFilterer) ParsePodDeployed(log types.Log) (*EigenPodManagerPodDeployed, error)
⋮----
// EigenPodManagerPodSharesUpdatedIterator is returned from FilterPodSharesUpdated and is used to iterate over the raw logs and unpacked data for PodSharesUpdated events raised by the EigenPodManager contract.
type EigenPodManagerPodSharesUpdatedIterator struct {
	Event *EigenPodManagerPodSharesUpdated // 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
}
⋮----
Event *EigenPodManagerPodSharesUpdated // Event containing the contract specifics and raw log
⋮----
// EigenPodManagerPodSharesUpdated represents a PodSharesUpdated event raised by the EigenPodManager contract.
type EigenPodManagerPodSharesUpdated struct {
	PodOwner    common.Address
	SharesDelta *big.Int
	Raw         types.Log // Blockchain specific contextual infos
}
⋮----
Raw         types.Log // Blockchain specific contextual infos
⋮----
// FilterPodSharesUpdated is a free log retrieval operation binding the contract event 0x4e2b791dedccd9fb30141b088cabf5c14a8912b52f59375c95c010700b8c6193.
⋮----
// Solidity: event PodSharesUpdated(address indexed podOwner, int256 sharesDelta)
func (_EigenPodManager *EigenPodManagerFilterer) FilterPodSharesUpdated(opts *bind.FilterOpts, podOwner []common.Address) (*EigenPodManagerPodSharesUpdatedIterator, error)
⋮----
// WatchPodSharesUpdated is a free log subscription operation binding the contract event 0x4e2b791dedccd9fb30141b088cabf5c14a8912b52f59375c95c010700b8c6193.
⋮----
func (_EigenPodManager *EigenPodManagerFilterer) WatchPodSharesUpdated(opts *bind.WatchOpts, sink chan<- *EigenPodManagerPodSharesUpdated, podOwner []common.Address) (event.Subscription, error)
⋮----
// ParsePodSharesUpdated is a log parse operation binding the contract event 0x4e2b791dedccd9fb30141b088cabf5c14a8912b52f59375c95c010700b8c6193.
⋮----
func (_EigenPodManager *EigenPodManagerFilterer) ParsePodSharesUpdated(log types.Log) (*EigenPodManagerPodSharesUpdated, error)
⋮----
// EigenPodManagerProofTimestampSetterSetIterator is returned from FilterProofTimestampSetterSet and is used to iterate over the raw logs and unpacked data for ProofTimestampSetterSet events raised by the EigenPodManager contract.
type EigenPodManagerProofTimestampSetterSetIterator struct {
	Event *EigenPodManagerProofTimestampSetterSet // 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
}
⋮----
Event *EigenPodManagerProofTimestampSetterSet // Event containing the contract specifics and raw log
⋮----
// EigenPodManagerProofTimestampSetterSet represents a ProofTimestampSetterSet event raised by the EigenPodManager contract.
type EigenPodManagerProofTimestampSetterSet struct {
	NewProofTimestampSetter common.Address
	Raw                     types.Log // Blockchain specific contextual infos
}
⋮----
Raw                     types.Log // Blockchain specific contextual infos
⋮----
// FilterProofTimestampSetterSet is a free log retrieval operation binding the contract event 0x7025c71a9fe60d709e71b377dc5f7c72c3e1d8539f8022574254e736ceca01e5.
⋮----
// Solidity: event ProofTimestampSetterSet(address newProofTimestampSetter)
func (_EigenPodManager *EigenPodManagerFilterer) FilterProofTimestampSetterSet(opts *bind.FilterOpts) (*EigenPodManagerProofTimestampSetterSetIterator, error)
⋮----
// WatchProofTimestampSetterSet is a free log subscription operation binding the contract event 0x7025c71a9fe60d709e71b377dc5f7c72c3e1d8539f8022574254e736ceca01e5.
⋮----
func (_EigenPodManager *EigenPodManagerFilterer) WatchProofTimestampSetterSet(opts *bind.WatchOpts, sink chan<- *EigenPodManagerProofTimestampSetterSet) (event.Subscription, error)
⋮----
// ParseProofTimestampSetterSet is a log parse operation binding the contract event 0x7025c71a9fe60d709e71b377dc5f7c72c3e1d8539f8022574254e736ceca01e5.
⋮----
func (_EigenPodManager *EigenPodManagerFilterer) ParseProofTimestampSetterSet(log types.Log) (*EigenPodManagerProofTimestampSetterSet, error)
⋮----
// EigenPodManagerUnpausedIterator is returned from FilterUnpaused and is used to iterate over the raw logs and unpacked data for Unpaused events raised by the EigenPodManager contract.
type EigenPodManagerUnpausedIterator struct {
	Event *EigenPodManagerUnpaused // 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
}
⋮----
Event *EigenPodManagerUnpaused // Event containing the contract specifics and raw log
⋮----
// EigenPodManagerUnpaused represents a Unpaused event raised by the EigenPodManager contract.
type EigenPodManagerUnpaused 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 (_EigenPodManager *EigenPodManagerFilterer) FilterUnpaused(opts *bind.FilterOpts, account []common.Address) (*EigenPodManagerUnpausedIterator, error)
⋮----
// WatchUnpaused is a free log subscription operation binding the contract event 0x3582d1828e26bf56bd801502bc021ac0bc8afb57c826e4986b45593c8fad389c.
⋮----
func (_EigenPodManager *EigenPodManagerFilterer) WatchUnpaused(opts *bind.WatchOpts, sink chan<- *EigenPodManagerUnpaused, account []common.Address) (event.Subscription, error)
⋮----
// ParseUnpaused is a log parse operation binding the contract event 0x3582d1828e26bf56bd801502bc021ac0bc8afb57c826e4986b45593c8fad389c.
⋮----
func (_EigenPodManager *EigenPodManagerFilterer) ParseUnpaused(log types.Log) (*EigenPodManagerUnpaused, error)
````

## File: pkg/bindings/EigenPodManagerStorage/binding.go
````go
// Code generated - DO NOT EDIT.
// This file is a generated binding and any manual changes will be lost.
⋮----
package EigenPodManagerStorage
⋮----
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"
)
⋮----
"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
)
⋮----
// OperatorSet is an auto generated low-level Go binding around an user-defined struct.
type OperatorSet struct {
	Avs common.Address
	Id  uint32
}
⋮----
// EigenPodManagerStorageMetaData contains all meta data concerning the EigenPodManagerStorage contract.
var EigenPodManagerStorageMetaData = &bind.MetaData{
	ABI: "[{\"type\":\"function\",\"name\":\"addShares\",\"inputs\":[{\"name\":\"staker\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"strategy\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"},{\"name\":\"shares\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"beaconChainETHStrategy\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"beaconChainSlashingFactor\",\"inputs\":[{\"name\":\"staker\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"burnableETHShares\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"createPod\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"delegationManager\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIDelegationManager\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"eigenPodBeacon\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIBeacon\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"ethPOS\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIETHPOSDeposit\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getPod\",\"inputs\":[{\"name\":\"podOwner\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIEigenPod\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"hasPod\",\"inputs\":[{\"name\":\"podOwner\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"increaseBurnOrRedistributableShares\",\"inputs\":[{\"name\":\"operatorSet\",\"type\":\"tuple\",\"internalType\":\"structOperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]},{\"name\":\"slashId\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"strategy\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"},{\"name\":\"addedSharesToBurn\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"numPods\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"ownerToPod\",\"inputs\":[{\"name\":\"podOwner\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIEigenPod\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"pause\",\"inputs\":[{\"name\":\"newPausedStatus\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"pauseAll\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"paused\",\"inputs\":[{\"name\":\"index\",\"type\":\"uint8\",\"internalType\":\"uint8\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"paused\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"pauserRegistry\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIPauserRegistry\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"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\":\"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\":\"unpause\",\"inputs\":[{\"name\":\"newPausedStatus\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"withdrawSharesAsTokens\",\"inputs\":[{\"name\":\"staker\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"strategy\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"},{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"contractIERC20\"},{\"name\":\"shares\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"event\",\"name\":\"BeaconChainETHDeposited\",\"inputs\":[{\"name\":\"podOwner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"BeaconChainETHWithdrawalCompleted\",\"inputs\":[{\"name\":\"podOwner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"shares\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"nonce\",\"type\":\"uint96\",\"indexed\":false,\"internalType\":\"uint96\"},{\"name\":\"delegatedAddress\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"},{\"name\":\"withdrawer\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"},{\"name\":\"withdrawalRoot\",\"type\":\"bytes32\",\"indexed\":false,\"internalType\":\"bytes32\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"BeaconChainSlashingFactorDecreased\",\"inputs\":[{\"name\":\"staker\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"},{\"name\":\"prevBeaconChainSlashingFactor\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"},{\"name\":\"newBeaconChainSlashingFactor\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"BurnableETHSharesIncreased\",\"inputs\":[{\"name\":\"shares\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"NewTotalShares\",\"inputs\":[{\"name\":\"podOwner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"newTotalShares\",\"type\":\"int256\",\"indexed\":false,\"internalType\":\"int256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Paused\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"newPausedStatus\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"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\":[]}]",
}
⋮----
// EigenPodManagerStorageABI is the input ABI used to generate the binding from.
// Deprecated: Use EigenPodManagerStorageMetaData.ABI instead.
var EigenPodManagerStorageABI = EigenPodManagerStorageMetaData.ABI
⋮----
// EigenPodManagerStorage is an auto generated Go binding around an Ethereum contract.
type EigenPodManagerStorage struct {
	EigenPodManagerStorageCaller     // Read-only binding to the contract
	EigenPodManagerStorageTransactor // Write-only binding to the contract
	EigenPodManagerStorageFilterer   // Log filterer for contract events
}
⋮----
EigenPodManagerStorageCaller     // Read-only binding to the contract
EigenPodManagerStorageTransactor // Write-only binding to the contract
EigenPodManagerStorageFilterer   // Log filterer for contract events
⋮----
// EigenPodManagerStorageCaller is an auto generated read-only Go binding around an Ethereum contract.
type EigenPodManagerStorageCaller struct {
	contract *bind.BoundContract // Generic contract wrapper for the low level calls
}
⋮----
contract *bind.BoundContract // Generic contract wrapper for the low level calls
⋮----
// EigenPodManagerStorageTransactor is an auto generated write-only Go binding around an Ethereum contract.
type EigenPodManagerStorageTransactor struct {
	contract *bind.BoundContract // Generic contract wrapper for the low level calls
}
⋮----
// EigenPodManagerStorageFilterer is an auto generated log filtering Go binding around an Ethereum contract events.
type EigenPodManagerStorageFilterer struct {
	contract *bind.BoundContract // Generic contract wrapper for the low level calls
}
⋮----
// EigenPodManagerStorageSession is an auto generated Go binding around an Ethereum contract,
// with pre-set call and transact options.
type EigenPodManagerStorageSession struct {
	Contract     *EigenPodManagerStorage // 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
}
⋮----
Contract     *EigenPodManagerStorage // 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
⋮----
// EigenPodManagerStorageCallerSession is an auto generated read-only Go binding around an Ethereum contract,
// with pre-set call options.
type EigenPodManagerStorageCallerSession struct {
	Contract *EigenPodManagerStorageCaller // Generic contract caller binding to set the session for
	CallOpts bind.CallOpts                 // Call options to use throughout this session
}
⋮----
Contract *EigenPodManagerStorageCaller // Generic contract caller binding to set the session for
CallOpts bind.CallOpts                 // Call options to use throughout this session
⋮----
// EigenPodManagerStorageTransactorSession is an auto generated write-only Go binding around an Ethereum contract,
// with pre-set transact options.
type EigenPodManagerStorageTransactorSession struct {
	Contract     *EigenPodManagerStorageTransactor // Generic contract transactor binding to set the session for
	TransactOpts bind.TransactOpts                 // Transaction auth options to use throughout this session
}
⋮----
Contract     *EigenPodManagerStorageTransactor // Generic contract transactor binding to set the session for
TransactOpts bind.TransactOpts                 // Transaction auth options to use throughout this session
⋮----
// EigenPodManagerStorageRaw is an auto generated low-level Go binding around an Ethereum contract.
type EigenPodManagerStorageRaw struct {
	Contract *EigenPodManagerStorage // Generic contract binding to access the raw methods on
}
⋮----
Contract *EigenPodManagerStorage // Generic contract binding to access the raw methods on
⋮----
// EigenPodManagerStorageCallerRaw is an auto generated low-level read-only Go binding around an Ethereum contract.
type EigenPodManagerStorageCallerRaw struct {
	Contract *EigenPodManagerStorageCaller // Generic read-only contract binding to access the raw methods on
}
⋮----
Contract *EigenPodManagerStorageCaller // Generic read-only contract binding to access the raw methods on
⋮----
// EigenPodManagerStorageTransactorRaw is an auto generated low-level write-only Go binding around an Ethereum contract.
type EigenPodManagerStorageTransactorRaw struct {
	Contract *EigenPodManagerStorageTransactor // Generic write-only contract binding to access the raw methods on
}
⋮----
Contract *EigenPodManagerStorageTransactor // Generic write-only contract binding to access the raw methods on
⋮----
// NewEigenPodManagerStorage creates a new instance of EigenPodManagerStorage, bound to a specific deployed contract.
func NewEigenPodManagerStorage(address common.Address, backend bind.ContractBackend) (*EigenPodManagerStorage, error)
⋮----
// NewEigenPodManagerStorageCaller creates a new read-only instance of EigenPodManagerStorage, bound to a specific deployed contract.
func NewEigenPodManagerStorageCaller(address common.Address, caller bind.ContractCaller) (*EigenPodManagerStorageCaller, error)
⋮----
// NewEigenPodManagerStorageTransactor creates a new write-only instance of EigenPodManagerStorage, bound to a specific deployed contract.
func NewEigenPodManagerStorageTransactor(address common.Address, transactor bind.ContractTransactor) (*EigenPodManagerStorageTransactor, error)
⋮----
// NewEigenPodManagerStorageFilterer creates a new log filterer instance of EigenPodManagerStorage, bound to a specific deployed contract.
func NewEigenPodManagerStorageFilterer(address common.Address, filterer bind.ContractFilterer) (*EigenPodManagerStorageFilterer, error)
⋮----
// bindEigenPodManagerStorage binds a generic wrapper to an already deployed contract.
func bindEigenPodManagerStorage(address common.Address, caller bind.ContractCaller, transactor bind.ContractTransactor, filterer bind.ContractFilterer) (*bind.BoundContract, error)
⋮----
// 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 (_EigenPodManagerStorage *EigenPodManagerStorageRaw) Call(opts *bind.CallOpts, result *[]interface
⋮----
// Transfer initiates a plain transaction to move funds to the contract, calling
// its default method if one is available.
func (_EigenPodManagerStorage *EigenPodManagerStorageRaw) Transfer(opts *bind.TransactOpts) (*types.Transaction, error)
⋮----
// Transact invokes the (paid) contract method with params as input values.
func (_EigenPodManagerStorage *EigenPodManagerStorageRaw) Transact(opts *bind.TransactOpts, method string, params ...interface
⋮----
// BeaconChainETHStrategy is a free data retrieval call binding the contract method 0x9104c319.
//
// Solidity: function beaconChainETHStrategy() view returns(address)
func (_EigenPodManagerStorage *EigenPodManagerStorageCaller) BeaconChainETHStrategy(opts *bind.CallOpts) (common.Address, error)
⋮----
var out []interface{}
⋮----
// BeaconChainSlashingFactor is a free data retrieval call binding the contract method 0xa3d75e09.
⋮----
// Solidity: function beaconChainSlashingFactor(address staker) view returns(uint64)
func (_EigenPodManagerStorage *EigenPodManagerStorageCaller) BeaconChainSlashingFactor(opts *bind.CallOpts, staker common.Address) (uint64, error)
⋮----
// BurnableETHShares is a free data retrieval call binding the contract method 0xf5d4fed3.
⋮----
// Solidity: function burnableETHShares() view returns(uint256)
func (_EigenPodManagerStorage *EigenPodManagerStorageCaller) BurnableETHShares(opts *bind.CallOpts) (*big.Int, error)
⋮----
// DelegationManager is a free data retrieval call binding the contract method 0xea4d3c9b.
⋮----
// Solidity: function delegationManager() view returns(address)
func (_EigenPodManagerStorage *EigenPodManagerStorageCaller) DelegationManager(opts *bind.CallOpts) (common.Address, error)
⋮----
// EigenPodBeacon is a free data retrieval call binding the contract method 0x292b7b2b.
⋮----
// Solidity: function eigenPodBeacon() view returns(address)
func (_EigenPodManagerStorage *EigenPodManagerStorageCaller) EigenPodBeacon(opts *bind.CallOpts) (common.Address, error)
⋮----
// EthPOS is a free data retrieval call binding the contract method 0x74cdd798.
⋮----
// Solidity: function ethPOS() view returns(address)
func (_EigenPodManagerStorage *EigenPodManagerStorageCaller) EthPOS(opts *bind.CallOpts) (common.Address, error)
⋮----
// GetPod is a free data retrieval call binding the contract method 0xa38406a3.
⋮----
// Solidity: function getPod(address podOwner) view returns(address)
func (_EigenPodManagerStorage *EigenPodManagerStorageCaller) GetPod(opts *bind.CallOpts, podOwner common.Address) (common.Address, error)
⋮----
// HasPod is a free data retrieval call binding the contract method 0xf6848d24.
⋮----
// Solidity: function hasPod(address podOwner) view returns(bool)
func (_EigenPodManagerStorage *EigenPodManagerStorageCaller) HasPod(opts *bind.CallOpts, podOwner common.Address) (bool, error)
⋮----
// NumPods is a free data retrieval call binding the contract method 0xa6a509be.
⋮----
// Solidity: function numPods() view returns(uint256)
func (_EigenPodManagerStorage *EigenPodManagerStorageCaller) NumPods(opts *bind.CallOpts) (*big.Int, error)
⋮----
// OwnerToPod is a free data retrieval call binding the contract method 0x9ba06275.
⋮----
// Solidity: function ownerToPod(address podOwner) view returns(address)
func (_EigenPodManagerStorage *EigenPodManagerStorageCaller) OwnerToPod(opts *bind.CallOpts, podOwner common.Address) (common.Address, error)
⋮----
// Paused is a free data retrieval call binding the contract method 0x5ac86ab7.
⋮----
// Solidity: function paused(uint8 index) view returns(bool)
func (_EigenPodManagerStorage *EigenPodManagerStorageCaller) Paused(opts *bind.CallOpts, index uint8) (bool, error)
⋮----
// Paused0 is a free data retrieval call binding the contract method 0x5c975abb.
⋮----
// Solidity: function paused() view returns(uint256)
func (_EigenPodManagerStorage *EigenPodManagerStorageCaller) Paused0(opts *bind.CallOpts) (*big.Int, error)
⋮----
// PauserRegistry is a free data retrieval call binding the contract method 0x886f1195.
⋮----
// Solidity: function pauserRegistry() view returns(address)
func (_EigenPodManagerStorage *EigenPodManagerStorageCaller) PauserRegistry(opts *bind.CallOpts) (common.Address, error)
⋮----
// PectraForkTimestamp is a free data retrieval call binding the contract method 0x2704351a.
⋮----
// Solidity: function pectraForkTimestamp() view returns(uint64)
func (_EigenPodManagerStorage *EigenPodManagerStorageCaller) PectraForkTimestamp(opts *bind.CallOpts) (uint64, error)
⋮----
// PodOwnerDepositShares is a free data retrieval call binding the contract method 0xd48e8894.
⋮----
// Solidity: function podOwnerDepositShares(address podOwner) view returns(int256 shares)
func (_EigenPodManagerStorage *EigenPodManagerStorageCaller) PodOwnerDepositShares(opts *bind.CallOpts, podOwner common.Address) (*big.Int, error)
⋮----
// ProofTimestampSetter is a free data retrieval call binding the contract method 0x595edbcb.
⋮----
// Solidity: function proofTimestampSetter() view returns(address)
func (_EigenPodManagerStorage *EigenPodManagerStorageCaller) ProofTimestampSetter(opts *bind.CallOpts) (common.Address, error)
⋮----
// StakerDepositShares is a free data retrieval call binding the contract method 0xfe243a17.
⋮----
// Solidity: function stakerDepositShares(address user, address strategy) view returns(uint256 depositShares)
func (_EigenPodManagerStorage *EigenPodManagerStorageCaller) StakerDepositShares(opts *bind.CallOpts, user common.Address, strategy common.Address) (*big.Int, error)
⋮----
// AddShares is a paid mutator transaction binding the contract method 0x50ff7225.
⋮----
// Solidity: function addShares(address staker, address strategy, uint256 shares) returns(uint256, uint256)
func (_EigenPodManagerStorage *EigenPodManagerStorageTransactor) AddShares(opts *bind.TransactOpts, staker common.Address, strategy common.Address, shares *big.Int) (*types.Transaction, error)
⋮----
// CreatePod is a paid mutator transaction binding the contract method 0x84d81062.
⋮----
// Solidity: function createPod() returns(address)
func (_EigenPodManagerStorage *EigenPodManagerStorageTransactor) CreatePod(opts *bind.TransactOpts) (*types.Transaction, error)
⋮----
// IncreaseBurnOrRedistributableShares is a paid mutator transaction binding the contract method 0x3fb99ca5.
⋮----
// Solidity: function increaseBurnOrRedistributableShares((address,uint32) operatorSet, uint256 slashId, address strategy, uint256 addedSharesToBurn) returns()
func (_EigenPodManagerStorage *EigenPodManagerStorageTransactor) IncreaseBurnOrRedistributableShares(opts *bind.TransactOpts, operatorSet OperatorSet, slashId *big.Int, strategy common.Address, addedSharesToBurn *big.Int) (*types.Transaction, error)
⋮----
// Pause is a paid mutator transaction binding the contract method 0x136439dd.
⋮----
// Solidity: function pause(uint256 newPausedStatus) returns()
func (_EigenPodManagerStorage *EigenPodManagerStorageTransactor) Pause(opts *bind.TransactOpts, newPausedStatus *big.Int) (*types.Transaction, error)
⋮----
// PauseAll is a paid mutator transaction binding the contract method 0x595c6a67.
⋮----
// Solidity: function pauseAll() returns()
func (_EigenPodManagerStorage *EigenPodManagerStorageTransactor) PauseAll(opts *bind.TransactOpts) (*types.Transaction, error)
⋮----
// RecordBeaconChainETHBalanceUpdate is a paid mutator transaction binding the contract method 0xa1ca780b.
⋮----
// Solidity: function recordBeaconChainETHBalanceUpdate(address podOwner, uint256 prevRestakedBalanceWei, int256 balanceDeltaWei) returns()
func (_EigenPodManagerStorage *EigenPodManagerStorageTransactor) RecordBeaconChainETHBalanceUpdate(opts *bind.TransactOpts, podOwner common.Address, prevRestakedBalanceWei *big.Int, balanceDeltaWei *big.Int) (*types.Transaction, error)
⋮----
// RemoveDepositShares is a paid mutator transaction binding the contract method 0x724af423.
⋮----
// Solidity: function removeDepositShares(address staker, address strategy, uint256 depositSharesToRemove) returns(uint256)
func (_EigenPodManagerStorage *EigenPodManagerStorageTransactor) RemoveDepositShares(opts *bind.TransactOpts, staker common.Address, strategy common.Address, depositSharesToRemove *big.Int) (*types.Transaction, error)
⋮----
// SetPectraForkTimestamp is a paid mutator transaction binding the contract method 0x5a26fbf4.
⋮----
// Solidity: function setPectraForkTimestamp(uint64 timestamp) returns()
func (_EigenPodManagerStorage *EigenPodManagerStorageTransactor) SetPectraForkTimestamp(opts *bind.TransactOpts, timestamp uint64) (*types.Transaction, error)
⋮----
// SetProofTimestampSetter is a paid mutator transaction binding the contract method 0x0d1e9de1.
⋮----
// Solidity: function setProofTimestampSetter(address newProofTimestampSetter) returns()
func (_EigenPodManagerStorage *EigenPodManagerStorageTransactor) SetProofTimestampSetter(opts *bind.TransactOpts, newProofTimestampSetter common.Address) (*types.Transaction, error)
⋮----
// Stake is a paid mutator transaction binding the contract method 0x9b4e4634.
⋮----
// Solidity: function stake(bytes pubkey, bytes signature, bytes32 depositDataRoot) payable returns()
func (_EigenPodManagerStorage *EigenPodManagerStorageTransactor) Stake(opts *bind.TransactOpts, pubkey []byte, signature []byte, depositDataRoot [32]byte) (*types.Transaction, error)
⋮----
// Unpause is a paid mutator transaction binding the contract method 0xfabc1cbc.
⋮----
// Solidity: function unpause(uint256 newPausedStatus) returns()
func (_EigenPodManagerStorage *EigenPodManagerStorageTransactor) Unpause(opts *bind.TransactOpts, newPausedStatus *big.Int) (*types.Transaction, error)
⋮----
// WithdrawSharesAsTokens is a paid mutator transaction binding the contract method 0x2eae418c.
⋮----
// Solidity: function withdrawSharesAsTokens(address staker, address strategy, address token, uint256 shares) returns()
func (_EigenPodManagerStorage *EigenPodManagerStorageTransactor) WithdrawSharesAsTokens(opts *bind.TransactOpts, staker common.Address, strategy common.Address, token common.Address, shares *big.Int) (*types.Transaction, error)
⋮----
// EigenPodManagerStorageBeaconChainETHDepositedIterator is returned from FilterBeaconChainETHDeposited and is used to iterate over the raw logs and unpacked data for BeaconChainETHDeposited events raised by the EigenPodManagerStorage contract.
type EigenPodManagerStorageBeaconChainETHDepositedIterator struct {
	Event *EigenPodManagerStorageBeaconChainETHDeposited // 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
}
⋮----
Event *EigenPodManagerStorageBeaconChainETHDeposited // 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 *EigenPodManagerStorageBeaconChainETHDepositedIterator) Next() bool
⋮----
// If the iterator failed, stop iterating
⋮----
// If the iterator completed, deliver directly whatever's available
⋮----
// Iterator still in progress, wait for either a data or an error event
⋮----
// Error returns any retrieval or parsing error occurred during filtering.
func (it *EigenPodManagerStorageBeaconChainETHDepositedIterator) Error() error
⋮----
// Close terminates the iteration process, releasing any pending underlying
// resources.
func (it *EigenPodManagerStorageBeaconChainETHDepositedIterator) Close() error
⋮----
// EigenPodManagerStorageBeaconChainETHDeposited represents a BeaconChainETHDeposited event raised by the EigenPodManagerStorage contract.
type EigenPodManagerStorageBeaconChainETHDeposited struct {
	PodOwner common.Address
	Amount   *big.Int
	Raw      types.Log // Blockchain specific contextual infos
}
⋮----
Raw      types.Log // Blockchain specific contextual infos
⋮----
// FilterBeaconChainETHDeposited is a free log retrieval operation binding the contract event 0x35a85cabc603f48abb2b71d9fbd8adea7c449d7f0be900ae7a2986ea369c3d0d.
⋮----
// Solidity: event BeaconChainETHDeposited(address indexed podOwner, uint256 amount)
func (_EigenPodManagerStorage *EigenPodManagerStorageFilterer) FilterBeaconChainETHDeposited(opts *bind.FilterOpts, podOwner []common.Address) (*EigenPodManagerStorageBeaconChainETHDepositedIterator, error)
⋮----
var podOwnerRule []interface{}
⋮----
// WatchBeaconChainETHDeposited is a free log subscription operation binding the contract event 0x35a85cabc603f48abb2b71d9fbd8adea7c449d7f0be900ae7a2986ea369c3d0d.
⋮----
func (_EigenPodManagerStorage *EigenPodManagerStorageFilterer) WatchBeaconChainETHDeposited(opts *bind.WatchOpts, sink chan<- *EigenPodManagerStorageBeaconChainETHDeposited, podOwner []common.Address) (event.Subscription, error)
⋮----
// New log arrived, parse the event and forward to the user
⋮----
// ParseBeaconChainETHDeposited is a log parse operation binding the contract event 0x35a85cabc603f48abb2b71d9fbd8adea7c449d7f0be900ae7a2986ea369c3d0d.
⋮----
func (_EigenPodManagerStorage *EigenPodManagerStorageFilterer) ParseBeaconChainETHDeposited(log types.Log) (*EigenPodManagerStorageBeaconChainETHDeposited, error)
⋮----
// EigenPodManagerStorageBeaconChainETHWithdrawalCompletedIterator is returned from FilterBeaconChainETHWithdrawalCompleted and is used to iterate over the raw logs and unpacked data for BeaconChainETHWithdrawalCompleted events raised by the EigenPodManagerStorage contract.
type EigenPodManagerStorageBeaconChainETHWithdrawalCompletedIterator struct {
	Event *EigenPodManagerStorageBeaconChainETHWithdrawalCompleted // 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
}
⋮----
Event *EigenPodManagerStorageBeaconChainETHWithdrawalCompleted // Event containing the contract specifics and raw log
⋮----
// EigenPodManagerStorageBeaconChainETHWithdrawalCompleted represents a BeaconChainETHWithdrawalCompleted event raised by the EigenPodManagerStorage contract.
type EigenPodManagerStorageBeaconChainETHWithdrawalCompleted struct {
	PodOwner         common.Address
	Shares           *big.Int
	Nonce            *big.Int
	DelegatedAddress common.Address
	Withdrawer       common.Address
	WithdrawalRoot   [32]byte
	Raw              types.Log // Blockchain specific contextual infos
}
⋮----
Raw              types.Log // Blockchain specific contextual infos
⋮----
// FilterBeaconChainETHWithdrawalCompleted is a free log retrieval operation binding the contract event 0xa6bab1d55a361fcea2eee2bc9491e4f01e6cf333df03c9c4f2c144466429f7d6.
⋮----
// Solidity: event BeaconChainETHWithdrawalCompleted(address indexed podOwner, uint256 shares, uint96 nonce, address delegatedAddress, address withdrawer, bytes32 withdrawalRoot)
func (_EigenPodManagerStorage *EigenPodManagerStorageFilterer) FilterBeaconChainETHWithdrawalCompleted(opts *bind.FilterOpts, podOwner []common.Address) (*EigenPodManagerStorageBeaconChainETHWithdrawalCompletedIterator, error)
⋮----
// WatchBeaconChainETHWithdrawalCompleted is a free log subscription operation binding the contract event 0xa6bab1d55a361fcea2eee2bc9491e4f01e6cf333df03c9c4f2c144466429f7d6.
⋮----
func (_EigenPodManagerStorage *EigenPodManagerStorageFilterer) WatchBeaconChainETHWithdrawalCompleted(opts *bind.WatchOpts, sink chan<- *EigenPodManagerStorageBeaconChainETHWithdrawalCompleted, podOwner []common.Address) (event.Subscription, error)
⋮----
// ParseBeaconChainETHWithdrawalCompleted is a log parse operation binding the contract event 0xa6bab1d55a361fcea2eee2bc9491e4f01e6cf333df03c9c4f2c144466429f7d6.
⋮----
func (_EigenPodManagerStorage *EigenPodManagerStorageFilterer) ParseBeaconChainETHWithdrawalCompleted(log types.Log) (*EigenPodManagerStorageBeaconChainETHWithdrawalCompleted, error)
⋮----
// EigenPodManagerStorageBeaconChainSlashingFactorDecreasedIterator is returned from FilterBeaconChainSlashingFactorDecreased and is used to iterate over the raw logs and unpacked data for BeaconChainSlashingFactorDecreased events raised by the EigenPodManagerStorage contract.
type EigenPodManagerStorageBeaconChainSlashingFactorDecreasedIterator struct {
	Event *EigenPodManagerStorageBeaconChainSlashingFactorDecreased // 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
}
⋮----
Event *EigenPodManagerStorageBeaconChainSlashingFactorDecreased // Event containing the contract specifics and raw log
⋮----
// EigenPodManagerStorageBeaconChainSlashingFactorDecreased represents a BeaconChainSlashingFactorDecreased event raised by the EigenPodManagerStorage contract.
type EigenPodManagerStorageBeaconChainSlashingFactorDecreased struct {
	Staker                        common.Address
	PrevBeaconChainSlashingFactor uint64
	NewBeaconChainSlashingFactor  uint64
	Raw                           types.Log // Blockchain specific contextual infos
}
⋮----
Raw                           types.Log // Blockchain specific contextual infos
⋮----
// FilterBeaconChainSlashingFactorDecreased is a free log retrieval operation binding the contract event 0xb160ab8589bf47dc04ea11b50d46678d21590cea2ed3e454e7bd3e41510f98cf.
⋮----
// Solidity: event BeaconChainSlashingFactorDecreased(address staker, uint64 prevBeaconChainSlashingFactor, uint64 newBeaconChainSlashingFactor)
func (_EigenPodManagerStorage *EigenPodManagerStorageFilterer) FilterBeaconChainSlashingFactorDecreased(opts *bind.FilterOpts) (*EigenPodManagerStorageBeaconChainSlashingFactorDecreasedIterator, error)
⋮----
// WatchBeaconChainSlashingFactorDecreased is a free log subscription operation binding the contract event 0xb160ab8589bf47dc04ea11b50d46678d21590cea2ed3e454e7bd3e41510f98cf.
⋮----
func (_EigenPodManagerStorage *EigenPodManagerStorageFilterer) WatchBeaconChainSlashingFactorDecreased(opts *bind.WatchOpts, sink chan<- *EigenPodManagerStorageBeaconChainSlashingFactorDecreased) (event.Subscription, error)
⋮----
// ParseBeaconChainSlashingFactorDecreased is a log parse operation binding the contract event 0xb160ab8589bf47dc04ea11b50d46678d21590cea2ed3e454e7bd3e41510f98cf.
⋮----
func (_EigenPodManagerStorage *EigenPodManagerStorageFilterer) ParseBeaconChainSlashingFactorDecreased(log types.Log) (*EigenPodManagerStorageBeaconChainSlashingFactorDecreased, error)
⋮----
// EigenPodManagerStorageBurnableETHSharesIncreasedIterator is returned from FilterBurnableETHSharesIncreased and is used to iterate over the raw logs and unpacked data for BurnableETHSharesIncreased events raised by the EigenPodManagerStorage contract.
type EigenPodManagerStorageBurnableETHSharesIncreasedIterator struct {
	Event *EigenPodManagerStorageBurnableETHSharesIncreased // 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
}
⋮----
Event *EigenPodManagerStorageBurnableETHSharesIncreased // Event containing the contract specifics and raw log
⋮----
// EigenPodManagerStorageBurnableETHSharesIncreased represents a BurnableETHSharesIncreased event raised by the EigenPodManagerStorage contract.
type EigenPodManagerStorageBurnableETHSharesIncreased struct {
	Shares *big.Int
	Raw    types.Log // Blockchain specific contextual infos
}
⋮----
Raw    types.Log // Blockchain specific contextual infos
⋮----
// FilterBurnableETHSharesIncreased is a free log retrieval operation binding the contract event 0x1ed04b7fd262c0d9e50fa02957f32a81a151f03baaa367faeedc7521b001c4a4.
⋮----
// Solidity: event BurnableETHSharesIncreased(uint256 shares)
func (_EigenPodManagerStorage *EigenPodManagerStorageFilterer) FilterBurnableETHSharesIncreased(opts *bind.FilterOpts) (*EigenPodManagerStorageBurnableETHSharesIncreasedIterator, error)
⋮----
// WatchBurnableETHSharesIncreased is a free log subscription operation binding the contract event 0x1ed04b7fd262c0d9e50fa02957f32a81a151f03baaa367faeedc7521b001c4a4.
⋮----
func (_EigenPodManagerStorage *EigenPodManagerStorageFilterer) WatchBurnableETHSharesIncreased(opts *bind.WatchOpts, sink chan<- *EigenPodManagerStorageBurnableETHSharesIncreased) (event.Subscription, error)
⋮----
// ParseBurnableETHSharesIncreased is a log parse operation binding the contract event 0x1ed04b7fd262c0d9e50fa02957f32a81a151f03baaa367faeedc7521b001c4a4.
⋮----
func (_EigenPodManagerStorage *EigenPodManagerStorageFilterer) ParseBurnableETHSharesIncreased(log types.Log) (*EigenPodManagerStorageBurnableETHSharesIncreased, error)
⋮----
// EigenPodManagerStorageNewTotalSharesIterator is returned from FilterNewTotalShares and is used to iterate over the raw logs and unpacked data for NewTotalShares events raised by the EigenPodManagerStorage contract.
type EigenPodManagerStorageNewTotalSharesIterator struct {
	Event *EigenPodManagerStorageNewTotalShares // 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
}
⋮----
Event *EigenPodManagerStorageNewTotalShares // Event containing the contract specifics and raw log
⋮----
// EigenPodManagerStorageNewTotalShares represents a NewTotalShares event raised by the EigenPodManagerStorage contract.
type EigenPodManagerStorageNewTotalShares struct {
	PodOwner       common.Address
	NewTotalShares *big.Int
	Raw            types.Log // Blockchain specific contextual infos
}
⋮----
Raw            types.Log // Blockchain specific contextual infos
⋮----
// FilterNewTotalShares is a free log retrieval operation binding the contract event 0xd4def76d6d2bed6f14d5cd9af73cc2913d618d00edde42432e81c09bfe077098.
⋮----
// Solidity: event NewTotalShares(address indexed podOwner, int256 newTotalShares)
func (_EigenPodManagerStorage *EigenPodManagerStorageFilterer) FilterNewTotalShares(opts *bind.FilterOpts, podOwner []common.Address) (*EigenPodManagerStorageNewTotalSharesIterator, error)
⋮----
// WatchNewTotalShares is a free log subscription operation binding the contract event 0xd4def76d6d2bed6f14d5cd9af73cc2913d618d00edde42432e81c09bfe077098.
⋮----
func (_EigenPodManagerStorage *EigenPodManagerStorageFilterer) WatchNewTotalShares(opts *bind.WatchOpts, sink chan<- *EigenPodManagerStorageNewTotalShares, podOwner []common.Address) (event.Subscription, error)
⋮----
// ParseNewTotalShares is a log parse operation binding the contract event 0xd4def76d6d2bed6f14d5cd9af73cc2913d618d00edde42432e81c09bfe077098.
⋮----
func (_EigenPodManagerStorage *EigenPodManagerStorageFilterer) ParseNewTotalShares(log types.Log) (*EigenPodManagerStorageNewTotalShares, error)
⋮----
// EigenPodManagerStoragePausedIterator is returned from FilterPaused and is used to iterate over the raw logs and unpacked data for Paused events raised by the EigenPodManagerStorage contract.
type EigenPodManagerStoragePausedIterator struct {
	Event *EigenPodManagerStoragePaused // 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
}
⋮----
Event *EigenPodManagerStoragePaused // Event containing the contract specifics and raw log
⋮----
// EigenPodManagerStoragePaused represents a Paused event raised by the EigenPodManagerStorage contract.
type EigenPodManagerStoragePaused struct {
	Account         common.Address
	NewPausedStatus *big.Int
	Raw             types.Log // Blockchain specific contextual infos
}
⋮----
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 (_EigenPodManagerStorage *EigenPodManagerStorageFilterer) FilterPaused(opts *bind.FilterOpts, account []common.Address) (*EigenPodManagerStoragePausedIterator, error)
⋮----
var accountRule []interface{}
⋮----
// WatchPaused is a free log subscription operation binding the contract event 0xab40a374bc51de372200a8bc981af8c9ecdc08dfdaef0bb6e09f88f3c616ef3d.
⋮----
func (_EigenPodManagerStorage *EigenPodManagerStorageFilterer) WatchPaused(opts *bind.WatchOpts, sink chan<- *EigenPodManagerStoragePaused, account []common.Address) (event.Subscription, error)
⋮----
// ParsePaused is a log parse operation binding the contract event 0xab40a374bc51de372200a8bc981af8c9ecdc08dfdaef0bb6e09f88f3c616ef3d.
⋮----
func (_EigenPodManagerStorage *EigenPodManagerStorageFilterer) ParsePaused(log types.Log) (*EigenPodManagerStoragePaused, error)
⋮----
// EigenPodManagerStoragePectraForkTimestampSetIterator is returned from FilterPectraForkTimestampSet and is used to iterate over the raw logs and unpacked data for PectraForkTimestampSet events raised by the EigenPodManagerStorage contract.
type EigenPodManagerStoragePectraForkTimestampSetIterator struct {
	Event *EigenPodManagerStoragePectraForkTimestampSet // 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
}
⋮----
Event *EigenPodManagerStoragePectraForkTimestampSet // Event containing the contract specifics and raw log
⋮----
// EigenPodManagerStoragePectraForkTimestampSet represents a PectraForkTimestampSet event raised by the EigenPodManagerStorage contract.
type EigenPodManagerStoragePectraForkTimestampSet struct {
	NewPectraForkTimestamp uint64
	Raw                    types.Log // Blockchain specific contextual infos
}
⋮----
Raw                    types.Log // Blockchain specific contextual infos
⋮----
// FilterPectraForkTimestampSet is a free log retrieval operation binding the contract event 0x1bc8f042a52db3a437620dea4548f2031fb2a16dd8d3b0b854295528dd2cdd33.
⋮----
// Solidity: event PectraForkTimestampSet(uint64 newPectraForkTimestamp)
func (_EigenPodManagerStorage *EigenPodManagerStorageFilterer) FilterPectraForkTimestampSet(opts *bind.FilterOpts) (*EigenPodManagerStoragePectraForkTimestampSetIterator, error)
⋮----
// WatchPectraForkTimestampSet is a free log subscription operation binding the contract event 0x1bc8f042a52db3a437620dea4548f2031fb2a16dd8d3b0b854295528dd2cdd33.
⋮----
func (_EigenPodManagerStorage *EigenPodManagerStorageFilterer) WatchPectraForkTimestampSet(opts *bind.WatchOpts, sink chan<- *EigenPodManagerStoragePectraForkTimestampSet) (event.Subscription, error)
⋮----
// ParsePectraForkTimestampSet is a log parse operation binding the contract event 0x1bc8f042a52db3a437620dea4548f2031fb2a16dd8d3b0b854295528dd2cdd33.
⋮----
func (_EigenPodManagerStorage *EigenPodManagerStorageFilterer) ParsePectraForkTimestampSet(log types.Log) (*EigenPodManagerStoragePectraForkTimestampSet, error)
⋮----
// EigenPodManagerStoragePodDeployedIterator is returned from FilterPodDeployed and is used to iterate over the raw logs and unpacked data for PodDeployed events raised by the EigenPodManagerStorage contract.
type EigenPodManagerStoragePodDeployedIterator struct {
	Event *EigenPodManagerStoragePodDeployed // 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
}
⋮----
Event *EigenPodManagerStoragePodDeployed // Event containing the contract specifics and raw log
⋮----
// EigenPodManagerStoragePodDeployed represents a PodDeployed event raised by the EigenPodManagerStorage contract.
type EigenPodManagerStoragePodDeployed struct {
	EigenPod common.Address
	PodOwner common.Address
	Raw      types.Log // Blockchain specific contextual infos
}
⋮----
// FilterPodDeployed is a free log retrieval operation binding the contract event 0x21c99d0db02213c32fff5b05cf0a718ab5f858802b91498f80d82270289d856a.
⋮----
// Solidity: event PodDeployed(address indexed eigenPod, address indexed podOwner)
func (_EigenPodManagerStorage *EigenPodManagerStorageFilterer) FilterPodDeployed(opts *bind.FilterOpts, eigenPod []common.Address, podOwner []common.Address) (*EigenPodManagerStoragePodDeployedIterator, error)
⋮----
var eigenPodRule []interface{}
⋮----
// WatchPodDeployed is a free log subscription operation binding the contract event 0x21c99d0db02213c32fff5b05cf0a718ab5f858802b91498f80d82270289d856a.
⋮----
func (_EigenPodManagerStorage *EigenPodManagerStorageFilterer) WatchPodDeployed(opts *bind.WatchOpts, sink chan<- *EigenPodManagerStoragePodDeployed, eigenPod []common.Address, podOwner []common.Address) (event.Subscription, error)
⋮----
// ParsePodDeployed is a log parse operation binding the contract event 0x21c99d0db02213c32fff5b05cf0a718ab5f858802b91498f80d82270289d856a.
⋮----
func (_EigenPodManagerStorage *EigenPodManagerStorageFilterer) ParsePodDeployed(log types.Log) (*EigenPodManagerStoragePodDeployed, error)
⋮----
// EigenPodManagerStoragePodSharesUpdatedIterator is returned from FilterPodSharesUpdated and is used to iterate over the raw logs and unpacked data for PodSharesUpdated events raised by the EigenPodManagerStorage contract.
type EigenPodManagerStoragePodSharesUpdatedIterator struct {
	Event *EigenPodManagerStoragePodSharesUpdated // 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
}
⋮----
Event *EigenPodManagerStoragePodSharesUpdated // Event containing the contract specifics and raw log
⋮----
// EigenPodManagerStoragePodSharesUpdated represents a PodSharesUpdated event raised by the EigenPodManagerStorage contract.
type EigenPodManagerStoragePodSharesUpdated struct {
	PodOwner    common.Address
	SharesDelta *big.Int
	Raw         types.Log // Blockchain specific contextual infos
}
⋮----
Raw         types.Log // Blockchain specific contextual infos
⋮----
// FilterPodSharesUpdated is a free log retrieval operation binding the contract event 0x4e2b791dedccd9fb30141b088cabf5c14a8912b52f59375c95c010700b8c6193.
⋮----
// Solidity: event PodSharesUpdated(address indexed podOwner, int256 sharesDelta)
func (_EigenPodManagerStorage *EigenPodManagerStorageFilterer) FilterPodSharesUpdated(opts *bind.FilterOpts, podOwner []common.Address) (*EigenPodManagerStoragePodSharesUpdatedIterator, error)
⋮----
// WatchPodSharesUpdated is a free log subscription operation binding the contract event 0x4e2b791dedccd9fb30141b088cabf5c14a8912b52f59375c95c010700b8c6193.
⋮----
func (_EigenPodManagerStorage *EigenPodManagerStorageFilterer) WatchPodSharesUpdated(opts *bind.WatchOpts, sink chan<- *EigenPodManagerStoragePodSharesUpdated, podOwner []common.Address) (event.Subscription, error)
⋮----
// ParsePodSharesUpdated is a log parse operation binding the contract event 0x4e2b791dedccd9fb30141b088cabf5c14a8912b52f59375c95c010700b8c6193.
⋮----
func (_EigenPodManagerStorage *EigenPodManagerStorageFilterer) ParsePodSharesUpdated(log types.Log) (*EigenPodManagerStoragePodSharesUpdated, error)
⋮----
// EigenPodManagerStorageProofTimestampSetterSetIterator is returned from FilterProofTimestampSetterSet and is used to iterate over the raw logs and unpacked data for ProofTimestampSetterSet events raised by the EigenPodManagerStorage contract.
type EigenPodManagerStorageProofTimestampSetterSetIterator struct {
	Event *EigenPodManagerStorageProofTimestampSetterSet // 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
}
⋮----
Event *EigenPodManagerStorageProofTimestampSetterSet // Event containing the contract specifics and raw log
⋮----
// EigenPodManagerStorageProofTimestampSetterSet represents a ProofTimestampSetterSet event raised by the EigenPodManagerStorage contract.
type EigenPodManagerStorageProofTimestampSetterSet struct {
	NewProofTimestampSetter common.Address
	Raw                     types.Log // Blockchain specific contextual infos
}
⋮----
Raw                     types.Log // Blockchain specific contextual infos
⋮----
// FilterProofTimestampSetterSet is a free log retrieval operation binding the contract event 0x7025c71a9fe60d709e71b377dc5f7c72c3e1d8539f8022574254e736ceca01e5.
⋮----
// Solidity: event ProofTimestampSetterSet(address newProofTimestampSetter)
func (_EigenPodManagerStorage *EigenPodManagerStorageFilterer) FilterProofTimestampSetterSet(opts *bind.FilterOpts) (*EigenPodManagerStorageProofTimestampSetterSetIterator, error)
⋮----
// WatchProofTimestampSetterSet is a free log subscription operation binding the contract event 0x7025c71a9fe60d709e71b377dc5f7c72c3e1d8539f8022574254e736ceca01e5.
⋮----
func (_EigenPodManagerStorage *EigenPodManagerStorageFilterer) WatchProofTimestampSetterSet(opts *bind.WatchOpts, sink chan<- *EigenPodManagerStorageProofTimestampSetterSet) (event.Subscription, error)
⋮----
// ParseProofTimestampSetterSet is a log parse operation binding the contract event 0x7025c71a9fe60d709e71b377dc5f7c72c3e1d8539f8022574254e736ceca01e5.
⋮----
func (_EigenPodManagerStorage *EigenPodManagerStorageFilterer) ParseProofTimestampSetterSet(log types.Log) (*EigenPodManagerStorageProofTimestampSetterSet, error)
⋮----
// EigenPodManagerStorageUnpausedIterator is returned from FilterUnpaused and is used to iterate over the raw logs and unpacked data for Unpaused events raised by the EigenPodManagerStorage contract.
type EigenPodManagerStorageUnpausedIterator struct {
	Event *EigenPodManagerStorageUnpaused // 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
}
⋮----
Event *EigenPodManagerStorageUnpaused // Event containing the contract specifics and raw log
⋮----
// EigenPodManagerStorageUnpaused represents a Unpaused event raised by the EigenPodManagerStorage contract.
type EigenPodManagerStorageUnpaused 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 (_EigenPodManagerStorage *EigenPodManagerStorageFilterer) FilterUnpaused(opts *bind.FilterOpts, account []common.Address) (*EigenPodManagerStorageUnpausedIterator, error)
⋮----
// WatchUnpaused is a free log subscription operation binding the contract event 0x3582d1828e26bf56bd801502bc021ac0bc8afb57c826e4986b45593c8fad389c.
⋮----
func (_EigenPodManagerStorage *EigenPodManagerStorageFilterer) WatchUnpaused(opts *bind.WatchOpts, sink chan<- *EigenPodManagerStorageUnpaused, account []common.Address) (event.Subscription, error)
⋮----
// ParseUnpaused is a log parse operation binding the contract event 0x3582d1828e26bf56bd801502bc021ac0bc8afb57c826e4986b45593c8fad389c.
⋮----
func (_EigenPodManagerStorage *EigenPodManagerStorageFilterer) ParseUnpaused(log types.Log) (*EigenPodManagerStorageUnpaused, error)
````

## File: pkg/bindings/EigenPodPausingConstants/binding.go
````go
// Code generated - DO NOT EDIT.
// This file is a generated binding and any manual changes will be lost.
⋮----
package EigenPodPausingConstants
⋮----
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"
)
⋮----
"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
)
⋮----
// EigenPodPausingConstantsMetaData contains all meta data concerning the EigenPodPausingConstants contract.
var EigenPodPausingConstantsMetaData = &bind.MetaData{
	ABI: "[]",
}
⋮----
// EigenPodPausingConstantsABI is the input ABI used to generate the binding from.
// Deprecated: Use EigenPodPausingConstantsMetaData.ABI instead.
var EigenPodPausingConstantsABI = EigenPodPausingConstantsMetaData.ABI
⋮----
// EigenPodPausingConstants is an auto generated Go binding around an Ethereum contract.
type EigenPodPausingConstants struct {
	EigenPodPausingConstantsCaller     // Read-only binding to the contract
	EigenPodPausingConstantsTransactor // Write-only binding to the contract
	EigenPodPausingConstantsFilterer   // Log filterer for contract events
}
⋮----
EigenPodPausingConstantsCaller     // Read-only binding to the contract
EigenPodPausingConstantsTransactor // Write-only binding to the contract
EigenPodPausingConstantsFilterer   // Log filterer for contract events
⋮----
// EigenPodPausingConstantsCaller is an auto generated read-only Go binding around an Ethereum contract.
type EigenPodPausingConstantsCaller struct {
	contract *bind.BoundContract // Generic contract wrapper for the low level calls
}
⋮----
contract *bind.BoundContract // Generic contract wrapper for the low level calls
⋮----
// EigenPodPausingConstantsTransactor is an auto generated write-only Go binding around an Ethereum contract.
type EigenPodPausingConstantsTransactor struct {
	contract *bind.BoundContract // Generic contract wrapper for the low level calls
}
⋮----
// EigenPodPausingConstantsFilterer is an auto generated log filtering Go binding around an Ethereum contract events.
type EigenPodPausingConstantsFilterer struct {
	contract *bind.BoundContract // Generic contract wrapper for the low level calls
}
⋮----
// EigenPodPausingConstantsSession is an auto generated Go binding around an Ethereum contract,
// with pre-set call and transact options.
type EigenPodPausingConstantsSession struct {
	Contract     *EigenPodPausingConstants // 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
}
⋮----
Contract     *EigenPodPausingConstants // 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
⋮----
// EigenPodPausingConstantsCallerSession is an auto generated read-only Go binding around an Ethereum contract,
// with pre-set call options.
type EigenPodPausingConstantsCallerSession struct {
	Contract *EigenPodPausingConstantsCaller // Generic contract caller binding to set the session for
	CallOpts bind.CallOpts                   // Call options to use throughout this session
}
⋮----
Contract *EigenPodPausingConstantsCaller // Generic contract caller binding to set the session for
CallOpts bind.CallOpts                   // Call options to use throughout this session
⋮----
// EigenPodPausingConstantsTransactorSession is an auto generated write-only Go binding around an Ethereum contract,
// with pre-set transact options.
type EigenPodPausingConstantsTransactorSession struct {
	Contract     *EigenPodPausingConstantsTransactor // Generic contract transactor binding to set the session for
	TransactOpts bind.TransactOpts                   // Transaction auth options to use throughout this session
}
⋮----
Contract     *EigenPodPausingConstantsTransactor // Generic contract transactor binding to set the session for
TransactOpts bind.TransactOpts                   // Transaction auth options to use throughout this session
⋮----
// EigenPodPausingConstantsRaw is an auto generated low-level Go binding around an Ethereum contract.
type EigenPodPausingConstantsRaw struct {
	Contract *EigenPodPausingConstants // Generic contract binding to access the raw methods on
}
⋮----
Contract *EigenPodPausingConstants // Generic contract binding to access the raw methods on
⋮----
// EigenPodPausingConstantsCallerRaw is an auto generated low-level read-only Go binding around an Ethereum contract.
type EigenPodPausingConstantsCallerRaw struct {
	Contract *EigenPodPausingConstantsCaller // Generic read-only contract binding to access the raw methods on
}
⋮----
Contract *EigenPodPausingConstantsCaller // Generic read-only contract binding to access the raw methods on
⋮----
// EigenPodPausingConstantsTransactorRaw is an auto generated low-level write-only Go binding around an Ethereum contract.
type EigenPodPausingConstantsTransactorRaw struct {
	Contract *EigenPodPausingConstantsTransactor // Generic write-only contract binding to access the raw methods on
}
⋮----
Contract *EigenPodPausingConstantsTransactor // Generic write-only contract binding to access the raw methods on
⋮----
// NewEigenPodPausingConstants creates a new instance of EigenPodPausingConstants, bound to a specific deployed contract.
func NewEigenPodPausingConstants(address common.Address, backend bind.ContractBackend) (*EigenPodPausingConstants, error)
⋮----
// NewEigenPodPausingConstantsCaller creates a new read-only instance of EigenPodPausingConstants, bound to a specific deployed contract.
func NewEigenPodPausingConstantsCaller(address common.Address, caller bind.ContractCaller) (*EigenPodPausingConstantsCaller, error)
⋮----
// NewEigenPodPausingConstantsTransactor creates a new write-only instance of EigenPodPausingConstants, bound to a specific deployed contract.
func NewEigenPodPausingConstantsTransactor(address common.Address, transactor bind.ContractTransactor) (*EigenPodPausingConstantsTransactor, error)
⋮----
// NewEigenPodPausingConstantsFilterer creates a new log filterer instance of EigenPodPausingConstants, bound to a specific deployed contract.
func NewEigenPodPausingConstantsFilterer(address common.Address, filterer bind.ContractFilterer) (*EigenPodPausingConstantsFilterer, error)
⋮----
// bindEigenPodPausingConstants binds a generic wrapper to an already deployed contract.
func bindEigenPodPausingConstants(address common.Address, caller bind.ContractCaller, transactor bind.ContractTransactor, filterer bind.ContractFilterer) (*bind.BoundContract, error)
⋮----
// 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 (_EigenPodPausingConstants *EigenPodPausingConstantsRaw) Call(opts *bind.CallOpts, result *[]interface
⋮----
// Transfer initiates a plain transaction to move funds to the contract, calling
// its default method if one is available.
func (_EigenPodPausingConstants *EigenPodPausingConstantsRaw) Transfer(opts *bind.TransactOpts) (*types.Transaction, error)
⋮----
// Transact invokes the (paid) contract method with params as input values.
func (_EigenPodPausingConstants *EigenPodPausingConstantsRaw) Transact(opts *bind.TransactOpts, method string, params ...interface
````

## File: pkg/bindings/EigenPodStorage/binding.go
````go
// Code generated - DO NOT EDIT.
// This file is a generated binding and any manual changes will be lost.
⋮----
package EigenPodStorage
⋮----
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"
)
⋮----
"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
)
⋮----
// BeaconChainProofsBalanceContainerProof is an auto generated low-level Go binding around an user-defined struct.
type BeaconChainProofsBalanceContainerProof struct {
	BalanceContainerRoot [32]byte
	Proof                []byte
}
⋮----
// BeaconChainProofsBalanceProof is an auto generated low-level Go binding around an user-defined struct.
type BeaconChainProofsBalanceProof struct {
	PubkeyHash  [32]byte
	BalanceRoot [32]byte
	Proof       []byte
}
⋮----
// BeaconChainProofsStateRootProof is an auto generated low-level Go binding around an user-defined struct.
type BeaconChainProofsStateRootProof struct {
	BeaconStateRoot [32]byte
	Proof           []byte
}
⋮----
// BeaconChainProofsValidatorProof is an auto generated low-level Go binding around an user-defined struct.
type BeaconChainProofsValidatorProof struct {
	ValidatorFields [][32]byte
	Proof           []byte
}
⋮----
// IEigenPodTypesCheckpoint is an auto generated low-level Go binding around an user-defined struct.
type IEigenPodTypesCheckpoint struct {
	BeaconBlockRoot       [32]byte
	ProofsRemaining       *big.Int
	PodBalanceGwei        uint64
	BalanceDeltasGwei     int64
	PrevBeaconBalanceGwei uint64
}
⋮----
// IEigenPodTypesConsolidationRequest is an auto generated low-level Go binding around an user-defined struct.
type IEigenPodTypesConsolidationRequest struct {
	SrcPubkey    []byte
	TargetPubkey []byte
}
⋮----
// IEigenPodTypesValidatorInfo is an auto generated low-level Go binding around an user-defined struct.
type IEigenPodTypesValidatorInfo struct {
	ValidatorIndex      uint64
	RestakedBalanceGwei uint64
	LastCheckpointedAt  uint64
	Status              uint8
}
⋮----
// IEigenPodTypesWithdrawalRequest is an auto generated low-level Go binding around an user-defined struct.
type IEigenPodTypesWithdrawalRequest struct {
	Pubkey     []byte
	AmountGwei uint64
}
⋮----
// EigenPodStorageMetaData contains all meta data concerning the EigenPodStorage contract.
var EigenPodStorageMetaData = &bind.MetaData{
	ABI: "[{\"type\":\"function\",\"name\":\"activeValidatorCount\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"checkpointBalanceExitedGwei\",\"inputs\":[{\"name\":\"\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"currentCheckpoint\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"tuple\",\"internalType\":\"structIEigenPodTypes.Checkpoint\",\"components\":[{\"name\":\"beaconBlockRoot\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"proofsRemaining\",\"type\":\"uint24\",\"internalType\":\"uint24\"},{\"name\":\"podBalanceGwei\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"balanceDeltasGwei\",\"type\":\"int64\",\"internalType\":\"int64\"},{\"name\":\"prevBeaconBalanceGwei\",\"type\":\"uint64\",\"internalType\":\"uint64\"}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"currentCheckpointTimestamp\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"eigenPodManager\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIEigenPodManager\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getConsolidationRequestFee\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getParentBlockRoot\",\"inputs\":[{\"name\":\"timestamp\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getWithdrawalRequestFee\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"initialize\",\"inputs\":[{\"name\":\"owner\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"lastCheckpointTimestamp\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"podOwner\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"proofSubmitter\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"recoverTokens\",\"inputs\":[{\"name\":\"tokenList\",\"type\":\"address[]\",\"internalType\":\"contractIERC20[]\"},{\"name\":\"amountsToWithdraw\",\"type\":\"uint256[]\",\"internalType\":\"uint256[]\"},{\"name\":\"recipient\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"requestConsolidation\",\"inputs\":[{\"name\":\"requests\",\"type\":\"tuple[]\",\"internalType\":\"structIEigenPodTypes.ConsolidationRequest[]\",\"components\":[{\"name\":\"srcPubkey\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"targetPubkey\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]}],\"outputs\":[],\"stateMutability\":\"payable\"},{\"type\":\"function\",\"name\":\"requestWithdrawal\",\"inputs\":[{\"name\":\"requests\",\"type\":\"tuple[]\",\"internalType\":\"structIEigenPodTypes.WithdrawalRequest[]\",\"components\":[{\"name\":\"pubkey\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"amountGwei\",\"type\":\"uint64\",\"internalType\":\"uint64\"}]}],\"outputs\":[],\"stateMutability\":\"payable\"},{\"type\":\"function\",\"name\":\"setProofSubmitter\",\"inputs\":[{\"name\":\"newProofSubmitter\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"stake\",\"inputs\":[{\"name\":\"pubkey\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"signature\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"depositDataRoot\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[],\"stateMutability\":\"payable\"},{\"type\":\"function\",\"name\":\"startCheckpoint\",\"inputs\":[{\"name\":\"revertIfNoBalance\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"validatorPubkeyHashToInfo\",\"inputs\":[{\"name\":\"validatorPubkeyHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"tuple\",\"internalType\":\"structIEigenPodTypes.ValidatorInfo\",\"components\":[{\"name\":\"validatorIndex\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"restakedBalanceGwei\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"lastCheckpointedAt\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"status\",\"type\":\"uint8\",\"internalType\":\"enumIEigenPodTypes.VALIDATOR_STATUS\"}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"validatorPubkeyToInfo\",\"inputs\":[{\"name\":\"validatorPubkey\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[{\"name\":\"\",\"type\":\"tuple\",\"internalType\":\"structIEigenPodTypes.ValidatorInfo\",\"components\":[{\"name\":\"validatorIndex\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"restakedBalanceGwei\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"lastCheckpointedAt\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"status\",\"type\":\"uint8\",\"internalType\":\"enumIEigenPodTypes.VALIDATOR_STATUS\"}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"validatorStatus\",\"inputs\":[{\"name\":\"validatorPubkey\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint8\",\"internalType\":\"enumIEigenPodTypes.VALIDATOR_STATUS\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"validatorStatus\",\"inputs\":[{\"name\":\"pubkeyHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint8\",\"internalType\":\"enumIEigenPodTypes.VALIDATOR_STATUS\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"verifyCheckpointProofs\",\"inputs\":[{\"name\":\"balanceContainerProof\",\"type\":\"tuple\",\"internalType\":\"structBeaconChainProofs.BalanceContainerProof\",\"components\":[{\"name\":\"balanceContainerRoot\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"proof\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]},{\"name\":\"proofs\",\"type\":\"tuple[]\",\"internalType\":\"structBeaconChainProofs.BalanceProof[]\",\"components\":[{\"name\":\"pubkeyHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"balanceRoot\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"proof\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"verifyStaleBalance\",\"inputs\":[{\"name\":\"beaconTimestamp\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"stateRootProof\",\"type\":\"tuple\",\"internalType\":\"structBeaconChainProofs.StateRootProof\",\"components\":[{\"name\":\"beaconStateRoot\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"proof\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]},{\"name\":\"proof\",\"type\":\"tuple\",\"internalType\":\"structBeaconChainProofs.ValidatorProof\",\"components\":[{\"name\":\"validatorFields\",\"type\":\"bytes32[]\",\"internalType\":\"bytes32[]\"},{\"name\":\"proof\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"verifyWithdrawalCredentials\",\"inputs\":[{\"name\":\"beaconTimestamp\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"stateRootProof\",\"type\":\"tuple\",\"internalType\":\"structBeaconChainProofs.StateRootProof\",\"components\":[{\"name\":\"beaconStateRoot\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"proof\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]},{\"name\":\"validatorIndices\",\"type\":\"uint40[]\",\"internalType\":\"uint40[]\"},{\"name\":\"validatorFieldsProofs\",\"type\":\"bytes[]\",\"internalType\":\"bytes[]\"},{\"name\":\"validatorFields\",\"type\":\"bytes32[][]\",\"internalType\":\"bytes32[][]\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"withdrawRestakedBeaconChainETH\",\"inputs\":[{\"name\":\"recipient\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"withdrawableRestakedExecutionLayerGwei\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"stateMutability\":\"view\"},{\"type\":\"event\",\"name\":\"CheckpointCreated\",\"inputs\":[{\"name\":\"checkpointTimestamp\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"},{\"name\":\"beaconBlockRoot\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"validatorCount\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"CheckpointFinalized\",\"inputs\":[{\"name\":\"checkpointTimestamp\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"},{\"name\":\"totalShareDeltaWei\",\"type\":\"int256\",\"indexed\":false,\"internalType\":\"int256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ConsolidationRequested\",\"inputs\":[{\"name\":\"sourcePubkeyHash\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"targetPubkeyHash\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"EigenPodStaked\",\"inputs\":[{\"name\":\"pubkeyHash\",\"type\":\"bytes32\",\"indexed\":false,\"internalType\":\"bytes32\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ExitRequested\",\"inputs\":[{\"name\":\"validatorPubkeyHash\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"NonBeaconChainETHReceived\",\"inputs\":[{\"name\":\"amountReceived\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ProofSubmitterUpdated\",\"inputs\":[{\"name\":\"prevProofSubmitter\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"},{\"name\":\"newProofSubmitter\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"RestakedBeaconChainETHWithdrawn\",\"inputs\":[{\"name\":\"recipient\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"SwitchToCompoundingRequested\",\"inputs\":[{\"name\":\"validatorPubkeyHash\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ValidatorBalanceUpdated\",\"inputs\":[{\"name\":\"pubkeyHash\",\"type\":\"bytes32\",\"indexed\":false,\"internalType\":\"bytes32\"},{\"name\":\"balanceTimestamp\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"},{\"name\":\"newValidatorBalanceGwei\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ValidatorCheckpointed\",\"inputs\":[{\"name\":\"checkpointTimestamp\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"},{\"name\":\"pubkeyHash\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ValidatorRestaked\",\"inputs\":[{\"name\":\"pubkeyHash\",\"type\":\"bytes32\",\"indexed\":false,\"internalType\":\"bytes32\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ValidatorWithdrawn\",\"inputs\":[{\"name\":\"checkpointTimestamp\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"},{\"name\":\"pubkeyHash\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"WithdrawalRequested\",\"inputs\":[{\"name\":\"validatorPubkeyHash\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"withdrawalAmountGwei\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"}],\"anonymous\":false},{\"type\":\"error\",\"name\":\"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\":\"FeeQueryFailed\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ForkTimestampZero\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InputAddressZero\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InputArrayLengthMismatch\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InsufficientFunds\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InsufficientWithdrawableBalance\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidEIP4788Response\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidPubKeyLength\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"MsgValueNot32ETH\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"NoActiveCheckpoint\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"NoBalanceToCheckpoint\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"OnlyEigenPodManager\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"OnlyEigenPodOwner\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"OnlyEigenPodOwnerOrProofSubmitter\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"PredeployFailed\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"TimestampOutOfRange\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ValidatorInactiveOnBeaconChain\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ValidatorIsExitingBeaconChain\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ValidatorNotActiveInPod\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ValidatorNotSlashedOnBeaconChain\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"WithdrawalCredentialsNotForEigenPod\",\"inputs\":[]}]",
}
⋮----
// EigenPodStorageABI is the input ABI used to generate the binding from.
// Deprecated: Use EigenPodStorageMetaData.ABI instead.
var EigenPodStorageABI = EigenPodStorageMetaData.ABI
⋮----
// EigenPodStorage is an auto generated Go binding around an Ethereum contract.
type EigenPodStorage struct {
	EigenPodStorageCaller     // Read-only binding to the contract
	EigenPodStorageTransactor // Write-only binding to the contract
	EigenPodStorageFilterer   // Log filterer for contract events
}
⋮----
EigenPodStorageCaller     // Read-only binding to the contract
EigenPodStorageTransactor // Write-only binding to the contract
EigenPodStorageFilterer   // Log filterer for contract events
⋮----
// EigenPodStorageCaller is an auto generated read-only Go binding around an Ethereum contract.
type EigenPodStorageCaller struct {
	contract *bind.BoundContract // Generic contract wrapper for the low level calls
}
⋮----
contract *bind.BoundContract // Generic contract wrapper for the low level calls
⋮----
// EigenPodStorageTransactor is an auto generated write-only Go binding around an Ethereum contract.
type EigenPodStorageTransactor struct {
	contract *bind.BoundContract // Generic contract wrapper for the low level calls
}
⋮----
// EigenPodStorageFilterer is an auto generated log filtering Go binding around an Ethereum contract events.
type EigenPodStorageFilterer struct {
	contract *bind.BoundContract // Generic contract wrapper for the low level calls
}
⋮----
// EigenPodStorageSession is an auto generated Go binding around an Ethereum contract,
// with pre-set call and transact options.
type EigenPodStorageSession struct {
	Contract     *EigenPodStorage  // 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
}
⋮----
Contract     *EigenPodStorage  // 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
⋮----
// EigenPodStorageCallerSession is an auto generated read-only Go binding around an Ethereum contract,
// with pre-set call options.
type EigenPodStorageCallerSession struct {
	Contract *EigenPodStorageCaller // Generic contract caller binding to set the session for
	CallOpts bind.CallOpts          // Call options to use throughout this session
}
⋮----
Contract *EigenPodStorageCaller // Generic contract caller binding to set the session for
CallOpts bind.CallOpts          // Call options to use throughout this session
⋮----
// EigenPodStorageTransactorSession is an auto generated write-only Go binding around an Ethereum contract,
// with pre-set transact options.
type EigenPodStorageTransactorSession struct {
	Contract     *EigenPodStorageTransactor // Generic contract transactor binding to set the session for
	TransactOpts bind.TransactOpts          // Transaction auth options to use throughout this session
}
⋮----
Contract     *EigenPodStorageTransactor // Generic contract transactor binding to set the session for
TransactOpts bind.TransactOpts          // Transaction auth options to use throughout this session
⋮----
// EigenPodStorageRaw is an auto generated low-level Go binding around an Ethereum contract.
type EigenPodStorageRaw struct {
	Contract *EigenPodStorage // Generic contract binding to access the raw methods on
}
⋮----
Contract *EigenPodStorage // Generic contract binding to access the raw methods on
⋮----
// EigenPodStorageCallerRaw is an auto generated low-level read-only Go binding around an Ethereum contract.
type EigenPodStorageCallerRaw struct {
	Contract *EigenPodStorageCaller // Generic read-only contract binding to access the raw methods on
}
⋮----
Contract *EigenPodStorageCaller // Generic read-only contract binding to access the raw methods on
⋮----
// EigenPodStorageTransactorRaw is an auto generated low-level write-only Go binding around an Ethereum contract.
type EigenPodStorageTransactorRaw struct {
	Contract *EigenPodStorageTransactor // Generic write-only contract binding to access the raw methods on
}
⋮----
Contract *EigenPodStorageTransactor // Generic write-only contract binding to access the raw methods on
⋮----
// NewEigenPodStorage creates a new instance of EigenPodStorage, bound to a specific deployed contract.
func NewEigenPodStorage(address common.Address, backend bind.ContractBackend) (*EigenPodStorage, error)
⋮----
// NewEigenPodStorageCaller creates a new read-only instance of EigenPodStorage, bound to a specific deployed contract.
func NewEigenPodStorageCaller(address common.Address, caller bind.ContractCaller) (*EigenPodStorageCaller, error)
⋮----
// NewEigenPodStorageTransactor creates a new write-only instance of EigenPodStorage, bound to a specific deployed contract.
func NewEigenPodStorageTransactor(address common.Address, transactor bind.ContractTransactor) (*EigenPodStorageTransactor, error)
⋮----
// NewEigenPodStorageFilterer creates a new log filterer instance of EigenPodStorage, bound to a specific deployed contract.
func NewEigenPodStorageFilterer(address common.Address, filterer bind.ContractFilterer) (*EigenPodStorageFilterer, error)
⋮----
// bindEigenPodStorage binds a generic wrapper to an already deployed contract.
func bindEigenPodStorage(address common.Address, caller bind.ContractCaller, transactor bind.ContractTransactor, filterer bind.ContractFilterer) (*bind.BoundContract, error)
⋮----
// 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 (_EigenPodStorage *EigenPodStorageRaw) Call(opts *bind.CallOpts, result *[]interface
⋮----
// Transfer initiates a plain transaction to move funds to the contract, calling
// its default method if one is available.
func (_EigenPodStorage *EigenPodStorageRaw) Transfer(opts *bind.TransactOpts) (*types.Transaction, error)
⋮----
// Transact invokes the (paid) contract method with params as input values.
func (_EigenPodStorage *EigenPodStorageRaw) Transact(opts *bind.TransactOpts, method string, params ...interface
⋮----
// ActiveValidatorCount is a free data retrieval call binding the contract method 0x2340e8d3.
//
// Solidity: function activeValidatorCount() view returns(uint256)
func (_EigenPodStorage *EigenPodStorageCaller) ActiveValidatorCount(opts *bind.CallOpts) (*big.Int, error)
⋮----
var out []interface{}
⋮----
// CheckpointBalanceExitedGwei is a free data retrieval call binding the contract method 0x52396a59.
⋮----
// Solidity: function checkpointBalanceExitedGwei(uint64 ) view returns(uint64)
func (_EigenPodStorage *EigenPodStorageCaller) CheckpointBalanceExitedGwei(opts *bind.CallOpts, arg0 uint64) (uint64, error)
⋮----
// CurrentCheckpoint is a free data retrieval call binding the contract method 0x47d28372.
⋮----
// Solidity: function currentCheckpoint() view returns((bytes32,uint24,uint64,int64,uint64))
func (_EigenPodStorage *EigenPodStorageCaller) CurrentCheckpoint(opts *bind.CallOpts) (IEigenPodTypesCheckpoint, error)
⋮----
// CurrentCheckpointTimestamp is a free data retrieval call binding the contract method 0x42ecff2a.
⋮----
// Solidity: function currentCheckpointTimestamp() view returns(uint64)
func (_EigenPodStorage *EigenPodStorageCaller) CurrentCheckpointTimestamp(opts *bind.CallOpts) (uint64, error)
⋮----
// EigenPodManager is a free data retrieval call binding the contract method 0x4665bcda.
⋮----
// Solidity: function eigenPodManager() view returns(address)
func (_EigenPodStorage *EigenPodStorageCaller) EigenPodManager(opts *bind.CallOpts) (common.Address, error)
⋮----
// GetConsolidationRequestFee is a free data retrieval call binding the contract method 0x1e515533.
⋮----
// Solidity: function getConsolidationRequestFee() view returns(uint256)
func (_EigenPodStorage *EigenPodStorageCaller) GetConsolidationRequestFee(opts *bind.CallOpts) (*big.Int, error)
⋮----
// GetParentBlockRoot is a free data retrieval call binding the contract method 0x6c0d2d5a.
⋮----
// Solidity: function getParentBlockRoot(uint64 timestamp) view returns(bytes32)
func (_EigenPodStorage *EigenPodStorageCaller) GetParentBlockRoot(opts *bind.CallOpts, timestamp uint64) ([32]byte, error)
⋮----
// GetWithdrawalRequestFee is a free data retrieval call binding the contract method 0xc44e30dc.
⋮----
// Solidity: function getWithdrawalRequestFee() view returns(uint256)
func (_EigenPodStorage *EigenPodStorageCaller) GetWithdrawalRequestFee(opts *bind.CallOpts) (*big.Int, error)
⋮----
// LastCheckpointTimestamp is a free data retrieval call binding the contract method 0xee94d67c.
⋮----
// Solidity: function lastCheckpointTimestamp() view returns(uint64)
func (_EigenPodStorage *EigenPodStorageCaller) LastCheckpointTimestamp(opts *bind.CallOpts) (uint64, error)
⋮----
// PodOwner is a free data retrieval call binding the contract method 0x0b18ff66.
⋮----
// Solidity: function podOwner() view returns(address)
func (_EigenPodStorage *EigenPodStorageCaller) PodOwner(opts *bind.CallOpts) (common.Address, error)
⋮----
// ProofSubmitter is a free data retrieval call binding the contract method 0x58753357.
⋮----
// Solidity: function proofSubmitter() view returns(address)
func (_EigenPodStorage *EigenPodStorageCaller) ProofSubmitter(opts *bind.CallOpts) (common.Address, error)
⋮----
// ValidatorPubkeyHashToInfo is a free data retrieval call binding the contract method 0x6fcd0e53.
⋮----
// Solidity: function validatorPubkeyHashToInfo(bytes32 validatorPubkeyHash) view returns((uint64,uint64,uint64,uint8))
func (_EigenPodStorage *EigenPodStorageCaller) ValidatorPubkeyHashToInfo(opts *bind.CallOpts, validatorPubkeyHash [32]byte) (IEigenPodTypesValidatorInfo, error)
⋮----
// ValidatorPubkeyToInfo is a free data retrieval call binding the contract method 0xb522538a.
⋮----
// Solidity: function validatorPubkeyToInfo(bytes validatorPubkey) view returns((uint64,uint64,uint64,uint8))
func (_EigenPodStorage *EigenPodStorageCaller) ValidatorPubkeyToInfo(opts *bind.CallOpts, validatorPubkey []byte) (IEigenPodTypesValidatorInfo, error)
⋮----
// ValidatorStatus is a free data retrieval call binding the contract method 0x58eaee79.
⋮----
// Solidity: function validatorStatus(bytes validatorPubkey) view returns(uint8)
func (_EigenPodStorage *EigenPodStorageCaller) ValidatorStatus(opts *bind.CallOpts, validatorPubkey []byte) (uint8, error)
⋮----
// ValidatorStatus0 is a free data retrieval call binding the contract method 0x7439841f.
⋮----
// Solidity: function validatorStatus(bytes32 pubkeyHash) view returns(uint8)
func (_EigenPodStorage *EigenPodStorageCaller) ValidatorStatus0(opts *bind.CallOpts, pubkeyHash [32]byte) (uint8, error)
⋮----
// WithdrawableRestakedExecutionLayerGwei is a free data retrieval call binding the contract method 0x3474aa16.
⋮----
// Solidity: function withdrawableRestakedExecutionLayerGwei() view returns(uint64)
func (_EigenPodStorage *EigenPodStorageCaller) WithdrawableRestakedExecutionLayerGwei(opts *bind.CallOpts) (uint64, error)
⋮----
// Initialize is a paid mutator transaction binding the contract method 0xc4d66de8.
⋮----
// Solidity: function initialize(address owner) returns()
func (_EigenPodStorage *EigenPodStorageTransactor) Initialize(opts *bind.TransactOpts, owner common.Address) (*types.Transaction, error)
⋮----
// RecoverTokens is a paid mutator transaction binding the contract method 0xdda3346c.
⋮----
// Solidity: function recoverTokens(address[] tokenList, uint256[] amountsToWithdraw, address recipient) returns()
func (_EigenPodStorage *EigenPodStorageTransactor) RecoverTokens(opts *bind.TransactOpts, tokenList []common.Address, amountsToWithdraw []*big.Int, recipient common.Address) (*types.Transaction, error)
⋮----
// RequestConsolidation is a paid mutator transaction binding the contract method 0x6691954e.
⋮----
// Solidity: function requestConsolidation((bytes,bytes)[] requests) payable returns()
func (_EigenPodStorage *EigenPodStorageTransactor) RequestConsolidation(opts *bind.TransactOpts, requests []IEigenPodTypesConsolidationRequest) (*types.Transaction, error)
⋮----
// RequestWithdrawal is a paid mutator transaction binding the contract method 0x3f5fa57a.
⋮----
// Solidity: function requestWithdrawal((bytes,uint64)[] requests) payable returns()
func (_EigenPodStorage *EigenPodStorageTransactor) RequestWithdrawal(opts *bind.TransactOpts, requests []IEigenPodTypesWithdrawalRequest) (*types.Transaction, error)
⋮----
// SetProofSubmitter is a paid mutator transaction binding the contract method 0xd06d5587.
⋮----
// Solidity: function setProofSubmitter(address newProofSubmitter) returns()
func (_EigenPodStorage *EigenPodStorageTransactor) SetProofSubmitter(opts *bind.TransactOpts, newProofSubmitter common.Address) (*types.Transaction, error)
⋮----
// Stake is a paid mutator transaction binding the contract method 0x9b4e4634.
⋮----
// Solidity: function stake(bytes pubkey, bytes signature, bytes32 depositDataRoot) payable returns()
func (_EigenPodStorage *EigenPodStorageTransactor) Stake(opts *bind.TransactOpts, pubkey []byte, signature []byte, depositDataRoot [32]byte) (*types.Transaction, error)
⋮----
// StartCheckpoint is a paid mutator transaction binding the contract method 0x88676cad.
⋮----
// Solidity: function startCheckpoint(bool revertIfNoBalance) returns()
func (_EigenPodStorage *EigenPodStorageTransactor) StartCheckpoint(opts *bind.TransactOpts, revertIfNoBalance bool) (*types.Transaction, error)
⋮----
// VerifyCheckpointProofs is a paid mutator transaction binding the contract method 0xf074ba62.
⋮----
// Solidity: function verifyCheckpointProofs((bytes32,bytes) balanceContainerProof, (bytes32,bytes32,bytes)[] proofs) returns()
func (_EigenPodStorage *EigenPodStorageTransactor) VerifyCheckpointProofs(opts *bind.TransactOpts, balanceContainerProof BeaconChainProofsBalanceContainerProof, proofs []BeaconChainProofsBalanceProof) (*types.Transaction, error)
⋮----
// VerifyStaleBalance is a paid mutator transaction binding the contract method 0x039157d2.
⋮----
// Solidity: function verifyStaleBalance(uint64 beaconTimestamp, (bytes32,bytes) stateRootProof, (bytes32[],bytes) proof) returns()
func (_EigenPodStorage *EigenPodStorageTransactor) VerifyStaleBalance(opts *bind.TransactOpts, beaconTimestamp uint64, stateRootProof BeaconChainProofsStateRootProof, proof BeaconChainProofsValidatorProof) (*types.Transaction, error)
⋮----
// VerifyWithdrawalCredentials is a paid mutator transaction binding the contract method 0x3f65cf19.
⋮----
// Solidity: function verifyWithdrawalCredentials(uint64 beaconTimestamp, (bytes32,bytes) stateRootProof, uint40[] validatorIndices, bytes[] validatorFieldsProofs, bytes32[][] validatorFields) returns()
func (_EigenPodStorage *EigenPodStorageTransactor) VerifyWithdrawalCredentials(opts *bind.TransactOpts, beaconTimestamp uint64, stateRootProof BeaconChainProofsStateRootProof, validatorIndices []*big.Int, validatorFieldsProofs [][]byte, validatorFields [][][32]byte) (*types.Transaction, error)
⋮----
// WithdrawRestakedBeaconChainETH is a paid mutator transaction binding the contract method 0xc4907442.
⋮----
// Solidity: function withdrawRestakedBeaconChainETH(address recipient, uint256 amount) returns()
func (_EigenPodStorage *EigenPodStorageTransactor) WithdrawRestakedBeaconChainETH(opts *bind.TransactOpts, recipient common.Address, amount *big.Int) (*types.Transaction, error)
⋮----
// EigenPodStorageCheckpointCreatedIterator is returned from FilterCheckpointCreated and is used to iterate over the raw logs and unpacked data for CheckpointCreated events raised by the EigenPodStorage contract.
type EigenPodStorageCheckpointCreatedIterator struct {
	Event *EigenPodStorageCheckpointCreated // 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
}
⋮----
Event *EigenPodStorageCheckpointCreated // 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 *EigenPodStorageCheckpointCreatedIterator) Next() bool
⋮----
// If the iterator failed, stop iterating
⋮----
// If the iterator completed, deliver directly whatever's available
⋮----
// Iterator still in progress, wait for either a data or an error event
⋮----
// Error returns any retrieval or parsing error occurred during filtering.
func (it *EigenPodStorageCheckpointCreatedIterator) Error() error
⋮----
// Close terminates the iteration process, releasing any pending underlying
// resources.
func (it *EigenPodStorageCheckpointCreatedIterator) Close() error
⋮----
// EigenPodStorageCheckpointCreated represents a CheckpointCreated event raised by the EigenPodStorage contract.
type EigenPodStorageCheckpointCreated struct {
	CheckpointTimestamp uint64
	BeaconBlockRoot     [32]byte
	ValidatorCount      *big.Int
	Raw                 types.Log // Blockchain specific contextual infos
}
⋮----
Raw                 types.Log // Blockchain specific contextual infos
⋮----
// FilterCheckpointCreated is a free log retrieval operation binding the contract event 0x575796133bbed337e5b39aa49a30dc2556a91e0c6c2af4b7b886ae77ebef1076.
⋮----
// Solidity: event CheckpointCreated(uint64 indexed checkpointTimestamp, bytes32 indexed beaconBlockRoot, uint256 validatorCount)
func (_EigenPodStorage *EigenPodStorageFilterer) FilterCheckpointCreated(opts *bind.FilterOpts, checkpointTimestamp []uint64, beaconBlockRoot [][32]byte) (*EigenPodStorageCheckpointCreatedIterator, error)
⋮----
var checkpointTimestampRule []interface{}
⋮----
var beaconBlockRootRule []interface{}
⋮----
// WatchCheckpointCreated is a free log subscription operation binding the contract event 0x575796133bbed337e5b39aa49a30dc2556a91e0c6c2af4b7b886ae77ebef1076.
⋮----
func (_EigenPodStorage *EigenPodStorageFilterer) WatchCheckpointCreated(opts *bind.WatchOpts, sink chan<- *EigenPodStorageCheckpointCreated, checkpointTimestamp []uint64, beaconBlockRoot [][32]byte) (event.Subscription, error)
⋮----
// New log arrived, parse the event and forward to the user
⋮----
// ParseCheckpointCreated is a log parse operation binding the contract event 0x575796133bbed337e5b39aa49a30dc2556a91e0c6c2af4b7b886ae77ebef1076.
⋮----
func (_EigenPodStorage *EigenPodStorageFilterer) ParseCheckpointCreated(log types.Log) (*EigenPodStorageCheckpointCreated, error)
⋮----
// EigenPodStorageCheckpointFinalizedIterator is returned from FilterCheckpointFinalized and is used to iterate over the raw logs and unpacked data for CheckpointFinalized events raised by the EigenPodStorage contract.
type EigenPodStorageCheckpointFinalizedIterator struct {
	Event *EigenPodStorageCheckpointFinalized // 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
}
⋮----
Event *EigenPodStorageCheckpointFinalized // Event containing the contract specifics and raw log
⋮----
// EigenPodStorageCheckpointFinalized represents a CheckpointFinalized event raised by the EigenPodStorage contract.
type EigenPodStorageCheckpointFinalized struct {
	CheckpointTimestamp uint64
	TotalShareDeltaWei  *big.Int
	Raw                 types.Log // Blockchain specific contextual infos
}
⋮----
// FilterCheckpointFinalized is a free log retrieval operation binding the contract event 0x525408c201bc1576eb44116f6478f1c2a54775b19a043bcfdc708364f74f8e44.
⋮----
// Solidity: event CheckpointFinalized(uint64 indexed checkpointTimestamp, int256 totalShareDeltaWei)
func (_EigenPodStorage *EigenPodStorageFilterer) FilterCheckpointFinalized(opts *bind.FilterOpts, checkpointTimestamp []uint64) (*EigenPodStorageCheckpointFinalizedIterator, error)
⋮----
// WatchCheckpointFinalized is a free log subscription operation binding the contract event 0x525408c201bc1576eb44116f6478f1c2a54775b19a043bcfdc708364f74f8e44.
⋮----
func (_EigenPodStorage *EigenPodStorageFilterer) WatchCheckpointFinalized(opts *bind.WatchOpts, sink chan<- *EigenPodStorageCheckpointFinalized, checkpointTimestamp []uint64) (event.Subscription, error)
⋮----
// ParseCheckpointFinalized is a log parse operation binding the contract event 0x525408c201bc1576eb44116f6478f1c2a54775b19a043bcfdc708364f74f8e44.
⋮----
func (_EigenPodStorage *EigenPodStorageFilterer) ParseCheckpointFinalized(log types.Log) (*EigenPodStorageCheckpointFinalized, error)
⋮----
// EigenPodStorageConsolidationRequestedIterator is returned from FilterConsolidationRequested and is used to iterate over the raw logs and unpacked data for ConsolidationRequested events raised by the EigenPodStorage contract.
type EigenPodStorageConsolidationRequestedIterator struct {
	Event *EigenPodStorageConsolidationRequested // 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
}
⋮----
Event *EigenPodStorageConsolidationRequested // Event containing the contract specifics and raw log
⋮----
// EigenPodStorageConsolidationRequested represents a ConsolidationRequested event raised by the EigenPodStorage contract.
type EigenPodStorageConsolidationRequested struct {
	SourcePubkeyHash [32]byte
	TargetPubkeyHash [32]byte
	Raw              types.Log // Blockchain specific contextual infos
}
⋮----
Raw              types.Log // Blockchain specific contextual infos
⋮----
// FilterConsolidationRequested is a free log retrieval operation binding the contract event 0x42f9c9db2ca443e9ec62f4588bd0c9b241065c02c2a8001ac164ae1282dc7b94.
⋮----
// Solidity: event ConsolidationRequested(bytes32 indexed sourcePubkeyHash, bytes32 indexed targetPubkeyHash)
func (_EigenPodStorage *EigenPodStorageFilterer) FilterConsolidationRequested(opts *bind.FilterOpts, sourcePubkeyHash [][32]byte, targetPubkeyHash [][32]byte) (*EigenPodStorageConsolidationRequestedIterator, error)
⋮----
var sourcePubkeyHashRule []interface{}
⋮----
var targetPubkeyHashRule []interface{}
⋮----
// WatchConsolidationRequested is a free log subscription operation binding the contract event 0x42f9c9db2ca443e9ec62f4588bd0c9b241065c02c2a8001ac164ae1282dc7b94.
⋮----
func (_EigenPodStorage *EigenPodStorageFilterer) WatchConsolidationRequested(opts *bind.WatchOpts, sink chan<- *EigenPodStorageConsolidationRequested, sourcePubkeyHash [][32]byte, targetPubkeyHash [][32]byte) (event.Subscription, error)
⋮----
// ParseConsolidationRequested is a log parse operation binding the contract event 0x42f9c9db2ca443e9ec62f4588bd0c9b241065c02c2a8001ac164ae1282dc7b94.
⋮----
func (_EigenPodStorage *EigenPodStorageFilterer) ParseConsolidationRequested(log types.Log) (*EigenPodStorageConsolidationRequested, error)
⋮----
// EigenPodStorageEigenPodStakedIterator is returned from FilterEigenPodStaked and is used to iterate over the raw logs and unpacked data for EigenPodStaked events raised by the EigenPodStorage contract.
type EigenPodStorageEigenPodStakedIterator struct {
	Event *EigenPodStorageEigenPodStaked // 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
}
⋮----
Event *EigenPodStorageEigenPodStaked // Event containing the contract specifics and raw log
⋮----
// EigenPodStorageEigenPodStaked represents a EigenPodStaked event raised by the EigenPodStorage contract.
type EigenPodStorageEigenPodStaked struct {
	PubkeyHash [32]byte
	Raw        types.Log // Blockchain specific contextual infos
}
⋮----
Raw        types.Log // Blockchain specific contextual infos
⋮----
// FilterEigenPodStaked is a free log retrieval operation binding the contract event 0xa01003766d3cd97cf2ade5429690bf5d206be7fb01ef9d3a0089ecf67bc11219.
⋮----
// Solidity: event EigenPodStaked(bytes32 pubkeyHash)
func (_EigenPodStorage *EigenPodStorageFilterer) FilterEigenPodStaked(opts *bind.FilterOpts) (*EigenPodStorageEigenPodStakedIterator, error)
⋮----
// WatchEigenPodStaked is a free log subscription operation binding the contract event 0xa01003766d3cd97cf2ade5429690bf5d206be7fb01ef9d3a0089ecf67bc11219.
⋮----
func (_EigenPodStorage *EigenPodStorageFilterer) WatchEigenPodStaked(opts *bind.WatchOpts, sink chan<- *EigenPodStorageEigenPodStaked) (event.Subscription, error)
⋮----
// ParseEigenPodStaked is a log parse operation binding the contract event 0xa01003766d3cd97cf2ade5429690bf5d206be7fb01ef9d3a0089ecf67bc11219.
⋮----
func (_EigenPodStorage *EigenPodStorageFilterer) ParseEigenPodStaked(log types.Log) (*EigenPodStorageEigenPodStaked, error)
⋮----
// EigenPodStorageExitRequestedIterator is returned from FilterExitRequested and is used to iterate over the raw logs and unpacked data for ExitRequested events raised by the EigenPodStorage contract.
type EigenPodStorageExitRequestedIterator struct {
	Event *EigenPodStorageExitRequested // 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
}
⋮----
Event *EigenPodStorageExitRequested // Event containing the contract specifics and raw log
⋮----
// EigenPodStorageExitRequested represents a ExitRequested event raised by the EigenPodStorage contract.
type EigenPodStorageExitRequested struct {
	ValidatorPubkeyHash [32]byte
	Raw                 types.Log // Blockchain specific contextual infos
}
⋮----
// FilterExitRequested is a free log retrieval operation binding the contract event 0x60d8ca014d4765a2b8b389e25714cb1cef83b574222911a01d90c1bd69d2d320.
⋮----
// Solidity: event ExitRequested(bytes32 indexed validatorPubkeyHash)
func (_EigenPodStorage *EigenPodStorageFilterer) FilterExitRequested(opts *bind.FilterOpts, validatorPubkeyHash [][32]byte) (*EigenPodStorageExitRequestedIterator, error)
⋮----
var validatorPubkeyHashRule []interface{}
⋮----
// WatchExitRequested is a free log subscription operation binding the contract event 0x60d8ca014d4765a2b8b389e25714cb1cef83b574222911a01d90c1bd69d2d320.
⋮----
func (_EigenPodStorage *EigenPodStorageFilterer) WatchExitRequested(opts *bind.WatchOpts, sink chan<- *EigenPodStorageExitRequested, validatorPubkeyHash [][32]byte) (event.Subscription, error)
⋮----
// ParseExitRequested is a log parse operation binding the contract event 0x60d8ca014d4765a2b8b389e25714cb1cef83b574222911a01d90c1bd69d2d320.
⋮----
func (_EigenPodStorage *EigenPodStorageFilterer) ParseExitRequested(log types.Log) (*EigenPodStorageExitRequested, error)
⋮----
// EigenPodStorageNonBeaconChainETHReceivedIterator is returned from FilterNonBeaconChainETHReceived and is used to iterate over the raw logs and unpacked data for NonBeaconChainETHReceived events raised by the EigenPodStorage contract.
type EigenPodStorageNonBeaconChainETHReceivedIterator struct {
	Event *EigenPodStorageNonBeaconChainETHReceived // 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
}
⋮----
Event *EigenPodStorageNonBeaconChainETHReceived // Event containing the contract specifics and raw log
⋮----
// EigenPodStorageNonBeaconChainETHReceived represents a NonBeaconChainETHReceived event raised by the EigenPodStorage contract.
type EigenPodStorageNonBeaconChainETHReceived struct {
	AmountReceived *big.Int
	Raw            types.Log // Blockchain specific contextual infos
}
⋮----
Raw            types.Log // Blockchain specific contextual infos
⋮----
// FilterNonBeaconChainETHReceived is a free log retrieval operation binding the contract event 0x6fdd3dbdb173299608c0aa9f368735857c8842b581f8389238bf05bd04b3bf49.
⋮----
// Solidity: event NonBeaconChainETHReceived(uint256 amountReceived)
func (_EigenPodStorage *EigenPodStorageFilterer) FilterNonBeaconChainETHReceived(opts *bind.FilterOpts) (*EigenPodStorageNonBeaconChainETHReceivedIterator, error)
⋮----
// WatchNonBeaconChainETHReceived is a free log subscription operation binding the contract event 0x6fdd3dbdb173299608c0aa9f368735857c8842b581f8389238bf05bd04b3bf49.
⋮----
func (_EigenPodStorage *EigenPodStorageFilterer) WatchNonBeaconChainETHReceived(opts *bind.WatchOpts, sink chan<- *EigenPodStorageNonBeaconChainETHReceived) (event.Subscription, error)
⋮----
// ParseNonBeaconChainETHReceived is a log parse operation binding the contract event 0x6fdd3dbdb173299608c0aa9f368735857c8842b581f8389238bf05bd04b3bf49.
⋮----
func (_EigenPodStorage *EigenPodStorageFilterer) ParseNonBeaconChainETHReceived(log types.Log) (*EigenPodStorageNonBeaconChainETHReceived, error)
⋮----
// EigenPodStorageProofSubmitterUpdatedIterator is returned from FilterProofSubmitterUpdated and is used to iterate over the raw logs and unpacked data for ProofSubmitterUpdated events raised by the EigenPodStorage contract.
type EigenPodStorageProofSubmitterUpdatedIterator struct {
	Event *EigenPodStorageProofSubmitterUpdated // 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
}
⋮----
Event *EigenPodStorageProofSubmitterUpdated // Event containing the contract specifics and raw log
⋮----
// EigenPodStorageProofSubmitterUpdated represents a ProofSubmitterUpdated event raised by the EigenPodStorage contract.
type EigenPodStorageProofSubmitterUpdated struct {
	PrevProofSubmitter common.Address
	NewProofSubmitter  common.Address
	Raw                types.Log // Blockchain specific contextual infos
}
⋮----
Raw                types.Log // Blockchain specific contextual infos
⋮----
// FilterProofSubmitterUpdated is a free log retrieval operation binding the contract event 0xfb8129080a19d34dceac04ba253fc50304dc86c729bd63cdca4a969ad19a5eac.
⋮----
// Solidity: event ProofSubmitterUpdated(address prevProofSubmitter, address newProofSubmitter)
func (_EigenPodStorage *EigenPodStorageFilterer) FilterProofSubmitterUpdated(opts *bind.FilterOpts) (*EigenPodStorageProofSubmitterUpdatedIterator, error)
⋮----
// WatchProofSubmitterUpdated is a free log subscription operation binding the contract event 0xfb8129080a19d34dceac04ba253fc50304dc86c729bd63cdca4a969ad19a5eac.
⋮----
func (_EigenPodStorage *EigenPodStorageFilterer) WatchProofSubmitterUpdated(opts *bind.WatchOpts, sink chan<- *EigenPodStorageProofSubmitterUpdated) (event.Subscription, error)
⋮----
// ParseProofSubmitterUpdated is a log parse operation binding the contract event 0xfb8129080a19d34dceac04ba253fc50304dc86c729bd63cdca4a969ad19a5eac.
⋮----
func (_EigenPodStorage *EigenPodStorageFilterer) ParseProofSubmitterUpdated(log types.Log) (*EigenPodStorageProofSubmitterUpdated, error)
⋮----
// EigenPodStorageRestakedBeaconChainETHWithdrawnIterator is returned from FilterRestakedBeaconChainETHWithdrawn and is used to iterate over the raw logs and unpacked data for RestakedBeaconChainETHWithdrawn events raised by the EigenPodStorage contract.
type EigenPodStorageRestakedBeaconChainETHWithdrawnIterator struct {
	Event *EigenPodStorageRestakedBeaconChainETHWithdrawn // 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
}
⋮----
Event *EigenPodStorageRestakedBeaconChainETHWithdrawn // Event containing the contract specifics and raw log
⋮----
// EigenPodStorageRestakedBeaconChainETHWithdrawn represents a RestakedBeaconChainETHWithdrawn event raised by the EigenPodStorage contract.
type EigenPodStorageRestakedBeaconChainETHWithdrawn struct {
	Recipient common.Address
	Amount    *big.Int
	Raw       types.Log // Blockchain specific contextual infos
}
⋮----
Raw       types.Log // Blockchain specific contextual infos
⋮----
// FilterRestakedBeaconChainETHWithdrawn is a free log retrieval operation binding the contract event 0x8947fd2ce07ef9cc302c4e8f0461015615d91ce851564839e91cc804c2f49d8e.
⋮----
// Solidity: event RestakedBeaconChainETHWithdrawn(address indexed recipient, uint256 amount)
func (_EigenPodStorage *EigenPodStorageFilterer) FilterRestakedBeaconChainETHWithdrawn(opts *bind.FilterOpts, recipient []common.Address) (*EigenPodStorageRestakedBeaconChainETHWithdrawnIterator, error)
⋮----
var recipientRule []interface{}
⋮----
// WatchRestakedBeaconChainETHWithdrawn is a free log subscription operation binding the contract event 0x8947fd2ce07ef9cc302c4e8f0461015615d91ce851564839e91cc804c2f49d8e.
⋮----
func (_EigenPodStorage *EigenPodStorageFilterer) WatchRestakedBeaconChainETHWithdrawn(opts *bind.WatchOpts, sink chan<- *EigenPodStorageRestakedBeaconChainETHWithdrawn, recipient []common.Address) (event.Subscription, error)
⋮----
// ParseRestakedBeaconChainETHWithdrawn is a log parse operation binding the contract event 0x8947fd2ce07ef9cc302c4e8f0461015615d91ce851564839e91cc804c2f49d8e.
⋮----
func (_EigenPodStorage *EigenPodStorageFilterer) ParseRestakedBeaconChainETHWithdrawn(log types.Log) (*EigenPodStorageRestakedBeaconChainETHWithdrawn, error)
⋮----
// EigenPodStorageSwitchToCompoundingRequestedIterator is returned from FilterSwitchToCompoundingRequested and is used to iterate over the raw logs and unpacked data for SwitchToCompoundingRequested events raised by the EigenPodStorage contract.
type EigenPodStorageSwitchToCompoundingRequestedIterator struct {
	Event *EigenPodStorageSwitchToCompoundingRequested // 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
}
⋮----
Event *EigenPodStorageSwitchToCompoundingRequested // Event containing the contract specifics and raw log
⋮----
// EigenPodStorageSwitchToCompoundingRequested represents a SwitchToCompoundingRequested event raised by the EigenPodStorage contract.
type EigenPodStorageSwitchToCompoundingRequested struct {
	ValidatorPubkeyHash [32]byte
	Raw                 types.Log // Blockchain specific contextual infos
}
⋮----
// FilterSwitchToCompoundingRequested is a free log retrieval operation binding the contract event 0xc97b965b92ae7fd20095fe8eb7b99f81f95f8c4adffb22a19116d8eb2846b016.
⋮----
// Solidity: event SwitchToCompoundingRequested(bytes32 indexed validatorPubkeyHash)
func (_EigenPodStorage *EigenPodStorageFilterer) FilterSwitchToCompoundingRequested(opts *bind.FilterOpts, validatorPubkeyHash [][32]byte) (*EigenPodStorageSwitchToCompoundingRequestedIterator, error)
⋮----
// WatchSwitchToCompoundingRequested is a free log subscription operation binding the contract event 0xc97b965b92ae7fd20095fe8eb7b99f81f95f8c4adffb22a19116d8eb2846b016.
⋮----
func (_EigenPodStorage *EigenPodStorageFilterer) WatchSwitchToCompoundingRequested(opts *bind.WatchOpts, sink chan<- *EigenPodStorageSwitchToCompoundingRequested, validatorPubkeyHash [][32]byte) (event.Subscription, error)
⋮----
// ParseSwitchToCompoundingRequested is a log parse operation binding the contract event 0xc97b965b92ae7fd20095fe8eb7b99f81f95f8c4adffb22a19116d8eb2846b016.
⋮----
func (_EigenPodStorage *EigenPodStorageFilterer) ParseSwitchToCompoundingRequested(log types.Log) (*EigenPodStorageSwitchToCompoundingRequested, error)
⋮----
// EigenPodStorageValidatorBalanceUpdatedIterator is returned from FilterValidatorBalanceUpdated and is used to iterate over the raw logs and unpacked data for ValidatorBalanceUpdated events raised by the EigenPodStorage contract.
type EigenPodStorageValidatorBalanceUpdatedIterator struct {
	Event *EigenPodStorageValidatorBalanceUpdated // 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
}
⋮----
Event *EigenPodStorageValidatorBalanceUpdated // Event containing the contract specifics and raw log
⋮----
// EigenPodStorageValidatorBalanceUpdated represents a ValidatorBalanceUpdated event raised by the EigenPodStorage contract.
type EigenPodStorageValidatorBalanceUpdated struct {
	PubkeyHash              [32]byte
	BalanceTimestamp        uint64
	NewValidatorBalanceGwei uint64
	Raw                     types.Log // Blockchain specific contextual infos
}
⋮----
Raw                     types.Log // Blockchain specific contextual infos
⋮----
// FilterValidatorBalanceUpdated is a free log retrieval operation binding the contract event 0xcdae700d7241bc027168c53cf6f889763b0a2c88a65d77fc13a8a9fef0d8605f.
⋮----
// Solidity: event ValidatorBalanceUpdated(bytes32 pubkeyHash, uint64 balanceTimestamp, uint64 newValidatorBalanceGwei)
func (_EigenPodStorage *EigenPodStorageFilterer) FilterValidatorBalanceUpdated(opts *bind.FilterOpts) (*EigenPodStorageValidatorBalanceUpdatedIterator, error)
⋮----
// WatchValidatorBalanceUpdated is a free log subscription operation binding the contract event 0xcdae700d7241bc027168c53cf6f889763b0a2c88a65d77fc13a8a9fef0d8605f.
⋮----
func (_EigenPodStorage *EigenPodStorageFilterer) WatchValidatorBalanceUpdated(opts *bind.WatchOpts, sink chan<- *EigenPodStorageValidatorBalanceUpdated) (event.Subscription, error)
⋮----
// ParseValidatorBalanceUpdated is a log parse operation binding the contract event 0xcdae700d7241bc027168c53cf6f889763b0a2c88a65d77fc13a8a9fef0d8605f.
⋮----
func (_EigenPodStorage *EigenPodStorageFilterer) ParseValidatorBalanceUpdated(log types.Log) (*EigenPodStorageValidatorBalanceUpdated, error)
⋮----
// EigenPodStorageValidatorCheckpointedIterator is returned from FilterValidatorCheckpointed and is used to iterate over the raw logs and unpacked data for ValidatorCheckpointed events raised by the EigenPodStorage contract.
type EigenPodStorageValidatorCheckpointedIterator struct {
	Event *EigenPodStorageValidatorCheckpointed // 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
}
⋮----
Event *EigenPodStorageValidatorCheckpointed // Event containing the contract specifics and raw log
⋮----
// EigenPodStorageValidatorCheckpointed represents a ValidatorCheckpointed event raised by the EigenPodStorage contract.
type EigenPodStorageValidatorCheckpointed struct {
	CheckpointTimestamp uint64
	PubkeyHash          [32]byte
	Raw                 types.Log // Blockchain specific contextual infos
}
⋮----
// FilterValidatorCheckpointed is a free log retrieval operation binding the contract event 0xe4866335761a51dcaff766448ab0af6064291ee5dc94e68492bb9cd757c1e350.
⋮----
// Solidity: event ValidatorCheckpointed(uint64 indexed checkpointTimestamp, bytes32 indexed pubkeyHash)
func (_EigenPodStorage *EigenPodStorageFilterer) FilterValidatorCheckpointed(opts *bind.FilterOpts, checkpointTimestamp []uint64, pubkeyHash [][32]byte) (*EigenPodStorageValidatorCheckpointedIterator, error)
⋮----
var pubkeyHashRule []interface{}
⋮----
// WatchValidatorCheckpointed is a free log subscription operation binding the contract event 0xe4866335761a51dcaff766448ab0af6064291ee5dc94e68492bb9cd757c1e350.
⋮----
func (_EigenPodStorage *EigenPodStorageFilterer) WatchValidatorCheckpointed(opts *bind.WatchOpts, sink chan<- *EigenPodStorageValidatorCheckpointed, checkpointTimestamp []uint64, pubkeyHash [][32]byte) (event.Subscription, error)
⋮----
// ParseValidatorCheckpointed is a log parse operation binding the contract event 0xe4866335761a51dcaff766448ab0af6064291ee5dc94e68492bb9cd757c1e350.
⋮----
func (_EigenPodStorage *EigenPodStorageFilterer) ParseValidatorCheckpointed(log types.Log) (*EigenPodStorageValidatorCheckpointed, error)
⋮----
// EigenPodStorageValidatorRestakedIterator is returned from FilterValidatorRestaked and is used to iterate over the raw logs and unpacked data for ValidatorRestaked events raised by the EigenPodStorage contract.
type EigenPodStorageValidatorRestakedIterator struct {
	Event *EigenPodStorageValidatorRestaked // 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
}
⋮----
Event *EigenPodStorageValidatorRestaked // Event containing the contract specifics and raw log
⋮----
// EigenPodStorageValidatorRestaked represents a ValidatorRestaked event raised by the EigenPodStorage contract.
type EigenPodStorageValidatorRestaked struct {
	PubkeyHash [32]byte
	Raw        types.Log // Blockchain specific contextual infos
}
⋮----
// FilterValidatorRestaked is a free log retrieval operation binding the contract event 0x101790c2993f6a4d962bd17c786126823ba1c4cf04ff4cccb2659d50fb20aee8.
⋮----
// Solidity: event ValidatorRestaked(bytes32 pubkeyHash)
func (_EigenPodStorage *EigenPodStorageFilterer) FilterValidatorRestaked(opts *bind.FilterOpts) (*EigenPodStorageValidatorRestakedIterator, error)
⋮----
// WatchValidatorRestaked is a free log subscription operation binding the contract event 0x101790c2993f6a4d962bd17c786126823ba1c4cf04ff4cccb2659d50fb20aee8.
⋮----
func (_EigenPodStorage *EigenPodStorageFilterer) WatchValidatorRestaked(opts *bind.WatchOpts, sink chan<- *EigenPodStorageValidatorRestaked) (event.Subscription, error)
⋮----
// ParseValidatorRestaked is a log parse operation binding the contract event 0x101790c2993f6a4d962bd17c786126823ba1c4cf04ff4cccb2659d50fb20aee8.
⋮----
func (_EigenPodStorage *EigenPodStorageFilterer) ParseValidatorRestaked(log types.Log) (*EigenPodStorageValidatorRestaked, error)
⋮----
// EigenPodStorageValidatorWithdrawnIterator is returned from FilterValidatorWithdrawn and is used to iterate over the raw logs and unpacked data for ValidatorWithdrawn events raised by the EigenPodStorage contract.
type EigenPodStorageValidatorWithdrawnIterator struct {
	Event *EigenPodStorageValidatorWithdrawn // 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
}
⋮----
Event *EigenPodStorageValidatorWithdrawn // Event containing the contract specifics and raw log
⋮----
// EigenPodStorageValidatorWithdrawn represents a ValidatorWithdrawn event raised by the EigenPodStorage contract.
type EigenPodStorageValidatorWithdrawn struct {
	CheckpointTimestamp uint64
	PubkeyHash          [32]byte
	Raw                 types.Log // Blockchain specific contextual infos
}
⋮----
// FilterValidatorWithdrawn is a free log retrieval operation binding the contract event 0x5ce0aa04ae51d52da6e680fbe0336d2e2432f7c3dc2d4f3193204c57b9072107.
⋮----
// Solidity: event ValidatorWithdrawn(uint64 indexed checkpointTimestamp, bytes32 indexed pubkeyHash)
func (_EigenPodStorage *EigenPodStorageFilterer) FilterValidatorWithdrawn(opts *bind.FilterOpts, checkpointTimestamp []uint64, pubkeyHash [][32]byte) (*EigenPodStorageValidatorWithdrawnIterator, error)
⋮----
// WatchValidatorWithdrawn is a free log subscription operation binding the contract event 0x5ce0aa04ae51d52da6e680fbe0336d2e2432f7c3dc2d4f3193204c57b9072107.
⋮----
func (_EigenPodStorage *EigenPodStorageFilterer) WatchValidatorWithdrawn(opts *bind.WatchOpts, sink chan<- *EigenPodStorageValidatorWithdrawn, checkpointTimestamp []uint64, pubkeyHash [][32]byte) (event.Subscription, error)
⋮----
// ParseValidatorWithdrawn is a log parse operation binding the contract event 0x5ce0aa04ae51d52da6e680fbe0336d2e2432f7c3dc2d4f3193204c57b9072107.
⋮----
func (_EigenPodStorage *EigenPodStorageFilterer) ParseValidatorWithdrawn(log types.Log) (*EigenPodStorageValidatorWithdrawn, error)
⋮----
// EigenPodStorageWithdrawalRequestedIterator is returned from FilterWithdrawalRequested and is used to iterate over the raw logs and unpacked data for WithdrawalRequested events raised by the EigenPodStorage contract.
type EigenPodStorageWithdrawalRequestedIterator struct {
	Event *EigenPodStorageWithdrawalRequested // 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
}
⋮----
Event *EigenPodStorageWithdrawalRequested // Event containing the contract specifics and raw log
⋮----
// EigenPodStorageWithdrawalRequested represents a WithdrawalRequested event raised by the EigenPodStorage contract.
type EigenPodStorageWithdrawalRequested struct {
	ValidatorPubkeyHash  [32]byte
	WithdrawalAmountGwei uint64
	Raw                  types.Log // Blockchain specific contextual infos
}
⋮----
Raw                  types.Log // Blockchain specific contextual infos
⋮----
// FilterWithdrawalRequested is a free log retrieval operation binding the contract event 0x8b2737bb64ab2f2dc09552dfa1c250399e6a42c7ea9f0e1c658f5d65d708ec05.
⋮----
// Solidity: event WithdrawalRequested(bytes32 indexed validatorPubkeyHash, uint64 withdrawalAmountGwei)
func (_EigenPodStorage *EigenPodStorageFilterer) FilterWithdrawalRequested(opts *bind.FilterOpts, validatorPubkeyHash [][32]byte) (*EigenPodStorageWithdrawalRequestedIterator, error)
⋮----
// WatchWithdrawalRequested is a free log subscription operation binding the contract event 0x8b2737bb64ab2f2dc09552dfa1c250399e6a42c7ea9f0e1c658f5d65d708ec05.
⋮----
func (_EigenPodStorage *EigenPodStorageFilterer) WatchWithdrawalRequested(opts *bind.WatchOpts, sink chan<- *EigenPodStorageWithdrawalRequested, validatorPubkeyHash [][32]byte) (event.Subscription, error)
⋮----
// ParseWithdrawalRequested is a log parse operation binding the contract event 0x8b2737bb64ab2f2dc09552dfa1c250399e6a42c7ea9f0e1c658f5d65d708ec05.
⋮----
func (_EigenPodStorage *EigenPodStorageFilterer) ParseWithdrawalRequested(log types.Log) (*EigenPodStorageWithdrawalRequested, error)
````

## File: pkg/bindings/EigenStrategy/binding.go
````go
// Code generated - DO NOT EDIT.
// This file is a generated binding and any manual changes will be lost.
⋮----
package EigenStrategy
⋮----
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"
)
⋮----
"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
)
⋮----
// 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\":\"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.
// Deprecated: Use EigenStrategyMetaData.ABI instead.
var EigenStrategyABI = EigenStrategyMetaData.ABI
⋮----
// EigenStrategyBin is the compiled bytecode used for deploying new contracts.
// Deprecated: Use EigenStrategyMetaData.Bin instead.
var EigenStrategyBin = EigenStrategyMetaData.Bin
⋮----
// DeployEigenStrategy deploys a new Ethereum contract, binding an instance of EigenStrategy to it.
func DeployEigenStrategy(auth *bind.TransactOpts, backend bind.ContractBackend, _strategyManager common.Address, _pauserRegistry common.Address) (common.Address, *types.Transaction, *EigenStrategy, error)
⋮----
// EigenStrategy is an auto generated Go binding around an Ethereum contract.
type EigenStrategy struct {
	EigenStrategyCaller     // Read-only binding to the contract
	EigenStrategyTransactor // Write-only binding to the contract
	EigenStrategyFilterer   // Log filterer for contract events
}
⋮----
EigenStrategyCaller     // Read-only binding to the contract
EigenStrategyTransactor // Write-only binding to the contract
EigenStrategyFilterer   // Log filterer for contract events
⋮----
// EigenStrategyCaller is an auto generated read-only Go binding around an Ethereum contract.
type EigenStrategyCaller struct {
	contract *bind.BoundContract // Generic contract wrapper for the low level calls
}
⋮----
contract *bind.BoundContract // Generic contract wrapper for the low level calls
⋮----
// EigenStrategyTransactor is an auto generated write-only Go binding around an Ethereum contract.
type EigenStrategyTransactor struct {
	contract *bind.BoundContract // Generic contract wrapper for the low level calls
}
⋮----
// EigenStrategyFilterer is an auto generated log filtering Go binding around an Ethereum contract events.
type EigenStrategyFilterer struct {
	contract *bind.BoundContract // Generic contract wrapper for the low level calls
}
⋮----
// EigenStrategySession is an auto generated Go binding around an Ethereum contract,
// with pre-set call and transact options.
type EigenStrategySession struct {
	Contract     *EigenStrategy    // 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
}
⋮----
Contract     *EigenStrategy    // 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
⋮----
// EigenStrategyCallerSession is an auto generated read-only Go binding around an Ethereum contract,
// with pre-set call options.
type EigenStrategyCallerSession struct {
	Contract *EigenStrategyCaller // Generic contract caller binding to set the session for
	CallOpts bind.CallOpts        // Call options to use throughout this session
}
⋮----
Contract *EigenStrategyCaller // Generic contract caller binding to set the session for
CallOpts bind.CallOpts        // Call options to use throughout this session
⋮----
// EigenStrategyTransactorSession is an auto generated write-only Go binding around an Ethereum contract,
// with pre-set transact options.
type EigenStrategyTransactorSession struct {
	Contract     *EigenStrategyTransactor // Generic contract transactor binding to set the session for
	TransactOpts bind.TransactOpts        // Transaction auth options to use throughout this session
}
⋮----
Contract     *EigenStrategyTransactor // Generic contract transactor binding to set the session for
TransactOpts bind.TransactOpts        // Transaction auth options to use throughout this session
⋮----
// EigenStrategyRaw is an auto generated low-level Go binding around an Ethereum contract.
type EigenStrategyRaw struct {
	Contract *EigenStrategy // Generic contract binding to access the raw methods on
}
⋮----
Contract *EigenStrategy // Generic contract binding to access the raw methods on
⋮----
// EigenStrategyCallerRaw is an auto generated low-level read-only Go binding around an Ethereum contract.
type EigenStrategyCallerRaw struct {
	Contract *EigenStrategyCaller // Generic read-only contract binding to access the raw methods on
}
⋮----
Contract *EigenStrategyCaller // Generic read-only contract binding to access the raw methods on
⋮----
// EigenStrategyTransactorRaw is an auto generated low-level write-only Go binding around an Ethereum contract.
type EigenStrategyTransactorRaw struct {
	Contract *EigenStrategyTransactor // Generic write-only contract binding to access the raw methods on
}
⋮----
Contract *EigenStrategyTransactor // Generic write-only contract binding to access the raw methods on
⋮----
// NewEigenStrategy creates a new instance of EigenStrategy, bound to a specific deployed contract.
func NewEigenStrategy(address common.Address, backend bind.ContractBackend) (*EigenStrategy, error)
⋮----
// NewEigenStrategyCaller creates a new read-only instance of EigenStrategy, bound to a specific deployed contract.
func NewEigenStrategyCaller(address common.Address, caller bind.ContractCaller) (*EigenStrategyCaller, error)
⋮----
// NewEigenStrategyTransactor creates a new write-only instance of EigenStrategy, bound to a specific deployed contract.
func NewEigenStrategyTransactor(address common.Address, transactor bind.ContractTransactor) (*EigenStrategyTransactor, error)
⋮----
// NewEigenStrategyFilterer creates a new log filterer instance of EigenStrategy, bound to a specific deployed contract.
func NewEigenStrategyFilterer(address common.Address, filterer bind.ContractFilterer) (*EigenStrategyFilterer, error)
⋮----
// bindEigenStrategy binds a generic wrapper to an already deployed contract.
func bindEigenStrategy(address common.Address, caller bind.ContractCaller, transactor bind.ContractTransactor, filterer bind.ContractFilterer) (*bind.BoundContract, error)
⋮----
// 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 (_EigenStrategy *EigenStrategyRaw) Call(opts *bind.CallOpts, result *[]interface
⋮----
// Transfer initiates a plain transaction to move funds to the contract, calling
// its default method if one is available.
func (_EigenStrategy *EigenStrategyRaw) Transfer(opts *bind.TransactOpts) (*types.Transaction, error)
⋮----
// Transact invokes the (paid) contract method with params as input values.
func (_EigenStrategy *EigenStrategyRaw) Transact(opts *bind.TransactOpts, method string, params ...interface
⋮----
// EIGEN is a free data retrieval call binding the contract method 0xfdc371ce.
//
// Solidity: function EIGEN() view returns(address)
func (_EigenStrategy *EigenStrategyCaller) EIGEN(opts *bind.CallOpts) (common.Address, error)
⋮----
var out []interface{}
⋮----
// Explanation is a free data retrieval call binding the contract method 0xab5921e1.
⋮----
// Solidity: function explanation() pure returns(string)
func (_EigenStrategy *EigenStrategyCaller) Explanation(opts *bind.CallOpts) (string, error)
⋮----
// Paused is a free data retrieval call binding the contract method 0x5ac86ab7.
⋮----
// Solidity: function paused(uint8 index) view returns(bool)
func (_EigenStrategy *EigenStrategyCaller) Paused(opts *bind.CallOpts, index uint8) (bool, error)
⋮----
// Paused0 is a free data retrieval call binding the contract method 0x5c975abb.
⋮----
// Solidity: function paused() view returns(uint256)
func (_EigenStrategy *EigenStrategyCaller) Paused0(opts *bind.CallOpts) (*big.Int, error)
⋮----
// PauserRegistry is a free data retrieval call binding the contract method 0x886f1195.
⋮----
// Solidity: function pauserRegistry() view returns(address)
func (_EigenStrategy *EigenStrategyCaller) PauserRegistry(opts *bind.CallOpts) (common.Address, error)
⋮----
// Shares is a free data retrieval call binding the contract method 0xce7c2ac2.
⋮----
// Solidity: function shares(address user) view returns(uint256)
func (_EigenStrategy *EigenStrategyCaller) Shares(opts *bind.CallOpts, user common.Address) (*big.Int, error)
⋮----
// SharesToUnderlying is a free data retrieval call binding the contract method 0xf3e73875.
⋮----
// Solidity: function sharesToUnderlying(uint256 amountShares) view returns(uint256)
func (_EigenStrategy *EigenStrategyCaller) SharesToUnderlying(opts *bind.CallOpts, amountShares *big.Int) (*big.Int, error)
⋮----
// SharesToUnderlyingView is a free data retrieval call binding the contract method 0x7a8b2637.
⋮----
// Solidity: function sharesToUnderlyingView(uint256 amountShares) view returns(uint256)
func (_EigenStrategy *EigenStrategyCaller) SharesToUnderlyingView(opts *bind.CallOpts, amountShares *big.Int) (*big.Int, error)
⋮----
// StrategyManager is a free data retrieval call binding the contract method 0x39b70e38.
⋮----
// Solidity: function strategyManager() view returns(address)
func (_EigenStrategy *EigenStrategyCaller) StrategyManager(opts *bind.CallOpts) (common.Address, error)
⋮----
// TotalShares is a free data retrieval call binding the contract method 0x3a98ef39.
⋮----
// Solidity: function totalShares() view returns(uint256)
func (_EigenStrategy *EigenStrategyCaller) TotalShares(opts *bind.CallOpts) (*big.Int, error)
⋮----
// UnderlyingToShares is a free data retrieval call binding the contract method 0x8c871019.
⋮----
// Solidity: function underlyingToShares(uint256 amountUnderlying) view returns(uint256)
func (_EigenStrategy *EigenStrategyCaller) UnderlyingToShares(opts *bind.CallOpts, amountUnderlying *big.Int) (*big.Int, error)
⋮----
// UnderlyingToSharesView is a free data retrieval call binding the contract method 0xe3dae51c.
⋮----
// Solidity: function underlyingToSharesView(uint256 amountUnderlying) view returns(uint256)
func (_EigenStrategy *EigenStrategyCaller) UnderlyingToSharesView(opts *bind.CallOpts, amountUnderlying *big.Int) (*big.Int, error)
⋮----
// UnderlyingToken is a free data retrieval call binding the contract method 0x2495a599.
⋮----
// Solidity: function underlyingToken() view returns(address)
func (_EigenStrategy *EigenStrategyCaller) UnderlyingToken(opts *bind.CallOpts) (common.Address, error)
⋮----
// UserUnderlyingView is a free data retrieval call binding the contract method 0x553ca5f8.
⋮----
// Solidity: function userUnderlyingView(address user) view returns(uint256)
func (_EigenStrategy *EigenStrategyCaller) UserUnderlyingView(opts *bind.CallOpts, user common.Address) (*big.Int, error)
⋮----
// 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)
⋮----
// 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)
⋮----
// Deposit is a paid mutator transaction binding the contract method 0x47e7ef24.
⋮----
// Solidity: function deposit(address token, uint256 amount) returns(uint256 newShares)
func (_EigenStrategy *EigenStrategyTransactor) Deposit(opts *bind.TransactOpts, token common.Address, amount *big.Int) (*types.Transaction, error)
⋮----
// Initialize is a paid mutator transaction binding the contract method 0x485cc955.
⋮----
// Solidity: function initialize(address _EIGEN, address _bEIGEN) returns()
func (_EigenStrategy *EigenStrategyTransactor) Initialize(opts *bind.TransactOpts, _EIGEN common.Address, _bEIGEN common.Address) (*types.Transaction, error)
⋮----
// Initialize0 is a paid mutator transaction binding the contract method 0xc4d66de8.
⋮----
// Solidity: function initialize(address _underlyingToken) returns()
func (_EigenStrategy *EigenStrategyTransactor) Initialize0(opts *bind.TransactOpts, _underlyingToken common.Address) (*types.Transaction, error)
⋮----
// Pause is a paid mutator transaction binding the contract method 0x136439dd.
⋮----
// Solidity: function pause(uint256 newPausedStatus) returns()
func (_EigenStrategy *EigenStrategyTransactor) Pause(opts *bind.TransactOpts, newPausedStatus *big.Int) (*types.Transaction, error)
⋮----
// PauseAll is a paid mutator transaction binding the contract method 0x595c6a67.
⋮----
// Solidity: function pauseAll() returns()
func (_EigenStrategy *EigenStrategyTransactor) PauseAll(opts *bind.TransactOpts) (*types.Transaction, error)
⋮----
// Unpause is a paid mutator transaction binding the contract method 0xfabc1cbc.
⋮----
// Solidity: function unpause(uint256 newPausedStatus) returns()
func (_EigenStrategy *EigenStrategyTransactor) Unpause(opts *bind.TransactOpts, newPausedStatus *big.Int) (*types.Transaction, error)
⋮----
// UserUnderlying is a paid mutator transaction binding the contract method 0x8f6a6240.
⋮----
// Solidity: function userUnderlying(address user) returns(uint256)
func (_EigenStrategy *EigenStrategyTransactor) UserUnderlying(opts *bind.TransactOpts, user common.Address) (*types.Transaction, error)
⋮----
// Withdraw is a paid mutator transaction binding the contract method 0xd9caed12.
⋮----
// Solidity: function withdraw(address recipient, address token, uint256 amountShares) returns(uint256 amountOut)
func (_EigenStrategy *EigenStrategyTransactor) Withdraw(opts *bind.TransactOpts, recipient common.Address, token common.Address, amountShares *big.Int) (*types.Transaction, error)
⋮----
// EigenStrategyExchangeRateEmittedIterator is returned from FilterExchangeRateEmitted and is used to iterate over the raw logs and unpacked data for ExchangeRateEmitted events raised by the EigenStrategy contract.
type EigenStrategyExchangeRateEmittedIterator struct {
	Event *EigenStrategyExchangeRateEmitted // 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
}
⋮----
Event *EigenStrategyExchangeRateEmitted // 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 *EigenStrategyExchangeRateEmittedIterator) Next() bool
⋮----
// If the iterator failed, stop iterating
⋮----
// If the iterator completed, deliver directly whatever's available
⋮----
// Iterator still in progress, wait for either a data or an error event
⋮----
// Error returns any retrieval or parsing error occurred during filtering.
func (it *EigenStrategyExchangeRateEmittedIterator) Error() error
⋮----
// Close terminates the iteration process, releasing any pending underlying
// resources.
func (it *EigenStrategyExchangeRateEmittedIterator) Close() error
⋮----
// EigenStrategyExchangeRateEmitted represents a ExchangeRateEmitted event raised by the EigenStrategy contract.
type EigenStrategyExchangeRateEmitted struct {
	Rate *big.Int
	Raw  types.Log // Blockchain specific contextual infos
}
⋮----
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 (_EigenStrategy *EigenStrategyFilterer) FilterExchangeRateEmitted(opts *bind.FilterOpts) (*EigenStrategyExchangeRateEmittedIterator, error)
⋮----
// WatchExchangeRateEmitted is a free log subscription operation binding the contract event 0xd2494f3479e5da49d386657c292c610b5b01df313d07c62eb0cfa49924a31be8.
⋮----
func (_EigenStrategy *EigenStrategyFilterer) WatchExchangeRateEmitted(opts *bind.WatchOpts, sink chan<- *EigenStrategyExchangeRateEmitted) (event.Subscription, error)
⋮----
// New log arrived, parse the event and forward to the user
⋮----
// ParseExchangeRateEmitted is a log parse operation binding the contract event 0xd2494f3479e5da49d386657c292c610b5b01df313d07c62eb0cfa49924a31be8.
⋮----
func (_EigenStrategy *EigenStrategyFilterer) ParseExchangeRateEmitted(log types.Log) (*EigenStrategyExchangeRateEmitted, error)
⋮----
// EigenStrategyInitializedIterator is returned from FilterInitialized and is used to iterate over the raw logs and unpacked data for Initialized events raised by the EigenStrategy contract.
type EigenStrategyInitializedIterator struct {
	Event *EigenStrategyInitialized // 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
}
⋮----
Event *EigenStrategyInitialized // Event containing the contract specifics and raw log
⋮----
// EigenStrategyInitialized represents a Initialized event raised by the EigenStrategy contract.
type EigenStrategyInitialized struct {
	Version uint8
	Raw     types.Log // Blockchain specific contextual infos
}
⋮----
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 (_EigenStrategy *EigenStrategyFilterer) FilterInitialized(opts *bind.FilterOpts) (*EigenStrategyInitializedIterator, error)
⋮----
// WatchInitialized is a free log subscription operation binding the contract event 0x7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb3847402498.
⋮----
func (_EigenStrategy *EigenStrategyFilterer) WatchInitialized(opts *bind.WatchOpts, sink chan<- *EigenStrategyInitialized) (event.Subscription, error)
⋮----
// ParseInitialized is a log parse operation binding the contract event 0x7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb3847402498.
⋮----
func (_EigenStrategy *EigenStrategyFilterer) ParseInitialized(log types.Log) (*EigenStrategyInitialized, error)
⋮----
// EigenStrategyPausedIterator is returned from FilterPaused and is used to iterate over the raw logs and unpacked data for Paused events raised by the EigenStrategy contract.
type EigenStrategyPausedIterator struct {
	Event *EigenStrategyPaused // 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
}
⋮----
Event *EigenStrategyPaused // Event containing the contract specifics and raw log
⋮----
// EigenStrategyPaused represents a Paused event raised by the EigenStrategy contract.
type EigenStrategyPaused struct {
	Account         common.Address
	NewPausedStatus *big.Int
	Raw             types.Log // Blockchain specific contextual infos
}
⋮----
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 (_EigenStrategy *EigenStrategyFilterer) FilterPaused(opts *bind.FilterOpts, account []common.Address) (*EigenStrategyPausedIterator, error)
⋮----
var accountRule []interface{}
⋮----
// WatchPaused is a free log subscription operation binding the contract event 0xab40a374bc51de372200a8bc981af8c9ecdc08dfdaef0bb6e09f88f3c616ef3d.
⋮----
func (_EigenStrategy *EigenStrategyFilterer) WatchPaused(opts *bind.WatchOpts, sink chan<- *EigenStrategyPaused, account []common.Address) (event.Subscription, error)
⋮----
// ParsePaused is a log parse operation binding the contract event 0xab40a374bc51de372200a8bc981af8c9ecdc08dfdaef0bb6e09f88f3c616ef3d.
⋮----
func (_EigenStrategy *EigenStrategyFilterer) ParsePaused(log types.Log) (*EigenStrategyPaused, error)
⋮----
// EigenStrategyStrategyTokenSetIterator is returned from FilterStrategyTokenSet and is used to iterate over the raw logs and unpacked data for StrategyTokenSet events raised by the EigenStrategy contract.
type EigenStrategyStrategyTokenSetIterator struct {
	Event *EigenStrategyStrategyTokenSet // 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
}
⋮----
Event *EigenStrategyStrategyTokenSet // Event containing the contract specifics and raw log
⋮----
// EigenStrategyStrategyTokenSet represents a StrategyTokenSet event raised by the EigenStrategy contract.
type EigenStrategyStrategyTokenSet struct {
	Token    common.Address
	Decimals uint8
	Raw      types.Log // Blockchain specific contextual infos
}
⋮----
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 (_EigenStrategy *EigenStrategyFilterer) FilterStrategyTokenSet(opts *bind.FilterOpts) (*EigenStrategyStrategyTokenSetIterator, error)
⋮----
// WatchStrategyTokenSet is a free log subscription operation binding the contract event 0x1c540707b00eb5427b6b774fc799d756516a54aee108b64b327acc55af557507.
⋮----
func (_EigenStrategy *EigenStrategyFilterer) WatchStrategyTokenSet(opts *bind.WatchOpts, sink chan<- *EigenStrategyStrategyTokenSet) (event.Subscription, error)
⋮----
// ParseStrategyTokenSet is a log parse operation binding the contract event 0x1c540707b00eb5427b6b774fc799d756516a54aee108b64b327acc55af557507.
⋮----
func (_EigenStrategy *EigenStrategyFilterer) ParseStrategyTokenSet(log types.Log) (*EigenStrategyStrategyTokenSet, error)
⋮----
// EigenStrategyUnpausedIterator is returned from FilterUnpaused and is used to iterate over the raw logs and unpacked data for Unpaused events raised by the EigenStrategy contract.
type EigenStrategyUnpausedIterator struct {
	Event *EigenStrategyUnpaused // 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
}
⋮----
Event *EigenStrategyUnpaused // Event containing the contract specifics and raw log
⋮----
// EigenStrategyUnpaused represents a Unpaused event raised by the EigenStrategy contract.
type EigenStrategyUnpaused 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 (_EigenStrategy *EigenStrategyFilterer) FilterUnpaused(opts *bind.FilterOpts, account []common.Address) (*EigenStrategyUnpausedIterator, error)
⋮----
// WatchUnpaused is a free log subscription operation binding the contract event 0x3582d1828e26bf56bd801502bc021ac0bc8afb57c826e4986b45593c8fad389c.
⋮----
func (_EigenStrategy *EigenStrategyFilterer) WatchUnpaused(opts *bind.WatchOpts, sink chan<- *EigenStrategyUnpaused, account []common.Address) (event.Subscription, error)
⋮----
// ParseUnpaused is a log parse operation binding the contract event 0x3582d1828e26bf56bd801502bc021ac0bc8afb57c826e4986b45593c8fad389c.
⋮----
func (_EigenStrategy *EigenStrategyFilterer) ParseUnpaused(log types.Log) (*EigenStrategyUnpaused, error)
````

## File: pkg/bindings/EmissionsController/binding.go
````go
// 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"
)
⋮----
"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)
⋮----
// 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     // 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
}
⋮----
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
}
⋮----
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
}
⋮----
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
}
⋮----
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
}
⋮----
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
}
⋮----
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
}
⋮----
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)
⋮----
// 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)
⋮----
// 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)
⋮----
// 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)
⋮----
// 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)
⋮----
// 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
⋮----
// 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)
⋮----
// Transact invokes the (paid) contract method with params as input values.
func (_EmissionsController *EmissionsControllerRaw) Transact(opts *bind.TransactOpts, method string, params ...interface
⋮----
// 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{}
⋮----
// 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)
⋮----
// 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)
⋮----
// 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)
⋮----
// 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)
⋮----
// 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)
⋮----
// 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)
⋮----
// 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)
⋮----
// 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)
⋮----
// 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)
⋮----
// 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)
⋮----
// 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)
⋮----
// 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)
⋮----
// 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)
⋮----
// 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)
⋮----
// 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)
⋮----
// 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)
⋮----
// 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)
⋮----
// 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)
⋮----
// 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)
⋮----
// 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)
⋮----
// 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)
⋮----
// 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)
⋮----
// 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)
⋮----
// 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)
⋮----
// 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)
⋮----
// 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)
⋮----
// 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)
⋮----
// 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)
⋮----
// 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)
⋮----
// 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)
⋮----
// 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)
⋮----
// 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
}
⋮----
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 the iterator completed, deliver directly whatever's available
⋮----
// Iterator still in progress, wait for either a data or an error event
⋮----
// Error returns any retrieval or parsing error occurred during filtering.
func (it *EmissionsControllerDistributionAddedIterator) Error() error
⋮----
// Close terminates the iteration process, releasing any pending underlying
// resources.
func (it *EmissionsControllerDistributionAddedIterator) Close() error
⋮----
// 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
}
⋮----
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{}
⋮----
var epochRule []interface{}
⋮----
// WatchDistributionAdded is a free log subscription operation binding the contract event 0x006f7ba35643ecf5852cfe01b66220b1fe04a4cd4866923d5f3e66c7fcb390ef.
⋮----
func (_EmissionsController *EmissionsControllerFilterer) WatchDistributionAdded(opts *bind.WatchOpts, sink chan<- *EmissionsControllerDistributionAdded, distributionId []*big.Int, epoch []*big.Int) (event.Subscription, error)
⋮----
// New log arrived, parse the event and forward to the user
⋮----
// ParseDistributionAdded is a log parse operation binding the contract event 0x006f7ba35643ecf5852cfe01b66220b1fe04a4cd4866923d5f3e66c7fcb390ef.
⋮----
func (_EmissionsController *EmissionsControllerFilterer) ParseDistributionAdded(log types.Log) (*EmissionsControllerDistributionAdded, error)
⋮----
// 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
}
⋮----
Event *EmissionsControllerDistributionProcessed // Event containing the contract specifics and raw log
⋮----
// 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)
⋮----
// WatchDistributionProcessed is a free log subscription operation binding the contract event 0xba5d66336bc9a4f8459242151a4da4d5020ac581243d98403bb55f7f348e071b.
⋮----
func (_EmissionsController *EmissionsControllerFilterer) WatchDistributionProcessed(opts *bind.WatchOpts, sink chan<- *EmissionsControllerDistributionProcessed, distributionId []*big.Int, epoch []*big.Int) (event.Subscription, error)
⋮----
// ParseDistributionProcessed is a log parse operation binding the contract event 0xba5d66336bc9a4f8459242151a4da4d5020ac581243d98403bb55f7f348e071b.
⋮----
func (_EmissionsController *EmissionsControllerFilterer) ParseDistributionProcessed(log types.Log) (*EmissionsControllerDistributionProcessed, error)
⋮----
// 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
}
⋮----
Event *EmissionsControllerDistributionUpdated // Event containing the contract specifics and raw log
⋮----
// 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)
⋮----
// WatchDistributionUpdated is a free log subscription operation binding the contract event 0x548fb50d6be978df2bacbf48c6840e4a4743672408921282117f3f00555b2b4c.
⋮----
func (_EmissionsController *EmissionsControllerFilterer) WatchDistributionUpdated(opts *bind.WatchOpts, sink chan<- *EmissionsControllerDistributionUpdated, distributionId []*big.Int, epoch []*big.Int) (event.Subscription, error)
⋮----
// ParseDistributionUpdated is a log parse operation binding the contract event 0x548fb50d6be978df2bacbf48c6840e4a4743672408921282117f3f00555b2b4c.
⋮----
func (_EmissionsController *EmissionsControllerFilterer) ParseDistributionUpdated(log types.Log) (*EmissionsControllerDistributionUpdated, error)
⋮----
// 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
}
⋮----
Event *EmissionsControllerIncentiveCouncilUpdated // Event containing the contract specifics and raw log
⋮----
// EmissionsControllerIncentiveCouncilUpdated represents a IncentiveCouncilUpdated event raised by the EmissionsController contract.
type EmissionsControllerIncentiveCouncilUpdated struct {
	IncentiveCouncil common.Address
	Raw              types.Log // Blockchain specific contextual infos
}
⋮----
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{}
⋮----
// WatchIncentiveCouncilUpdated is a free log subscription operation binding the contract event 0x8befac6896b786e67b23cefc473bfabd36e7fc013125c883dfeec8e3a9636216.
⋮----
func (_EmissionsController *EmissionsControllerFilterer) WatchIncentiveCouncilUpdated(opts *bind.WatchOpts, sink chan<- *EmissionsControllerIncentiveCouncilUpdated, incentiveCouncil []common.Address) (event.Subscription, error)
⋮----
// ParseIncentiveCouncilUpdated is a log parse operation binding the contract event 0x8befac6896b786e67b23cefc473bfabd36e7fc013125c883dfeec8e3a9636216.
⋮----
func (_EmissionsController *EmissionsControllerFilterer) ParseIncentiveCouncilUpdated(log types.Log) (*EmissionsControllerIncentiveCouncilUpdated, error)
⋮----
// 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
}
⋮----
Event *EmissionsControllerInitialized // Event containing the contract specifics and raw log
⋮----
// EmissionsControllerInitialized represents a Initialized event raised by the EmissionsController contract.
type EmissionsControllerInitialized struct {
	Version uint8
	Raw     types.Log // Blockchain specific contextual infos
}
⋮----
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)
⋮----
// WatchInitialized is a free log subscription operation binding the contract event 0x7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb3847402498.
⋮----
func (_EmissionsController *EmissionsControllerFilterer) WatchInitialized(opts *bind.WatchOpts, sink chan<- *EmissionsControllerInitialized) (event.Subscription, error)
⋮----
// ParseInitialized is a log parse operation binding the contract event 0x7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb3847402498.
⋮----
func (_EmissionsController *EmissionsControllerFilterer) ParseInitialized(log types.Log) (*EmissionsControllerInitialized, error)
⋮----
// 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
}
⋮----
Event *EmissionsControllerOwnershipTransferred // Event containing the contract specifics and raw log
⋮----
// 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
}
⋮----
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{}
⋮----
var newOwnerRule []interface{}
⋮----
// WatchOwnershipTransferred is a free log subscription operation binding the contract event 0x8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0.
⋮----
func (_EmissionsController *EmissionsControllerFilterer) WatchOwnershipTransferred(opts *bind.WatchOpts, sink chan<- *EmissionsControllerOwnershipTransferred, previousOwner []common.Address, newOwner []common.Address) (event.Subscription, error)
⋮----
// ParseOwnershipTransferred is a log parse operation binding the contract event 0x8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0.
⋮----
func (_EmissionsController *EmissionsControllerFilterer) ParseOwnershipTransferred(log types.Log) (*EmissionsControllerOwnershipTransferred, error)
⋮----
// 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
}
⋮----
Event *EmissionsControllerPaused // Event containing the contract specifics and raw log
⋮----
// 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
}
⋮----
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{}
⋮----
// WatchPaused is a free log subscription operation binding the contract event 0xab40a374bc51de372200a8bc981af8c9ecdc08dfdaef0bb6e09f88f3c616ef3d.
⋮----
func (_EmissionsController *EmissionsControllerFilterer) WatchPaused(opts *bind.WatchOpts, sink chan<- *EmissionsControllerPaused, account []common.Address) (event.Subscription, error)
⋮----
// ParsePaused is a log parse operation binding the contract event 0xab40a374bc51de372200a8bc981af8c9ecdc08dfdaef0bb6e09f88f3c616ef3d.
⋮----
func (_EmissionsController *EmissionsControllerFilterer) ParsePaused(log types.Log) (*EmissionsControllerPaused, error)
⋮----
// 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
}
⋮----
Event *EmissionsControllerSwept // Event containing the contract specifics and raw log
⋮----
// 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)
⋮----
// WatchSwept is a free log subscription operation binding the contract event 0xc36b5179cb9c303b200074996eab2b3473eac370fdd7eba3bec636fe35109696.
⋮----
func (_EmissionsController *EmissionsControllerFilterer) WatchSwept(opts *bind.WatchOpts, sink chan<- *EmissionsControllerSwept, incentiveCouncil []common.Address) (event.Subscription, error)
⋮----
// ParseSwept is a log parse operation binding the contract event 0xc36b5179cb9c303b200074996eab2b3473eac370fdd7eba3bec636fe35109696.
⋮----
func (_EmissionsController *EmissionsControllerFilterer) ParseSwept(log types.Log) (*EmissionsControllerSwept, error)
⋮----
// 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
}
⋮----
Event *EmissionsControllerUnpaused // Event containing the contract specifics and raw log
⋮----
// 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)
⋮----
// WatchUnpaused is a free log subscription operation binding the contract event 0x3582d1828e26bf56bd801502bc021ac0bc8afb57c826e4986b45593c8fad389c.
⋮----
func (_EmissionsController *EmissionsControllerFilterer) WatchUnpaused(opts *bind.WatchOpts, sink chan<- *EmissionsControllerUnpaused, account []common.Address) (event.Subscription, error)
⋮----
// ParseUnpaused is a log parse operation binding the contract event 0x3582d1828e26bf56bd801502bc021ac0bc8afb57c826e4986b45593c8fad389c.
⋮----
func (_EmissionsController *EmissionsControllerFilterer) ParseUnpaused(log types.Log) (*EmissionsControllerUnpaused, error)
````

## File: pkg/bindings/EmissionsControllerStorage/binding.go
````go
// 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"
)
⋮----
"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     // 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
}
⋮----
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
}
⋮----
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
}
⋮----
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
}
⋮----
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
}
⋮----
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
}
⋮----
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
}
⋮----
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)
⋮----
// 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)
⋮----
// 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)
⋮----
// 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)
⋮----
// 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)
⋮----
// 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
⋮----
// 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)
⋮----
// Transact invokes the (paid) contract method with params as input values.
func (_EmissionsControllerStorage *EmissionsControllerStorageRaw) Transact(opts *bind.TransactOpts, method string, params ...interface
⋮----
// 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{}
⋮----
// 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)
⋮----
// 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)
⋮----
// 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)
⋮----
// 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)
⋮----
// 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)
⋮----
// 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)
⋮----
// 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)
⋮----
// 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)
⋮----
// 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)
⋮----
// 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)
⋮----
// 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)
⋮----
// 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)
⋮----
// 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)
⋮----
// 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)
⋮----
// 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)
⋮----
// 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)
⋮----
// 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)
⋮----
// 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)
⋮----
// 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)
⋮----
// 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)
⋮----
// 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)
⋮----
// 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)
⋮----
// 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)
⋮----
// 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)
⋮----
// 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)
⋮----
// 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)
⋮----
// 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)
⋮----
// 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)
⋮----
// 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
}
⋮----
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 the iterator completed, deliver directly whatever's available
⋮----
// Iterator still in progress, wait for either a data or an error event
⋮----
// Error returns any retrieval or parsing error occurred during filtering.
func (it *EmissionsControllerStorageDistributionAddedIterator) Error() error
⋮----
// Close terminates the iteration process, releasing any pending underlying
// resources.
func (it *EmissionsControllerStorageDistributionAddedIterator) Close() error
⋮----
// 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
}
⋮----
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{}
⋮----
var epochRule []interface{}
⋮----
// WatchDistributionAdded is a free log subscription operation binding the contract event 0x006f7ba35643ecf5852cfe01b66220b1fe04a4cd4866923d5f3e66c7fcb390ef.
⋮----
func (_EmissionsControllerStorage *EmissionsControllerStorageFilterer) WatchDistributionAdded(opts *bind.WatchOpts, sink chan<- *EmissionsControllerStorageDistributionAdded, distributionId []*big.Int, epoch []*big.Int) (event.Subscription, error)
⋮----
// New log arrived, parse the event and forward to the user
⋮----
// ParseDistributionAdded is a log parse operation binding the contract event 0x006f7ba35643ecf5852cfe01b66220b1fe04a4cd4866923d5f3e66c7fcb390ef.
⋮----
func (_EmissionsControllerStorage *EmissionsControllerStorageFilterer) ParseDistributionAdded(log types.Log) (*EmissionsControllerStorageDistributionAdded, error)
⋮----
// 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
}
⋮----
Event *EmissionsControllerStorageDistributionProcessed // Event containing the contract specifics and raw log
⋮----
// 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)
⋮----
// WatchDistributionProcessed is a free log subscription operation binding the contract event 0xba5d66336bc9a4f8459242151a4da4d5020ac581243d98403bb55f7f348e071b.
⋮----
func (_EmissionsControllerStorage *EmissionsControllerStorageFilterer) WatchDistributionProcessed(opts *bind.WatchOpts, sink chan<- *EmissionsControllerStorageDistributionProcessed, distributionId []*big.Int, epoch []*big.Int) (event.Subscription, error)
⋮----
// ParseDistributionProcessed is a log parse operation binding the contract event 0xba5d66336bc9a4f8459242151a4da4d5020ac581243d98403bb55f7f348e071b.
⋮----
func (_EmissionsControllerStorage *EmissionsControllerStorageFilterer) ParseDistributionProcessed(log types.Log) (*EmissionsControllerStorageDistributionProcessed, error)
⋮----
// 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
}
⋮----
Event *EmissionsControllerStorageDistributionUpdated // Event containing the contract specifics and raw log
⋮----
// 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)
⋮----
// WatchDistributionUpdated is a free log subscription operation binding the contract event 0x548fb50d6be978df2bacbf48c6840e4a4743672408921282117f3f00555b2b4c.
⋮----
func (_EmissionsControllerStorage *EmissionsControllerStorageFilterer) WatchDistributionUpdated(opts *bind.WatchOpts, sink chan<- *EmissionsControllerStorageDistributionUpdated, distributionId []*big.Int, epoch []*big.Int) (event.Subscription, error)
⋮----
// ParseDistributionUpdated is a log parse operation binding the contract event 0x548fb50d6be978df2bacbf48c6840e4a4743672408921282117f3f00555b2b4c.
⋮----
func (_EmissionsControllerStorage *EmissionsControllerStorageFilterer) ParseDistributionUpdated(log types.Log) (*EmissionsControllerStorageDistributionUpdated, error)
⋮----
// 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
}
⋮----
Event *EmissionsControllerStorageIncentiveCouncilUpdated // Event containing the contract specifics and raw log
⋮----
// EmissionsControllerStorageIncentiveCouncilUpdated represents a IncentiveCouncilUpdated event raised by the EmissionsControllerStorage contract.
type EmissionsControllerStorageIncentiveCouncilUpdated struct {
	IncentiveCouncil common.Address
	Raw              types.Log // Blockchain specific contextual infos
}
⋮----
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{}
⋮----
// WatchIncentiveCouncilUpdated is a free log subscription operation binding the contract event 0x8befac6896b786e67b23cefc473bfabd36e7fc013125c883dfeec8e3a9636216.
⋮----
func (_EmissionsControllerStorage *EmissionsControllerStorageFilterer) WatchIncentiveCouncilUpdated(opts *bind.WatchOpts, sink chan<- *EmissionsControllerStorageIncentiveCouncilUpdated, incentiveCouncil []common.Address) (event.Subscription, error)
⋮----
// ParseIncentiveCouncilUpdated is a log parse operation binding the contract event 0x8befac6896b786e67b23cefc473bfabd36e7fc013125c883dfeec8e3a9636216.
⋮----
func (_EmissionsControllerStorage *EmissionsControllerStorageFilterer) ParseIncentiveCouncilUpdated(log types.Log) (*EmissionsControllerStorageIncentiveCouncilUpdated, error)
⋮----
// 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
}
⋮----
Event *EmissionsControllerStoragePaused // Event containing the contract specifics and raw log
⋮----
// 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
}
⋮----
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{}
⋮----
// WatchPaused is a free log subscription operation binding the contract event 0xab40a374bc51de372200a8bc981af8c9ecdc08dfdaef0bb6e09f88f3c616ef3d.
⋮----
func (_EmissionsControllerStorage *EmissionsControllerStorageFilterer) WatchPaused(opts *bind.WatchOpts, sink chan<- *EmissionsControllerStoragePaused, account []common.Address) (event.Subscription, error)
⋮----
// ParsePaused is a log parse operation binding the contract event 0xab40a374bc51de372200a8bc981af8c9ecdc08dfdaef0bb6e09f88f3c616ef3d.
⋮----
func (_EmissionsControllerStorage *EmissionsControllerStorageFilterer) ParsePaused(log types.Log) (*EmissionsControllerStoragePaused, error)
⋮----
// 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
}
⋮----
Event *EmissionsControllerStorageSwept // Event containing the contract specifics and raw log
⋮----
// 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)
⋮----
// WatchSwept is a free log subscription operation binding the contract event 0xc36b5179cb9c303b200074996eab2b3473eac370fdd7eba3bec636fe35109696.
⋮----
func (_EmissionsControllerStorage *EmissionsControllerStorageFilterer) WatchSwept(opts *bind.WatchOpts, sink chan<- *EmissionsControllerStorageSwept, incentiveCouncil []common.Address) (event.Subscription, error)
⋮----
// ParseSwept is a log parse operation binding the contract event 0xc36b5179cb9c303b200074996eab2b3473eac370fdd7eba3bec636fe35109696.
⋮----
func (_EmissionsControllerStorage *EmissionsControllerStorageFilterer) ParseSwept(log types.Log) (*EmissionsControllerStorageSwept, error)
⋮----
// 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
}
⋮----
Event *EmissionsControllerStorageUnpaused // Event containing the contract specifics and raw log
⋮----
// 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)
⋮----
// WatchUnpaused is a free log subscription operation binding the contract event 0x3582d1828e26bf56bd801502bc021ac0bc8afb57c826e4986b45593c8fad389c.
⋮----
func (_EmissionsControllerStorage *EmissionsControllerStorageFilterer) WatchUnpaused(opts *bind.WatchOpts, sink chan<- *EmissionsControllerStorageUnpaused, account []common.Address) (event.Subscription, error)
⋮----
// ParseUnpaused is a log parse operation binding the contract event 0x3582d1828e26bf56bd801502bc021ac0bc8afb57c826e4986b45593c8fad389c.
⋮----
func (_EmissionsControllerStorage *EmissionsControllerStorageFilterer) ParseUnpaused(log types.Log) (*EmissionsControllerStorageUnpaused, error)
````

## File: pkg/bindings/Endian/binding.go
````go
// Code generated - DO NOT EDIT.
// This file is a generated binding and any manual changes will be lost.
⋮----
package Endian
⋮----
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"
)
⋮----
"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
)
⋮----
// EndianMetaData contains all meta data concerning the Endian contract.
var EndianMetaData = &bind.MetaData{
	ABI: "[]",
	Bin: "0x60556032600b8282823980515f1a607314602657634e487b7160e01b5f525f60045260245ffd5b305f52607381538281f3fe730000000000000000000000000000000000000000301460806040525f5ffdfea2646970667358221220051f2f2cfe7637c2a91f4d75a624d465f9fa6cfa992affcd162612671bf57f9764736f6c634300081e0033",
}
⋮----
// EndianABI is the input ABI used to generate the binding from.
// Deprecated: Use EndianMetaData.ABI instead.
var EndianABI = EndianMetaData.ABI
⋮----
// EndianBin is the compiled bytecode used for deploying new contracts.
// Deprecated: Use EndianMetaData.Bin instead.
var EndianBin = EndianMetaData.Bin
⋮----
// DeployEndian deploys a new Ethereum contract, binding an instance of Endian to it.
func DeployEndian(auth *bind.TransactOpts, backend bind.ContractBackend) (common.Address, *types.Transaction, *Endian, error)
⋮----
// Endian is an auto generated Go binding around an Ethereum contract.
type Endian struct {
	EndianCaller     // Read-only binding to the contract
	EndianTransactor // Write-only binding to the contract
	EndianFilterer   // Log filterer for contract events
}
⋮----
EndianCaller     // Read-only binding to the contract
EndianTransactor // Write-only binding to the contract
EndianFilterer   // Log filterer for contract events
⋮----
// EndianCaller is an auto generated read-only Go binding around an Ethereum contract.
type EndianCaller struct {
	contract *bind.BoundContract // Generic contract wrapper for the low level calls
}
⋮----
contract *bind.BoundContract // Generic contract wrapper for the low level calls
⋮----
// EndianTransactor is an auto generated write-only Go binding around an Ethereum contract.
type EndianTransactor struct {
	contract *bind.BoundContract // Generic contract wrapper for the low level calls
}
⋮----
// EndianFilterer is an auto generated log filtering Go binding around an Ethereum contract events.
type EndianFilterer struct {
	contract *bind.BoundContract // Generic contract wrapper for the low level calls
}
⋮----
// EndianSession is an auto generated Go binding around an Ethereum contract,
// with pre-set call and transact options.
type EndianSession struct {
	Contract     *Endian           // 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
}
⋮----
Contract     *Endian           // 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
⋮----
// EndianCallerSession is an auto generated read-only Go binding around an Ethereum contract,
// with pre-set call options.
type EndianCallerSession struct {
	Contract *EndianCaller // Generic contract caller binding to set the session for
	CallOpts bind.CallOpts // Call options to use throughout this session
}
⋮----
Contract *EndianCaller // Generic contract caller binding to set the session for
CallOpts bind.CallOpts // Call options to use throughout this session
⋮----
// EndianTransactorSession is an auto generated write-only Go binding around an Ethereum contract,
// with pre-set transact options.
type EndianTransactorSession struct {
	Contract     *EndianTransactor // Generic contract transactor binding to set the session for
	TransactOpts bind.TransactOpts // Transaction auth options to use throughout this session
}
⋮----
Contract     *EndianTransactor // Generic contract transactor binding to set the session for
⋮----
// EndianRaw is an auto generated low-level Go binding around an Ethereum contract.
type EndianRaw struct {
	Contract *Endian // Generic contract binding to access the raw methods on
}
⋮----
Contract *Endian // Generic contract binding to access the raw methods on
⋮----
// EndianCallerRaw is an auto generated low-level read-only Go binding around an Ethereum contract.
type EndianCallerRaw struct {
	Contract *EndianCaller // Generic read-only contract binding to access the raw methods on
}
⋮----
Contract *EndianCaller // Generic read-only contract binding to access the raw methods on
⋮----
// EndianTransactorRaw is an auto generated low-level write-only Go binding around an Ethereum contract.
type EndianTransactorRaw struct {
	Contract *EndianTransactor // Generic write-only contract binding to access the raw methods on
}
⋮----
Contract *EndianTransactor // Generic write-only contract binding to access the raw methods on
⋮----
// NewEndian creates a new instance of Endian, bound to a specific deployed contract.
func NewEndian(address common.Address, backend bind.ContractBackend) (*Endian, error)
⋮----
// NewEndianCaller creates a new read-only instance of Endian, bound to a specific deployed contract.
func NewEndianCaller(address common.Address, caller bind.ContractCaller) (*EndianCaller, error)
⋮----
// NewEndianTransactor creates a new write-only instance of Endian, bound to a specific deployed contract.
func NewEndianTransactor(address common.Address, transactor bind.ContractTransactor) (*EndianTransactor, error)
⋮----
// NewEndianFilterer creates a new log filterer instance of Endian, bound to a specific deployed contract.
func NewEndianFilterer(address common.Address, filterer bind.ContractFilterer) (*EndianFilterer, error)
⋮----
// bindEndian binds a generic wrapper to an already deployed contract.
func bindEndian(address common.Address, caller bind.ContractCaller, transactor bind.ContractTransactor, filterer bind.ContractFilterer) (*bind.BoundContract, error)
⋮----
// 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 (_Endian *EndianRaw) Call(opts *bind.CallOpts, result *[]interface
⋮----
// Transfer initiates a plain transaction to move funds to the contract, calling
// its default method if one is available.
func (_Endian *EndianRaw) Transfer(opts *bind.TransactOpts) (*types.Transaction, error)
⋮----
// Transact invokes the (paid) contract method with params as input values.
func (_Endian *EndianRaw) Transact(opts *bind.TransactOpts, method string, params ...interface
````

## File: pkg/bindings/IAllocationManager/binding.go
````go
// Code generated - DO NOT EDIT.
// This file is a generated binding and any manual changes will be lost.
⋮----
package IAllocationManager
⋮----
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"
)
⋮----
"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
)
⋮----
// IAllocationManagerTypesAllocateParams is an auto generated low-level Go binding around an user-defined struct.
type IAllocationManagerTypesAllocateParams struct {
	OperatorSet   OperatorSet
	Strategies    []common.Address
	NewMagnitudes []uint64
}
⋮----
// IAllocationManagerTypesAllocation is an auto generated low-level Go binding around an user-defined struct.
type IAllocationManagerTypesAllocation struct {
	CurrentMagnitude uint64
	PendingDiff      *big.Int
	EffectBlock      uint32
}
⋮----
// IAllocationManagerTypesCreateSetParams is an auto generated low-level Go binding around an user-defined struct.
type IAllocationManagerTypesCreateSetParams struct {
	OperatorSetId uint32
	Strategies    []common.Address
}
⋮----
// IAllocationManagerTypesCreateSetParamsV2 is an auto generated low-level Go binding around an user-defined struct.
type IAllocationManagerTypesCreateSetParamsV2 struct {
	OperatorSetId uint32
	Strategies    []common.Address
	Slasher       common.Address
}
⋮----
// IAllocationManagerTypesDeregisterParams is an auto generated low-level Go binding around an user-defined struct.
type IAllocationManagerTypesDeregisterParams struct {
	Operator       common.Address
	Avs            common.Address
	OperatorSetIds []uint32
}
⋮----
// IAllocationManagerTypesRegisterParams is an auto generated low-level Go binding around an user-defined struct.
type IAllocationManagerTypesRegisterParams struct {
	Avs            common.Address
	OperatorSetIds []uint32
	Data           []byte
}
⋮----
// IAllocationManagerTypesSlashingParams is an auto generated low-level Go binding around an user-defined struct.
type IAllocationManagerTypesSlashingParams struct {
	Operator      common.Address
	OperatorSetId uint32
	Strategies    []common.Address
	WadsToSlash   []*big.Int
	Description   string
}
⋮----
// OperatorSet is an auto generated low-level Go binding around an user-defined struct.
type OperatorSet struct {
	Avs common.Address
	Id  uint32
}
⋮----
// IAllocationManagerMetaData contains all meta data concerning the IAllocationManager contract.
var IAllocationManagerMetaData = &bind.MetaData{
	ABI: "[{\"type\":\"function\",\"name\":\"ALLOCATION_CONFIGURATION_DELAY\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"DEALLOCATION_DELAY\",\"inputs\":[],\"outputs\":[{\"name\":\"delay\",\"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\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"strategy\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getAllocatedSets\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"tuple[]\",\"internalType\":\"structOperatorSet[]\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getAllocatedStake\",\"inputs\":[{\"name\":\"operatorSet\",\"type\":\"tuple\",\"internalType\":\"structOperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]},{\"name\":\"operators\",\"type\":\"address[]\",\"internalType\":\"address[]\"},{\"name\":\"strategies\",\"type\":\"address[]\",\"internalType\":\"contractIStrategy[]\"}],\"outputs\":[{\"name\":\"slashableStake\",\"type\":\"uint256[][]\",\"internalType\":\"uint256[][]\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getAllocatedStrategies\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"operatorSet\",\"type\":\"tuple\",\"internalType\":\"structOperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]}],\"outputs\":[{\"name\":\"\",\"type\":\"address[]\",\"internalType\":\"contractIStrategy[]\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getAllocation\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"operatorSet\",\"type\":\"tuple\",\"internalType\":\"structOperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]},{\"name\":\"strategy\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"}],\"outputs\":[{\"name\":\"\",\"type\":\"tuple\",\"internalType\":\"structIAllocationManagerTypes.Allocation\",\"components\":[{\"name\":\"currentMagnitude\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"pendingDiff\",\"type\":\"int128\",\"internalType\":\"int128\"},{\"name\":\"effectBlock\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getAllocationDelay\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"isSet\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"delay\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getAllocations\",\"inputs\":[{\"name\":\"operators\",\"type\":\"address[]\",\"internalType\":\"address[]\"},{\"name\":\"operatorSet\",\"type\":\"tuple\",\"internalType\":\"structOperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]},{\"name\":\"strategy\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"}],\"outputs\":[{\"name\":\"\",\"type\":\"tuple[]\",\"internalType\":\"structIAllocationManagerTypes.Allocation[]\",\"components\":[{\"name\":\"currentMagnitude\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"pendingDiff\",\"type\":\"int128\",\"internalType\":\"int128\"},{\"name\":\"effectBlock\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getEncumberedMagnitude\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"strategy\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getMaxMagnitude\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"strategy\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getMaxMagnitudes\",\"inputs\":[{\"name\":\"operators\",\"type\":\"address[]\",\"internalType\":\"address[]\"},{\"name\":\"strategy\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint64[]\",\"internalType\":\"uint64[]\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getMaxMagnitudes\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"strategies\",\"type\":\"address[]\",\"internalType\":\"contractIStrategy[]\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint64[]\",\"internalType\":\"uint64[]\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getMaxMagnitudesAtBlock\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"strategies\",\"type\":\"address[]\",\"internalType\":\"contractIStrategy[]\"},{\"name\":\"blockNumber\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint64[]\",\"internalType\":\"uint64[]\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getMemberCount\",\"inputs\":[{\"name\":\"operatorSet\",\"type\":\"tuple\",\"internalType\":\"structOperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getMembers\",\"inputs\":[{\"name\":\"operatorSet\",\"type\":\"tuple\",\"internalType\":\"structOperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]}],\"outputs\":[{\"name\":\"operators\",\"type\":\"address[]\",\"internalType\":\"address[]\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getMinimumSlashableStake\",\"inputs\":[{\"name\":\"operatorSet\",\"type\":\"tuple\",\"internalType\":\"structOperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]},{\"name\":\"operators\",\"type\":\"address[]\",\"internalType\":\"address[]\"},{\"name\":\"strategies\",\"type\":\"address[]\",\"internalType\":\"contractIStrategy[]\"},{\"name\":\"futureBlock\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"outputs\":[{\"name\":\"slashableStake\",\"type\":\"uint256[][]\",\"internalType\":\"uint256[][]\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getOperatorSetCount\",\"inputs\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getPendingSlasher\",\"inputs\":[{\"name\":\"operatorSet\",\"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\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"operatorSets\",\"type\":\"tuple[]\",\"internalType\":\"structOperatorSet[]\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getSlashCount\",\"inputs\":[{\"name\":\"operatorSet\",\"type\":\"tuple\",\"internalType\":\"structOperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"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\":\"strategies\",\"type\":\"address[]\",\"internalType\":\"contractIStrategy[]\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getStrategyAllocations\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"strategy\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"}],\"outputs\":[{\"name\":\"\",\"type\":\"tuple[]\",\"internalType\":\"structOperatorSet[]\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]},{\"name\":\"\",\"type\":\"tuple[]\",\"internalType\":\"structIAllocationManagerTypes.Allocation[]\",\"components\":[{\"name\":\"currentMagnitude\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"pendingDiff\",\"type\":\"int128\",\"internalType\":\"int128\"},{\"name\":\"effectBlock\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"initialize\",\"inputs\":[{\"name\":\"initialPausedStatus\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"isMemberOfOperatorSet\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"operatorSet\",\"type\":\"tuple\",\"internalType\":\"structOperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"isOperatorRedistributable\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"isOperatorSet\",\"inputs\":[{\"name\":\"operatorSet\",\"type\":\"tuple\",\"internalType\":\"structOperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"isOperatorSlashable\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"operatorSet\",\"type\":\"tuple\",\"internalType\":\"structOperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"isRedistributingOperatorSet\",\"inputs\":[{\"name\":\"operatorSet\",\"type\":\"tuple\",\"internalType\":\"structOperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"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\":\"registerForOperatorSets\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"params\",\"type\":\"tuple\",\"internalType\":\"structIAllocationManagerTypes.RegisterParams\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"operatorSetIds\",\"type\":\"uint32[]\",\"internalType\":\"uint32[]\"},{\"name\":\"data\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"removeStrategiesFromOperatorSet\",\"inputs\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"operatorSetId\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"strategies\",\"type\":\"address[]\",\"internalType\":\"contractIStrategy[]\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"setAVSRegistrar\",\"inputs\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"registrar\",\"type\":\"address\",\"internalType\":\"contractIAVSRegistrar\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"setAllocationDelay\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"delay\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"slashOperator\",\"inputs\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"params\",\"type\":\"tuple\",\"internalType\":\"structIAllocationManagerTypes.SlashingParams\",\"components\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"operatorSetId\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"strategies\",\"type\":\"address[]\",\"internalType\":\"contractIStrategy[]\"},{\"name\":\"wadsToSlash\",\"type\":\"uint256[]\",\"internalType\":\"uint256[]\"},{\"name\":\"description\",\"type\":\"string\",\"internalType\":\"string\"}]}],\"outputs\":[{\"name\":\"slashId\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"shares\",\"type\":\"uint256[]\",\"internalType\":\"uint256[]\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"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\":\"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\":\"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\":\"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\":\"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\":\"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\":[]}]",
}
⋮----
// IAllocationManagerABI is the input ABI used to generate the binding from.
// Deprecated: Use IAllocationManagerMetaData.ABI instead.
var IAllocationManagerABI = IAllocationManagerMetaData.ABI
⋮----
// IAllocationManager is an auto generated Go binding around an Ethereum contract.
type IAllocationManager struct {
	IAllocationManagerCaller     // Read-only binding to the contract
	IAllocationManagerTransactor // Write-only binding to the contract
	IAllocationManagerFilterer   // Log filterer for contract events
}
⋮----
IAllocationManagerCaller     // Read-only binding to the contract
IAllocationManagerTransactor // Write-only binding to the contract
IAllocationManagerFilterer   // Log filterer for contract events
⋮----
// IAllocationManagerCaller is an auto generated read-only Go binding around an Ethereum contract.
type IAllocationManagerCaller struct {
	contract *bind.BoundContract // Generic contract wrapper for the low level calls
}
⋮----
contract *bind.BoundContract // Generic contract wrapper for the low level calls
⋮----
// IAllocationManagerTransactor is an auto generated write-only Go binding around an Ethereum contract.
type IAllocationManagerTransactor struct {
	contract *bind.BoundContract // Generic contract wrapper for the low level calls
}
⋮----
// IAllocationManagerFilterer is an auto generated log filtering Go binding around an Ethereum contract events.
type IAllocationManagerFilterer struct {
	contract *bind.BoundContract // Generic contract wrapper for the low level calls
}
⋮----
// IAllocationManagerSession is an auto generated Go binding around an Ethereum contract,
// with pre-set call and transact options.
type IAllocationManagerSession struct {
	Contract     *IAllocationManager // 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
}
⋮----
Contract     *IAllocationManager // 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
⋮----
// IAllocationManagerCallerSession is an auto generated read-only Go binding around an Ethereum contract,
// with pre-set call options.
type IAllocationManagerCallerSession struct {
	Contract *IAllocationManagerCaller // Generic contract caller binding to set the session for
	CallOpts bind.CallOpts             // Call options to use throughout this session
}
⋮----
Contract *IAllocationManagerCaller // Generic contract caller binding to set the session for
CallOpts bind.CallOpts             // Call options to use throughout this session
⋮----
// IAllocationManagerTransactorSession is an auto generated write-only Go binding around an Ethereum contract,
// with pre-set transact options.
type IAllocationManagerTransactorSession struct {
	Contract     *IAllocationManagerTransactor // Generic contract transactor binding to set the session for
	TransactOpts bind.TransactOpts             // Transaction auth options to use throughout this session
}
⋮----
Contract     *IAllocationManagerTransactor // Generic contract transactor binding to set the session for
TransactOpts bind.TransactOpts             // Transaction auth options to use throughout this session
⋮----
// IAllocationManagerRaw is an auto generated low-level Go binding around an Ethereum contract.
type IAllocationManagerRaw struct {
	Contract *IAllocationManager // Generic contract binding to access the raw methods on
}
⋮----
Contract *IAllocationManager // Generic contract binding to access the raw methods on
⋮----
// IAllocationManagerCallerRaw is an auto generated low-level read-only Go binding around an Ethereum contract.
type IAllocationManagerCallerRaw struct {
	Contract *IAllocationManagerCaller // Generic read-only contract binding to access the raw methods on
}
⋮----
Contract *IAllocationManagerCaller // Generic read-only contract binding to access the raw methods on
⋮----
// IAllocationManagerTransactorRaw is an auto generated low-level write-only Go binding around an Ethereum contract.
type IAllocationManagerTransactorRaw struct {
	Contract *IAllocationManagerTransactor // Generic write-only contract binding to access the raw methods on
}
⋮----
Contract *IAllocationManagerTransactor // Generic write-only contract binding to access the raw methods on
⋮----
// NewIAllocationManager creates a new instance of IAllocationManager, bound to a specific deployed contract.
func NewIAllocationManager(address common.Address, backend bind.ContractBackend) (*IAllocationManager, error)
⋮----
// NewIAllocationManagerCaller creates a new read-only instance of IAllocationManager, bound to a specific deployed contract.
func NewIAllocationManagerCaller(address common.Address, caller bind.ContractCaller) (*IAllocationManagerCaller, error)
⋮----
// NewIAllocationManagerTransactor creates a new write-only instance of IAllocationManager, bound to a specific deployed contract.
func NewIAllocationManagerTransactor(address common.Address, transactor bind.ContractTransactor) (*IAllocationManagerTransactor, error)
⋮----
// NewIAllocationManagerFilterer creates a new log filterer instance of IAllocationManager, bound to a specific deployed contract.
func NewIAllocationManagerFilterer(address common.Address, filterer bind.ContractFilterer) (*IAllocationManagerFilterer, error)
⋮----
// bindIAllocationManager binds a generic wrapper to an already deployed contract.
func bindIAllocationManager(address common.Address, caller bind.ContractCaller, transactor bind.ContractTransactor, filterer bind.ContractFilterer) (*bind.BoundContract, error)
⋮----
// 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 (_IAllocationManager *IAllocationManagerRaw) Call(opts *bind.CallOpts, result *[]interface
⋮----
// Transfer initiates a plain transaction to move funds to the contract, calling
// its default method if one is available.
func (_IAllocationManager *IAllocationManagerRaw) Transfer(opts *bind.TransactOpts) (*types.Transaction, error)
⋮----
// Transact invokes the (paid) contract method with params as input values.
func (_IAllocationManager *IAllocationManagerRaw) Transact(opts *bind.TransactOpts, method string, params ...interface
⋮----
// ALLOCATIONCONFIGURATIONDELAY is a free data retrieval call binding the contract method 0x7bc1ef61.
//
// Solidity: function ALLOCATION_CONFIGURATION_DELAY() view returns(uint32)
func (_IAllocationManager *IAllocationManagerCaller) ALLOCATIONCONFIGURATIONDELAY(opts *bind.CallOpts) (uint32, error)
⋮----
var out []interface{}
⋮----
// DEALLOCATIONDELAY is a free data retrieval call binding the contract method 0x2981eb77.
⋮----
// Solidity: function DEALLOCATION_DELAY() view returns(uint32 delay)
func (_IAllocationManager *IAllocationManagerCaller) DEALLOCATIONDELAY(opts *bind.CallOpts) (uint32, error)
⋮----
// SLASHERCONFIGURATIONDELAY is a free data retrieval call binding the contract method 0x67aeaa53.
⋮----
// Solidity: function SLASHER_CONFIGURATION_DELAY() view returns(uint32)
func (_IAllocationManager *IAllocationManagerCaller) SLASHERCONFIGURATIONDELAY(opts *bind.CallOpts) (uint32, error)
⋮----
// Delegation is a free data retrieval call binding the contract method 0xdf5cf723.
⋮----
// Solidity: function delegation() view returns(address)
func (_IAllocationManager *IAllocationManagerCaller) Delegation(opts *bind.CallOpts) (common.Address, error)
⋮----
// EigenStrategy is a free data retrieval call binding the contract method 0xdb4df761.
⋮----
// Solidity: function eigenStrategy() view returns(address)
func (_IAllocationManager *IAllocationManagerCaller) EigenStrategy(opts *bind.CallOpts) (common.Address, error)
⋮----
// GetAVSRegistrar is a free data retrieval call binding the contract method 0x304c10cd.
⋮----
// Solidity: function getAVSRegistrar(address avs) view returns(address)
func (_IAllocationManager *IAllocationManagerCaller) GetAVSRegistrar(opts *bind.CallOpts, avs common.Address) (common.Address, error)
⋮----
// GetAllocatableMagnitude is a free data retrieval call binding the contract method 0x6cfb4481.
⋮----
// Solidity: function getAllocatableMagnitude(address operator, address strategy) view returns(uint64)
func (_IAllocationManager *IAllocationManagerCaller) GetAllocatableMagnitude(opts *bind.CallOpts, operator common.Address, strategy common.Address) (uint64, error)
⋮----
// GetAllocatedSets is a free data retrieval call binding the contract method 0x15fe5028.
⋮----
// Solidity: function getAllocatedSets(address operator) view returns((address,uint32)[])
func (_IAllocationManager *IAllocationManagerCaller) GetAllocatedSets(opts *bind.CallOpts, operator common.Address) ([]OperatorSet, error)
⋮----
// GetAllocatedStake is a free data retrieval call binding the contract method 0x2b453a9a.
⋮----
// Solidity: function getAllocatedStake((address,uint32) operatorSet, address[] operators, address[] strategies) view returns(uint256[][] slashableStake)
func (_IAllocationManager *IAllocationManagerCaller) GetAllocatedStake(opts *bind.CallOpts, operatorSet OperatorSet, operators []common.Address, strategies []common.Address) ([][]*big.Int, error)
⋮----
// GetAllocatedStrategies is a free data retrieval call binding the contract method 0xc221d8ae.
⋮----
// Solidity: function getAllocatedStrategies(address operator, (address,uint32) operatorSet) view returns(address[])
func (_IAllocationManager *IAllocationManagerCaller) GetAllocatedStrategies(opts *bind.CallOpts, operator common.Address, operatorSet OperatorSet) ([]common.Address, error)
⋮----
// GetAllocation is a free data retrieval call binding the contract method 0x10e1b9b8.
⋮----
// Solidity: function getAllocation(address operator, (address,uint32) operatorSet, address strategy) view returns((uint64,int128,uint32))
func (_IAllocationManager *IAllocationManagerCaller) GetAllocation(opts *bind.CallOpts, operator common.Address, operatorSet OperatorSet, strategy common.Address) (IAllocationManagerTypesAllocation, error)
⋮----
// GetAllocationDelay is a free data retrieval call binding the contract method 0xb9fbaed1.
⋮----
// Solidity: function getAllocationDelay(address operator) view returns(bool isSet, uint32 delay)
func (_IAllocationManager *IAllocationManagerCaller) GetAllocationDelay(opts *bind.CallOpts, operator common.Address) (struct
⋮----
// GetAllocations is a free data retrieval call binding the contract method 0x8ce64854.
⋮----
// Solidity: function getAllocations(address[] operators, (address,uint32) operatorSet, address strategy) view returns((uint64,int128,uint32)[])
func (_IAllocationManager *IAllocationManagerCaller) GetAllocations(opts *bind.CallOpts, operators []common.Address, operatorSet OperatorSet, strategy common.Address) ([]IAllocationManagerTypesAllocation, error)
⋮----
// GetEncumberedMagnitude is a free data retrieval call binding the contract method 0xf605ce08.
⋮----
// Solidity: function getEncumberedMagnitude(address operator, address strategy) view returns(uint64)
func (_IAllocationManager *IAllocationManagerCaller) GetEncumberedMagnitude(opts *bind.CallOpts, operator common.Address, strategy common.Address) (uint64, error)
⋮----
// GetMaxMagnitude is a free data retrieval call binding the contract method 0xa9333ec8.
⋮----
// Solidity: function getMaxMagnitude(address operator, address strategy) view returns(uint64)
func (_IAllocationManager *IAllocationManagerCaller) GetMaxMagnitude(opts *bind.CallOpts, operator common.Address, strategy common.Address) (uint64, error)
⋮----
// GetMaxMagnitudes is a free data retrieval call binding the contract method 0x4a10ffe5.
⋮----
// Solidity: function getMaxMagnitudes(address[] operators, address strategy) view returns(uint64[])
func (_IAllocationManager *IAllocationManagerCaller) GetMaxMagnitudes(opts *bind.CallOpts, operators []common.Address, strategy common.Address) ([]uint64, error)
⋮----
// GetMaxMagnitudes0 is a free data retrieval call binding the contract method 0x547afb87.
⋮----
// Solidity: function getMaxMagnitudes(address operator, address[] strategies) view returns(uint64[])
func (_IAllocationManager *IAllocationManagerCaller) GetMaxMagnitudes0(opts *bind.CallOpts, operator common.Address, strategies []common.Address) ([]uint64, error)
⋮----
// GetMaxMagnitudesAtBlock is a free data retrieval call binding the contract method 0x94d7d00c.
⋮----
// Solidity: function getMaxMagnitudesAtBlock(address operator, address[] strategies, uint32 blockNumber) view returns(uint64[])
func (_IAllocationManager *IAllocationManagerCaller) GetMaxMagnitudesAtBlock(opts *bind.CallOpts, operator common.Address, strategies []common.Address, blockNumber uint32) ([]uint64, error)
⋮----
// GetMemberCount is a free data retrieval call binding the contract method 0xb2447af7.
⋮----
// Solidity: function getMemberCount((address,uint32) operatorSet) view returns(uint256)
func (_IAllocationManager *IAllocationManagerCaller) GetMemberCount(opts *bind.CallOpts, operatorSet OperatorSet) (*big.Int, error)
⋮----
// GetMembers is a free data retrieval call binding the contract method 0x6e875dba.
⋮----
// Solidity: function getMembers((address,uint32) operatorSet) view returns(address[] operators)
func (_IAllocationManager *IAllocationManagerCaller) GetMembers(opts *bind.CallOpts, operatorSet OperatorSet) ([]common.Address, error)
⋮----
// GetMinimumSlashableStake is a free data retrieval call binding the contract method 0x2bab2c4a.
⋮----
// Solidity: function getMinimumSlashableStake((address,uint32) operatorSet, address[] operators, address[] strategies, uint32 futureBlock) view returns(uint256[][] slashableStake)
func (_IAllocationManager *IAllocationManagerCaller) GetMinimumSlashableStake(opts *bind.CallOpts, operatorSet OperatorSet, operators []common.Address, strategies []common.Address, futureBlock uint32) ([][]*big.Int, error)
⋮----
// GetOperatorSetCount is a free data retrieval call binding the contract method 0xba1a84e5.
⋮----
// Solidity: function getOperatorSetCount(address avs) view returns(uint256)
func (_IAllocationManager *IAllocationManagerCaller) GetOperatorSetCount(opts *bind.CallOpts, avs common.Address) (*big.Int, error)
⋮----
// GetPendingSlasher is a free data retrieval call binding the contract method 0xd7794857.
⋮----
// Solidity: function getPendingSlasher((address,uint32) operatorSet) view returns(address pendingSlasher, uint32 effectBlock)
func (_IAllocationManager *IAllocationManagerCaller) GetPendingSlasher(opts *bind.CallOpts, operatorSet OperatorSet) (struct
⋮----
// GetRedistributionRecipient is a free data retrieval call binding the contract method 0x0f3df50e.
⋮----
// Solidity: function getRedistributionRecipient((address,uint32) operatorSet) view returns(address)
func (_IAllocationManager *IAllocationManagerCaller) GetRedistributionRecipient(opts *bind.CallOpts, operatorSet OperatorSet) (common.Address, error)
⋮----
// GetRegisteredSets is a free data retrieval call binding the contract method 0x79ae50cd.
⋮----
// Solidity: function getRegisteredSets(address operator) view returns((address,uint32)[] operatorSets)
func (_IAllocationManager *IAllocationManagerCaller) GetRegisteredSets(opts *bind.CallOpts, operator common.Address) ([]OperatorSet, error)
⋮----
// GetSlashCount is a free data retrieval call binding the contract method 0x4cfd2939.
⋮----
// Solidity: function getSlashCount((address,uint32) operatorSet) view returns(uint256)
func (_IAllocationManager *IAllocationManagerCaller) GetSlashCount(opts *bind.CallOpts, operatorSet OperatorSet) (*big.Int, error)
⋮----
// GetSlasher is a free data retrieval call binding the contract method 0xd4a3fcce.
⋮----
// Solidity: function getSlasher((address,uint32) operatorSet) view returns(address)
func (_IAllocationManager *IAllocationManagerCaller) GetSlasher(opts *bind.CallOpts, operatorSet OperatorSet) (common.Address, error)
⋮----
// GetStrategiesInOperatorSet is a free data retrieval call binding the contract method 0x4177a87c.
⋮----
// Solidity: function getStrategiesInOperatorSet((address,uint32) operatorSet) view returns(address[] strategies)
func (_IAllocationManager *IAllocationManagerCaller) GetStrategiesInOperatorSet(opts *bind.CallOpts, operatorSet OperatorSet) ([]common.Address, error)
⋮----
// GetStrategyAllocations is a free data retrieval call binding the contract method 0x40120dab.
⋮----
// Solidity: function getStrategyAllocations(address operator, address strategy) view returns((address,uint32)[], (uint64,int128,uint32)[])
func (_IAllocationManager *IAllocationManagerCaller) GetStrategyAllocations(opts *bind.CallOpts, operator common.Address, strategy common.Address) ([]OperatorSet, []IAllocationManagerTypesAllocation, error)
⋮----
// IsMemberOfOperatorSet is a free data retrieval call binding the contract method 0x670d3ba2.
⋮----
// Solidity: function isMemberOfOperatorSet(address operator, (address,uint32) operatorSet) view returns(bool)
func (_IAllocationManager *IAllocationManagerCaller) IsMemberOfOperatorSet(opts *bind.CallOpts, operator common.Address, operatorSet OperatorSet) (bool, error)
⋮----
// IsOperatorRedistributable is a free data retrieval call binding the contract method 0xdc2af692.
⋮----
// Solidity: function isOperatorRedistributable(address operator) view returns(bool)
func (_IAllocationManager *IAllocationManagerCaller) IsOperatorRedistributable(opts *bind.CallOpts, operator common.Address) (bool, error)
⋮----
// IsOperatorSet is a free data retrieval call binding the contract method 0x260dc758.
⋮----
// Solidity: function isOperatorSet((address,uint32) operatorSet) view returns(bool)
func (_IAllocationManager *IAllocationManagerCaller) IsOperatorSet(opts *bind.CallOpts, operatorSet OperatorSet) (bool, error)
⋮----
// IsOperatorSlashable is a free data retrieval call binding the contract method 0x1352c3e6.
⋮----
// Solidity: function isOperatorSlashable(address operator, (address,uint32) operatorSet) view returns(bool)
func (_IAllocationManager *IAllocationManagerCaller) IsOperatorSlashable(opts *bind.CallOpts, operator common.Address, operatorSet OperatorSet) (bool, error)
⋮----
// IsRedistributingOperatorSet is a free data retrieval call binding the contract method 0xf231bd08.
⋮----
// Solidity: function isRedistributingOperatorSet((address,uint32) operatorSet) view returns(bool)
func (_IAllocationManager *IAllocationManagerCaller) IsRedistributingOperatorSet(opts *bind.CallOpts, operatorSet OperatorSet) (bool, error)
⋮----
// Paused is a free data retrieval call binding the contract method 0x5ac86ab7.
⋮----
// Solidity: function paused(uint8 index) view returns(bool)
func (_IAllocationManager *IAllocationManagerCaller) Paused(opts *bind.CallOpts, index uint8) (bool, error)
⋮----
// Paused0 is a free data retrieval call binding the contract method 0x5c975abb.
⋮----
// Solidity: function paused() view returns(uint256)
func (_IAllocationManager *IAllocationManagerCaller) Paused0(opts *bind.CallOpts) (*big.Int, error)
⋮----
// PauserRegistry is a free data retrieval call binding the contract method 0x886f1195.
⋮----
// Solidity: function pauserRegistry() view returns(address)
func (_IAllocationManager *IAllocationManagerCaller) PauserRegistry(opts *bind.CallOpts) (common.Address, error)
⋮----
// AddStrategiesToOperatorSet is a paid mutator transaction binding the contract method 0x50feea20.
⋮----
// Solidity: function addStrategiesToOperatorSet(address avs, uint32 operatorSetId, address[] strategies) returns()
func (_IAllocationManager *IAllocationManagerTransactor) AddStrategiesToOperatorSet(opts *bind.TransactOpts, avs common.Address, operatorSetId uint32, strategies []common.Address) (*types.Transaction, error)
⋮----
// ClearDeallocationQueue is a paid mutator transaction binding the contract method 0x4b5046ef.
⋮----
// Solidity: function clearDeallocationQueue(address operator, address[] strategies, uint16[] numToClear) returns()
func (_IAllocationManager *IAllocationManagerTransactor) ClearDeallocationQueue(opts *bind.TransactOpts, operator common.Address, strategies []common.Address, numToClear []uint16) (*types.Transaction, error)
⋮----
// CreateOperatorSets is a paid mutator transaction binding the contract method 0x261f84e0.
⋮----
// Solidity: function createOperatorSets(address avs, (uint32,address[])[] params) returns()
func (_IAllocationManager *IAllocationManagerTransactor) CreateOperatorSets(opts *bind.TransactOpts, avs common.Address, params []IAllocationManagerTypesCreateSetParams) (*types.Transaction, error)
⋮----
// CreateOperatorSets0 is a paid mutator transaction binding the contract method 0x3dff8e7d.
⋮----
// Solidity: function createOperatorSets(address avs, (uint32,address[],address)[] params) returns()
func (_IAllocationManager *IAllocationManagerTransactor) CreateOperatorSets0(opts *bind.TransactOpts, avs common.Address, params []IAllocationManagerTypesCreateSetParamsV2) (*types.Transaction, error)
⋮----
// CreateRedistributingOperatorSets is a paid mutator transaction binding the contract method 0x32a879e4.
⋮----
// Solidity: function createRedistributingOperatorSets(address avs, (uint32,address[])[] params, address[] redistributionRecipients) returns()
func (_IAllocationManager *IAllocationManagerTransactor) CreateRedistributingOperatorSets(opts *bind.TransactOpts, avs common.Address, params []IAllocationManagerTypesCreateSetParams, redistributionRecipients []common.Address) (*types.Transaction, error)
⋮----
// CreateRedistributingOperatorSets0 is a paid mutator transaction binding the contract method 0xd1a83f54.
⋮----
// Solidity: function createRedistributingOperatorSets(address avs, (uint32,address[],address)[] params, address[] redistributionRecipients) returns()
func (_IAllocationManager *IAllocationManagerTransactor) CreateRedistributingOperatorSets0(opts *bind.TransactOpts, avs common.Address, params []IAllocationManagerTypesCreateSetParamsV2, redistributionRecipients []common.Address) (*types.Transaction, error)
⋮----
// DeregisterFromOperatorSets is a paid mutator transaction binding the contract method 0x6e3492b5.
⋮----
// Solidity: function deregisterFromOperatorSets((address,address,uint32[]) params) returns()
func (_IAllocationManager *IAllocationManagerTransactor) DeregisterFromOperatorSets(opts *bind.TransactOpts, params IAllocationManagerTypesDeregisterParams) (*types.Transaction, error)
⋮----
// Initialize is a paid mutator transaction binding the contract method 0xfe4b84df.
⋮----
// Solidity: function initialize(uint256 initialPausedStatus) returns()
func (_IAllocationManager *IAllocationManagerTransactor) Initialize(opts *bind.TransactOpts, initialPausedStatus *big.Int) (*types.Transaction, error)
⋮----
// MigrateSlashers is a paid mutator transaction binding the contract method 0x957dc50b.
⋮----
// Solidity: function migrateSlashers((address,uint32)[] operatorSets) returns()
func (_IAllocationManager *IAllocationManagerTransactor) MigrateSlashers(opts *bind.TransactOpts, operatorSets []OperatorSet) (*types.Transaction, error)
⋮----
// ModifyAllocations is a paid mutator transaction binding the contract method 0x952899ee.
⋮----
// Solidity: function modifyAllocations(address operator, ((address,uint32),address[],uint64[])[] params) returns()
func (_IAllocationManager *IAllocationManagerTransactor) ModifyAllocations(opts *bind.TransactOpts, operator common.Address, params []IAllocationManagerTypesAllocateParams) (*types.Transaction, error)
⋮----
// Pause is a paid mutator transaction binding the contract method 0x136439dd.
⋮----
// Solidity: function pause(uint256 newPausedStatus) returns()
func (_IAllocationManager *IAllocationManagerTransactor) Pause(opts *bind.TransactOpts, newPausedStatus *big.Int) (*types.Transaction, error)
⋮----
// PauseAll is a paid mutator transaction binding the contract method 0x595c6a67.
⋮----
// Solidity: function pauseAll() returns()
func (_IAllocationManager *IAllocationManagerTransactor) PauseAll(opts *bind.TransactOpts) (*types.Transaction, error)
⋮----
// RegisterForOperatorSets is a paid mutator transaction binding the contract method 0xadc2e3d9.
⋮----
// Solidity: function registerForOperatorSets(address operator, (address,uint32[],bytes) params) returns()
func (_IAllocationManager *IAllocationManagerTransactor) RegisterForOperatorSets(opts *bind.TransactOpts, operator common.Address, params IAllocationManagerTypesRegisterParams) (*types.Transaction, error)
⋮----
// RemoveStrategiesFromOperatorSet is a paid mutator transaction binding the contract method 0xb66bd989.
⋮----
// Solidity: function removeStrategiesFromOperatorSet(address avs, uint32 operatorSetId, address[] strategies) returns()
func (_IAllocationManager *IAllocationManagerTransactor) RemoveStrategiesFromOperatorSet(opts *bind.TransactOpts, avs common.Address, operatorSetId uint32, strategies []common.Address) (*types.Transaction, error)
⋮----
// SetAVSRegistrar is a paid mutator transaction binding the contract method 0xd3d96ff4.
⋮----
// Solidity: function setAVSRegistrar(address avs, address registrar) returns()
func (_IAllocationManager *IAllocationManagerTransactor) SetAVSRegistrar(opts *bind.TransactOpts, avs common.Address, registrar common.Address) (*types.Transaction, error)
⋮----
// SetAllocationDelay is a paid mutator transaction binding the contract method 0x56c483e6.
⋮----
// Solidity: function setAllocationDelay(address operator, uint32 delay) returns()
func (_IAllocationManager *IAllocationManagerTransactor) SetAllocationDelay(opts *bind.TransactOpts, operator common.Address, delay uint32) (*types.Transaction, error)
⋮----
// SlashOperator is a paid mutator transaction binding the contract method 0x36352057.
⋮----
// Solidity: function slashOperator(address avs, (address,uint32,address[],uint256[],string) params) returns(uint256 slashId, uint256[] shares)
func (_IAllocationManager *IAllocationManagerTransactor) SlashOperator(opts *bind.TransactOpts, avs common.Address, params IAllocationManagerTypesSlashingParams) (*types.Transaction, error)
⋮----
// Unpause is a paid mutator transaction binding the contract method 0xfabc1cbc.
⋮----
// Solidity: function unpause(uint256 newPausedStatus) returns()
func (_IAllocationManager *IAllocationManagerTransactor) Unpause(opts *bind.TransactOpts, newPausedStatus *big.Int) (*types.Transaction, error)
⋮----
// UpdateAVSMetadataURI is a paid mutator transaction binding the contract method 0xa9821821.
⋮----
// Solidity: function updateAVSMetadataURI(address avs, string metadataURI) returns()
func (_IAllocationManager *IAllocationManagerTransactor) UpdateAVSMetadataURI(opts *bind.TransactOpts, avs common.Address, metadataURI string) (*types.Transaction, error)
⋮----
// UpdateSlasher is a paid mutator transaction binding the contract method 0x6c9d7c58.
⋮----
// Solidity: function updateSlasher((address,uint32) operatorSet, address slasher) returns()
func (_IAllocationManager *IAllocationManagerTransactor) UpdateSlasher(opts *bind.TransactOpts, operatorSet OperatorSet, slasher common.Address) (*types.Transaction, error)
⋮----
// IAllocationManagerAVSMetadataURIUpdatedIterator is returned from FilterAVSMetadataURIUpdated and is used to iterate over the raw logs and unpacked data for AVSMetadataURIUpdated events raised by the IAllocationManager contract.
type IAllocationManagerAVSMetadataURIUpdatedIterator struct {
	Event *IAllocationManagerAVSMetadataURIUpdated // 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
}
⋮----
Event *IAllocationManagerAVSMetadataURIUpdated // 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 *IAllocationManagerAVSMetadataURIUpdatedIterator) Next() bool
⋮----
// If the iterator failed, stop iterating
⋮----
// If the iterator completed, deliver directly whatever's available
⋮----
// Iterator still in progress, wait for either a data or an error event
⋮----
// Error returns any retrieval or parsing error occurred during filtering.
func (it *IAllocationManagerAVSMetadataURIUpdatedIterator) Error() error
⋮----
// Close terminates the iteration process, releasing any pending underlying
// resources.
func (it *IAllocationManagerAVSMetadataURIUpdatedIterator) Close() error
⋮----
// IAllocationManagerAVSMetadataURIUpdated represents a AVSMetadataURIUpdated event raised by the IAllocationManager contract.
type IAllocationManagerAVSMetadataURIUpdated struct {
	Avs         common.Address
	MetadataURI string
	Raw         types.Log // Blockchain specific contextual infos
}
⋮----
Raw         types.Log // Blockchain specific contextual infos
⋮----
// FilterAVSMetadataURIUpdated is a free log retrieval operation binding the contract event 0xa89c1dc243d8908a96dd84944bcc97d6bc6ac00dd78e20621576be6a3c943713.
⋮----
// Solidity: event AVSMetadataURIUpdated(address indexed avs, string metadataURI)
func (_IAllocationManager *IAllocationManagerFilterer) FilterAVSMetadataURIUpdated(opts *bind.FilterOpts, avs []common.Address) (*IAllocationManagerAVSMetadataURIUpdatedIterator, error)
⋮----
var avsRule []interface{}
⋮----
// WatchAVSMetadataURIUpdated is a free log subscription operation binding the contract event 0xa89c1dc243d8908a96dd84944bcc97d6bc6ac00dd78e20621576be6a3c943713.
⋮----
func (_IAllocationManager *IAllocationManagerFilterer) WatchAVSMetadataURIUpdated(opts *bind.WatchOpts, sink chan<- *IAllocationManagerAVSMetadataURIUpdated, avs []common.Address) (event.Subscription, error)
⋮----
// New log arrived, parse the event and forward to the user
⋮----
// ParseAVSMetadataURIUpdated is a log parse operation binding the contract event 0xa89c1dc243d8908a96dd84944bcc97d6bc6ac00dd78e20621576be6a3c943713.
⋮----
func (_IAllocationManager *IAllocationManagerFilterer) ParseAVSMetadataURIUpdated(log types.Log) (*IAllocationManagerAVSMetadataURIUpdated, error)
⋮----
// IAllocationManagerAVSRegistrarSetIterator is returned from FilterAVSRegistrarSet and is used to iterate over the raw logs and unpacked data for AVSRegistrarSet events raised by the IAllocationManager contract.
type IAllocationManagerAVSRegistrarSetIterator struct {
	Event *IAllocationManagerAVSRegistrarSet // 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
}
⋮----
Event *IAllocationManagerAVSRegistrarSet // Event containing the contract specifics and raw log
⋮----
// IAllocationManagerAVSRegistrarSet represents a AVSRegistrarSet event raised by the IAllocationManager contract.
type IAllocationManagerAVSRegistrarSet struct {
	Avs       common.Address
	Registrar common.Address
	Raw       types.Log // Blockchain specific contextual infos
}
⋮----
Raw       types.Log // Blockchain specific contextual infos
⋮----
// FilterAVSRegistrarSet is a free log retrieval operation binding the contract event 0x2ae945c40c44dc0ec263f95609c3fdc6952e0aefa22d6374e44f2c997acedf85.
⋮----
// Solidity: event AVSRegistrarSet(address avs, address registrar)
func (_IAllocationManager *IAllocationManagerFilterer) FilterAVSRegistrarSet(opts *bind.FilterOpts) (*IAllocationManagerAVSRegistrarSetIterator, error)
⋮----
// WatchAVSRegistrarSet is a free log subscription operation binding the contract event 0x2ae945c40c44dc0ec263f95609c3fdc6952e0aefa22d6374e44f2c997acedf85.
⋮----
func (_IAllocationManager *IAllocationManagerFilterer) WatchAVSRegistrarSet(opts *bind.WatchOpts, sink chan<- *IAllocationManagerAVSRegistrarSet) (event.Subscription, error)
⋮----
// ParseAVSRegistrarSet is a log parse operation binding the contract event 0x2ae945c40c44dc0ec263f95609c3fdc6952e0aefa22d6374e44f2c997acedf85.
⋮----
func (_IAllocationManager *IAllocationManagerFilterer) ParseAVSRegistrarSet(log types.Log) (*IAllocationManagerAVSRegistrarSet, error)
⋮----
// IAllocationManagerAllocationDelaySetIterator is returned from FilterAllocationDelaySet and is used to iterate over the raw logs and unpacked data for AllocationDelaySet events raised by the IAllocationManager contract.
type IAllocationManagerAllocationDelaySetIterator struct {
	Event *IAllocationManagerAllocationDelaySet // 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
}
⋮----
Event *IAllocationManagerAllocationDelaySet // Event containing the contract specifics and raw log
⋮----
// IAllocationManagerAllocationDelaySet represents a AllocationDelaySet event raised by the IAllocationManager contract.
type IAllocationManagerAllocationDelaySet struct {
	Operator    common.Address
	Delay       uint32
	EffectBlock uint32
	Raw         types.Log // Blockchain specific contextual infos
}
⋮----
// FilterAllocationDelaySet is a free log retrieval operation binding the contract event 0x4e85751d6331506c6c62335f207eb31f12a61e570f34f5c17640308785c6d4db.
⋮----
// Solidity: event AllocationDelaySet(address operator, uint32 delay, uint32 effectBlock)
func (_IAllocationManager *IAllocationManagerFilterer) FilterAllocationDelaySet(opts *bind.FilterOpts) (*IAllocationManagerAllocationDelaySetIterator, error)
⋮----
// WatchAllocationDelaySet is a free log subscription operation binding the contract event 0x4e85751d6331506c6c62335f207eb31f12a61e570f34f5c17640308785c6d4db.
⋮----
func (_IAllocationManager *IAllocationManagerFilterer) WatchAllocationDelaySet(opts *bind.WatchOpts, sink chan<- *IAllocationManagerAllocationDelaySet) (event.Subscription, error)
⋮----
// ParseAllocationDelaySet is a log parse operation binding the contract event 0x4e85751d6331506c6c62335f207eb31f12a61e570f34f5c17640308785c6d4db.
⋮----
func (_IAllocationManager *IAllocationManagerFilterer) ParseAllocationDelaySet(log types.Log) (*IAllocationManagerAllocationDelaySet, error)
⋮----
// IAllocationManagerAllocationUpdatedIterator is returned from FilterAllocationUpdated and is used to iterate over the raw logs and unpacked data for AllocationUpdated events raised by the IAllocationManager contract.
type IAllocationManagerAllocationUpdatedIterator struct {
	Event *IAllocationManagerAllocationUpdated // 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
}
⋮----
Event *IAllocationManagerAllocationUpdated // Event containing the contract specifics and raw log
⋮----
// IAllocationManagerAllocationUpdated represents a AllocationUpdated event raised by the IAllocationManager contract.
type IAllocationManagerAllocationUpdated struct {
	Operator    common.Address
	OperatorSet OperatorSet
	Strategy    common.Address
	Magnitude   uint64
	EffectBlock uint32
	Raw         types.Log // Blockchain specific contextual infos
}
⋮----
// FilterAllocationUpdated is a free log retrieval operation binding the contract event 0x1487af5418c47ee5ea45ef4a93398668120890774a9e13487e61e9dc3baf76dd.
⋮----
// Solidity: event AllocationUpdated(address operator, (address,uint32) operatorSet, address strategy, uint64 magnitude, uint32 effectBlock)
func (_IAllocationManager *IAllocationManagerFilterer) FilterAllocationUpdated(opts *bind.FilterOpts) (*IAllocationManagerAllocationUpdatedIterator, error)
⋮----
// WatchAllocationUpdated is a free log subscription operation binding the contract event 0x1487af5418c47ee5ea45ef4a93398668120890774a9e13487e61e9dc3baf76dd.
⋮----
func (_IAllocationManager *IAllocationManagerFilterer) WatchAllocationUpdated(opts *bind.WatchOpts, sink chan<- *IAllocationManagerAllocationUpdated) (event.Subscription, error)
⋮----
// ParseAllocationUpdated is a log parse operation binding the contract event 0x1487af5418c47ee5ea45ef4a93398668120890774a9e13487e61e9dc3baf76dd.
⋮----
func (_IAllocationManager *IAllocationManagerFilterer) ParseAllocationUpdated(log types.Log) (*IAllocationManagerAllocationUpdated, error)
⋮----
// IAllocationManagerEncumberedMagnitudeUpdatedIterator is returned from FilterEncumberedMagnitudeUpdated and is used to iterate over the raw logs and unpacked data for EncumberedMagnitudeUpdated events raised by the IAllocationManager contract.
type IAllocationManagerEncumberedMagnitudeUpdatedIterator struct {
	Event *IAllocationManagerEncumberedMagnitudeUpdated // 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
}
⋮----
Event *IAllocationManagerEncumberedMagnitudeUpdated // Event containing the contract specifics and raw log
⋮----
// IAllocationManagerEncumberedMagnitudeUpdated represents a EncumberedMagnitudeUpdated event raised by the IAllocationManager contract.
type IAllocationManagerEncumberedMagnitudeUpdated struct {
	Operator            common.Address
	Strategy            common.Address
	EncumberedMagnitude uint64
	Raw                 types.Log // Blockchain specific contextual infos
}
⋮----
Raw                 types.Log // Blockchain specific contextual infos
⋮----
// FilterEncumberedMagnitudeUpdated is a free log retrieval operation binding the contract event 0xacf9095feb3a370c9cf692421c69ef320d4db5c66e6a7d29c7694eb02364fc55.
⋮----
// Solidity: event EncumberedMagnitudeUpdated(address operator, address strategy, uint64 encumberedMagnitude)
func (_IAllocationManager *IAllocationManagerFilterer) FilterEncumberedMagnitudeUpdated(opts *bind.FilterOpts) (*IAllocationManagerEncumberedMagnitudeUpdatedIterator, error)
⋮----
// WatchEncumberedMagnitudeUpdated is a free log subscription operation binding the contract event 0xacf9095feb3a370c9cf692421c69ef320d4db5c66e6a7d29c7694eb02364fc55.
⋮----
func (_IAllocationManager *IAllocationManagerFilterer) WatchEncumberedMagnitudeUpdated(opts *bind.WatchOpts, sink chan<- *IAllocationManagerEncumberedMagnitudeUpdated) (event.Subscription, error)
⋮----
// ParseEncumberedMagnitudeUpdated is a log parse operation binding the contract event 0xacf9095feb3a370c9cf692421c69ef320d4db5c66e6a7d29c7694eb02364fc55.
⋮----
func (_IAllocationManager *IAllocationManagerFilterer) ParseEncumberedMagnitudeUpdated(log types.Log) (*IAllocationManagerEncumberedMagnitudeUpdated, error)
⋮----
// IAllocationManagerMaxMagnitudeUpdatedIterator is returned from FilterMaxMagnitudeUpdated and is used to iterate over the raw logs and unpacked data for MaxMagnitudeUpdated events raised by the IAllocationManager contract.
type IAllocationManagerMaxMagnitudeUpdatedIterator struct {
	Event *IAllocationManagerMaxMagnitudeUpdated // 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
}
⋮----
Event *IAllocationManagerMaxMagnitudeUpdated // Event containing the contract specifics and raw log
⋮----
// IAllocationManagerMaxMagnitudeUpdated represents a MaxMagnitudeUpdated event raised by the IAllocationManager contract.
type IAllocationManagerMaxMagnitudeUpdated struct {
	Operator     common.Address
	Strategy     common.Address
	MaxMagnitude uint64
	Raw          types.Log // Blockchain specific contextual infos
}
⋮----
Raw          types.Log // Blockchain specific contextual infos
⋮----
// FilterMaxMagnitudeUpdated is a free log retrieval operation binding the contract event 0x1c6458079a41077d003c11faf9bf097e693bd67979e4e6500bac7b29db779b5c.
⋮----
// Solidity: event MaxMagnitudeUpdated(address operator, address strategy, uint64 maxMagnitude)
func (_IAllocationManager *IAllocationManagerFilterer) FilterMaxMagnitudeUpdated(opts *bind.FilterOpts) (*IAllocationManagerMaxMagnitudeUpdatedIterator, error)
⋮----
// WatchMaxMagnitudeUpdated is a free log subscription operation binding the contract event 0x1c6458079a41077d003c11faf9bf097e693bd67979e4e6500bac7b29db779b5c.
⋮----
func (_IAllocationManager *IAllocationManagerFilterer) WatchMaxMagnitudeUpdated(opts *bind.WatchOpts, sink chan<- *IAllocationManagerMaxMagnitudeUpdated) (event.Subscription, error)
⋮----
// ParseMaxMagnitudeUpdated is a log parse operation binding the contract event 0x1c6458079a41077d003c11faf9bf097e693bd67979e4e6500bac7b29db779b5c.
⋮----
func (_IAllocationManager *IAllocationManagerFilterer) ParseMaxMagnitudeUpdated(log types.Log) (*IAllocationManagerMaxMagnitudeUpdated, error)
⋮----
// IAllocationManagerOperatorAddedToOperatorSetIterator is returned from FilterOperatorAddedToOperatorSet and is used to iterate over the raw logs and unpacked data for OperatorAddedToOperatorSet events raised by the IAllocationManager contract.
type IAllocationManagerOperatorAddedToOperatorSetIterator struct {
	Event *IAllocationManagerOperatorAddedToOperatorSet // 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
}
⋮----
Event *IAllocationManagerOperatorAddedToOperatorSet // Event containing the contract specifics and raw log
⋮----
// IAllocationManagerOperatorAddedToOperatorSet represents a OperatorAddedToOperatorSet event raised by the IAllocationManager contract.
type IAllocationManagerOperatorAddedToOperatorSet struct {
	Operator    common.Address
	OperatorSet OperatorSet
	Raw         types.Log // Blockchain specific contextual infos
}
⋮----
// FilterOperatorAddedToOperatorSet is a free log retrieval operation binding the contract event 0x43232edf9071753d2321e5fa7e018363ee248e5f2142e6c08edd3265bfb4895e.
⋮----
// Solidity: event OperatorAddedToOperatorSet(address indexed operator, (address,uint32) operatorSet)
func (_IAllocationManager *IAllocationManagerFilterer) FilterOperatorAddedToOperatorSet(opts *bind.FilterOpts, operator []common.Address) (*IAllocationManagerOperatorAddedToOperatorSetIterator, error)
⋮----
var operatorRule []interface{}
⋮----
// WatchOperatorAddedToOperatorSet is a free log subscription operation binding the contract event 0x43232edf9071753d2321e5fa7e018363ee248e5f2142e6c08edd3265bfb4895e.
⋮----
func (_IAllocationManager *IAllocationManagerFilterer) WatchOperatorAddedToOperatorSet(opts *bind.WatchOpts, sink chan<- *IAllocationManagerOperatorAddedToOperatorSet, operator []common.Address) (event.Subscription, error)
⋮----
// ParseOperatorAddedToOperatorSet is a log parse operation binding the contract event 0x43232edf9071753d2321e5fa7e018363ee248e5f2142e6c08edd3265bfb4895e.
⋮----
func (_IAllocationManager *IAllocationManagerFilterer) ParseOperatorAddedToOperatorSet(log types.Log) (*IAllocationManagerOperatorAddedToOperatorSet, error)
⋮----
// IAllocationManagerOperatorRemovedFromOperatorSetIterator is returned from FilterOperatorRemovedFromOperatorSet and is used to iterate over the raw logs and unpacked data for OperatorRemovedFromOperatorSet events raised by the IAllocationManager contract.
type IAllocationManagerOperatorRemovedFromOperatorSetIterator struct {
	Event *IAllocationManagerOperatorRemovedFromOperatorSet // 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
}
⋮----
Event *IAllocationManagerOperatorRemovedFromOperatorSet // Event containing the contract specifics and raw log
⋮----
// IAllocationManagerOperatorRemovedFromOperatorSet represents a OperatorRemovedFromOperatorSet event raised by the IAllocationManager contract.
type IAllocationManagerOperatorRemovedFromOperatorSet struct {
	Operator    common.Address
	OperatorSet OperatorSet
	Raw         types.Log // Blockchain specific contextual infos
}
⋮----
// FilterOperatorRemovedFromOperatorSet is a free log retrieval operation binding the contract event 0xad34c3070be1dffbcaa499d000ba2b8d9848aefcac3059df245dd95c4ece14fe.
⋮----
// Solidity: event OperatorRemovedFromOperatorSet(address indexed operator, (address,uint32) operatorSet)
func (_IAllocationManager *IAllocationManagerFilterer) FilterOperatorRemovedFromOperatorSet(opts *bind.FilterOpts, operator []common.Address) (*IAllocationManagerOperatorRemovedFromOperatorSetIterator, error)
⋮----
// WatchOperatorRemovedFromOperatorSet is a free log subscription operation binding the contract event 0xad34c3070be1dffbcaa499d000ba2b8d9848aefcac3059df245dd95c4ece14fe.
⋮----
func (_IAllocationManager *IAllocationManagerFilterer) WatchOperatorRemovedFromOperatorSet(opts *bind.WatchOpts, sink chan<- *IAllocationManagerOperatorRemovedFromOperatorSet, operator []common.Address) (event.Subscription, error)
⋮----
// ParseOperatorRemovedFromOperatorSet is a log parse operation binding the contract event 0xad34c3070be1dffbcaa499d000ba2b8d9848aefcac3059df245dd95c4ece14fe.
⋮----
func (_IAllocationManager *IAllocationManagerFilterer) ParseOperatorRemovedFromOperatorSet(log types.Log) (*IAllocationManagerOperatorRemovedFromOperatorSet, error)
⋮----
// IAllocationManagerOperatorSetCreatedIterator is returned from FilterOperatorSetCreated and is used to iterate over the raw logs and unpacked data for OperatorSetCreated events raised by the IAllocationManager contract.
type IAllocationManagerOperatorSetCreatedIterator struct {
	Event *IAllocationManagerOperatorSetCreated // 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
}
⋮----
Event *IAllocationManagerOperatorSetCreated // Event containing the contract specifics and raw log
⋮----
// IAllocationManagerOperatorSetCreated represents a OperatorSetCreated event raised by the IAllocationManager contract.
type IAllocationManagerOperatorSetCreated struct {
	OperatorSet OperatorSet
	Raw         types.Log // Blockchain specific contextual infos
}
⋮----
// FilterOperatorSetCreated is a free log retrieval operation binding the contract event 0x31629285ead2335ae0933f86ed2ae63321f7af77b4e6eaabc42c057880977e6c.
⋮----
// Solidity: event OperatorSetCreated((address,uint32) operatorSet)
func (_IAllocationManager *IAllocationManagerFilterer) FilterOperatorSetCreated(opts *bind.FilterOpts) (*IAllocationManagerOperatorSetCreatedIterator, error)
⋮----
// WatchOperatorSetCreated is a free log subscription operation binding the contract event 0x31629285ead2335ae0933f86ed2ae63321f7af77b4e6eaabc42c057880977e6c.
⋮----
func (_IAllocationManager *IAllocationManagerFilterer) WatchOperatorSetCreated(opts *bind.WatchOpts, sink chan<- *IAllocationManagerOperatorSetCreated) (event.Subscription, error)
⋮----
// ParseOperatorSetCreated is a log parse operation binding the contract event 0x31629285ead2335ae0933f86ed2ae63321f7af77b4e6eaabc42c057880977e6c.
⋮----
func (_IAllocationManager *IAllocationManagerFilterer) ParseOperatorSetCreated(log types.Log) (*IAllocationManagerOperatorSetCreated, error)
⋮----
// IAllocationManagerOperatorSlashedIterator is returned from FilterOperatorSlashed and is used to iterate over the raw logs and unpacked data for OperatorSlashed events raised by the IAllocationManager contract.
type IAllocationManagerOperatorSlashedIterator struct {
	Event *IAllocationManagerOperatorSlashed // 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
}
⋮----
Event *IAllocationManagerOperatorSlashed // Event containing the contract specifics and raw log
⋮----
// IAllocationManagerOperatorSlashed represents a OperatorSlashed event raised by the IAllocationManager contract.
type IAllocationManagerOperatorSlashed struct {
	Operator    common.Address
	OperatorSet OperatorSet
	Strategies  []common.Address
	WadSlashed  []*big.Int
	Description string
	Raw         types.Log // Blockchain specific contextual infos
}
⋮----
// FilterOperatorSlashed is a free log retrieval operation binding the contract event 0x80969ad29428d6797ee7aad084f9e4a42a82fc506dcd2ca3b6fb431f85ccebe5.
⋮----
// Solidity: event OperatorSlashed(address operator, (address,uint32) operatorSet, address[] strategies, uint256[] wadSlashed, string description)
func (_IAllocationManager *IAllocationManagerFilterer) FilterOperatorSlashed(opts *bind.FilterOpts) (*IAllocationManagerOperatorSlashedIterator, error)
⋮----
// WatchOperatorSlashed is a free log subscription operation binding the contract event 0x80969ad29428d6797ee7aad084f9e4a42a82fc506dcd2ca3b6fb431f85ccebe5.
⋮----
func (_IAllocationManager *IAllocationManagerFilterer) WatchOperatorSlashed(opts *bind.WatchOpts, sink chan<- *IAllocationManagerOperatorSlashed) (event.Subscription, error)
⋮----
// ParseOperatorSlashed is a log parse operation binding the contract event 0x80969ad29428d6797ee7aad084f9e4a42a82fc506dcd2ca3b6fb431f85ccebe5.
⋮----
func (_IAllocationManager *IAllocationManagerFilterer) ParseOperatorSlashed(log types.Log) (*IAllocationManagerOperatorSlashed, error)
⋮----
// IAllocationManagerPausedIterator is returned from FilterPaused and is used to iterate over the raw logs and unpacked data for Paused events raised by the IAllocationManager contract.
type IAllocationManagerPausedIterator struct {
	Event *IAllocationManagerPaused // 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
}
⋮----
Event *IAllocationManagerPaused // Event containing the contract specifics and raw log
⋮----
// IAllocationManagerPaused represents a Paused event raised by the IAllocationManager contract.
type IAllocationManagerPaused struct {
	Account         common.Address
	NewPausedStatus *big.Int
	Raw             types.Log // Blockchain specific contextual infos
}
⋮----
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 (_IAllocationManager *IAllocationManagerFilterer) FilterPaused(opts *bind.FilterOpts, account []common.Address) (*IAllocationManagerPausedIterator, error)
⋮----
var accountRule []interface{}
⋮----
// WatchPaused is a free log subscription operation binding the contract event 0xab40a374bc51de372200a8bc981af8c9ecdc08dfdaef0bb6e09f88f3c616ef3d.
⋮----
func (_IAllocationManager *IAllocationManagerFilterer) WatchPaused(opts *bind.WatchOpts, sink chan<- *IAllocationManagerPaused, account []common.Address) (event.Subscription, error)
⋮----
// ParsePaused is a log parse operation binding the contract event 0xab40a374bc51de372200a8bc981af8c9ecdc08dfdaef0bb6e09f88f3c616ef3d.
⋮----
func (_IAllocationManager *IAllocationManagerFilterer) ParsePaused(log types.Log) (*IAllocationManagerPaused, error)
⋮----
// IAllocationManagerRedistributionAddressSetIterator is returned from FilterRedistributionAddressSet and is used to iterate over the raw logs and unpacked data for RedistributionAddressSet events raised by the IAllocationManager contract.
type IAllocationManagerRedistributionAddressSetIterator struct {
	Event *IAllocationManagerRedistributionAddressSet // 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
}
⋮----
Event *IAllocationManagerRedistributionAddressSet // Event containing the contract specifics and raw log
⋮----
// IAllocationManagerRedistributionAddressSet represents a RedistributionAddressSet event raised by the IAllocationManager contract.
type IAllocationManagerRedistributionAddressSet struct {
	OperatorSet             OperatorSet
	RedistributionRecipient common.Address
	Raw                     types.Log // Blockchain specific contextual infos
}
⋮----
Raw                     types.Log // Blockchain specific contextual infos
⋮----
// FilterRedistributionAddressSet is a free log retrieval operation binding the contract event 0x90a6fa2a9b79b910872ebca540cf3bd8be827f586e6420c30d8836e30012907e.
⋮----
// Solidity: event RedistributionAddressSet((address,uint32) operatorSet, address redistributionRecipient)
func (_IAllocationManager *IAllocationManagerFilterer) FilterRedistributionAddressSet(opts *bind.FilterOpts) (*IAllocationManagerRedistributionAddressSetIterator, error)
⋮----
// WatchRedistributionAddressSet is a free log subscription operation binding the contract event 0x90a6fa2a9b79b910872ebca540cf3bd8be827f586e6420c30d8836e30012907e.
⋮----
func (_IAllocationManager *IAllocationManagerFilterer) WatchRedistributionAddressSet(opts *bind.WatchOpts, sink chan<- *IAllocationManagerRedistributionAddressSet) (event.Subscription, error)
⋮----
// ParseRedistributionAddressSet is a log parse operation binding the contract event 0x90a6fa2a9b79b910872ebca540cf3bd8be827f586e6420c30d8836e30012907e.
⋮----
func (_IAllocationManager *IAllocationManagerFilterer) ParseRedistributionAddressSet(log types.Log) (*IAllocationManagerRedistributionAddressSet, error)
⋮----
// IAllocationManagerSlasherMigratedIterator is returned from FilterSlasherMigrated and is used to iterate over the raw logs and unpacked data for SlasherMigrated events raised by the IAllocationManager contract.
type IAllocationManagerSlasherMigratedIterator struct {
	Event *IAllocationManagerSlasherMigrated // 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
}
⋮----
Event *IAllocationManagerSlasherMigrated // Event containing the contract specifics and raw log
⋮----
// IAllocationManagerSlasherMigrated represents a SlasherMigrated event raised by the IAllocationManager contract.
type IAllocationManagerSlasherMigrated struct {
	OperatorSet OperatorSet
	Slasher     common.Address
	Raw         types.Log // Blockchain specific contextual infos
}
⋮----
// FilterSlasherMigrated is a free log retrieval operation binding the contract event 0xf0c8fc7d71f647bd3a88ac369112517f6a4b8038e71913f2d20f71f877dfc725.
⋮----
// Solidity: event SlasherMigrated((address,uint32) operatorSet, address slasher)
func (_IAllocationManager *IAllocationManagerFilterer) FilterSlasherMigrated(opts *bind.FilterOpts) (*IAllocationManagerSlasherMigratedIterator, error)
⋮----
// WatchSlasherMigrated is a free log subscription operation binding the contract event 0xf0c8fc7d71f647bd3a88ac369112517f6a4b8038e71913f2d20f71f877dfc725.
⋮----
func (_IAllocationManager *IAllocationManagerFilterer) WatchSlasherMigrated(opts *bind.WatchOpts, sink chan<- *IAllocationManagerSlasherMigrated) (event.Subscription, error)
⋮----
// ParseSlasherMigrated is a log parse operation binding the contract event 0xf0c8fc7d71f647bd3a88ac369112517f6a4b8038e71913f2d20f71f877dfc725.
⋮----
func (_IAllocationManager *IAllocationManagerFilterer) ParseSlasherMigrated(log types.Log) (*IAllocationManagerSlasherMigrated, error)
⋮----
// IAllocationManagerSlasherUpdatedIterator is returned from FilterSlasherUpdated and is used to iterate over the raw logs and unpacked data for SlasherUpdated events raised by the IAllocationManager contract.
type IAllocationManagerSlasherUpdatedIterator struct {
	Event *IAllocationManagerSlasherUpdated // 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
}
⋮----
Event *IAllocationManagerSlasherUpdated // Event containing the contract specifics and raw log
⋮----
// IAllocationManagerSlasherUpdated represents a SlasherUpdated event raised by the IAllocationManager contract.
type IAllocationManagerSlasherUpdated struct {
	OperatorSet OperatorSet
	Slasher     common.Address
	EffectBlock uint32
	Raw         types.Log // Blockchain specific contextual infos
}
⋮----
// FilterSlasherUpdated is a free log retrieval operation binding the contract event 0x3873f29d7a65a4d75f5ba28909172f486216a1420e77c3c2720815951a6b4f57.
⋮----
// Solidity: event SlasherUpdated((address,uint32) operatorSet, address slasher, uint32 effectBlock)
func (_IAllocationManager *IAllocationManagerFilterer) FilterSlasherUpdated(opts *bind.FilterOpts) (*IAllocationManagerSlasherUpdatedIterator, error)
⋮----
// WatchSlasherUpdated is a free log subscription operation binding the contract event 0x3873f29d7a65a4d75f5ba28909172f486216a1420e77c3c2720815951a6b4f57.
⋮----
func (_IAllocationManager *IAllocationManagerFilterer) WatchSlasherUpdated(opts *bind.WatchOpts, sink chan<- *IAllocationManagerSlasherUpdated) (event.Subscription, error)
⋮----
// ParseSlasherUpdated is a log parse operation binding the contract event 0x3873f29d7a65a4d75f5ba28909172f486216a1420e77c3c2720815951a6b4f57.
⋮----
func (_IAllocationManager *IAllocationManagerFilterer) ParseSlasherUpdated(log types.Log) (*IAllocationManagerSlasherUpdated, error)
⋮----
// IAllocationManagerStrategyAddedToOperatorSetIterator is returned from FilterStrategyAddedToOperatorSet and is used to iterate over the raw logs and unpacked data for StrategyAddedToOperatorSet events raised by the IAllocationManager contract.
type IAllocationManagerStrategyAddedToOperatorSetIterator struct {
	Event *IAllocationManagerStrategyAddedToOperatorSet // 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
}
⋮----
Event *IAllocationManagerStrategyAddedToOperatorSet // Event containing the contract specifics and raw log
⋮----
// IAllocationManagerStrategyAddedToOperatorSet represents a StrategyAddedToOperatorSet event raised by the IAllocationManager contract.
type IAllocationManagerStrategyAddedToOperatorSet struct {
	OperatorSet OperatorSet
	Strategy    common.Address
	Raw         types.Log // Blockchain specific contextual infos
}
⋮----
// FilterStrategyAddedToOperatorSet is a free log retrieval operation binding the contract event 0x7ab260fe0af193db5f4986770d831bda4ea46099dc817e8b6716dcae8af8e88b.
⋮----
// Solidity: event StrategyAddedToOperatorSet((address,uint32) operatorSet, address strategy)
func (_IAllocationManager *IAllocationManagerFilterer) FilterStrategyAddedToOperatorSet(opts *bind.FilterOpts) (*IAllocationManagerStrategyAddedToOperatorSetIterator, error)
⋮----
// WatchStrategyAddedToOperatorSet is a free log subscription operation binding the contract event 0x7ab260fe0af193db5f4986770d831bda4ea46099dc817e8b6716dcae8af8e88b.
⋮----
func (_IAllocationManager *IAllocationManagerFilterer) WatchStrategyAddedToOperatorSet(opts *bind.WatchOpts, sink chan<- *IAllocationManagerStrategyAddedToOperatorSet) (event.Subscription, error)
⋮----
// ParseStrategyAddedToOperatorSet is a log parse operation binding the contract event 0x7ab260fe0af193db5f4986770d831bda4ea46099dc817e8b6716dcae8af8e88b.
⋮----
func (_IAllocationManager *IAllocationManagerFilterer) ParseStrategyAddedToOperatorSet(log types.Log) (*IAllocationManagerStrategyAddedToOperatorSet, error)
⋮----
// IAllocationManagerStrategyRemovedFromOperatorSetIterator is returned from FilterStrategyRemovedFromOperatorSet and is used to iterate over the raw logs and unpacked data for StrategyRemovedFromOperatorSet events raised by the IAllocationManager contract.
type IAllocationManagerStrategyRemovedFromOperatorSetIterator struct {
	Event *IAllocationManagerStrategyRemovedFromOperatorSet // 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
}
⋮----
Event *IAllocationManagerStrategyRemovedFromOperatorSet // Event containing the contract specifics and raw log
⋮----
// IAllocationManagerStrategyRemovedFromOperatorSet represents a StrategyRemovedFromOperatorSet event raised by the IAllocationManager contract.
type IAllocationManagerStrategyRemovedFromOperatorSet struct {
	OperatorSet OperatorSet
	Strategy    common.Address
	Raw         types.Log // Blockchain specific contextual infos
}
⋮----
// FilterStrategyRemovedFromOperatorSet is a free log retrieval operation binding the contract event 0x7b4b073d80dcac55a11177d8459ad9f664ceeb91f71f27167bb14f8152a7eeee.
⋮----
// Solidity: event StrategyRemovedFromOperatorSet((address,uint32) operatorSet, address strategy)
func (_IAllocationManager *IAllocationManagerFilterer) FilterStrategyRemovedFromOperatorSet(opts *bind.FilterOpts) (*IAllocationManagerStrategyRemovedFromOperatorSetIterator, error)
⋮----
// WatchStrategyRemovedFromOperatorSet is a free log subscription operation binding the contract event 0x7b4b073d80dcac55a11177d8459ad9f664ceeb91f71f27167bb14f8152a7eeee.
⋮----
func (_IAllocationManager *IAllocationManagerFilterer) WatchStrategyRemovedFromOperatorSet(opts *bind.WatchOpts, sink chan<- *IAllocationManagerStrategyRemovedFromOperatorSet) (event.Subscription, error)
⋮----
// ParseStrategyRemovedFromOperatorSet is a log parse operation binding the contract event 0x7b4b073d80dcac55a11177d8459ad9f664ceeb91f71f27167bb14f8152a7eeee.
⋮----
func (_IAllocationManager *IAllocationManagerFilterer) ParseStrategyRemovedFromOperatorSet(log types.Log) (*IAllocationManagerStrategyRemovedFromOperatorSet, error)
⋮----
// IAllocationManagerUnpausedIterator is returned from FilterUnpaused and is used to iterate over the raw logs and unpacked data for Unpaused events raised by the IAllocationManager contract.
type IAllocationManagerUnpausedIterator struct {
	Event *IAllocationManagerUnpaused // 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
}
⋮----
Event *IAllocationManagerUnpaused // Event containing the contract specifics and raw log
⋮----
// IAllocationManagerUnpaused represents a Unpaused event raised by the IAllocationManager contract.
type IAllocationManagerUnpaused 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 (_IAllocationManager *IAllocationManagerFilterer) FilterUnpaused(opts *bind.FilterOpts, account []common.Address) (*IAllocationManagerUnpausedIterator, error)
⋮----
// WatchUnpaused is a free log subscription operation binding the contract event 0x3582d1828e26bf56bd801502bc021ac0bc8afb57c826e4986b45593c8fad389c.
⋮----
func (_IAllocationManager *IAllocationManagerFilterer) WatchUnpaused(opts *bind.WatchOpts, sink chan<- *IAllocationManagerUnpaused, account []common.Address) (event.Subscription, error)
⋮----
// ParseUnpaused is a log parse operation binding the contract event 0x3582d1828e26bf56bd801502bc021ac0bc8afb57c826e4986b45593c8fad389c.
⋮----
func (_IAllocationManager *IAllocationManagerFilterer) ParseUnpaused(log types.Log) (*IAllocationManagerUnpaused, error)
````

## File: pkg/bindings/IAVSDirectory/binding.go
````go
// Code generated - DO NOT EDIT.
// This file is a generated binding and any manual changes will be lost.
⋮----
package IAVSDirectory
⋮----
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"
)
⋮----
"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
)
⋮----
// ISignatureUtilsMixinTypesSignatureWithSaltAndExpiry is an auto generated low-level Go binding around an user-defined struct.
type ISignatureUtilsMixinTypesSignatureWithSaltAndExpiry struct {
	Signature []byte
	Salt      [32]byte
	Expiry    *big.Int
}
⋮----
// IAVSDirectoryMetaData contains all meta data concerning the IAVSDirectory contract.
var IAVSDirectoryMetaData = &bind.MetaData{
	ABI: "[{\"type\":\"function\",\"name\":\"OPERATOR_AVS_REGISTRATION_TYPEHASH\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"OPERATOR_SET_REGISTRATION_TYPEHASH\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"calculateOperatorAVSRegistrationDigestHash\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"salt\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"expiry\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"cancelSalt\",\"inputs\":[{\"name\":\"salt\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"deregisterOperatorFromAVS\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"domainSeparator\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"initialize\",\"inputs\":[{\"name\":\"initialOwner\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"initialPausedStatus\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"operatorSaltIsSpent\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"salt\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"registerOperatorToAVS\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"operatorSignature\",\"type\":\"tuple\",\"internalType\":\"structISignatureUtilsMixinTypes.SignatureWithSaltAndExpiry\",\"components\":[{\"name\":\"signature\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"salt\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"expiry\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"updateAVSMetadataURI\",\"inputs\":[{\"name\":\"metadataURI\",\"type\":\"string\",\"internalType\":\"string\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"event\",\"name\":\"AVSMetadataURIUpdated\",\"inputs\":[{\"name\":\"avs\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"metadataURI\",\"type\":\"string\",\"indexed\":false,\"internalType\":\"string\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"OperatorAVSRegistrationStatusUpdated\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"avs\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"status\",\"type\":\"uint8\",\"indexed\":false,\"internalType\":\"enumIAVSDirectoryTypes.OperatorAVSRegistrationStatus\"}],\"anonymous\":false},{\"type\":\"error\",\"name\":\"InvalidSignature\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"OperatorAlreadyRegisteredToAVS\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"OperatorNotRegisteredToAVS\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"OperatorNotRegisteredToEigenLayer\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"SaltSpent\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"SignatureExpired\",\"inputs\":[]}]",
}
⋮----
// IAVSDirectoryABI is the input ABI used to generate the binding from.
// Deprecated: Use IAVSDirectoryMetaData.ABI instead.
var IAVSDirectoryABI = IAVSDirectoryMetaData.ABI
⋮----
// IAVSDirectory is an auto generated Go binding around an Ethereum contract.
type IAVSDirectory struct {
	IAVSDirectoryCaller     // Read-only binding to the contract
	IAVSDirectoryTransactor // Write-only binding to the contract
	IAVSDirectoryFilterer   // Log filterer for contract events
}
⋮----
IAVSDirectoryCaller     // Read-only binding to the contract
IAVSDirectoryTransactor // Write-only binding to the contract
IAVSDirectoryFilterer   // Log filterer for contract events
⋮----
// IAVSDirectoryCaller is an auto generated read-only Go binding around an Ethereum contract.
type IAVSDirectoryCaller struct {
	contract *bind.BoundContract // Generic contract wrapper for the low level calls
}
⋮----
contract *bind.BoundContract // Generic contract wrapper for the low level calls
⋮----
// IAVSDirectoryTransactor is an auto generated write-only Go binding around an Ethereum contract.
type IAVSDirectoryTransactor struct {
	contract *bind.BoundContract // Generic contract wrapper for the low level calls
}
⋮----
// IAVSDirectoryFilterer is an auto generated log filtering Go binding around an Ethereum contract events.
type IAVSDirectoryFilterer struct {
	contract *bind.BoundContract // Generic contract wrapper for the low level calls
}
⋮----
// IAVSDirectorySession is an auto generated Go binding around an Ethereum contract,
// with pre-set call and transact options.
type IAVSDirectorySession struct {
	Contract     *IAVSDirectory    // 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
}
⋮----
Contract     *IAVSDirectory    // 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
⋮----
// IAVSDirectoryCallerSession is an auto generated read-only Go binding around an Ethereum contract,
// with pre-set call options.
type IAVSDirectoryCallerSession struct {
	Contract *IAVSDirectoryCaller // Generic contract caller binding to set the session for
	CallOpts bind.CallOpts        // Call options to use throughout this session
}
⋮----
Contract *IAVSDirectoryCaller // Generic contract caller binding to set the session for
CallOpts bind.CallOpts        // Call options to use throughout this session
⋮----
// IAVSDirectoryTransactorSession is an auto generated write-only Go binding around an Ethereum contract,
// with pre-set transact options.
type IAVSDirectoryTransactorSession struct {
	Contract     *IAVSDirectoryTransactor // Generic contract transactor binding to set the session for
	TransactOpts bind.TransactOpts        // Transaction auth options to use throughout this session
}
⋮----
Contract     *IAVSDirectoryTransactor // Generic contract transactor binding to set the session for
TransactOpts bind.TransactOpts        // Transaction auth options to use throughout this session
⋮----
// IAVSDirectoryRaw is an auto generated low-level Go binding around an Ethereum contract.
type IAVSDirectoryRaw struct {
	Contract *IAVSDirectory // Generic contract binding to access the raw methods on
}
⋮----
Contract *IAVSDirectory // Generic contract binding to access the raw methods on
⋮----
// IAVSDirectoryCallerRaw is an auto generated low-level read-only Go binding around an Ethereum contract.
type IAVSDirectoryCallerRaw struct {
	Contract *IAVSDirectoryCaller // Generic read-only contract binding to access the raw methods on
}
⋮----
Contract *IAVSDirectoryCaller // Generic read-only contract binding to access the raw methods on
⋮----
// IAVSDirectoryTransactorRaw is an auto generated low-level write-only Go binding around an Ethereum contract.
type IAVSDirectoryTransactorRaw struct {
	Contract *IAVSDirectoryTransactor // Generic write-only contract binding to access the raw methods on
}
⋮----
Contract *IAVSDirectoryTransactor // Generic write-only contract binding to access the raw methods on
⋮----
// NewIAVSDirectory creates a new instance of IAVSDirectory, bound to a specific deployed contract.
func NewIAVSDirectory(address common.Address, backend bind.ContractBackend) (*IAVSDirectory, error)
⋮----
// NewIAVSDirectoryCaller creates a new read-only instance of IAVSDirectory, bound to a specific deployed contract.
func NewIAVSDirectoryCaller(address common.Address, caller bind.ContractCaller) (*IAVSDirectoryCaller, error)
⋮----
// NewIAVSDirectoryTransactor creates a new write-only instance of IAVSDirectory, bound to a specific deployed contract.
func NewIAVSDirectoryTransactor(address common.Address, transactor bind.ContractTransactor) (*IAVSDirectoryTransactor, error)
⋮----
// NewIAVSDirectoryFilterer creates a new log filterer instance of IAVSDirectory, bound to a specific deployed contract.
func NewIAVSDirectoryFilterer(address common.Address, filterer bind.ContractFilterer) (*IAVSDirectoryFilterer, error)
⋮----
// bindIAVSDirectory binds a generic wrapper to an already deployed contract.
func bindIAVSDirectory(address common.Address, caller bind.ContractCaller, transactor bind.ContractTransactor, filterer bind.ContractFilterer) (*bind.BoundContract, error)
⋮----
// 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 (_IAVSDirectory *IAVSDirectoryRaw) Call(opts *bind.CallOpts, result *[]interface
⋮----
// Transfer initiates a plain transaction to move funds to the contract, calling
// its default method if one is available.
func (_IAVSDirectory *IAVSDirectoryRaw) Transfer(opts *bind.TransactOpts) (*types.Transaction, error)
⋮----
// Transact invokes the (paid) contract method with params as input values.
func (_IAVSDirectory *IAVSDirectoryRaw) Transact(opts *bind.TransactOpts, method string, params ...interface
⋮----
// OPERATORAVSREGISTRATIONTYPEHASH is a free data retrieval call binding the contract method 0xd79aceab.
//
// Solidity: function OPERATOR_AVS_REGISTRATION_TYPEHASH() view returns(bytes32)
func (_IAVSDirectory *IAVSDirectoryCaller) OPERATORAVSREGISTRATIONTYPEHASH(opts *bind.CallOpts) ([32]byte, error)
⋮----
var out []interface{}
⋮----
// OPERATORSETREGISTRATIONTYPEHASH is a free data retrieval call binding the contract method 0xc825fe68.
⋮----
// Solidity: function OPERATOR_SET_REGISTRATION_TYPEHASH() view returns(bytes32)
func (_IAVSDirectory *IAVSDirectoryCaller) OPERATORSETREGISTRATIONTYPEHASH(opts *bind.CallOpts) ([32]byte, error)
⋮----
// CalculateOperatorAVSRegistrationDigestHash is a free data retrieval call binding the contract method 0xa1060c88.
⋮----
// Solidity: function calculateOperatorAVSRegistrationDigestHash(address operator, address avs, bytes32 salt, uint256 expiry) view returns(bytes32)
func (_IAVSDirectory *IAVSDirectoryCaller) CalculateOperatorAVSRegistrationDigestHash(opts *bind.CallOpts, operator common.Address, avs common.Address, salt [32]byte, expiry *big.Int) ([32]byte, error)
⋮----
// DomainSeparator is a free data retrieval call binding the contract method 0xf698da25.
⋮----
// Solidity: function domainSeparator() view returns(bytes32)
func (_IAVSDirectory *IAVSDirectoryCaller) DomainSeparator(opts *bind.CallOpts) ([32]byte, error)
⋮----
// OperatorSaltIsSpent is a free data retrieval call binding the contract method 0x374823b5.
⋮----
// Solidity: function operatorSaltIsSpent(address operator, bytes32 salt) view returns(bool)
func (_IAVSDirectory *IAVSDirectoryCaller) OperatorSaltIsSpent(opts *bind.CallOpts, operator common.Address, salt [32]byte) (bool, error)
⋮----
// CancelSalt is a paid mutator transaction binding the contract method 0xec76f442.
⋮----
// Solidity: function cancelSalt(bytes32 salt) returns()
func (_IAVSDirectory *IAVSDirectoryTransactor) CancelSalt(opts *bind.TransactOpts, salt [32]byte) (*types.Transaction, error)
⋮----
// DeregisterOperatorFromAVS is a paid mutator transaction binding the contract method 0xa364f4da.
⋮----
// Solidity: function deregisterOperatorFromAVS(address operator) returns()
func (_IAVSDirectory *IAVSDirectoryTransactor) DeregisterOperatorFromAVS(opts *bind.TransactOpts, operator common.Address) (*types.Transaction, error)
⋮----
// Initialize is a paid mutator transaction binding the contract method 0xcd6dc687.
⋮----
// Solidity: function initialize(address initialOwner, uint256 initialPausedStatus) returns()
func (_IAVSDirectory *IAVSDirectoryTransactor) Initialize(opts *bind.TransactOpts, initialOwner common.Address, initialPausedStatus *big.Int) (*types.Transaction, error)
⋮----
// RegisterOperatorToAVS is a paid mutator transaction binding the contract method 0x9926ee7d.
⋮----
// Solidity: function registerOperatorToAVS(address operator, (bytes,bytes32,uint256) operatorSignature) returns()
func (_IAVSDirectory *IAVSDirectoryTransactor) RegisterOperatorToAVS(opts *bind.TransactOpts, operator common.Address, operatorSignature ISignatureUtilsMixinTypesSignatureWithSaltAndExpiry) (*types.Transaction, error)
⋮----
// UpdateAVSMetadataURI is a paid mutator transaction binding the contract method 0xa98fb355.
⋮----
// Solidity: function updateAVSMetadataURI(string metadataURI) returns()
func (_IAVSDirectory *IAVSDirectoryTransactor) UpdateAVSMetadataURI(opts *bind.TransactOpts, metadataURI string) (*types.Transaction, error)
⋮----
// IAVSDirectoryAVSMetadataURIUpdatedIterator is returned from FilterAVSMetadataURIUpdated and is used to iterate over the raw logs and unpacked data for AVSMetadataURIUpdated events raised by the IAVSDirectory contract.
type IAVSDirectoryAVSMetadataURIUpdatedIterator struct {
	Event *IAVSDirectoryAVSMetadataURIUpdated // 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
}
⋮----
Event *IAVSDirectoryAVSMetadataURIUpdated // 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 *IAVSDirectoryAVSMetadataURIUpdatedIterator) Next() bool
⋮----
// If the iterator failed, stop iterating
⋮----
// If the iterator completed, deliver directly whatever's available
⋮----
// Iterator still in progress, wait for either a data or an error event
⋮----
// Error returns any retrieval or parsing error occurred during filtering.
func (it *IAVSDirectoryAVSMetadataURIUpdatedIterator) Error() error
⋮----
// Close terminates the iteration process, releasing any pending underlying
// resources.
func (it *IAVSDirectoryAVSMetadataURIUpdatedIterator) Close() error
⋮----
// IAVSDirectoryAVSMetadataURIUpdated represents a AVSMetadataURIUpdated event raised by the IAVSDirectory contract.
type IAVSDirectoryAVSMetadataURIUpdated struct {
	Avs         common.Address
	MetadataURI string
	Raw         types.Log // Blockchain specific contextual infos
}
⋮----
Raw         types.Log // Blockchain specific contextual infos
⋮----
// FilterAVSMetadataURIUpdated is a free log retrieval operation binding the contract event 0xa89c1dc243d8908a96dd84944bcc97d6bc6ac00dd78e20621576be6a3c943713.
⋮----
// Solidity: event AVSMetadataURIUpdated(address indexed avs, string metadataURI)
func (_IAVSDirectory *IAVSDirectoryFilterer) FilterAVSMetadataURIUpdated(opts *bind.FilterOpts, avs []common.Address) (*IAVSDirectoryAVSMetadataURIUpdatedIterator, error)
⋮----
var avsRule []interface{}
⋮----
// WatchAVSMetadataURIUpdated is a free log subscription operation binding the contract event 0xa89c1dc243d8908a96dd84944bcc97d6bc6ac00dd78e20621576be6a3c943713.
⋮----
func (_IAVSDirectory *IAVSDirectoryFilterer) WatchAVSMetadataURIUpdated(opts *bind.WatchOpts, sink chan<- *IAVSDirectoryAVSMetadataURIUpdated, avs []common.Address) (event.Subscription, error)
⋮----
// New log arrived, parse the event and forward to the user
⋮----
// ParseAVSMetadataURIUpdated is a log parse operation binding the contract event 0xa89c1dc243d8908a96dd84944bcc97d6bc6ac00dd78e20621576be6a3c943713.
⋮----
func (_IAVSDirectory *IAVSDirectoryFilterer) ParseAVSMetadataURIUpdated(log types.Log) (*IAVSDirectoryAVSMetadataURIUpdated, error)
⋮----
// IAVSDirectoryOperatorAVSRegistrationStatusUpdatedIterator is returned from FilterOperatorAVSRegistrationStatusUpdated and is used to iterate over the raw logs and unpacked data for OperatorAVSRegistrationStatusUpdated events raised by the IAVSDirectory contract.
type IAVSDirectoryOperatorAVSRegistrationStatusUpdatedIterator struct {
	Event *IAVSDirectoryOperatorAVSRegistrationStatusUpdated // Event containing the contract specifics and raw log

	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
}
⋮----
Event *IAVSDirectoryOperatorAVSRegistrationStatusUpdated // Event containing the contract specifics and raw log
⋮----
// IAVSDirectoryOperatorAVSRegistrationStatusUpdated represents a OperatorAVSRegistrationStatusUpdated event raised by the IAVSDirectory contract.
type IAVSDirectoryOperatorAVSRegistrationStatusUpdated struct {
	Operator common.Address
	Avs      common.Address
	Status   uint8
	Raw      types.Log // Blockchain specific contextual infos
}
⋮----
Raw      types.Log // Blockchain specific contextual infos
⋮----
// FilterOperatorAVSRegistrationStatusUpdated is a free log retrieval operation binding the contract event 0xf0952b1c65271d819d39983d2abb044b9cace59bcc4d4dd389f586ebdcb15b41.
⋮----
// Solidity: event OperatorAVSRegistrationStatusUpdated(address indexed operator, address indexed avs, uint8 status)
func (_IAVSDirectory *IAVSDirectoryFilterer) FilterOperatorAVSRegistrationStatusUpdated(opts *bind.FilterOpts, operator []common.Address, avs []common.Address) (*IAVSDirectoryOperatorAVSRegistrationStatusUpdatedIterator, error)
⋮----
var operatorRule []interface{}
⋮----
// WatchOperatorAVSRegistrationStatusUpdated is a free log subscription operation binding the contract event 0xf0952b1c65271d819d39983d2abb044b9cace59bcc4d4dd389f586ebdcb15b41.
⋮----
func (_IAVSDirectory *IAVSDirectoryFilterer) WatchOperatorAVSRegistrationStatusUpdated(opts *bind.WatchOpts, sink chan<- *IAVSDirectoryOperatorAVSRegistrationStatusUpdated, operator []common.Address, avs []common.Address) (event.Subscription, error)
⋮----
// ParseOperatorAVSRegistrationStatusUpdated is a log parse operation binding the contract event 0xf0952b1c65271d819d39983d2abb044b9cace59bcc4d4dd389f586ebdcb15b41.
⋮----
func (_IAVSDirectory *IAVSDirectoryFilterer) ParseOperatorAVSRegistrationStatusUpdated(log types.Log) (*IAVSDirectoryOperatorAVSRegistrationStatusUpdated, error)
````

## File: pkg/bindings/IAVSRegistrar/binding.go
````go
// Code generated - DO NOT EDIT.
// This file is a generated binding and any manual changes will be lost.
⋮----
package IAVSRegistrar
⋮----
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"
)
⋮----
"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
)
⋮----
// IAVSRegistrarMetaData contains all meta data concerning the IAVSRegistrar contract.
var IAVSRegistrarMetaData = &bind.MetaData{
	ABI: "[{\"type\":\"function\",\"name\":\"deregisterOperator\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"operatorSetIds\",\"type\":\"uint32[]\",\"internalType\":\"uint32[]\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"registerOperator\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"operatorSetIds\",\"type\":\"uint32[]\",\"internalType\":\"uint32[]\"},{\"name\":\"data\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"supportsAVS\",\"inputs\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"}]",
}
⋮----
// IAVSRegistrarABI is the input ABI used to generate the binding from.
// Deprecated: Use IAVSRegistrarMetaData.ABI instead.
var IAVSRegistrarABI = IAVSRegistrarMetaData.ABI
⋮----
// IAVSRegistrar is an auto generated Go binding around an Ethereum contract.
type IAVSRegistrar struct {
	IAVSRegistrarCaller     // Read-only binding to the contract
	IAVSRegistrarTransactor // Write-only binding to the contract
	IAVSRegistrarFilterer   // Log filterer for contract events
}
⋮----
IAVSRegistrarCaller     // Read-only binding to the contract
IAVSRegistrarTransactor // Write-only binding to the contract
IAVSRegistrarFilterer   // Log filterer for contract events
⋮----
// IAVSRegistrarCaller is an auto generated read-only Go binding around an Ethereum contract.
type IAVSRegistrarCaller struct {
	contract *bind.BoundContract // Generic contract wrapper for the low level calls
}
⋮----
contract *bind.BoundContract // Generic contract wrapper for the low level calls
⋮----
// IAVSRegistrarTransactor is an auto generated write-only Go binding around an Ethereum contract.
type IAVSRegistrarTransactor struct {
	contract *bind.BoundContract // Generic contract wrapper for the low level calls
}
⋮----
// IAVSRegistrarFilterer is an auto generated log filtering Go binding around an Ethereum contract events.
type IAVSRegistrarFilterer struct {
	contract *bind.BoundContract // Generic contract wrapper for the low level calls
}
⋮----
// IAVSRegistrarSession is an auto generated Go binding around an Ethereum contract,
// with pre-set call and transact options.
type IAVSRegistrarSession struct {
	Contract     *IAVSRegistrar    // 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
}
⋮----
Contract     *IAVSRegistrar    // 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
⋮----
// IAVSRegistrarCallerSession is an auto generated read-only Go binding around an Ethereum contract,
// with pre-set call options.
type IAVSRegistrarCallerSession struct {
	Contract *IAVSRegistrarCaller // Generic contract caller binding to set the session for
	CallOpts bind.CallOpts        // Call options to use throughout this session
}
⋮----
Contract *IAVSRegistrarCaller // Generic contract caller binding to set the session for
CallOpts bind.CallOpts        // Call options to use throughout this session
⋮----
// IAVSRegistrarTransactorSession is an auto generated write-only Go binding around an Ethereum contract,
// with pre-set transact options.
type IAVSRegistrarTransactorSession struct {
	Contract     *IAVSRegistrarTransactor // Generic contract transactor binding to set the session for
	TransactOpts bind.TransactOpts        // Transaction auth options to use throughout this session
}
⋮----
Contract     *IAVSRegistrarTransactor // Generic contract transactor binding to set the session for
TransactOpts bind.TransactOpts        // Transaction auth options to use throughout this session
⋮----
// IAVSRegistrarRaw is an auto generated low-level Go binding around an Ethereum contract.
type IAVSRegistrarRaw struct {
	Contract *IAVSRegistrar // Generic contract binding to access the raw methods on
}
⋮----
Contract *IAVSRegistrar // Generic contract binding to access the raw methods on
⋮----
// IAVSRegistrarCallerRaw is an auto generated low-level read-only Go binding around an Ethereum contract.
type IAVSRegistrarCallerRaw struct {
	Contract *IAVSRegistrarCaller // Generic read-only contract binding to access the raw methods on
}
⋮----
Contract *IAVSRegistrarCaller // Generic read-only contract binding to access the raw methods on
⋮----
// IAVSRegistrarTransactorRaw is an auto generated low-level write-only Go binding around an Ethereum contract.
type IAVSRegistrarTransactorRaw struct {
	Contract *IAVSRegistrarTransactor // Generic write-only contract binding to access the raw methods on
}
⋮----
Contract *IAVSRegistrarTransactor // Generic write-only contract binding to access the raw methods on
⋮----
// NewIAVSRegistrar creates a new instance of IAVSRegistrar, bound to a specific deployed contract.
func NewIAVSRegistrar(address common.Address, backend bind.ContractBackend) (*IAVSRegistrar, error)
⋮----
// NewIAVSRegistrarCaller creates a new read-only instance of IAVSRegistrar, bound to a specific deployed contract.
func NewIAVSRegistrarCaller(address common.Address, caller bind.ContractCaller) (*IAVSRegistrarCaller, error)
⋮----
// NewIAVSRegistrarTransactor creates a new write-only instance of IAVSRegistrar, bound to a specific deployed contract.
func NewIAVSRegistrarTransactor(address common.Address, transactor bind.ContractTransactor) (*IAVSRegistrarTransactor, error)
⋮----
// NewIAVSRegistrarFilterer creates a new log filterer instance of IAVSRegistrar, bound to a specific deployed contract.
func NewIAVSRegistrarFilterer(address common.Address, filterer bind.ContractFilterer) (*IAVSRegistrarFilterer, error)
⋮----
// bindIAVSRegistrar binds a generic wrapper to an already deployed contract.
func bindIAVSRegistrar(address common.Address, caller bind.ContractCaller, transactor bind.ContractTransactor, filterer bind.ContractFilterer) (*bind.BoundContract, error)
⋮----
// 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 (_IAVSRegistrar *IAVSRegistrarRaw) Call(opts *bind.CallOpts, result *[]interface
⋮----
// Transfer initiates a plain transaction to move funds to the contract, calling
// its default method if one is available.
func (_IAVSRegistrar *IAVSRegistrarRaw) Transfer(opts *bind.TransactOpts) (*types.Transaction, error)
⋮----
// Transact invokes the (paid) contract method with params as input values.
func (_IAVSRegistrar *IAVSRegistrarRaw) Transact(opts *bind.TransactOpts, method string, params ...interface
⋮----
// SupportsAVS is a free data retrieval call binding the contract method 0xb5265787.
//
// Solidity: function supportsAVS(address avs) view returns(bool)
func (_IAVSRegistrar *IAVSRegistrarCaller) SupportsAVS(opts *bind.CallOpts, avs common.Address) (bool, error)
⋮----
var out []interface{}
⋮----
// DeregisterOperator is a paid mutator transaction binding the contract method 0x303ca956.
⋮----
// Solidity: function deregisterOperator(address operator, address avs, uint32[] operatorSetIds) returns()
func (_IAVSRegistrar *IAVSRegistrarTransactor) DeregisterOperator(opts *bind.TransactOpts, operator common.Address, avs common.Address, operatorSetIds []uint32) (*types.Transaction, error)
⋮----
// RegisterOperator is a paid mutator transaction binding the contract method 0xc63fd502.
⋮----
// Solidity: function registerOperator(address operator, address avs, uint32[] operatorSetIds, bytes data) returns()
func (_IAVSRegistrar *IAVSRegistrarTransactor) RegisterOperator(opts *bind.TransactOpts, operator common.Address, avs common.Address, operatorSetIds []uint32, data []byte) (*types.Transaction, error)
````

## File: pkg/bindings/IAVSTaskHook/binding.go
````go
// Code generated - DO NOT EDIT.
// This file is a generated binding and any manual changes will be lost.
⋮----
package IAVSTaskHook
⋮----
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"
)
⋮----
"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
)
⋮----
// ITaskMailboxTypesTaskParams is an auto generated low-level Go binding around an user-defined struct.
type ITaskMailboxTypesTaskParams struct {
	RefundCollector     common.Address
	ExecutorOperatorSet OperatorSet
	Payload             []byte
}
⋮----
// OperatorSet is an auto generated low-level Go binding around an user-defined struct.
type OperatorSet struct {
	Avs common.Address
	Id  uint32
}
⋮----
// IAVSTaskHookMetaData contains all meta data concerning the IAVSTaskHook contract.
var IAVSTaskHookMetaData = &bind.MetaData{
	ABI: "[{\"type\":\"function\",\"name\":\"calculateTaskFee\",\"inputs\":[{\"name\":\"taskParams\",\"type\":\"tuple\",\"internalType\":\"structITaskMailboxTypes.TaskParams\",\"components\":[{\"name\":\"refundCollector\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"executorOperatorSet\",\"type\":\"tuple\",\"internalType\":\"structOperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]},{\"name\":\"payload\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]}],\"outputs\":[{\"name\":\"\",\"type\":\"uint96\",\"internalType\":\"uint96\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"handlePostTaskCreation\",\"inputs\":[{\"name\":\"taskHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"handlePostTaskResultSubmission\",\"inputs\":[{\"name\":\"caller\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"taskHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"validatePreTaskCreation\",\"inputs\":[{\"name\":\"caller\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"taskParams\",\"type\":\"tuple\",\"internalType\":\"structITaskMailboxTypes.TaskParams\",\"components\":[{\"name\":\"refundCollector\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"executorOperatorSet\",\"type\":\"tuple\",\"internalType\":\"structOperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]},{\"name\":\"payload\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]}],\"outputs\":[],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"validatePreTaskResultSubmission\",\"inputs\":[{\"name\":\"caller\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"taskHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"cert\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"result\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[],\"stateMutability\":\"view\"}]",
}
⋮----
// IAVSTaskHookABI is the input ABI used to generate the binding from.
// Deprecated: Use IAVSTaskHookMetaData.ABI instead.
var IAVSTaskHookABI = IAVSTaskHookMetaData.ABI
⋮----
// IAVSTaskHook is an auto generated Go binding around an Ethereum contract.
type IAVSTaskHook struct {
	IAVSTaskHookCaller     // Read-only binding to the contract
	IAVSTaskHookTransactor // Write-only binding to the contract
	IAVSTaskHookFilterer   // Log filterer for contract events
}
⋮----
IAVSTaskHookCaller     // Read-only binding to the contract
IAVSTaskHookTransactor // Write-only binding to the contract
IAVSTaskHookFilterer   // Log filterer for contract events
⋮----
// IAVSTaskHookCaller is an auto generated read-only Go binding around an Ethereum contract.
type IAVSTaskHookCaller struct {
	contract *bind.BoundContract // Generic contract wrapper for the low level calls
}
⋮----
contract *bind.BoundContract // Generic contract wrapper for the low level calls
⋮----
// IAVSTaskHookTransactor is an auto generated write-only Go binding around an Ethereum contract.
type IAVSTaskHookTransactor struct {
	contract *bind.BoundContract // Generic contract wrapper for the low level calls
}
⋮----
// IAVSTaskHookFilterer is an auto generated log filtering Go binding around an Ethereum contract events.
type IAVSTaskHookFilterer struct {
	contract *bind.BoundContract // Generic contract wrapper for the low level calls
}
⋮----
// IAVSTaskHookSession is an auto generated Go binding around an Ethereum contract,
// with pre-set call and transact options.
type IAVSTaskHookSession struct {
	Contract     *IAVSTaskHook     // 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
}
⋮----
Contract     *IAVSTaskHook     // 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
⋮----
// IAVSTaskHookCallerSession is an auto generated read-only Go binding around an Ethereum contract,
// with pre-set call options.
type IAVSTaskHookCallerSession struct {
	Contract *IAVSTaskHookCaller // Generic contract caller binding to set the session for
	CallOpts bind.CallOpts       // Call options to use throughout this session
}
⋮----
Contract *IAVSTaskHookCaller // Generic contract caller binding to set the session for
CallOpts bind.CallOpts       // Call options to use throughout this session
⋮----
// IAVSTaskHookTransactorSession is an auto generated write-only Go binding around an Ethereum contract,
// with pre-set transact options.
type IAVSTaskHookTransactorSession struct {
	Contract     *IAVSTaskHookTransactor // Generic contract transactor binding to set the session for
	TransactOpts bind.TransactOpts       // Transaction auth options to use throughout this session
}
⋮----
Contract     *IAVSTaskHookTransactor // Generic contract transactor binding to set the session for
TransactOpts bind.TransactOpts       // Transaction auth options to use throughout this session
⋮----
// IAVSTaskHookRaw is an auto generated low-level Go binding around an Ethereum contract.
type IAVSTaskHookRaw struct {
	Contract *IAVSTaskHook // Generic contract binding to access the raw methods on
}
⋮----
Contract *IAVSTaskHook // Generic contract binding to access the raw methods on
⋮----
// IAVSTaskHookCallerRaw is an auto generated low-level read-only Go binding around an Ethereum contract.
type IAVSTaskHookCallerRaw struct {
	Contract *IAVSTaskHookCaller // Generic read-only contract binding to access the raw methods on
}
⋮----
Contract *IAVSTaskHookCaller // Generic read-only contract binding to access the raw methods on
⋮----
// IAVSTaskHookTransactorRaw is an auto generated low-level write-only Go binding around an Ethereum contract.
type IAVSTaskHookTransactorRaw struct {
	Contract *IAVSTaskHookTransactor // Generic write-only contract binding to access the raw methods on
}
⋮----
Contract *IAVSTaskHookTransactor // Generic write-only contract binding to access the raw methods on
⋮----
// NewIAVSTaskHook creates a new instance of IAVSTaskHook, bound to a specific deployed contract.
func NewIAVSTaskHook(address common.Address, backend bind.ContractBackend) (*IAVSTaskHook, error)
⋮----
// NewIAVSTaskHookCaller creates a new read-only instance of IAVSTaskHook, bound to a specific deployed contract.
func NewIAVSTaskHookCaller(address common.Address, caller bind.ContractCaller) (*IAVSTaskHookCaller, error)
⋮----
// NewIAVSTaskHookTransactor creates a new write-only instance of IAVSTaskHook, bound to a specific deployed contract.
func NewIAVSTaskHookTransactor(address common.Address, transactor bind.ContractTransactor) (*IAVSTaskHookTransactor, error)
⋮----
// NewIAVSTaskHookFilterer creates a new log filterer instance of IAVSTaskHook, bound to a specific deployed contract.
func NewIAVSTaskHookFilterer(address common.Address, filterer bind.ContractFilterer) (*IAVSTaskHookFilterer, error)
⋮----
// bindIAVSTaskHook binds a generic wrapper to an already deployed contract.
func bindIAVSTaskHook(address common.Address, caller bind.ContractCaller, transactor bind.ContractTransactor, filterer bind.ContractFilterer) (*bind.BoundContract, error)
⋮----
// 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 (_IAVSTaskHook *IAVSTaskHookRaw) Call(opts *bind.CallOpts, result *[]interface
⋮----
// Transfer initiates a plain transaction to move funds to the contract, calling
// its default method if one is available.
func (_IAVSTaskHook *IAVSTaskHookRaw) Transfer(opts *bind.TransactOpts) (*types.Transaction, error)
⋮----
// Transact invokes the (paid) contract method with params as input values.
func (_IAVSTaskHook *IAVSTaskHookRaw) Transact(opts *bind.TransactOpts, method string, params ...interface
⋮----
// CalculateTaskFee is a free data retrieval call binding the contract method 0xe06cd27e.
//
// Solidity: function calculateTaskFee((address,(address,uint32),bytes) taskParams) view returns(uint96)
func (_IAVSTaskHook *IAVSTaskHookCaller) CalculateTaskFee(opts *bind.CallOpts, taskParams ITaskMailboxTypesTaskParams) (*big.Int, error)
⋮----
var out []interface{}
⋮----
// ValidatePreTaskCreation is a free data retrieval call binding the contract method 0x51fe3098.
⋮----
// Solidity: function validatePreTaskCreation(address caller, (address,(address,uint32),bytes) taskParams) view returns()
func (_IAVSTaskHook *IAVSTaskHookCaller) ValidatePreTaskCreation(opts *bind.CallOpts, caller common.Address, taskParams ITaskMailboxTypesTaskParams) error
⋮----
// ValidatePreTaskResultSubmission is a free data retrieval call binding the contract method 0xba33565d.
⋮----
// Solidity: function validatePreTaskResultSubmission(address caller, bytes32 taskHash, bytes cert, bytes result) view returns()
func (_IAVSTaskHook *IAVSTaskHookCaller) ValidatePreTaskResultSubmission(opts *bind.CallOpts, caller common.Address, taskHash [32]byte, cert []byte, result []byte) error
⋮----
// HandlePostTaskCreation is a paid mutator transaction binding the contract method 0x09c5c450.
⋮----
// Solidity: function handlePostTaskCreation(bytes32 taskHash) returns()
func (_IAVSTaskHook *IAVSTaskHookTransactor) HandlePostTaskCreation(opts *bind.TransactOpts, taskHash [32]byte) (*types.Transaction, error)
⋮----
// HandlePostTaskResultSubmission is a paid mutator transaction binding the contract method 0xe082467e.
⋮----
// Solidity: function handlePostTaskResultSubmission(address caller, bytes32 taskHash) returns()
func (_IAVSTaskHook *IAVSTaskHookTransactor) HandlePostTaskResultSubmission(opts *bind.TransactOpts, caller common.Address, taskHash [32]byte) (*types.Transaction, error)
````

## File: pkg/bindings/IBackingEigen/binding.go
````go
// Code generated - DO NOT EDIT.
// This file is a generated binding and any manual changes will be lost.
⋮----
package IBackingEigen
⋮----
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"
)
⋮----
"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
)
⋮----
// 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\":\"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.
// Deprecated: Use IBackingEigenMetaData.ABI instead.
var IBackingEigenABI = IBackingEigenMetaData.ABI
⋮----
// IBackingEigen is an auto generated Go binding around an Ethereum contract.
type IBackingEigen struct {
	IBackingEigenCaller     // Read-only binding to the contract
	IBackingEigenTransactor // Write-only binding to the contract
	IBackingEigenFilterer   // Log filterer for contract events
}
⋮----
IBackingEigenCaller     // Read-only binding to the contract
IBackingEigenTransactor // Write-only binding to the contract
IBackingEigenFilterer   // Log filterer for contract events
⋮----
// IBackingEigenCaller is an auto generated read-only Go binding around an Ethereum contract.
type IBackingEigenCaller struct {
	contract *bind.BoundContract // Generic contract wrapper for the low level calls
}
⋮----
contract *bind.BoundContract // Generic contract wrapper for the low level calls
⋮----
// IBackingEigenTransactor is an auto generated write-only Go binding around an Ethereum contract.
type IBackingEigenTransactor struct {
	contract *bind.BoundContract // Generic contract wrapper for the low level calls
}
⋮----
// IBackingEigenFilterer is an auto generated log filtering Go binding around an Ethereum contract events.
type IBackingEigenFilterer struct {
	contract *bind.BoundContract // Generic contract wrapper for the low level calls
}
⋮----
// IBackingEigenSession is an auto generated Go binding around an Ethereum contract,
// with pre-set call and transact options.
type IBackingEigenSession struct {
	Contract     *IBackingEigen    // 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
}
⋮----
Contract     *IBackingEigen    // 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
⋮----
// IBackingEigenCallerSession is an auto generated read-only Go binding around an Ethereum contract,
// with pre-set call options.
type IBackingEigenCallerSession struct {
	Contract *IBackingEigenCaller // Generic contract caller binding to set the session for
	CallOpts bind.CallOpts        // Call options to use throughout this session
}
⋮----
Contract *IBackingEigenCaller // Generic contract caller binding to set the session for
CallOpts bind.CallOpts        // Call options to use throughout this session
⋮----
// IBackingEigenTransactorSession is an auto generated write-only Go binding around an Ethereum contract,
// with pre-set transact options.
type IBackingEigenTransactorSession struct {
	Contract     *IBackingEigenTransactor // Generic contract transactor binding to set the session for
	TransactOpts bind.TransactOpts        // Transaction auth options to use throughout this session
}
⋮----
Contract     *IBackingEigenTransactor // Generic contract transactor binding to set the session for
TransactOpts bind.TransactOpts        // Transaction auth options to use throughout this session
⋮----
// IBackingEigenRaw is an auto generated low-level Go binding around an Ethereum contract.
type IBackingEigenRaw struct {
	Contract *IBackingEigen // Generic contract binding to access the raw methods on
}
⋮----
Contract *IBackingEigen // Generic contract binding to access the raw methods on
⋮----
// IBackingEigenCallerRaw is an auto generated low-level read-only Go binding around an Ethereum contract.
type IBackingEigenCallerRaw struct {
	Contract *IBackingEigenCaller // Generic read-only contract binding to access the raw methods on
}
⋮----
Contract *IBackingEigenCaller // Generic read-only contract binding to access the raw methods on
⋮----
// IBackingEigenTransactorRaw is an auto generated low-level write-only Go binding around an Ethereum contract.
type IBackingEigenTransactorRaw struct {
	Contract *IBackingEigenTransactor // Generic write-only contract binding to access the raw methods on
}
⋮----
Contract *IBackingEigenTransactor // Generic write-only contract binding to access the raw methods on
⋮----
// NewIBackingEigen creates a new instance of IBackingEigen, bound to a specific deployed contract.
func NewIBackingEigen(address common.Address, backend bind.ContractBackend) (*IBackingEigen, error)
⋮----
// NewIBackingEigenCaller creates a new read-only instance of IBackingEigen, bound to a specific deployed contract.
func NewIBackingEigenCaller(address common.Address, caller bind.ContractCaller) (*IBackingEigenCaller, error)
⋮----
// NewIBackingEigenTransactor creates a new write-only instance of IBackingEigen, bound to a specific deployed contract.
func NewIBackingEigenTransactor(address common.Address, transactor bind.ContractTransactor) (*IBackingEigenTransactor, error)
⋮----
// NewIBackingEigenFilterer creates a new log filterer instance of IBackingEigen, bound to a specific deployed contract.
func NewIBackingEigenFilterer(address common.Address, filterer bind.ContractFilterer) (*IBackingEigenFilterer, error)
⋮----
// bindIBackingEigen binds a generic wrapper to an already deployed contract.
func bindIBackingEigen(address common.Address, caller bind.ContractCaller, transactor bind.ContractTransactor, filterer bind.ContractFilterer) (*bind.BoundContract, error)
⋮----
// 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 (_IBackingEigen *IBackingEigenRaw) Call(opts *bind.CallOpts, result *[]interface
⋮----
// Transfer initiates a plain transaction to move funds to the contract, calling
// its default method if one is available.
func (_IBackingEigen *IBackingEigenRaw) Transfer(opts *bind.TransactOpts) (*types.Transaction, error)
⋮----
// Transact invokes the (paid) contract method with params as input values.
func (_IBackingEigen *IBackingEigenRaw) Transact(opts *bind.TransactOpts, method string, params ...interface
⋮----
// CLOCKMODE is a free data retrieval call binding the contract method 0x4bf5d7e9.
//
// Solidity: function CLOCK_MODE() pure returns(string)
func (_IBackingEigen *IBackingEigenCaller) CLOCKMODE(opts *bind.CallOpts) (string, error)
⋮----
var out []interface{}
⋮----
// EIGEN is a free data retrieval call binding the contract method 0xfdc371ce.
⋮----
// Solidity: function EIGEN() view returns(address)
func (_IBackingEigen *IBackingEigenCaller) EIGEN(opts *bind.CallOpts) (common.Address, error)
⋮----
// Allowance is a free data retrieval call binding the contract method 0xdd62ed3e.
⋮----
// Solidity: function allowance(address owner, address spender) view returns(uint256)
func (_IBackingEigen *IBackingEigenCaller) Allowance(opts *bind.CallOpts, owner common.Address, spender common.Address) (*big.Int, error)
⋮----
// BalanceOf is a free data retrieval call binding the contract method 0x70a08231.
⋮----
// Solidity: function balanceOf(address account) view returns(uint256)
func (_IBackingEigen *IBackingEigenCaller) BalanceOf(opts *bind.CallOpts, account common.Address) (*big.Int, error)
⋮----
// Clock is a free data retrieval call binding the contract method 0x91ddadf4.
⋮----
// Solidity: function clock() view returns(uint48)
func (_IBackingEigen *IBackingEigenCaller) Clock(opts *bind.CallOpts) (*big.Int, error)
⋮----
// 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)
⋮----
// TotalSupply is a free data retrieval call binding the contract method 0x18160ddd.
⋮----
// Solidity: function totalSupply() view returns(uint256)
func (_IBackingEigen *IBackingEigenCaller) TotalSupply(opts *bind.CallOpts) (*big.Int, error)
⋮----
// TransferRestrictionsDisabledAfter is a free data retrieval call binding the contract method 0x9aec4bae.
⋮----
// Solidity: function transferRestrictionsDisabledAfter() view returns(uint256)
func (_IBackingEigen *IBackingEigenCaller) TransferRestrictionsDisabledAfter(opts *bind.CallOpts) (*big.Int, error)
⋮----
// Approve is a paid mutator transaction binding the contract method 0x095ea7b3.
⋮----
// Solidity: function approve(address spender, uint256 amount) returns(bool)
func (_IBackingEigen *IBackingEigenTransactor) Approve(opts *bind.TransactOpts, spender common.Address, amount *big.Int) (*types.Transaction, error)
⋮----
// Burn is a paid mutator transaction binding the contract method 0x42966c68.
⋮----
// Solidity: function burn(uint256 amount) returns()
func (_IBackingEigen *IBackingEigenTransactor) Burn(opts *bind.TransactOpts, amount *big.Int) (*types.Transaction, error)
⋮----
// DisableTransferRestrictions is a paid mutator transaction binding the contract method 0xeb415f45.
⋮----
// Solidity: function disableTransferRestrictions() returns()
func (_IBackingEigen *IBackingEigenTransactor) DisableTransferRestrictions(opts *bind.TransactOpts) (*types.Transaction, error)
⋮----
// Initialize is a paid mutator transaction binding the contract method 0xc4d66de8.
⋮----
// Solidity: function initialize(address initialOwner) returns()
func (_IBackingEigen *IBackingEigenTransactor) Initialize(opts *bind.TransactOpts, initialOwner common.Address) (*types.Transaction, error)
⋮----
// Mint is a paid mutator transaction binding the contract method 0x40c10f19.
⋮----
// Solidity: function mint(address to, uint256 amount) returns()
func (_IBackingEigen *IBackingEigenTransactor) Mint(opts *bind.TransactOpts, to common.Address, amount *big.Int) (*types.Transaction, error)
⋮----
// SetAllowedFrom is a paid mutator transaction binding the contract method 0x1ffacdef.
⋮----
// Solidity: function setAllowedFrom(address from, bool isAllowedFrom) returns()
func (_IBackingEigen *IBackingEigenTransactor) SetAllowedFrom(opts *bind.TransactOpts, from common.Address, isAllowedFrom bool) (*types.Transaction, error)
⋮----
// SetAllowedTo is a paid mutator transaction binding the contract method 0xb8c25594.
⋮----
// Solidity: function setAllowedTo(address to, bool isAllowedTo) returns()
func (_IBackingEigen *IBackingEigenTransactor) SetAllowedTo(opts *bind.TransactOpts, to common.Address, isAllowedTo bool) (*types.Transaction, error)
⋮----
// SetIsMinter is a paid mutator transaction binding the contract method 0x66eb399f.
⋮----
// Solidity: function setIsMinter(address minterAddress, bool newStatus) returns()
func (_IBackingEigen *IBackingEigenTransactor) SetIsMinter(opts *bind.TransactOpts, minterAddress common.Address, newStatus bool) (*types.Transaction, error)
⋮----
// Transfer is a paid mutator transaction binding the contract method 0xa9059cbb.
⋮----
// Solidity: function transfer(address to, uint256 amount) returns(bool)
⋮----
// TransferFrom is a paid mutator transaction binding the contract method 0x23b872dd.
⋮----
// Solidity: function transferFrom(address from, address to, uint256 amount) returns(bool)
func (_IBackingEigen *IBackingEigenTransactor) TransferFrom(opts *bind.TransactOpts, from common.Address, to common.Address, amount *big.Int) (*types.Transaction, error)
⋮----
// IBackingEigenApprovalIterator is returned from FilterApproval and is used to iterate over the raw logs and unpacked data for Approval events raised by the IBackingEigen contract.
type IBackingEigenApprovalIterator struct {
	Event *IBackingEigenApproval // 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
}
⋮----
Event *IBackingEigenApproval // 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 *IBackingEigenApprovalIterator) Next() bool
⋮----
// If the iterator failed, stop iterating
⋮----
// If the iterator completed, deliver directly whatever's available
⋮----
// Iterator still in progress, wait for either a data or an error event
⋮----
// Error returns any retrieval or parsing error occurred during filtering.
func (it *IBackingEigenApprovalIterator) Error() error
⋮----
// Close terminates the iteration process, releasing any pending underlying
// resources.
func (it *IBackingEigenApprovalIterator) Close() error
⋮----
// IBackingEigenApproval represents a Approval event raised by the IBackingEigen contract.
type IBackingEigenApproval struct {
	Owner   common.Address
	Spender common.Address
	Value   *big.Int
	Raw     types.Log // Blockchain specific contextual infos
}
⋮----
Raw     types.Log // Blockchain specific contextual infos
⋮----
// FilterApproval is a free log retrieval operation binding the contract event 0x8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925.
⋮----
// Solidity: event Approval(address indexed owner, address indexed spender, uint256 value)
func (_IBackingEigen *IBackingEigenFilterer) FilterApproval(opts *bind.FilterOpts, owner []common.Address, spender []common.Address) (*IBackingEigenApprovalIterator, error)
⋮----
var ownerRule []interface{}
⋮----
var spenderRule []interface{}
⋮----
// WatchApproval is a free log subscription operation binding the contract event 0x8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925.
⋮----
func (_IBackingEigen *IBackingEigenFilterer) WatchApproval(opts *bind.WatchOpts, sink chan<- *IBackingEigenApproval, owner []common.Address, spender []common.Address) (event.Subscription, error)
⋮----
// New log arrived, parse the event and forward to the user
⋮----
// ParseApproval is a log parse operation binding the contract event 0x8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925.
⋮----
func (_IBackingEigen *IBackingEigenFilterer) ParseApproval(log types.Log) (*IBackingEigenApproval, error)
⋮----
// IBackingEigenTransferIterator is returned from FilterTransfer and is used to iterate over the raw logs and unpacked data for Transfer events raised by the IBackingEigen contract.
type IBackingEigenTransferIterator struct {
	Event *IBackingEigenTransfer // 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
}
⋮----
Event *IBackingEigenTransfer // Event containing the contract specifics and raw log
⋮----
// IBackingEigenTransfer represents a Transfer event raised by the IBackingEigen contract.
type IBackingEigenTransfer struct {
	From  common.Address
	To    common.Address
	Value *big.Int
	Raw   types.Log // Blockchain specific contextual infos
}
⋮----
Raw   types.Log // Blockchain specific contextual infos
⋮----
// FilterTransfer is a free log retrieval operation binding the contract event 0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef.
⋮----
// Solidity: event Transfer(address indexed from, address indexed to, uint256 value)
func (_IBackingEigen *IBackingEigenFilterer) FilterTransfer(opts *bind.FilterOpts, from []common.Address, to []common.Address) (*IBackingEigenTransferIterator, error)
⋮----
var fromRule []interface{}
⋮----
var toRule []interface{}
⋮----
// WatchTransfer is a free log subscription operation binding the contract event 0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef.
⋮----
func (_IBackingEigen *IBackingEigenFilterer) WatchTransfer(opts *bind.WatchOpts, sink chan<- *IBackingEigenTransfer, from []common.Address, to []common.Address) (event.Subscription, error)
⋮----
// ParseTransfer is a log parse operation binding the contract event 0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef.
⋮----
func (_IBackingEigen *IBackingEigenFilterer) ParseTransfer(log types.Log) (*IBackingEigenTransfer, error)
````

## File: pkg/bindings/IBaseCertificateVerifier/binding.go
````go
// Code generated - DO NOT EDIT.
// This file is a generated binding and any manual changes will be lost.
⋮----
package IBaseCertificateVerifier
⋮----
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"
)
⋮----
"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
)
⋮----
// OperatorSet is an auto generated low-level Go binding around an user-defined struct.
type OperatorSet struct {
	Avs common.Address
	Id  uint32
}
⋮----
// IBaseCertificateVerifierMetaData contains all meta data concerning the IBaseCertificateVerifier contract.
var IBaseCertificateVerifierMetaData = &bind.MetaData{
	ABI: "[{\"type\":\"function\",\"name\":\"getOperatorCount\",\"inputs\":[{\"name\":\"operatorSet\",\"type\":\"tuple\",\"internalType\":\"structOperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]},{\"name\":\"referenceTimestamp\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getOperatorSetOwner\",\"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\":\"getTotalStakeWeights\",\"inputs\":[{\"name\":\"operatorSet\",\"type\":\"tuple\",\"internalType\":\"structOperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]},{\"name\":\"referenceTimestamp\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256[]\",\"internalType\":\"uint256[]\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"isReferenceTimestampSet\",\"inputs\":[{\"name\":\"operatorSet\",\"type\":\"tuple\",\"internalType\":\"structOperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]},{\"name\":\"referenceTimestamp\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"latestReferenceTimestamp\",\"inputs\":[{\"name\":\"operatorSet\",\"type\":\"tuple\",\"internalType\":\"structOperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]}],\"outputs\":[{\"name\":\"\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"maxOperatorTableStaleness\",\"inputs\":[{\"name\":\"operatorSet\",\"type\":\"tuple\",\"internalType\":\"structOperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]}],\"outputs\":[{\"name\":\"\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"stateMutability\":\"view\"},{\"type\":\"event\",\"name\":\"MaxStalenessPeriodUpdated\",\"inputs\":[{\"name\":\"operatorSet\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structOperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]},{\"name\":\"maxStalenessPeriod\",\"type\":\"uint32\",\"indexed\":false,\"internalType\":\"uint32\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"OperatorSetOwnerUpdated\",\"inputs\":[{\"name\":\"operatorSet\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structOperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]},{\"name\":\"owner\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"error\",\"name\":\"ArrayLengthMismatch\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"CertificateStale\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"OnlyTableUpdater\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ReferenceTimestampDoesNotExist\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"RootDisabled\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"TableUpdateStale\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"VerificationFailed\",\"inputs\":[]}]",
}
⋮----
// IBaseCertificateVerifierABI is the input ABI used to generate the binding from.
// Deprecated: Use IBaseCertificateVerifierMetaData.ABI instead.
var IBaseCertificateVerifierABI = IBaseCertificateVerifierMetaData.ABI
⋮----
// IBaseCertificateVerifier is an auto generated Go binding around an Ethereum contract.
type IBaseCertificateVerifier struct {
	IBaseCertificateVerifierCaller     // Read-only binding to the contract
	IBaseCertificateVerifierTransactor // Write-only binding to the contract
	IBaseCertificateVerifierFilterer   // Log filterer for contract events
}
⋮----
IBaseCertificateVerifierCaller     // Read-only binding to the contract
IBaseCertificateVerifierTransactor // Write-only binding to the contract
IBaseCertificateVerifierFilterer   // Log filterer for contract events
⋮----
// IBaseCertificateVerifierCaller is an auto generated read-only Go binding around an Ethereum contract.
type IBaseCertificateVerifierCaller struct {
	contract *bind.BoundContract // Generic contract wrapper for the low level calls
}
⋮----
contract *bind.BoundContract // Generic contract wrapper for the low level calls
⋮----
// IBaseCertificateVerifierTransactor is an auto generated write-only Go binding around an Ethereum contract.
type IBaseCertificateVerifierTransactor struct {
	contract *bind.BoundContract // Generic contract wrapper for the low level calls
}
⋮----
// IBaseCertificateVerifierFilterer is an auto generated log filtering Go binding around an Ethereum contract events.
type IBaseCertificateVerifierFilterer struct {
	contract *bind.BoundContract // Generic contract wrapper for the low level calls
}
⋮----
// IBaseCertificateVerifierSession is an auto generated Go binding around an Ethereum contract,
// with pre-set call and transact options.
type IBaseCertificateVerifierSession struct {
	Contract     *IBaseCertificateVerifier // 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
}
⋮----
Contract     *IBaseCertificateVerifier // 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
⋮----
// IBaseCertificateVerifierCallerSession is an auto generated read-only Go binding around an Ethereum contract,
// with pre-set call options.
type IBaseCertificateVerifierCallerSession struct {
	Contract *IBaseCertificateVerifierCaller // Generic contract caller binding to set the session for
	CallOpts bind.CallOpts                   // Call options to use throughout this session
}
⋮----
Contract *IBaseCertificateVerifierCaller // Generic contract caller binding to set the session for
CallOpts bind.CallOpts                   // Call options to use throughout this session
⋮----
// IBaseCertificateVerifierTransactorSession is an auto generated write-only Go binding around an Ethereum contract,
// with pre-set transact options.
type IBaseCertificateVerifierTransactorSession struct {
	Contract     *IBaseCertificateVerifierTransactor // Generic contract transactor binding to set the session for
	TransactOpts bind.TransactOpts                   // Transaction auth options to use throughout this session
}
⋮----
Contract     *IBaseCertificateVerifierTransactor // Generic contract transactor binding to set the session for
TransactOpts bind.TransactOpts                   // Transaction auth options to use throughout this session
⋮----
// IBaseCertificateVerifierRaw is an auto generated low-level Go binding around an Ethereum contract.
type IBaseCertificateVerifierRaw struct {
	Contract *IBaseCertificateVerifier // Generic contract binding to access the raw methods on
}
⋮----
Contract *IBaseCertificateVerifier // Generic contract binding to access the raw methods on
⋮----
// IBaseCertificateVerifierCallerRaw is an auto generated low-level read-only Go binding around an Ethereum contract.
type IBaseCertificateVerifierCallerRaw struct {
	Contract *IBaseCertificateVerifierCaller // Generic read-only contract binding to access the raw methods on
}
⋮----
Contract *IBaseCertificateVerifierCaller // Generic read-only contract binding to access the raw methods on
⋮----
// IBaseCertificateVerifierTransactorRaw is an auto generated low-level write-only Go binding around an Ethereum contract.
type IBaseCertificateVerifierTransactorRaw struct {
	Contract *IBaseCertificateVerifierTransactor // Generic write-only contract binding to access the raw methods on
}
⋮----
Contract *IBaseCertificateVerifierTransactor // Generic write-only contract binding to access the raw methods on
⋮----
// NewIBaseCertificateVerifier creates a new instance of IBaseCertificateVerifier, bound to a specific deployed contract.
func NewIBaseCertificateVerifier(address common.Address, backend bind.ContractBackend) (*IBaseCertificateVerifier, error)
⋮----
// NewIBaseCertificateVerifierCaller creates a new read-only instance of IBaseCertificateVerifier, bound to a specific deployed contract.
func NewIBaseCertificateVerifierCaller(address common.Address, caller bind.ContractCaller) (*IBaseCertificateVerifierCaller, error)
⋮----
// NewIBaseCertificateVerifierTransactor creates a new write-only instance of IBaseCertificateVerifier, bound to a specific deployed contract.
func NewIBaseCertificateVerifierTransactor(address common.Address, transactor bind.ContractTransactor) (*IBaseCertificateVerifierTransactor, error)
⋮----
// NewIBaseCertificateVerifierFilterer creates a new log filterer instance of IBaseCertificateVerifier, bound to a specific deployed contract.
func NewIBaseCertificateVerifierFilterer(address common.Address, filterer bind.ContractFilterer) (*IBaseCertificateVerifierFilterer, error)
⋮----
// bindIBaseCertificateVerifier binds a generic wrapper to an already deployed contract.
func bindIBaseCertificateVerifier(address common.Address, caller bind.ContractCaller, transactor bind.ContractTransactor, filterer bind.ContractFilterer) (*bind.BoundContract, error)
⋮----
// 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 (_IBaseCertificateVerifier *IBaseCertificateVerifierRaw) Call(opts *bind.CallOpts, result *[]interface
⋮----
// Transfer initiates a plain transaction to move funds to the contract, calling
// its default method if one is available.
func (_IBaseCertificateVerifier *IBaseCertificateVerifierRaw) Transfer(opts *bind.TransactOpts) (*types.Transaction, error)
⋮----
// Transact invokes the (paid) contract method with params as input values.
func (_IBaseCertificateVerifier *IBaseCertificateVerifierRaw) Transact(opts *bind.TransactOpts, method string, params ...interface
⋮----
// GetOperatorCount is a free data retrieval call binding the contract method 0x23c2a3cb.
//
// Solidity: function getOperatorCount((address,uint32) operatorSet, uint32 referenceTimestamp) view returns(uint256)
func (_IBaseCertificateVerifier *IBaseCertificateVerifierCaller) GetOperatorCount(opts *bind.CallOpts, operatorSet OperatorSet, referenceTimestamp uint32) (*big.Int, error)
⋮----
var out []interface{}
⋮----
// GetOperatorSetOwner is a free data retrieval call binding the contract method 0x84818920.
⋮----
// Solidity: function getOperatorSetOwner((address,uint32) operatorSet) view returns(address)
func (_IBaseCertificateVerifier *IBaseCertificateVerifierCaller) GetOperatorSetOwner(opts *bind.CallOpts, operatorSet OperatorSet) (common.Address, error)
⋮----
// GetTotalStakeWeights is a free data retrieval call binding the contract method 0x7d1d1f5b.
⋮----
// Solidity: function getTotalStakeWeights((address,uint32) operatorSet, uint32 referenceTimestamp) view returns(uint256[])
func (_IBaseCertificateVerifier *IBaseCertificateVerifierCaller) GetTotalStakeWeights(opts *bind.CallOpts, operatorSet OperatorSet, referenceTimestamp uint32) ([]*big.Int, error)
⋮----
// IsReferenceTimestampSet is a free data retrieval call binding the contract method 0xcd83a72b.
⋮----
// Solidity: function isReferenceTimestampSet((address,uint32) operatorSet, uint32 referenceTimestamp) view returns(bool)
func (_IBaseCertificateVerifier *IBaseCertificateVerifierCaller) IsReferenceTimestampSet(opts *bind.CallOpts, operatorSet OperatorSet, referenceTimestamp uint32) (bool, error)
⋮----
// LatestReferenceTimestamp is a free data retrieval call binding the contract method 0x5ddb9b5b.
⋮----
// Solidity: function latestReferenceTimestamp((address,uint32) operatorSet) view returns(uint32)
func (_IBaseCertificateVerifier *IBaseCertificateVerifierCaller) LatestReferenceTimestamp(opts *bind.CallOpts, operatorSet OperatorSet) (uint32, error)
⋮----
// MaxOperatorTableStaleness is a free data retrieval call binding the contract method 0x6141879e.
⋮----
// Solidity: function maxOperatorTableStaleness((address,uint32) operatorSet) view returns(uint32)
func (_IBaseCertificateVerifier *IBaseCertificateVerifierCaller) MaxOperatorTableStaleness(opts *bind.CallOpts, operatorSet OperatorSet) (uint32, error)
⋮----
// IBaseCertificateVerifierMaxStalenessPeriodUpdatedIterator is returned from FilterMaxStalenessPeriodUpdated and is used to iterate over the raw logs and unpacked data for MaxStalenessPeriodUpdated events raised by the IBaseCertificateVerifier contract.
type IBaseCertificateVerifierMaxStalenessPeriodUpdatedIterator struct {
	Event *IBaseCertificateVerifierMaxStalenessPeriodUpdated // 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
}
⋮----
Event *IBaseCertificateVerifierMaxStalenessPeriodUpdated // 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 *IBaseCertificateVerifierMaxStalenessPeriodUpdatedIterator) Next() bool
⋮----
// If the iterator failed, stop iterating
⋮----
// If the iterator completed, deliver directly whatever's available
⋮----
// Iterator still in progress, wait for either a data or an error event
⋮----
// Error returns any retrieval or parsing error occurred during filtering.
func (it *IBaseCertificateVerifierMaxStalenessPeriodUpdatedIterator) Error() error
⋮----
// Close terminates the iteration process, releasing any pending underlying
// resources.
func (it *IBaseCertificateVerifierMaxStalenessPeriodUpdatedIterator) Close() error
⋮----
// IBaseCertificateVerifierMaxStalenessPeriodUpdated represents a MaxStalenessPeriodUpdated event raised by the IBaseCertificateVerifier contract.
type IBaseCertificateVerifierMaxStalenessPeriodUpdated struct {
	OperatorSet        OperatorSet
	MaxStalenessPeriod uint32
	Raw                types.Log // Blockchain specific contextual infos
}
⋮----
Raw                types.Log // Blockchain specific contextual infos
⋮----
// FilterMaxStalenessPeriodUpdated is a free log retrieval operation binding the contract event 0x28539469fbbc8a5482e60966bf9376f7b9d25b2f0a65a9976f6baa3f0e3788da.
⋮----
// Solidity: event MaxStalenessPeriodUpdated((address,uint32) operatorSet, uint32 maxStalenessPeriod)
func (_IBaseCertificateVerifier *IBaseCertificateVerifierFilterer) FilterMaxStalenessPeriodUpdated(opts *bind.FilterOpts) (*IBaseCertificateVerifierMaxStalenessPeriodUpdatedIterator, error)
⋮----
// WatchMaxStalenessPeriodUpdated is a free log subscription operation binding the contract event 0x28539469fbbc8a5482e60966bf9376f7b9d25b2f0a65a9976f6baa3f0e3788da.
⋮----
func (_IBaseCertificateVerifier *IBaseCertificateVerifierFilterer) WatchMaxStalenessPeriodUpdated(opts *bind.WatchOpts, sink chan<- *IBaseCertificateVerifierMaxStalenessPeriodUpdated) (event.Subscription, error)
⋮----
// New log arrived, parse the event and forward to the user
⋮----
// ParseMaxStalenessPeriodUpdated is a log parse operation binding the contract event 0x28539469fbbc8a5482e60966bf9376f7b9d25b2f0a65a9976f6baa3f0e3788da.
⋮----
func (_IBaseCertificateVerifier *IBaseCertificateVerifierFilterer) ParseMaxStalenessPeriodUpdated(log types.Log) (*IBaseCertificateVerifierMaxStalenessPeriodUpdated, error)
⋮----
// IBaseCertificateVerifierOperatorSetOwnerUpdatedIterator is returned from FilterOperatorSetOwnerUpdated and is used to iterate over the raw logs and unpacked data for OperatorSetOwnerUpdated events raised by the IBaseCertificateVerifier contract.
type IBaseCertificateVerifierOperatorSetOwnerUpdatedIterator struct {
	Event *IBaseCertificateVerifierOperatorSetOwnerUpdated // 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
}
⋮----
Event *IBaseCertificateVerifierOperatorSetOwnerUpdated // Event containing the contract specifics and raw log
⋮----
// IBaseCertificateVerifierOperatorSetOwnerUpdated represents a OperatorSetOwnerUpdated event raised by the IBaseCertificateVerifier contract.
type IBaseCertificateVerifierOperatorSetOwnerUpdated struct {
	OperatorSet OperatorSet
	Owner       common.Address
	Raw         types.Log // Blockchain specific contextual infos
}
⋮----
Raw         types.Log // Blockchain specific contextual infos
⋮----
// FilterOperatorSetOwnerUpdated is a free log retrieval operation binding the contract event 0x806dc367095c0baf953d7144b7c4376261675ee0b4e0da2761e43673051c7375.
⋮----
// Solidity: event OperatorSetOwnerUpdated((address,uint32) operatorSet, address owner)
func (_IBaseCertificateVerifier *IBaseCertificateVerifierFilterer) FilterOperatorSetOwnerUpdated(opts *bind.FilterOpts) (*IBaseCertificateVerifierOperatorSetOwnerUpdatedIterator, error)
⋮----
// WatchOperatorSetOwnerUpdated is a free log subscription operation binding the contract event 0x806dc367095c0baf953d7144b7c4376261675ee0b4e0da2761e43673051c7375.
⋮----
func (_IBaseCertificateVerifier *IBaseCertificateVerifierFilterer) WatchOperatorSetOwnerUpdated(opts *bind.WatchOpts, sink chan<- *IBaseCertificateVerifierOperatorSetOwnerUpdated) (event.Subscription, error)
⋮----
// ParseOperatorSetOwnerUpdated is a log parse operation binding the contract event 0x806dc367095c0baf953d7144b7c4376261675ee0b4e0da2761e43673051c7375.
⋮----
func (_IBaseCertificateVerifier *IBaseCertificateVerifierFilterer) ParseOperatorSetOwnerUpdated(log types.Log) (*IBaseCertificateVerifierOperatorSetOwnerUpdated, error)
````

## File: pkg/bindings/IBN254CertificateVerifier/binding.go
````go
// Code generated - DO NOT EDIT.
// This file is a generated binding and any manual changes will be lost.
⋮----
package IBN254CertificateVerifier
⋮----
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"
)
⋮----
"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
)
⋮----
// BN254G1Point is an auto generated low-level Go binding around an user-defined struct.
type BN254G1Point struct {
	X *big.Int
	Y *big.Int
}
⋮----
// BN254G2Point is an auto generated low-level Go binding around an user-defined struct.
type BN254G2Point struct {
	X [2]*big.Int
	Y [2]*big.Int
}
⋮----
// IBN254CertificateVerifierTypesBN254Certificate is an auto generated low-level Go binding around an user-defined struct.
type IBN254CertificateVerifierTypesBN254Certificate struct {
	ReferenceTimestamp uint32
	MessageHash        [32]byte
	Signature          BN254G1Point
	Apk                BN254G2Point
	NonSignerWitnesses []IBN254CertificateVerifierTypesBN254OperatorInfoWitness
}
⋮----
// IBN254CertificateVerifierTypesBN254OperatorInfoWitness is an auto generated low-level Go binding around an user-defined struct.
type IBN254CertificateVerifierTypesBN254OperatorInfoWitness struct {
	OperatorIndex     uint32
	OperatorInfoProof []byte
	OperatorInfo      IOperatorTableCalculatorTypesBN254OperatorInfo
}
⋮----
// ICrossChainRegistryTypesOperatorSetConfig is an auto generated low-level Go binding around an user-defined struct.
type ICrossChainRegistryTypesOperatorSetConfig struct {
	Owner              common.Address
	MaxStalenessPeriod uint32
}
⋮----
// IOperatorTableCalculatorTypesBN254OperatorInfo is an auto generated low-level Go binding around an user-defined struct.
type IOperatorTableCalculatorTypesBN254OperatorInfo struct {
	Pubkey  BN254G1Point
	Weights []*big.Int
}
⋮----
// IOperatorTableCalculatorTypesBN254OperatorSetInfo is an auto generated low-level Go binding around an user-defined struct.
type IOperatorTableCalculatorTypesBN254OperatorSetInfo struct {
	OperatorInfoTreeRoot [32]byte
	NumOperators         *big.Int
	AggregatePubkey      BN254G1Point
	TotalWeights         []*big.Int
}
⋮----
// OperatorSet is an auto generated low-level Go binding around an user-defined struct.
type OperatorSet struct {
	Avs common.Address
	Id  uint32
}
⋮----
// IBN254CertificateVerifierMetaData contains all meta data concerning the IBN254CertificateVerifier contract.
var IBN254CertificateVerifierMetaData = &bind.MetaData{
	ABI: "[{\"type\":\"function\",\"name\":\"calculateCertificateDigest\",\"inputs\":[{\"name\":\"referenceTimestamp\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"messageHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"pure\"},{\"type\":\"function\",\"name\":\"getNonsignerOperatorInfo\",\"inputs\":[{\"name\":\"operatorSet\",\"type\":\"tuple\",\"internalType\":\"structOperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]},{\"name\":\"referenceTimestamp\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"operatorIndex\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"tuple\",\"internalType\":\"structIOperatorTableCalculatorTypes.BN254OperatorInfo\",\"components\":[{\"name\":\"pubkey\",\"type\":\"tuple\",\"internalType\":\"structBN254.G1Point\",\"components\":[{\"name\":\"X\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"Y\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]},{\"name\":\"weights\",\"type\":\"uint256[]\",\"internalType\":\"uint256[]\"}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getOperatorCount\",\"inputs\":[{\"name\":\"operatorSet\",\"type\":\"tuple\",\"internalType\":\"structOperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]},{\"name\":\"referenceTimestamp\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getOperatorSetInfo\",\"inputs\":[{\"name\":\"operatorSet\",\"type\":\"tuple\",\"internalType\":\"structOperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]},{\"name\":\"referenceTimestamp\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"tuple\",\"internalType\":\"structIOperatorTableCalculatorTypes.BN254OperatorSetInfo\",\"components\":[{\"name\":\"operatorInfoTreeRoot\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"numOperators\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"aggregatePubkey\",\"type\":\"tuple\",\"internalType\":\"structBN254.G1Point\",\"components\":[{\"name\":\"X\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"Y\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]},{\"name\":\"totalWeights\",\"type\":\"uint256[]\",\"internalType\":\"uint256[]\"}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getOperatorSetOwner\",\"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\":\"getTotalStakeWeights\",\"inputs\":[{\"name\":\"operatorSet\",\"type\":\"tuple\",\"internalType\":\"structOperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]},{\"name\":\"referenceTimestamp\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256[]\",\"internalType\":\"uint256[]\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"isNonsignerCached\",\"inputs\":[{\"name\":\"operatorSet\",\"type\":\"tuple\",\"internalType\":\"structOperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]},{\"name\":\"referenceTimestamp\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"operatorIndex\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"isReferenceTimestampSet\",\"inputs\":[{\"name\":\"operatorSet\",\"type\":\"tuple\",\"internalType\":\"structOperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]},{\"name\":\"referenceTimestamp\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"latestReferenceTimestamp\",\"inputs\":[{\"name\":\"operatorSet\",\"type\":\"tuple\",\"internalType\":\"structOperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]}],\"outputs\":[{\"name\":\"\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"maxOperatorTableStaleness\",\"inputs\":[{\"name\":\"operatorSet\",\"type\":\"tuple\",\"internalType\":\"structOperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]}],\"outputs\":[{\"name\":\"\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"trySignatureVerification\",\"inputs\":[{\"name\":\"msgHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"aggPubkey\",\"type\":\"tuple\",\"internalType\":\"structBN254.G1Point\",\"components\":[{\"name\":\"X\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"Y\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]},{\"name\":\"apkG2\",\"type\":\"tuple\",\"internalType\":\"structBN254.G2Point\",\"components\":[{\"name\":\"X\",\"type\":\"uint256[2]\",\"internalType\":\"uint256[2]\"},{\"name\":\"Y\",\"type\":\"uint256[2]\",\"internalType\":\"uint256[2]\"}]},{\"name\":\"signature\",\"type\":\"tuple\",\"internalType\":\"structBN254.G1Point\",\"components\":[{\"name\":\"X\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"Y\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]}],\"outputs\":[{\"name\":\"pairingSuccessful\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"signatureValid\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"updateOperatorTable\",\"inputs\":[{\"name\":\"operatorSet\",\"type\":\"tuple\",\"internalType\":\"structOperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]},{\"name\":\"referenceTimestamp\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"operatorSetInfo\",\"type\":\"tuple\",\"internalType\":\"structIOperatorTableCalculatorTypes.BN254OperatorSetInfo\",\"components\":[{\"name\":\"operatorInfoTreeRoot\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"numOperators\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"aggregatePubkey\",\"type\":\"tuple\",\"internalType\":\"structBN254.G1Point\",\"components\":[{\"name\":\"X\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"Y\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]},{\"name\":\"totalWeights\",\"type\":\"uint256[]\",\"internalType\":\"uint256[]\"}]},{\"name\":\"operatorSetConfig\",\"type\":\"tuple\",\"internalType\":\"structICrossChainRegistryTypes.OperatorSetConfig\",\"components\":[{\"name\":\"owner\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"maxStalenessPeriod\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"verifyCertificate\",\"inputs\":[{\"name\":\"operatorSet\",\"type\":\"tuple\",\"internalType\":\"structOperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]},{\"name\":\"cert\",\"type\":\"tuple\",\"internalType\":\"structIBN254CertificateVerifierTypes.BN254Certificate\",\"components\":[{\"name\":\"referenceTimestamp\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"messageHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"signature\",\"type\":\"tuple\",\"internalType\":\"structBN254.G1Point\",\"components\":[{\"name\":\"X\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"Y\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]},{\"name\":\"apk\",\"type\":\"tuple\",\"internalType\":\"structBN254.G2Point\",\"components\":[{\"name\":\"X\",\"type\":\"uint256[2]\",\"internalType\":\"uint256[2]\"},{\"name\":\"Y\",\"type\":\"uint256[2]\",\"internalType\":\"uint256[2]\"}]},{\"name\":\"nonSignerWitnesses\",\"type\":\"tuple[]\",\"internalType\":\"structIBN254CertificateVerifierTypes.BN254OperatorInfoWitness[]\",\"components\":[{\"name\":\"operatorIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"operatorInfoProof\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"operatorInfo\",\"type\":\"tuple\",\"internalType\":\"structIOperatorTableCalculatorTypes.BN254OperatorInfo\",\"components\":[{\"name\":\"pubkey\",\"type\":\"tuple\",\"internalType\":\"structBN254.G1Point\",\"components\":[{\"name\":\"X\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"Y\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]},{\"name\":\"weights\",\"type\":\"uint256[]\",\"internalType\":\"uint256[]\"}]}]}]}],\"outputs\":[{\"name\":\"totalSignedStakeWeights\",\"type\":\"uint256[]\",\"internalType\":\"uint256[]\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"verifyCertificateNominal\",\"inputs\":[{\"name\":\"operatorSet\",\"type\":\"tuple\",\"internalType\":\"structOperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]},{\"name\":\"cert\",\"type\":\"tuple\",\"internalType\":\"structIBN254CertificateVerifierTypes.BN254Certificate\",\"components\":[{\"name\":\"referenceTimestamp\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"messageHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"signature\",\"type\":\"tuple\",\"internalType\":\"structBN254.G1Point\",\"components\":[{\"name\":\"X\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"Y\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]},{\"name\":\"apk\",\"type\":\"tuple\",\"internalType\":\"structBN254.G2Point\",\"components\":[{\"name\":\"X\",\"type\":\"uint256[2]\",\"internalType\":\"uint256[2]\"},{\"name\":\"Y\",\"type\":\"uint256[2]\",\"internalType\":\"uint256[2]\"}]},{\"name\":\"nonSignerWitnesses\",\"type\":\"tuple[]\",\"internalType\":\"structIBN254CertificateVerifierTypes.BN254OperatorInfoWitness[]\",\"components\":[{\"name\":\"operatorIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"operatorInfoProof\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"operatorInfo\",\"type\":\"tuple\",\"internalType\":\"structIOperatorTableCalculatorTypes.BN254OperatorInfo\",\"components\":[{\"name\":\"pubkey\",\"type\":\"tuple\",\"internalType\":\"structBN254.G1Point\",\"components\":[{\"name\":\"X\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"Y\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]},{\"name\":\"weights\",\"type\":\"uint256[]\",\"internalType\":\"uint256[]\"}]}]}]},{\"name\":\"totalStakeNominalThresholds\",\"type\":\"uint256[]\",\"internalType\":\"uint256[]\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"verifyCertificateProportion\",\"inputs\":[{\"name\":\"operatorSet\",\"type\":\"tuple\",\"internalType\":\"structOperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]},{\"name\":\"cert\",\"type\":\"tuple\",\"internalType\":\"structIBN254CertificateVerifierTypes.BN254Certificate\",\"components\":[{\"name\":\"referenceTimestamp\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"messageHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"signature\",\"type\":\"tuple\",\"internalType\":\"structBN254.G1Point\",\"components\":[{\"name\":\"X\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"Y\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]},{\"name\":\"apk\",\"type\":\"tuple\",\"internalType\":\"structBN254.G2Point\",\"components\":[{\"name\":\"X\",\"type\":\"uint256[2]\",\"internalType\":\"uint256[2]\"},{\"name\":\"Y\",\"type\":\"uint256[2]\",\"internalType\":\"uint256[2]\"}]},{\"name\":\"nonSignerWitnesses\",\"type\":\"tuple[]\",\"internalType\":\"structIBN254CertificateVerifierTypes.BN254OperatorInfoWitness[]\",\"components\":[{\"name\":\"operatorIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"operatorInfoProof\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"operatorInfo\",\"type\":\"tuple\",\"internalType\":\"structIOperatorTableCalculatorTypes.BN254OperatorInfo\",\"components\":[{\"name\":\"pubkey\",\"type\":\"tuple\",\"internalType\":\"structBN254.G1Point\",\"components\":[{\"name\":\"X\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"Y\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]},{\"name\":\"weights\",\"type\":\"uint256[]\",\"internalType\":\"uint256[]\"}]}]}]},{\"name\":\"totalStakeProportionThresholds\",\"type\":\"uint16[]\",\"internalType\":\"uint16[]\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"event\",\"name\":\"MaxStalenessPeriodUpdated\",\"inputs\":[{\"name\":\"operatorSet\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structOperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]},{\"name\":\"maxStalenessPeriod\",\"type\":\"uint32\",\"indexed\":false,\"internalType\":\"uint32\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"OperatorSetOwnerUpdated\",\"inputs\":[{\"name\":\"operatorSet\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structOperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]},{\"name\":\"owner\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"TableUpdated\",\"inputs\":[{\"name\":\"operatorSet\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structOperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]},{\"name\":\"referenceTimestamp\",\"type\":\"uint32\",\"indexed\":false,\"internalType\":\"uint32\"},{\"name\":\"operatorSetInfo\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structIOperatorTableCalculatorTypes.BN254OperatorSetInfo\",\"components\":[{\"name\":\"operatorInfoTreeRoot\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"numOperators\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"aggregatePubkey\",\"type\":\"tuple\",\"internalType\":\"structBN254.G1Point\",\"components\":[{\"name\":\"X\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"Y\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]},{\"name\":\"totalWeights\",\"type\":\"uint256[]\",\"internalType\":\"uint256[]\"}]}],\"anonymous\":false},{\"type\":\"error\",\"name\":\"ArrayLengthMismatch\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"CertificateStale\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidOperatorIndex\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"NonSignerIndicesNotSorted\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"OnlyTableUpdater\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ReferenceTimestampDoesNotExist\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"RootDisabled\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"TableUpdateStale\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"VerificationFailed\",\"inputs\":[]}]",
}
⋮----
// IBN254CertificateVerifierABI is the input ABI used to generate the binding from.
// Deprecated: Use IBN254CertificateVerifierMetaData.ABI instead.
var IBN254CertificateVerifierABI = IBN254CertificateVerifierMetaData.ABI
⋮----
// IBN254CertificateVerifier is an auto generated Go binding around an Ethereum contract.
type IBN254CertificateVerifier struct {
	IBN254CertificateVerifierCaller     // Read-only binding to the contract
	IBN254CertificateVerifierTransactor // Write-only binding to the contract
	IBN254CertificateVerifierFilterer   // Log filterer for contract events
}
⋮----
IBN254CertificateVerifierCaller     // Read-only binding to the contract
IBN254CertificateVerifierTransactor // Write-only binding to the contract
IBN254CertificateVerifierFilterer   // Log filterer for contract events
⋮----
// IBN254CertificateVerifierCaller is an auto generated read-only Go binding around an Ethereum contract.
type IBN254CertificateVerifierCaller struct {
	contract *bind.BoundContract // Generic contract wrapper for the low level calls
}
⋮----
contract *bind.BoundContract // Generic contract wrapper for the low level calls
⋮----
// IBN254CertificateVerifierTransactor is an auto generated write-only Go binding around an Ethereum contract.
type IBN254CertificateVerifierTransactor struct {
	contract *bind.BoundContract // Generic contract wrapper for the low level calls
}
⋮----
// IBN254CertificateVerifierFilterer is an auto generated log filtering Go binding around an Ethereum contract events.
type IBN254CertificateVerifierFilterer struct {
	contract *bind.BoundContract // Generic contract wrapper for the low level calls
}
⋮----
// IBN254CertificateVerifierSession is an auto generated Go binding around an Ethereum contract,
// with pre-set call and transact options.
type IBN254CertificateVerifierSession struct {
	Contract     *IBN254CertificateVerifier // 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
}
⋮----
Contract     *IBN254CertificateVerifier // 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
⋮----
// IBN254CertificateVerifierCallerSession is an auto generated read-only Go binding around an Ethereum contract,
// with pre-set call options.
type IBN254CertificateVerifierCallerSession struct {
	Contract *IBN254CertificateVerifierCaller // Generic contract caller binding to set the session for
	CallOpts bind.CallOpts                    // Call options to use throughout this session
}
⋮----
Contract *IBN254CertificateVerifierCaller // Generic contract caller binding to set the session for
CallOpts bind.CallOpts                    // Call options to use throughout this session
⋮----
// IBN254CertificateVerifierTransactorSession is an auto generated write-only Go binding around an Ethereum contract,
// with pre-set transact options.
type IBN254CertificateVerifierTransactorSession struct {
	Contract     *IBN254CertificateVerifierTransactor // Generic contract transactor binding to set the session for
	TransactOpts bind.TransactOpts                    // Transaction auth options to use throughout this session
}
⋮----
Contract     *IBN254CertificateVerifierTransactor // Generic contract transactor binding to set the session for
TransactOpts bind.TransactOpts                    // Transaction auth options to use throughout this session
⋮----
// IBN254CertificateVerifierRaw is an auto generated low-level Go binding around an Ethereum contract.
type IBN254CertificateVerifierRaw struct {
	Contract *IBN254CertificateVerifier // Generic contract binding to access the raw methods on
}
⋮----
Contract *IBN254CertificateVerifier // Generic contract binding to access the raw methods on
⋮----
// IBN254CertificateVerifierCallerRaw is an auto generated low-level read-only Go binding around an Ethereum contract.
type IBN254CertificateVerifierCallerRaw struct {
	Contract *IBN254CertificateVerifierCaller // Generic read-only contract binding to access the raw methods on
}
⋮----
Contract *IBN254CertificateVerifierCaller // Generic read-only contract binding to access the raw methods on
⋮----
// IBN254CertificateVerifierTransactorRaw is an auto generated low-level write-only Go binding around an Ethereum contract.
type IBN254CertificateVerifierTransactorRaw struct {
	Contract *IBN254CertificateVerifierTransactor // Generic write-only contract binding to access the raw methods on
}
⋮----
Contract *IBN254CertificateVerifierTransactor // Generic write-only contract binding to access the raw methods on
⋮----
// NewIBN254CertificateVerifier creates a new instance of IBN254CertificateVerifier, bound to a specific deployed contract.
func NewIBN254CertificateVerifier(address common.Address, backend bind.ContractBackend) (*IBN254CertificateVerifier, error)
⋮----
// NewIBN254CertificateVerifierCaller creates a new read-only instance of IBN254CertificateVerifier, bound to a specific deployed contract.
func NewIBN254CertificateVerifierCaller(address common.Address, caller bind.ContractCaller) (*IBN254CertificateVerifierCaller, error)
⋮----
// NewIBN254CertificateVerifierTransactor creates a new write-only instance of IBN254CertificateVerifier, bound to a specific deployed contract.
func NewIBN254CertificateVerifierTransactor(address common.Address, transactor bind.ContractTransactor) (*IBN254CertificateVerifierTransactor, error)
⋮----
// NewIBN254CertificateVerifierFilterer creates a new log filterer instance of IBN254CertificateVerifier, bound to a specific deployed contract.
func NewIBN254CertificateVerifierFilterer(address common.Address, filterer bind.ContractFilterer) (*IBN254CertificateVerifierFilterer, error)
⋮----
// bindIBN254CertificateVerifier binds a generic wrapper to an already deployed contract.
func bindIBN254CertificateVerifier(address common.Address, caller bind.ContractCaller, transactor bind.ContractTransactor, filterer bind.ContractFilterer) (*bind.BoundContract, error)
⋮----
// 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 (_IBN254CertificateVerifier *IBN254CertificateVerifierRaw) Call(opts *bind.CallOpts, result *[]interface
⋮----
// Transfer initiates a plain transaction to move funds to the contract, calling
// its default method if one is available.
func (_IBN254CertificateVerifier *IBN254CertificateVerifierRaw) Transfer(opts *bind.TransactOpts) (*types.Transaction, error)
⋮----
// Transact invokes the (paid) contract method with params as input values.
func (_IBN254CertificateVerifier *IBN254CertificateVerifierRaw) Transact(opts *bind.TransactOpts, method string, params ...interface
⋮----
// CalculateCertificateDigest is a free data retrieval call binding the contract method 0x18467434.
//
// Solidity: function calculateCertificateDigest(uint32 referenceTimestamp, bytes32 messageHash) pure returns(bytes32)
func (_IBN254CertificateVerifier *IBN254CertificateVerifierCaller) CalculateCertificateDigest(opts *bind.CallOpts, referenceTimestamp uint32, messageHash [32]byte) ([32]byte, error)
⋮----
var out []interface{}
⋮----
// GetNonsignerOperatorInfo is a free data retrieval call binding the contract method 0x26af6a3c.
⋮----
// Solidity: function getNonsignerOperatorInfo((address,uint32) operatorSet, uint32 referenceTimestamp, uint256 operatorIndex) view returns(((uint256,uint256),uint256[]))
func (_IBN254CertificateVerifier *IBN254CertificateVerifierCaller) GetNonsignerOperatorInfo(opts *bind.CallOpts, operatorSet OperatorSet, referenceTimestamp uint32, operatorIndex *big.Int) (IOperatorTableCalculatorTypesBN254OperatorInfo, error)
⋮----
// GetOperatorCount is a free data retrieval call binding the contract method 0x23c2a3cb.
⋮----
// Solidity: function getOperatorCount((address,uint32) operatorSet, uint32 referenceTimestamp) view returns(uint256)
func (_IBN254CertificateVerifier *IBN254CertificateVerifierCaller) GetOperatorCount(opts *bind.CallOpts, operatorSet OperatorSet, referenceTimestamp uint32) (*big.Int, error)
⋮----
// GetOperatorSetInfo is a free data retrieval call binding the contract method 0xeb39e68f.
⋮----
// Solidity: function getOperatorSetInfo((address,uint32) operatorSet, uint32 referenceTimestamp) view returns((bytes32,uint256,(uint256,uint256),uint256[]))
func (_IBN254CertificateVerifier *IBN254CertificateVerifierCaller) GetOperatorSetInfo(opts *bind.CallOpts, operatorSet OperatorSet, referenceTimestamp uint32) (IOperatorTableCalculatorTypesBN254OperatorSetInfo, error)
⋮----
// GetOperatorSetOwner is a free data retrieval call binding the contract method 0x84818920.
⋮----
// Solidity: function getOperatorSetOwner((address,uint32) operatorSet) view returns(address)
func (_IBN254CertificateVerifier *IBN254CertificateVerifierCaller) GetOperatorSetOwner(opts *bind.CallOpts, operatorSet OperatorSet) (common.Address, error)
⋮----
// GetTotalStakeWeights is a free data retrieval call binding the contract method 0x7d1d1f5b.
⋮----
// Solidity: function getTotalStakeWeights((address,uint32) operatorSet, uint32 referenceTimestamp) view returns(uint256[])
func (_IBN254CertificateVerifier *IBN254CertificateVerifierCaller) GetTotalStakeWeights(opts *bind.CallOpts, operatorSet OperatorSet, referenceTimestamp uint32) ([]*big.Int, error)
⋮----
// IsNonsignerCached is a free data retrieval call binding the contract method 0x5be87274.
⋮----
// Solidity: function isNonsignerCached((address,uint32) operatorSet, uint32 referenceTimestamp, uint256 operatorIndex) view returns(bool)
func (_IBN254CertificateVerifier *IBN254CertificateVerifierCaller) IsNonsignerCached(opts *bind.CallOpts, operatorSet OperatorSet, referenceTimestamp uint32, operatorIndex *big.Int) (bool, error)
⋮----
// IsReferenceTimestampSet is a free data retrieval call binding the contract method 0xcd83a72b.
⋮----
// Solidity: function isReferenceTimestampSet((address,uint32) operatorSet, uint32 referenceTimestamp) view returns(bool)
func (_IBN254CertificateVerifier *IBN254CertificateVerifierCaller) IsReferenceTimestampSet(opts *bind.CallOpts, operatorSet OperatorSet, referenceTimestamp uint32) (bool, error)
⋮----
// LatestReferenceTimestamp is a free data retrieval call binding the contract method 0x5ddb9b5b.
⋮----
// Solidity: function latestReferenceTimestamp((address,uint32) operatorSet) view returns(uint32)
func (_IBN254CertificateVerifier *IBN254CertificateVerifierCaller) LatestReferenceTimestamp(opts *bind.CallOpts, operatorSet OperatorSet) (uint32, error)
⋮----
// MaxOperatorTableStaleness is a free data retrieval call binding the contract method 0x6141879e.
⋮----
// Solidity: function maxOperatorTableStaleness((address,uint32) operatorSet) view returns(uint32)
func (_IBN254CertificateVerifier *IBN254CertificateVerifierCaller) MaxOperatorTableStaleness(opts *bind.CallOpts, operatorSet OperatorSet) (uint32, error)
⋮----
// TrySignatureVerification is a free data retrieval call binding the contract method 0x1a18746c.
⋮----
// Solidity: function trySignatureVerification(bytes32 msgHash, (uint256,uint256) aggPubkey, (uint256[2],uint256[2]) apkG2, (uint256,uint256) signature) view returns(bool pairingSuccessful, bool signatureValid)
func (_IBN254CertificateVerifier *IBN254CertificateVerifierCaller) TrySignatureVerification(opts *bind.CallOpts, msgHash [32]byte, aggPubkey BN254G1Point, apkG2 BN254G2Point, signature BN254G1Point) (struct
⋮----
// UpdateOperatorTable is a paid mutator transaction binding the contract method 0x6738c40b.
⋮----
// Solidity: function updateOperatorTable((address,uint32) operatorSet, uint32 referenceTimestamp, (bytes32,uint256,(uint256,uint256),uint256[]) operatorSetInfo, (address,uint32) operatorSetConfig) returns()
func (_IBN254CertificateVerifier *IBN254CertificateVerifierTransactor) UpdateOperatorTable(opts *bind.TransactOpts, operatorSet OperatorSet, referenceTimestamp uint32, operatorSetInfo IOperatorTableCalculatorTypesBN254OperatorSetInfo, operatorSetConfig ICrossChainRegistryTypesOperatorSetConfig) (*types.Transaction, error)
⋮----
// VerifyCertificate is a paid mutator transaction binding the contract method 0x080b7150.
⋮----
// Solidity: function verifyCertificate((address,uint32) operatorSet, (uint32,bytes32,(uint256,uint256),(uint256[2],uint256[2]),(uint32,bytes,((uint256,uint256),uint256[]))[]) cert) returns(uint256[] totalSignedStakeWeights)
func (_IBN254CertificateVerifier *IBN254CertificateVerifierTransactor) VerifyCertificate(opts *bind.TransactOpts, operatorSet OperatorSet, cert IBN254CertificateVerifierTypesBN254Certificate) (*types.Transaction, error)
⋮----
// VerifyCertificateNominal is a paid mutator transaction binding the contract method 0xdd2ae1b9.
⋮----
// Solidity: function verifyCertificateNominal((address,uint32) operatorSet, (uint32,bytes32,(uint256,uint256),(uint256[2],uint256[2]),(uint32,bytes,((uint256,uint256),uint256[]))[]) cert, uint256[] totalStakeNominalThresholds) returns(bool)
func (_IBN254CertificateVerifier *IBN254CertificateVerifierTransactor) VerifyCertificateNominal(opts *bind.TransactOpts, operatorSet OperatorSet, cert IBN254CertificateVerifierTypesBN254Certificate, totalStakeNominalThresholds []*big.Int) (*types.Transaction, error)
⋮----
// VerifyCertificateProportion is a paid mutator transaction binding the contract method 0x017d7974.
⋮----
// Solidity: function verifyCertificateProportion((address,uint32) operatorSet, (uint32,bytes32,(uint256,uint256),(uint256[2],uint256[2]),(uint32,bytes,((uint256,uint256),uint256[]))[]) cert, uint16[] totalStakeProportionThresholds) returns(bool)
func (_IBN254CertificateVerifier *IBN254CertificateVerifierTransactor) VerifyCertificateProportion(opts *bind.TransactOpts, operatorSet OperatorSet, cert IBN254CertificateVerifierTypesBN254Certificate, totalStakeProportionThresholds []uint16) (*types.Transaction, error)
⋮----
// IBN254CertificateVerifierMaxStalenessPeriodUpdatedIterator is returned from FilterMaxStalenessPeriodUpdated and is used to iterate over the raw logs and unpacked data for MaxStalenessPeriodUpdated events raised by the IBN254CertificateVerifier contract.
type IBN254CertificateVerifierMaxStalenessPeriodUpdatedIterator struct {
	Event *IBN254CertificateVerifierMaxStalenessPeriodUpdated // 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
}
⋮----
Event *IBN254CertificateVerifierMaxStalenessPeriodUpdated // 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 *IBN254CertificateVerifierMaxStalenessPeriodUpdatedIterator) Next() bool
⋮----
// If the iterator failed, stop iterating
⋮----
// If the iterator completed, deliver directly whatever's available
⋮----
// Iterator still in progress, wait for either a data or an error event
⋮----
// Error returns any retrieval or parsing error occurred during filtering.
func (it *IBN254CertificateVerifierMaxStalenessPeriodUpdatedIterator) Error() error
⋮----
// Close terminates the iteration process, releasing any pending underlying
// resources.
func (it *IBN254CertificateVerifierMaxStalenessPeriodUpdatedIterator) Close() error
⋮----
// IBN254CertificateVerifierMaxStalenessPeriodUpdated represents a MaxStalenessPeriodUpdated event raised by the IBN254CertificateVerifier contract.
type IBN254CertificateVerifierMaxStalenessPeriodUpdated struct {
	OperatorSet        OperatorSet
	MaxStalenessPeriod uint32
	Raw                types.Log // Blockchain specific contextual infos
}
⋮----
Raw                types.Log // Blockchain specific contextual infos
⋮----
// FilterMaxStalenessPeriodUpdated is a free log retrieval operation binding the contract event 0x28539469fbbc8a5482e60966bf9376f7b9d25b2f0a65a9976f6baa3f0e3788da.
⋮----
// Solidity: event MaxStalenessPeriodUpdated((address,uint32) operatorSet, uint32 maxStalenessPeriod)
func (_IBN254CertificateVerifier *IBN254CertificateVerifierFilterer) FilterMaxStalenessPeriodUpdated(opts *bind.FilterOpts) (*IBN254CertificateVerifierMaxStalenessPeriodUpdatedIterator, error)
⋮----
// WatchMaxStalenessPeriodUpdated is a free log subscription operation binding the contract event 0x28539469fbbc8a5482e60966bf9376f7b9d25b2f0a65a9976f6baa3f0e3788da.
⋮----
func (_IBN254CertificateVerifier *IBN254CertificateVerifierFilterer) WatchMaxStalenessPeriodUpdated(opts *bind.WatchOpts, sink chan<- *IBN254CertificateVerifierMaxStalenessPeriodUpdated) (event.Subscription, error)
⋮----
// New log arrived, parse the event and forward to the user
⋮----
// ParseMaxStalenessPeriodUpdated is a log parse operation binding the contract event 0x28539469fbbc8a5482e60966bf9376f7b9d25b2f0a65a9976f6baa3f0e3788da.
⋮----
func (_IBN254CertificateVerifier *IBN254CertificateVerifierFilterer) ParseMaxStalenessPeriodUpdated(log types.Log) (*IBN254CertificateVerifierMaxStalenessPeriodUpdated, error)
⋮----
// IBN254CertificateVerifierOperatorSetOwnerUpdatedIterator is returned from FilterOperatorSetOwnerUpdated and is used to iterate over the raw logs and unpacked data for OperatorSetOwnerUpdated events raised by the IBN254CertificateVerifier contract.
type IBN254CertificateVerifierOperatorSetOwnerUpdatedIterator struct {
	Event *IBN254CertificateVerifierOperatorSetOwnerUpdated // 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
}
⋮----
Event *IBN254CertificateVerifierOperatorSetOwnerUpdated // Event containing the contract specifics and raw log
⋮----
// IBN254CertificateVerifierOperatorSetOwnerUpdated represents a OperatorSetOwnerUpdated event raised by the IBN254CertificateVerifier contract.
type IBN254CertificateVerifierOperatorSetOwnerUpdated struct {
	OperatorSet OperatorSet
	Owner       common.Address
	Raw         types.Log // Blockchain specific contextual infos
}
⋮----
Raw         types.Log // Blockchain specific contextual infos
⋮----
// FilterOperatorSetOwnerUpdated is a free log retrieval operation binding the contract event 0x806dc367095c0baf953d7144b7c4376261675ee0b4e0da2761e43673051c7375.
⋮----
// Solidity: event OperatorSetOwnerUpdated((address,uint32) operatorSet, address owner)
func (_IBN254CertificateVerifier *IBN254CertificateVerifierFilterer) FilterOperatorSetOwnerUpdated(opts *bind.FilterOpts) (*IBN254CertificateVerifierOperatorSetOwnerUpdatedIterator, error)
⋮----
// WatchOperatorSetOwnerUpdated is a free log subscription operation binding the contract event 0x806dc367095c0baf953d7144b7c4376261675ee0b4e0da2761e43673051c7375.
⋮----
func (_IBN254CertificateVerifier *IBN254CertificateVerifierFilterer) WatchOperatorSetOwnerUpdated(opts *bind.WatchOpts, sink chan<- *IBN254CertificateVerifierOperatorSetOwnerUpdated) (event.Subscription, error)
⋮----
// ParseOperatorSetOwnerUpdated is a log parse operation binding the contract event 0x806dc367095c0baf953d7144b7c4376261675ee0b4e0da2761e43673051c7375.
⋮----
func (_IBN254CertificateVerifier *IBN254CertificateVerifierFilterer) ParseOperatorSetOwnerUpdated(log types.Log) (*IBN254CertificateVerifierOperatorSetOwnerUpdated, error)
⋮----
// IBN254CertificateVerifierTableUpdatedIterator is returned from FilterTableUpdated and is used to iterate over the raw logs and unpacked data for TableUpdated events raised by the IBN254CertificateVerifier contract.
type IBN254CertificateVerifierTableUpdatedIterator struct {
	Event *IBN254CertificateVerifierTableUpdated // 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
}
⋮----
Event *IBN254CertificateVerifierTableUpdated // Event containing the contract specifics and raw log
⋮----
// IBN254CertificateVerifierTableUpdated represents a TableUpdated event raised by the IBN254CertificateVerifier contract.
type IBN254CertificateVerifierTableUpdated struct {
	OperatorSet        OperatorSet
	ReferenceTimestamp uint32
	OperatorSetInfo    IOperatorTableCalculatorTypesBN254OperatorSetInfo
	Raw                types.Log // Blockchain specific contextual infos
}
⋮----
// FilterTableUpdated is a free log retrieval operation binding the contract event 0x93e6bea1c9b5dce4a5c07b00261e956df2a4a253d9ab6ca070ca2037d72ada9e.
⋮----
// Solidity: event TableUpdated((address,uint32) operatorSet, uint32 referenceTimestamp, (bytes32,uint256,(uint256,uint256),uint256[]) operatorSetInfo)
func (_IBN254CertificateVerifier *IBN254CertificateVerifierFilterer) FilterTableUpdated(opts *bind.FilterOpts) (*IBN254CertificateVerifierTableUpdatedIterator, error)
⋮----
// WatchTableUpdated is a free log subscription operation binding the contract event 0x93e6bea1c9b5dce4a5c07b00261e956df2a4a253d9ab6ca070ca2037d72ada9e.
⋮----
func (_IBN254CertificateVerifier *IBN254CertificateVerifierFilterer) WatchTableUpdated(opts *bind.WatchOpts, sink chan<- *IBN254CertificateVerifierTableUpdated) (event.Subscription, error)
⋮----
// ParseTableUpdated is a log parse operation binding the contract event 0x93e6bea1c9b5dce4a5c07b00261e956df2a4a253d9ab6ca070ca2037d72ada9e.
⋮----
func (_IBN254CertificateVerifier *IBN254CertificateVerifierFilterer) ParseTableUpdated(log types.Log) (*IBN254CertificateVerifierTableUpdated, error)
````

## File: pkg/bindings/ICrossChainRegistry/binding.go
````go
// Code generated - DO NOT EDIT.
// This file is a generated binding and any manual changes will be lost.
⋮----
package ICrossChainRegistry
⋮----
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"
)
⋮----
"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
)
⋮----
// ICrossChainRegistryTypesOperatorSetConfig is an auto generated low-level Go binding around an user-defined struct.
type ICrossChainRegistryTypesOperatorSetConfig struct {
	Owner              common.Address
	MaxStalenessPeriod uint32
}
⋮----
// OperatorSet is an auto generated low-level Go binding around an user-defined struct.
type OperatorSet struct {
	Avs common.Address
	Id  uint32
}
⋮----
// ICrossChainRegistryMetaData contains all meta data concerning the ICrossChainRegistry contract.
var ICrossChainRegistryMetaData = &bind.MetaData{
	ABI: "[{\"type\":\"function\",\"name\":\"addChainIDsToWhitelist\",\"inputs\":[{\"name\":\"chainIDs\",\"type\":\"uint256[]\",\"internalType\":\"uint256[]\"},{\"name\":\"operatorTableUpdaters\",\"type\":\"address[]\",\"internalType\":\"address[]\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"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\":\"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\":\"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\":\"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\":\"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\":\"TableUpdateCadenceSet\",\"inputs\":[{\"name\":\"tableUpdateCadence\",\"type\":\"uint32\",\"indexed\":false,\"internalType\":\"uint32\"}],\"anonymous\":false},{\"type\":\"error\",\"name\":\"ArrayLengthMismatch\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ChainIDAlreadyWhitelisted\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ChainIDNotWhitelisted\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"EmptyChainIDsArray\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"GenerationReservationAlreadyExists\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"GenerationReservationDoesNotExist\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidChainId\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidEndIndex\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidOperatorSet\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidRange\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidStalenessPeriod\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidTableUpdateCadence\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"KeyTypeNotSet\",\"inputs\":[]}]",
}
⋮----
// ICrossChainRegistryABI is the input ABI used to generate the binding from.
// Deprecated: Use ICrossChainRegistryMetaData.ABI instead.
var ICrossChainRegistryABI = ICrossChainRegistryMetaData.ABI
⋮----
// ICrossChainRegistry is an auto generated Go binding around an Ethereum contract.
type ICrossChainRegistry struct {
	ICrossChainRegistryCaller     // Read-only binding to the contract
	ICrossChainRegistryTransactor // Write-only binding to the contract
	ICrossChainRegistryFilterer   // Log filterer for contract events
}
⋮----
ICrossChainRegistryCaller     // Read-only binding to the contract
ICrossChainRegistryTransactor // Write-only binding to the contract
ICrossChainRegistryFilterer   // Log filterer for contract events
⋮----
// ICrossChainRegistryCaller is an auto generated read-only Go binding around an Ethereum contract.
type ICrossChainRegistryCaller struct {
	contract *bind.BoundContract // Generic contract wrapper for the low level calls
}
⋮----
contract *bind.BoundContract // Generic contract wrapper for the low level calls
⋮----
// ICrossChainRegistryTransactor is an auto generated write-only Go binding around an Ethereum contract.
type ICrossChainRegistryTransactor struct {
	contract *bind.BoundContract // Generic contract wrapper for the low level calls
}
⋮----
// ICrossChainRegistryFilterer is an auto generated log filtering Go binding around an Ethereum contract events.
type ICrossChainRegistryFilterer struct {
	contract *bind.BoundContract // Generic contract wrapper for the low level calls
}
⋮----
// ICrossChainRegistrySession is an auto generated Go binding around an Ethereum contract,
// with pre-set call and transact options.
type ICrossChainRegistrySession struct {
	Contract     *ICrossChainRegistry // 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
}
⋮----
Contract     *ICrossChainRegistry // 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
⋮----
// ICrossChainRegistryCallerSession is an auto generated read-only Go binding around an Ethereum contract,
// with pre-set call options.
type ICrossChainRegistryCallerSession struct {
	Contract *ICrossChainRegistryCaller // Generic contract caller binding to set the session for
	CallOpts bind.CallOpts              // Call options to use throughout this session
}
⋮----
Contract *ICrossChainRegistryCaller // Generic contract caller binding to set the session for
CallOpts bind.CallOpts              // Call options to use throughout this session
⋮----
// ICrossChainRegistryTransactorSession is an auto generated write-only Go binding around an Ethereum contract,
// with pre-set transact options.
type ICrossChainRegistryTransactorSession struct {
	Contract     *ICrossChainRegistryTransactor // Generic contract transactor binding to set the session for
	TransactOpts bind.TransactOpts              // Transaction auth options to use throughout this session
}
⋮----
Contract     *ICrossChainRegistryTransactor // Generic contract transactor binding to set the session for
TransactOpts bind.TransactOpts              // Transaction auth options to use throughout this session
⋮----
// ICrossChainRegistryRaw is an auto generated low-level Go binding around an Ethereum contract.
type ICrossChainRegistryRaw struct {
	Contract *ICrossChainRegistry // Generic contract binding to access the raw methods on
}
⋮----
Contract *ICrossChainRegistry // Generic contract binding to access the raw methods on
⋮----
// ICrossChainRegistryCallerRaw is an auto generated low-level read-only Go binding around an Ethereum contract.
type ICrossChainRegistryCallerRaw struct {
	Contract *ICrossChainRegistryCaller // Generic read-only contract binding to access the raw methods on
}
⋮----
Contract *ICrossChainRegistryCaller // Generic read-only contract binding to access the raw methods on
⋮----
// ICrossChainRegistryTransactorRaw is an auto generated low-level write-only Go binding around an Ethereum contract.
type ICrossChainRegistryTransactorRaw struct {
	Contract *ICrossChainRegistryTransactor // Generic write-only contract binding to access the raw methods on
}
⋮----
Contract *ICrossChainRegistryTransactor // Generic write-only contract binding to access the raw methods on
⋮----
// NewICrossChainRegistry creates a new instance of ICrossChainRegistry, bound to a specific deployed contract.
func NewICrossChainRegistry(address common.Address, backend bind.ContractBackend) (*ICrossChainRegistry, error)
⋮----
// NewICrossChainRegistryCaller creates a new read-only instance of ICrossChainRegistry, bound to a specific deployed contract.
func NewICrossChainRegistryCaller(address common.Address, caller bind.ContractCaller) (*ICrossChainRegistryCaller, error)
⋮----
// NewICrossChainRegistryTransactor creates a new write-only instance of ICrossChainRegistry, bound to a specific deployed contract.
func NewICrossChainRegistryTransactor(address common.Address, transactor bind.ContractTransactor) (*ICrossChainRegistryTransactor, error)
⋮----
// NewICrossChainRegistryFilterer creates a new log filterer instance of ICrossChainRegistry, bound to a specific deployed contract.
func NewICrossChainRegistryFilterer(address common.Address, filterer bind.ContractFilterer) (*ICrossChainRegistryFilterer, error)
⋮----
// bindICrossChainRegistry binds a generic wrapper to an already deployed contract.
func bindICrossChainRegistry(address common.Address, caller bind.ContractCaller, transactor bind.ContractTransactor, filterer bind.ContractFilterer) (*bind.BoundContract, error)
⋮----
// 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 (_ICrossChainRegistry *ICrossChainRegistryRaw) Call(opts *bind.CallOpts, result *[]interface
⋮----
// Transfer initiates a plain transaction to move funds to the contract, calling
// its default method if one is available.
func (_ICrossChainRegistry *ICrossChainRegistryRaw) Transfer(opts *bind.TransactOpts) (*types.Transaction, error)
⋮----
// Transact invokes the (paid) contract method with params as input values.
func (_ICrossChainRegistry *ICrossChainRegistryRaw) Transact(opts *bind.TransactOpts, method string, params ...interface
⋮----
// CalculateOperatorTableBytes is a free data retrieval call binding the contract method 0x41ee6d0e.
//
// Solidity: function calculateOperatorTableBytes((address,uint32) operatorSet) view returns(bytes)
func (_ICrossChainRegistry *ICrossChainRegistryCaller) CalculateOperatorTableBytes(opts *bind.CallOpts, operatorSet OperatorSet) ([]byte, error)
⋮----
var out []interface{}
⋮----
// GetActiveGenerationReservationCount is a free data retrieval call binding the contract method 0xb186a60e.
⋮----
// Solidity: function getActiveGenerationReservationCount() view returns(uint256)
func (_ICrossChainRegistry *ICrossChainRegistryCaller) GetActiveGenerationReservationCount(opts *bind.CallOpts) (*big.Int, error)
⋮----
// GetActiveGenerationReservations is a free data retrieval call binding the contract method 0xd09b978b.
⋮----
// Solidity: function getActiveGenerationReservations() view returns((address,uint32)[])
func (_ICrossChainRegistry *ICrossChainRegistryCaller) GetActiveGenerationReservations(opts *bind.CallOpts) ([]OperatorSet, error)
⋮----
// GetActiveGenerationReservationsByRange is a free data retrieval call binding the contract method 0xd9a6729e.
⋮----
// Solidity: function getActiveGenerationReservationsByRange(uint256 startIndex, uint256 endIndex) view returns((address,uint32)[])
func (_ICrossChainRegistry *ICrossChainRegistryCaller) GetActiveGenerationReservationsByRange(opts *bind.CallOpts, startIndex *big.Int, endIndex *big.Int) ([]OperatorSet, error)
⋮----
// GetOperatorSetConfig is a free data retrieval call binding the contract method 0x21fa7fdc.
⋮----
// Solidity: function getOperatorSetConfig((address,uint32) operatorSet) view returns((address,uint32))
func (_ICrossChainRegistry *ICrossChainRegistryCaller) GetOperatorSetConfig(opts *bind.CallOpts, operatorSet OperatorSet) (ICrossChainRegistryTypesOperatorSetConfig, error)
⋮----
// GetOperatorTableCalculator is a free data retrieval call binding the contract method 0x75e4b539.
⋮----
// Solidity: function getOperatorTableCalculator((address,uint32) operatorSet) view returns(address)
func (_ICrossChainRegistry *ICrossChainRegistryCaller) GetOperatorTableCalculator(opts *bind.CallOpts, operatorSet OperatorSet) (common.Address, error)
⋮----
// GetSupportedChains is a free data retrieval call binding the contract method 0xc4bffe2b.
⋮----
// Solidity: function getSupportedChains() view returns(uint256[], address[])
func (_ICrossChainRegistry *ICrossChainRegistryCaller) GetSupportedChains(opts *bind.CallOpts) ([]*big.Int, []common.Address, error)
⋮----
// GetTableUpdateCadence is a free data retrieval call binding the contract method 0xac505f4b.
⋮----
// Solidity: function getTableUpdateCadence() view returns(uint32)
func (_ICrossChainRegistry *ICrossChainRegistryCaller) GetTableUpdateCadence(opts *bind.CallOpts) (uint32, error)
⋮----
// HasActiveGenerationReservation is a free data retrieval call binding the contract method 0x36b200de.
⋮----
// Solidity: function hasActiveGenerationReservation((address,uint32) operatorSet) view returns(bool)
func (_ICrossChainRegistry *ICrossChainRegistryCaller) HasActiveGenerationReservation(opts *bind.CallOpts, operatorSet OperatorSet) (bool, error)
⋮----
// AddChainIDsToWhitelist is a paid mutator transaction binding the contract method 0x04e98be3.
⋮----
// Solidity: function addChainIDsToWhitelist(uint256[] chainIDs, address[] operatorTableUpdaters) returns()
func (_ICrossChainRegistry *ICrossChainRegistryTransactor) AddChainIDsToWhitelist(opts *bind.TransactOpts, chainIDs []*big.Int, operatorTableUpdaters []common.Address) (*types.Transaction, error)
⋮----
// CreateGenerationReservation is a paid mutator transaction binding the contract method 0xd5044911.
⋮----
// Solidity: function createGenerationReservation((address,uint32) operatorSet, address operatorTableCalculator, (address,uint32) config) returns()
func (_ICrossChainRegistry *ICrossChainRegistryTransactor) CreateGenerationReservation(opts *bind.TransactOpts, operatorSet OperatorSet, operatorTableCalculator common.Address, config ICrossChainRegistryTypesOperatorSetConfig) (*types.Transaction, error)
⋮----
// RemoveChainIDsFromWhitelist is a paid mutator transaction binding the contract method 0xdfbd9dfd.
⋮----
// Solidity: function removeChainIDsFromWhitelist(uint256[] chainIDs) returns()
func (_ICrossChainRegistry *ICrossChainRegistryTransactor) RemoveChainIDsFromWhitelist(opts *bind.TransactOpts, chainIDs []*big.Int) (*types.Transaction, error)
⋮----
// RemoveGenerationReservation is a paid mutator transaction binding the contract method 0x6c55a37f.
⋮----
// Solidity: function removeGenerationReservation((address,uint32) operatorSet) returns()
func (_ICrossChainRegistry *ICrossChainRegistryTransactor) RemoveGenerationReservation(opts *bind.TransactOpts, operatorSet OperatorSet) (*types.Transaction, error)
⋮----
// SetOperatorSetConfig is a paid mutator transaction binding the contract method 0x277e1e62.
⋮----
// Solidity: function setOperatorSetConfig((address,uint32) operatorSet, (address,uint32) config) returns()
func (_ICrossChainRegistry *ICrossChainRegistryTransactor) SetOperatorSetConfig(opts *bind.TransactOpts, operatorSet OperatorSet, config ICrossChainRegistryTypesOperatorSetConfig) (*types.Transaction, error)
⋮----
// SetOperatorTableCalculator is a paid mutator transaction binding the contract method 0x1ca9142a.
⋮----
// Solidity: function setOperatorTableCalculator((address,uint32) operatorSet, address operatorTableCalculator) returns()
func (_ICrossChainRegistry *ICrossChainRegistryTransactor) SetOperatorTableCalculator(opts *bind.TransactOpts, operatorSet OperatorSet, operatorTableCalculator common.Address) (*types.Transaction, error)
⋮----
// SetTableUpdateCadence is a paid mutator transaction binding the contract method 0xd6db9e25.
⋮----
// Solidity: function setTableUpdateCadence(uint32 tableUpdateCadence) returns()
func (_ICrossChainRegistry *ICrossChainRegistryTransactor) SetTableUpdateCadence(opts *bind.TransactOpts, tableUpdateCadence uint32) (*types.Transaction, error)
⋮----
// ICrossChainRegistryChainIDAddedToWhitelistIterator is returned from FilterChainIDAddedToWhitelist and is used to iterate over the raw logs and unpacked data for ChainIDAddedToWhitelist events raised by the ICrossChainRegistry contract.
type ICrossChainRegistryChainIDAddedToWhitelistIterator struct {
	Event *ICrossChainRegistryChainIDAddedToWhitelist // 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
}
⋮----
Event *ICrossChainRegistryChainIDAddedToWhitelist // 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 *ICrossChainRegistryChainIDAddedToWhitelistIterator) Next() bool
⋮----
// If the iterator failed, stop iterating
⋮----
// If the iterator completed, deliver directly whatever's available
⋮----
// Iterator still in progress, wait for either a data or an error event
⋮----
// Error returns any retrieval or parsing error occurred during filtering.
func (it *ICrossChainRegistryChainIDAddedToWhitelistIterator) Error() error
⋮----
// Close terminates the iteration process, releasing any pending underlying
// resources.
func (it *ICrossChainRegistryChainIDAddedToWhitelistIterator) Close() error
⋮----
// ICrossChainRegistryChainIDAddedToWhitelist represents a ChainIDAddedToWhitelist event raised by the ICrossChainRegistry contract.
type ICrossChainRegistryChainIDAddedToWhitelist struct {
	ChainID              *big.Int
	OperatorTableUpdater common.Address
	Raw                  types.Log // Blockchain specific contextual infos
}
⋮----
Raw                  types.Log // Blockchain specific contextual infos
⋮----
// FilterChainIDAddedToWhitelist is a free log retrieval operation binding the contract event 0x7a0a76d85b582b17996dd7371a407aa7a79b870db8539247fba315c7b6beff62.
⋮----
// Solidity: event ChainIDAddedToWhitelist(uint256 chainID, address operatorTableUpdater)
func (_ICrossChainRegistry *ICrossChainRegistryFilterer) FilterChainIDAddedToWhitelist(opts *bind.FilterOpts) (*ICrossChainRegistryChainIDAddedToWhitelistIterator, error)
⋮----
// WatchChainIDAddedToWhitelist is a free log subscription operation binding the contract event 0x7a0a76d85b582b17996dd7371a407aa7a79b870db8539247fba315c7b6beff62.
⋮----
func (_ICrossChainRegistry *ICrossChainRegistryFilterer) WatchChainIDAddedToWhitelist(opts *bind.WatchOpts, sink chan<- *ICrossChainRegistryChainIDAddedToWhitelist) (event.Subscription, error)
⋮----
// New log arrived, parse the event and forward to the user
⋮----
// ParseChainIDAddedToWhitelist is a log parse operation binding the contract event 0x7a0a76d85b582b17996dd7371a407aa7a79b870db8539247fba315c7b6beff62.
⋮----
func (_ICrossChainRegistry *ICrossChainRegistryFilterer) ParseChainIDAddedToWhitelist(log types.Log) (*ICrossChainRegistryChainIDAddedToWhitelist, error)
⋮----
// ICrossChainRegistryChainIDRemovedFromWhitelistIterator is returned from FilterChainIDRemovedFromWhitelist and is used to iterate over the raw logs and unpacked data for ChainIDRemovedFromWhitelist events raised by the ICrossChainRegistry contract.
type ICrossChainRegistryChainIDRemovedFromWhitelistIterator struct {
	Event *ICrossChainRegistryChainIDRemovedFromWhitelist // 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
}
⋮----
Event *ICrossChainRegistryChainIDRemovedFromWhitelist // Event containing the contract specifics and raw log
⋮----
// ICrossChainRegistryChainIDRemovedFromWhitelist represents a ChainIDRemovedFromWhitelist event raised by the ICrossChainRegistry contract.
type ICrossChainRegistryChainIDRemovedFromWhitelist struct {
	ChainID *big.Int
	Raw     types.Log // Blockchain specific contextual infos
}
⋮----
Raw     types.Log // Blockchain specific contextual infos
⋮----
// FilterChainIDRemovedFromWhitelist is a free log retrieval operation binding the contract event 0x6824d36084ecf2cd819b137cb5d837cc6e73afce1e0e348c9fdecaa81d0341e5.
⋮----
// Solidity: event ChainIDRemovedFromWhitelist(uint256 chainID)
func (_ICrossChainRegistry *ICrossChainRegistryFilterer) FilterChainIDRemovedFromWhitelist(opts *bind.FilterOpts) (*ICrossChainRegistryChainIDRemovedFromWhitelistIterator, error)
⋮----
// WatchChainIDRemovedFromWhitelist is a free log subscription operation binding the contract event 0x6824d36084ecf2cd819b137cb5d837cc6e73afce1e0e348c9fdecaa81d0341e5.
⋮----
func (_ICrossChainRegistry *ICrossChainRegistryFilterer) WatchChainIDRemovedFromWhitelist(opts *bind.WatchOpts, sink chan<- *ICrossChainRegistryChainIDRemovedFromWhitelist) (event.Subscription, error)
⋮----
// ParseChainIDRemovedFromWhitelist is a log parse operation binding the contract event 0x6824d36084ecf2cd819b137cb5d837cc6e73afce1e0e348c9fdecaa81d0341e5.
⋮----
func (_ICrossChainRegistry *ICrossChainRegistryFilterer) ParseChainIDRemovedFromWhitelist(log types.Log) (*ICrossChainRegistryChainIDRemovedFromWhitelist, error)
⋮----
// ICrossChainRegistryGenerationReservationCreatedIterator is returned from FilterGenerationReservationCreated and is used to iterate over the raw logs and unpacked data for GenerationReservationCreated events raised by the ICrossChainRegistry contract.
type ICrossChainRegistryGenerationReservationCreatedIterator struct {
	Event *ICrossChainRegistryGenerationReservationCreated // 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
}
⋮----
Event *ICrossChainRegistryGenerationReservationCreated // Event containing the contract specifics and raw log
⋮----
// ICrossChainRegistryGenerationReservationCreated represents a GenerationReservationCreated event raised by the ICrossChainRegistry contract.
type ICrossChainRegistryGenerationReservationCreated struct {
	OperatorSet OperatorSet
	Raw         types.Log // Blockchain specific contextual infos
}
⋮----
Raw         types.Log // Blockchain specific contextual infos
⋮----
// FilterGenerationReservationCreated is a free log retrieval operation binding the contract event 0x4fb6efec7dd60036ce3a7af8d5c48425019daa0fb61eb471a966a7ac2c6fa6a6.
⋮----
// Solidity: event GenerationReservationCreated((address,uint32) operatorSet)
func (_ICrossChainRegistry *ICrossChainRegistryFilterer) FilterGenerationReservationCreated(opts *bind.FilterOpts) (*ICrossChainRegistryGenerationReservationCreatedIterator, error)
⋮----
// WatchGenerationReservationCreated is a free log subscription operation binding the contract event 0x4fb6efec7dd60036ce3a7af8d5c48425019daa0fb61eb471a966a7ac2c6fa6a6.
⋮----
func (_ICrossChainRegistry *ICrossChainRegistryFilterer) WatchGenerationReservationCreated(opts *bind.WatchOpts, sink chan<- *ICrossChainRegistryGenerationReservationCreated) (event.Subscription, error)
⋮----
// ParseGenerationReservationCreated is a log parse operation binding the contract event 0x4fb6efec7dd60036ce3a7af8d5c48425019daa0fb61eb471a966a7ac2c6fa6a6.
⋮----
func (_ICrossChainRegistry *ICrossChainRegistryFilterer) ParseGenerationReservationCreated(log types.Log) (*ICrossChainRegistryGenerationReservationCreated, error)
⋮----
// ICrossChainRegistryGenerationReservationRemovedIterator is returned from FilterGenerationReservationRemoved and is used to iterate over the raw logs and unpacked data for GenerationReservationRemoved events raised by the ICrossChainRegistry contract.
type ICrossChainRegistryGenerationReservationRemovedIterator struct {
	Event *ICrossChainRegistryGenerationReservationRemoved // 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
}
⋮----
Event *ICrossChainRegistryGenerationReservationRemoved // Event containing the contract specifics and raw log
⋮----
// ICrossChainRegistryGenerationReservationRemoved represents a GenerationReservationRemoved event raised by the ICrossChainRegistry contract.
type ICrossChainRegistryGenerationReservationRemoved struct {
	OperatorSet OperatorSet
	Raw         types.Log // Blockchain specific contextual infos
}
⋮----
// FilterGenerationReservationRemoved is a free log retrieval operation binding the contract event 0x4ffdfdd59e9e1e3c301608788f78dd458e61cb8c045ca92b62a7b484c80824fb.
⋮----
// Solidity: event GenerationReservationRemoved((address,uint32) operatorSet)
func (_ICrossChainRegistry *ICrossChainRegistryFilterer) FilterGenerationReservationRemoved(opts *bind.FilterOpts) (*ICrossChainRegistryGenerationReservationRemovedIterator, error)
⋮----
// WatchGenerationReservationRemoved is a free log subscription operation binding the contract event 0x4ffdfdd59e9e1e3c301608788f78dd458e61cb8c045ca92b62a7b484c80824fb.
⋮----
func (_ICrossChainRegistry *ICrossChainRegistryFilterer) WatchGenerationReservationRemoved(opts *bind.WatchOpts, sink chan<- *ICrossChainRegistryGenerationReservationRemoved) (event.Subscription, error)
⋮----
// ParseGenerationReservationRemoved is a log parse operation binding the contract event 0x4ffdfdd59e9e1e3c301608788f78dd458e61cb8c045ca92b62a7b484c80824fb.
⋮----
func (_ICrossChainRegistry *ICrossChainRegistryFilterer) ParseGenerationReservationRemoved(log types.Log) (*ICrossChainRegistryGenerationReservationRemoved, error)
⋮----
// ICrossChainRegistryOperatorSetConfigRemovedIterator is returned from FilterOperatorSetConfigRemoved and is used to iterate over the raw logs and unpacked data for OperatorSetConfigRemoved events raised by the ICrossChainRegistry contract.
type ICrossChainRegistryOperatorSetConfigRemovedIterator struct {
	Event *ICrossChainRegistryOperatorSetConfigRemoved // 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
}
⋮----
Event *ICrossChainRegistryOperatorSetConfigRemoved // Event containing the contract specifics and raw log
⋮----
// ICrossChainRegistryOperatorSetConfigRemoved represents a OperatorSetConfigRemoved event raised by the ICrossChainRegistry contract.
type ICrossChainRegistryOperatorSetConfigRemoved struct {
	OperatorSet OperatorSet
	Raw         types.Log // Blockchain specific contextual infos
}
⋮----
// FilterOperatorSetConfigRemoved is a free log retrieval operation binding the contract event 0x210a1118a869246162804e2a7f21ef808ebd93f4be7ed512014fe29a7a8be02e.
⋮----
// Solidity: event OperatorSetConfigRemoved((address,uint32) operatorSet)
func (_ICrossChainRegistry *ICrossChainRegistryFilterer) FilterOperatorSetConfigRemoved(opts *bind.FilterOpts) (*ICrossChainRegistryOperatorSetConfigRemovedIterator, error)
⋮----
// WatchOperatorSetConfigRemoved is a free log subscription operation binding the contract event 0x210a1118a869246162804e2a7f21ef808ebd93f4be7ed512014fe29a7a8be02e.
⋮----
func (_ICrossChainRegistry *ICrossChainRegistryFilterer) WatchOperatorSetConfigRemoved(opts *bind.WatchOpts, sink chan<- *ICrossChainRegistryOperatorSetConfigRemoved) (event.Subscription, error)
⋮----
// ParseOperatorSetConfigRemoved is a log parse operation binding the contract event 0x210a1118a869246162804e2a7f21ef808ebd93f4be7ed512014fe29a7a8be02e.
⋮----
func (_ICrossChainRegistry *ICrossChainRegistryFilterer) ParseOperatorSetConfigRemoved(log types.Log) (*ICrossChainRegistryOperatorSetConfigRemoved, error)
⋮----
// ICrossChainRegistryOperatorSetConfigSetIterator is returned from FilterOperatorSetConfigSet and is used to iterate over the raw logs and unpacked data for OperatorSetConfigSet events raised by the ICrossChainRegistry contract.
type ICrossChainRegistryOperatorSetConfigSetIterator struct {
	Event *ICrossChainRegistryOperatorSetConfigSet // 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
}
⋮----
Event *ICrossChainRegistryOperatorSetConfigSet // Event containing the contract specifics and raw log
⋮----
// ICrossChainRegistryOperatorSetConfigSet represents a OperatorSetConfigSet event raised by the ICrossChainRegistry contract.
type ICrossChainRegistryOperatorSetConfigSet struct {
	OperatorSet OperatorSet
	Config      ICrossChainRegistryTypesOperatorSetConfig
	Raw         types.Log // Blockchain specific contextual infos
}
⋮----
// FilterOperatorSetConfigSet is a free log retrieval operation binding the contract event 0x3147846ee526009000671c20380b856a633345691300f82585f90034715cf0e2.
⋮----
// Solidity: event OperatorSetConfigSet((address,uint32) operatorSet, (address,uint32) config)
func (_ICrossChainRegistry *ICrossChainRegistryFilterer) FilterOperatorSetConfigSet(opts *bind.FilterOpts) (*ICrossChainRegistryOperatorSetConfigSetIterator, error)
⋮----
// WatchOperatorSetConfigSet is a free log subscription operation binding the contract event 0x3147846ee526009000671c20380b856a633345691300f82585f90034715cf0e2.
⋮----
func (_ICrossChainRegistry *ICrossChainRegistryFilterer) WatchOperatorSetConfigSet(opts *bind.WatchOpts, sink chan<- *ICrossChainRegistryOperatorSetConfigSet) (event.Subscription, error)
⋮----
// ParseOperatorSetConfigSet is a log parse operation binding the contract event 0x3147846ee526009000671c20380b856a633345691300f82585f90034715cf0e2.
⋮----
func (_ICrossChainRegistry *ICrossChainRegistryFilterer) ParseOperatorSetConfigSet(log types.Log) (*ICrossChainRegistryOperatorSetConfigSet, error)
⋮----
// ICrossChainRegistryOperatorTableCalculatorRemovedIterator is returned from FilterOperatorTableCalculatorRemoved and is used to iterate over the raw logs and unpacked data for OperatorTableCalculatorRemoved events raised by the ICrossChainRegistry contract.
type ICrossChainRegistryOperatorTableCalculatorRemovedIterator struct {
	Event *ICrossChainRegistryOperatorTableCalculatorRemoved // 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
}
⋮----
Event *ICrossChainRegistryOperatorTableCalculatorRemoved // Event containing the contract specifics and raw log
⋮----
// ICrossChainRegistryOperatorTableCalculatorRemoved represents a OperatorTableCalculatorRemoved event raised by the ICrossChainRegistry contract.
type ICrossChainRegistryOperatorTableCalculatorRemoved struct {
	OperatorSet OperatorSet
	Raw         types.Log // Blockchain specific contextual infos
}
⋮----
// FilterOperatorTableCalculatorRemoved is a free log retrieval operation binding the contract event 0xd7811913efd5d98fc7ea0d1fdd022b3d31987815360842d05b1d1cf55578d16a.
⋮----
// Solidity: event OperatorTableCalculatorRemoved((address,uint32) operatorSet)
func (_ICrossChainRegistry *ICrossChainRegistryFilterer) FilterOperatorTableCalculatorRemoved(opts *bind.FilterOpts) (*ICrossChainRegistryOperatorTableCalculatorRemovedIterator, error)
⋮----
// WatchOperatorTableCalculatorRemoved is a free log subscription operation binding the contract event 0xd7811913efd5d98fc7ea0d1fdd022b3d31987815360842d05b1d1cf55578d16a.
⋮----
func (_ICrossChainRegistry *ICrossChainRegistryFilterer) WatchOperatorTableCalculatorRemoved(opts *bind.WatchOpts, sink chan<- *ICrossChainRegistryOperatorTableCalculatorRemoved) (event.Subscription, error)
⋮----
// ParseOperatorTableCalculatorRemoved is a log parse operation binding the contract event 0xd7811913efd5d98fc7ea0d1fdd022b3d31987815360842d05b1d1cf55578d16a.
⋮----
func (_ICrossChainRegistry *ICrossChainRegistryFilterer) ParseOperatorTableCalculatorRemoved(log types.Log) (*ICrossChainRegistryOperatorTableCalculatorRemoved, error)
⋮----
// ICrossChainRegistryOperatorTableCalculatorSetIterator is returned from FilterOperatorTableCalculatorSet and is used to iterate over the raw logs and unpacked data for OperatorTableCalculatorSet events raised by the ICrossChainRegistry contract.
type ICrossChainRegistryOperatorTableCalculatorSetIterator struct {
	Event *ICrossChainRegistryOperatorTableCalculatorSet // 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
}
⋮----
Event *ICrossChainRegistryOperatorTableCalculatorSet // Event containing the contract specifics and raw log
⋮----
// ICrossChainRegistryOperatorTableCalculatorSet represents a OperatorTableCalculatorSet event raised by the ICrossChainRegistry contract.
type ICrossChainRegistryOperatorTableCalculatorSet struct {
	OperatorSet             OperatorSet
	OperatorTableCalculator common.Address
	Raw                     types.Log // Blockchain specific contextual infos
}
⋮----
Raw                     types.Log // Blockchain specific contextual infos
⋮----
// FilterOperatorTableCalculatorSet is a free log retrieval operation binding the contract event 0x7f7ccafd92d20fdb39dee184a0dce002a9da420ed0def461f2a027abc9b3f6df.
⋮----
// Solidity: event OperatorTableCalculatorSet((address,uint32) operatorSet, address operatorTableCalculator)
func (_ICrossChainRegistry *ICrossChainRegistryFilterer) FilterOperatorTableCalculatorSet(opts *bind.FilterOpts) (*ICrossChainRegistryOperatorTableCalculatorSetIterator, error)
⋮----
// WatchOperatorTableCalculatorSet is a free log subscription operation binding the contract event 0x7f7ccafd92d20fdb39dee184a0dce002a9da420ed0def461f2a027abc9b3f6df.
⋮----
func (_ICrossChainRegistry *ICrossChainRegistryFilterer) WatchOperatorTableCalculatorSet(opts *bind.WatchOpts, sink chan<- *ICrossChainRegistryOperatorTableCalculatorSet) (event.Subscription, error)
⋮----
// ParseOperatorTableCalculatorSet is a log parse operation binding the contract event 0x7f7ccafd92d20fdb39dee184a0dce002a9da420ed0def461f2a027abc9b3f6df.
⋮----
func (_ICrossChainRegistry *ICrossChainRegistryFilterer) ParseOperatorTableCalculatorSet(log types.Log) (*ICrossChainRegistryOperatorTableCalculatorSet, error)
⋮----
// ICrossChainRegistryTableUpdateCadenceSetIterator is returned from FilterTableUpdateCadenceSet and is used to iterate over the raw logs and unpacked data for TableUpdateCadenceSet events raised by the ICrossChainRegistry contract.
type ICrossChainRegistryTableUpdateCadenceSetIterator struct {
	Event *ICrossChainRegistryTableUpdateCadenceSet // 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
}
⋮----
Event *ICrossChainRegistryTableUpdateCadenceSet // Event containing the contract specifics and raw log
⋮----
// ICrossChainRegistryTableUpdateCadenceSet represents a TableUpdateCadenceSet event raised by the ICrossChainRegistry contract.
type ICrossChainRegistryTableUpdateCadenceSet struct {
	TableUpdateCadence uint32
	Raw                types.Log // Blockchain specific contextual infos
}
⋮----
Raw                types.Log // Blockchain specific contextual infos
⋮----
// FilterTableUpdateCadenceSet is a free log retrieval operation binding the contract event 0x4fbcd0cca70015b33db8af4aa4f2bd6fd6c1efa9460b8e2333f252c1467a6327.
⋮----
// Solidity: event TableUpdateCadenceSet(uint32 tableUpdateCadence)
func (_ICrossChainRegistry *ICrossChainRegistryFilterer) FilterTableUpdateCadenceSet(opts *bind.FilterOpts) (*ICrossChainRegistryTableUpdateCadenceSetIterator, error)
⋮----
// WatchTableUpdateCadenceSet is a free log subscription operation binding the contract event 0x4fbcd0cca70015b33db8af4aa4f2bd6fd6c1efa9460b8e2333f252c1467a6327.
⋮----
func (_ICrossChainRegistry *ICrossChainRegistryFilterer) WatchTableUpdateCadenceSet(opts *bind.WatchOpts, sink chan<- *ICrossChainRegistryTableUpdateCadenceSet) (event.Subscription, error)
⋮----
// ParseTableUpdateCadenceSet is a log parse operation binding the contract event 0x4fbcd0cca70015b33db8af4aa4f2bd6fd6c1efa9460b8e2333f252c1467a6327.
⋮----
func (_ICrossChainRegistry *ICrossChainRegistryFilterer) ParseTableUpdateCadenceSet(log types.Log) (*ICrossChainRegistryTableUpdateCadenceSet, error)
````

## File: pkg/bindings/IDelegationManager/binding.go
````go
// Code generated - DO NOT EDIT.
// This file is a generated binding and any manual changes will be lost.
⋮----
package IDelegationManager
⋮----
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"
)
⋮----
"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
)
⋮----
// IDelegationManagerTypesQueuedWithdrawalParams is an auto generated low-level Go binding around an user-defined struct.
type IDelegationManagerTypesQueuedWithdrawalParams struct {
	Strategies           []common.Address
	DepositShares        []*big.Int
	DeprecatedWithdrawer common.Address
}
⋮----
// IDelegationManagerTypesWithdrawal is an auto generated low-level Go binding around an user-defined struct.
type IDelegationManagerTypesWithdrawal struct {
	Staker       common.Address
	DelegatedTo  common.Address
	Withdrawer   common.Address
	Nonce        *big.Int
	StartBlock   uint32
	Strategies   []common.Address
	ScaledShares []*big.Int
}
⋮----
// ISignatureUtilsMixinTypesSignatureWithExpiry is an auto generated low-level Go binding around an user-defined struct.
type ISignatureUtilsMixinTypesSignatureWithExpiry struct {
	Signature []byte
	Expiry    *big.Int
}
⋮----
// OperatorSet is an auto generated low-level Go binding around an user-defined struct.
type OperatorSet struct {
	Avs common.Address
	Id  uint32
}
⋮----
// IDelegationManagerMetaData contains all meta data concerning the IDelegationManager contract.
var IDelegationManagerMetaData = &bind.MetaData{
	ABI: "[{\"type\":\"function\",\"name\":\"DELEGATION_APPROVAL_TYPEHASH\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"beaconChainETHStrategy\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"calculateDelegationApprovalDigestHash\",\"inputs\":[{\"name\":\"staker\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"_delegationApprover\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"approverSalt\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"expiry\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"calculateWithdrawalRoot\",\"inputs\":[{\"name\":\"withdrawal\",\"type\":\"tuple\",\"internalType\":\"structIDelegationManagerTypes.Withdrawal\",\"components\":[{\"name\":\"staker\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"delegatedTo\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"withdrawer\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"nonce\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"startBlock\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"strategies\",\"type\":\"address[]\",\"internalType\":\"contractIStrategy[]\"},{\"name\":\"scaledShares\",\"type\":\"uint256[]\",\"internalType\":\"uint256[]\"}]}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"pure\"},{\"type\":\"function\",\"name\":\"completeQueuedWithdrawal\",\"inputs\":[{\"name\":\"withdrawal\",\"type\":\"tuple\",\"internalType\":\"structIDelegationManagerTypes.Withdrawal\",\"components\":[{\"name\":\"staker\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"delegatedTo\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"withdrawer\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"nonce\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"startBlock\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"strategies\",\"type\":\"address[]\",\"internalType\":\"contractIStrategy[]\"},{\"name\":\"scaledShares\",\"type\":\"uint256[]\",\"internalType\":\"uint256[]\"}]},{\"name\":\"tokens\",\"type\":\"address[]\",\"internalType\":\"contractIERC20[]\"},{\"name\":\"receiveAsTokens\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"completeQueuedWithdrawals\",\"inputs\":[{\"name\":\"withdrawals\",\"type\":\"tuple[]\",\"internalType\":\"structIDelegationManagerTypes.Withdrawal[]\",\"components\":[{\"name\":\"staker\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"delegatedTo\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"withdrawer\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"nonce\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"startBlock\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"strategies\",\"type\":\"address[]\",\"internalType\":\"contractIStrategy[]\"},{\"name\":\"scaledShares\",\"type\":\"uint256[]\",\"internalType\":\"uint256[]\"}]},{\"name\":\"tokens\",\"type\":\"address[][]\",\"internalType\":\"contractIERC20[][]\"},{\"name\":\"receiveAsTokens\",\"type\":\"bool[]\",\"internalType\":\"bool[]\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"convertToDepositShares\",\"inputs\":[{\"name\":\"staker\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"strategies\",\"type\":\"address[]\",\"internalType\":\"contractIStrategy[]\"},{\"name\":\"withdrawableShares\",\"type\":\"uint256[]\",\"internalType\":\"uint256[]\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256[]\",\"internalType\":\"uint256[]\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"cumulativeWithdrawalsQueued\",\"inputs\":[{\"name\":\"staker\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"decreaseDelegatedShares\",\"inputs\":[{\"name\":\"staker\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"curDepositShares\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"beaconChainSlashingFactorDecrease\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"delegateTo\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"approverSignatureAndExpiry\",\"type\":\"tuple\",\"internalType\":\"structISignatureUtilsMixinTypes.SignatureWithExpiry\",\"components\":[{\"name\":\"signature\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"expiry\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]},{\"name\":\"approverSalt\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"delegatedTo\",\"inputs\":[{\"name\":\"staker\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"delegationApprover\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"delegationApproverSaltIsSpent\",\"inputs\":[{\"name\":\"_delegationApprover\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"salt\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"depositScalingFactor\",\"inputs\":[{\"name\":\"staker\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"strategy\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"domainSeparator\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getDepositedShares\",\"inputs\":[{\"name\":\"staker\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"address[]\",\"internalType\":\"contractIStrategy[]\"},{\"name\":\"\",\"type\":\"uint256[]\",\"internalType\":\"uint256[]\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getOperatorShares\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"strategies\",\"type\":\"address[]\",\"internalType\":\"contractIStrategy[]\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256[]\",\"internalType\":\"uint256[]\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getOperatorsShares\",\"inputs\":[{\"name\":\"operators\",\"type\":\"address[]\",\"internalType\":\"address[]\"},{\"name\":\"strategies\",\"type\":\"address[]\",\"internalType\":\"contractIStrategy[]\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256[][]\",\"internalType\":\"uint256[][]\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getQueuedWithdrawal\",\"inputs\":[{\"name\":\"withdrawalRoot\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"withdrawal\",\"type\":\"tuple\",\"internalType\":\"structIDelegationManagerTypes.Withdrawal\",\"components\":[{\"name\":\"staker\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"delegatedTo\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"withdrawer\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"nonce\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"startBlock\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"strategies\",\"type\":\"address[]\",\"internalType\":\"contractIStrategy[]\"},{\"name\":\"scaledShares\",\"type\":\"uint256[]\",\"internalType\":\"uint256[]\"}]},{\"name\":\"shares\",\"type\":\"uint256[]\",\"internalType\":\"uint256[]\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getQueuedWithdrawalRoots\",\"inputs\":[{\"name\":\"staker\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32[]\",\"internalType\":\"bytes32[]\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getQueuedWithdrawals\",\"inputs\":[{\"name\":\"staker\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"withdrawals\",\"type\":\"tuple[]\",\"internalType\":\"structIDelegationManagerTypes.Withdrawal[]\",\"components\":[{\"name\":\"staker\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"delegatedTo\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"withdrawer\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"nonce\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"startBlock\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"strategies\",\"type\":\"address[]\",\"internalType\":\"contractIStrategy[]\"},{\"name\":\"scaledShares\",\"type\":\"uint256[]\",\"internalType\":\"uint256[]\"}]},{\"name\":\"shares\",\"type\":\"uint256[][]\",\"internalType\":\"uint256[][]\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getSlashableSharesInQueue\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"strategy\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getWithdrawableShares\",\"inputs\":[{\"name\":\"staker\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"strategies\",\"type\":\"address[]\",\"internalType\":\"contractIStrategy[]\"}],\"outputs\":[{\"name\":\"withdrawableShares\",\"type\":\"uint256[]\",\"internalType\":\"uint256[]\"},{\"name\":\"depositShares\",\"type\":\"uint256[]\",\"internalType\":\"uint256[]\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"increaseDelegatedShares\",\"inputs\":[{\"name\":\"staker\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"strategy\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"},{\"name\":\"prevDepositShares\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"addedShares\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"initialize\",\"inputs\":[{\"name\":\"initialPausedStatus\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"isDelegated\",\"inputs\":[{\"name\":\"staker\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"isOperator\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"minWithdrawalDelayBlocks\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"modifyOperatorDetails\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"newDelegationApprover\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"queueWithdrawals\",\"inputs\":[{\"name\":\"params\",\"type\":\"tuple[]\",\"internalType\":\"structIDelegationManagerTypes.QueuedWithdrawalParams[]\",\"components\":[{\"name\":\"strategies\",\"type\":\"address[]\",\"internalType\":\"contractIStrategy[]\"},{\"name\":\"depositShares\",\"type\":\"uint256[]\",\"internalType\":\"uint256[]\"},{\"name\":\"__deprecated_withdrawer\",\"type\":\"address\",\"internalType\":\"address\"}]}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32[]\",\"internalType\":\"bytes32[]\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"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\":\"undelegate\",\"inputs\":[{\"name\":\"staker\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"withdrawalRoots\",\"type\":\"bytes32[]\",\"internalType\":\"bytes32[]\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"updateOperatorMetadataURI\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"metadataURI\",\"type\":\"string\",\"internalType\":\"string\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"event\",\"name\":\"DelegationApproverUpdated\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"newDelegationApprover\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"DepositScalingFactorUpdated\",\"inputs\":[{\"name\":\"staker\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"},{\"name\":\"strategy\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"contractIStrategy\"},{\"name\":\"newDepositScalingFactor\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"OperatorMetadataURIUpdated\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"metadataURI\",\"type\":\"string\",\"indexed\":false,\"internalType\":\"string\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"OperatorRegistered\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"delegationApprover\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"OperatorSharesDecreased\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"staker\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"},{\"name\":\"strategy\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"contractIStrategy\"},{\"name\":\"shares\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"OperatorSharesIncreased\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"staker\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"},{\"name\":\"strategy\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"contractIStrategy\"},{\"name\":\"shares\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"OperatorSharesSlashed\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"strategy\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"contractIStrategy\"},{\"name\":\"totalSlashedShares\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"SlashingWithdrawalCompleted\",\"inputs\":[{\"name\":\"withdrawalRoot\",\"type\":\"bytes32\",\"indexed\":false,\"internalType\":\"bytes32\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"SlashingWithdrawalQueued\",\"inputs\":[{\"name\":\"withdrawalRoot\",\"type\":\"bytes32\",\"indexed\":false,\"internalType\":\"bytes32\"},{\"name\":\"withdrawal\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structIDelegationManagerTypes.Withdrawal\",\"components\":[{\"name\":\"staker\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"delegatedTo\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"withdrawer\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"nonce\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"startBlock\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"strategies\",\"type\":\"address[]\",\"internalType\":\"contractIStrategy[]\"},{\"name\":\"scaledShares\",\"type\":\"uint256[]\",\"internalType\":\"uint256[]\"}]},{\"name\":\"sharesToWithdraw\",\"type\":\"uint256[]\",\"indexed\":false,\"internalType\":\"uint256[]\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"StakerDelegated\",\"inputs\":[{\"name\":\"staker\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"operator\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"StakerForceUndelegated\",\"inputs\":[{\"name\":\"staker\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"operator\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"StakerUndelegated\",\"inputs\":[{\"name\":\"staker\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"operator\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"error\",\"name\":\"ActivelyDelegated\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"CallerCannotUndelegate\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"FullySlashed\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InputArrayLengthMismatch\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InputArrayLengthZero\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidSignature\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"NotActivelyDelegated\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"OnlyAllocationManager\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"OnlyEigenPodManager\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"OnlyStrategyManagerOrEigenPodManager\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"OperatorNotRegistered\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"OperatorsCannotUndelegate\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"SaltSpent\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"SignatureExpired\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"WithdrawalDelayNotElapsed\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"WithdrawalNotQueued\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"WithdrawerNotCaller\",\"inputs\":[]}]",
}
⋮----
// IDelegationManagerABI is the input ABI used to generate the binding from.
// Deprecated: Use IDelegationManagerMetaData.ABI instead.
var IDelegationManagerABI = IDelegationManagerMetaData.ABI
⋮----
// IDelegationManager is an auto generated Go binding around an Ethereum contract.
type IDelegationManager struct {
	IDelegationManagerCaller     // Read-only binding to the contract
	IDelegationManagerTransactor // Write-only binding to the contract
	IDelegationManagerFilterer   // Log filterer for contract events
}
⋮----
IDelegationManagerCaller     // Read-only binding to the contract
IDelegationManagerTransactor // Write-only binding to the contract
IDelegationManagerFilterer   // Log filterer for contract events
⋮----
// IDelegationManagerCaller is an auto generated read-only Go binding around an Ethereum contract.
type IDelegationManagerCaller struct {
	contract *bind.BoundContract // Generic contract wrapper for the low level calls
}
⋮----
contract *bind.BoundContract // Generic contract wrapper for the low level calls
⋮----
// IDelegationManagerTransactor is an auto generated write-only Go binding around an Ethereum contract.
type IDelegationManagerTransactor struct {
	contract *bind.BoundContract // Generic contract wrapper for the low level calls
}
⋮----
// IDelegationManagerFilterer is an auto generated log filtering Go binding around an Ethereum contract events.
type IDelegationManagerFilterer struct {
	contract *bind.BoundContract // Generic contract wrapper for the low level calls
}
⋮----
// IDelegationManagerSession is an auto generated Go binding around an Ethereum contract,
// with pre-set call and transact options.
type IDelegationManagerSession struct {
	Contract     *IDelegationManager // 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
}
⋮----
Contract     *IDelegationManager // 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
⋮----
// IDelegationManagerCallerSession is an auto generated read-only Go binding around an Ethereum contract,
// with pre-set call options.
type IDelegationManagerCallerSession struct {
	Contract *IDelegationManagerCaller // Generic contract caller binding to set the session for
	CallOpts bind.CallOpts             // Call options to use throughout this session
}
⋮----
Contract *IDelegationManagerCaller // Generic contract caller binding to set the session for
CallOpts bind.CallOpts             // Call options to use throughout this session
⋮----
// IDelegationManagerTransactorSession is an auto generated write-only Go binding around an Ethereum contract,
// with pre-set transact options.
type IDelegationManagerTransactorSession struct {
	Contract     *IDelegationManagerTransactor // Generic contract transactor binding to set the session for
	TransactOpts bind.TransactOpts             // Transaction auth options to use throughout this session
}
⋮----
Contract     *IDelegationManagerTransactor // Generic contract transactor binding to set the session for
TransactOpts bind.TransactOpts             // Transaction auth options to use throughout this session
⋮----
// IDelegationManagerRaw is an auto generated low-level Go binding around an Ethereum contract.
type IDelegationManagerRaw struct {
	Contract *IDelegationManager // Generic contract binding to access the raw methods on
}
⋮----
Contract *IDelegationManager // Generic contract binding to access the raw methods on
⋮----
// IDelegationManagerCallerRaw is an auto generated low-level read-only Go binding around an Ethereum contract.
type IDelegationManagerCallerRaw struct {
	Contract *IDelegationManagerCaller // Generic read-only contract binding to access the raw methods on
}
⋮----
Contract *IDelegationManagerCaller // Generic read-only contract binding to access the raw methods on
⋮----
// IDelegationManagerTransactorRaw is an auto generated low-level write-only Go binding around an Ethereum contract.
type IDelegationManagerTransactorRaw struct {
	Contract *IDelegationManagerTransactor // Generic write-only contract binding to access the raw methods on
}
⋮----
Contract *IDelegationManagerTransactor // Generic write-only contract binding to access the raw methods on
⋮----
// NewIDelegationManager creates a new instance of IDelegationManager, bound to a specific deployed contract.
func NewIDelegationManager(address common.Address, backend bind.ContractBackend) (*IDelegationManager, error)
⋮----
// NewIDelegationManagerCaller creates a new read-only instance of IDelegationManager, bound to a specific deployed contract.
func NewIDelegationManagerCaller(address common.Address, caller bind.ContractCaller) (*IDelegationManagerCaller, error)
⋮----
// NewIDelegationManagerTransactor creates a new write-only instance of IDelegationManager, bound to a specific deployed contract.
func NewIDelegationManagerTransactor(address common.Address, transactor bind.ContractTransactor) (*IDelegationManagerTransactor, error)
⋮----
// NewIDelegationManagerFilterer creates a new log filterer instance of IDelegationManager, bound to a specific deployed contract.
func NewIDelegationManagerFilterer(address common.Address, filterer bind.ContractFilterer) (*IDelegationManagerFilterer, error)
⋮----
// bindIDelegationManager binds a generic wrapper to an already deployed contract.
func bindIDelegationManager(address common.Address, caller bind.ContractCaller, transactor bind.ContractTransactor, filterer bind.ContractFilterer) (*bind.BoundContract, error)
⋮----
// 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 (_IDelegationManager *IDelegationManagerRaw) Call(opts *bind.CallOpts, result *[]interface
⋮----
// Transfer initiates a plain transaction to move funds to the contract, calling
// its default method if one is available.
func (_IDelegationManager *IDelegationManagerRaw) Transfer(opts *bind.TransactOpts) (*types.Transaction, error)
⋮----
// Transact invokes the (paid) contract method with params as input values.
func (_IDelegationManager *IDelegationManagerRaw) Transact(opts *bind.TransactOpts, method string, params ...interface
⋮----
// DELEGATIONAPPROVALTYPEHASH is a free data retrieval call binding the contract method 0x04a4f979.
//
// Solidity: function DELEGATION_APPROVAL_TYPEHASH() view returns(bytes32)
func (_IDelegationManager *IDelegationManagerCaller) DELEGATIONAPPROVALTYPEHASH(opts *bind.CallOpts) ([32]byte, error)
⋮----
var out []interface{}
⋮----
// BeaconChainETHStrategy is a free data retrieval call binding the contract method 0x9104c319.
⋮----
// Solidity: function beaconChainETHStrategy() view returns(address)
func (_IDelegationManager *IDelegationManagerCaller) BeaconChainETHStrategy(opts *bind.CallOpts) (common.Address, error)
⋮----
// CalculateDelegationApprovalDigestHash is a free data retrieval call binding the contract method 0x0b9f487a.
⋮----
// Solidity: function calculateDelegationApprovalDigestHash(address staker, address operator, address _delegationApprover, bytes32 approverSalt, uint256 expiry) view returns(bytes32)
func (_IDelegationManager *IDelegationManagerCaller) CalculateDelegationApprovalDigestHash(opts *bind.CallOpts, staker common.Address, operator common.Address, _delegationApprover common.Address, approverSalt [32]byte, expiry *big.Int) ([32]byte, error)
⋮----
// CalculateWithdrawalRoot is a free data retrieval call binding the contract method 0x597b36da.
⋮----
// Solidity: function calculateWithdrawalRoot((address,address,address,uint256,uint32,address[],uint256[]) withdrawal) pure returns(bytes32)
func (_IDelegationManager *IDelegationManagerCaller) CalculateWithdrawalRoot(opts *bind.CallOpts, withdrawal IDelegationManagerTypesWithdrawal) ([32]byte, error)
⋮----
// ConvertToDepositShares is a free data retrieval call binding the contract method 0x25df922e.
⋮----
// Solidity: function convertToDepositShares(address staker, address[] strategies, uint256[] withdrawableShares) view returns(uint256[])
func (_IDelegationManager *IDelegationManagerCaller) ConvertToDepositShares(opts *bind.CallOpts, staker common.Address, strategies []common.Address, withdrawableShares []*big.Int) ([]*big.Int, error)
⋮----
// CumulativeWithdrawalsQueued is a free data retrieval call binding the contract method 0xa1788484.
⋮----
// Solidity: function cumulativeWithdrawalsQueued(address staker) view returns(uint256)
func (_IDelegationManager *IDelegationManagerCaller) CumulativeWithdrawalsQueued(opts *bind.CallOpts, staker common.Address) (*big.Int, error)
⋮----
// DelegatedTo is a free data retrieval call binding the contract method 0x65da1264.
⋮----
// Solidity: function delegatedTo(address staker) view returns(address)
func (_IDelegationManager *IDelegationManagerCaller) DelegatedTo(opts *bind.CallOpts, staker common.Address) (common.Address, error)
⋮----
// DelegationApprover is a free data retrieval call binding the contract method 0x3cdeb5e0.
⋮----
// Solidity: function delegationApprover(address operator) view returns(address)
func (_IDelegationManager *IDelegationManagerCaller) DelegationApprover(opts *bind.CallOpts, operator common.Address) (common.Address, error)
⋮----
// DelegationApproverSaltIsSpent is a free data retrieval call binding the contract method 0xbb45fef2.
⋮----
// Solidity: function delegationApproverSaltIsSpent(address _delegationApprover, bytes32 salt) view returns(bool)
func (_IDelegationManager *IDelegationManagerCaller) DelegationApproverSaltIsSpent(opts *bind.CallOpts, _delegationApprover common.Address, salt [32]byte) (bool, error)
⋮----
// DepositScalingFactor is a free data retrieval call binding the contract method 0xbfae3fd2.
⋮----
// Solidity: function depositScalingFactor(address staker, address strategy) view returns(uint256)
func (_IDelegationManager *IDelegationManagerCaller) DepositScalingFactor(opts *bind.CallOpts, staker common.Address, strategy common.Address) (*big.Int, error)
⋮----
// DomainSeparator is a free data retrieval call binding the contract method 0xf698da25.
⋮----
// Solidity: function domainSeparator() view returns(bytes32)
func (_IDelegationManager *IDelegationManagerCaller) DomainSeparator(opts *bind.CallOpts) ([32]byte, error)
⋮----
// GetDepositedShares is a free data retrieval call binding the contract method 0x66d5ba93.
⋮----
// Solidity: function getDepositedShares(address staker) view returns(address[], uint256[])
func (_IDelegationManager *IDelegationManagerCaller) GetDepositedShares(opts *bind.CallOpts, staker common.Address) ([]common.Address, []*big.Int, error)
⋮----
// GetOperatorShares is a free data retrieval call binding the contract method 0x90041347.
⋮----
// Solidity: function getOperatorShares(address operator, address[] strategies) view returns(uint256[])
func (_IDelegationManager *IDelegationManagerCaller) GetOperatorShares(opts *bind.CallOpts, operator common.Address, strategies []common.Address) ([]*big.Int, error)
⋮----
// GetOperatorsShares is a free data retrieval call binding the contract method 0xf0e0e676.
⋮----
// Solidity: function getOperatorsShares(address[] operators, address[] strategies) view returns(uint256[][])
func (_IDelegationManager *IDelegationManagerCaller) GetOperatorsShares(opts *bind.CallOpts, operators []common.Address, strategies []common.Address) ([][]*big.Int, error)
⋮----
// GetQueuedWithdrawal is a free data retrieval call binding the contract method 0x5d975e88.
⋮----
// Solidity: function getQueuedWithdrawal(bytes32 withdrawalRoot) view returns((address,address,address,uint256,uint32,address[],uint256[]) withdrawal, uint256[] shares)
func (_IDelegationManager *IDelegationManagerCaller) GetQueuedWithdrawal(opts *bind.CallOpts, withdrawalRoot [32]byte) (struct
⋮----
// GetQueuedWithdrawalRoots is a free data retrieval call binding the contract method 0xfd8aa88d.
⋮----
// Solidity: function getQueuedWithdrawalRoots(address staker) view returns(bytes32[])
func (_IDelegationManager *IDelegationManagerCaller) GetQueuedWithdrawalRoots(opts *bind.CallOpts, staker common.Address) ([][32]byte, error)
⋮----
// GetQueuedWithdrawals is a free data retrieval call binding the contract method 0x5dd68579.
⋮----
// Solidity: function getQueuedWithdrawals(address staker) view returns((address,address,address,uint256,uint32,address[],uint256[])[] withdrawals, uint256[][] shares)
func (_IDelegationManager *IDelegationManagerCaller) GetQueuedWithdrawals(opts *bind.CallOpts, staker common.Address) (struct
⋮----
// GetSlashableSharesInQueue is a free data retrieval call binding the contract method 0x6e174448.
⋮----
// Solidity: function getSlashableSharesInQueue(address operator, address strategy) view returns(uint256)
func (_IDelegationManager *IDelegationManagerCaller) GetSlashableSharesInQueue(opts *bind.CallOpts, operator common.Address, strategy common.Address) (*big.Int, error)
⋮----
// GetWithdrawableShares is a free data retrieval call binding the contract method 0xc978f7ac.
⋮----
// Solidity: function getWithdrawableShares(address staker, address[] strategies) view returns(uint256[] withdrawableShares, uint256[] depositShares)
func (_IDelegationManager *IDelegationManagerCaller) GetWithdrawableShares(opts *bind.CallOpts, staker common.Address, strategies []common.Address) (struct
⋮----
// IsDelegated is a free data retrieval call binding the contract method 0x3e28391d.
⋮----
// Solidity: function isDelegated(address staker) view returns(bool)
func (_IDelegationManager *IDelegationManagerCaller) IsDelegated(opts *bind.CallOpts, staker common.Address) (bool, error)
⋮----
// IsOperator is a free data retrieval call binding the contract method 0x6d70f7ae.
⋮----
// Solidity: function isOperator(address operator) view returns(bool)
func (_IDelegationManager *IDelegationManagerCaller) IsOperator(opts *bind.CallOpts, operator common.Address) (bool, error)
⋮----
// MinWithdrawalDelayBlocks is a free data retrieval call binding the contract method 0xc448feb8.
⋮----
// Solidity: function minWithdrawalDelayBlocks() view returns(uint32)
func (_IDelegationManager *IDelegationManagerCaller) MinWithdrawalDelayBlocks(opts *bind.CallOpts) (uint32, error)
⋮----
// QueuedWithdrawals is a free data retrieval call binding the contract method 0x99f5371b.
⋮----
// Solidity: function queuedWithdrawals(bytes32 withdrawalRoot) view returns((address,address,address,uint256,uint32,address[],uint256[]) withdrawal)
func (_IDelegationManager *IDelegationManagerCaller) QueuedWithdrawals(opts *bind.CallOpts, withdrawalRoot [32]byte) (IDelegationManagerTypesWithdrawal, error)
⋮----
// CompleteQueuedWithdrawal is a paid mutator transaction binding the contract method 0xe4cc3f90.
⋮----
// Solidity: function completeQueuedWithdrawal((address,address,address,uint256,uint32,address[],uint256[]) withdrawal, address[] tokens, bool receiveAsTokens) returns()
func (_IDelegationManager *IDelegationManagerTransactor) CompleteQueuedWithdrawal(opts *bind.TransactOpts, withdrawal IDelegationManagerTypesWithdrawal, tokens []common.Address, receiveAsTokens bool) (*types.Transaction, error)
⋮----
// CompleteQueuedWithdrawals is a paid mutator transaction binding the contract method 0x9435bb43.
⋮----
// Solidity: function completeQueuedWithdrawals((address,address,address,uint256,uint32,address[],uint256[])[] withdrawals, address[][] tokens, bool[] receiveAsTokens) returns()
func (_IDelegationManager *IDelegationManagerTransactor) CompleteQueuedWithdrawals(opts *bind.TransactOpts, withdrawals []IDelegationManagerTypesWithdrawal, tokens [][]common.Address, receiveAsTokens []bool) (*types.Transaction, error)
⋮----
// DecreaseDelegatedShares is a paid mutator transaction binding the contract method 0x60a0d1ce.
⋮----
// Solidity: function decreaseDelegatedShares(address staker, uint256 curDepositShares, uint64 beaconChainSlashingFactorDecrease) returns()
func (_IDelegationManager *IDelegationManagerTransactor) DecreaseDelegatedShares(opts *bind.TransactOpts, staker common.Address, curDepositShares *big.Int, beaconChainSlashingFactorDecrease uint64) (*types.Transaction, error)
⋮----
// DelegateTo is a paid mutator transaction binding the contract method 0xeea9064b.
⋮----
// Solidity: function delegateTo(address operator, (bytes,uint256) approverSignatureAndExpiry, bytes32 approverSalt) returns()
func (_IDelegationManager *IDelegationManagerTransactor) DelegateTo(opts *bind.TransactOpts, operator common.Address, approverSignatureAndExpiry ISignatureUtilsMixinTypesSignatureWithExpiry, approverSalt [32]byte) (*types.Transaction, error)
⋮----
// IncreaseDelegatedShares is a paid mutator transaction binding the contract method 0x3c651cf2.
⋮----
// Solidity: function increaseDelegatedShares(address staker, address strategy, uint256 prevDepositShares, uint256 addedShares) returns()
func (_IDelegationManager *IDelegationManagerTransactor) IncreaseDelegatedShares(opts *bind.TransactOpts, staker common.Address, strategy common.Address, prevDepositShares *big.Int, addedShares *big.Int) (*types.Transaction, error)
⋮----
// Initialize is a paid mutator transaction binding the contract method 0xfe4b84df.
⋮----
// Solidity: function initialize(uint256 initialPausedStatus) returns()
func (_IDelegationManager *IDelegationManagerTransactor) Initialize(opts *bind.TransactOpts, initialPausedStatus *big.Int) (*types.Transaction, error)
⋮----
// ModifyOperatorDetails is a paid mutator transaction binding the contract method 0x54b7c96c.
⋮----
// Solidity: function modifyOperatorDetails(address operator, address newDelegationApprover) returns()
func (_IDelegationManager *IDelegationManagerTransactor) ModifyOperatorDetails(opts *bind.TransactOpts, operator common.Address, newDelegationApprover common.Address) (*types.Transaction, error)
⋮----
// QueueWithdrawals is a paid mutator transaction binding the contract method 0x0dd8dd02.
⋮----
// Solidity: function queueWithdrawals((address[],uint256[],address)[] params) returns(bytes32[])
func (_IDelegationManager *IDelegationManagerTransactor) QueueWithdrawals(opts *bind.TransactOpts, params []IDelegationManagerTypesQueuedWithdrawalParams) (*types.Transaction, error)
⋮----
// Redelegate is a paid mutator transaction binding the contract method 0xa33a3433.
⋮----
// Solidity: function redelegate(address newOperator, (bytes,uint256) newOperatorApproverSig, bytes32 approverSalt) returns(bytes32[] withdrawalRoots)
func (_IDelegationManager *IDelegationManagerTransactor) Redelegate(opts *bind.TransactOpts, newOperator common.Address, newOperatorApproverSig ISignatureUtilsMixinTypesSignatureWithExpiry, approverSalt [32]byte) (*types.Transaction, error)
⋮----
// RegisterAsOperator is a paid mutator transaction binding the contract method 0x2aa6d888.
⋮----
// Solidity: function registerAsOperator(address initDelegationApprover, uint32 allocationDelay, string metadataURI) returns()
func (_IDelegationManager *IDelegationManagerTransactor) RegisterAsOperator(opts *bind.TransactOpts, initDelegationApprover common.Address, allocationDelay uint32, metadataURI string) (*types.Transaction, error)
⋮----
// SlashOperatorShares is a paid mutator transaction binding the contract method 0x5ae679a7.
⋮----
// Solidity: function slashOperatorShares(address operator, (address,uint32) operatorSet, uint256 slashId, address strategy, uint64 prevMaxMagnitude, uint64 newMaxMagnitude) returns(uint256 totalDepositSharesToSlash)
func (_IDelegationManager *IDelegationManagerTransactor) SlashOperatorShares(opts *bind.TransactOpts, operator common.Address, operatorSet OperatorSet, slashId *big.Int, strategy common.Address, prevMaxMagnitude uint64, newMaxMagnitude uint64) (*types.Transaction, error)
⋮----
// Undelegate is a paid mutator transaction binding the contract method 0xda8be864.
⋮----
// Solidity: function undelegate(address staker) returns(bytes32[] withdrawalRoots)
func (_IDelegationManager *IDelegationManagerTransactor) Undelegate(opts *bind.TransactOpts, staker common.Address) (*types.Transaction, error)
⋮----
// UpdateOperatorMetadataURI is a paid mutator transaction binding the contract method 0x78296ec5.
⋮----
// Solidity: function updateOperatorMetadataURI(address operator, string metadataURI) returns()
func (_IDelegationManager *IDelegationManagerTransactor) UpdateOperatorMetadataURI(opts *bind.TransactOpts, operator common.Address, metadataURI string) (*types.Transaction, error)
⋮----
// IDelegationManagerDelegationApproverUpdatedIterator is returned from FilterDelegationApproverUpdated and is used to iterate over the raw logs and unpacked data for DelegationApproverUpdated events raised by the IDelegationManager contract.
type IDelegationManagerDelegationApproverUpdatedIterator struct {
	Event *IDelegationManagerDelegationApproverUpdated // 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
}
⋮----
Event *IDelegationManagerDelegationApproverUpdated // 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 *IDelegationManagerDelegationApproverUpdatedIterator) Next() bool
⋮----
// If the iterator failed, stop iterating
⋮----
// If the iterator completed, deliver directly whatever's available
⋮----
// Iterator still in progress, wait for either a data or an error event
⋮----
// Error returns any retrieval or parsing error occurred during filtering.
func (it *IDelegationManagerDelegationApproverUpdatedIterator) Error() error
⋮----
// Close terminates the iteration process, releasing any pending underlying
// resources.
func (it *IDelegationManagerDelegationApproverUpdatedIterator) Close() error
⋮----
// IDelegationManagerDelegationApproverUpdated represents a DelegationApproverUpdated event raised by the IDelegationManager contract.
type IDelegationManagerDelegationApproverUpdated struct {
	Operator              common.Address
	NewDelegationApprover common.Address
	Raw                   types.Log // Blockchain specific contextual infos
}
⋮----
Raw                   types.Log // Blockchain specific contextual infos
⋮----
// FilterDelegationApproverUpdated is a free log retrieval operation binding the contract event 0x773b54c04d756fcc5e678111f7d730de3be98192000799eee3d63716055a87c6.
⋮----
// Solidity: event DelegationApproverUpdated(address indexed operator, address newDelegationApprover)
func (_IDelegationManager *IDelegationManagerFilterer) FilterDelegationApproverUpdated(opts *bind.FilterOpts, operator []common.Address) (*IDelegationManagerDelegationApproverUpdatedIterator, error)
⋮----
var operatorRule []interface{}
⋮----
// WatchDelegationApproverUpdated is a free log subscription operation binding the contract event 0x773b54c04d756fcc5e678111f7d730de3be98192000799eee3d63716055a87c6.
⋮----
func (_IDelegationManager *IDelegationManagerFilterer) WatchDelegationApproverUpdated(opts *bind.WatchOpts, sink chan<- *IDelegationManagerDelegationApproverUpdated, operator []common.Address) (event.Subscription, error)
⋮----
// New log arrived, parse the event and forward to the user
⋮----
// ParseDelegationApproverUpdated is a log parse operation binding the contract event 0x773b54c04d756fcc5e678111f7d730de3be98192000799eee3d63716055a87c6.
⋮----
func (_IDelegationManager *IDelegationManagerFilterer) ParseDelegationApproverUpdated(log types.Log) (*IDelegationManagerDelegationApproverUpdated, error)
⋮----
// IDelegationManagerDepositScalingFactorUpdatedIterator is returned from FilterDepositScalingFactorUpdated and is used to iterate over the raw logs and unpacked data for DepositScalingFactorUpdated events raised by the IDelegationManager contract.
type IDelegationManagerDepositScalingFactorUpdatedIterator struct {
	Event *IDelegationManagerDepositScalingFactorUpdated // 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
}
⋮----
Event *IDelegationManagerDepositScalingFactorUpdated // Event containing the contract specifics and raw log
⋮----
// IDelegationManagerDepositScalingFactorUpdated represents a DepositScalingFactorUpdated event raised by the IDelegationManager contract.
type IDelegationManagerDepositScalingFactorUpdated struct {
	Staker                  common.Address
	Strategy                common.Address
	NewDepositScalingFactor *big.Int
	Raw                     types.Log // Blockchain specific contextual infos
}
⋮----
Raw                     types.Log // Blockchain specific contextual infos
⋮----
// FilterDepositScalingFactorUpdated is a free log retrieval operation binding the contract event 0x8be932bac54561f27260f95463d9b8ab37e06b2842e5ee2404157cc13df6eb8f.
⋮----
// Solidity: event DepositScalingFactorUpdated(address staker, address strategy, uint256 newDepositScalingFactor)
func (_IDelegationManager *IDelegationManagerFilterer) FilterDepositScalingFactorUpdated(opts *bind.FilterOpts) (*IDelegationManagerDepositScalingFactorUpdatedIterator, error)
⋮----
// WatchDepositScalingFactorUpdated is a free log subscription operation binding the contract event 0x8be932bac54561f27260f95463d9b8ab37e06b2842e5ee2404157cc13df6eb8f.
⋮----
func (_IDelegationManager *IDelegationManagerFilterer) WatchDepositScalingFactorUpdated(opts *bind.WatchOpts, sink chan<- *IDelegationManagerDepositScalingFactorUpdated) (event.Subscription, error)
⋮----
// ParseDepositScalingFactorUpdated is a log parse operation binding the contract event 0x8be932bac54561f27260f95463d9b8ab37e06b2842e5ee2404157cc13df6eb8f.
⋮----
func (_IDelegationManager *IDelegationManagerFilterer) ParseDepositScalingFactorUpdated(log types.Log) (*IDelegationManagerDepositScalingFactorUpdated, error)
⋮----
// IDelegationManagerOperatorMetadataURIUpdatedIterator is returned from FilterOperatorMetadataURIUpdated and is used to iterate over the raw logs and unpacked data for OperatorMetadataURIUpdated events raised by the IDelegationManager contract.
type IDelegationManagerOperatorMetadataURIUpdatedIterator struct {
	Event *IDelegationManagerOperatorMetadataURIUpdated // 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
}
⋮----
Event *IDelegationManagerOperatorMetadataURIUpdated // Event containing the contract specifics and raw log
⋮----
// IDelegationManagerOperatorMetadataURIUpdated represents a OperatorMetadataURIUpdated event raised by the IDelegationManager contract.
type IDelegationManagerOperatorMetadataURIUpdated struct {
	Operator    common.Address
	MetadataURI string
	Raw         types.Log // Blockchain specific contextual infos
}
⋮----
Raw         types.Log // Blockchain specific contextual infos
⋮----
// FilterOperatorMetadataURIUpdated is a free log retrieval operation binding the contract event 0x02a919ed0e2acad1dd90f17ef2fa4ae5462ee1339170034a8531cca4b6708090.
⋮----
// Solidity: event OperatorMetadataURIUpdated(address indexed operator, string metadataURI)
func (_IDelegationManager *IDelegationManagerFilterer) FilterOperatorMetadataURIUpdated(opts *bind.FilterOpts, operator []common.Address) (*IDelegationManagerOperatorMetadataURIUpdatedIterator, error)
⋮----
// WatchOperatorMetadataURIUpdated is a free log subscription operation binding the contract event 0x02a919ed0e2acad1dd90f17ef2fa4ae5462ee1339170034a8531cca4b6708090.
⋮----
func (_IDelegationManager *IDelegationManagerFilterer) WatchOperatorMetadataURIUpdated(opts *bind.WatchOpts, sink chan<- *IDelegationManagerOperatorMetadataURIUpdated, operator []common.Address) (event.Subscription, error)
⋮----
// ParseOperatorMetadataURIUpdated is a log parse operation binding the contract event 0x02a919ed0e2acad1dd90f17ef2fa4ae5462ee1339170034a8531cca4b6708090.
⋮----
func (_IDelegationManager *IDelegationManagerFilterer) ParseOperatorMetadataURIUpdated(log types.Log) (*IDelegationManagerOperatorMetadataURIUpdated, error)
⋮----
// IDelegationManagerOperatorRegisteredIterator is returned from FilterOperatorRegistered and is used to iterate over the raw logs and unpacked data for OperatorRegistered events raised by the IDelegationManager contract.
type IDelegationManagerOperatorRegisteredIterator struct {
	Event *IDelegationManagerOperatorRegistered // 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
}
⋮----
Event *IDelegationManagerOperatorRegistered // Event containing the contract specifics and raw log
⋮----
// IDelegationManagerOperatorRegistered represents a OperatorRegistered event raised by the IDelegationManager contract.
type IDelegationManagerOperatorRegistered struct {
	Operator           common.Address
	DelegationApprover common.Address
	Raw                types.Log // Blockchain specific contextual infos
}
⋮----
Raw                types.Log // Blockchain specific contextual infos
⋮----
// FilterOperatorRegistered is a free log retrieval operation binding the contract event 0xa453db612af59e5521d6ab9284dc3e2d06af286eb1b1b7b771fce4716c19f2c1.
⋮----
// Solidity: event OperatorRegistered(address indexed operator, address delegationApprover)
func (_IDelegationManager *IDelegationManagerFilterer) FilterOperatorRegistered(opts *bind.FilterOpts, operator []common.Address) (*IDelegationManagerOperatorRegisteredIterator, error)
⋮----
// WatchOperatorRegistered is a free log subscription operation binding the contract event 0xa453db612af59e5521d6ab9284dc3e2d06af286eb1b1b7b771fce4716c19f2c1.
⋮----
func (_IDelegationManager *IDelegationManagerFilterer) WatchOperatorRegistered(opts *bind.WatchOpts, sink chan<- *IDelegationManagerOperatorRegistered, operator []common.Address) (event.Subscription, error)
⋮----
// ParseOperatorRegistered is a log parse operation binding the contract event 0xa453db612af59e5521d6ab9284dc3e2d06af286eb1b1b7b771fce4716c19f2c1.
⋮----
func (_IDelegationManager *IDelegationManagerFilterer) ParseOperatorRegistered(log types.Log) (*IDelegationManagerOperatorRegistered, error)
⋮----
// IDelegationManagerOperatorSharesDecreasedIterator is returned from FilterOperatorSharesDecreased and is used to iterate over the raw logs and unpacked data for OperatorSharesDecreased events raised by the IDelegationManager contract.
type IDelegationManagerOperatorSharesDecreasedIterator struct {
	Event *IDelegationManagerOperatorSharesDecreased // 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
}
⋮----
Event *IDelegationManagerOperatorSharesDecreased // Event containing the contract specifics and raw log
⋮----
// IDelegationManagerOperatorSharesDecreased represents a OperatorSharesDecreased event raised by the IDelegationManager contract.
type IDelegationManagerOperatorSharesDecreased struct {
	Operator common.Address
	Staker   common.Address
	Strategy common.Address
	Shares   *big.Int
	Raw      types.Log // Blockchain specific contextual infos
}
⋮----
Raw      types.Log // Blockchain specific contextual infos
⋮----
// FilterOperatorSharesDecreased is a free log retrieval operation binding the contract event 0x6909600037b75d7b4733aedd815442b5ec018a827751c832aaff64eba5d6d2dd.
⋮----
// Solidity: event OperatorSharesDecreased(address indexed operator, address staker, address strategy, uint256 shares)
func (_IDelegationManager *IDelegationManagerFilterer) FilterOperatorSharesDecreased(opts *bind.FilterOpts, operator []common.Address) (*IDelegationManagerOperatorSharesDecreasedIterator, error)
⋮----
// WatchOperatorSharesDecreased is a free log subscription operation binding the contract event 0x6909600037b75d7b4733aedd815442b5ec018a827751c832aaff64eba5d6d2dd.
⋮----
func (_IDelegationManager *IDelegationManagerFilterer) WatchOperatorSharesDecreased(opts *bind.WatchOpts, sink chan<- *IDelegationManagerOperatorSharesDecreased, operator []common.Address) (event.Subscription, error)
⋮----
// ParseOperatorSharesDecreased is a log parse operation binding the contract event 0x6909600037b75d7b4733aedd815442b5ec018a827751c832aaff64eba5d6d2dd.
⋮----
func (_IDelegationManager *IDelegationManagerFilterer) ParseOperatorSharesDecreased(log types.Log) (*IDelegationManagerOperatorSharesDecreased, error)
⋮----
// IDelegationManagerOperatorSharesIncreasedIterator is returned from FilterOperatorSharesIncreased and is used to iterate over the raw logs and unpacked data for OperatorSharesIncreased events raised by the IDelegationManager contract.
type IDelegationManagerOperatorSharesIncreasedIterator struct {
	Event *IDelegationManagerOperatorSharesIncreased // 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
}
⋮----
Event *IDelegationManagerOperatorSharesIncreased // Event containing the contract specifics and raw log
⋮----
// IDelegationManagerOperatorSharesIncreased represents a OperatorSharesIncreased event raised by the IDelegationManager contract.
type IDelegationManagerOperatorSharesIncreased struct {
	Operator common.Address
	Staker   common.Address
	Strategy common.Address
	Shares   *big.Int
	Raw      types.Log // Blockchain specific contextual infos
}
⋮----
// FilterOperatorSharesIncreased is a free log retrieval operation binding the contract event 0x1ec042c965e2edd7107b51188ee0f383e22e76179041ab3a9d18ff151405166c.
⋮----
// Solidity: event OperatorSharesIncreased(address indexed operator, address staker, address strategy, uint256 shares)
func (_IDelegationManager *IDelegationManagerFilterer) FilterOperatorSharesIncreased(opts *bind.FilterOpts, operator []common.Address) (*IDelegationManagerOperatorSharesIncreasedIterator, error)
⋮----
// WatchOperatorSharesIncreased is a free log subscription operation binding the contract event 0x1ec042c965e2edd7107b51188ee0f383e22e76179041ab3a9d18ff151405166c.
⋮----
func (_IDelegationManager *IDelegationManagerFilterer) WatchOperatorSharesIncreased(opts *bind.WatchOpts, sink chan<- *IDelegationManagerOperatorSharesIncreased, operator []common.Address) (event.Subscription, error)
⋮----
// ParseOperatorSharesIncreased is a log parse operation binding the contract event 0x1ec042c965e2edd7107b51188ee0f383e22e76179041ab3a9d18ff151405166c.
⋮----
func (_IDelegationManager *IDelegationManagerFilterer) ParseOperatorSharesIncreased(log types.Log) (*IDelegationManagerOperatorSharesIncreased, error)
⋮----
// IDelegationManagerOperatorSharesSlashedIterator is returned from FilterOperatorSharesSlashed and is used to iterate over the raw logs and unpacked data for OperatorSharesSlashed events raised by the IDelegationManager contract.
type IDelegationManagerOperatorSharesSlashedIterator struct {
	Event *IDelegationManagerOperatorSharesSlashed // Event containing the contract specifics and raw log

	contract *bind.BoundContract // Generic contract to use for unpacking event data
	event    string              // Event name to use for unpacking event data

	logs chan types.Log        // Log channel receiving the found contract events
	sub  ethereum.Subscription // Subscription for errors, completion and termination
	done bool                  // Whether the subscription completed delivering logs
	fail error                 // Occurred error to stop iteration
}
⋮----
Event *IDelegationManagerOperatorSharesSlashed // Event containing the contract specifics and raw log
⋮----
// IDelegationManagerOperatorSharesSlashed represents a OperatorSharesSlashed event raised by the IDelegationManager contract.
type IDelegationManagerOperatorSharesSlashed struct {
	Operator           common.Address
	Strategy           common.Address
	TotalSlashedShares *big.Int
	Raw                types.Log // Blockchain specific contextual infos
}
⋮----
// FilterOperatorSharesSlashed is a free log retrieval operation binding the contract event 0xdd611f4ef63f4385f1756c86ce1f1f389a9013ba6fa07daba8528291bc2d3c30.
⋮----
// Solidity: event OperatorSharesSlashed(address indexed operator, address strategy, uint256 totalSlashedShares)
func (_IDelegationManager *IDelegationManagerFilterer) FilterOperatorSharesSlashed(opts *bind.FilterOpts, operator []common.Address) (*IDelegationManagerOperatorSharesSlashedIterator, error)
⋮----
// WatchOperatorSharesSlashed is a free log subscription operation binding the contract event 0xdd611f4ef63f4385f1756c86ce1f1f389a9013ba6fa07daba8528291bc2d3c30.
⋮----
func (_IDelegationManager *IDelegationManagerFilterer) WatchOperatorSharesSlashed(opts *bind.WatchOpts, sink chan<- *IDelegationManagerOperatorSharesSlashed, operator []common.Address) (event.Subscription, error)
⋮----
// ParseOperatorSharesSlashed is a log parse operation binding the contract event 0xdd611f4ef63f4385f1756c86ce1f1f389a9013ba6fa07daba8528291bc2d3c30.
⋮----
func (_IDelegationManager *IDelegationManagerFilterer) ParseOperatorSharesSlashed(log types.Log) (*IDelegationManagerOperatorSharesSlashed, error)
⋮----
// IDelegationManagerSlashingWithdrawalCompletedIterator is returned from FilterSlashingWithdrawalCompleted and is used to iterate over the raw logs and unpacked data for SlashingWithdrawalCompleted events raised by the IDelegationManager contract.
type IDelegationManagerSlashingWithdrawalCompletedIterator struct {
	Event *IDelegationManagerSlashingWithdrawalCompleted // Event containing the contract specifics and raw log

	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
}
⋮----
Event *IDelegationManagerSlashingWithdrawalCompleted // Event containing the contract specifics and raw log
⋮----
// IDelegationManagerSlashingWithdrawalCompleted represents a SlashingWithdrawalCompleted event raised by the IDelegationManager contract.
type IDelegationManagerSlashingWithdrawalCompleted struct {
	WithdrawalRoot [32]byte
	Raw            types.Log // Blockchain specific contextual infos
}
⋮----
Raw            types.Log // Blockchain specific contextual infos
⋮----
// FilterSlashingWithdrawalCompleted is a free log retrieval operation binding the contract event 0x1f40400889274ed07b24845e5054a87a0cab969eb1277aafe61ae352e7c32a00.
⋮----
// Solidity: event SlashingWithdrawalCompleted(bytes32 withdrawalRoot)
func (_IDelegationManager *IDelegationManagerFilterer) FilterSlashingWithdrawalCompleted(opts *bind.FilterOpts) (*IDelegationManagerSlashingWithdrawalCompletedIterator, error)
⋮----
// WatchSlashingWithdrawalCompleted is a free log subscription operation binding the contract event 0x1f40400889274ed07b24845e5054a87a0cab969eb1277aafe61ae352e7c32a00.
⋮----
func (_IDelegationManager *IDelegationManagerFilterer) WatchSlashingWithdrawalCompleted(opts *bind.WatchOpts, sink chan<- *IDelegationManagerSlashingWithdrawalCompleted) (event.Subscription, error)
⋮----
// ParseSlashingWithdrawalCompleted is a log parse operation binding the contract event 0x1f40400889274ed07b24845e5054a87a0cab969eb1277aafe61ae352e7c32a00.
⋮----
func (_IDelegationManager *IDelegationManagerFilterer) ParseSlashingWithdrawalCompleted(log types.Log) (*IDelegationManagerSlashingWithdrawalCompleted, error)
⋮----
// IDelegationManagerSlashingWithdrawalQueuedIterator is returned from FilterSlashingWithdrawalQueued and is used to iterate over the raw logs and unpacked data for SlashingWithdrawalQueued events raised by the IDelegationManager contract.
type IDelegationManagerSlashingWithdrawalQueuedIterator struct {
	Event *IDelegationManagerSlashingWithdrawalQueued // 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
}
⋮----
Event *IDelegationManagerSlashingWithdrawalQueued // Event containing the contract specifics and raw log
⋮----
// IDelegationManagerSlashingWithdrawalQueued represents a SlashingWithdrawalQueued event raised by the IDelegationManager contract.
type IDelegationManagerSlashingWithdrawalQueued struct {
	WithdrawalRoot   [32]byte
	Withdrawal       IDelegationManagerTypesWithdrawal
	SharesToWithdraw []*big.Int
	Raw              types.Log // Blockchain specific contextual infos
}
⋮----
Raw              types.Log // Blockchain specific contextual infos
⋮----
// FilterSlashingWithdrawalQueued is a free log retrieval operation binding the contract event 0x26b2aae26516e8719ef50ea2f6831a2efbd4e37dccdf0f6936b27bc08e793e30.
⋮----
// Solidity: event SlashingWithdrawalQueued(bytes32 withdrawalRoot, (address,address,address,uint256,uint32,address[],uint256[]) withdrawal, uint256[] sharesToWithdraw)
func (_IDelegationManager *IDelegationManagerFilterer) FilterSlashingWithdrawalQueued(opts *bind.FilterOpts) (*IDelegationManagerSlashingWithdrawalQueuedIterator, error)
⋮----
// WatchSlashingWithdrawalQueued is a free log subscription operation binding the contract event 0x26b2aae26516e8719ef50ea2f6831a2efbd4e37dccdf0f6936b27bc08e793e30.
⋮----
func (_IDelegationManager *IDelegationManagerFilterer) WatchSlashingWithdrawalQueued(opts *bind.WatchOpts, sink chan<- *IDelegationManagerSlashingWithdrawalQueued) (event.Subscription, error)
⋮----
// ParseSlashingWithdrawalQueued is a log parse operation binding the contract event 0x26b2aae26516e8719ef50ea2f6831a2efbd4e37dccdf0f6936b27bc08e793e30.
⋮----
func (_IDelegationManager *IDelegationManagerFilterer) ParseSlashingWithdrawalQueued(log types.Log) (*IDelegationManagerSlashingWithdrawalQueued, error)
⋮----
// IDelegationManagerStakerDelegatedIterator is returned from FilterStakerDelegated and is used to iterate over the raw logs and unpacked data for StakerDelegated events raised by the IDelegationManager contract.
type IDelegationManagerStakerDelegatedIterator struct {
	Event *IDelegationManagerStakerDelegated // 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
}
⋮----
Event *IDelegationManagerStakerDelegated // Event containing the contract specifics and raw log
⋮----
// IDelegationManagerStakerDelegated represents a StakerDelegated event raised by the IDelegationManager contract.
type IDelegationManagerStakerDelegated struct {
	Staker   common.Address
	Operator common.Address
	Raw      types.Log // Blockchain specific contextual infos
}
⋮----
// FilterStakerDelegated is a free log retrieval operation binding the contract event 0xc3ee9f2e5fda98e8066a1f745b2df9285f416fe98cf2559cd21484b3d8743304.
⋮----
// Solidity: event StakerDelegated(address indexed staker, address indexed operator)
func (_IDelegationManager *IDelegationManagerFilterer) FilterStakerDelegated(opts *bind.FilterOpts, staker []common.Address, operator []common.Address) (*IDelegationManagerStakerDelegatedIterator, error)
⋮----
var stakerRule []interface{}
⋮----
// WatchStakerDelegated is a free log subscription operation binding the contract event 0xc3ee9f2e5fda98e8066a1f745b2df9285f416fe98cf2559cd21484b3d8743304.
⋮----
func (_IDelegationManager *IDelegationManagerFilterer) WatchStakerDelegated(opts *bind.WatchOpts, sink chan<- *IDelegationManagerStakerDelegated, staker []common.Address, operator []common.Address) (event.Subscription, error)
⋮----
// ParseStakerDelegated is a log parse operation binding the contract event 0xc3ee9f2e5fda98e8066a1f745b2df9285f416fe98cf2559cd21484b3d8743304.
⋮----
func (_IDelegationManager *IDelegationManagerFilterer) ParseStakerDelegated(log types.Log) (*IDelegationManagerStakerDelegated, error)
⋮----
// IDelegationManagerStakerForceUndelegatedIterator is returned from FilterStakerForceUndelegated and is used to iterate over the raw logs and unpacked data for StakerForceUndelegated events raised by the IDelegationManager contract.
type IDelegationManagerStakerForceUndelegatedIterator struct {
	Event *IDelegationManagerStakerForceUndelegated // 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
}
⋮----
Event *IDelegationManagerStakerForceUndelegated // Event containing the contract specifics and raw log
⋮----
// IDelegationManagerStakerForceUndelegated represents a StakerForceUndelegated event raised by the IDelegationManager contract.
type IDelegationManagerStakerForceUndelegated struct {
	Staker   common.Address
	Operator common.Address
	Raw      types.Log // Blockchain specific contextual infos
}
⋮----
// FilterStakerForceUndelegated is a free log retrieval operation binding the contract event 0xf0eddf07e6ea14f388b47e1e94a0f464ecbd9eed4171130e0fc0e99fb4030a8a.
⋮----
// Solidity: event StakerForceUndelegated(address indexed staker, address indexed operator)
func (_IDelegationManager *IDelegationManagerFilterer) FilterStakerForceUndelegated(opts *bind.FilterOpts, staker []common.Address, operator []common.Address) (*IDelegationManagerStakerForceUndelegatedIterator, error)
⋮----
// WatchStakerForceUndelegated is a free log subscription operation binding the contract event 0xf0eddf07e6ea14f388b47e1e94a0f464ecbd9eed4171130e0fc0e99fb4030a8a.
⋮----
func (_IDelegationManager *IDelegationManagerFilterer) WatchStakerForceUndelegated(opts *bind.WatchOpts, sink chan<- *IDelegationManagerStakerForceUndelegated, staker []common.Address, operator []common.Address) (event.Subscription, error)
⋮----
// ParseStakerForceUndelegated is a log parse operation binding the contract event 0xf0eddf07e6ea14f388b47e1e94a0f464ecbd9eed4171130e0fc0e99fb4030a8a.
⋮----
func (_IDelegationManager *IDelegationManagerFilterer) ParseStakerForceUndelegated(log types.Log) (*IDelegationManagerStakerForceUndelegated, error)
⋮----
// IDelegationManagerStakerUndelegatedIterator is returned from FilterStakerUndelegated and is used to iterate over the raw logs and unpacked data for StakerUndelegated events raised by the IDelegationManager contract.
type IDelegationManagerStakerUndelegatedIterator struct {
	Event *IDelegationManagerStakerUndelegated // 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
}
⋮----
Event *IDelegationManagerStakerUndelegated // Event containing the contract specifics and raw log
⋮----
// IDelegationManagerStakerUndelegated represents a StakerUndelegated event raised by the IDelegationManager contract.
type IDelegationManagerStakerUndelegated struct {
	Staker   common.Address
	Operator common.Address
	Raw      types.Log // Blockchain specific contextual infos
}
⋮----
// FilterStakerUndelegated is a free log retrieval operation binding the contract event 0xfee30966a256b71e14bc0ebfc94315e28ef4a97a7131a9e2b7a310a73af44676.
⋮----
// Solidity: event StakerUndelegated(address indexed staker, address indexed operator)
func (_IDelegationManager *IDelegationManagerFilterer) FilterStakerUndelegated(opts *bind.FilterOpts, staker []common.Address, operator []common.Address) (*IDelegationManagerStakerUndelegatedIterator, error)
⋮----
// WatchStakerUndelegated is a free log subscription operation binding the contract event 0xfee30966a256b71e14bc0ebfc94315e28ef4a97a7131a9e2b7a310a73af44676.
⋮----
func (_IDelegationManager *IDelegationManagerFilterer) WatchStakerUndelegated(opts *bind.WatchOpts, sink chan<- *IDelegationManagerStakerUndelegated, staker []common.Address, operator []common.Address) (event.Subscription, error)
⋮----
// ParseStakerUndelegated is a log parse operation binding the contract event 0xfee30966a256b71e14bc0ebfc94315e28ef4a97a7131a9e2b7a310a73af44676.
⋮----
func (_IDelegationManager *IDelegationManagerFilterer) ParseStakerUndelegated(log types.Log) (*IDelegationManagerStakerUndelegated, error)
````

## File: pkg/bindings/IDurationVaultStrategy/binding.go
````go
// 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"
)
⋮----
"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     // 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
}
⋮----
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
}
⋮----
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
}
⋮----
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
}
⋮----
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
}
⋮----
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
}
⋮----
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
}
⋮----
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)
⋮----
// 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)
⋮----
// 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)
⋮----
// 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)
⋮----
// 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)
⋮----
// 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
⋮----
// 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)
⋮----
// Transact invokes the (paid) contract method with params as input values.
func (_IDurationVaultStrategy *IDurationVaultStrategyRaw) Transact(opts *bind.TransactOpts, method string, params ...interface
⋮----
// 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{}
⋮----
// 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)
⋮----
// 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)
⋮----
// 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)
⋮----
// 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)
⋮----
// 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)
⋮----
// 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)
⋮----
// 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)
⋮----
// 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)
⋮----
// 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)
⋮----
// 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)
⋮----
// 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)
⋮----
// 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)
⋮----
// 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)
⋮----
// 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
⋮----
// 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)
⋮----
// 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)
⋮----
// 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)
⋮----
// 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)
⋮----
// 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)
⋮----
// 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)
⋮----
// 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)
⋮----
// 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)
⋮----
// 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)
⋮----
// 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)
⋮----
// 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)
⋮----
// 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)
⋮----
// 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)
⋮----
// 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)
⋮----
// 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)
⋮----
// 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)
⋮----
// 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)
⋮----
// 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)
⋮----
// 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)
⋮----
// 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)
⋮----
// 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)
⋮----
// 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)
⋮----
// 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)
⋮----
// 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)
⋮----
// 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)
⋮----
// 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)
⋮----
// 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)
⋮----
// 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)
⋮----
// 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
}
⋮----
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 the iterator completed, deliver directly whatever's available
⋮----
// Iterator still in progress, wait for either a data or an error event
⋮----
// Error returns any retrieval or parsing error occurred during filtering.
func (it *IDurationVaultStrategyDeallocateAttemptedIterator) Error() error
⋮----
// Close terminates the iteration process, releasing any pending underlying
// resources.
func (it *IDurationVaultStrategyDeallocateAttemptedIterator) Close() error
⋮----
// IDurationVaultStrategyDeallocateAttempted represents a DeallocateAttempted event raised by the IDurationVaultStrategy contract.
type IDurationVaultStrategyDeallocateAttempted struct {
	Success bool
	Raw     types.Log // Blockchain specific contextual infos
}
⋮----
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)
⋮----
// WatchDeallocateAttempted is a free log subscription operation binding the contract event 0x72f957da7daaea6b52e4ff7820cb464206fd51e9f502f3027f45b5017caf4c8b.
⋮----
func (_IDurationVaultStrategy *IDurationVaultStrategyFilterer) WatchDeallocateAttempted(opts *bind.WatchOpts, sink chan<- *IDurationVaultStrategyDeallocateAttempted) (event.Subscription, error)
⋮----
// New log arrived, parse the event and forward to the user
⋮----
// ParseDeallocateAttempted is a log parse operation binding the contract event 0x72f957da7daaea6b52e4ff7820cb464206fd51e9f502f3027f45b5017caf4c8b.
⋮----
func (_IDurationVaultStrategy *IDurationVaultStrategyFilterer) ParseDeallocateAttempted(log types.Log) (*IDurationVaultStrategyDeallocateAttempted, error)
⋮----
// 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
}
⋮----
Event *IDurationVaultStrategyDeregisterAttempted // Event containing the contract specifics and raw log
⋮----
// 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)
⋮----
// WatchDeregisterAttempted is a free log subscription operation binding the contract event 0xd0791dbc9180cb64588d7eb7658a1022dcf734b8825eb7eec68bd9516872d168.
⋮----
func (_IDurationVaultStrategy *IDurationVaultStrategyFilterer) WatchDeregisterAttempted(opts *bind.WatchOpts, sink chan<- *IDurationVaultStrategyDeregisterAttempted) (event.Subscription, error)
⋮----
// ParseDeregisterAttempted is a log parse operation binding the contract event 0xd0791dbc9180cb64588d7eb7658a1022dcf734b8825eb7eec68bd9516872d168.
⋮----
func (_IDurationVaultStrategy *IDurationVaultStrategyFilterer) ParseDeregisterAttempted(log types.Log) (*IDurationVaultStrategyDeregisterAttempted, error)
⋮----
// 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
}
⋮----
Event *IDurationVaultStrategyExchangeRateEmitted // Event containing the contract specifics and raw log
⋮----
// IDurationVaultStrategyExchangeRateEmitted represents a ExchangeRateEmitted event raised by the IDurationVaultStrategy contract.
type IDurationVaultStrategyExchangeRateEmitted struct {
	Rate *big.Int
	Raw  types.Log // Blockchain specific contextual infos
}
⋮----
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)
⋮----
// WatchExchangeRateEmitted is a free log subscription operation binding the contract event 0xd2494f3479e5da49d386657c292c610b5b01df313d07c62eb0cfa49924a31be8.
⋮----
func (_IDurationVaultStrategy *IDurationVaultStrategyFilterer) WatchExchangeRateEmitted(opts *bind.WatchOpts, sink chan<- *IDurationVaultStrategyExchangeRateEmitted) (event.Subscription, error)
⋮----
// ParseExchangeRateEmitted is a log parse operation binding the contract event 0xd2494f3479e5da49d386657c292c610b5b01df313d07c62eb0cfa49924a31be8.
⋮----
func (_IDurationVaultStrategy *IDurationVaultStrategyFilterer) ParseExchangeRateEmitted(log types.Log) (*IDurationVaultStrategyExchangeRateEmitted, error)
⋮----
// 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
}
⋮----
Event *IDurationVaultStrategyMaxPerDepositUpdated // Event containing the contract specifics and raw log
⋮----
// 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
}
⋮----
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)
⋮----
// WatchMaxPerDepositUpdated is a free log subscription operation binding the contract event 0xf97ed4e083acac67830025ecbc756d8fe847cdbdca4cee3fe1e128e98b54ecb5.
⋮----
func (_IDurationVaultStrategy *IDurationVaultStrategyFilterer) WatchMaxPerDepositUpdated(opts *bind.WatchOpts, sink chan<- *IDurationVaultStrategyMaxPerDepositUpdated) (event.Subscription, error)
⋮----
// ParseMaxPerDepositUpdated is a log parse operation binding the contract event 0xf97ed4e083acac67830025ecbc756d8fe847cdbdca4cee3fe1e128e98b54ecb5.
⋮----
func (_IDurationVaultStrategy *IDurationVaultStrategyFilterer) ParseMaxPerDepositUpdated(log types.Log) (*IDurationVaultStrategyMaxPerDepositUpdated, error)
⋮----
// 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
}
⋮----
Event *IDurationVaultStrategyMaxTotalDepositsUpdated // Event containing the contract specifics and raw log
⋮----
// 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)
⋮----
// WatchMaxTotalDepositsUpdated is a free log subscription operation binding the contract event 0x6ab181e0440bfbf4bacdf2e99674735ce6638005490688c5f994f5399353e452.
⋮----
func (_IDurationVaultStrategy *IDurationVaultStrategyFilterer) WatchMaxTotalDepositsUpdated(opts *bind.WatchOpts, sink chan<- *IDurationVaultStrategyMaxTotalDepositsUpdated) (event.Subscription, error)
⋮----
// ParseMaxTotalDepositsUpdated is a log parse operation binding the contract event 0x6ab181e0440bfbf4bacdf2e99674735ce6638005490688c5f994f5399353e452.
⋮----
func (_IDurationVaultStrategy *IDurationVaultStrategyFilterer) ParseMaxTotalDepositsUpdated(log types.Log) (*IDurationVaultStrategyMaxTotalDepositsUpdated, error)
⋮----
// 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
}
⋮----
Event *IDurationVaultStrategyMetadataURIUpdated // Event containing the contract specifics and raw log
⋮----
// IDurationVaultStrategyMetadataURIUpdated represents a MetadataURIUpdated event raised by the IDurationVaultStrategy contract.
type IDurationVaultStrategyMetadataURIUpdated struct {
	NewMetadataURI string
	Raw            types.Log // Blockchain specific contextual infos
}
⋮----
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)
⋮----
// WatchMetadataURIUpdated is a free log subscription operation binding the contract event 0xefafb90526da1636e1335eac0151301742fb755d986954c613b90e891778ba39.
⋮----
func (_IDurationVaultStrategy *IDurationVaultStrategyFilterer) WatchMetadataURIUpdated(opts *bind.WatchOpts, sink chan<- *IDurationVaultStrategyMetadataURIUpdated) (event.Subscription, error)
⋮----
// ParseMetadataURIUpdated is a log parse operation binding the contract event 0xefafb90526da1636e1335eac0151301742fb755d986954c613b90e891778ba39.
⋮----
func (_IDurationVaultStrategy *IDurationVaultStrategyFilterer) ParseMetadataURIUpdated(log types.Log) (*IDurationVaultStrategyMetadataURIUpdated, error)
⋮----
// 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
}
⋮----
Event *IDurationVaultStrategyStrategyTokenSet // Event containing the contract specifics and raw log
⋮----
// 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
}
⋮----
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)
⋮----
// WatchStrategyTokenSet is a free log subscription operation binding the contract event 0x1c540707b00eb5427b6b774fc799d756516a54aee108b64b327acc55af557507.
⋮----
func (_IDurationVaultStrategy *IDurationVaultStrategyFilterer) WatchStrategyTokenSet(opts *bind.WatchOpts, sink chan<- *IDurationVaultStrategyStrategyTokenSet) (event.Subscription, error)
⋮----
// ParseStrategyTokenSet is a log parse operation binding the contract event 0x1c540707b00eb5427b6b774fc799d756516a54aee108b64b327acc55af557507.
⋮----
func (_IDurationVaultStrategy *IDurationVaultStrategyFilterer) ParseStrategyTokenSet(log types.Log) (*IDurationVaultStrategyStrategyTokenSet, error)
⋮----
// 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
}
⋮----
Event *IDurationVaultStrategyVaultAdvancedToWithdrawals // Event containing the contract specifics and raw log
⋮----
// 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
}
⋮----
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{}
⋮----
// WatchVaultAdvancedToWithdrawals is a free log subscription operation binding the contract event 0x96c49d03ef64591194500229a104cd087b2d45c68234c96444c3a2a6abb0bb97.
⋮----
func (_IDurationVaultStrategy *IDurationVaultStrategyFilterer) WatchVaultAdvancedToWithdrawals(opts *bind.WatchOpts, sink chan<- *IDurationVaultStrategyVaultAdvancedToWithdrawals, arbitrator []common.Address) (event.Subscription, error)
⋮----
// ParseVaultAdvancedToWithdrawals is a log parse operation binding the contract event 0x96c49d03ef64591194500229a104cd087b2d45c68234c96444c3a2a6abb0bb97.
⋮----
func (_IDurationVaultStrategy *IDurationVaultStrategyFilterer) ParseVaultAdvancedToWithdrawals(log types.Log) (*IDurationVaultStrategyVaultAdvancedToWithdrawals, error)
⋮----
// 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
}
⋮----
Event *IDurationVaultStrategyVaultInitialized // Event containing the contract specifics and raw log
⋮----
// 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
}
⋮----
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{}
⋮----
var underlyingTokenRule []interface{}
⋮----
// WatchVaultInitialized is a free log subscription operation binding the contract event 0xbdbff63632f473bb2a7c6a4aafbc096b71fbda12e22c6b51643bfd64f13d2b9e.
⋮----
func (_IDurationVaultStrategy *IDurationVaultStrategyFilterer) WatchVaultInitialized(opts *bind.WatchOpts, sink chan<- *IDurationVaultStrategyVaultInitialized, vaultAdmin []common.Address, arbitrator []common.Address, underlyingToken []common.Address) (event.Subscription, error)
⋮----
// ParseVaultInitialized is a log parse operation binding the contract event 0xbdbff63632f473bb2a7c6a4aafbc096b71fbda12e22c6b51643bfd64f13d2b9e.
⋮----
func (_IDurationVaultStrategy *IDurationVaultStrategyFilterer) ParseVaultInitialized(log types.Log) (*IDurationVaultStrategyVaultInitialized, error)
⋮----
// 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
}
⋮----
Event *IDurationVaultStrategyVaultLocked // Event containing the contract specifics and raw log
⋮----
// 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)
⋮----
// WatchVaultLocked is a free log subscription operation binding the contract event 0x42cd6d7338516695d9c9ff8969dbdcf89ce22e3f2f76fda2fc11e973fe4860e4.
⋮----
func (_IDurationVaultStrategy *IDurationVaultStrategyFilterer) WatchVaultLocked(opts *bind.WatchOpts, sink chan<- *IDurationVaultStrategyVaultLocked) (event.Subscription, error)
⋮----
// ParseVaultLocked is a log parse operation binding the contract event 0x42cd6d7338516695d9c9ff8969dbdcf89ce22e3f2f76fda2fc11e973fe4860e4.
⋮----
func (_IDurationVaultStrategy *IDurationVaultStrategyFilterer) ParseVaultLocked(log types.Log) (*IDurationVaultStrategyVaultLocked, error)
⋮----
// 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
}
⋮----
Event *IDurationVaultStrategyVaultMatured // Event containing the contract specifics and raw log
⋮----
// IDurationVaultStrategyVaultMatured represents a VaultMatured event raised by the IDurationVaultStrategy contract.
type IDurationVaultStrategyVaultMatured struct {
	MaturedAt uint32
	Raw       types.Log // Blockchain specific contextual infos
}
⋮----
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)
⋮----
// WatchVaultMatured is a free log subscription operation binding the contract event 0xff979382d3040b1602e0a02f0f2a454b2250aa36e891d2da0ceb95d70d11a8f2.
⋮----
func (_IDurationVaultStrategy *IDurationVaultStrategyFilterer) WatchVaultMatured(opts *bind.WatchOpts, sink chan<- *IDurationVaultStrategyVaultMatured) (event.Subscription, error)
⋮----
// ParseVaultMatured is a log parse operation binding the contract event 0xff979382d3040b1602e0a02f0f2a454b2250aa36e891d2da0ceb95d70d11a8f2.
⋮----
func (_IDurationVaultStrategy *IDurationVaultStrategyFilterer) ParseVaultMatured(log types.Log) (*IDurationVaultStrategyVaultMatured, error)
````

## File: pkg/bindings/IECDSACertificateVerifier/binding.go
````go
// Code generated - DO NOT EDIT.
// This file is a generated binding and any manual changes will be lost.
⋮----
package IECDSACertificateVerifier
⋮----
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"
)
⋮----
"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
)
⋮----
// ICrossChainRegistryTypesOperatorSetConfig is an auto generated low-level Go binding around an user-defined struct.
type ICrossChainRegistryTypesOperatorSetConfig struct {
	Owner              common.Address
	MaxStalenessPeriod uint32
}
⋮----
// IECDSACertificateVerifierTypesECDSACertificate is an auto generated low-level Go binding around an user-defined struct.
type IECDSACertificateVerifierTypesECDSACertificate struct {
	ReferenceTimestamp uint32
	MessageHash        [32]byte
	Sig                []byte
}
⋮----
// IOperatorTableCalculatorTypesECDSAOperatorInfo is an auto generated low-level Go binding around an user-defined struct.
type IOperatorTableCalculatorTypesECDSAOperatorInfo struct {
	Pubkey  common.Address
	Weights []*big.Int
}
⋮----
// OperatorSet is an auto generated low-level Go binding around an user-defined struct.
type OperatorSet struct {
	Avs common.Address
	Id  uint32
}
⋮----
// IECDSACertificateVerifierMetaData contains all meta data concerning the IECDSACertificateVerifier contract.
var IECDSACertificateVerifierMetaData = &bind.MetaData{
	ABI: "[{\"type\":\"function\",\"name\":\"calculateCertificateDigest\",\"inputs\":[{\"name\":\"referenceTimestamp\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"messageHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"calculateCertificateDigestBytes\",\"inputs\":[{\"name\":\"referenceTimestamp\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"messageHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"domainSeparator\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getOperatorCount\",\"inputs\":[{\"name\":\"operatorSet\",\"type\":\"tuple\",\"internalType\":\"structOperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]},{\"name\":\"referenceTimestamp\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getOperatorInfo\",\"inputs\":[{\"name\":\"operatorSet\",\"type\":\"tuple\",\"internalType\":\"structOperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]},{\"name\":\"referenceTimestamp\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"operatorIndex\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"tuple\",\"internalType\":\"structIOperatorTableCalculatorTypes.ECDSAOperatorInfo\",\"components\":[{\"name\":\"pubkey\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"weights\",\"type\":\"uint256[]\",\"internalType\":\"uint256[]\"}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getOperatorInfos\",\"inputs\":[{\"name\":\"operatorSet\",\"type\":\"tuple\",\"internalType\":\"structOperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]},{\"name\":\"referenceTimestamp\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"tuple[]\",\"internalType\":\"structIOperatorTableCalculatorTypes.ECDSAOperatorInfo[]\",\"components\":[{\"name\":\"pubkey\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"weights\",\"type\":\"uint256[]\",\"internalType\":\"uint256[]\"}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getOperatorSetOwner\",\"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\":\"getTotalStakeWeights\",\"inputs\":[{\"name\":\"operatorSet\",\"type\":\"tuple\",\"internalType\":\"structOperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]},{\"name\":\"referenceTimestamp\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256[]\",\"internalType\":\"uint256[]\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"isReferenceTimestampSet\",\"inputs\":[{\"name\":\"operatorSet\",\"type\":\"tuple\",\"internalType\":\"structOperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]},{\"name\":\"referenceTimestamp\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"latestReferenceTimestamp\",\"inputs\":[{\"name\":\"operatorSet\",\"type\":\"tuple\",\"internalType\":\"structOperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]}],\"outputs\":[{\"name\":\"\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"maxOperatorTableStaleness\",\"inputs\":[{\"name\":\"operatorSet\",\"type\":\"tuple\",\"internalType\":\"structOperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]}],\"outputs\":[{\"name\":\"\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"updateOperatorTable\",\"inputs\":[{\"name\":\"operatorSet\",\"type\":\"tuple\",\"internalType\":\"structOperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]},{\"name\":\"referenceTimestamp\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"operatorInfos\",\"type\":\"tuple[]\",\"internalType\":\"structIOperatorTableCalculatorTypes.ECDSAOperatorInfo[]\",\"components\":[{\"name\":\"pubkey\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"weights\",\"type\":\"uint256[]\",\"internalType\":\"uint256[]\"}]},{\"name\":\"operatorSetConfig\",\"type\":\"tuple\",\"internalType\":\"structICrossChainRegistryTypes.OperatorSetConfig\",\"components\":[{\"name\":\"owner\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"maxStalenessPeriod\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"verifyCertificate\",\"inputs\":[{\"name\":\"operatorSet\",\"type\":\"tuple\",\"internalType\":\"structOperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]},{\"name\":\"cert\",\"type\":\"tuple\",\"internalType\":\"structIECDSACertificateVerifierTypes.ECDSACertificate\",\"components\":[{\"name\":\"referenceTimestamp\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"messageHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"sig\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]}],\"outputs\":[{\"name\":\"totalSignedStakeWeights\",\"type\":\"uint256[]\",\"internalType\":\"uint256[]\"},{\"name\":\"signers\",\"type\":\"address[]\",\"internalType\":\"address[]\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"verifyCertificateNominal\",\"inputs\":[{\"name\":\"operatorSet\",\"type\":\"tuple\",\"internalType\":\"structOperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]},{\"name\":\"cert\",\"type\":\"tuple\",\"internalType\":\"structIECDSACertificateVerifierTypes.ECDSACertificate\",\"components\":[{\"name\":\"referenceTimestamp\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"messageHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"sig\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]},{\"name\":\"totalStakeNominalThresholds\",\"type\":\"uint256[]\",\"internalType\":\"uint256[]\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"signers\",\"type\":\"address[]\",\"internalType\":\"address[]\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"verifyCertificateProportion\",\"inputs\":[{\"name\":\"operatorSet\",\"type\":\"tuple\",\"internalType\":\"structOperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]},{\"name\":\"cert\",\"type\":\"tuple\",\"internalType\":\"structIECDSACertificateVerifierTypes.ECDSACertificate\",\"components\":[{\"name\":\"referenceTimestamp\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"messageHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"sig\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]},{\"name\":\"totalStakeProportionThresholds\",\"type\":\"uint16[]\",\"internalType\":\"uint16[]\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"signers\",\"type\":\"address[]\",\"internalType\":\"address[]\"}],\"stateMutability\":\"view\"},{\"type\":\"event\",\"name\":\"MaxStalenessPeriodUpdated\",\"inputs\":[{\"name\":\"operatorSet\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structOperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]},{\"name\":\"maxStalenessPeriod\",\"type\":\"uint32\",\"indexed\":false,\"internalType\":\"uint32\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"OperatorSetOwnerUpdated\",\"inputs\":[{\"name\":\"operatorSet\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structOperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]},{\"name\":\"owner\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"TableUpdated\",\"inputs\":[{\"name\":\"operatorSet\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structOperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]},{\"name\":\"referenceTimestamp\",\"type\":\"uint32\",\"indexed\":false,\"internalType\":\"uint32\"},{\"name\":\"operatorInfos\",\"type\":\"tuple[]\",\"indexed\":false,\"internalType\":\"structIOperatorTableCalculatorTypes.ECDSAOperatorInfo[]\",\"components\":[{\"name\":\"pubkey\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"weights\",\"type\":\"uint256[]\",\"internalType\":\"uint256[]\"}]}],\"anonymous\":false},{\"type\":\"error\",\"name\":\"ArrayLengthMismatch\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"CertificateStale\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"IndexOutOfBounds\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidSignatureLength\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"OnlyTableUpdater\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"OperatorCountZero\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ReferenceTimestampDoesNotExist\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"RootDisabled\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"SignersNotOrdered\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"TableUpdateStale\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"VerificationFailed\",\"inputs\":[]}]",
}
⋮----
// IECDSACertificateVerifierABI is the input ABI used to generate the binding from.
// Deprecated: Use IECDSACertificateVerifierMetaData.ABI instead.
var IECDSACertificateVerifierABI = IECDSACertificateVerifierMetaData.ABI
⋮----
// IECDSACertificateVerifier is an auto generated Go binding around an Ethereum contract.
type IECDSACertificateVerifier struct {
	IECDSACertificateVerifierCaller     // Read-only binding to the contract
	IECDSACertificateVerifierTransactor // Write-only binding to the contract
	IECDSACertificateVerifierFilterer   // Log filterer for contract events
}
⋮----
IECDSACertificateVerifierCaller     // Read-only binding to the contract
IECDSACertificateVerifierTransactor // Write-only binding to the contract
IECDSACertificateVerifierFilterer   // Log filterer for contract events
⋮----
// IECDSACertificateVerifierCaller is an auto generated read-only Go binding around an Ethereum contract.
type IECDSACertificateVerifierCaller struct {
	contract *bind.BoundContract // Generic contract wrapper for the low level calls
}
⋮----
contract *bind.BoundContract // Generic contract wrapper for the low level calls
⋮----
// IECDSACertificateVerifierTransactor is an auto generated write-only Go binding around an Ethereum contract.
type IECDSACertificateVerifierTransactor struct {
	contract *bind.BoundContract // Generic contract wrapper for the low level calls
}
⋮----
// IECDSACertificateVerifierFilterer is an auto generated log filtering Go binding around an Ethereum contract events.
type IECDSACertificateVerifierFilterer struct {
	contract *bind.BoundContract // Generic contract wrapper for the low level calls
}
⋮----
// IECDSACertificateVerifierSession is an auto generated Go binding around an Ethereum contract,
// with pre-set call and transact options.
type IECDSACertificateVerifierSession struct {
	Contract     *IECDSACertificateVerifier // 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
}
⋮----
Contract     *IECDSACertificateVerifier // 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
⋮----
// IECDSACertificateVerifierCallerSession is an auto generated read-only Go binding around an Ethereum contract,
// with pre-set call options.
type IECDSACertificateVerifierCallerSession struct {
	Contract *IECDSACertificateVerifierCaller // Generic contract caller binding to set the session for
	CallOpts bind.CallOpts                    // Call options to use throughout this session
}
⋮----
Contract *IECDSACertificateVerifierCaller // Generic contract caller binding to set the session for
CallOpts bind.CallOpts                    // Call options to use throughout this session
⋮----
// IECDSACertificateVerifierTransactorSession is an auto generated write-only Go binding around an Ethereum contract,
// with pre-set transact options.
type IECDSACertificateVerifierTransactorSession struct {
	Contract     *IECDSACertificateVerifierTransactor // Generic contract transactor binding to set the session for
	TransactOpts bind.TransactOpts                    // Transaction auth options to use throughout this session
}
⋮----
Contract     *IECDSACertificateVerifierTransactor // Generic contract transactor binding to set the session for
TransactOpts bind.TransactOpts                    // Transaction auth options to use throughout this session
⋮----
// IECDSACertificateVerifierRaw is an auto generated low-level Go binding around an Ethereum contract.
type IECDSACertificateVerifierRaw struct {
	Contract *IECDSACertificateVerifier // Generic contract binding to access the raw methods on
}
⋮----
Contract *IECDSACertificateVerifier // Generic contract binding to access the raw methods on
⋮----
// IECDSACertificateVerifierCallerRaw is an auto generated low-level read-only Go binding around an Ethereum contract.
type IECDSACertificateVerifierCallerRaw struct {
	Contract *IECDSACertificateVerifierCaller // Generic read-only contract binding to access the raw methods on
}
⋮----
Contract *IECDSACertificateVerifierCaller // Generic read-only contract binding to access the raw methods on
⋮----
// IECDSACertificateVerifierTransactorRaw is an auto generated low-level write-only Go binding around an Ethereum contract.
type IECDSACertificateVerifierTransactorRaw struct {
	Contract *IECDSACertificateVerifierTransactor // Generic write-only contract binding to access the raw methods on
}
⋮----
Contract *IECDSACertificateVerifierTransactor // Generic write-only contract binding to access the raw methods on
⋮----
// NewIECDSACertificateVerifier creates a new instance of IECDSACertificateVerifier, bound to a specific deployed contract.
func NewIECDSACertificateVerifier(address common.Address, backend bind.ContractBackend) (*IECDSACertificateVerifier, error)
⋮----
// NewIECDSACertificateVerifierCaller creates a new read-only instance of IECDSACertificateVerifier, bound to a specific deployed contract.
func NewIECDSACertificateVerifierCaller(address common.Address, caller bind.ContractCaller) (*IECDSACertificateVerifierCaller, error)
⋮----
// NewIECDSACertificateVerifierTransactor creates a new write-only instance of IECDSACertificateVerifier, bound to a specific deployed contract.
func NewIECDSACertificateVerifierTransactor(address common.Address, transactor bind.ContractTransactor) (*IECDSACertificateVerifierTransactor, error)
⋮----
// NewIECDSACertificateVerifierFilterer creates a new log filterer instance of IECDSACertificateVerifier, bound to a specific deployed contract.
func NewIECDSACertificateVerifierFilterer(address common.Address, filterer bind.ContractFilterer) (*IECDSACertificateVerifierFilterer, error)
⋮----
// bindIECDSACertificateVerifier binds a generic wrapper to an already deployed contract.
func bindIECDSACertificateVerifier(address common.Address, caller bind.ContractCaller, transactor bind.ContractTransactor, filterer bind.ContractFilterer) (*bind.BoundContract, error)
⋮----
// 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 (_IECDSACertificateVerifier *IECDSACertificateVerifierRaw) Call(opts *bind.CallOpts, result *[]interface
⋮----
// Transfer initiates a plain transaction to move funds to the contract, calling
// its default method if one is available.
func (_IECDSACertificateVerifier *IECDSACertificateVerifierRaw) Transfer(opts *bind.TransactOpts) (*types.Transaction, error)
⋮----
// Transact invokes the (paid) contract method with params as input values.
func (_IECDSACertificateVerifier *IECDSACertificateVerifierRaw) Transact(opts *bind.TransactOpts, method string, params ...interface
⋮----
// CalculateCertificateDigest is a free data retrieval call binding the contract method 0x18467434.
//
// Solidity: function calculateCertificateDigest(uint32 referenceTimestamp, bytes32 messageHash) view returns(bytes32)
func (_IECDSACertificateVerifier *IECDSACertificateVerifierCaller) CalculateCertificateDigest(opts *bind.CallOpts, referenceTimestamp uint32, messageHash [32]byte) ([32]byte, error)
⋮----
var out []interface{}
⋮----
// CalculateCertificateDigestBytes is a free data retrieval call binding the contract method 0x702ca531.
⋮----
// Solidity: function calculateCertificateDigestBytes(uint32 referenceTimestamp, bytes32 messageHash) view returns(bytes)
func (_IECDSACertificateVerifier *IECDSACertificateVerifierCaller) CalculateCertificateDigestBytes(opts *bind.CallOpts, referenceTimestamp uint32, messageHash [32]byte) ([]byte, error)
⋮----
// DomainSeparator is a free data retrieval call binding the contract method 0xf698da25.
⋮----
// Solidity: function domainSeparator() view returns(bytes32)
func (_IECDSACertificateVerifier *IECDSACertificateVerifierCaller) DomainSeparator(opts *bind.CallOpts) ([32]byte, error)
⋮----
// GetOperatorCount is a free data retrieval call binding the contract method 0x23c2a3cb.
⋮----
// Solidity: function getOperatorCount((address,uint32) operatorSet, uint32 referenceTimestamp) view returns(uint256)
func (_IECDSACertificateVerifier *IECDSACertificateVerifierCaller) GetOperatorCount(opts *bind.CallOpts, operatorSet OperatorSet, referenceTimestamp uint32) (*big.Int, error)
⋮----
// GetOperatorInfo is a free data retrieval call binding the contract method 0xe49613fc.
⋮----
// Solidity: function getOperatorInfo((address,uint32) operatorSet, uint32 referenceTimestamp, uint256 operatorIndex) view returns((address,uint256[]))
func (_IECDSACertificateVerifier *IECDSACertificateVerifierCaller) GetOperatorInfo(opts *bind.CallOpts, operatorSet OperatorSet, referenceTimestamp uint32, operatorIndex *big.Int) (IOperatorTableCalculatorTypesECDSAOperatorInfo, error)
⋮----
// GetOperatorInfos is a free data retrieval call binding the contract method 0x7c85ac4c.
⋮----
// Solidity: function getOperatorInfos((address,uint32) operatorSet, uint32 referenceTimestamp) view returns((address,uint256[])[])
func (_IECDSACertificateVerifier *IECDSACertificateVerifierCaller) GetOperatorInfos(opts *bind.CallOpts, operatorSet OperatorSet, referenceTimestamp uint32) ([]IOperatorTableCalculatorTypesECDSAOperatorInfo, error)
⋮----
// GetOperatorSetOwner is a free data retrieval call binding the contract method 0x84818920.
⋮----
// Solidity: function getOperatorSetOwner((address,uint32) operatorSet) view returns(address)
func (_IECDSACertificateVerifier *IECDSACertificateVerifierCaller) GetOperatorSetOwner(opts *bind.CallOpts, operatorSet OperatorSet) (common.Address, error)
⋮----
// GetTotalStakeWeights is a free data retrieval call binding the contract method 0x7d1d1f5b.
⋮----
// Solidity: function getTotalStakeWeights((address,uint32) operatorSet, uint32 referenceTimestamp) view returns(uint256[])
func (_IECDSACertificateVerifier *IECDSACertificateVerifierCaller) GetTotalStakeWeights(opts *bind.CallOpts, operatorSet OperatorSet, referenceTimestamp uint32) ([]*big.Int, error)
⋮----
// IsReferenceTimestampSet is a free data retrieval call binding the contract method 0xcd83a72b.
⋮----
// Solidity: function isReferenceTimestampSet((address,uint32) operatorSet, uint32 referenceTimestamp) view returns(bool)
func (_IECDSACertificateVerifier *IECDSACertificateVerifierCaller) IsReferenceTimestampSet(opts *bind.CallOpts, operatorSet OperatorSet, referenceTimestamp uint32) (bool, error)
⋮----
// LatestReferenceTimestamp is a free data retrieval call binding the contract method 0x5ddb9b5b.
⋮----
// Solidity: function latestReferenceTimestamp((address,uint32) operatorSet) view returns(uint32)
func (_IECDSACertificateVerifier *IECDSACertificateVerifierCaller) LatestReferenceTimestamp(opts *bind.CallOpts, operatorSet OperatorSet) (uint32, error)
⋮----
// MaxOperatorTableStaleness is a free data retrieval call binding the contract method 0x6141879e.
⋮----
// Solidity: function maxOperatorTableStaleness((address,uint32) operatorSet) view returns(uint32)
func (_IECDSACertificateVerifier *IECDSACertificateVerifierCaller) MaxOperatorTableStaleness(opts *bind.CallOpts, operatorSet OperatorSet) (uint32, error)
⋮----
// VerifyCertificate is a free data retrieval call binding the contract method 0x80c7d3f3.
⋮----
// Solidity: function verifyCertificate((address,uint32) operatorSet, (uint32,bytes32,bytes) cert) view returns(uint256[] totalSignedStakeWeights, address[] signers)
func (_IECDSACertificateVerifier *IECDSACertificateVerifierCaller) VerifyCertificate(opts *bind.CallOpts, operatorSet OperatorSet, cert IECDSACertificateVerifierTypesECDSACertificate) (struct
⋮----
// VerifyCertificateNominal is a free data retrieval call binding the contract method 0xbe86e0b2.
⋮----
// Solidity: function verifyCertificateNominal((address,uint32) operatorSet, (uint32,bytes32,bytes) cert, uint256[] totalStakeNominalThresholds) view returns(bool, address[] signers)
func (_IECDSACertificateVerifier *IECDSACertificateVerifierCaller) VerifyCertificateNominal(opts *bind.CallOpts, operatorSet OperatorSet, cert IECDSACertificateVerifierTypesECDSACertificate, totalStakeNominalThresholds []*big.Int) (bool, []common.Address, error)
⋮----
// VerifyCertificateProportion is a free data retrieval call binding the contract method 0xc0da2420.
⋮----
// Solidity: function verifyCertificateProportion((address,uint32) operatorSet, (uint32,bytes32,bytes) cert, uint16[] totalStakeProportionThresholds) view returns(bool, address[] signers)
func (_IECDSACertificateVerifier *IECDSACertificateVerifierCaller) VerifyCertificateProportion(opts *bind.CallOpts, operatorSet OperatorSet, cert IECDSACertificateVerifierTypesECDSACertificate, totalStakeProportionThresholds []uint16) (bool, []common.Address, error)
⋮----
// UpdateOperatorTable is a paid mutator transaction binding the contract method 0x56d482f5.
⋮----
// Solidity: function updateOperatorTable((address,uint32) operatorSet, uint32 referenceTimestamp, (address,uint256[])[] operatorInfos, (address,uint32) operatorSetConfig) returns()
func (_IECDSACertificateVerifier *IECDSACertificateVerifierTransactor) UpdateOperatorTable(opts *bind.TransactOpts, operatorSet OperatorSet, referenceTimestamp uint32, operatorInfos []IOperatorTableCalculatorTypesECDSAOperatorInfo, operatorSetConfig ICrossChainRegistryTypesOperatorSetConfig) (*types.Transaction, error)
⋮----
// IECDSACertificateVerifierMaxStalenessPeriodUpdatedIterator is returned from FilterMaxStalenessPeriodUpdated and is used to iterate over the raw logs and unpacked data for MaxStalenessPeriodUpdated events raised by the IECDSACertificateVerifier contract.
type IECDSACertificateVerifierMaxStalenessPeriodUpdatedIterator struct {
	Event *IECDSACertificateVerifierMaxStalenessPeriodUpdated // 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
}
⋮----
Event *IECDSACertificateVerifierMaxStalenessPeriodUpdated // 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 *IECDSACertificateVerifierMaxStalenessPeriodUpdatedIterator) Next() bool
⋮----
// If the iterator failed, stop iterating
⋮----
// If the iterator completed, deliver directly whatever's available
⋮----
// Iterator still in progress, wait for either a data or an error event
⋮----
// Error returns any retrieval or parsing error occurred during filtering.
func (it *IECDSACertificateVerifierMaxStalenessPeriodUpdatedIterator) Error() error
⋮----
// Close terminates the iteration process, releasing any pending underlying
// resources.
func (it *IECDSACertificateVerifierMaxStalenessPeriodUpdatedIterator) Close() error
⋮----
// IECDSACertificateVerifierMaxStalenessPeriodUpdated represents a MaxStalenessPeriodUpdated event raised by the IECDSACertificateVerifier contract.
type IECDSACertificateVerifierMaxStalenessPeriodUpdated struct {
	OperatorSet        OperatorSet
	MaxStalenessPeriod uint32
	Raw                types.Log // Blockchain specific contextual infos
}
⋮----
Raw                types.Log // Blockchain specific contextual infos
⋮----
// FilterMaxStalenessPeriodUpdated is a free log retrieval operation binding the contract event 0x28539469fbbc8a5482e60966bf9376f7b9d25b2f0a65a9976f6baa3f0e3788da.
⋮----
// Solidity: event MaxStalenessPeriodUpdated((address,uint32) operatorSet, uint32 maxStalenessPeriod)
func (_IECDSACertificateVerifier *IECDSACertificateVerifierFilterer) FilterMaxStalenessPeriodUpdated(opts *bind.FilterOpts) (*IECDSACertificateVerifierMaxStalenessPeriodUpdatedIterator, error)
⋮----
// WatchMaxStalenessPeriodUpdated is a free log subscription operation binding the contract event 0x28539469fbbc8a5482e60966bf9376f7b9d25b2f0a65a9976f6baa3f0e3788da.
⋮----
func (_IECDSACertificateVerifier *IECDSACertificateVerifierFilterer) WatchMaxStalenessPeriodUpdated(opts *bind.WatchOpts, sink chan<- *IECDSACertificateVerifierMaxStalenessPeriodUpdated) (event.Subscription, error)
⋮----
// New log arrived, parse the event and forward to the user
⋮----
// ParseMaxStalenessPeriodUpdated is a log parse operation binding the contract event 0x28539469fbbc8a5482e60966bf9376f7b9d25b2f0a65a9976f6baa3f0e3788da.
⋮----
func (_IECDSACertificateVerifier *IECDSACertificateVerifierFilterer) ParseMaxStalenessPeriodUpdated(log types.Log) (*IECDSACertificateVerifierMaxStalenessPeriodUpdated, error)
⋮----
// IECDSACertificateVerifierOperatorSetOwnerUpdatedIterator is returned from FilterOperatorSetOwnerUpdated and is used to iterate over the raw logs and unpacked data for OperatorSetOwnerUpdated events raised by the IECDSACertificateVerifier contract.
type IECDSACertificateVerifierOperatorSetOwnerUpdatedIterator struct {
	Event *IECDSACertificateVerifierOperatorSetOwnerUpdated // 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
}
⋮----
Event *IECDSACertificateVerifierOperatorSetOwnerUpdated // Event containing the contract specifics and raw log
⋮----
// IECDSACertificateVerifierOperatorSetOwnerUpdated represents a OperatorSetOwnerUpdated event raised by the IECDSACertificateVerifier contract.
type IECDSACertificateVerifierOperatorSetOwnerUpdated struct {
	OperatorSet OperatorSet
	Owner       common.Address
	Raw         types.Log // Blockchain specific contextual infos
}
⋮----
Raw         types.Log // Blockchain specific contextual infos
⋮----
// FilterOperatorSetOwnerUpdated is a free log retrieval operation binding the contract event 0x806dc367095c0baf953d7144b7c4376261675ee0b4e0da2761e43673051c7375.
⋮----
// Solidity: event OperatorSetOwnerUpdated((address,uint32) operatorSet, address owner)
func (_IECDSACertificateVerifier *IECDSACertificateVerifierFilterer) FilterOperatorSetOwnerUpdated(opts *bind.FilterOpts) (*IECDSACertificateVerifierOperatorSetOwnerUpdatedIterator, error)
⋮----
// WatchOperatorSetOwnerUpdated is a free log subscription operation binding the contract event 0x806dc367095c0baf953d7144b7c4376261675ee0b4e0da2761e43673051c7375.
⋮----
func (_IECDSACertificateVerifier *IECDSACertificateVerifierFilterer) WatchOperatorSetOwnerUpdated(opts *bind.WatchOpts, sink chan<- *IECDSACertificateVerifierOperatorSetOwnerUpdated) (event.Subscription, error)
⋮----
// ParseOperatorSetOwnerUpdated is a log parse operation binding the contract event 0x806dc367095c0baf953d7144b7c4376261675ee0b4e0da2761e43673051c7375.
⋮----
func (_IECDSACertificateVerifier *IECDSACertificateVerifierFilterer) ParseOperatorSetOwnerUpdated(log types.Log) (*IECDSACertificateVerifierOperatorSetOwnerUpdated, error)
⋮----
// IECDSACertificateVerifierTableUpdatedIterator is returned from FilterTableUpdated and is used to iterate over the raw logs and unpacked data for TableUpdated events raised by the IECDSACertificateVerifier contract.
type IECDSACertificateVerifierTableUpdatedIterator struct {
	Event *IECDSACertificateVerifierTableUpdated // 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
}
⋮----
Event *IECDSACertificateVerifierTableUpdated // Event containing the contract specifics and raw log
⋮----
// IECDSACertificateVerifierTableUpdated represents a TableUpdated event raised by the IECDSACertificateVerifier contract.
type IECDSACertificateVerifierTableUpdated struct {
	OperatorSet        OperatorSet
	ReferenceTimestamp uint32
	OperatorInfos      []IOperatorTableCalculatorTypesECDSAOperatorInfo
	Raw                types.Log // Blockchain specific contextual infos
}
⋮----
// FilterTableUpdated is a free log retrieval operation binding the contract event 0x4f588da9ec57976194a79b5594f8f8782923d93013df2b9ed12fe125805011ef.
⋮----
// Solidity: event TableUpdated((address,uint32) operatorSet, uint32 referenceTimestamp, (address,uint256[])[] operatorInfos)
func (_IECDSACertificateVerifier *IECDSACertificateVerifierFilterer) FilterTableUpdated(opts *bind.FilterOpts) (*IECDSACertificateVerifierTableUpdatedIterator, error)
⋮----
// WatchTableUpdated is a free log subscription operation binding the contract event 0x4f588da9ec57976194a79b5594f8f8782923d93013df2b9ed12fe125805011ef.
⋮----
func (_IECDSACertificateVerifier *IECDSACertificateVerifierFilterer) WatchTableUpdated(opts *bind.WatchOpts, sink chan<- *IECDSACertificateVerifierTableUpdated) (event.Subscription, error)
⋮----
// ParseTableUpdated is a log parse operation binding the contract event 0x4f588da9ec57976194a79b5594f8f8782923d93013df2b9ed12fe125805011ef.
⋮----
func (_IECDSACertificateVerifier *IECDSACertificateVerifierFilterer) ParseTableUpdated(log types.Log) (*IECDSACertificateVerifierTableUpdated, error)
````

## File: pkg/bindings/IEigen/binding.go
````go
// Code generated - DO NOT EDIT.
// This file is a generated binding and any manual changes will be lost.
⋮----
package IEigen
⋮----
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"
)
⋮----
"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
)
⋮----
// IEigenMetaData contains all meta data concerning the IEigen contract.
var IEigenMetaData = &bind.MetaData{
	ABI: "[{\"type\":\"function\",\"name\":\"CLOCK_MODE\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"string\",\"internalType\":\"string\"}],\"stateMutability\":\"pure\"},{\"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\":\"clock\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint48\",\"internalType\":\"uint48\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"disableTransferRestrictions\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"mint\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"setAllowedFrom\",\"inputs\":[{\"name\":\"from\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"isAllowedFrom\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"setAllowedTo\",\"inputs\":[{\"name\":\"to\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"isAllowedTo\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"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\":\"unwrap\",\"inputs\":[{\"name\":\"amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"wrap\",\"inputs\":[{\"name\":\"amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"event\",\"name\":\"Approval\",\"inputs\":[{\"name\":\"owner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"spender\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"value\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"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}]",
}
⋮----
// IEigenABI is the input ABI used to generate the binding from.
// Deprecated: Use IEigenMetaData.ABI instead.
var IEigenABI = IEigenMetaData.ABI
⋮----
// IEigen is an auto generated Go binding around an Ethereum contract.
type IEigen struct {
	IEigenCaller     // Read-only binding to the contract
	IEigenTransactor // Write-only binding to the contract
	IEigenFilterer   // Log filterer for contract events
}
⋮----
IEigenCaller     // Read-only binding to the contract
IEigenTransactor // Write-only binding to the contract
IEigenFilterer   // Log filterer for contract events
⋮----
// IEigenCaller is an auto generated read-only Go binding around an Ethereum contract.
type IEigenCaller struct {
	contract *bind.BoundContract // Generic contract wrapper for the low level calls
}
⋮----
contract *bind.BoundContract // Generic contract wrapper for the low level calls
⋮----
// IEigenTransactor is an auto generated write-only Go binding around an Ethereum contract.
type IEigenTransactor struct {
	contract *bind.BoundContract // Generic contract wrapper for the low level calls
}
⋮----
// IEigenFilterer is an auto generated log filtering Go binding around an Ethereum contract events.
type IEigenFilterer struct {
	contract *bind.BoundContract // Generic contract wrapper for the low level calls
}
⋮----
// IEigenSession is an auto generated Go binding around an Ethereum contract,
// with pre-set call and transact options.
type IEigenSession struct {
	Contract     *IEigen           // 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
}
⋮----
Contract     *IEigen           // 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
⋮----
// IEigenCallerSession is an auto generated read-only Go binding around an Ethereum contract,
// with pre-set call options.
type IEigenCallerSession struct {
	Contract *IEigenCaller // Generic contract caller binding to set the session for
	CallOpts bind.CallOpts // Call options to use throughout this session
}
⋮----
Contract *IEigenCaller // Generic contract caller binding to set the session for
CallOpts bind.CallOpts // Call options to use throughout this session
⋮----
// IEigenTransactorSession is an auto generated write-only Go binding around an Ethereum contract,
// with pre-set transact options.
type IEigenTransactorSession struct {
	Contract     *IEigenTransactor // Generic contract transactor binding to set the session for
	TransactOpts bind.TransactOpts // Transaction auth options to use throughout this session
}
⋮----
Contract     *IEigenTransactor // Generic contract transactor binding to set the session for
⋮----
// IEigenRaw is an auto generated low-level Go binding around an Ethereum contract.
type IEigenRaw struct {
	Contract *IEigen // Generic contract binding to access the raw methods on
}
⋮----
Contract *IEigen // Generic contract binding to access the raw methods on
⋮----
// IEigenCallerRaw is an auto generated low-level read-only Go binding around an Ethereum contract.
type IEigenCallerRaw struct {
	Contract *IEigenCaller // Generic read-only contract binding to access the raw methods on
}
⋮----
Contract *IEigenCaller // Generic read-only contract binding to access the raw methods on
⋮----
// IEigenTransactorRaw is an auto generated low-level write-only Go binding around an Ethereum contract.
type IEigenTransactorRaw struct {
	Contract *IEigenTransactor // Generic write-only contract binding to access the raw methods on
}
⋮----
Contract *IEigenTransactor // Generic write-only contract binding to access the raw methods on
⋮----
// NewIEigen creates a new instance of IEigen, bound to a specific deployed contract.
func NewIEigen(address common.Address, backend bind.ContractBackend) (*IEigen, error)
⋮----
// NewIEigenCaller creates a new read-only instance of IEigen, bound to a specific deployed contract.
func NewIEigenCaller(address common.Address, caller bind.ContractCaller) (*IEigenCaller, error)
⋮----
// NewIEigenTransactor creates a new write-only instance of IEigen, bound to a specific deployed contract.
func NewIEigenTransactor(address common.Address, transactor bind.ContractTransactor) (*IEigenTransactor, error)
⋮----
// NewIEigenFilterer creates a new log filterer instance of IEigen, bound to a specific deployed contract.
func NewIEigenFilterer(address common.Address, filterer bind.ContractFilterer) (*IEigenFilterer, error)
⋮----
// bindIEigen binds a generic wrapper to an already deployed contract.
func bindIEigen(address common.Address, caller bind.ContractCaller, transactor bind.ContractTransactor, filterer bind.ContractFilterer) (*bind.BoundContract, error)
⋮----
// 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 (_IEigen *IEigenRaw) Call(opts *bind.CallOpts, result *[]interface
⋮----
// Transfer initiates a plain transaction to move funds to the contract, calling
// its default method if one is available.
func (_IEigen *IEigenRaw) Transfer(opts *bind.TransactOpts) (*types.Transaction, error)
⋮----
// Transact invokes the (paid) contract method with params as input values.
func (_IEigen *IEigenRaw) Transact(opts *bind.TransactOpts, method string, params ...interface
⋮----
// CLOCKMODE is a free data retrieval call binding the contract method 0x4bf5d7e9.
//
// Solidity: function CLOCK_MODE() pure returns(string)
func (_IEigen *IEigenCaller) CLOCKMODE(opts *bind.CallOpts) (string, error)
⋮----
var out []interface{}
⋮----
// Allowance is a free data retrieval call binding the contract method 0xdd62ed3e.
⋮----
// Solidity: function allowance(address owner, address spender) view returns(uint256)
func (_IEigen *IEigenCaller) Allowance(opts *bind.CallOpts, owner common.Address, spender common.Address) (*big.Int, error)
⋮----
// BalanceOf is a free data retrieval call binding the contract method 0x70a08231.
⋮----
// Solidity: function balanceOf(address account) view returns(uint256)
func (_IEigen *IEigenCaller) BalanceOf(opts *bind.CallOpts, account common.Address) (*big.Int, error)
⋮----
// Clock is a free data retrieval call binding the contract method 0x91ddadf4.
⋮----
// Solidity: function clock() view returns(uint48)
func (_IEigen *IEigenCaller) Clock(opts *bind.CallOpts) (*big.Int, error)
⋮----
// TotalSupply is a free data retrieval call binding the contract method 0x18160ddd.
⋮----
// Solidity: function totalSupply() view returns(uint256)
func (_IEigen *IEigenCaller) TotalSupply(opts *bind.CallOpts) (*big.Int, error)
⋮----
// Approve is a paid mutator transaction binding the contract method 0x095ea7b3.
⋮----
// Solidity: function approve(address spender, uint256 amount) returns(bool)
func (_IEigen *IEigenTransactor) Approve(opts *bind.TransactOpts, spender common.Address, amount *big.Int) (*types.Transaction, error)
⋮----
// DisableTransferRestrictions is a paid mutator transaction binding the contract method 0xeb415f45.
⋮----
// Solidity: function disableTransferRestrictions() returns()
func (_IEigen *IEigenTransactor) DisableTransferRestrictions(opts *bind.TransactOpts) (*types.Transaction, error)
⋮----
// Mint is a paid mutator transaction binding the contract method 0x1249c58b.
⋮----
// Solidity: function mint() returns()
func (_IEigen *IEigenTransactor) Mint(opts *bind.TransactOpts) (*types.Transaction, error)
⋮----
// SetAllowedFrom is a paid mutator transaction binding the contract method 0x1ffacdef.
⋮----
// Solidity: function setAllowedFrom(address from, bool isAllowedFrom) returns()
func (_IEigen *IEigenTransactor) SetAllowedFrom(opts *bind.TransactOpts, from common.Address, isAllowedFrom bool) (*types.Transaction, error)
⋮----
// SetAllowedTo is a paid mutator transaction binding the contract method 0xb8c25594.
⋮----
// Solidity: function setAllowedTo(address to, bool isAllowedTo) returns()
func (_IEigen *IEigenTransactor) SetAllowedTo(opts *bind.TransactOpts, to common.Address, isAllowedTo bool) (*types.Transaction, error)
⋮----
// Transfer is a paid mutator transaction binding the contract method 0xa9059cbb.
⋮----
// Solidity: function transfer(address to, uint256 amount) returns(bool)
⋮----
// TransferFrom is a paid mutator transaction binding the contract method 0x23b872dd.
⋮----
// Solidity: function transferFrom(address from, address to, uint256 amount) returns(bool)
func (_IEigen *IEigenTransactor) TransferFrom(opts *bind.TransactOpts, from common.Address, to common.Address, amount *big.Int) (*types.Transaction, error)
⋮----
// Unwrap is a paid mutator transaction binding the contract method 0xde0e9a3e.
⋮----
// Solidity: function unwrap(uint256 amount) returns()
func (_IEigen *IEigenTransactor) Unwrap(opts *bind.TransactOpts, amount *big.Int) (*types.Transaction, error)
⋮----
// Wrap is a paid mutator transaction binding the contract method 0xea598cb0.
⋮----
// Solidity: function wrap(uint256 amount) returns()
func (_IEigen *IEigenTransactor) Wrap(opts *bind.TransactOpts, amount *big.Int) (*types.Transaction, error)
⋮----
// IEigenApprovalIterator is returned from FilterApproval and is used to iterate over the raw logs and unpacked data for Approval events raised by the IEigen contract.
type IEigenApprovalIterator struct {
	Event *IEigenApproval // 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
}
⋮----
Event *IEigenApproval // 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 *IEigenApprovalIterator) Next() bool
⋮----
// If the iterator failed, stop iterating
⋮----
// If the iterator completed, deliver directly whatever's available
⋮----
// Iterator still in progress, wait for either a data or an error event
⋮----
// Error returns any retrieval or parsing error occurred during filtering.
func (it *IEigenApprovalIterator) Error() error
⋮----
// Close terminates the iteration process, releasing any pending underlying
// resources.
func (it *IEigenApprovalIterator) Close() error
⋮----
// IEigenApproval represents a Approval event raised by the IEigen contract.
type IEigenApproval struct {
	Owner   common.Address
	Spender common.Address
	Value   *big.Int
	Raw     types.Log // Blockchain specific contextual infos
}
⋮----
Raw     types.Log // Blockchain specific contextual infos
⋮----
// FilterApproval is a free log retrieval operation binding the contract event 0x8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925.
⋮----
// Solidity: event Approval(address indexed owner, address indexed spender, uint256 value)
func (_IEigen *IEigenFilterer) FilterApproval(opts *bind.FilterOpts, owner []common.Address, spender []common.Address) (*IEigenApprovalIterator, error)
⋮----
var ownerRule []interface{}
⋮----
var spenderRule []interface{}
⋮----
// WatchApproval is a free log subscription operation binding the contract event 0x8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925.
⋮----
func (_IEigen *IEigenFilterer) WatchApproval(opts *bind.WatchOpts, sink chan<- *IEigenApproval, owner []common.Address, spender []common.Address) (event.Subscription, error)
⋮----
// New log arrived, parse the event and forward to the user
⋮----
// ParseApproval is a log parse operation binding the contract event 0x8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925.
⋮----
func (_IEigen *IEigenFilterer) ParseApproval(log types.Log) (*IEigenApproval, error)
⋮----
// IEigenTransferIterator is returned from FilterTransfer and is used to iterate over the raw logs and unpacked data for Transfer events raised by the IEigen contract.
type IEigenTransferIterator struct {
	Event *IEigenTransfer // 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
}
⋮----
Event *IEigenTransfer // Event containing the contract specifics and raw log
⋮----
// IEigenTransfer represents a Transfer event raised by the IEigen contract.
type IEigenTransfer struct {
	From  common.Address
	To    common.Address
	Value *big.Int
	Raw   types.Log // Blockchain specific contextual infos
}
⋮----
Raw   types.Log // Blockchain specific contextual infos
⋮----
// FilterTransfer is a free log retrieval operation binding the contract event 0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef.
⋮----
// Solidity: event Transfer(address indexed from, address indexed to, uint256 value)
func (_IEigen *IEigenFilterer) FilterTransfer(opts *bind.FilterOpts, from []common.Address, to []common.Address) (*IEigenTransferIterator, error)
⋮----
var fromRule []interface{}
⋮----
var toRule []interface{}
⋮----
// WatchTransfer is a free log subscription operation binding the contract event 0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef.
⋮----
func (_IEigen *IEigenFilterer) WatchTransfer(opts *bind.WatchOpts, sink chan<- *IEigenTransfer, from []common.Address, to []common.Address) (event.Subscription, error)
⋮----
// ParseTransfer is a log parse operation binding the contract event 0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef.
⋮----
func (_IEigen *IEigenFilterer) ParseTransfer(log types.Log) (*IEigenTransfer, error)
````

## File: pkg/bindings/IEigenPod/binding.go
````go
// Code generated - DO NOT EDIT.
// This file is a generated binding and any manual changes will be lost.
⋮----
package IEigenPod
⋮----
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"
)
⋮----
"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
)
⋮----
// BeaconChainProofsBalanceContainerProof is an auto generated low-level Go binding around an user-defined struct.
type BeaconChainProofsBalanceContainerProof struct {
	BalanceContainerRoot [32]byte
	Proof                []byte
}
⋮----
// BeaconChainProofsBalanceProof is an auto generated low-level Go binding around an user-defined struct.
type BeaconChainProofsBalanceProof struct {
	PubkeyHash  [32]byte
	BalanceRoot [32]byte
	Proof       []byte
}
⋮----
// BeaconChainProofsStateRootProof is an auto generated low-level Go binding around an user-defined struct.
type BeaconChainProofsStateRootProof struct {
	BeaconStateRoot [32]byte
	Proof           []byte
}
⋮----
// BeaconChainProofsValidatorProof is an auto generated low-level Go binding around an user-defined struct.
type BeaconChainProofsValidatorProof struct {
	ValidatorFields [][32]byte
	Proof           []byte
}
⋮----
// IEigenPodTypesCheckpoint is an auto generated low-level Go binding around an user-defined struct.
type IEigenPodTypesCheckpoint struct {
	BeaconBlockRoot       [32]byte
	ProofsRemaining       *big.Int
	PodBalanceGwei        uint64
	BalanceDeltasGwei     int64
	PrevBeaconBalanceGwei uint64
}
⋮----
// IEigenPodTypesConsolidationRequest is an auto generated low-level Go binding around an user-defined struct.
type IEigenPodTypesConsolidationRequest struct {
	SrcPubkey    []byte
	TargetPubkey []byte
}
⋮----
// IEigenPodTypesValidatorInfo is an auto generated low-level Go binding around an user-defined struct.
type IEigenPodTypesValidatorInfo struct {
	ValidatorIndex      uint64
	RestakedBalanceGwei uint64
	LastCheckpointedAt  uint64
	Status              uint8
}
⋮----
// IEigenPodTypesWithdrawalRequest is an auto generated low-level Go binding around an user-defined struct.
type IEigenPodTypesWithdrawalRequest struct {
	Pubkey     []byte
	AmountGwei uint64
}
⋮----
// IEigenPodMetaData contains all meta data concerning the IEigenPod contract.
var IEigenPodMetaData = &bind.MetaData{
	ABI: "[{\"type\":\"function\",\"name\":\"activeValidatorCount\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"checkpointBalanceExitedGwei\",\"inputs\":[{\"name\":\"\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"currentCheckpoint\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"tuple\",\"internalType\":\"structIEigenPodTypes.Checkpoint\",\"components\":[{\"name\":\"beaconBlockRoot\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"proofsRemaining\",\"type\":\"uint24\",\"internalType\":\"uint24\"},{\"name\":\"podBalanceGwei\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"balanceDeltasGwei\",\"type\":\"int64\",\"internalType\":\"int64\"},{\"name\":\"prevBeaconBalanceGwei\",\"type\":\"uint64\",\"internalType\":\"uint64\"}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"currentCheckpointTimestamp\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"eigenPodManager\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIEigenPodManager\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getConsolidationRequestFee\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getParentBlockRoot\",\"inputs\":[{\"name\":\"timestamp\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getWithdrawalRequestFee\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"initialize\",\"inputs\":[{\"name\":\"owner\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"lastCheckpointTimestamp\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"podOwner\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"proofSubmitter\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"recoverTokens\",\"inputs\":[{\"name\":\"tokenList\",\"type\":\"address[]\",\"internalType\":\"contractIERC20[]\"},{\"name\":\"amountsToWithdraw\",\"type\":\"uint256[]\",\"internalType\":\"uint256[]\"},{\"name\":\"recipient\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"requestConsolidation\",\"inputs\":[{\"name\":\"requests\",\"type\":\"tuple[]\",\"internalType\":\"structIEigenPodTypes.ConsolidationRequest[]\",\"components\":[{\"name\":\"srcPubkey\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"targetPubkey\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]}],\"outputs\":[],\"stateMutability\":\"payable\"},{\"type\":\"function\",\"name\":\"requestWithdrawal\",\"inputs\":[{\"name\":\"requests\",\"type\":\"tuple[]\",\"internalType\":\"structIEigenPodTypes.WithdrawalRequest[]\",\"components\":[{\"name\":\"pubkey\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"amountGwei\",\"type\":\"uint64\",\"internalType\":\"uint64\"}]}],\"outputs\":[],\"stateMutability\":\"payable\"},{\"type\":\"function\",\"name\":\"setProofSubmitter\",\"inputs\":[{\"name\":\"newProofSubmitter\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"stake\",\"inputs\":[{\"name\":\"pubkey\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"signature\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"depositDataRoot\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[],\"stateMutability\":\"payable\"},{\"type\":\"function\",\"name\":\"startCheckpoint\",\"inputs\":[{\"name\":\"revertIfNoBalance\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"validatorPubkeyHashToInfo\",\"inputs\":[{\"name\":\"validatorPubkeyHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"tuple\",\"internalType\":\"structIEigenPodTypes.ValidatorInfo\",\"components\":[{\"name\":\"validatorIndex\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"restakedBalanceGwei\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"lastCheckpointedAt\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"status\",\"type\":\"uint8\",\"internalType\":\"enumIEigenPodTypes.VALIDATOR_STATUS\"}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"validatorPubkeyToInfo\",\"inputs\":[{\"name\":\"validatorPubkey\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[{\"name\":\"\",\"type\":\"tuple\",\"internalType\":\"structIEigenPodTypes.ValidatorInfo\",\"components\":[{\"name\":\"validatorIndex\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"restakedBalanceGwei\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"lastCheckpointedAt\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"status\",\"type\":\"uint8\",\"internalType\":\"enumIEigenPodTypes.VALIDATOR_STATUS\"}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"validatorStatus\",\"inputs\":[{\"name\":\"validatorPubkey\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint8\",\"internalType\":\"enumIEigenPodTypes.VALIDATOR_STATUS\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"validatorStatus\",\"inputs\":[{\"name\":\"pubkeyHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint8\",\"internalType\":\"enumIEigenPodTypes.VALIDATOR_STATUS\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"verifyCheckpointProofs\",\"inputs\":[{\"name\":\"balanceContainerProof\",\"type\":\"tuple\",\"internalType\":\"structBeaconChainProofs.BalanceContainerProof\",\"components\":[{\"name\":\"balanceContainerRoot\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"proof\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]},{\"name\":\"proofs\",\"type\":\"tuple[]\",\"internalType\":\"structBeaconChainProofs.BalanceProof[]\",\"components\":[{\"name\":\"pubkeyHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"balanceRoot\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"proof\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"verifyStaleBalance\",\"inputs\":[{\"name\":\"beaconTimestamp\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"stateRootProof\",\"type\":\"tuple\",\"internalType\":\"structBeaconChainProofs.StateRootProof\",\"components\":[{\"name\":\"beaconStateRoot\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"proof\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]},{\"name\":\"proof\",\"type\":\"tuple\",\"internalType\":\"structBeaconChainProofs.ValidatorProof\",\"components\":[{\"name\":\"validatorFields\",\"type\":\"bytes32[]\",\"internalType\":\"bytes32[]\"},{\"name\":\"proof\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"verifyWithdrawalCredentials\",\"inputs\":[{\"name\":\"beaconTimestamp\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"stateRootProof\",\"type\":\"tuple\",\"internalType\":\"structBeaconChainProofs.StateRootProof\",\"components\":[{\"name\":\"beaconStateRoot\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"proof\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]},{\"name\":\"validatorIndices\",\"type\":\"uint40[]\",\"internalType\":\"uint40[]\"},{\"name\":\"validatorFieldsProofs\",\"type\":\"bytes[]\",\"internalType\":\"bytes[]\"},{\"name\":\"validatorFields\",\"type\":\"bytes32[][]\",\"internalType\":\"bytes32[][]\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"withdrawRestakedBeaconChainETH\",\"inputs\":[{\"name\":\"recipient\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"withdrawableRestakedExecutionLayerGwei\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"stateMutability\":\"view\"},{\"type\":\"event\",\"name\":\"CheckpointCreated\",\"inputs\":[{\"name\":\"checkpointTimestamp\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"},{\"name\":\"beaconBlockRoot\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"validatorCount\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"CheckpointFinalized\",\"inputs\":[{\"name\":\"checkpointTimestamp\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"},{\"name\":\"totalShareDeltaWei\",\"type\":\"int256\",\"indexed\":false,\"internalType\":\"int256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ConsolidationRequested\",\"inputs\":[{\"name\":\"sourcePubkeyHash\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"targetPubkeyHash\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"EigenPodStaked\",\"inputs\":[{\"name\":\"pubkeyHash\",\"type\":\"bytes32\",\"indexed\":false,\"internalType\":\"bytes32\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ExitRequested\",\"inputs\":[{\"name\":\"validatorPubkeyHash\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"NonBeaconChainETHReceived\",\"inputs\":[{\"name\":\"amountReceived\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ProofSubmitterUpdated\",\"inputs\":[{\"name\":\"prevProofSubmitter\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"},{\"name\":\"newProofSubmitter\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"RestakedBeaconChainETHWithdrawn\",\"inputs\":[{\"name\":\"recipient\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"SwitchToCompoundingRequested\",\"inputs\":[{\"name\":\"validatorPubkeyHash\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ValidatorBalanceUpdated\",\"inputs\":[{\"name\":\"pubkeyHash\",\"type\":\"bytes32\",\"indexed\":false,\"internalType\":\"bytes32\"},{\"name\":\"balanceTimestamp\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"},{\"name\":\"newValidatorBalanceGwei\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ValidatorCheckpointed\",\"inputs\":[{\"name\":\"checkpointTimestamp\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"},{\"name\":\"pubkeyHash\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ValidatorRestaked\",\"inputs\":[{\"name\":\"pubkeyHash\",\"type\":\"bytes32\",\"indexed\":false,\"internalType\":\"bytes32\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ValidatorWithdrawn\",\"inputs\":[{\"name\":\"checkpointTimestamp\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"},{\"name\":\"pubkeyHash\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"WithdrawalRequested\",\"inputs\":[{\"name\":\"validatorPubkeyHash\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"withdrawalAmountGwei\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"}],\"anonymous\":false},{\"type\":\"error\",\"name\":\"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\":\"FeeQueryFailed\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ForkTimestampZero\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InputAddressZero\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InputArrayLengthMismatch\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InsufficientFunds\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InsufficientWithdrawableBalance\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidEIP4788Response\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidPubKeyLength\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"MsgValueNot32ETH\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"NoActiveCheckpoint\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"NoBalanceToCheckpoint\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"OnlyEigenPodManager\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"OnlyEigenPodOwner\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"OnlyEigenPodOwnerOrProofSubmitter\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"PredeployFailed\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"TimestampOutOfRange\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ValidatorInactiveOnBeaconChain\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ValidatorIsExitingBeaconChain\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ValidatorNotActiveInPod\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ValidatorNotSlashedOnBeaconChain\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"WithdrawalCredentialsNotForEigenPod\",\"inputs\":[]}]",
}
⋮----
// IEigenPodABI is the input ABI used to generate the binding from.
// Deprecated: Use IEigenPodMetaData.ABI instead.
var IEigenPodABI = IEigenPodMetaData.ABI
⋮----
// IEigenPod is an auto generated Go binding around an Ethereum contract.
type IEigenPod struct {
	IEigenPodCaller     // Read-only binding to the contract
	IEigenPodTransactor // Write-only binding to the contract
	IEigenPodFilterer   // Log filterer for contract events
}
⋮----
IEigenPodCaller     // Read-only binding to the contract
IEigenPodTransactor // Write-only binding to the contract
IEigenPodFilterer   // Log filterer for contract events
⋮----
// IEigenPodCaller is an auto generated read-only Go binding around an Ethereum contract.
type IEigenPodCaller struct {
	contract *bind.BoundContract // Generic contract wrapper for the low level calls
}
⋮----
contract *bind.BoundContract // Generic contract wrapper for the low level calls
⋮----
// IEigenPodTransactor is an auto generated write-only Go binding around an Ethereum contract.
type IEigenPodTransactor struct {
	contract *bind.BoundContract // Generic contract wrapper for the low level calls
}
⋮----
// IEigenPodFilterer is an auto generated log filtering Go binding around an Ethereum contract events.
type IEigenPodFilterer struct {
	contract *bind.BoundContract // Generic contract wrapper for the low level calls
}
⋮----
// IEigenPodSession is an auto generated Go binding around an Ethereum contract,
// with pre-set call and transact options.
type IEigenPodSession struct {
	Contract     *IEigenPod        // 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
}
⋮----
Contract     *IEigenPod        // 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
⋮----
// IEigenPodCallerSession is an auto generated read-only Go binding around an Ethereum contract,
// with pre-set call options.
type IEigenPodCallerSession struct {
	Contract *IEigenPodCaller // Generic contract caller binding to set the session for
	CallOpts bind.CallOpts    // Call options to use throughout this session
}
⋮----
Contract *IEigenPodCaller // Generic contract caller binding to set the session for
CallOpts bind.CallOpts    // Call options to use throughout this session
⋮----
// IEigenPodTransactorSession is an auto generated write-only Go binding around an Ethereum contract,
// with pre-set transact options.
type IEigenPodTransactorSession struct {
	Contract     *IEigenPodTransactor // Generic contract transactor binding to set the session for
	TransactOpts bind.TransactOpts    // Transaction auth options to use throughout this session
}
⋮----
Contract     *IEigenPodTransactor // Generic contract transactor binding to set the session for
TransactOpts bind.TransactOpts    // Transaction auth options to use throughout this session
⋮----
// IEigenPodRaw is an auto generated low-level Go binding around an Ethereum contract.
type IEigenPodRaw struct {
	Contract *IEigenPod // Generic contract binding to access the raw methods on
}
⋮----
Contract *IEigenPod // Generic contract binding to access the raw methods on
⋮----
// IEigenPodCallerRaw is an auto generated low-level read-only Go binding around an Ethereum contract.
type IEigenPodCallerRaw struct {
	Contract *IEigenPodCaller // Generic read-only contract binding to access the raw methods on
}
⋮----
Contract *IEigenPodCaller // Generic read-only contract binding to access the raw methods on
⋮----
// IEigenPodTransactorRaw is an auto generated low-level write-only Go binding around an Ethereum contract.
type IEigenPodTransactorRaw struct {
	Contract *IEigenPodTransactor // Generic write-only contract binding to access the raw methods on
}
⋮----
Contract *IEigenPodTransactor // Generic write-only contract binding to access the raw methods on
⋮----
// NewIEigenPod creates a new instance of IEigenPod, bound to a specific deployed contract.
func NewIEigenPod(address common.Address, backend bind.ContractBackend) (*IEigenPod, error)
⋮----
// NewIEigenPodCaller creates a new read-only instance of IEigenPod, bound to a specific deployed contract.
func NewIEigenPodCaller(address common.Address, caller bind.ContractCaller) (*IEigenPodCaller, error)
⋮----
// NewIEigenPodTransactor creates a new write-only instance of IEigenPod, bound to a specific deployed contract.
func NewIEigenPodTransactor(address common.Address, transactor bind.ContractTransactor) (*IEigenPodTransactor, error)
⋮----
// NewIEigenPodFilterer creates a new log filterer instance of IEigenPod, bound to a specific deployed contract.
func NewIEigenPodFilterer(address common.Address, filterer bind.ContractFilterer) (*IEigenPodFilterer, error)
⋮----
// bindIEigenPod binds a generic wrapper to an already deployed contract.
func bindIEigenPod(address common.Address, caller bind.ContractCaller, transactor bind.ContractTransactor, filterer bind.ContractFilterer) (*bind.BoundContract, error)
⋮----
// 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 (_IEigenPod *IEigenPodRaw) Call(opts *bind.CallOpts, result *[]interface
⋮----
// Transfer initiates a plain transaction to move funds to the contract, calling
// its default method if one is available.
func (_IEigenPod *IEigenPodRaw) Transfer(opts *bind.TransactOpts) (*types.Transaction, error)
⋮----
// Transact invokes the (paid) contract method with params as input values.
func (_IEigenPod *IEigenPodRaw) Transact(opts *bind.TransactOpts, method string, params ...interface
⋮----
// ActiveValidatorCount is a free data retrieval call binding the contract method 0x2340e8d3.
//
// Solidity: function activeValidatorCount() view returns(uint256)
func (_IEigenPod *IEigenPodCaller) ActiveValidatorCount(opts *bind.CallOpts) (*big.Int, error)
⋮----
var out []interface{}
⋮----
// CheckpointBalanceExitedGwei is a free data retrieval call binding the contract method 0x52396a59.
⋮----
// Solidity: function checkpointBalanceExitedGwei(uint64 ) view returns(uint64)
func (_IEigenPod *IEigenPodCaller) CheckpointBalanceExitedGwei(opts *bind.CallOpts, arg0 uint64) (uint64, error)
⋮----
// CurrentCheckpoint is a free data retrieval call binding the contract method 0x47d28372.
⋮----
// Solidity: function currentCheckpoint() view returns((bytes32,uint24,uint64,int64,uint64))
func (_IEigenPod *IEigenPodCaller) CurrentCheckpoint(opts *bind.CallOpts) (IEigenPodTypesCheckpoint, error)
⋮----
// CurrentCheckpointTimestamp is a free data retrieval call binding the contract method 0x42ecff2a.
⋮----
// Solidity: function currentCheckpointTimestamp() view returns(uint64)
func (_IEigenPod *IEigenPodCaller) CurrentCheckpointTimestamp(opts *bind.CallOpts) (uint64, error)
⋮----
// EigenPodManager is a free data retrieval call binding the contract method 0x4665bcda.
⋮----
// Solidity: function eigenPodManager() view returns(address)
func (_IEigenPod *IEigenPodCaller) EigenPodManager(opts *bind.CallOpts) (common.Address, error)
⋮----
// GetConsolidationRequestFee is a free data retrieval call binding the contract method 0x1e515533.
⋮----
// Solidity: function getConsolidationRequestFee() view returns(uint256)
func (_IEigenPod *IEigenPodCaller) GetConsolidationRequestFee(opts *bind.CallOpts) (*big.Int, error)
⋮----
// GetParentBlockRoot is a free data retrieval call binding the contract method 0x6c0d2d5a.
⋮----
// Solidity: function getParentBlockRoot(uint64 timestamp) view returns(bytes32)
func (_IEigenPod *IEigenPodCaller) GetParentBlockRoot(opts *bind.CallOpts, timestamp uint64) ([32]byte, error)
⋮----
// GetWithdrawalRequestFee is a free data retrieval call binding the contract method 0xc44e30dc.
⋮----
// Solidity: function getWithdrawalRequestFee() view returns(uint256)
func (_IEigenPod *IEigenPodCaller) GetWithdrawalRequestFee(opts *bind.CallOpts) (*big.Int, error)
⋮----
// LastCheckpointTimestamp is a free data retrieval call binding the contract method 0xee94d67c.
⋮----
// Solidity: function lastCheckpointTimestamp() view returns(uint64)
func (_IEigenPod *IEigenPodCaller) LastCheckpointTimestamp(opts *bind.CallOpts) (uint64, error)
⋮----
// PodOwner is a free data retrieval call binding the contract method 0x0b18ff66.
⋮----
// Solidity: function podOwner() view returns(address)
func (_IEigenPod *IEigenPodCaller) PodOwner(opts *bind.CallOpts) (common.Address, error)
⋮----
// ProofSubmitter is a free data retrieval call binding the contract method 0x58753357.
⋮----
// Solidity: function proofSubmitter() view returns(address)
func (_IEigenPod *IEigenPodCaller) ProofSubmitter(opts *bind.CallOpts) (common.Address, error)
⋮----
// ValidatorPubkeyHashToInfo is a free data retrieval call binding the contract method 0x6fcd0e53.
⋮----
// Solidity: function validatorPubkeyHashToInfo(bytes32 validatorPubkeyHash) view returns((uint64,uint64,uint64,uint8))
func (_IEigenPod *IEigenPodCaller) ValidatorPubkeyHashToInfo(opts *bind.CallOpts, validatorPubkeyHash [32]byte) (IEigenPodTypesValidatorInfo, error)
⋮----
// ValidatorPubkeyToInfo is a free data retrieval call binding the contract method 0xb522538a.
⋮----
// Solidity: function validatorPubkeyToInfo(bytes validatorPubkey) view returns((uint64,uint64,uint64,uint8))
func (_IEigenPod *IEigenPodCaller) ValidatorPubkeyToInfo(opts *bind.CallOpts, validatorPubkey []byte) (IEigenPodTypesValidatorInfo, error)
⋮----
// ValidatorStatus is a free data retrieval call binding the contract method 0x58eaee79.
⋮----
// Solidity: function validatorStatus(bytes validatorPubkey) view returns(uint8)
func (_IEigenPod *IEigenPodCaller) ValidatorStatus(opts *bind.CallOpts, validatorPubkey []byte) (uint8, error)
⋮----
// ValidatorStatus0 is a free data retrieval call binding the contract method 0x7439841f.
⋮----
// Solidity: function validatorStatus(bytes32 pubkeyHash) view returns(uint8)
func (_IEigenPod *IEigenPodCaller) ValidatorStatus0(opts *bind.CallOpts, pubkeyHash [32]byte) (uint8, error)
⋮----
// WithdrawableRestakedExecutionLayerGwei is a free data retrieval call binding the contract method 0x3474aa16.
⋮----
// Solidity: function withdrawableRestakedExecutionLayerGwei() view returns(uint64)
func (_IEigenPod *IEigenPodCaller) WithdrawableRestakedExecutionLayerGwei(opts *bind.CallOpts) (uint64, error)
⋮----
// Initialize is a paid mutator transaction binding the contract method 0xc4d66de8.
⋮----
// Solidity: function initialize(address owner) returns()
func (_IEigenPod *IEigenPodTransactor) Initialize(opts *bind.TransactOpts, owner common.Address) (*types.Transaction, error)
⋮----
// RecoverTokens is a paid mutator transaction binding the contract method 0xdda3346c.
⋮----
// Solidity: function recoverTokens(address[] tokenList, uint256[] amountsToWithdraw, address recipient) returns()
func (_IEigenPod *IEigenPodTransactor) RecoverTokens(opts *bind.TransactOpts, tokenList []common.Address, amountsToWithdraw []*big.Int, recipient common.Address) (*types.Transaction, error)
⋮----
// RequestConsolidation is a paid mutator transaction binding the contract method 0x6691954e.
⋮----
// Solidity: function requestConsolidation((bytes,bytes)[] requests) payable returns()
func (_IEigenPod *IEigenPodTransactor) RequestConsolidation(opts *bind.TransactOpts, requests []IEigenPodTypesConsolidationRequest) (*types.Transaction, error)
⋮----
// RequestWithdrawal is a paid mutator transaction binding the contract method 0x3f5fa57a.
⋮----
// Solidity: function requestWithdrawal((bytes,uint64)[] requests) payable returns()
func (_IEigenPod *IEigenPodTransactor) RequestWithdrawal(opts *bind.TransactOpts, requests []IEigenPodTypesWithdrawalRequest) (*types.Transaction, error)
⋮----
// SetProofSubmitter is a paid mutator transaction binding the contract method 0xd06d5587.
⋮----
// Solidity: function setProofSubmitter(address newProofSubmitter) returns()
func (_IEigenPod *IEigenPodTransactor) SetProofSubmitter(opts *bind.TransactOpts, newProofSubmitter common.Address) (*types.Transaction, error)
⋮----
// Stake is a paid mutator transaction binding the contract method 0x9b4e4634.
⋮----
// Solidity: function stake(bytes pubkey, bytes signature, bytes32 depositDataRoot) payable returns()
func (_IEigenPod *IEigenPodTransactor) Stake(opts *bind.TransactOpts, pubkey []byte, signature []byte, depositDataRoot [32]byte) (*types.Transaction, error)
⋮----
// StartCheckpoint is a paid mutator transaction binding the contract method 0x88676cad.
⋮----
// Solidity: function startCheckpoint(bool revertIfNoBalance) returns()
func (_IEigenPod *IEigenPodTransactor) StartCheckpoint(opts *bind.TransactOpts, revertIfNoBalance bool) (*types.Transaction, error)
⋮----
// VerifyCheckpointProofs is a paid mutator transaction binding the contract method 0xf074ba62.
⋮----
// Solidity: function verifyCheckpointProofs((bytes32,bytes) balanceContainerProof, (bytes32,bytes32,bytes)[] proofs) returns()
func (_IEigenPod *IEigenPodTransactor) VerifyCheckpointProofs(opts *bind.TransactOpts, balanceContainerProof BeaconChainProofsBalanceContainerProof, proofs []BeaconChainProofsBalanceProof) (*types.Transaction, error)
⋮----
// VerifyStaleBalance is a paid mutator transaction binding the contract method 0x039157d2.
⋮----
// Solidity: function verifyStaleBalance(uint64 beaconTimestamp, (bytes32,bytes) stateRootProof, (bytes32[],bytes) proof) returns()
func (_IEigenPod *IEigenPodTransactor) VerifyStaleBalance(opts *bind.TransactOpts, beaconTimestamp uint64, stateRootProof BeaconChainProofsStateRootProof, proof BeaconChainProofsValidatorProof) (*types.Transaction, error)
⋮----
// VerifyWithdrawalCredentials is a paid mutator transaction binding the contract method 0x3f65cf19.
⋮----
// Solidity: function verifyWithdrawalCredentials(uint64 beaconTimestamp, (bytes32,bytes) stateRootProof, uint40[] validatorIndices, bytes[] validatorFieldsProofs, bytes32[][] validatorFields) returns()
func (_IEigenPod *IEigenPodTransactor) VerifyWithdrawalCredentials(opts *bind.TransactOpts, beaconTimestamp uint64, stateRootProof BeaconChainProofsStateRootProof, validatorIndices []*big.Int, validatorFieldsProofs [][]byte, validatorFields [][][32]byte) (*types.Transaction, error)
⋮----
// WithdrawRestakedBeaconChainETH is a paid mutator transaction binding the contract method 0xc4907442.
⋮----
// Solidity: function withdrawRestakedBeaconChainETH(address recipient, uint256 amount) returns()
func (_IEigenPod *IEigenPodTransactor) WithdrawRestakedBeaconChainETH(opts *bind.TransactOpts, recipient common.Address, amount *big.Int) (*types.Transaction, error)
⋮----
// IEigenPodCheckpointCreatedIterator is returned from FilterCheckpointCreated and is used to iterate over the raw logs and unpacked data for CheckpointCreated events raised by the IEigenPod contract.
type IEigenPodCheckpointCreatedIterator struct {
	Event *IEigenPodCheckpointCreated // 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
}
⋮----
Event *IEigenPodCheckpointCreated // 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 *IEigenPodCheckpointCreatedIterator) Next() bool
⋮----
// If the iterator failed, stop iterating
⋮----
// If the iterator completed, deliver directly whatever's available
⋮----
// Iterator still in progress, wait for either a data or an error event
⋮----
// Error returns any retrieval or parsing error occurred during filtering.
func (it *IEigenPodCheckpointCreatedIterator) Error() error
⋮----
// Close terminates the iteration process, releasing any pending underlying
// resources.
func (it *IEigenPodCheckpointCreatedIterator) Close() error
⋮----
// IEigenPodCheckpointCreated represents a CheckpointCreated event raised by the IEigenPod contract.
type IEigenPodCheckpointCreated struct {
	CheckpointTimestamp uint64
	BeaconBlockRoot     [32]byte
	ValidatorCount      *big.Int
	Raw                 types.Log // Blockchain specific contextual infos
}
⋮----
Raw                 types.Log // Blockchain specific contextual infos
⋮----
// FilterCheckpointCreated is a free log retrieval operation binding the contract event 0x575796133bbed337e5b39aa49a30dc2556a91e0c6c2af4b7b886ae77ebef1076.
⋮----
// Solidity: event CheckpointCreated(uint64 indexed checkpointTimestamp, bytes32 indexed beaconBlockRoot, uint256 validatorCount)
func (_IEigenPod *IEigenPodFilterer) FilterCheckpointCreated(opts *bind.FilterOpts, checkpointTimestamp []uint64, beaconBlockRoot [][32]byte) (*IEigenPodCheckpointCreatedIterator, error)
⋮----
var checkpointTimestampRule []interface{}
⋮----
var beaconBlockRootRule []interface{}
⋮----
// WatchCheckpointCreated is a free log subscription operation binding the contract event 0x575796133bbed337e5b39aa49a30dc2556a91e0c6c2af4b7b886ae77ebef1076.
⋮----
func (_IEigenPod *IEigenPodFilterer) WatchCheckpointCreated(opts *bind.WatchOpts, sink chan<- *IEigenPodCheckpointCreated, checkpointTimestamp []uint64, beaconBlockRoot [][32]byte) (event.Subscription, error)
⋮----
// New log arrived, parse the event and forward to the user
⋮----
// ParseCheckpointCreated is a log parse operation binding the contract event 0x575796133bbed337e5b39aa49a30dc2556a91e0c6c2af4b7b886ae77ebef1076.
⋮----
func (_IEigenPod *IEigenPodFilterer) ParseCheckpointCreated(log types.Log) (*IEigenPodCheckpointCreated, error)
⋮----
// IEigenPodCheckpointFinalizedIterator is returned from FilterCheckpointFinalized and is used to iterate over the raw logs and unpacked data for CheckpointFinalized events raised by the IEigenPod contract.
type IEigenPodCheckpointFinalizedIterator struct {
	Event *IEigenPodCheckpointFinalized // 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
}
⋮----
Event *IEigenPodCheckpointFinalized // Event containing the contract specifics and raw log
⋮----
// IEigenPodCheckpointFinalized represents a CheckpointFinalized event raised by the IEigenPod contract.
type IEigenPodCheckpointFinalized struct {
	CheckpointTimestamp uint64
	TotalShareDeltaWei  *big.Int
	Raw                 types.Log // Blockchain specific contextual infos
}
⋮----
// FilterCheckpointFinalized is a free log retrieval operation binding the contract event 0x525408c201bc1576eb44116f6478f1c2a54775b19a043bcfdc708364f74f8e44.
⋮----
// Solidity: event CheckpointFinalized(uint64 indexed checkpointTimestamp, int256 totalShareDeltaWei)
func (_IEigenPod *IEigenPodFilterer) FilterCheckpointFinalized(opts *bind.FilterOpts, checkpointTimestamp []uint64) (*IEigenPodCheckpointFinalizedIterator, error)
⋮----
// WatchCheckpointFinalized is a free log subscription operation binding the contract event 0x525408c201bc1576eb44116f6478f1c2a54775b19a043bcfdc708364f74f8e44.
⋮----
func (_IEigenPod *IEigenPodFilterer) WatchCheckpointFinalized(opts *bind.WatchOpts, sink chan<- *IEigenPodCheckpointFinalized, checkpointTimestamp []uint64) (event.Subscription, error)
⋮----
// ParseCheckpointFinalized is a log parse operation binding the contract event 0x525408c201bc1576eb44116f6478f1c2a54775b19a043bcfdc708364f74f8e44.
⋮----
func (_IEigenPod *IEigenPodFilterer) ParseCheckpointFinalized(log types.Log) (*IEigenPodCheckpointFinalized, error)
⋮----
// IEigenPodConsolidationRequestedIterator is returned from FilterConsolidationRequested and is used to iterate over the raw logs and unpacked data for ConsolidationRequested events raised by the IEigenPod contract.
type IEigenPodConsolidationRequestedIterator struct {
	Event *IEigenPodConsolidationRequested // 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
}
⋮----
Event *IEigenPodConsolidationRequested // Event containing the contract specifics and raw log
⋮----
// IEigenPodConsolidationRequested represents a ConsolidationRequested event raised by the IEigenPod contract.
type IEigenPodConsolidationRequested struct {
	SourcePubkeyHash [32]byte
	TargetPubkeyHash [32]byte
	Raw              types.Log // Blockchain specific contextual infos
}
⋮----
Raw              types.Log // Blockchain specific contextual infos
⋮----
// FilterConsolidationRequested is a free log retrieval operation binding the contract event 0x42f9c9db2ca443e9ec62f4588bd0c9b241065c02c2a8001ac164ae1282dc7b94.
⋮----
// Solidity: event ConsolidationRequested(bytes32 indexed sourcePubkeyHash, bytes32 indexed targetPubkeyHash)
func (_IEigenPod *IEigenPodFilterer) FilterConsolidationRequested(opts *bind.FilterOpts, sourcePubkeyHash [][32]byte, targetPubkeyHash [][32]byte) (*IEigenPodConsolidationRequestedIterator, error)
⋮----
var sourcePubkeyHashRule []interface{}
⋮----
var targetPubkeyHashRule []interface{}
⋮----
// WatchConsolidationRequested is a free log subscription operation binding the contract event 0x42f9c9db2ca443e9ec62f4588bd0c9b241065c02c2a8001ac164ae1282dc7b94.
⋮----
func (_IEigenPod *IEigenPodFilterer) WatchConsolidationRequested(opts *bind.WatchOpts, sink chan<- *IEigenPodConsolidationRequested, sourcePubkeyHash [][32]byte, targetPubkeyHash [][32]byte) (event.Subscription, error)
⋮----
// ParseConsolidationRequested is a log parse operation binding the contract event 0x42f9c9db2ca443e9ec62f4588bd0c9b241065c02c2a8001ac164ae1282dc7b94.
⋮----
func (_IEigenPod *IEigenPodFilterer) ParseConsolidationRequested(log types.Log) (*IEigenPodConsolidationRequested, error)
⋮----
// IEigenPodEigenPodStakedIterator is returned from FilterEigenPodStaked and is used to iterate over the raw logs and unpacked data for EigenPodStaked events raised by the IEigenPod contract.
type IEigenPodEigenPodStakedIterator struct {
	Event *IEigenPodEigenPodStaked // 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
}
⋮----
Event *IEigenPodEigenPodStaked // Event containing the contract specifics and raw log
⋮----
// IEigenPodEigenPodStaked represents a EigenPodStaked event raised by the IEigenPod contract.
type IEigenPodEigenPodStaked struct {
	PubkeyHash [32]byte
	Raw        types.Log // Blockchain specific contextual infos
}
⋮----
Raw        types.Log // Blockchain specific contextual infos
⋮----
// FilterEigenPodStaked is a free log retrieval operation binding the contract event 0xa01003766d3cd97cf2ade5429690bf5d206be7fb01ef9d3a0089ecf67bc11219.
⋮----
// Solidity: event EigenPodStaked(bytes32 pubkeyHash)
func (_IEigenPod *IEigenPodFilterer) FilterEigenPodStaked(opts *bind.FilterOpts) (*IEigenPodEigenPodStakedIterator, error)
⋮----
// WatchEigenPodStaked is a free log subscription operation binding the contract event 0xa01003766d3cd97cf2ade5429690bf5d206be7fb01ef9d3a0089ecf67bc11219.
⋮----
func (_IEigenPod *IEigenPodFilterer) WatchEigenPodStaked(opts *bind.WatchOpts, sink chan<- *IEigenPodEigenPodStaked) (event.Subscription, error)
⋮----
// ParseEigenPodStaked is a log parse operation binding the contract event 0xa01003766d3cd97cf2ade5429690bf5d206be7fb01ef9d3a0089ecf67bc11219.
⋮----
func (_IEigenPod *IEigenPodFilterer) ParseEigenPodStaked(log types.Log) (*IEigenPodEigenPodStaked, error)
⋮----
// IEigenPodExitRequestedIterator is returned from FilterExitRequested and is used to iterate over the raw logs and unpacked data for ExitRequested events raised by the IEigenPod contract.
type IEigenPodExitRequestedIterator struct {
	Event *IEigenPodExitRequested // 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
}
⋮----
Event *IEigenPodExitRequested // Event containing the contract specifics and raw log
⋮----
// IEigenPodExitRequested represents a ExitRequested event raised by the IEigenPod contract.
type IEigenPodExitRequested struct {
	ValidatorPubkeyHash [32]byte
	Raw                 types.Log // Blockchain specific contextual infos
}
⋮----
// FilterExitRequested is a free log retrieval operation binding the contract event 0x60d8ca014d4765a2b8b389e25714cb1cef83b574222911a01d90c1bd69d2d320.
⋮----
// Solidity: event ExitRequested(bytes32 indexed validatorPubkeyHash)
func (_IEigenPod *IEigenPodFilterer) FilterExitRequested(opts *bind.FilterOpts, validatorPubkeyHash [][32]byte) (*IEigenPodExitRequestedIterator, error)
⋮----
var validatorPubkeyHashRule []interface{}
⋮----
// WatchExitRequested is a free log subscription operation binding the contract event 0x60d8ca014d4765a2b8b389e25714cb1cef83b574222911a01d90c1bd69d2d320.
⋮----
func (_IEigenPod *IEigenPodFilterer) WatchExitRequested(opts *bind.WatchOpts, sink chan<- *IEigenPodExitRequested, validatorPubkeyHash [][32]byte) (event.Subscription, error)
⋮----
// ParseExitRequested is a log parse operation binding the contract event 0x60d8ca014d4765a2b8b389e25714cb1cef83b574222911a01d90c1bd69d2d320.
⋮----
func (_IEigenPod *IEigenPodFilterer) ParseExitRequested(log types.Log) (*IEigenPodExitRequested, error)
⋮----
// IEigenPodNonBeaconChainETHReceivedIterator is returned from FilterNonBeaconChainETHReceived and is used to iterate over the raw logs and unpacked data for NonBeaconChainETHReceived events raised by the IEigenPod contract.
type IEigenPodNonBeaconChainETHReceivedIterator struct {
	Event *IEigenPodNonBeaconChainETHReceived // 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
}
⋮----
Event *IEigenPodNonBeaconChainETHReceived // Event containing the contract specifics and raw log
⋮----
// IEigenPodNonBeaconChainETHReceived represents a NonBeaconChainETHReceived event raised by the IEigenPod contract.
type IEigenPodNonBeaconChainETHReceived struct {
	AmountReceived *big.Int
	Raw            types.Log // Blockchain specific contextual infos
}
⋮----
Raw            types.Log // Blockchain specific contextual infos
⋮----
// FilterNonBeaconChainETHReceived is a free log retrieval operation binding the contract event 0x6fdd3dbdb173299608c0aa9f368735857c8842b581f8389238bf05bd04b3bf49.
⋮----
// Solidity: event NonBeaconChainETHReceived(uint256 amountReceived)
func (_IEigenPod *IEigenPodFilterer) FilterNonBeaconChainETHReceived(opts *bind.FilterOpts) (*IEigenPodNonBeaconChainETHReceivedIterator, error)
⋮----
// WatchNonBeaconChainETHReceived is a free log subscription operation binding the contract event 0x6fdd3dbdb173299608c0aa9f368735857c8842b581f8389238bf05bd04b3bf49.
⋮----
func (_IEigenPod *IEigenPodFilterer) WatchNonBeaconChainETHReceived(opts *bind.WatchOpts, sink chan<- *IEigenPodNonBeaconChainETHReceived) (event.Subscription, error)
⋮----
// ParseNonBeaconChainETHReceived is a log parse operation binding the contract event 0x6fdd3dbdb173299608c0aa9f368735857c8842b581f8389238bf05bd04b3bf49.
⋮----
func (_IEigenPod *IEigenPodFilterer) ParseNonBeaconChainETHReceived(log types.Log) (*IEigenPodNonBeaconChainETHReceived, error)
⋮----
// IEigenPodProofSubmitterUpdatedIterator is returned from FilterProofSubmitterUpdated and is used to iterate over the raw logs and unpacked data for ProofSubmitterUpdated events raised by the IEigenPod contract.
type IEigenPodProofSubmitterUpdatedIterator struct {
	Event *IEigenPodProofSubmitterUpdated // 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
}
⋮----
Event *IEigenPodProofSubmitterUpdated // Event containing the contract specifics and raw log
⋮----
// IEigenPodProofSubmitterUpdated represents a ProofSubmitterUpdated event raised by the IEigenPod contract.
type IEigenPodProofSubmitterUpdated struct {
	PrevProofSubmitter common.Address
	NewProofSubmitter  common.Address
	Raw                types.Log // Blockchain specific contextual infos
}
⋮----
Raw                types.Log // Blockchain specific contextual infos
⋮----
// FilterProofSubmitterUpdated is a free log retrieval operation binding the contract event 0xfb8129080a19d34dceac04ba253fc50304dc86c729bd63cdca4a969ad19a5eac.
⋮----
// Solidity: event ProofSubmitterUpdated(address prevProofSubmitter, address newProofSubmitter)
func (_IEigenPod *IEigenPodFilterer) FilterProofSubmitterUpdated(opts *bind.FilterOpts) (*IEigenPodProofSubmitterUpdatedIterator, error)
⋮----
// WatchProofSubmitterUpdated is a free log subscription operation binding the contract event 0xfb8129080a19d34dceac04ba253fc50304dc86c729bd63cdca4a969ad19a5eac.
⋮----
func (_IEigenPod *IEigenPodFilterer) WatchProofSubmitterUpdated(opts *bind.WatchOpts, sink chan<- *IEigenPodProofSubmitterUpdated) (event.Subscription, error)
⋮----
// ParseProofSubmitterUpdated is a log parse operation binding the contract event 0xfb8129080a19d34dceac04ba253fc50304dc86c729bd63cdca4a969ad19a5eac.
⋮----
func (_IEigenPod *IEigenPodFilterer) ParseProofSubmitterUpdated(log types.Log) (*IEigenPodProofSubmitterUpdated, error)
⋮----
// IEigenPodRestakedBeaconChainETHWithdrawnIterator is returned from FilterRestakedBeaconChainETHWithdrawn and is used to iterate over the raw logs and unpacked data for RestakedBeaconChainETHWithdrawn events raised by the IEigenPod contract.
type IEigenPodRestakedBeaconChainETHWithdrawnIterator struct {
	Event *IEigenPodRestakedBeaconChainETHWithdrawn // 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
}
⋮----
Event *IEigenPodRestakedBeaconChainETHWithdrawn // Event containing the contract specifics and raw log
⋮----
// IEigenPodRestakedBeaconChainETHWithdrawn represents a RestakedBeaconChainETHWithdrawn event raised by the IEigenPod contract.
type IEigenPodRestakedBeaconChainETHWithdrawn struct {
	Recipient common.Address
	Amount    *big.Int
	Raw       types.Log // Blockchain specific contextual infos
}
⋮----
Raw       types.Log // Blockchain specific contextual infos
⋮----
// FilterRestakedBeaconChainETHWithdrawn is a free log retrieval operation binding the contract event 0x8947fd2ce07ef9cc302c4e8f0461015615d91ce851564839e91cc804c2f49d8e.
⋮----
// Solidity: event RestakedBeaconChainETHWithdrawn(address indexed recipient, uint256 amount)
func (_IEigenPod *IEigenPodFilterer) FilterRestakedBeaconChainETHWithdrawn(opts *bind.FilterOpts, recipient []common.Address) (*IEigenPodRestakedBeaconChainETHWithdrawnIterator, error)
⋮----
var recipientRule []interface{}
⋮----
// WatchRestakedBeaconChainETHWithdrawn is a free log subscription operation binding the contract event 0x8947fd2ce07ef9cc302c4e8f0461015615d91ce851564839e91cc804c2f49d8e.
⋮----
func (_IEigenPod *IEigenPodFilterer) WatchRestakedBeaconChainETHWithdrawn(opts *bind.WatchOpts, sink chan<- *IEigenPodRestakedBeaconChainETHWithdrawn, recipient []common.Address) (event.Subscription, error)
⋮----
// ParseRestakedBeaconChainETHWithdrawn is a log parse operation binding the contract event 0x8947fd2ce07ef9cc302c4e8f0461015615d91ce851564839e91cc804c2f49d8e.
⋮----
func (_IEigenPod *IEigenPodFilterer) ParseRestakedBeaconChainETHWithdrawn(log types.Log) (*IEigenPodRestakedBeaconChainETHWithdrawn, error)
⋮----
// IEigenPodSwitchToCompoundingRequestedIterator is returned from FilterSwitchToCompoundingRequested and is used to iterate over the raw logs and unpacked data for SwitchToCompoundingRequested events raised by the IEigenPod contract.
type IEigenPodSwitchToCompoundingRequestedIterator struct {
	Event *IEigenPodSwitchToCompoundingRequested // 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
}
⋮----
Event *IEigenPodSwitchToCompoundingRequested // Event containing the contract specifics and raw log
⋮----
// IEigenPodSwitchToCompoundingRequested represents a SwitchToCompoundingRequested event raised by the IEigenPod contract.
type IEigenPodSwitchToCompoundingRequested struct {
	ValidatorPubkeyHash [32]byte
	Raw                 types.Log // Blockchain specific contextual infos
}
⋮----
// FilterSwitchToCompoundingRequested is a free log retrieval operation binding the contract event 0xc97b965b92ae7fd20095fe8eb7b99f81f95f8c4adffb22a19116d8eb2846b016.
⋮----
// Solidity: event SwitchToCompoundingRequested(bytes32 indexed validatorPubkeyHash)
func (_IEigenPod *IEigenPodFilterer) FilterSwitchToCompoundingRequested(opts *bind.FilterOpts, validatorPubkeyHash [][32]byte) (*IEigenPodSwitchToCompoundingRequestedIterator, error)
⋮----
// WatchSwitchToCompoundingRequested is a free log subscription operation binding the contract event 0xc97b965b92ae7fd20095fe8eb7b99f81f95f8c4adffb22a19116d8eb2846b016.
⋮----
func (_IEigenPod *IEigenPodFilterer) WatchSwitchToCompoundingRequested(opts *bind.WatchOpts, sink chan<- *IEigenPodSwitchToCompoundingRequested, validatorPubkeyHash [][32]byte) (event.Subscription, error)
⋮----
// ParseSwitchToCompoundingRequested is a log parse operation binding the contract event 0xc97b965b92ae7fd20095fe8eb7b99f81f95f8c4adffb22a19116d8eb2846b016.
⋮----
func (_IEigenPod *IEigenPodFilterer) ParseSwitchToCompoundingRequested(log types.Log) (*IEigenPodSwitchToCompoundingRequested, error)
⋮----
// IEigenPodValidatorBalanceUpdatedIterator is returned from FilterValidatorBalanceUpdated and is used to iterate over the raw logs and unpacked data for ValidatorBalanceUpdated events raised by the IEigenPod contract.
type IEigenPodValidatorBalanceUpdatedIterator struct {
	Event *IEigenPodValidatorBalanceUpdated // 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
}
⋮----
Event *IEigenPodValidatorBalanceUpdated // Event containing the contract specifics and raw log
⋮----
// IEigenPodValidatorBalanceUpdated represents a ValidatorBalanceUpdated event raised by the IEigenPod contract.
type IEigenPodValidatorBalanceUpdated struct {
	PubkeyHash              [32]byte
	BalanceTimestamp        uint64
	NewValidatorBalanceGwei uint64
	Raw                     types.Log // Blockchain specific contextual infos
}
⋮----
Raw                     types.Log // Blockchain specific contextual infos
⋮----
// FilterValidatorBalanceUpdated is a free log retrieval operation binding the contract event 0xcdae700d7241bc027168c53cf6f889763b0a2c88a65d77fc13a8a9fef0d8605f.
⋮----
// Solidity: event ValidatorBalanceUpdated(bytes32 pubkeyHash, uint64 balanceTimestamp, uint64 newValidatorBalanceGwei)
func (_IEigenPod *IEigenPodFilterer) FilterValidatorBalanceUpdated(opts *bind.FilterOpts) (*IEigenPodValidatorBalanceUpdatedIterator, error)
⋮----
// WatchValidatorBalanceUpdated is a free log subscription operation binding the contract event 0xcdae700d7241bc027168c53cf6f889763b0a2c88a65d77fc13a8a9fef0d8605f.
⋮----
func (_IEigenPod *IEigenPodFilterer) WatchValidatorBalanceUpdated(opts *bind.WatchOpts, sink chan<- *IEigenPodValidatorBalanceUpdated) (event.Subscription, error)
⋮----
// ParseValidatorBalanceUpdated is a log parse operation binding the contract event 0xcdae700d7241bc027168c53cf6f889763b0a2c88a65d77fc13a8a9fef0d8605f.
⋮----
func (_IEigenPod *IEigenPodFilterer) ParseValidatorBalanceUpdated(log types.Log) (*IEigenPodValidatorBalanceUpdated, error)
⋮----
// IEigenPodValidatorCheckpointedIterator is returned from FilterValidatorCheckpointed and is used to iterate over the raw logs and unpacked data for ValidatorCheckpointed events raised by the IEigenPod contract.
type IEigenPodValidatorCheckpointedIterator struct {
	Event *IEigenPodValidatorCheckpointed // 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
}
⋮----
Event *IEigenPodValidatorCheckpointed // Event containing the contract specifics and raw log
⋮----
// IEigenPodValidatorCheckpointed represents a ValidatorCheckpointed event raised by the IEigenPod contract.
type IEigenPodValidatorCheckpointed struct {
	CheckpointTimestamp uint64
	PubkeyHash          [32]byte
	Raw                 types.Log // Blockchain specific contextual infos
}
⋮----
// FilterValidatorCheckpointed is a free log retrieval operation binding the contract event 0xe4866335761a51dcaff766448ab0af6064291ee5dc94e68492bb9cd757c1e350.
⋮----
// Solidity: event ValidatorCheckpointed(uint64 indexed checkpointTimestamp, bytes32 indexed pubkeyHash)
func (_IEigenPod *IEigenPodFilterer) FilterValidatorCheckpointed(opts *bind.FilterOpts, checkpointTimestamp []uint64, pubkeyHash [][32]byte) (*IEigenPodValidatorCheckpointedIterator, error)
⋮----
var pubkeyHashRule []interface{}
⋮----
// WatchValidatorCheckpointed is a free log subscription operation binding the contract event 0xe4866335761a51dcaff766448ab0af6064291ee5dc94e68492bb9cd757c1e350.
⋮----
func (_IEigenPod *IEigenPodFilterer) WatchValidatorCheckpointed(opts *bind.WatchOpts, sink chan<- *IEigenPodValidatorCheckpointed, checkpointTimestamp []uint64, pubkeyHash [][32]byte) (event.Subscription, error)
⋮----
// ParseValidatorCheckpointed is a log parse operation binding the contract event 0xe4866335761a51dcaff766448ab0af6064291ee5dc94e68492bb9cd757c1e350.
⋮----
func (_IEigenPod *IEigenPodFilterer) ParseValidatorCheckpointed(log types.Log) (*IEigenPodValidatorCheckpointed, error)
⋮----
// IEigenPodValidatorRestakedIterator is returned from FilterValidatorRestaked and is used to iterate over the raw logs and unpacked data for ValidatorRestaked events raised by the IEigenPod contract.
type IEigenPodValidatorRestakedIterator struct {
	Event *IEigenPodValidatorRestaked // 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
}
⋮----
Event *IEigenPodValidatorRestaked // Event containing the contract specifics and raw log
⋮----
// IEigenPodValidatorRestaked represents a ValidatorRestaked event raised by the IEigenPod contract.
type IEigenPodValidatorRestaked struct {
	PubkeyHash [32]byte
	Raw        types.Log // Blockchain specific contextual infos
}
⋮----
// FilterValidatorRestaked is a free log retrieval operation binding the contract event 0x101790c2993f6a4d962bd17c786126823ba1c4cf04ff4cccb2659d50fb20aee8.
⋮----
// Solidity: event ValidatorRestaked(bytes32 pubkeyHash)
func (_IEigenPod *IEigenPodFilterer) FilterValidatorRestaked(opts *bind.FilterOpts) (*IEigenPodValidatorRestakedIterator, error)
⋮----
// WatchValidatorRestaked is a free log subscription operation binding the contract event 0x101790c2993f6a4d962bd17c786126823ba1c4cf04ff4cccb2659d50fb20aee8.
⋮----
func (_IEigenPod *IEigenPodFilterer) WatchValidatorRestaked(opts *bind.WatchOpts, sink chan<- *IEigenPodValidatorRestaked) (event.Subscription, error)
⋮----
// ParseValidatorRestaked is a log parse operation binding the contract event 0x101790c2993f6a4d962bd17c786126823ba1c4cf04ff4cccb2659d50fb20aee8.
⋮----
func (_IEigenPod *IEigenPodFilterer) ParseValidatorRestaked(log types.Log) (*IEigenPodValidatorRestaked, error)
⋮----
// IEigenPodValidatorWithdrawnIterator is returned from FilterValidatorWithdrawn and is used to iterate over the raw logs and unpacked data for ValidatorWithdrawn events raised by the IEigenPod contract.
type IEigenPodValidatorWithdrawnIterator struct {
	Event *IEigenPodValidatorWithdrawn // 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
}
⋮----
Event *IEigenPodValidatorWithdrawn // Event containing the contract specifics and raw log
⋮----
// IEigenPodValidatorWithdrawn represents a ValidatorWithdrawn event raised by the IEigenPod contract.
type IEigenPodValidatorWithdrawn struct {
	CheckpointTimestamp uint64
	PubkeyHash          [32]byte
	Raw                 types.Log // Blockchain specific contextual infos
}
⋮----
// FilterValidatorWithdrawn is a free log retrieval operation binding the contract event 0x5ce0aa04ae51d52da6e680fbe0336d2e2432f7c3dc2d4f3193204c57b9072107.
⋮----
// Solidity: event ValidatorWithdrawn(uint64 indexed checkpointTimestamp, bytes32 indexed pubkeyHash)
func (_IEigenPod *IEigenPodFilterer) FilterValidatorWithdrawn(opts *bind.FilterOpts, checkpointTimestamp []uint64, pubkeyHash [][32]byte) (*IEigenPodValidatorWithdrawnIterator, error)
⋮----
// WatchValidatorWithdrawn is a free log subscription operation binding the contract event 0x5ce0aa04ae51d52da6e680fbe0336d2e2432f7c3dc2d4f3193204c57b9072107.
⋮----
func (_IEigenPod *IEigenPodFilterer) WatchValidatorWithdrawn(opts *bind.WatchOpts, sink chan<- *IEigenPodValidatorWithdrawn, checkpointTimestamp []uint64, pubkeyHash [][32]byte) (event.Subscription, error)
⋮----
// ParseValidatorWithdrawn is a log parse operation binding the contract event 0x5ce0aa04ae51d52da6e680fbe0336d2e2432f7c3dc2d4f3193204c57b9072107.
⋮----
func (_IEigenPod *IEigenPodFilterer) ParseValidatorWithdrawn(log types.Log) (*IEigenPodValidatorWithdrawn, error)
⋮----
// IEigenPodWithdrawalRequestedIterator is returned from FilterWithdrawalRequested and is used to iterate over the raw logs and unpacked data for WithdrawalRequested events raised by the IEigenPod contract.
type IEigenPodWithdrawalRequestedIterator struct {
	Event *IEigenPodWithdrawalRequested // 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
}
⋮----
Event *IEigenPodWithdrawalRequested // Event containing the contract specifics and raw log
⋮----
// IEigenPodWithdrawalRequested represents a WithdrawalRequested event raised by the IEigenPod contract.
type IEigenPodWithdrawalRequested struct {
	ValidatorPubkeyHash  [32]byte
	WithdrawalAmountGwei uint64
	Raw                  types.Log // Blockchain specific contextual infos
}
⋮----
Raw                  types.Log // Blockchain specific contextual infos
⋮----
// FilterWithdrawalRequested is a free log retrieval operation binding the contract event 0x8b2737bb64ab2f2dc09552dfa1c250399e6a42c7ea9f0e1c658f5d65d708ec05.
⋮----
// Solidity: event WithdrawalRequested(bytes32 indexed validatorPubkeyHash, uint64 withdrawalAmountGwei)
func (_IEigenPod *IEigenPodFilterer) FilterWithdrawalRequested(opts *bind.FilterOpts, validatorPubkeyHash [][32]byte) (*IEigenPodWithdrawalRequestedIterator, error)
⋮----
// WatchWithdrawalRequested is a free log subscription operation binding the contract event 0x8b2737bb64ab2f2dc09552dfa1c250399e6a42c7ea9f0e1c658f5d65d708ec05.
⋮----
func (_IEigenPod *IEigenPodFilterer) WatchWithdrawalRequested(opts *bind.WatchOpts, sink chan<- *IEigenPodWithdrawalRequested, validatorPubkeyHash [][32]byte) (event.Subscription, error)
⋮----
// ParseWithdrawalRequested is a log parse operation binding the contract event 0x8b2737bb64ab2f2dc09552dfa1c250399e6a42c7ea9f0e1c658f5d65d708ec05.
⋮----
func (_IEigenPod *IEigenPodFilterer) ParseWithdrawalRequested(log types.Log) (*IEigenPodWithdrawalRequested, error)
````

## File: pkg/bindings/IEigenPodManager/binding.go
````go
// Code generated - DO NOT EDIT.
// This file is a generated binding and any manual changes will be lost.
⋮----
package IEigenPodManager
⋮----
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"
)
⋮----
"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
)
⋮----
// OperatorSet is an auto generated low-level Go binding around an user-defined struct.
type OperatorSet struct {
	Avs common.Address
	Id  uint32
}
⋮----
// IEigenPodManagerMetaData contains all meta data concerning the IEigenPodManager contract.
var IEigenPodManagerMetaData = &bind.MetaData{
	ABI: "[{\"type\":\"function\",\"name\":\"addShares\",\"inputs\":[{\"name\":\"staker\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"strategy\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"},{\"name\":\"shares\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"beaconChainETHStrategy\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"beaconChainSlashingFactor\",\"inputs\":[{\"name\":\"staker\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"burnableETHShares\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"createPod\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"eigenPodBeacon\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIBeacon\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"ethPOS\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIETHPOSDeposit\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getPod\",\"inputs\":[{\"name\":\"podOwner\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIEigenPod\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"hasPod\",\"inputs\":[{\"name\":\"podOwner\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"increaseBurnOrRedistributableShares\",\"inputs\":[{\"name\":\"operatorSet\",\"type\":\"tuple\",\"internalType\":\"structOperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]},{\"name\":\"slashId\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"strategy\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"},{\"name\":\"addedSharesToBurn\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"numPods\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"ownerToPod\",\"inputs\":[{\"name\":\"podOwner\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIEigenPod\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"pause\",\"inputs\":[{\"name\":\"newPausedStatus\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"pauseAll\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"paused\",\"inputs\":[{\"name\":\"index\",\"type\":\"uint8\",\"internalType\":\"uint8\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"paused\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"pauserRegistry\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIPauserRegistry\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"pectraForkTimestamp\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"podOwnerDepositShares\",\"inputs\":[{\"name\":\"podOwner\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"int256\",\"internalType\":\"int256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"recordBeaconChainETHBalanceUpdate\",\"inputs\":[{\"name\":\"podOwner\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"prevRestakedBalanceWei\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"balanceDeltaWei\",\"type\":\"int256\",\"internalType\":\"int256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"removeDepositShares\",\"inputs\":[{\"name\":\"staker\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"strategy\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"},{\"name\":\"depositSharesToRemove\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"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\":\"unpause\",\"inputs\":[{\"name\":\"newPausedStatus\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"withdrawSharesAsTokens\",\"inputs\":[{\"name\":\"staker\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"strategy\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"},{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"contractIERC20\"},{\"name\":\"shares\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"event\",\"name\":\"BeaconChainETHDeposited\",\"inputs\":[{\"name\":\"podOwner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"BeaconChainETHWithdrawalCompleted\",\"inputs\":[{\"name\":\"podOwner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"shares\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"nonce\",\"type\":\"uint96\",\"indexed\":false,\"internalType\":\"uint96\"},{\"name\":\"delegatedAddress\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"},{\"name\":\"withdrawer\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"},{\"name\":\"withdrawalRoot\",\"type\":\"bytes32\",\"indexed\":false,\"internalType\":\"bytes32\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"BeaconChainSlashingFactorDecreased\",\"inputs\":[{\"name\":\"staker\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"},{\"name\":\"prevBeaconChainSlashingFactor\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"},{\"name\":\"newBeaconChainSlashingFactor\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"BurnableETHSharesIncreased\",\"inputs\":[{\"name\":\"shares\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"NewTotalShares\",\"inputs\":[{\"name\":\"podOwner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"newTotalShares\",\"type\":\"int256\",\"indexed\":false,\"internalType\":\"int256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Paused\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"newPausedStatus\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"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\":[]}]",
}
⋮----
// IEigenPodManagerABI is the input ABI used to generate the binding from.
// Deprecated: Use IEigenPodManagerMetaData.ABI instead.
var IEigenPodManagerABI = IEigenPodManagerMetaData.ABI
⋮----
// IEigenPodManager is an auto generated Go binding around an Ethereum contract.
type IEigenPodManager struct {
	IEigenPodManagerCaller     // Read-only binding to the contract
	IEigenPodManagerTransactor // Write-only binding to the contract
	IEigenPodManagerFilterer   // Log filterer for contract events
}
⋮----
IEigenPodManagerCaller     // Read-only binding to the contract
IEigenPodManagerTransactor // Write-only binding to the contract
IEigenPodManagerFilterer   // Log filterer for contract events
⋮----
// IEigenPodManagerCaller is an auto generated read-only Go binding around an Ethereum contract.
type IEigenPodManagerCaller struct {
	contract *bind.BoundContract // Generic contract wrapper for the low level calls
}
⋮----
contract *bind.BoundContract // Generic contract wrapper for the low level calls
⋮----
// IEigenPodManagerTransactor is an auto generated write-only Go binding around an Ethereum contract.
type IEigenPodManagerTransactor struct {
	contract *bind.BoundContract // Generic contract wrapper for the low level calls
}
⋮----
// IEigenPodManagerFilterer is an auto generated log filtering Go binding around an Ethereum contract events.
type IEigenPodManagerFilterer struct {
	contract *bind.BoundContract // Generic contract wrapper for the low level calls
}
⋮----
// IEigenPodManagerSession is an auto generated Go binding around an Ethereum contract,
// with pre-set call and transact options.
type IEigenPodManagerSession struct {
	Contract     *IEigenPodManager // 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
}
⋮----
Contract     *IEigenPodManager // 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
⋮----
// IEigenPodManagerCallerSession is an auto generated read-only Go binding around an Ethereum contract,
// with pre-set call options.
type IEigenPodManagerCallerSession struct {
	Contract *IEigenPodManagerCaller // Generic contract caller binding to set the session for
	CallOpts bind.CallOpts           // Call options to use throughout this session
}
⋮----
Contract *IEigenPodManagerCaller // Generic contract caller binding to set the session for
CallOpts bind.CallOpts           // Call options to use throughout this session
⋮----
// IEigenPodManagerTransactorSession is an auto generated write-only Go binding around an Ethereum contract,
// with pre-set transact options.
type IEigenPodManagerTransactorSession struct {
	Contract     *IEigenPodManagerTransactor // Generic contract transactor binding to set the session for
	TransactOpts bind.TransactOpts           // Transaction auth options to use throughout this session
}
⋮----
Contract     *IEigenPodManagerTransactor // Generic contract transactor binding to set the session for
TransactOpts bind.TransactOpts           // Transaction auth options to use throughout this session
⋮----
// IEigenPodManagerRaw is an auto generated low-level Go binding around an Ethereum contract.
type IEigenPodManagerRaw struct {
	Contract *IEigenPodManager // Generic contract binding to access the raw methods on
}
⋮----
Contract *IEigenPodManager // Generic contract binding to access the raw methods on
⋮----
// IEigenPodManagerCallerRaw is an auto generated low-level read-only Go binding around an Ethereum contract.
type IEigenPodManagerCallerRaw struct {
	Contract *IEigenPodManagerCaller // Generic read-only contract binding to access the raw methods on
}
⋮----
Contract *IEigenPodManagerCaller // Generic read-only contract binding to access the raw methods on
⋮----
// IEigenPodManagerTransactorRaw is an auto generated low-level write-only Go binding around an Ethereum contract.
type IEigenPodManagerTransactorRaw struct {
	Contract *IEigenPodManagerTransactor // Generic write-only contract binding to access the raw methods on
}
⋮----
Contract *IEigenPodManagerTransactor // Generic write-only contract binding to access the raw methods on
⋮----
// NewIEigenPodManager creates a new instance of IEigenPodManager, bound to a specific deployed contract.
func NewIEigenPodManager(address common.Address, backend bind.ContractBackend) (*IEigenPodManager, error)
⋮----
// NewIEigenPodManagerCaller creates a new read-only instance of IEigenPodManager, bound to a specific deployed contract.
func NewIEigenPodManagerCaller(address common.Address, caller bind.ContractCaller) (*IEigenPodManagerCaller, error)
⋮----
// NewIEigenPodManagerTransactor creates a new write-only instance of IEigenPodManager, bound to a specific deployed contract.
func NewIEigenPodManagerTransactor(address common.Address, transactor bind.ContractTransactor) (*IEigenPodManagerTransactor, error)
⋮----
// NewIEigenPodManagerFilterer creates a new log filterer instance of IEigenPodManager, bound to a specific deployed contract.
func NewIEigenPodManagerFilterer(address common.Address, filterer bind.ContractFilterer) (*IEigenPodManagerFilterer, error)
⋮----
// bindIEigenPodManager binds a generic wrapper to an already deployed contract.
func bindIEigenPodManager(address common.Address, caller bind.ContractCaller, transactor bind.ContractTransactor, filterer bind.ContractFilterer) (*bind.BoundContract, error)
⋮----
// 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 (_IEigenPodManager *IEigenPodManagerRaw) Call(opts *bind.CallOpts, result *[]interface
⋮----
// Transfer initiates a plain transaction to move funds to the contract, calling
// its default method if one is available.
func (_IEigenPodManager *IEigenPodManagerRaw) Transfer(opts *bind.TransactOpts) (*types.Transaction, error)
⋮----
// Transact invokes the (paid) contract method with params as input values.
func (_IEigenPodManager *IEigenPodManagerRaw) Transact(opts *bind.TransactOpts, method string, params ...interface
⋮----
// BeaconChainETHStrategy is a free data retrieval call binding the contract method 0x9104c319.
//
// Solidity: function beaconChainETHStrategy() view returns(address)
func (_IEigenPodManager *IEigenPodManagerCaller) BeaconChainETHStrategy(opts *bind.CallOpts) (common.Address, error)
⋮----
var out []interface{}
⋮----
// BeaconChainSlashingFactor is a free data retrieval call binding the contract method 0xa3d75e09.
⋮----
// Solidity: function beaconChainSlashingFactor(address staker) view returns(uint64)
func (_IEigenPodManager *IEigenPodManagerCaller) BeaconChainSlashingFactor(opts *bind.CallOpts, staker common.Address) (uint64, error)
⋮----
// BurnableETHShares is a free data retrieval call binding the contract method 0xf5d4fed3.
⋮----
// Solidity: function burnableETHShares() view returns(uint256)
func (_IEigenPodManager *IEigenPodManagerCaller) BurnableETHShares(opts *bind.CallOpts) (*big.Int, error)
⋮----
// EigenPodBeacon is a free data retrieval call binding the contract method 0x292b7b2b.
⋮----
// Solidity: function eigenPodBeacon() view returns(address)
func (_IEigenPodManager *IEigenPodManagerCaller) EigenPodBeacon(opts *bind.CallOpts) (common.Address, error)
⋮----
// EthPOS is a free data retrieval call binding the contract method 0x74cdd798.
⋮----
// Solidity: function ethPOS() view returns(address)
func (_IEigenPodManager *IEigenPodManagerCaller) EthPOS(opts *bind.CallOpts) (common.Address, error)
⋮----
// GetPod is a free data retrieval call binding the contract method 0xa38406a3.
⋮----
// Solidity: function getPod(address podOwner) view returns(address)
func (_IEigenPodManager *IEigenPodManagerCaller) GetPod(opts *bind.CallOpts, podOwner common.Address) (common.Address, error)
⋮----
// HasPod is a free data retrieval call binding the contract method 0xf6848d24.
⋮----
// Solidity: function hasPod(address podOwner) view returns(bool)
func (_IEigenPodManager *IEigenPodManagerCaller) HasPod(opts *bind.CallOpts, podOwner common.Address) (bool, error)
⋮----
// NumPods is a free data retrieval call binding the contract method 0xa6a509be.
⋮----
// Solidity: function numPods() view returns(uint256)
func (_IEigenPodManager *IEigenPodManagerCaller) NumPods(opts *bind.CallOpts) (*big.Int, error)
⋮----
// OwnerToPod is a free data retrieval call binding the contract method 0x9ba06275.
⋮----
// Solidity: function ownerToPod(address podOwner) view returns(address)
func (_IEigenPodManager *IEigenPodManagerCaller) OwnerToPod(opts *bind.CallOpts, podOwner common.Address) (common.Address, error)
⋮----
// Paused is a free data retrieval call binding the contract method 0x5ac86ab7.
⋮----
// Solidity: function paused(uint8 index) view returns(bool)
func (_IEigenPodManager *IEigenPodManagerCaller) Paused(opts *bind.CallOpts, index uint8) (bool, error)
⋮----
// Paused0 is a free data retrieval call binding the contract method 0x5c975abb.
⋮----
// Solidity: function paused() view returns(uint256)
func (_IEigenPodManager *IEigenPodManagerCaller) Paused0(opts *bind.CallOpts) (*big.Int, error)
⋮----
// PauserRegistry is a free data retrieval call binding the contract method 0x886f1195.
⋮----
// Solidity: function pauserRegistry() view returns(address)
func (_IEigenPodManager *IEigenPodManagerCaller) PauserRegistry(opts *bind.CallOpts) (common.Address, error)
⋮----
// PectraForkTimestamp is a free data retrieval call binding the contract method 0x2704351a.
⋮----
// Solidity: function pectraForkTimestamp() view returns(uint64)
func (_IEigenPodManager *IEigenPodManagerCaller) PectraForkTimestamp(opts *bind.CallOpts) (uint64, error)
⋮----
// PodOwnerDepositShares is a free data retrieval call binding the contract method 0xd48e8894.
⋮----
// Solidity: function podOwnerDepositShares(address podOwner) view returns(int256)
func (_IEigenPodManager *IEigenPodManagerCaller) PodOwnerDepositShares(opts *bind.CallOpts, podOwner common.Address) (*big.Int, error)
⋮----
// StakerDepositShares is a free data retrieval call binding the contract method 0xfe243a17.
⋮----
// Solidity: function stakerDepositShares(address user, address strategy) view returns(uint256 depositShares)
func (_IEigenPodManager *IEigenPodManagerCaller) StakerDepositShares(opts *bind.CallOpts, user common.Address, strategy common.Address) (*big.Int, error)
⋮----
// AddShares is a paid mutator transaction binding the contract method 0x50ff7225.
⋮----
// Solidity: function addShares(address staker, address strategy, uint256 shares) returns(uint256, uint256)
func (_IEigenPodManager *IEigenPodManagerTransactor) AddShares(opts *bind.TransactOpts, staker common.Address, strategy common.Address, shares *big.Int) (*types.Transaction, error)
⋮----
// CreatePod is a paid mutator transaction binding the contract method 0x84d81062.
⋮----
// Solidity: function createPod() returns(address)
func (_IEigenPodManager *IEigenPodManagerTransactor) CreatePod(opts *bind.TransactOpts) (*types.Transaction, error)
⋮----
// IncreaseBurnOrRedistributableShares is a paid mutator transaction binding the contract method 0x3fb99ca5.
⋮----
// Solidity: function increaseBurnOrRedistributableShares((address,uint32) operatorSet, uint256 slashId, address strategy, uint256 addedSharesToBurn) returns()
func (_IEigenPodManager *IEigenPodManagerTransactor) IncreaseBurnOrRedistributableShares(opts *bind.TransactOpts, operatorSet OperatorSet, slashId *big.Int, strategy common.Address, addedSharesToBurn *big.Int) (*types.Transaction, error)
⋮----
// Pause is a paid mutator transaction binding the contract method 0x136439dd.
⋮----
// Solidity: function pause(uint256 newPausedStatus) returns()
func (_IEigenPodManager *IEigenPodManagerTransactor) Pause(opts *bind.TransactOpts, newPausedStatus *big.Int) (*types.Transaction, error)
⋮----
// PauseAll is a paid mutator transaction binding the contract method 0x595c6a67.
⋮----
// Solidity: function pauseAll() returns()
func (_IEigenPodManager *IEigenPodManagerTransactor) PauseAll(opts *bind.TransactOpts) (*types.Transaction, error)
⋮----
// RecordBeaconChainETHBalanceUpdate is a paid mutator transaction binding the contract method 0xa1ca780b.
⋮----
// Solidity: function recordBeaconChainETHBalanceUpdate(address podOwner, uint256 prevRestakedBalanceWei, int256 balanceDeltaWei) returns()
func (_IEigenPodManager *IEigenPodManagerTransactor) RecordBeaconChainETHBalanceUpdate(opts *bind.TransactOpts, podOwner common.Address, prevRestakedBalanceWei *big.Int, balanceDeltaWei *big.Int) (*types.Transaction, error)
⋮----
// RemoveDepositShares is a paid mutator transaction binding the contract method 0x724af423.
⋮----
// Solidity: function removeDepositShares(address staker, address strategy, uint256 depositSharesToRemove) returns(uint256)
func (_IEigenPodManager *IEigenPodManagerTransactor) RemoveDepositShares(opts *bind.TransactOpts, staker common.Address, strategy common.Address, depositSharesToRemove *big.Int) (*types.Transaction, error)
⋮----
// SetPectraForkTimestamp is a paid mutator transaction binding the contract method 0x5a26fbf4.
⋮----
// Solidity: function setPectraForkTimestamp(uint64 timestamp) returns()
func (_IEigenPodManager *IEigenPodManagerTransactor) SetPectraForkTimestamp(opts *bind.TransactOpts, timestamp uint64) (*types.Transaction, error)
⋮----
// SetProofTimestampSetter is a paid mutator transaction binding the contract method 0x0d1e9de1.
⋮----
// Solidity: function setProofTimestampSetter(address newProofTimestampSetter) returns()
func (_IEigenPodManager *IEigenPodManagerTransactor) SetProofTimestampSetter(opts *bind.TransactOpts, newProofTimestampSetter common.Address) (*types.Transaction, error)
⋮----
// Stake is a paid mutator transaction binding the contract method 0x9b4e4634.
⋮----
// Solidity: function stake(bytes pubkey, bytes signature, bytes32 depositDataRoot) payable returns()
func (_IEigenPodManager *IEigenPodManagerTransactor) Stake(opts *bind.TransactOpts, pubkey []byte, signature []byte, depositDataRoot [32]byte) (*types.Transaction, error)
⋮----
// Unpause is a paid mutator transaction binding the contract method 0xfabc1cbc.
⋮----
// Solidity: function unpause(uint256 newPausedStatus) returns()
func (_IEigenPodManager *IEigenPodManagerTransactor) Unpause(opts *bind.TransactOpts, newPausedStatus *big.Int) (*types.Transaction, error)
⋮----
// WithdrawSharesAsTokens is a paid mutator transaction binding the contract method 0x2eae418c.
⋮----
// Solidity: function withdrawSharesAsTokens(address staker, address strategy, address token, uint256 shares) returns()
func (_IEigenPodManager *IEigenPodManagerTransactor) WithdrawSharesAsTokens(opts *bind.TransactOpts, staker common.Address, strategy common.Address, token common.Address, shares *big.Int) (*types.Transaction, error)
⋮----
// IEigenPodManagerBeaconChainETHDepositedIterator is returned from FilterBeaconChainETHDeposited and is used to iterate over the raw logs and unpacked data for BeaconChainETHDeposited events raised by the IEigenPodManager contract.
type IEigenPodManagerBeaconChainETHDepositedIterator struct {
	Event *IEigenPodManagerBeaconChainETHDeposited // 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
}
⋮----
Event *IEigenPodManagerBeaconChainETHDeposited // 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 *IEigenPodManagerBeaconChainETHDepositedIterator) Next() bool
⋮----
// If the iterator failed, stop iterating
⋮----
// If the iterator completed, deliver directly whatever's available
⋮----
// Iterator still in progress, wait for either a data or an error event
⋮----
// Error returns any retrieval or parsing error occurred during filtering.
func (it *IEigenPodManagerBeaconChainETHDepositedIterator) Error() error
⋮----
// Close terminates the iteration process, releasing any pending underlying
// resources.
func (it *IEigenPodManagerBeaconChainETHDepositedIterator) Close() error
⋮----
// IEigenPodManagerBeaconChainETHDeposited represents a BeaconChainETHDeposited event raised by the IEigenPodManager contract.
type IEigenPodManagerBeaconChainETHDeposited struct {
	PodOwner common.Address
	Amount   *big.Int
	Raw      types.Log // Blockchain specific contextual infos
}
⋮----
Raw      types.Log // Blockchain specific contextual infos
⋮----
// FilterBeaconChainETHDeposited is a free log retrieval operation binding the contract event 0x35a85cabc603f48abb2b71d9fbd8adea7c449d7f0be900ae7a2986ea369c3d0d.
⋮----
// Solidity: event BeaconChainETHDeposited(address indexed podOwner, uint256 amount)
func (_IEigenPodManager *IEigenPodManagerFilterer) FilterBeaconChainETHDeposited(opts *bind.FilterOpts, podOwner []common.Address) (*IEigenPodManagerBeaconChainETHDepositedIterator, error)
⋮----
var podOwnerRule []interface{}
⋮----
// WatchBeaconChainETHDeposited is a free log subscription operation binding the contract event 0x35a85cabc603f48abb2b71d9fbd8adea7c449d7f0be900ae7a2986ea369c3d0d.
⋮----
func (_IEigenPodManager *IEigenPodManagerFilterer) WatchBeaconChainETHDeposited(opts *bind.WatchOpts, sink chan<- *IEigenPodManagerBeaconChainETHDeposited, podOwner []common.Address) (event.Subscription, error)
⋮----
// New log arrived, parse the event and forward to the user
⋮----
// ParseBeaconChainETHDeposited is a log parse operation binding the contract event 0x35a85cabc603f48abb2b71d9fbd8adea7c449d7f0be900ae7a2986ea369c3d0d.
⋮----
func (_IEigenPodManager *IEigenPodManagerFilterer) ParseBeaconChainETHDeposited(log types.Log) (*IEigenPodManagerBeaconChainETHDeposited, error)
⋮----
// IEigenPodManagerBeaconChainETHWithdrawalCompletedIterator is returned from FilterBeaconChainETHWithdrawalCompleted and is used to iterate over the raw logs and unpacked data for BeaconChainETHWithdrawalCompleted events raised by the IEigenPodManager contract.
type IEigenPodManagerBeaconChainETHWithdrawalCompletedIterator struct {
	Event *IEigenPodManagerBeaconChainETHWithdrawalCompleted // 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
}
⋮----
Event *IEigenPodManagerBeaconChainETHWithdrawalCompleted // Event containing the contract specifics and raw log
⋮----
// IEigenPodManagerBeaconChainETHWithdrawalCompleted represents a BeaconChainETHWithdrawalCompleted event raised by the IEigenPodManager contract.
type IEigenPodManagerBeaconChainETHWithdrawalCompleted struct {
	PodOwner         common.Address
	Shares           *big.Int
	Nonce            *big.Int
	DelegatedAddress common.Address
	Withdrawer       common.Address
	WithdrawalRoot   [32]byte
	Raw              types.Log // Blockchain specific contextual infos
}
⋮----
Raw              types.Log // Blockchain specific contextual infos
⋮----
// FilterBeaconChainETHWithdrawalCompleted is a free log retrieval operation binding the contract event 0xa6bab1d55a361fcea2eee2bc9491e4f01e6cf333df03c9c4f2c144466429f7d6.
⋮----
// Solidity: event BeaconChainETHWithdrawalCompleted(address indexed podOwner, uint256 shares, uint96 nonce, address delegatedAddress, address withdrawer, bytes32 withdrawalRoot)
func (_IEigenPodManager *IEigenPodManagerFilterer) FilterBeaconChainETHWithdrawalCompleted(opts *bind.FilterOpts, podOwner []common.Address) (*IEigenPodManagerBeaconChainETHWithdrawalCompletedIterator, error)
⋮----
// WatchBeaconChainETHWithdrawalCompleted is a free log subscription operation binding the contract event 0xa6bab1d55a361fcea2eee2bc9491e4f01e6cf333df03c9c4f2c144466429f7d6.
⋮----
func (_IEigenPodManager *IEigenPodManagerFilterer) WatchBeaconChainETHWithdrawalCompleted(opts *bind.WatchOpts, sink chan<- *IEigenPodManagerBeaconChainETHWithdrawalCompleted, podOwner []common.Address) (event.Subscription, error)
⋮----
// ParseBeaconChainETHWithdrawalCompleted is a log parse operation binding the contract event 0xa6bab1d55a361fcea2eee2bc9491e4f01e6cf333df03c9c4f2c144466429f7d6.
⋮----
func (_IEigenPodManager *IEigenPodManagerFilterer) ParseBeaconChainETHWithdrawalCompleted(log types.Log) (*IEigenPodManagerBeaconChainETHWithdrawalCompleted, error)
⋮----
// IEigenPodManagerBeaconChainSlashingFactorDecreasedIterator is returned from FilterBeaconChainSlashingFactorDecreased and is used to iterate over the raw logs and unpacked data for BeaconChainSlashingFactorDecreased events raised by the IEigenPodManager contract.
type IEigenPodManagerBeaconChainSlashingFactorDecreasedIterator struct {
	Event *IEigenPodManagerBeaconChainSlashingFactorDecreased // 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
}
⋮----
Event *IEigenPodManagerBeaconChainSlashingFactorDecreased // Event containing the contract specifics and raw log
⋮----
// IEigenPodManagerBeaconChainSlashingFactorDecreased represents a BeaconChainSlashingFactorDecreased event raised by the IEigenPodManager contract.
type IEigenPodManagerBeaconChainSlashingFactorDecreased struct {
	Staker                        common.Address
	PrevBeaconChainSlashingFactor uint64
	NewBeaconChainSlashingFactor  uint64
	Raw                           types.Log // Blockchain specific contextual infos
}
⋮----
Raw                           types.Log // Blockchain specific contextual infos
⋮----
// FilterBeaconChainSlashingFactorDecreased is a free log retrieval operation binding the contract event 0xb160ab8589bf47dc04ea11b50d46678d21590cea2ed3e454e7bd3e41510f98cf.
⋮----
// Solidity: event BeaconChainSlashingFactorDecreased(address staker, uint64 prevBeaconChainSlashingFactor, uint64 newBeaconChainSlashingFactor)
func (_IEigenPodManager *IEigenPodManagerFilterer) FilterBeaconChainSlashingFactorDecreased(opts *bind.FilterOpts) (*IEigenPodManagerBeaconChainSlashingFactorDecreasedIterator, error)
⋮----
// WatchBeaconChainSlashingFactorDecreased is a free log subscription operation binding the contract event 0xb160ab8589bf47dc04ea11b50d46678d21590cea2ed3e454e7bd3e41510f98cf.
⋮----
func (_IEigenPodManager *IEigenPodManagerFilterer) WatchBeaconChainSlashingFactorDecreased(opts *bind.WatchOpts, sink chan<- *IEigenPodManagerBeaconChainSlashingFactorDecreased) (event.Subscription, error)
⋮----
// ParseBeaconChainSlashingFactorDecreased is a log parse operation binding the contract event 0xb160ab8589bf47dc04ea11b50d46678d21590cea2ed3e454e7bd3e41510f98cf.
⋮----
func (_IEigenPodManager *IEigenPodManagerFilterer) ParseBeaconChainSlashingFactorDecreased(log types.Log) (*IEigenPodManagerBeaconChainSlashingFactorDecreased, error)
⋮----
// IEigenPodManagerBurnableETHSharesIncreasedIterator is returned from FilterBurnableETHSharesIncreased and is used to iterate over the raw logs and unpacked data for BurnableETHSharesIncreased events raised by the IEigenPodManager contract.
type IEigenPodManagerBurnableETHSharesIncreasedIterator struct {
	Event *IEigenPodManagerBurnableETHSharesIncreased // 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
}
⋮----
Event *IEigenPodManagerBurnableETHSharesIncreased // Event containing the contract specifics and raw log
⋮----
// IEigenPodManagerBurnableETHSharesIncreased represents a BurnableETHSharesIncreased event raised by the IEigenPodManager contract.
type IEigenPodManagerBurnableETHSharesIncreased struct {
	Shares *big.Int
	Raw    types.Log // Blockchain specific contextual infos
}
⋮----
Raw    types.Log // Blockchain specific contextual infos
⋮----
// FilterBurnableETHSharesIncreased is a free log retrieval operation binding the contract event 0x1ed04b7fd262c0d9e50fa02957f32a81a151f03baaa367faeedc7521b001c4a4.
⋮----
// Solidity: event BurnableETHSharesIncreased(uint256 shares)
func (_IEigenPodManager *IEigenPodManagerFilterer) FilterBurnableETHSharesIncreased(opts *bind.FilterOpts) (*IEigenPodManagerBurnableETHSharesIncreasedIterator, error)
⋮----
// WatchBurnableETHSharesIncreased is a free log subscription operation binding the contract event 0x1ed04b7fd262c0d9e50fa02957f32a81a151f03baaa367faeedc7521b001c4a4.
⋮----
func (_IEigenPodManager *IEigenPodManagerFilterer) WatchBurnableETHSharesIncreased(opts *bind.WatchOpts, sink chan<- *IEigenPodManagerBurnableETHSharesIncreased) (event.Subscription, error)
⋮----
// ParseBurnableETHSharesIncreased is a log parse operation binding the contract event 0x1ed04b7fd262c0d9e50fa02957f32a81a151f03baaa367faeedc7521b001c4a4.
⋮----
func (_IEigenPodManager *IEigenPodManagerFilterer) ParseBurnableETHSharesIncreased(log types.Log) (*IEigenPodManagerBurnableETHSharesIncreased, error)
⋮----
// IEigenPodManagerNewTotalSharesIterator is returned from FilterNewTotalShares and is used to iterate over the raw logs and unpacked data for NewTotalShares events raised by the IEigenPodManager contract.
type IEigenPodManagerNewTotalSharesIterator struct {
	Event *IEigenPodManagerNewTotalShares // 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
}
⋮----
Event *IEigenPodManagerNewTotalShares // Event containing the contract specifics and raw log
⋮----
// IEigenPodManagerNewTotalShares represents a NewTotalShares event raised by the IEigenPodManager contract.
type IEigenPodManagerNewTotalShares struct {
	PodOwner       common.Address
	NewTotalShares *big.Int
	Raw            types.Log // Blockchain specific contextual infos
}
⋮----
Raw            types.Log // Blockchain specific contextual infos
⋮----
// FilterNewTotalShares is a free log retrieval operation binding the contract event 0xd4def76d6d2bed6f14d5cd9af73cc2913d618d00edde42432e81c09bfe077098.
⋮----
// Solidity: event NewTotalShares(address indexed podOwner, int256 newTotalShares)
func (_IEigenPodManager *IEigenPodManagerFilterer) FilterNewTotalShares(opts *bind.FilterOpts, podOwner []common.Address) (*IEigenPodManagerNewTotalSharesIterator, error)
⋮----
// WatchNewTotalShares is a free log subscription operation binding the contract event 0xd4def76d6d2bed6f14d5cd9af73cc2913d618d00edde42432e81c09bfe077098.
⋮----
func (_IEigenPodManager *IEigenPodManagerFilterer) WatchNewTotalShares(opts *bind.WatchOpts, sink chan<- *IEigenPodManagerNewTotalShares, podOwner []common.Address) (event.Subscription, error)
⋮----
// ParseNewTotalShares is a log parse operation binding the contract event 0xd4def76d6d2bed6f14d5cd9af73cc2913d618d00edde42432e81c09bfe077098.
⋮----
func (_IEigenPodManager *IEigenPodManagerFilterer) ParseNewTotalShares(log types.Log) (*IEigenPodManagerNewTotalShares, error)
⋮----
// IEigenPodManagerPausedIterator is returned from FilterPaused and is used to iterate over the raw logs and unpacked data for Paused events raised by the IEigenPodManager contract.
type IEigenPodManagerPausedIterator struct {
	Event *IEigenPodManagerPaused // 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
}
⋮----
Event *IEigenPodManagerPaused // Event containing the contract specifics and raw log
⋮----
// IEigenPodManagerPaused represents a Paused event raised by the IEigenPodManager contract.
type IEigenPodManagerPaused struct {
	Account         common.Address
	NewPausedStatus *big.Int
	Raw             types.Log // Blockchain specific contextual infos
}
⋮----
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 (_IEigenPodManager *IEigenPodManagerFilterer) FilterPaused(opts *bind.FilterOpts, account []common.Address) (*IEigenPodManagerPausedIterator, error)
⋮----
var accountRule []interface{}
⋮----
// WatchPaused is a free log subscription operation binding the contract event 0xab40a374bc51de372200a8bc981af8c9ecdc08dfdaef0bb6e09f88f3c616ef3d.
⋮----
func (_IEigenPodManager *IEigenPodManagerFilterer) WatchPaused(opts *bind.WatchOpts, sink chan<- *IEigenPodManagerPaused, account []common.Address) (event.Subscription, error)
⋮----
// ParsePaused is a log parse operation binding the contract event 0xab40a374bc51de372200a8bc981af8c9ecdc08dfdaef0bb6e09f88f3c616ef3d.
⋮----
func (_IEigenPodManager *IEigenPodManagerFilterer) ParsePaused(log types.Log) (*IEigenPodManagerPaused, error)
⋮----
// IEigenPodManagerPectraForkTimestampSetIterator is returned from FilterPectraForkTimestampSet and is used to iterate over the raw logs and unpacked data for PectraForkTimestampSet events raised by the IEigenPodManager contract.
type IEigenPodManagerPectraForkTimestampSetIterator struct {
	Event *IEigenPodManagerPectraForkTimestampSet // 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
}
⋮----
Event *IEigenPodManagerPectraForkTimestampSet // Event containing the contract specifics and raw log
⋮----
// IEigenPodManagerPectraForkTimestampSet represents a PectraForkTimestampSet event raised by the IEigenPodManager contract.
type IEigenPodManagerPectraForkTimestampSet struct {
	NewPectraForkTimestamp uint64
	Raw                    types.Log // Blockchain specific contextual infos
}
⋮----
Raw                    types.Log // Blockchain specific contextual infos
⋮----
// FilterPectraForkTimestampSet is a free log retrieval operation binding the contract event 0x1bc8f042a52db3a437620dea4548f2031fb2a16dd8d3b0b854295528dd2cdd33.
⋮----
// Solidity: event PectraForkTimestampSet(uint64 newPectraForkTimestamp)
func (_IEigenPodManager *IEigenPodManagerFilterer) FilterPectraForkTimestampSet(opts *bind.FilterOpts) (*IEigenPodManagerPectraForkTimestampSetIterator, error)
⋮----
// WatchPectraForkTimestampSet is a free log subscription operation binding the contract event 0x1bc8f042a52db3a437620dea4548f2031fb2a16dd8d3b0b854295528dd2cdd33.
⋮----
func (_IEigenPodManager *IEigenPodManagerFilterer) WatchPectraForkTimestampSet(opts *bind.WatchOpts, sink chan<- *IEigenPodManagerPectraForkTimestampSet) (event.Subscription, error)
⋮----
// ParsePectraForkTimestampSet is a log parse operation binding the contract event 0x1bc8f042a52db3a437620dea4548f2031fb2a16dd8d3b0b854295528dd2cdd33.
⋮----
func (_IEigenPodManager *IEigenPodManagerFilterer) ParsePectraForkTimestampSet(log types.Log) (*IEigenPodManagerPectraForkTimestampSet, error)
⋮----
// IEigenPodManagerPodDeployedIterator is returned from FilterPodDeployed and is used to iterate over the raw logs and unpacked data for PodDeployed events raised by the IEigenPodManager contract.
type IEigenPodManagerPodDeployedIterator struct {
	Event *IEigenPodManagerPodDeployed // 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
}
⋮----
Event *IEigenPodManagerPodDeployed // Event containing the contract specifics and raw log
⋮----
// IEigenPodManagerPodDeployed represents a PodDeployed event raised by the IEigenPodManager contract.
type IEigenPodManagerPodDeployed struct {
	EigenPod common.Address
	PodOwner common.Address
	Raw      types.Log // Blockchain specific contextual infos
}
⋮----
// FilterPodDeployed is a free log retrieval operation binding the contract event 0x21c99d0db02213c32fff5b05cf0a718ab5f858802b91498f80d82270289d856a.
⋮----
// Solidity: event PodDeployed(address indexed eigenPod, address indexed podOwner)
func (_IEigenPodManager *IEigenPodManagerFilterer) FilterPodDeployed(opts *bind.FilterOpts, eigenPod []common.Address, podOwner []common.Address) (*IEigenPodManagerPodDeployedIterator, error)
⋮----
var eigenPodRule []interface{}
⋮----
// WatchPodDeployed is a free log subscription operation binding the contract event 0x21c99d0db02213c32fff5b05cf0a718ab5f858802b91498f80d82270289d856a.
⋮----
func (_IEigenPodManager *IEigenPodManagerFilterer) WatchPodDeployed(opts *bind.WatchOpts, sink chan<- *IEigenPodManagerPodDeployed, eigenPod []common.Address, podOwner []common.Address) (event.Subscription, error)
⋮----
// ParsePodDeployed is a log parse operation binding the contract event 0x21c99d0db02213c32fff5b05cf0a718ab5f858802b91498f80d82270289d856a.
⋮----
func (_IEigenPodManager *IEigenPodManagerFilterer) ParsePodDeployed(log types.Log) (*IEigenPodManagerPodDeployed, error)
⋮----
// IEigenPodManagerPodSharesUpdatedIterator is returned from FilterPodSharesUpdated and is used to iterate over the raw logs and unpacked data for PodSharesUpdated events raised by the IEigenPodManager contract.
type IEigenPodManagerPodSharesUpdatedIterator struct {
	Event *IEigenPodManagerPodSharesUpdated // 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
}
⋮----
Event *IEigenPodManagerPodSharesUpdated // Event containing the contract specifics and raw log
⋮----
// IEigenPodManagerPodSharesUpdated represents a PodSharesUpdated event raised by the IEigenPodManager contract.
type IEigenPodManagerPodSharesUpdated struct {
	PodOwner    common.Address
	SharesDelta *big.Int
	Raw         types.Log // Blockchain specific contextual infos
}
⋮----
Raw         types.Log // Blockchain specific contextual infos
⋮----
// FilterPodSharesUpdated is a free log retrieval operation binding the contract event 0x4e2b791dedccd9fb30141b088cabf5c14a8912b52f59375c95c010700b8c6193.
⋮----
// Solidity: event PodSharesUpdated(address indexed podOwner, int256 sharesDelta)
func (_IEigenPodManager *IEigenPodManagerFilterer) FilterPodSharesUpdated(opts *bind.FilterOpts, podOwner []common.Address) (*IEigenPodManagerPodSharesUpdatedIterator, error)
⋮----
// WatchPodSharesUpdated is a free log subscription operation binding the contract event 0x4e2b791dedccd9fb30141b088cabf5c14a8912b52f59375c95c010700b8c6193.
⋮----
func (_IEigenPodManager *IEigenPodManagerFilterer) WatchPodSharesUpdated(opts *bind.WatchOpts, sink chan<- *IEigenPodManagerPodSharesUpdated, podOwner []common.Address) (event.Subscription, error)
⋮----
// ParsePodSharesUpdated is a log parse operation binding the contract event 0x4e2b791dedccd9fb30141b088cabf5c14a8912b52f59375c95c010700b8c6193.
⋮----
func (_IEigenPodManager *IEigenPodManagerFilterer) ParsePodSharesUpdated(log types.Log) (*IEigenPodManagerPodSharesUpdated, error)
⋮----
// IEigenPodManagerProofTimestampSetterSetIterator is returned from FilterProofTimestampSetterSet and is used to iterate over the raw logs and unpacked data for ProofTimestampSetterSet events raised by the IEigenPodManager contract.
type IEigenPodManagerProofTimestampSetterSetIterator struct {
	Event *IEigenPodManagerProofTimestampSetterSet // 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
}
⋮----
Event *IEigenPodManagerProofTimestampSetterSet // Event containing the contract specifics and raw log
⋮----
// IEigenPodManagerProofTimestampSetterSet represents a ProofTimestampSetterSet event raised by the IEigenPodManager contract.
type IEigenPodManagerProofTimestampSetterSet struct {
	NewProofTimestampSetter common.Address
	Raw                     types.Log // Blockchain specific contextual infos
}
⋮----
Raw                     types.Log // Blockchain specific contextual infos
⋮----
// FilterProofTimestampSetterSet is a free log retrieval operation binding the contract event 0x7025c71a9fe60d709e71b377dc5f7c72c3e1d8539f8022574254e736ceca01e5.
⋮----
// Solidity: event ProofTimestampSetterSet(address newProofTimestampSetter)
func (_IEigenPodManager *IEigenPodManagerFilterer) FilterProofTimestampSetterSet(opts *bind.FilterOpts) (*IEigenPodManagerProofTimestampSetterSetIterator, error)
⋮----
// WatchProofTimestampSetterSet is a free log subscription operation binding the contract event 0x7025c71a9fe60d709e71b377dc5f7c72c3e1d8539f8022574254e736ceca01e5.
⋮----
func (_IEigenPodManager *IEigenPodManagerFilterer) WatchProofTimestampSetterSet(opts *bind.WatchOpts, sink chan<- *IEigenPodManagerProofTimestampSetterSet) (event.Subscription, error)
⋮----
// ParseProofTimestampSetterSet is a log parse operation binding the contract event 0x7025c71a9fe60d709e71b377dc5f7c72c3e1d8539f8022574254e736ceca01e5.
⋮----
func (_IEigenPodManager *IEigenPodManagerFilterer) ParseProofTimestampSetterSet(log types.Log) (*IEigenPodManagerProofTimestampSetterSet, error)
⋮----
// IEigenPodManagerUnpausedIterator is returned from FilterUnpaused and is used to iterate over the raw logs and unpacked data for Unpaused events raised by the IEigenPodManager contract.
type IEigenPodManagerUnpausedIterator struct {
	Event *IEigenPodManagerUnpaused // 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
}
⋮----
Event *IEigenPodManagerUnpaused // Event containing the contract specifics and raw log
⋮----
// IEigenPodManagerUnpaused represents a Unpaused event raised by the IEigenPodManager contract.
type IEigenPodManagerUnpaused 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 (_IEigenPodManager *IEigenPodManagerFilterer) FilterUnpaused(opts *bind.FilterOpts, account []common.Address) (*IEigenPodManagerUnpausedIterator, error)
⋮----
// WatchUnpaused is a free log subscription operation binding the contract event 0x3582d1828e26bf56bd801502bc021ac0bc8afb57c826e4986b45593c8fad389c.
⋮----
func (_IEigenPodManager *IEigenPodManagerFilterer) WatchUnpaused(opts *bind.WatchOpts, sink chan<- *IEigenPodManagerUnpaused, account []common.Address) (event.Subscription, error)
⋮----
// ParseUnpaused is a log parse operation binding the contract event 0x3582d1828e26bf56bd801502bc021ac0bc8afb57c826e4986b45593c8fad389c.
⋮----
func (_IEigenPodManager *IEigenPodManagerFilterer) ParseUnpaused(log types.Log) (*IEigenPodManagerUnpaused, error)
````

## File: pkg/bindings/IEmissionsController/binding.go
````go
// 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"
)
⋮----
"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     // 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
}
⋮----
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
}
⋮----
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
}
⋮----
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
}
⋮----
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
}
⋮----
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
}
⋮----
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
}
⋮----
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)
⋮----
// 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)
⋮----
// 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)
⋮----
// 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)
⋮----
// 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)
⋮----
// 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
⋮----
// 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)
⋮----
// Transact invokes the (paid) contract method with params as input values.
func (_IEmissionsController *IEmissionsControllerRaw) Transact(opts *bind.TransactOpts, method string, params ...interface
⋮----
// 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{}
⋮----
// 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)
⋮----
// 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)
⋮----
// 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)
⋮----
// 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)
⋮----
// 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)
⋮----
// 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)
⋮----
// 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)
⋮----
// 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)
⋮----
// 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)
⋮----
// 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)
⋮----
// 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)
⋮----
// 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)
⋮----
// 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)
⋮----
// 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)
⋮----
// 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)
⋮----
// 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)
⋮----
// 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)
⋮----
// 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)
⋮----
// 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)
⋮----
// 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)
⋮----
// 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)
⋮----
// 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)
⋮----
// 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)
⋮----
// 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)
⋮----
// 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)
⋮----
// 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)
⋮----
// 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)
⋮----
// 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)
⋮----
// 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
}
⋮----
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 the iterator completed, deliver directly whatever's available
⋮----
// Iterator still in progress, wait for either a data or an error event
⋮----
// Error returns any retrieval or parsing error occurred during filtering.
func (it *IEmissionsControllerDistributionAddedIterator) Error() error
⋮----
// Close terminates the iteration process, releasing any pending underlying
// resources.
func (it *IEmissionsControllerDistributionAddedIterator) Close() error
⋮----
// 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
}
⋮----
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{}
⋮----
var epochRule []interface{}
⋮----
// WatchDistributionAdded is a free log subscription operation binding the contract event 0x006f7ba35643ecf5852cfe01b66220b1fe04a4cd4866923d5f3e66c7fcb390ef.
⋮----
func (_IEmissionsController *IEmissionsControllerFilterer) WatchDistributionAdded(opts *bind.WatchOpts, sink chan<- *IEmissionsControllerDistributionAdded, distributionId []*big.Int, epoch []*big.Int) (event.Subscription, error)
⋮----
// New log arrived, parse the event and forward to the user
⋮----
// ParseDistributionAdded is a log parse operation binding the contract event 0x006f7ba35643ecf5852cfe01b66220b1fe04a4cd4866923d5f3e66c7fcb390ef.
⋮----
func (_IEmissionsController *IEmissionsControllerFilterer) ParseDistributionAdded(log types.Log) (*IEmissionsControllerDistributionAdded, error)
⋮----
// 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
}
⋮----
Event *IEmissionsControllerDistributionProcessed // Event containing the contract specifics and raw log
⋮----
// 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)
⋮----
// WatchDistributionProcessed is a free log subscription operation binding the contract event 0xba5d66336bc9a4f8459242151a4da4d5020ac581243d98403bb55f7f348e071b.
⋮----
func (_IEmissionsController *IEmissionsControllerFilterer) WatchDistributionProcessed(opts *bind.WatchOpts, sink chan<- *IEmissionsControllerDistributionProcessed, distributionId []*big.Int, epoch []*big.Int) (event.Subscription, error)
⋮----
// ParseDistributionProcessed is a log parse operation binding the contract event 0xba5d66336bc9a4f8459242151a4da4d5020ac581243d98403bb55f7f348e071b.
⋮----
func (_IEmissionsController *IEmissionsControllerFilterer) ParseDistributionProcessed(log types.Log) (*IEmissionsControllerDistributionProcessed, error)
⋮----
// 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
}
⋮----
Event *IEmissionsControllerDistributionUpdated // Event containing the contract specifics and raw log
⋮----
// 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)
⋮----
// WatchDistributionUpdated is a free log subscription operation binding the contract event 0x548fb50d6be978df2bacbf48c6840e4a4743672408921282117f3f00555b2b4c.
⋮----
func (_IEmissionsController *IEmissionsControllerFilterer) WatchDistributionUpdated(opts *bind.WatchOpts, sink chan<- *IEmissionsControllerDistributionUpdated, distributionId []*big.Int, epoch []*big.Int) (event.Subscription, error)
⋮----
// ParseDistributionUpdated is a log parse operation binding the contract event 0x548fb50d6be978df2bacbf48c6840e4a4743672408921282117f3f00555b2b4c.
⋮----
func (_IEmissionsController *IEmissionsControllerFilterer) ParseDistributionUpdated(log types.Log) (*IEmissionsControllerDistributionUpdated, error)
⋮----
// 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
}
⋮----
Event *IEmissionsControllerIncentiveCouncilUpdated // Event containing the contract specifics and raw log
⋮----
// IEmissionsControllerIncentiveCouncilUpdated represents a IncentiveCouncilUpdated event raised by the IEmissionsController contract.
type IEmissionsControllerIncentiveCouncilUpdated struct {
	IncentiveCouncil common.Address
	Raw              types.Log // Blockchain specific contextual infos
}
⋮----
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{}
⋮----
// WatchIncentiveCouncilUpdated is a free log subscription operation binding the contract event 0x8befac6896b786e67b23cefc473bfabd36e7fc013125c883dfeec8e3a9636216.
⋮----
func (_IEmissionsController *IEmissionsControllerFilterer) WatchIncentiveCouncilUpdated(opts *bind.WatchOpts, sink chan<- *IEmissionsControllerIncentiveCouncilUpdated, incentiveCouncil []common.Address) (event.Subscription, error)
⋮----
// ParseIncentiveCouncilUpdated is a log parse operation binding the contract event 0x8befac6896b786e67b23cefc473bfabd36e7fc013125c883dfeec8e3a9636216.
⋮----
func (_IEmissionsController *IEmissionsControllerFilterer) ParseIncentiveCouncilUpdated(log types.Log) (*IEmissionsControllerIncentiveCouncilUpdated, error)
⋮----
// 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
}
⋮----
Event *IEmissionsControllerPaused // Event containing the contract specifics and raw log
⋮----
// 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
}
⋮----
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{}
⋮----
// WatchPaused is a free log subscription operation binding the contract event 0xab40a374bc51de372200a8bc981af8c9ecdc08dfdaef0bb6e09f88f3c616ef3d.
⋮----
func (_IEmissionsController *IEmissionsControllerFilterer) WatchPaused(opts *bind.WatchOpts, sink chan<- *IEmissionsControllerPaused, account []common.Address) (event.Subscription, error)
⋮----
// ParsePaused is a log parse operation binding the contract event 0xab40a374bc51de372200a8bc981af8c9ecdc08dfdaef0bb6e09f88f3c616ef3d.
⋮----
func (_IEmissionsController *IEmissionsControllerFilterer) ParsePaused(log types.Log) (*IEmissionsControllerPaused, error)
⋮----
// 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
}
⋮----
Event *IEmissionsControllerSwept // Event containing the contract specifics and raw log
⋮----
// 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)
⋮----
// WatchSwept is a free log subscription operation binding the contract event 0xc36b5179cb9c303b200074996eab2b3473eac370fdd7eba3bec636fe35109696.
⋮----
func (_IEmissionsController *IEmissionsControllerFilterer) WatchSwept(opts *bind.WatchOpts, sink chan<- *IEmissionsControllerSwept, incentiveCouncil []common.Address) (event.Subscription, error)
⋮----
// ParseSwept is a log parse operation binding the contract event 0xc36b5179cb9c303b200074996eab2b3473eac370fdd7eba3bec636fe35109696.
⋮----
func (_IEmissionsController *IEmissionsControllerFilterer) ParseSwept(log types.Log) (*IEmissionsControllerSwept, error)
⋮----
// 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
}
⋮----
Event *IEmissionsControllerUnpaused // Event containing the contract specifics and raw log
⋮----
// 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)
⋮----
// WatchUnpaused is a free log subscription operation binding the contract event 0x3582d1828e26bf56bd801502bc021ac0bc8afb57c826e4986b45593c8fad389c.
⋮----
func (_IEmissionsController *IEmissionsControllerFilterer) WatchUnpaused(opts *bind.WatchOpts, sink chan<- *IEmissionsControllerUnpaused, account []common.Address) (event.Subscription, error)
⋮----
// ParseUnpaused is a log parse operation binding the contract event 0x3582d1828e26bf56bd801502bc021ac0bc8afb57c826e4986b45593c8fad389c.
⋮----
func (_IEmissionsController *IEmissionsControllerFilterer) ParseUnpaused(log types.Log) (*IEmissionsControllerUnpaused, error)
````

## File: pkg/bindings/IETHPOSDeposit/binding.go
````go
// Code generated - DO NOT EDIT.
// This file is a generated binding and any manual changes will be lost.
⋮----
package IETHPOSDeposit
⋮----
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"
)
⋮----
"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
)
⋮----
// IETHPOSDepositMetaData contains all meta data concerning the IETHPOSDeposit contract.
var IETHPOSDepositMetaData = &bind.MetaData{
	ABI: "[{\"type\":\"function\",\"name\":\"deposit\",\"inputs\":[{\"name\":\"pubkey\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"withdrawal_credentials\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"signature\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"deposit_data_root\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[],\"stateMutability\":\"payable\"},{\"type\":\"function\",\"name\":\"get_deposit_count\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"get_deposit_root\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"event\",\"name\":\"DepositEvent\",\"inputs\":[{\"name\":\"pubkey\",\"type\":\"bytes\",\"indexed\":false,\"internalType\":\"bytes\"},{\"name\":\"withdrawal_credentials\",\"type\":\"bytes\",\"indexed\":false,\"internalType\":\"bytes\"},{\"name\":\"amount\",\"type\":\"bytes\",\"indexed\":false,\"internalType\":\"bytes\"},{\"name\":\"signature\",\"type\":\"bytes\",\"indexed\":false,\"internalType\":\"bytes\"},{\"name\":\"index\",\"type\":\"bytes\",\"indexed\":false,\"internalType\":\"bytes\"}],\"anonymous\":false}]",
}
⋮----
// IETHPOSDepositABI is the input ABI used to generate the binding from.
// Deprecated: Use IETHPOSDepositMetaData.ABI instead.
var IETHPOSDepositABI = IETHPOSDepositMetaData.ABI
⋮----
// IETHPOSDeposit is an auto generated Go binding around an Ethereum contract.
type IETHPOSDeposit struct {
	IETHPOSDepositCaller     // Read-only binding to the contract
	IETHPOSDepositTransactor // Write-only binding to the contract
	IETHPOSDepositFilterer   // Log filterer for contract events
}
⋮----
IETHPOSDepositCaller     // Read-only binding to the contract
IETHPOSDepositTransactor // Write-only binding to the contract
IETHPOSDepositFilterer   // Log filterer for contract events
⋮----
// IETHPOSDepositCaller is an auto generated read-only Go binding around an Ethereum contract.
type IETHPOSDepositCaller struct {
	contract *bind.BoundContract // Generic contract wrapper for the low level calls
}
⋮----
contract *bind.BoundContract // Generic contract wrapper for the low level calls
⋮----
// IETHPOSDepositTransactor is an auto generated write-only Go binding around an Ethereum contract.
type IETHPOSDepositTransactor struct {
	contract *bind.BoundContract // Generic contract wrapper for the low level calls
}
⋮----
// IETHPOSDepositFilterer is an auto generated log filtering Go binding around an Ethereum contract events.
type IETHPOSDepositFilterer struct {
	contract *bind.BoundContract // Generic contract wrapper for the low level calls
}
⋮----
// IETHPOSDepositSession is an auto generated Go binding around an Ethereum contract,
// with pre-set call and transact options.
type IETHPOSDepositSession struct {
	Contract     *IETHPOSDeposit   // 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
}
⋮----
Contract     *IETHPOSDeposit   // 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
⋮----
// IETHPOSDepositCallerSession is an auto generated read-only Go binding around an Ethereum contract,
// with pre-set call options.
type IETHPOSDepositCallerSession struct {
	Contract *IETHPOSDepositCaller // Generic contract caller binding to set the session for
	CallOpts bind.CallOpts         // Call options to use throughout this session
}
⋮----
Contract *IETHPOSDepositCaller // Generic contract caller binding to set the session for
CallOpts bind.CallOpts         // Call options to use throughout this session
⋮----
// IETHPOSDepositTransactorSession is an auto generated write-only Go binding around an Ethereum contract,
// with pre-set transact options.
type IETHPOSDepositTransactorSession struct {
	Contract     *IETHPOSDepositTransactor // Generic contract transactor binding to set the session for
	TransactOpts bind.TransactOpts         // Transaction auth options to use throughout this session
}
⋮----
Contract     *IETHPOSDepositTransactor // Generic contract transactor binding to set the session for
TransactOpts bind.TransactOpts         // Transaction auth options to use throughout this session
⋮----
// IETHPOSDepositRaw is an auto generated low-level Go binding around an Ethereum contract.
type IETHPOSDepositRaw struct {
	Contract *IETHPOSDeposit // Generic contract binding to access the raw methods on
}
⋮----
Contract *IETHPOSDeposit // Generic contract binding to access the raw methods on
⋮----
// IETHPOSDepositCallerRaw is an auto generated low-level read-only Go binding around an Ethereum contract.
type IETHPOSDepositCallerRaw struct {
	Contract *IETHPOSDepositCaller // Generic read-only contract binding to access the raw methods on
}
⋮----
Contract *IETHPOSDepositCaller // Generic read-only contract binding to access the raw methods on
⋮----
// IETHPOSDepositTransactorRaw is an auto generated low-level write-only Go binding around an Ethereum contract.
type IETHPOSDepositTransactorRaw struct {
	Contract *IETHPOSDepositTransactor // Generic write-only contract binding to access the raw methods on
}
⋮----
Contract *IETHPOSDepositTransactor // Generic write-only contract binding to access the raw methods on
⋮----
// NewIETHPOSDeposit creates a new instance of IETHPOSDeposit, bound to a specific deployed contract.
func NewIETHPOSDeposit(address common.Address, backend bind.ContractBackend) (*IETHPOSDeposit, error)
⋮----
// NewIETHPOSDepositCaller creates a new read-only instance of IETHPOSDeposit, bound to a specific deployed contract.
func NewIETHPOSDepositCaller(address common.Address, caller bind.ContractCaller) (*IETHPOSDepositCaller, error)
⋮----
// NewIETHPOSDepositTransactor creates a new write-only instance of IETHPOSDeposit, bound to a specific deployed contract.
func NewIETHPOSDepositTransactor(address common.Address, transactor bind.ContractTransactor) (*IETHPOSDepositTransactor, error)
⋮----
// NewIETHPOSDepositFilterer creates a new log filterer instance of IETHPOSDeposit, bound to a specific deployed contract.
func NewIETHPOSDepositFilterer(address common.Address, filterer bind.ContractFilterer) (*IETHPOSDepositFilterer, error)
⋮----
// bindIETHPOSDeposit binds a generic wrapper to an already deployed contract.
func bindIETHPOSDeposit(address common.Address, caller bind.ContractCaller, transactor bind.ContractTransactor, filterer bind.ContractFilterer) (*bind.BoundContract, error)
⋮----
// 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 (_IETHPOSDeposit *IETHPOSDepositRaw) Call(opts *bind.CallOpts, result *[]interface
⋮----
// Transfer initiates a plain transaction to move funds to the contract, calling
// its default method if one is available.
func (_IETHPOSDeposit *IETHPOSDepositRaw) Transfer(opts *bind.TransactOpts) (*types.Transaction, error)
⋮----
// Transact invokes the (paid) contract method with params as input values.
func (_IETHPOSDeposit *IETHPOSDepositRaw) Transact(opts *bind.TransactOpts, method string, params ...interface
⋮----
// GetDepositCount is a free data retrieval call binding the contract method 0x621fd130.
//
// Solidity: function get_deposit_count() view returns(bytes)
func (_IETHPOSDeposit *IETHPOSDepositCaller) GetDepositCount(opts *bind.CallOpts) ([]byte, error)
⋮----
var out []interface{}
⋮----
// GetDepositRoot is a free data retrieval call binding the contract method 0xc5f2892f.
⋮----
// Solidity: function get_deposit_root() view returns(bytes32)
func (_IETHPOSDeposit *IETHPOSDepositCaller) GetDepositRoot(opts *bind.CallOpts) ([32]byte, error)
⋮----
// Deposit is a paid mutator transaction binding the contract method 0x22895118.
⋮----
// Solidity: function deposit(bytes pubkey, bytes withdrawal_credentials, bytes signature, bytes32 deposit_data_root) payable returns()
func (_IETHPOSDeposit *IETHPOSDepositTransactor) Deposit(opts *bind.TransactOpts, pubkey []byte, withdrawal_credentials []byte, signature []byte, deposit_data_root [32]byte) (*types.Transaction, error)
⋮----
// IETHPOSDepositDepositEventIterator is returned from FilterDepositEvent and is used to iterate over the raw logs and unpacked data for DepositEvent events raised by the IETHPOSDeposit contract.
type IETHPOSDepositDepositEventIterator struct {
	Event *IETHPOSDepositDepositEvent // 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
}
⋮----
Event *IETHPOSDepositDepositEvent // 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 *IETHPOSDepositDepositEventIterator) Next() bool
⋮----
// If the iterator failed, stop iterating
⋮----
// If the iterator completed, deliver directly whatever's available
⋮----
// Iterator still in progress, wait for either a data or an error event
⋮----
// Error returns any retrieval or parsing error occurred during filtering.
func (it *IETHPOSDepositDepositEventIterator) Error() error
⋮----
// Close terminates the iteration process, releasing any pending underlying
// resources.
func (it *IETHPOSDepositDepositEventIterator) Close() error
⋮----
// IETHPOSDepositDepositEvent represents a DepositEvent event raised by the IETHPOSDeposit contract.
type IETHPOSDepositDepositEvent struct {
	Pubkey                []byte
	WithdrawalCredentials []byte
	Amount                []byte
	Signature             []byte
	Index                 []byte
	Raw                   types.Log // Blockchain specific contextual infos
}
⋮----
Raw                   types.Log // Blockchain specific contextual infos
⋮----
// FilterDepositEvent is a free log retrieval operation binding the contract event 0x649bbc62d0e31342afea4e5cd82d4049e7e1ee912fc0889aa790803be39038c5.
⋮----
// Solidity: event DepositEvent(bytes pubkey, bytes withdrawal_credentials, bytes amount, bytes signature, bytes index)
func (_IETHPOSDeposit *IETHPOSDepositFilterer) FilterDepositEvent(opts *bind.FilterOpts) (*IETHPOSDepositDepositEventIterator, error)
⋮----
// WatchDepositEvent is a free log subscription operation binding the contract event 0x649bbc62d0e31342afea4e5cd82d4049e7e1ee912fc0889aa790803be39038c5.
⋮----
func (_IETHPOSDeposit *IETHPOSDepositFilterer) WatchDepositEvent(opts *bind.WatchOpts, sink chan<- *IETHPOSDepositDepositEvent) (event.Subscription, error)
⋮----
// New log arrived, parse the event and forward to the user
⋮----
// ParseDepositEvent is a log parse operation binding the contract event 0x649bbc62d0e31342afea4e5cd82d4049e7e1ee912fc0889aa790803be39038c5.
⋮----
func (_IETHPOSDeposit *IETHPOSDepositFilterer) ParseDepositEvent(log types.Log) (*IETHPOSDepositDepositEvent, error)
````

## File: pkg/bindings/IKeyRegistrar/binding.go
````go
// Code generated - DO NOT EDIT.
// This file is a generated binding and any manual changes will be lost.
⋮----
package IKeyRegistrar
⋮----
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"
)
⋮----
"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
)
⋮----
// BN254G1Point is an auto generated low-level Go binding around an user-defined struct.
type BN254G1Point struct {
	X *big.Int
	Y *big.Int
}
⋮----
// BN254G2Point is an auto generated low-level Go binding around an user-defined struct.
type BN254G2Point struct {
	X [2]*big.Int
	Y [2]*big.Int
}
⋮----
// OperatorSet is an auto generated low-level Go binding around an user-defined struct.
type OperatorSet struct {
	Avs common.Address
	Id  uint32
}
⋮----
// IKeyRegistrarMetaData contains all meta data concerning the IKeyRegistrar contract.
var IKeyRegistrarMetaData = &bind.MetaData{
	ABI: "[{\"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\":\"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\":\"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\":\"pubkey\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"signature\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"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\":\"InvalidCurveType\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidKeyFormat\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidKeypair\",\"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\":\"ZeroAddress\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ZeroPubkey\",\"inputs\":[]}]",
}
⋮----
// IKeyRegistrarABI is the input ABI used to generate the binding from.
// Deprecated: Use IKeyRegistrarMetaData.ABI instead.
var IKeyRegistrarABI = IKeyRegistrarMetaData.ABI
⋮----
// IKeyRegistrar is an auto generated Go binding around an Ethereum contract.
type IKeyRegistrar struct {
	IKeyRegistrarCaller     // Read-only binding to the contract
	IKeyRegistrarTransactor // Write-only binding to the contract
	IKeyRegistrarFilterer   // Log filterer for contract events
}
⋮----
IKeyRegistrarCaller     // Read-only binding to the contract
IKeyRegistrarTransactor // Write-only binding to the contract
IKeyRegistrarFilterer   // Log filterer for contract events
⋮----
// IKeyRegistrarCaller is an auto generated read-only Go binding around an Ethereum contract.
type IKeyRegistrarCaller struct {
	contract *bind.BoundContract // Generic contract wrapper for the low level calls
}
⋮----
contract *bind.BoundContract // Generic contract wrapper for the low level calls
⋮----
// IKeyRegistrarTransactor is an auto generated write-only Go binding around an Ethereum contract.
type IKeyRegistrarTransactor struct {
	contract *bind.BoundContract // Generic contract wrapper for the low level calls
}
⋮----
// IKeyRegistrarFilterer is an auto generated log filtering Go binding around an Ethereum contract events.
type IKeyRegistrarFilterer struct {
	contract *bind.BoundContract // Generic contract wrapper for the low level calls
}
⋮----
// IKeyRegistrarSession is an auto generated Go binding around an Ethereum contract,
// with pre-set call and transact options.
type IKeyRegistrarSession struct {
	Contract     *IKeyRegistrar    // 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
}
⋮----
Contract     *IKeyRegistrar    // 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
⋮----
// IKeyRegistrarCallerSession is an auto generated read-only Go binding around an Ethereum contract,
// with pre-set call options.
type IKeyRegistrarCallerSession struct {
	Contract *IKeyRegistrarCaller // Generic contract caller binding to set the session for
	CallOpts bind.CallOpts        // Call options to use throughout this session
}
⋮----
Contract *IKeyRegistrarCaller // Generic contract caller binding to set the session for
CallOpts bind.CallOpts        // Call options to use throughout this session
⋮----
// IKeyRegistrarTransactorSession is an auto generated write-only Go binding around an Ethereum contract,
// with pre-set transact options.
type IKeyRegistrarTransactorSession struct {
	Contract     *IKeyRegistrarTransactor // Generic contract transactor binding to set the session for
	TransactOpts bind.TransactOpts        // Transaction auth options to use throughout this session
}
⋮----
Contract     *IKeyRegistrarTransactor // Generic contract transactor binding to set the session for
TransactOpts bind.TransactOpts        // Transaction auth options to use throughout this session
⋮----
// IKeyRegistrarRaw is an auto generated low-level Go binding around an Ethereum contract.
type IKeyRegistrarRaw struct {
	Contract *IKeyRegistrar // Generic contract binding to access the raw methods on
}
⋮----
Contract *IKeyRegistrar // Generic contract binding to access the raw methods on
⋮----
// IKeyRegistrarCallerRaw is an auto generated low-level read-only Go binding around an Ethereum contract.
type IKeyRegistrarCallerRaw struct {
	Contract *IKeyRegistrarCaller // Generic read-only contract binding to access the raw methods on
}
⋮----
Contract *IKeyRegistrarCaller // Generic read-only contract binding to access the raw methods on
⋮----
// IKeyRegistrarTransactorRaw is an auto generated low-level write-only Go binding around an Ethereum contract.
type IKeyRegistrarTransactorRaw struct {
	Contract *IKeyRegistrarTransactor // Generic write-only contract binding to access the raw methods on
}
⋮----
Contract *IKeyRegistrarTransactor // Generic write-only contract binding to access the raw methods on
⋮----
// NewIKeyRegistrar creates a new instance of IKeyRegistrar, bound to a specific deployed contract.
func NewIKeyRegistrar(address common.Address, backend bind.ContractBackend) (*IKeyRegistrar, error)
⋮----
// NewIKeyRegistrarCaller creates a new read-only instance of IKeyRegistrar, bound to a specific deployed contract.
func NewIKeyRegistrarCaller(address common.Address, caller bind.ContractCaller) (*IKeyRegistrarCaller, error)
⋮----
// NewIKeyRegistrarTransactor creates a new write-only instance of IKeyRegistrar, bound to a specific deployed contract.
func NewIKeyRegistrarTransactor(address common.Address, transactor bind.ContractTransactor) (*IKeyRegistrarTransactor, error)
⋮----
// NewIKeyRegistrarFilterer creates a new log filterer instance of IKeyRegistrar, bound to a specific deployed contract.
func NewIKeyRegistrarFilterer(address common.Address, filterer bind.ContractFilterer) (*IKeyRegistrarFilterer, error)
⋮----
// bindIKeyRegistrar binds a generic wrapper to an already deployed contract.
func bindIKeyRegistrar(address common.Address, caller bind.ContractCaller, transactor bind.ContractTransactor, filterer bind.ContractFilterer) (*bind.BoundContract, error)
⋮----
// 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 (_IKeyRegistrar *IKeyRegistrarRaw) Call(opts *bind.CallOpts, result *[]interface
⋮----
// Transfer initiates a plain transaction to move funds to the contract, calling
// its default method if one is available.
func (_IKeyRegistrar *IKeyRegistrarRaw) Transfer(opts *bind.TransactOpts) (*types.Transaction, error)
⋮----
// Transact invokes the (paid) contract method with params as input values.
func (_IKeyRegistrar *IKeyRegistrarRaw) Transact(opts *bind.TransactOpts, method string, params ...interface
⋮----
// EncodeBN254KeyData is a free data retrieval call binding the contract method 0x50435add.
//
// Solidity: function encodeBN254KeyData((uint256,uint256) g1Point, (uint256[2],uint256[2]) g2Point) pure returns(bytes)
func (_IKeyRegistrar *IKeyRegistrarCaller) EncodeBN254KeyData(opts *bind.CallOpts, g1Point BN254G1Point, g2Point BN254G2Point) ([]byte, error)
⋮----
var out []interface{}
⋮----
// GetBN254Key is a free data retrieval call binding the contract method 0x9a43e3fb.
⋮----
// Solidity: function getBN254Key((address,uint32) operatorSet, address operator) view returns((uint256,uint256) g1Point, (uint256[2],uint256[2]) g2Point)
func (_IKeyRegistrar *IKeyRegistrarCaller) GetBN254Key(opts *bind.CallOpts, operatorSet OperatorSet, operator common.Address) (struct
⋮----
// GetBN254KeyRegistrationMessageHash is a free data retrieval call binding the contract method 0x7690e395.
⋮----
// Solidity: function getBN254KeyRegistrationMessageHash(address operator, (address,uint32) operatorSet, bytes keyData) view returns(bytes32)
func (_IKeyRegistrar *IKeyRegistrarCaller) GetBN254KeyRegistrationMessageHash(opts *bind.CallOpts, operator common.Address, operatorSet OperatorSet, keyData []byte) ([32]byte, error)
⋮----
// GetECDSAAddress is a free data retrieval call binding the contract method 0x3b32a7bd.
⋮----
// Solidity: function getECDSAAddress((address,uint32) operatorSet, address operator) view returns(address)
func (_IKeyRegistrar *IKeyRegistrarCaller) GetECDSAAddress(opts *bind.CallOpts, operatorSet OperatorSet, operator common.Address) (common.Address, error)
⋮----
// GetECDSAKey is a free data retrieval call binding the contract method 0xaa165c30.
⋮----
// Solidity: function getECDSAKey((address,uint32) operatorSet, address operator) view returns(bytes)
func (_IKeyRegistrar *IKeyRegistrarCaller) GetECDSAKey(opts *bind.CallOpts, operatorSet OperatorSet, operator common.Address) ([]byte, error)
⋮----
// GetECDSAKeyRegistrationMessageHash is a free data retrieval call binding the contract method 0xd9f12db2.
⋮----
// Solidity: function getECDSAKeyRegistrationMessageHash(address operator, (address,uint32) operatorSet, address keyAddress) view returns(bytes32)
func (_IKeyRegistrar *IKeyRegistrarCaller) GetECDSAKeyRegistrationMessageHash(opts *bind.CallOpts, operator common.Address, operatorSet OperatorSet, keyAddress common.Address) ([32]byte, error)
⋮----
// GetKeyHash is a free data retrieval call binding the contract method 0xea194e2e.
⋮----
// Solidity: function getKeyHash((address,uint32) operatorSet, address operator) view returns(bytes32)
func (_IKeyRegistrar *IKeyRegistrarCaller) GetKeyHash(opts *bind.CallOpts, operatorSet OperatorSet, operator common.Address) ([32]byte, error)
⋮----
// GetOperatorFromSigningKey is a free data retrieval call binding the contract method 0x8256909c.
⋮----
// Solidity: function getOperatorFromSigningKey((address,uint32) operatorSet, bytes keyData) view returns(address, bool)
func (_IKeyRegistrar *IKeyRegistrarCaller) GetOperatorFromSigningKey(opts *bind.CallOpts, operatorSet OperatorSet, keyData []byte) (common.Address, bool, error)
⋮----
// GetOperatorSetCurveType is a free data retrieval call binding the contract method 0x7cffe48c.
⋮----
// Solidity: function getOperatorSetCurveType((address,uint32) operatorSet) view returns(uint8)
func (_IKeyRegistrar *IKeyRegistrarCaller) GetOperatorSetCurveType(opts *bind.CallOpts, operatorSet OperatorSet) (uint8, error)
⋮----
// IsKeyGloballyRegistered is a free data retrieval call binding the contract method 0xdab42d7e.
⋮----
// Solidity: function isKeyGloballyRegistered(bytes32 keyHash) view returns(bool)
func (_IKeyRegistrar *IKeyRegistrarCaller) IsKeyGloballyRegistered(opts *bind.CallOpts, keyHash [32]byte) (bool, error)
⋮----
// IsRegistered is a free data retrieval call binding the contract method 0xbd30a0b9.
⋮----
// Solidity: function isRegistered((address,uint32) operatorSet, address operator) view returns(bool)
func (_IKeyRegistrar *IKeyRegistrarCaller) IsRegistered(opts *bind.CallOpts, operatorSet OperatorSet, operator common.Address) (bool, error)
⋮----
// ConfigureOperatorSet is a paid mutator transaction binding the contract method 0xea0d8149.
⋮----
// Solidity: function configureOperatorSet((address,uint32) operatorSet, uint8 curveType) returns()
func (_IKeyRegistrar *IKeyRegistrarTransactor) ConfigureOperatorSet(opts *bind.TransactOpts, operatorSet OperatorSet, curveType uint8) (*types.Transaction, error)
⋮----
// DeregisterKey is a paid mutator transaction binding the contract method 0x87ab86f4.
⋮----
// Solidity: function deregisterKey(address operator, (address,uint32) operatorSet) returns()
func (_IKeyRegistrar *IKeyRegistrarTransactor) DeregisterKey(opts *bind.TransactOpts, operator common.Address, operatorSet OperatorSet) (*types.Transaction, error)
⋮----
// RegisterKey is a paid mutator transaction binding the contract method 0xd40cda16.
⋮----
// Solidity: function registerKey(address operator, (address,uint32) operatorSet, bytes pubkey, bytes signature) returns()
func (_IKeyRegistrar *IKeyRegistrarTransactor) RegisterKey(opts *bind.TransactOpts, operator common.Address, operatorSet OperatorSet, pubkey []byte, signature []byte) (*types.Transaction, error)
⋮----
// IKeyRegistrarAggregateBN254KeyUpdatedIterator is returned from FilterAggregateBN254KeyUpdated and is used to iterate over the raw logs and unpacked data for AggregateBN254KeyUpdated events raised by the IKeyRegistrar contract.
type IKeyRegistrarAggregateBN254KeyUpdatedIterator struct {
	Event *IKeyRegistrarAggregateBN254KeyUpdated // 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
}
⋮----
Event *IKeyRegistrarAggregateBN254KeyUpdated // 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 *IKeyRegistrarAggregateBN254KeyUpdatedIterator) Next() bool
⋮----
// If the iterator failed, stop iterating
⋮----
// If the iterator completed, deliver directly whatever's available
⋮----
// Iterator still in progress, wait for either a data or an error event
⋮----
// Error returns any retrieval or parsing error occurred during filtering.
func (it *IKeyRegistrarAggregateBN254KeyUpdatedIterator) Error() error
⋮----
// Close terminates the iteration process, releasing any pending underlying
// resources.
func (it *IKeyRegistrarAggregateBN254KeyUpdatedIterator) Close() error
⋮----
// IKeyRegistrarAggregateBN254KeyUpdated represents a AggregateBN254KeyUpdated event raised by the IKeyRegistrar contract.
type IKeyRegistrarAggregateBN254KeyUpdated struct {
	OperatorSet     OperatorSet
	NewAggregateKey BN254G1Point
	Raw             types.Log // Blockchain specific contextual infos
}
⋮----
Raw             types.Log // Blockchain specific contextual infos
⋮----
// FilterAggregateBN254KeyUpdated is a free log retrieval operation binding the contract event 0xdfa2f59e55747ba641fbdff4eb78577de8789d605920d5be4a74ee3a6470d1d1.
⋮----
// Solidity: event AggregateBN254KeyUpdated((address,uint32) operatorSet, (uint256,uint256) newAggregateKey)
func (_IKeyRegistrar *IKeyRegistrarFilterer) FilterAggregateBN254KeyUpdated(opts *bind.FilterOpts) (*IKeyRegistrarAggregateBN254KeyUpdatedIterator, error)
⋮----
// WatchAggregateBN254KeyUpdated is a free log subscription operation binding the contract event 0xdfa2f59e55747ba641fbdff4eb78577de8789d605920d5be4a74ee3a6470d1d1.
⋮----
func (_IKeyRegistrar *IKeyRegistrarFilterer) WatchAggregateBN254KeyUpdated(opts *bind.WatchOpts, sink chan<- *IKeyRegistrarAggregateBN254KeyUpdated) (event.Subscription, error)
⋮----
// New log arrived, parse the event and forward to the user
⋮----
// ParseAggregateBN254KeyUpdated is a log parse operation binding the contract event 0xdfa2f59e55747ba641fbdff4eb78577de8789d605920d5be4a74ee3a6470d1d1.
⋮----
func (_IKeyRegistrar *IKeyRegistrarFilterer) ParseAggregateBN254KeyUpdated(log types.Log) (*IKeyRegistrarAggregateBN254KeyUpdated, error)
⋮----
// IKeyRegistrarKeyDeregisteredIterator is returned from FilterKeyDeregistered and is used to iterate over the raw logs and unpacked data for KeyDeregistered events raised by the IKeyRegistrar contract.
type IKeyRegistrarKeyDeregisteredIterator struct {
	Event *IKeyRegistrarKeyDeregistered // 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
}
⋮----
Event *IKeyRegistrarKeyDeregistered // Event containing the contract specifics and raw log
⋮----
// IKeyRegistrarKeyDeregistered represents a KeyDeregistered event raised by the IKeyRegistrar contract.
type IKeyRegistrarKeyDeregistered struct {
	OperatorSet OperatorSet
	Operator    common.Address
	CurveType   uint8
	Raw         types.Log // Blockchain specific contextual infos
}
⋮----
Raw         types.Log // Blockchain specific contextual infos
⋮----
// FilterKeyDeregistered is a free log retrieval operation binding the contract event 0x28d3c3cee49478ec6fd219cfd685cd15cd01d95cabf69b4b7b57f9eaa3eb6442.
⋮----
// Solidity: event KeyDeregistered((address,uint32) operatorSet, address indexed operator, uint8 curveType)
func (_IKeyRegistrar *IKeyRegistrarFilterer) FilterKeyDeregistered(opts *bind.FilterOpts, operator []common.Address) (*IKeyRegistrarKeyDeregisteredIterator, error)
⋮----
var operatorRule []interface{}
⋮----
// WatchKeyDeregistered is a free log subscription operation binding the contract event 0x28d3c3cee49478ec6fd219cfd685cd15cd01d95cabf69b4b7b57f9eaa3eb6442.
⋮----
func (_IKeyRegistrar *IKeyRegistrarFilterer) WatchKeyDeregistered(opts *bind.WatchOpts, sink chan<- *IKeyRegistrarKeyDeregistered, operator []common.Address) (event.Subscription, error)
⋮----
// ParseKeyDeregistered is a log parse operation binding the contract event 0x28d3c3cee49478ec6fd219cfd685cd15cd01d95cabf69b4b7b57f9eaa3eb6442.
⋮----
func (_IKeyRegistrar *IKeyRegistrarFilterer) ParseKeyDeregistered(log types.Log) (*IKeyRegistrarKeyDeregistered, error)
⋮----
// IKeyRegistrarKeyRegisteredIterator is returned from FilterKeyRegistered and is used to iterate over the raw logs and unpacked data for KeyRegistered events raised by the IKeyRegistrar contract.
type IKeyRegistrarKeyRegisteredIterator struct {
	Event *IKeyRegistrarKeyRegistered // 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
}
⋮----
Event *IKeyRegistrarKeyRegistered // Event containing the contract specifics and raw log
⋮----
// IKeyRegistrarKeyRegistered represents a KeyRegistered event raised by the IKeyRegistrar contract.
type IKeyRegistrarKeyRegistered struct {
	OperatorSet OperatorSet
	Operator    common.Address
	CurveType   uint8
	Pubkey      []byte
	Raw         types.Log // Blockchain specific contextual infos
}
⋮----
// FilterKeyRegistered is a free log retrieval operation binding the contract event 0x1201ce0c5e577111bce91e907fd99cb183da5edc1e3fb650ca40769e4e9176dd.
⋮----
// Solidity: event KeyRegistered((address,uint32) operatorSet, address indexed operator, uint8 curveType, bytes pubkey)
func (_IKeyRegistrar *IKeyRegistrarFilterer) FilterKeyRegistered(opts *bind.FilterOpts, operator []common.Address) (*IKeyRegistrarKeyRegisteredIterator, error)
⋮----
// WatchKeyRegistered is a free log subscription operation binding the contract event 0x1201ce0c5e577111bce91e907fd99cb183da5edc1e3fb650ca40769e4e9176dd.
⋮----
func (_IKeyRegistrar *IKeyRegistrarFilterer) WatchKeyRegistered(opts *bind.WatchOpts, sink chan<- *IKeyRegistrarKeyRegistered, operator []common.Address) (event.Subscription, error)
⋮----
// ParseKeyRegistered is a log parse operation binding the contract event 0x1201ce0c5e577111bce91e907fd99cb183da5edc1e3fb650ca40769e4e9176dd.
⋮----
func (_IKeyRegistrar *IKeyRegistrarFilterer) ParseKeyRegistered(log types.Log) (*IKeyRegistrarKeyRegistered, error)
⋮----
// IKeyRegistrarOperatorSetConfiguredIterator is returned from FilterOperatorSetConfigured and is used to iterate over the raw logs and unpacked data for OperatorSetConfigured events raised by the IKeyRegistrar contract.
type IKeyRegistrarOperatorSetConfiguredIterator struct {
	Event *IKeyRegistrarOperatorSetConfigured // 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
}
⋮----
Event *IKeyRegistrarOperatorSetConfigured // Event containing the contract specifics and raw log
⋮----
// IKeyRegistrarOperatorSetConfigured represents a OperatorSetConfigured event raised by the IKeyRegistrar contract.
type IKeyRegistrarOperatorSetConfigured struct {
	OperatorSet OperatorSet
	CurveType   uint8
	Raw         types.Log // Blockchain specific contextual infos
}
⋮----
// FilterOperatorSetConfigured is a free log retrieval operation binding the contract event 0xb2266cb118e57095fcdbedb24dabd9fc9f5127e2dbedf62ce6ee71696fb8b6e7.
⋮----
// Solidity: event OperatorSetConfigured((address,uint32) operatorSet, uint8 curveType)
func (_IKeyRegistrar *IKeyRegistrarFilterer) FilterOperatorSetConfigured(opts *bind.FilterOpts) (*IKeyRegistrarOperatorSetConfiguredIterator, error)
⋮----
// WatchOperatorSetConfigured is a free log subscription operation binding the contract event 0xb2266cb118e57095fcdbedb24dabd9fc9f5127e2dbedf62ce6ee71696fb8b6e7.
⋮----
func (_IKeyRegistrar *IKeyRegistrarFilterer) WatchOperatorSetConfigured(opts *bind.WatchOpts, sink chan<- *IKeyRegistrarOperatorSetConfigured) (event.Subscription, error)
⋮----
// ParseOperatorSetConfigured is a log parse operation binding the contract event 0xb2266cb118e57095fcdbedb24dabd9fc9f5127e2dbedf62ce6ee71696fb8b6e7.
⋮----
func (_IKeyRegistrar *IKeyRegistrarFilterer) ParseOperatorSetConfigured(log types.Log) (*IKeyRegistrarOperatorSetConfigured, error)
````

## File: pkg/bindings/IOperatorTableCalculator/binding.go
````go
// Code generated - DO NOT EDIT.
// This file is a generated binding and any manual changes will be lost.
⋮----
package IOperatorTableCalculator
⋮----
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"
)
⋮----
"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
)
⋮----
// OperatorSet is an auto generated low-level Go binding around an user-defined struct.
type OperatorSet struct {
	Avs common.Address
	Id  uint32
}
⋮----
// IOperatorTableCalculatorMetaData contains all meta data concerning the IOperatorTableCalculator contract.
var IOperatorTableCalculatorMetaData = &bind.MetaData{
	ABI: "[{\"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\":\"operatorTableBytes\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getOperatorSetWeights\",\"inputs\":[{\"name\":\"operatorSet\",\"type\":\"tuple\",\"internalType\":\"structOperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]}],\"outputs\":[{\"name\":\"operators\",\"type\":\"address[]\",\"internalType\":\"address[]\"},{\"name\":\"weights\",\"type\":\"uint256[][]\",\"internalType\":\"uint256[][]\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getOperatorWeights\",\"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\":\"weights\",\"type\":\"uint256[]\",\"internalType\":\"uint256[]\"}],\"stateMutability\":\"view\"}]",
}
⋮----
// IOperatorTableCalculatorABI is the input ABI used to generate the binding from.
// Deprecated: Use IOperatorTableCalculatorMetaData.ABI instead.
var IOperatorTableCalculatorABI = IOperatorTableCalculatorMetaData.ABI
⋮----
// IOperatorTableCalculator is an auto generated Go binding around an Ethereum contract.
type IOperatorTableCalculator struct {
	IOperatorTableCalculatorCaller     // Read-only binding to the contract
	IOperatorTableCalculatorTransactor // Write-only binding to the contract
	IOperatorTableCalculatorFilterer   // Log filterer for contract events
}
⋮----
IOperatorTableCalculatorCaller     // Read-only binding to the contract
IOperatorTableCalculatorTransactor // Write-only binding to the contract
IOperatorTableCalculatorFilterer   // Log filterer for contract events
⋮----
// IOperatorTableCalculatorCaller is an auto generated read-only Go binding around an Ethereum contract.
type IOperatorTableCalculatorCaller struct {
	contract *bind.BoundContract // Generic contract wrapper for the low level calls
}
⋮----
contract *bind.BoundContract // Generic contract wrapper for the low level calls
⋮----
// IOperatorTableCalculatorTransactor is an auto generated write-only Go binding around an Ethereum contract.
type IOperatorTableCalculatorTransactor struct {
	contract *bind.BoundContract // Generic contract wrapper for the low level calls
}
⋮----
// IOperatorTableCalculatorFilterer is an auto generated log filtering Go binding around an Ethereum contract events.
type IOperatorTableCalculatorFilterer struct {
	contract *bind.BoundContract // Generic contract wrapper for the low level calls
}
⋮----
// IOperatorTableCalculatorSession is an auto generated Go binding around an Ethereum contract,
// with pre-set call and transact options.
type IOperatorTableCalculatorSession struct {
	Contract     *IOperatorTableCalculator // 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
}
⋮----
Contract     *IOperatorTableCalculator // 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
⋮----
// IOperatorTableCalculatorCallerSession is an auto generated read-only Go binding around an Ethereum contract,
// with pre-set call options.
type IOperatorTableCalculatorCallerSession struct {
	Contract *IOperatorTableCalculatorCaller // Generic contract caller binding to set the session for
	CallOpts bind.CallOpts                   // Call options to use throughout this session
}
⋮----
Contract *IOperatorTableCalculatorCaller // Generic contract caller binding to set the session for
CallOpts bind.CallOpts                   // Call options to use throughout this session
⋮----
// IOperatorTableCalculatorTransactorSession is an auto generated write-only Go binding around an Ethereum contract,
// with pre-set transact options.
type IOperatorTableCalculatorTransactorSession struct {
	Contract     *IOperatorTableCalculatorTransactor // Generic contract transactor binding to set the session for
	TransactOpts bind.TransactOpts                   // Transaction auth options to use throughout this session
}
⋮----
Contract     *IOperatorTableCalculatorTransactor // Generic contract transactor binding to set the session for
TransactOpts bind.TransactOpts                   // Transaction auth options to use throughout this session
⋮----
// IOperatorTableCalculatorRaw is an auto generated low-level Go binding around an Ethereum contract.
type IOperatorTableCalculatorRaw struct {
	Contract *IOperatorTableCalculator // Generic contract binding to access the raw methods on
}
⋮----
Contract *IOperatorTableCalculator // Generic contract binding to access the raw methods on
⋮----
// IOperatorTableCalculatorCallerRaw is an auto generated low-level read-only Go binding around an Ethereum contract.
type IOperatorTableCalculatorCallerRaw struct {
	Contract *IOperatorTableCalculatorCaller // Generic read-only contract binding to access the raw methods on
}
⋮----
Contract *IOperatorTableCalculatorCaller // Generic read-only contract binding to access the raw methods on
⋮----
// IOperatorTableCalculatorTransactorRaw is an auto generated low-level write-only Go binding around an Ethereum contract.
type IOperatorTableCalculatorTransactorRaw struct {
	Contract *IOperatorTableCalculatorTransactor // Generic write-only contract binding to access the raw methods on
}
⋮----
Contract *IOperatorTableCalculatorTransactor // Generic write-only contract binding to access the raw methods on
⋮----
// NewIOperatorTableCalculator creates a new instance of IOperatorTableCalculator, bound to a specific deployed contract.
func NewIOperatorTableCalculator(address common.Address, backend bind.ContractBackend) (*IOperatorTableCalculator, error)
⋮----
// NewIOperatorTableCalculatorCaller creates a new read-only instance of IOperatorTableCalculator, bound to a specific deployed contract.
func NewIOperatorTableCalculatorCaller(address common.Address, caller bind.ContractCaller) (*IOperatorTableCalculatorCaller, error)
⋮----
// NewIOperatorTableCalculatorTransactor creates a new write-only instance of IOperatorTableCalculator, bound to a specific deployed contract.
func NewIOperatorTableCalculatorTransactor(address common.Address, transactor bind.ContractTransactor) (*IOperatorTableCalculatorTransactor, error)
⋮----
// NewIOperatorTableCalculatorFilterer creates a new log filterer instance of IOperatorTableCalculator, bound to a specific deployed contract.
func NewIOperatorTableCalculatorFilterer(address common.Address, filterer bind.ContractFilterer) (*IOperatorTableCalculatorFilterer, error)
⋮----
// bindIOperatorTableCalculator binds a generic wrapper to an already deployed contract.
func bindIOperatorTableCalculator(address common.Address, caller bind.ContractCaller, transactor bind.ContractTransactor, filterer bind.ContractFilterer) (*bind.BoundContract, error)
⋮----
// 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 (_IOperatorTableCalculator *IOperatorTableCalculatorRaw) Call(opts *bind.CallOpts, result *[]interface
⋮----
// Transfer initiates a plain transaction to move funds to the contract, calling
// its default method if one is available.
func (_IOperatorTableCalculator *IOperatorTableCalculatorRaw) Transfer(opts *bind.TransactOpts) (*types.Transaction, error)
⋮----
// Transact invokes the (paid) contract method with params as input values.
func (_IOperatorTableCalculator *IOperatorTableCalculatorRaw) Transact(opts *bind.TransactOpts, method string, params ...interface
⋮----
// CalculateOperatorTableBytes is a free data retrieval call binding the contract method 0x41ee6d0e.
//
// Solidity: function calculateOperatorTableBytes((address,uint32) operatorSet) view returns(bytes operatorTableBytes)
func (_IOperatorTableCalculator *IOperatorTableCalculatorCaller) CalculateOperatorTableBytes(opts *bind.CallOpts, operatorSet OperatorSet) ([]byte, error)
⋮----
var out []interface{}
⋮----
// GetOperatorSetWeights is a free data retrieval call binding the contract method 0xbff2de25.
⋮----
// Solidity: function getOperatorSetWeights((address,uint32) operatorSet) view returns(address[] operators, uint256[][] weights)
func (_IOperatorTableCalculator *IOperatorTableCalculatorCaller) GetOperatorSetWeights(opts *bind.CallOpts, operatorSet OperatorSet) (struct
⋮----
// GetOperatorWeights is a free data retrieval call binding the contract method 0xbdf3ad27.
⋮----
// Solidity: function getOperatorWeights((address,uint32) operatorSet, address operator) view returns(uint256[] weights)
func (_IOperatorTableCalculator *IOperatorTableCalculatorCaller) GetOperatorWeights(opts *bind.CallOpts, operatorSet OperatorSet, operator common.Address) ([]*big.Int, error)
````

## File: pkg/bindings/IOperatorTableUpdater/binding.go
````go
// Code generated - DO NOT EDIT.
// This file is a generated binding and any manual changes will be lost.
⋮----
package IOperatorTableUpdater
⋮----
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"
)
⋮----
"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
)
⋮----
// BN254G1Point is an auto generated low-level Go binding around an user-defined struct.
type BN254G1Point struct {
	X *big.Int
	Y *big.Int
}
⋮----
// BN254G2Point is an auto generated low-level Go binding around an user-defined struct.
type BN254G2Point struct {
	X [2]*big.Int
	Y [2]*big.Int
}
⋮----
// IBN254CertificateVerifierTypesBN254Certificate is an auto generated low-level Go binding around an user-defined struct.
type IBN254CertificateVerifierTypesBN254Certificate struct {
	ReferenceTimestamp uint32
	MessageHash        [32]byte
	Signature          BN254G1Point
	Apk                BN254G2Point
	NonSignerWitnesses []IBN254CertificateVerifierTypesBN254OperatorInfoWitness
}
⋮----
// IBN254CertificateVerifierTypesBN254OperatorInfoWitness is an auto generated low-level Go binding around an user-defined struct.
type IBN254CertificateVerifierTypesBN254OperatorInfoWitness struct {
	OperatorIndex     uint32
	OperatorInfoProof []byte
	OperatorInfo      IOperatorTableCalculatorTypesBN254OperatorInfo
}
⋮----
// ICrossChainRegistryTypesOperatorSetConfig is an auto generated low-level Go binding around an user-defined struct.
type ICrossChainRegistryTypesOperatorSetConfig struct {
	Owner              common.Address
	MaxStalenessPeriod uint32
}
⋮----
// IOperatorTableCalculatorTypesBN254OperatorInfo is an auto generated low-level Go binding around an user-defined struct.
type IOperatorTableCalculatorTypesBN254OperatorInfo struct {
	Pubkey  BN254G1Point
	Weights []*big.Int
}
⋮----
// IOperatorTableCalculatorTypesBN254OperatorSetInfo is an auto generated low-level Go binding around an user-defined struct.
type IOperatorTableCalculatorTypesBN254OperatorSetInfo struct {
	OperatorInfoTreeRoot [32]byte
	NumOperators         *big.Int
	AggregatePubkey      BN254G1Point
	TotalWeights         []*big.Int
}
⋮----
// OperatorSet is an auto generated low-level Go binding around an user-defined struct.
type OperatorSet struct {
	Avs common.Address
	Id  uint32
}
⋮----
// IOperatorTableUpdaterMetaData contains all meta data concerning the IOperatorTableUpdater contract.
var IOperatorTableUpdaterMetaData = &bind.MetaData{
	ABI: "[{\"type\":\"function\",\"name\":\"confirmGlobalTableRoot\",\"inputs\":[{\"name\":\"globalTableRootCert\",\"type\":\"tuple\",\"internalType\":\"structIBN254CertificateVerifierTypes.BN254Certificate\",\"components\":[{\"name\":\"referenceTimestamp\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"messageHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"signature\",\"type\":\"tuple\",\"internalType\":\"structBN254.G1Point\",\"components\":[{\"name\":\"X\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"Y\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]},{\"name\":\"apk\",\"type\":\"tuple\",\"internalType\":\"structBN254.G2Point\",\"components\":[{\"name\":\"X\",\"type\":\"uint256[2]\",\"internalType\":\"uint256[2]\"},{\"name\":\"Y\",\"type\":\"uint256[2]\",\"internalType\":\"uint256[2]\"}]},{\"name\":\"nonSignerWitnesses\",\"type\":\"tuple[]\",\"internalType\":\"structIBN254CertificateVerifierTypes.BN254OperatorInfoWitness[]\",\"components\":[{\"name\":\"operatorIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"operatorInfoProof\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"operatorInfo\",\"type\":\"tuple\",\"internalType\":\"structIOperatorTableCalculatorTypes.BN254OperatorInfo\",\"components\":[{\"name\":\"pubkey\",\"type\":\"tuple\",\"internalType\":\"structBN254.G1Point\",\"components\":[{\"name\":\"X\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"Y\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]},{\"name\":\"weights\",\"type\":\"uint256[]\",\"internalType\":\"uint256[]\"}]}]}]},{\"name\":\"globalTableRoot\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"referenceTimestamp\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"referenceBlockNumber\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"disableRoot\",\"inputs\":[{\"name\":\"globalTableRoot\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"getCertificateVerifier\",\"inputs\":[{\"name\":\"curveType\",\"type\":\"uint8\",\"internalType\":\"enumIKeyRegistrarTypes.CurveType\"}],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getCurrentGlobalTableRoot\",\"inputs\":[],\"outputs\":[{\"name\":\"globalTableRoot\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getGenerator\",\"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\":\"getGeneratorConfig\",\"inputs\":[],\"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\":\"getGeneratorReferenceTimestamp\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getGlobalTableRootByTimestamp\",\"inputs\":[{\"name\":\"referenceTimestamp\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"outputs\":[{\"name\":\"tableRoot\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getGlobalTableUpdateMessageHash\",\"inputs\":[{\"name\":\"globalTableRoot\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"referenceTimestamp\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"referenceBlockNumber\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getGlobalTableUpdateSignableDigest\",\"inputs\":[{\"name\":\"globalTableRoot\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"referenceTimestamp\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"referenceBlockNumber\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getLatestReferenceBlockNumber\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getLatestReferenceTimestamp\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getReferenceBlockNumberByTimestamp\",\"inputs\":[{\"name\":\"referenceTimestamp\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getReferenceTimestampByBlockNumber\",\"inputs\":[{\"name\":\"referenceBlockNumber\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"isRootValid\",\"inputs\":[{\"name\":\"globalTableRoot\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"isRootValidByTimestamp\",\"inputs\":[{\"name\":\"referenceTimestamp\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"setGlobalRootConfirmationThreshold\",\"inputs\":[{\"name\":\"bps\",\"type\":\"uint16\",\"internalType\":\"uint16\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"updateGenerator\",\"inputs\":[{\"name\":\"generator\",\"type\":\"tuple\",\"internalType\":\"structOperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]},{\"name\":\"generatorInfo\",\"type\":\"tuple\",\"internalType\":\"structIOperatorTableCalculatorTypes.BN254OperatorSetInfo\",\"components\":[{\"name\":\"operatorInfoTreeRoot\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"numOperators\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"aggregatePubkey\",\"type\":\"tuple\",\"internalType\":\"structBN254.G1Point\",\"components\":[{\"name\":\"X\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"Y\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]},{\"name\":\"totalWeights\",\"type\":\"uint256[]\",\"internalType\":\"uint256[]\"}]}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"updateOperatorTable\",\"inputs\":[{\"name\":\"referenceTimestamp\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"globalTableRoot\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"operatorSetIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"proof\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"operatorTableBytes\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"event\",\"name\":\"GeneratorUpdated\",\"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\":\"GlobalRootConfirmationThresholdUpdated\",\"inputs\":[{\"name\":\"bps\",\"type\":\"uint16\",\"indexed\":false,\"internalType\":\"uint16\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"GlobalRootDisabled\",\"inputs\":[{\"name\":\"globalTableRoot\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"NewGlobalTableRoot\",\"inputs\":[{\"name\":\"referenceTimestamp\",\"type\":\"uint32\",\"indexed\":true,\"internalType\":\"uint32\"},{\"name\":\"globalTableRoot\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"}],\"anonymous\":false},{\"type\":\"error\",\"name\":\"CannotDisableGeneratorRoot\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"CertificateInvalid\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"GlobalTableRootInFuture\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"GlobalTableRootStale\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidConfirmationThreshold\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidCurveType\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidGenerator\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidGlobalTableRoot\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidMessageHash\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidOperatorSet\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidOperatorSetProof\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidRoot\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"TableUpdateForPastTimestamp\",\"inputs\":[]}]",
}
⋮----
// IOperatorTableUpdaterABI is the input ABI used to generate the binding from.
// Deprecated: Use IOperatorTableUpdaterMetaData.ABI instead.
var IOperatorTableUpdaterABI = IOperatorTableUpdaterMetaData.ABI
⋮----
// IOperatorTableUpdater is an auto generated Go binding around an Ethereum contract.
type IOperatorTableUpdater struct {
	IOperatorTableUpdaterCaller     // Read-only binding to the contract
	IOperatorTableUpdaterTransactor // Write-only binding to the contract
	IOperatorTableUpdaterFilterer   // Log filterer for contract events
}
⋮----
IOperatorTableUpdaterCaller     // Read-only binding to the contract
IOperatorTableUpdaterTransactor // Write-only binding to the contract
IOperatorTableUpdaterFilterer   // Log filterer for contract events
⋮----
// IOperatorTableUpdaterCaller is an auto generated read-only Go binding around an Ethereum contract.
type IOperatorTableUpdaterCaller struct {
	contract *bind.BoundContract // Generic contract wrapper for the low level calls
}
⋮----
contract *bind.BoundContract // Generic contract wrapper for the low level calls
⋮----
// IOperatorTableUpdaterTransactor is an auto generated write-only Go binding around an Ethereum contract.
type IOperatorTableUpdaterTransactor struct {
	contract *bind.BoundContract // Generic contract wrapper for the low level calls
}
⋮----
// IOperatorTableUpdaterFilterer is an auto generated log filtering Go binding around an Ethereum contract events.
type IOperatorTableUpdaterFilterer struct {
	contract *bind.BoundContract // Generic contract wrapper for the low level calls
}
⋮----
// IOperatorTableUpdaterSession is an auto generated Go binding around an Ethereum contract,
// with pre-set call and transact options.
type IOperatorTableUpdaterSession struct {
	Contract     *IOperatorTableUpdater // 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
}
⋮----
Contract     *IOperatorTableUpdater // 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
⋮----
// IOperatorTableUpdaterCallerSession is an auto generated read-only Go binding around an Ethereum contract,
// with pre-set call options.
type IOperatorTableUpdaterCallerSession struct {
	Contract *IOperatorTableUpdaterCaller // Generic contract caller binding to set the session for
	CallOpts bind.CallOpts                // Call options to use throughout this session
}
⋮----
Contract *IOperatorTableUpdaterCaller // Generic contract caller binding to set the session for
CallOpts bind.CallOpts                // Call options to use throughout this session
⋮----
// IOperatorTableUpdaterTransactorSession is an auto generated write-only Go binding around an Ethereum contract,
// with pre-set transact options.
type IOperatorTableUpdaterTransactorSession struct {
	Contract     *IOperatorTableUpdaterTransactor // Generic contract transactor binding to set the session for
	TransactOpts bind.TransactOpts                // Transaction auth options to use throughout this session
}
⋮----
Contract     *IOperatorTableUpdaterTransactor // Generic contract transactor binding to set the session for
TransactOpts bind.TransactOpts                // Transaction auth options to use throughout this session
⋮----
// IOperatorTableUpdaterRaw is an auto generated low-level Go binding around an Ethereum contract.
type IOperatorTableUpdaterRaw struct {
	Contract *IOperatorTableUpdater // Generic contract binding to access the raw methods on
}
⋮----
Contract *IOperatorTableUpdater // Generic contract binding to access the raw methods on
⋮----
// IOperatorTableUpdaterCallerRaw is an auto generated low-level read-only Go binding around an Ethereum contract.
type IOperatorTableUpdaterCallerRaw struct {
	Contract *IOperatorTableUpdaterCaller // Generic read-only contract binding to access the raw methods on
}
⋮----
Contract *IOperatorTableUpdaterCaller // Generic read-only contract binding to access the raw methods on
⋮----
// IOperatorTableUpdaterTransactorRaw is an auto generated low-level write-only Go binding around an Ethereum contract.
type IOperatorTableUpdaterTransactorRaw struct {
	Contract *IOperatorTableUpdaterTransactor // Generic write-only contract binding to access the raw methods on
}
⋮----
Contract *IOperatorTableUpdaterTransactor // Generic write-only contract binding to access the raw methods on
⋮----
// NewIOperatorTableUpdater creates a new instance of IOperatorTableUpdater, bound to a specific deployed contract.
func NewIOperatorTableUpdater(address common.Address, backend bind.ContractBackend) (*IOperatorTableUpdater, error)
⋮----
// NewIOperatorTableUpdaterCaller creates a new read-only instance of IOperatorTableUpdater, bound to a specific deployed contract.
func NewIOperatorTableUpdaterCaller(address common.Address, caller bind.ContractCaller) (*IOperatorTableUpdaterCaller, error)
⋮----
// NewIOperatorTableUpdaterTransactor creates a new write-only instance of IOperatorTableUpdater, bound to a specific deployed contract.
func NewIOperatorTableUpdaterTransactor(address common.Address, transactor bind.ContractTransactor) (*IOperatorTableUpdaterTransactor, error)
⋮----
// NewIOperatorTableUpdaterFilterer creates a new log filterer instance of IOperatorTableUpdater, bound to a specific deployed contract.
func NewIOperatorTableUpdaterFilterer(address common.Address, filterer bind.ContractFilterer) (*IOperatorTableUpdaterFilterer, error)
⋮----
// bindIOperatorTableUpdater binds a generic wrapper to an already deployed contract.
func bindIOperatorTableUpdater(address common.Address, caller bind.ContractCaller, transactor bind.ContractTransactor, filterer bind.ContractFilterer) (*bind.BoundContract, error)
⋮----
// 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 (_IOperatorTableUpdater *IOperatorTableUpdaterRaw) Call(opts *bind.CallOpts, result *[]interface
⋮----
// Transfer initiates a plain transaction to move funds to the contract, calling
// its default method if one is available.
func (_IOperatorTableUpdater *IOperatorTableUpdaterRaw) Transfer(opts *bind.TransactOpts) (*types.Transaction, error)
⋮----
// Transact invokes the (paid) contract method with params as input values.
func (_IOperatorTableUpdater *IOperatorTableUpdaterRaw) Transact(opts *bind.TransactOpts, method string, params ...interface
⋮----
// GetCertificateVerifier is a free data retrieval call binding the contract method 0x6f728c50.
//
// Solidity: function getCertificateVerifier(uint8 curveType) view returns(address)
func (_IOperatorTableUpdater *IOperatorTableUpdaterCaller) GetCertificateVerifier(opts *bind.CallOpts, curveType uint8) (common.Address, error)
⋮----
var out []interface{}
⋮----
// GetCurrentGlobalTableRoot is a free data retrieval call binding the contract method 0x28522d79.
⋮----
// Solidity: function getCurrentGlobalTableRoot() view returns(bytes32 globalTableRoot)
func (_IOperatorTableUpdater *IOperatorTableUpdaterCaller) GetCurrentGlobalTableRoot(opts *bind.CallOpts) ([32]byte, error)
⋮----
// GetGenerator is a free data retrieval call binding the contract method 0x1e2ca260.
⋮----
// Solidity: function getGenerator() view returns((address,uint32))
func (_IOperatorTableUpdater *IOperatorTableUpdaterCaller) GetGenerator(opts *bind.CallOpts) (OperatorSet, error)
⋮----
// GetGeneratorConfig is a free data retrieval call binding the contract method 0xb0cb3a24.
⋮----
// Solidity: function getGeneratorConfig() view returns((address,uint32))
func (_IOperatorTableUpdater *IOperatorTableUpdaterCaller) GetGeneratorConfig(opts *bind.CallOpts) (ICrossChainRegistryTypesOperatorSetConfig, error)
⋮----
// GetGeneratorReferenceTimestamp is a free data retrieval call binding the contract method 0x7551ba34.
⋮----
// Solidity: function getGeneratorReferenceTimestamp() view returns(uint32)
func (_IOperatorTableUpdater *IOperatorTableUpdaterCaller) GetGeneratorReferenceTimestamp(opts *bind.CallOpts) (uint32, error)
⋮----
// GetGlobalTableRootByTimestamp is a free data retrieval call binding the contract method 0xc5916a39.
⋮----
// Solidity: function getGlobalTableRootByTimestamp(uint32 referenceTimestamp) view returns(bytes32 tableRoot)
func (_IOperatorTableUpdater *IOperatorTableUpdaterCaller) GetGlobalTableRootByTimestamp(opts *bind.CallOpts, referenceTimestamp uint32) ([32]byte, error)
⋮----
// GetGlobalTableUpdateMessageHash is a free data retrieval call binding the contract method 0xc3be1e33.
⋮----
// Solidity: function getGlobalTableUpdateMessageHash(bytes32 globalTableRoot, uint32 referenceTimestamp, uint32 referenceBlockNumber) view returns(bytes32)
func (_IOperatorTableUpdater *IOperatorTableUpdaterCaller) GetGlobalTableUpdateMessageHash(opts *bind.CallOpts, globalTableRoot [32]byte, referenceTimestamp uint32, referenceBlockNumber uint32) ([32]byte, error)
⋮----
// GetGlobalTableUpdateSignableDigest is a free data retrieval call binding the contract method 0x401c370f.
⋮----
// Solidity: function getGlobalTableUpdateSignableDigest(bytes32 globalTableRoot, uint32 referenceTimestamp, uint32 referenceBlockNumber) view returns(bytes32)
func (_IOperatorTableUpdater *IOperatorTableUpdaterCaller) GetGlobalTableUpdateSignableDigest(opts *bind.CallOpts, globalTableRoot [32]byte, referenceTimestamp uint32, referenceBlockNumber uint32) ([32]byte, error)
⋮----
// GetLatestReferenceBlockNumber is a free data retrieval call binding the contract method 0x31a599d2.
⋮----
// Solidity: function getLatestReferenceBlockNumber() view returns(uint32)
func (_IOperatorTableUpdater *IOperatorTableUpdaterCaller) GetLatestReferenceBlockNumber(opts *bind.CallOpts) (uint32, error)
⋮----
// GetLatestReferenceTimestamp is a free data retrieval call binding the contract method 0x4624e6a3.
⋮----
// Solidity: function getLatestReferenceTimestamp() view returns(uint32)
func (_IOperatorTableUpdater *IOperatorTableUpdaterCaller) GetLatestReferenceTimestamp(opts *bind.CallOpts) (uint32, error)
⋮----
// GetReferenceBlockNumberByTimestamp is a free data retrieval call binding the contract method 0x23b7b5b2.
⋮----
// Solidity: function getReferenceBlockNumberByTimestamp(uint32 referenceTimestamp) view returns(uint32)
func (_IOperatorTableUpdater *IOperatorTableUpdaterCaller) GetReferenceBlockNumberByTimestamp(opts *bind.CallOpts, referenceTimestamp uint32) (uint32, error)
⋮----
// GetReferenceTimestampByBlockNumber is a free data retrieval call binding the contract method 0x193b79f3.
⋮----
// Solidity: function getReferenceTimestampByBlockNumber(uint32 referenceBlockNumber) view returns(uint32)
func (_IOperatorTableUpdater *IOperatorTableUpdaterCaller) GetReferenceTimestampByBlockNumber(opts *bind.CallOpts, referenceBlockNumber uint32) (uint32, error)
⋮----
// IsRootValid is a free data retrieval call binding the contract method 0x30ef41b4.
⋮----
// Solidity: function isRootValid(bytes32 globalTableRoot) view returns(bool)
func (_IOperatorTableUpdater *IOperatorTableUpdaterCaller) IsRootValid(opts *bind.CallOpts, globalTableRoot [32]byte) (bool, error)
⋮----
// IsRootValidByTimestamp is a free data retrieval call binding the contract method 0x64e1df84.
⋮----
// Solidity: function isRootValidByTimestamp(uint32 referenceTimestamp) view returns(bool)
func (_IOperatorTableUpdater *IOperatorTableUpdaterCaller) IsRootValidByTimestamp(opts *bind.CallOpts, referenceTimestamp uint32) (bool, error)
⋮----
// ConfirmGlobalTableRoot is a paid mutator transaction binding the contract method 0xeaaed9d5.
⋮----
// Solidity: function confirmGlobalTableRoot((uint32,bytes32,(uint256,uint256),(uint256[2],uint256[2]),(uint32,bytes,((uint256,uint256),uint256[]))[]) globalTableRootCert, bytes32 globalTableRoot, uint32 referenceTimestamp, uint32 referenceBlockNumber) returns()
func (_IOperatorTableUpdater *IOperatorTableUpdaterTransactor) ConfirmGlobalTableRoot(opts *bind.TransactOpts, globalTableRootCert IBN254CertificateVerifierTypesBN254Certificate, globalTableRoot [32]byte, referenceTimestamp uint32, referenceBlockNumber uint32) (*types.Transaction, error)
⋮----
// DisableRoot is a paid mutator transaction binding the contract method 0xc3621f0a.
⋮----
// Solidity: function disableRoot(bytes32 globalTableRoot) returns()
func (_IOperatorTableUpdater *IOperatorTableUpdaterTransactor) DisableRoot(opts *bind.TransactOpts, globalTableRoot [32]byte) (*types.Transaction, error)
⋮----
// SetGlobalRootConfirmationThreshold is a paid mutator transaction binding the contract method 0x2370356c.
⋮----
// Solidity: function setGlobalRootConfirmationThreshold(uint16 bps) returns()
func (_IOperatorTableUpdater *IOperatorTableUpdaterTransactor) SetGlobalRootConfirmationThreshold(opts *bind.TransactOpts, bps uint16) (*types.Transaction, error)
⋮----
// UpdateGenerator is a paid mutator transaction binding the contract method 0x9f7e206f.
⋮----
// Solidity: function updateGenerator((address,uint32) generator, (bytes32,uint256,(uint256,uint256),uint256[]) generatorInfo) returns()
func (_IOperatorTableUpdater *IOperatorTableUpdaterTransactor) UpdateGenerator(opts *bind.TransactOpts, generator OperatorSet, generatorInfo IOperatorTableCalculatorTypesBN254OperatorSetInfo) (*types.Transaction, error)
⋮----
// UpdateOperatorTable is a paid mutator transaction binding the contract method 0x9ea94778.
⋮----
// Solidity: function updateOperatorTable(uint32 referenceTimestamp, bytes32 globalTableRoot, uint32 operatorSetIndex, bytes proof, bytes operatorTableBytes) returns()
func (_IOperatorTableUpdater *IOperatorTableUpdaterTransactor) UpdateOperatorTable(opts *bind.TransactOpts, referenceTimestamp uint32, globalTableRoot [32]byte, operatorSetIndex uint32, proof []byte, operatorTableBytes []byte) (*types.Transaction, error)
⋮----
// IOperatorTableUpdaterGeneratorUpdatedIterator is returned from FilterGeneratorUpdated and is used to iterate over the raw logs and unpacked data for GeneratorUpdated events raised by the IOperatorTableUpdater contract.
type IOperatorTableUpdaterGeneratorUpdatedIterator struct {
	Event *IOperatorTableUpdaterGeneratorUpdated // 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
}
⋮----
Event *IOperatorTableUpdaterGeneratorUpdated // 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 *IOperatorTableUpdaterGeneratorUpdatedIterator) Next() bool
⋮----
// If the iterator failed, stop iterating
⋮----
// If the iterator completed, deliver directly whatever's available
⋮----
// Iterator still in progress, wait for either a data or an error event
⋮----
// Error returns any retrieval or parsing error occurred during filtering.
func (it *IOperatorTableUpdaterGeneratorUpdatedIterator) Error() error
⋮----
// Close terminates the iteration process, releasing any pending underlying
// resources.
func (it *IOperatorTableUpdaterGeneratorUpdatedIterator) Close() error
⋮----
// IOperatorTableUpdaterGeneratorUpdated represents a GeneratorUpdated event raised by the IOperatorTableUpdater contract.
type IOperatorTableUpdaterGeneratorUpdated struct {
	OperatorSet OperatorSet
	Raw         types.Log // Blockchain specific contextual infos
}
⋮----
Raw         types.Log // Blockchain specific contextual infos
⋮----
// FilterGeneratorUpdated is a free log retrieval operation binding the contract event 0x3463431b09dfd43dec7349f8f24acfa753fe4cf40a26235402d213373df15856.
⋮----
// Solidity: event GeneratorUpdated((address,uint32) operatorSet)
func (_IOperatorTableUpdater *IOperatorTableUpdaterFilterer) FilterGeneratorUpdated(opts *bind.FilterOpts) (*IOperatorTableUpdaterGeneratorUpdatedIterator, error)
⋮----
// WatchGeneratorUpdated is a free log subscription operation binding the contract event 0x3463431b09dfd43dec7349f8f24acfa753fe4cf40a26235402d213373df15856.
⋮----
func (_IOperatorTableUpdater *IOperatorTableUpdaterFilterer) WatchGeneratorUpdated(opts *bind.WatchOpts, sink chan<- *IOperatorTableUpdaterGeneratorUpdated) (event.Subscription, error)
⋮----
// New log arrived, parse the event and forward to the user
⋮----
// ParseGeneratorUpdated is a log parse operation binding the contract event 0x3463431b09dfd43dec7349f8f24acfa753fe4cf40a26235402d213373df15856.
⋮----
func (_IOperatorTableUpdater *IOperatorTableUpdaterFilterer) ParseGeneratorUpdated(log types.Log) (*IOperatorTableUpdaterGeneratorUpdated, error)
⋮----
// IOperatorTableUpdaterGlobalRootConfirmationThresholdUpdatedIterator is returned from FilterGlobalRootConfirmationThresholdUpdated and is used to iterate over the raw logs and unpacked data for GlobalRootConfirmationThresholdUpdated events raised by the IOperatorTableUpdater contract.
type IOperatorTableUpdaterGlobalRootConfirmationThresholdUpdatedIterator struct {
	Event *IOperatorTableUpdaterGlobalRootConfirmationThresholdUpdated // 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
}
⋮----
Event *IOperatorTableUpdaterGlobalRootConfirmationThresholdUpdated // Event containing the contract specifics and raw log
⋮----
// IOperatorTableUpdaterGlobalRootConfirmationThresholdUpdated represents a GlobalRootConfirmationThresholdUpdated event raised by the IOperatorTableUpdater contract.
type IOperatorTableUpdaterGlobalRootConfirmationThresholdUpdated struct {
	Bps uint16
	Raw types.Log // Blockchain specific contextual infos
}
⋮----
Raw types.Log // Blockchain specific contextual infos
⋮----
// FilterGlobalRootConfirmationThresholdUpdated is a free log retrieval operation binding the contract event 0xf5d1836df8fcd7c1e54047e94ac8773d2855395603e2ef9ba5f5f16905f22592.
⋮----
// Solidity: event GlobalRootConfirmationThresholdUpdated(uint16 bps)
func (_IOperatorTableUpdater *IOperatorTableUpdaterFilterer) FilterGlobalRootConfirmationThresholdUpdated(opts *bind.FilterOpts) (*IOperatorTableUpdaterGlobalRootConfirmationThresholdUpdatedIterator, error)
⋮----
// WatchGlobalRootConfirmationThresholdUpdated is a free log subscription operation binding the contract event 0xf5d1836df8fcd7c1e54047e94ac8773d2855395603e2ef9ba5f5f16905f22592.
⋮----
func (_IOperatorTableUpdater *IOperatorTableUpdaterFilterer) WatchGlobalRootConfirmationThresholdUpdated(opts *bind.WatchOpts, sink chan<- *IOperatorTableUpdaterGlobalRootConfirmationThresholdUpdated) (event.Subscription, error)
⋮----
// ParseGlobalRootConfirmationThresholdUpdated is a log parse operation binding the contract event 0xf5d1836df8fcd7c1e54047e94ac8773d2855395603e2ef9ba5f5f16905f22592.
⋮----
func (_IOperatorTableUpdater *IOperatorTableUpdaterFilterer) ParseGlobalRootConfirmationThresholdUpdated(log types.Log) (*IOperatorTableUpdaterGlobalRootConfirmationThresholdUpdated, error)
⋮----
// IOperatorTableUpdaterGlobalRootDisabledIterator is returned from FilterGlobalRootDisabled and is used to iterate over the raw logs and unpacked data for GlobalRootDisabled events raised by the IOperatorTableUpdater contract.
type IOperatorTableUpdaterGlobalRootDisabledIterator struct {
	Event *IOperatorTableUpdaterGlobalRootDisabled // 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
}
⋮----
Event *IOperatorTableUpdaterGlobalRootDisabled // Event containing the contract specifics and raw log
⋮----
// IOperatorTableUpdaterGlobalRootDisabled represents a GlobalRootDisabled event raised by the IOperatorTableUpdater contract.
type IOperatorTableUpdaterGlobalRootDisabled struct {
	GlobalTableRoot [32]byte
	Raw             types.Log // Blockchain specific contextual infos
}
⋮----
Raw             types.Log // Blockchain specific contextual infos
⋮----
// FilterGlobalRootDisabled is a free log retrieval operation binding the contract event 0x8bd43de1250f58fe6ec9a78671a8b78dba70f0018656d157a3aeaabec389df34.
⋮----
// Solidity: event GlobalRootDisabled(bytes32 indexed globalTableRoot)
func (_IOperatorTableUpdater *IOperatorTableUpdaterFilterer) FilterGlobalRootDisabled(opts *bind.FilterOpts, globalTableRoot [][32]byte) (*IOperatorTableUpdaterGlobalRootDisabledIterator, error)
⋮----
var globalTableRootRule []interface{}
⋮----
// WatchGlobalRootDisabled is a free log subscription operation binding the contract event 0x8bd43de1250f58fe6ec9a78671a8b78dba70f0018656d157a3aeaabec389df34.
⋮----
func (_IOperatorTableUpdater *IOperatorTableUpdaterFilterer) WatchGlobalRootDisabled(opts *bind.WatchOpts, sink chan<- *IOperatorTableUpdaterGlobalRootDisabled, globalTableRoot [][32]byte) (event.Subscription, error)
⋮----
// ParseGlobalRootDisabled is a log parse operation binding the contract event 0x8bd43de1250f58fe6ec9a78671a8b78dba70f0018656d157a3aeaabec389df34.
⋮----
func (_IOperatorTableUpdater *IOperatorTableUpdaterFilterer) ParseGlobalRootDisabled(log types.Log) (*IOperatorTableUpdaterGlobalRootDisabled, error)
⋮----
// IOperatorTableUpdaterNewGlobalTableRootIterator is returned from FilterNewGlobalTableRoot and is used to iterate over the raw logs and unpacked data for NewGlobalTableRoot events raised by the IOperatorTableUpdater contract.
type IOperatorTableUpdaterNewGlobalTableRootIterator struct {
	Event *IOperatorTableUpdaterNewGlobalTableRoot // 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
}
⋮----
Event *IOperatorTableUpdaterNewGlobalTableRoot // Event containing the contract specifics and raw log
⋮----
// IOperatorTableUpdaterNewGlobalTableRoot represents a NewGlobalTableRoot event raised by the IOperatorTableUpdater contract.
type IOperatorTableUpdaterNewGlobalTableRoot struct {
	ReferenceTimestamp uint32
	GlobalTableRoot    [32]byte
	Raw                types.Log // Blockchain specific contextual infos
}
⋮----
Raw                types.Log // Blockchain specific contextual infos
⋮----
// FilterNewGlobalTableRoot is a free log retrieval operation binding the contract event 0x010dcbe0d1e019c93357711f7bb6287d543b7ff7de74f29df3fb5ecceec8d369.
⋮----
// Solidity: event NewGlobalTableRoot(uint32 indexed referenceTimestamp, bytes32 indexed globalTableRoot)
func (_IOperatorTableUpdater *IOperatorTableUpdaterFilterer) FilterNewGlobalTableRoot(opts *bind.FilterOpts, referenceTimestamp []uint32, globalTableRoot [][32]byte) (*IOperatorTableUpdaterNewGlobalTableRootIterator, error)
⋮----
var referenceTimestampRule []interface{}
⋮----
// WatchNewGlobalTableRoot is a free log subscription operation binding the contract event 0x010dcbe0d1e019c93357711f7bb6287d543b7ff7de74f29df3fb5ecceec8d369.
⋮----
func (_IOperatorTableUpdater *IOperatorTableUpdaterFilterer) WatchNewGlobalTableRoot(opts *bind.WatchOpts, sink chan<- *IOperatorTableUpdaterNewGlobalTableRoot, referenceTimestamp []uint32, globalTableRoot [][32]byte) (event.Subscription, error)
⋮----
// ParseNewGlobalTableRoot is a log parse operation binding the contract event 0x010dcbe0d1e019c93357711f7bb6287d543b7ff7de74f29df3fb5ecceec8d369.
⋮----
func (_IOperatorTableUpdater *IOperatorTableUpdaterFilterer) ParseNewGlobalTableRoot(log types.Log) (*IOperatorTableUpdaterNewGlobalTableRoot, error)
````

## File: pkg/bindings/IPausable/binding.go
````go
// Code generated - DO NOT EDIT.
// This file is a generated binding and any manual changes will be lost.
⋮----
package IPausable
⋮----
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"
)
⋮----
"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
)
⋮----
// IPausableMetaData contains all meta data concerning the IPausable contract.
var IPausableMetaData = &bind.MetaData{
	ABI: "[{\"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\":\"unpause\",\"inputs\":[{\"name\":\"newPausedStatus\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"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\":\"OnlyPauser\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"OnlyUnpauser\",\"inputs\":[]}]",
}
⋮----
// IPausableABI is the input ABI used to generate the binding from.
// Deprecated: Use IPausableMetaData.ABI instead.
var IPausableABI = IPausableMetaData.ABI
⋮----
// IPausable is an auto generated Go binding around an Ethereum contract.
type IPausable struct {
	IPausableCaller     // Read-only binding to the contract
	IPausableTransactor // Write-only binding to the contract
	IPausableFilterer   // Log filterer for contract events
}
⋮----
IPausableCaller     // Read-only binding to the contract
IPausableTransactor // Write-only binding to the contract
IPausableFilterer   // Log filterer for contract events
⋮----
// IPausableCaller is an auto generated read-only Go binding around an Ethereum contract.
type IPausableCaller struct {
	contract *bind.BoundContract // Generic contract wrapper for the low level calls
}
⋮----
contract *bind.BoundContract // Generic contract wrapper for the low level calls
⋮----
// IPausableTransactor is an auto generated write-only Go binding around an Ethereum contract.
type IPausableTransactor struct {
	contract *bind.BoundContract // Generic contract wrapper for the low level calls
}
⋮----
// IPausableFilterer is an auto generated log filtering Go binding around an Ethereum contract events.
type IPausableFilterer struct {
	contract *bind.BoundContract // Generic contract wrapper for the low level calls
}
⋮----
// IPausableSession is an auto generated Go binding around an Ethereum contract,
// with pre-set call and transact options.
type IPausableSession struct {
	Contract     *IPausable        // 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
}
⋮----
Contract     *IPausable        // 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
⋮----
// IPausableCallerSession is an auto generated read-only Go binding around an Ethereum contract,
// with pre-set call options.
type IPausableCallerSession struct {
	Contract *IPausableCaller // Generic contract caller binding to set the session for
	CallOpts bind.CallOpts    // Call options to use throughout this session
}
⋮----
Contract *IPausableCaller // Generic contract caller binding to set the session for
CallOpts bind.CallOpts    // Call options to use throughout this session
⋮----
// IPausableTransactorSession is an auto generated write-only Go binding around an Ethereum contract,
// with pre-set transact options.
type IPausableTransactorSession struct {
	Contract     *IPausableTransactor // Generic contract transactor binding to set the session for
	TransactOpts bind.TransactOpts    // Transaction auth options to use throughout this session
}
⋮----
Contract     *IPausableTransactor // Generic contract transactor binding to set the session for
TransactOpts bind.TransactOpts    // Transaction auth options to use throughout this session
⋮----
// IPausableRaw is an auto generated low-level Go binding around an Ethereum contract.
type IPausableRaw struct {
	Contract *IPausable // Generic contract binding to access the raw methods on
}
⋮----
Contract *IPausable // Generic contract binding to access the raw methods on
⋮----
// IPausableCallerRaw is an auto generated low-level read-only Go binding around an Ethereum contract.
type IPausableCallerRaw struct {
	Contract *IPausableCaller // Generic read-only contract binding to access the raw methods on
}
⋮----
Contract *IPausableCaller // Generic read-only contract binding to access the raw methods on
⋮----
// IPausableTransactorRaw is an auto generated low-level write-only Go binding around an Ethereum contract.
type IPausableTransactorRaw struct {
	Contract *IPausableTransactor // Generic write-only contract binding to access the raw methods on
}
⋮----
Contract *IPausableTransactor // Generic write-only contract binding to access the raw methods on
⋮----
// NewIPausable creates a new instance of IPausable, bound to a specific deployed contract.
func NewIPausable(address common.Address, backend bind.ContractBackend) (*IPausable, error)
⋮----
// NewIPausableCaller creates a new read-only instance of IPausable, bound to a specific deployed contract.
func NewIPausableCaller(address common.Address, caller bind.ContractCaller) (*IPausableCaller, error)
⋮----
// NewIPausableTransactor creates a new write-only instance of IPausable, bound to a specific deployed contract.
func NewIPausableTransactor(address common.Address, transactor bind.ContractTransactor) (*IPausableTransactor, error)
⋮----
// NewIPausableFilterer creates a new log filterer instance of IPausable, bound to a specific deployed contract.
func NewIPausableFilterer(address common.Address, filterer bind.ContractFilterer) (*IPausableFilterer, error)
⋮----
// bindIPausable binds a generic wrapper to an already deployed contract.
func bindIPausable(address common.Address, caller bind.ContractCaller, transactor bind.ContractTransactor, filterer bind.ContractFilterer) (*bind.BoundContract, error)
⋮----
// 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 (_IPausable *IPausableRaw) Call(opts *bind.CallOpts, result *[]interface
⋮----
// Transfer initiates a plain transaction to move funds to the contract, calling
// its default method if one is available.
func (_IPausable *IPausableRaw) Transfer(opts *bind.TransactOpts) (*types.Transaction, error)
⋮----
// Transact invokes the (paid) contract method with params as input values.
func (_IPausable *IPausableRaw) Transact(opts *bind.TransactOpts, method string, params ...interface
⋮----
// Paused is a free data retrieval call binding the contract method 0x5ac86ab7.
//
// Solidity: function paused(uint8 index) view returns(bool)
func (_IPausable *IPausableCaller) Paused(opts *bind.CallOpts, index uint8) (bool, error)
⋮----
var out []interface{}
⋮----
// Paused0 is a free data retrieval call binding the contract method 0x5c975abb.
⋮----
// Solidity: function paused() view returns(uint256)
func (_IPausable *IPausableCaller) Paused0(opts *bind.CallOpts) (*big.Int, error)
⋮----
// PauserRegistry is a free data retrieval call binding the contract method 0x886f1195.
⋮----
// Solidity: function pauserRegistry() view returns(address)
func (_IPausable *IPausableCaller) PauserRegistry(opts *bind.CallOpts) (common.Address, error)
⋮----
// Pause is a paid mutator transaction binding the contract method 0x136439dd.
⋮----
// Solidity: function pause(uint256 newPausedStatus) returns()
func (_IPausable *IPausableTransactor) Pause(opts *bind.TransactOpts, newPausedStatus *big.Int) (*types.Transaction, error)
⋮----
// PauseAll is a paid mutator transaction binding the contract method 0x595c6a67.
⋮----
// Solidity: function pauseAll() returns()
func (_IPausable *IPausableTransactor) PauseAll(opts *bind.TransactOpts) (*types.Transaction, error)
⋮----
// Unpause is a paid mutator transaction binding the contract method 0xfabc1cbc.
⋮----
// Solidity: function unpause(uint256 newPausedStatus) returns()
func (_IPausable *IPausableTransactor) Unpause(opts *bind.TransactOpts, newPausedStatus *big.Int) (*types.Transaction, error)
⋮----
// IPausablePausedIterator is returned from FilterPaused and is used to iterate over the raw logs and unpacked data for Paused events raised by the IPausable contract.
type IPausablePausedIterator struct {
	Event *IPausablePaused // 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
}
⋮----
Event *IPausablePaused // 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 *IPausablePausedIterator) Next() bool
⋮----
// If the iterator failed, stop iterating
⋮----
// If the iterator completed, deliver directly whatever's available
⋮----
// Iterator still in progress, wait for either a data or an error event
⋮----
// Error returns any retrieval or parsing error occurred during filtering.
func (it *IPausablePausedIterator) Error() error
⋮----
// Close terminates the iteration process, releasing any pending underlying
// resources.
func (it *IPausablePausedIterator) Close() error
⋮----
// IPausablePaused represents a Paused event raised by the IPausable contract.
type IPausablePaused struct {
	Account         common.Address
	NewPausedStatus *big.Int
	Raw             types.Log // Blockchain specific contextual infos
}
⋮----
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 (_IPausable *IPausableFilterer) FilterPaused(opts *bind.FilterOpts, account []common.Address) (*IPausablePausedIterator, error)
⋮----
var accountRule []interface{}
⋮----
// WatchPaused is a free log subscription operation binding the contract event 0xab40a374bc51de372200a8bc981af8c9ecdc08dfdaef0bb6e09f88f3c616ef3d.
⋮----
func (_IPausable *IPausableFilterer) WatchPaused(opts *bind.WatchOpts, sink chan<- *IPausablePaused, account []common.Address) (event.Subscription, error)
⋮----
// New log arrived, parse the event and forward to the user
⋮----
// ParsePaused is a log parse operation binding the contract event 0xab40a374bc51de372200a8bc981af8c9ecdc08dfdaef0bb6e09f88f3c616ef3d.
⋮----
func (_IPausable *IPausableFilterer) ParsePaused(log types.Log) (*IPausablePaused, error)
⋮----
// IPausableUnpausedIterator is returned from FilterUnpaused and is used to iterate over the raw logs and unpacked data for Unpaused events raised by the IPausable contract.
type IPausableUnpausedIterator struct {
	Event *IPausableUnpaused // 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
}
⋮----
Event *IPausableUnpaused // Event containing the contract specifics and raw log
⋮----
// IPausableUnpaused represents a Unpaused event raised by the IPausable contract.
type IPausableUnpaused 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 (_IPausable *IPausableFilterer) FilterUnpaused(opts *bind.FilterOpts, account []common.Address) (*IPausableUnpausedIterator, error)
⋮----
// WatchUnpaused is a free log subscription operation binding the contract event 0x3582d1828e26bf56bd801502bc021ac0bc8afb57c826e4986b45593c8fad389c.
⋮----
func (_IPausable *IPausableFilterer) WatchUnpaused(opts *bind.WatchOpts, sink chan<- *IPausableUnpaused, account []common.Address) (event.Subscription, error)
⋮----
// ParseUnpaused is a log parse operation binding the contract event 0x3582d1828e26bf56bd801502bc021ac0bc8afb57c826e4986b45593c8fad389c.
⋮----
func (_IPausable *IPausableFilterer) ParseUnpaused(log types.Log) (*IPausableUnpaused, error)
````

## File: pkg/bindings/IPauserRegistry/binding.go
````go
// Code generated - DO NOT EDIT.
// This file is a generated binding and any manual changes will be lost.
⋮----
package IPauserRegistry
⋮----
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"
)
⋮----
"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
)
⋮----
// IPauserRegistryMetaData contains all meta data concerning the IPauserRegistry contract.
var IPauserRegistryMetaData = &bind.MetaData{
	ABI: "[{\"type\":\"function\",\"name\":\"isPauser\",\"inputs\":[{\"name\":\"pauser\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"unpauser\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"event\",\"name\":\"PauserStatusChanged\",\"inputs\":[{\"name\":\"pauser\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"},{\"name\":\"canPause\",\"type\":\"bool\",\"indexed\":false,\"internalType\":\"bool\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"UnpauserChanged\",\"inputs\":[{\"name\":\"previousUnpauser\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"},{\"name\":\"newUnpauser\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"error\",\"name\":\"InputAddressZero\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"OnlyUnpauser\",\"inputs\":[]}]",
}
⋮----
// IPauserRegistryABI is the input ABI used to generate the binding from.
// Deprecated: Use IPauserRegistryMetaData.ABI instead.
var IPauserRegistryABI = IPauserRegistryMetaData.ABI
⋮----
// IPauserRegistry is an auto generated Go binding around an Ethereum contract.
type IPauserRegistry struct {
	IPauserRegistryCaller     // Read-only binding to the contract
	IPauserRegistryTransactor // Write-only binding to the contract
	IPauserRegistryFilterer   // Log filterer for contract events
}
⋮----
IPauserRegistryCaller     // Read-only binding to the contract
IPauserRegistryTransactor // Write-only binding to the contract
IPauserRegistryFilterer   // Log filterer for contract events
⋮----
// IPauserRegistryCaller is an auto generated read-only Go binding around an Ethereum contract.
type IPauserRegistryCaller struct {
	contract *bind.BoundContract // Generic contract wrapper for the low level calls
}
⋮----
contract *bind.BoundContract // Generic contract wrapper for the low level calls
⋮----
// IPauserRegistryTransactor is an auto generated write-only Go binding around an Ethereum contract.
type IPauserRegistryTransactor struct {
	contract *bind.BoundContract // Generic contract wrapper for the low level calls
}
⋮----
// IPauserRegistryFilterer is an auto generated log filtering Go binding around an Ethereum contract events.
type IPauserRegistryFilterer struct {
	contract *bind.BoundContract // Generic contract wrapper for the low level calls
}
⋮----
// IPauserRegistrySession is an auto generated Go binding around an Ethereum contract,
// with pre-set call and transact options.
type IPauserRegistrySession struct {
	Contract     *IPauserRegistry  // 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
}
⋮----
Contract     *IPauserRegistry  // 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
⋮----
// IPauserRegistryCallerSession is an auto generated read-only Go binding around an Ethereum contract,
// with pre-set call options.
type IPauserRegistryCallerSession struct {
	Contract *IPauserRegistryCaller // Generic contract caller binding to set the session for
	CallOpts bind.CallOpts          // Call options to use throughout this session
}
⋮----
Contract *IPauserRegistryCaller // Generic contract caller binding to set the session for
CallOpts bind.CallOpts          // Call options to use throughout this session
⋮----
// IPauserRegistryTransactorSession is an auto generated write-only Go binding around an Ethereum contract,
// with pre-set transact options.
type IPauserRegistryTransactorSession struct {
	Contract     *IPauserRegistryTransactor // Generic contract transactor binding to set the session for
	TransactOpts bind.TransactOpts          // Transaction auth options to use throughout this session
}
⋮----
Contract     *IPauserRegistryTransactor // Generic contract transactor binding to set the session for
TransactOpts bind.TransactOpts          // Transaction auth options to use throughout this session
⋮----
// IPauserRegistryRaw is an auto generated low-level Go binding around an Ethereum contract.
type IPauserRegistryRaw struct {
	Contract *IPauserRegistry // Generic contract binding to access the raw methods on
}
⋮----
Contract *IPauserRegistry // Generic contract binding to access the raw methods on
⋮----
// IPauserRegistryCallerRaw is an auto generated low-level read-only Go binding around an Ethereum contract.
type IPauserRegistryCallerRaw struct {
	Contract *IPauserRegistryCaller // Generic read-only contract binding to access the raw methods on
}
⋮----
Contract *IPauserRegistryCaller // Generic read-only contract binding to access the raw methods on
⋮----
// IPauserRegistryTransactorRaw is an auto generated low-level write-only Go binding around an Ethereum contract.
type IPauserRegistryTransactorRaw struct {
	Contract *IPauserRegistryTransactor // Generic write-only contract binding to access the raw methods on
}
⋮----
Contract *IPauserRegistryTransactor // Generic write-only contract binding to access the raw methods on
⋮----
// NewIPauserRegistry creates a new instance of IPauserRegistry, bound to a specific deployed contract.
func NewIPauserRegistry(address common.Address, backend bind.ContractBackend) (*IPauserRegistry, error)
⋮----
// NewIPauserRegistryCaller creates a new read-only instance of IPauserRegistry, bound to a specific deployed contract.
func NewIPauserRegistryCaller(address common.Address, caller bind.ContractCaller) (*IPauserRegistryCaller, error)
⋮----
// NewIPauserRegistryTransactor creates a new write-only instance of IPauserRegistry, bound to a specific deployed contract.
func NewIPauserRegistryTransactor(address common.Address, transactor bind.ContractTransactor) (*IPauserRegistryTransactor, error)
⋮----
// NewIPauserRegistryFilterer creates a new log filterer instance of IPauserRegistry, bound to a specific deployed contract.
func NewIPauserRegistryFilterer(address common.Address, filterer bind.ContractFilterer) (*IPauserRegistryFilterer, error)
⋮----
// bindIPauserRegistry binds a generic wrapper to an already deployed contract.
func bindIPauserRegistry(address common.Address, caller bind.ContractCaller, transactor bind.ContractTransactor, filterer bind.ContractFilterer) (*bind.BoundContract, error)
⋮----
// 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 (_IPauserRegistry *IPauserRegistryRaw) Call(opts *bind.CallOpts, result *[]interface
⋮----
// Transfer initiates a plain transaction to move funds to the contract, calling
// its default method if one is available.
func (_IPauserRegistry *IPauserRegistryRaw) Transfer(opts *bind.TransactOpts) (*types.Transaction, error)
⋮----
// Transact invokes the (paid) contract method with params as input values.
func (_IPauserRegistry *IPauserRegistryRaw) Transact(opts *bind.TransactOpts, method string, params ...interface
⋮----
// IsPauser is a free data retrieval call binding the contract method 0x46fbf68e.
//
// Solidity: function isPauser(address pauser) view returns(bool)
func (_IPauserRegistry *IPauserRegistryCaller) IsPauser(opts *bind.CallOpts, pauser common.Address) (bool, error)
⋮----
var out []interface{}
⋮----
// Unpauser is a free data retrieval call binding the contract method 0xeab66d7a.
⋮----
// Solidity: function unpauser() view returns(address)
func (_IPauserRegistry *IPauserRegistryCaller) Unpauser(opts *bind.CallOpts) (common.Address, error)
⋮----
// IPauserRegistryPauserStatusChangedIterator is returned from FilterPauserStatusChanged and is used to iterate over the raw logs and unpacked data for PauserStatusChanged events raised by the IPauserRegistry contract.
type IPauserRegistryPauserStatusChangedIterator struct {
	Event *IPauserRegistryPauserStatusChanged // 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
}
⋮----
Event *IPauserRegistryPauserStatusChanged // 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 *IPauserRegistryPauserStatusChangedIterator) Next() bool
⋮----
// If the iterator failed, stop iterating
⋮----
// If the iterator completed, deliver directly whatever's available
⋮----
// Iterator still in progress, wait for either a data or an error event
⋮----
// Error returns any retrieval or parsing error occurred during filtering.
func (it *IPauserRegistryPauserStatusChangedIterator) Error() error
⋮----
// Close terminates the iteration process, releasing any pending underlying
// resources.
func (it *IPauserRegistryPauserStatusChangedIterator) Close() error
⋮----
// IPauserRegistryPauserStatusChanged represents a PauserStatusChanged event raised by the IPauserRegistry contract.
type IPauserRegistryPauserStatusChanged struct {
	Pauser   common.Address
	CanPause bool
	Raw      types.Log // Blockchain specific contextual infos
}
⋮----
Raw      types.Log // Blockchain specific contextual infos
⋮----
// FilterPauserStatusChanged is a free log retrieval operation binding the contract event 0x65d3a1fd4c13f05cba164f80d03ce90fb4b5e21946bfc3ab7dbd434c2d0b9152.
⋮----
// Solidity: event PauserStatusChanged(address pauser, bool canPause)
func (_IPauserRegistry *IPauserRegistryFilterer) FilterPauserStatusChanged(opts *bind.FilterOpts) (*IPauserRegistryPauserStatusChangedIterator, error)
⋮----
// WatchPauserStatusChanged is a free log subscription operation binding the contract event 0x65d3a1fd4c13f05cba164f80d03ce90fb4b5e21946bfc3ab7dbd434c2d0b9152.
⋮----
func (_IPauserRegistry *IPauserRegistryFilterer) WatchPauserStatusChanged(opts *bind.WatchOpts, sink chan<- *IPauserRegistryPauserStatusChanged) (event.Subscription, error)
⋮----
// New log arrived, parse the event and forward to the user
⋮----
// ParsePauserStatusChanged is a log parse operation binding the contract event 0x65d3a1fd4c13f05cba164f80d03ce90fb4b5e21946bfc3ab7dbd434c2d0b9152.
⋮----
func (_IPauserRegistry *IPauserRegistryFilterer) ParsePauserStatusChanged(log types.Log) (*IPauserRegistryPauserStatusChanged, error)
⋮----
// IPauserRegistryUnpauserChangedIterator is returned from FilterUnpauserChanged and is used to iterate over the raw logs and unpacked data for UnpauserChanged events raised by the IPauserRegistry contract.
type IPauserRegistryUnpauserChangedIterator struct {
	Event *IPauserRegistryUnpauserChanged // 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
}
⋮----
Event *IPauserRegistryUnpauserChanged // Event containing the contract specifics and raw log
⋮----
// IPauserRegistryUnpauserChanged represents a UnpauserChanged event raised by the IPauserRegistry contract.
type IPauserRegistryUnpauserChanged struct {
	PreviousUnpauser common.Address
	NewUnpauser      common.Address
	Raw              types.Log // Blockchain specific contextual infos
}
⋮----
Raw              types.Log // Blockchain specific contextual infos
⋮----
// FilterUnpauserChanged is a free log retrieval operation binding the contract event 0x06b4167a2528887a1e97a366eefe8549bfbf1ea3e6ac81cb2564a934d20e8892.
⋮----
// Solidity: event UnpauserChanged(address previousUnpauser, address newUnpauser)
func (_IPauserRegistry *IPauserRegistryFilterer) FilterUnpauserChanged(opts *bind.FilterOpts) (*IPauserRegistryUnpauserChangedIterator, error)
⋮----
// WatchUnpauserChanged is a free log subscription operation binding the contract event 0x06b4167a2528887a1e97a366eefe8549bfbf1ea3e6ac81cb2564a934d20e8892.
⋮----
func (_IPauserRegistry *IPauserRegistryFilterer) WatchUnpauserChanged(opts *bind.WatchOpts, sink chan<- *IPauserRegistryUnpauserChanged) (event.Subscription, error)
⋮----
// ParseUnpauserChanged is a log parse operation binding the contract event 0x06b4167a2528887a1e97a366eefe8549bfbf1ea3e6ac81cb2564a934d20e8892.
⋮----
func (_IPauserRegistry *IPauserRegistryFilterer) ParseUnpauserChanged(log types.Log) (*IPauserRegistryUnpauserChanged, error)
````

## File: pkg/bindings/IPermissionController/binding.go
````go
// Code generated - DO NOT EDIT.
// This file is a generated binding and any manual changes will be lost.
⋮----
package IPermissionController
⋮----
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"
)
⋮----
"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
)
⋮----
// IPermissionControllerMetaData contains all meta data concerning the IPermissionController contract.
var IPermissionControllerMetaData = &bind.MetaData{
	ABI: "[{\"type\":\"function\",\"name\":\"acceptAdmin\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"addPendingAdmin\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"admin\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"canCall\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"caller\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"target\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"selector\",\"type\":\"bytes4\",\"internalType\":\"bytes4\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getAdmins\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"address[]\",\"internalType\":\"address[]\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getAppointeePermissions\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"appointee\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"address[]\",\"internalType\":\"address[]\"},{\"name\":\"\",\"type\":\"bytes4[]\",\"internalType\":\"bytes4[]\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getAppointees\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"target\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"selector\",\"type\":\"bytes4\",\"internalType\":\"bytes4\"}],\"outputs\":[{\"name\":\"\",\"type\":\"address[]\",\"internalType\":\"address[]\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getPendingAdmins\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"address[]\",\"internalType\":\"address[]\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"isAdmin\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"caller\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"isPendingAdmin\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"pendingAdmin\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"removeAdmin\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"admin\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"removeAppointee\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"appointee\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"target\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"selector\",\"type\":\"bytes4\",\"internalType\":\"bytes4\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"removePendingAdmin\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"admin\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"setAppointee\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"appointee\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"target\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"selector\",\"type\":\"bytes4\",\"internalType\":\"bytes4\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"event\",\"name\":\"AdminRemoved\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"admin\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"AdminSet\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"admin\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"AppointeeRemoved\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"appointee\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"target\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"},{\"name\":\"selector\",\"type\":\"bytes4\",\"indexed\":false,\"internalType\":\"bytes4\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"AppointeeSet\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"appointee\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"target\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"},{\"name\":\"selector\",\"type\":\"bytes4\",\"indexed\":false,\"internalType\":\"bytes4\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"PendingAdminAdded\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"admin\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"PendingAdminRemoved\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"admin\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"error\",\"name\":\"AdminAlreadyPending\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"AdminAlreadySet\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"AdminNotPending\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"AdminNotSet\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"AppointeeAlreadySet\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"AppointeeNotSet\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"CannotHaveZeroAdmins\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"NotAdmin\",\"inputs\":[]}]",
}
⋮----
// IPermissionControllerABI is the input ABI used to generate the binding from.
// Deprecated: Use IPermissionControllerMetaData.ABI instead.
var IPermissionControllerABI = IPermissionControllerMetaData.ABI
⋮----
// IPermissionController is an auto generated Go binding around an Ethereum contract.
type IPermissionController struct {
	IPermissionControllerCaller     // Read-only binding to the contract
	IPermissionControllerTransactor // Write-only binding to the contract
	IPermissionControllerFilterer   // Log filterer for contract events
}
⋮----
IPermissionControllerCaller     // Read-only binding to the contract
IPermissionControllerTransactor // Write-only binding to the contract
IPermissionControllerFilterer   // Log filterer for contract events
⋮----
// IPermissionControllerCaller is an auto generated read-only Go binding around an Ethereum contract.
type IPermissionControllerCaller struct {
	contract *bind.BoundContract // Generic contract wrapper for the low level calls
}
⋮----
contract *bind.BoundContract // Generic contract wrapper for the low level calls
⋮----
// IPermissionControllerTransactor is an auto generated write-only Go binding around an Ethereum contract.
type IPermissionControllerTransactor struct {
	contract *bind.BoundContract // Generic contract wrapper for the low level calls
}
⋮----
// IPermissionControllerFilterer is an auto generated log filtering Go binding around an Ethereum contract events.
type IPermissionControllerFilterer struct {
	contract *bind.BoundContract // Generic contract wrapper for the low level calls
}
⋮----
// IPermissionControllerSession is an auto generated Go binding around an Ethereum contract,
// with pre-set call and transact options.
type IPermissionControllerSession struct {
	Contract     *IPermissionController // 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
}
⋮----
Contract     *IPermissionController // 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
⋮----
// IPermissionControllerCallerSession is an auto generated read-only Go binding around an Ethereum contract,
// with pre-set call options.
type IPermissionControllerCallerSession struct {
	Contract *IPermissionControllerCaller // Generic contract caller binding to set the session for
	CallOpts bind.CallOpts                // Call options to use throughout this session
}
⋮----
Contract *IPermissionControllerCaller // Generic contract caller binding to set the session for
CallOpts bind.CallOpts                // Call options to use throughout this session
⋮----
// IPermissionControllerTransactorSession is an auto generated write-only Go binding around an Ethereum contract,
// with pre-set transact options.
type IPermissionControllerTransactorSession struct {
	Contract     *IPermissionControllerTransactor // Generic contract transactor binding to set the session for
	TransactOpts bind.TransactOpts                // Transaction auth options to use throughout this session
}
⋮----
Contract     *IPermissionControllerTransactor // Generic contract transactor binding to set the session for
TransactOpts bind.TransactOpts                // Transaction auth options to use throughout this session
⋮----
// IPermissionControllerRaw is an auto generated low-level Go binding around an Ethereum contract.
type IPermissionControllerRaw struct {
	Contract *IPermissionController // Generic contract binding to access the raw methods on
}
⋮----
Contract *IPermissionController // Generic contract binding to access the raw methods on
⋮----
// IPermissionControllerCallerRaw is an auto generated low-level read-only Go binding around an Ethereum contract.
type IPermissionControllerCallerRaw struct {
	Contract *IPermissionControllerCaller // Generic read-only contract binding to access the raw methods on
}
⋮----
Contract *IPermissionControllerCaller // Generic read-only contract binding to access the raw methods on
⋮----
// IPermissionControllerTransactorRaw is an auto generated low-level write-only Go binding around an Ethereum contract.
type IPermissionControllerTransactorRaw struct {
	Contract *IPermissionControllerTransactor // Generic write-only contract binding to access the raw methods on
}
⋮----
Contract *IPermissionControllerTransactor // Generic write-only contract binding to access the raw methods on
⋮----
// NewIPermissionController creates a new instance of IPermissionController, bound to a specific deployed contract.
func NewIPermissionController(address common.Address, backend bind.ContractBackend) (*IPermissionController, error)
⋮----
// NewIPermissionControllerCaller creates a new read-only instance of IPermissionController, bound to a specific deployed contract.
func NewIPermissionControllerCaller(address common.Address, caller bind.ContractCaller) (*IPermissionControllerCaller, error)
⋮----
// NewIPermissionControllerTransactor creates a new write-only instance of IPermissionController, bound to a specific deployed contract.
func NewIPermissionControllerTransactor(address common.Address, transactor bind.ContractTransactor) (*IPermissionControllerTransactor, error)
⋮----
// NewIPermissionControllerFilterer creates a new log filterer instance of IPermissionController, bound to a specific deployed contract.
func NewIPermissionControllerFilterer(address common.Address, filterer bind.ContractFilterer) (*IPermissionControllerFilterer, error)
⋮----
// bindIPermissionController binds a generic wrapper to an already deployed contract.
func bindIPermissionController(address common.Address, caller bind.ContractCaller, transactor bind.ContractTransactor, filterer bind.ContractFilterer) (*bind.BoundContract, error)
⋮----
// 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 (_IPermissionController *IPermissionControllerRaw) Call(opts *bind.CallOpts, result *[]interface
⋮----
// Transfer initiates a plain transaction to move funds to the contract, calling
// its default method if one is available.
func (_IPermissionController *IPermissionControllerRaw) Transfer(opts *bind.TransactOpts) (*types.Transaction, error)
⋮----
// Transact invokes the (paid) contract method with params as input values.
func (_IPermissionController *IPermissionControllerRaw) Transact(opts *bind.TransactOpts, method string, params ...interface
⋮----
// CanCall is a free data retrieval call binding the contract method 0xdf595cb8.
//
// Solidity: function canCall(address account, address caller, address target, bytes4 selector) view returns(bool)
func (_IPermissionController *IPermissionControllerCaller) CanCall(opts *bind.CallOpts, account common.Address, caller common.Address, target common.Address, selector [4]byte) (bool, error)
⋮----
var out []interface{}
⋮----
// GetAdmins is a free data retrieval call binding the contract method 0xad5f2210.
⋮----
// Solidity: function getAdmins(address account) view returns(address[])
func (_IPermissionController *IPermissionControllerCaller) GetAdmins(opts *bind.CallOpts, account common.Address) ([]common.Address, error)
⋮----
// GetAppointeePermissions is a free data retrieval call binding the contract method 0x882a3b38.
⋮----
// Solidity: function getAppointeePermissions(address account, address appointee) view returns(address[], bytes4[])
func (_IPermissionController *IPermissionControllerCaller) GetAppointeePermissions(opts *bind.CallOpts, account common.Address, appointee common.Address) ([]common.Address, [][4]byte, error)
⋮----
// GetAppointees is a free data retrieval call binding the contract method 0xfddbdefd.
⋮----
// Solidity: function getAppointees(address account, address target, bytes4 selector) view returns(address[])
func (_IPermissionController *IPermissionControllerCaller) GetAppointees(opts *bind.CallOpts, account common.Address, target common.Address, selector [4]byte) ([]common.Address, error)
⋮----
// GetPendingAdmins is a free data retrieval call binding the contract method 0x6bddfa1f.
⋮----
// Solidity: function getPendingAdmins(address account) view returns(address[])
func (_IPermissionController *IPermissionControllerCaller) GetPendingAdmins(opts *bind.CallOpts, account common.Address) ([]common.Address, error)
⋮----
// IsAdmin is a free data retrieval call binding the contract method 0x91006745.
⋮----
// Solidity: function isAdmin(address account, address caller) view returns(bool)
func (_IPermissionController *IPermissionControllerCaller) IsAdmin(opts *bind.CallOpts, account common.Address, caller common.Address) (bool, error)
⋮----
// IsPendingAdmin is a free data retrieval call binding the contract method 0xad8aca77.
⋮----
// Solidity: function isPendingAdmin(address account, address pendingAdmin) view returns(bool)
func (_IPermissionController *IPermissionControllerCaller) IsPendingAdmin(opts *bind.CallOpts, account common.Address, pendingAdmin common.Address) (bool, error)
⋮----
// AcceptAdmin is a paid mutator transaction binding the contract method 0x628806ef.
⋮----
// Solidity: function acceptAdmin(address account) returns()
func (_IPermissionController *IPermissionControllerTransactor) AcceptAdmin(opts *bind.TransactOpts, account common.Address) (*types.Transaction, error)
⋮----
// AddPendingAdmin is a paid mutator transaction binding the contract method 0xeb5a4e87.
⋮----
// Solidity: function addPendingAdmin(address account, address admin) returns()
func (_IPermissionController *IPermissionControllerTransactor) AddPendingAdmin(opts *bind.TransactOpts, account common.Address, admin common.Address) (*types.Transaction, error)
⋮----
// RemoveAdmin is a paid mutator transaction binding the contract method 0x268959e5.
⋮----
// Solidity: function removeAdmin(address account, address admin) returns()
func (_IPermissionController *IPermissionControllerTransactor) RemoveAdmin(opts *bind.TransactOpts, account common.Address, admin common.Address) (*types.Transaction, error)
⋮----
// RemoveAppointee is a paid mutator transaction binding the contract method 0x06641201.
⋮----
// Solidity: function removeAppointee(address account, address appointee, address target, bytes4 selector) returns()
func (_IPermissionController *IPermissionControllerTransactor) RemoveAppointee(opts *bind.TransactOpts, account common.Address, appointee common.Address, target common.Address, selector [4]byte) (*types.Transaction, error)
⋮----
// RemovePendingAdmin is a paid mutator transaction binding the contract method 0x4f906cf9.
⋮----
// Solidity: function removePendingAdmin(address account, address admin) returns()
func (_IPermissionController *IPermissionControllerTransactor) RemovePendingAdmin(opts *bind.TransactOpts, account common.Address, admin common.Address) (*types.Transaction, error)
⋮----
// SetAppointee is a paid mutator transaction binding the contract method 0x950d806e.
⋮----
// Solidity: function setAppointee(address account, address appointee, address target, bytes4 selector) returns()
func (_IPermissionController *IPermissionControllerTransactor) SetAppointee(opts *bind.TransactOpts, account common.Address, appointee common.Address, target common.Address, selector [4]byte) (*types.Transaction, error)
⋮----
// IPermissionControllerAdminRemovedIterator is returned from FilterAdminRemoved and is used to iterate over the raw logs and unpacked data for AdminRemoved events raised by the IPermissionController contract.
type IPermissionControllerAdminRemovedIterator struct {
	Event *IPermissionControllerAdminRemoved // 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
}
⋮----
Event *IPermissionControllerAdminRemoved // 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 *IPermissionControllerAdminRemovedIterator) Next() bool
⋮----
// If the iterator failed, stop iterating
⋮----
// If the iterator completed, deliver directly whatever's available
⋮----
// Iterator still in progress, wait for either a data or an error event
⋮----
// Error returns any retrieval or parsing error occurred during filtering.
func (it *IPermissionControllerAdminRemovedIterator) Error() error
⋮----
// Close terminates the iteration process, releasing any pending underlying
// resources.
func (it *IPermissionControllerAdminRemovedIterator) Close() error
⋮----
// IPermissionControllerAdminRemoved represents a AdminRemoved event raised by the IPermissionController contract.
type IPermissionControllerAdminRemoved struct {
	Account common.Address
	Admin   common.Address
	Raw     types.Log // Blockchain specific contextual infos
}
⋮----
Raw     types.Log // Blockchain specific contextual infos
⋮----
// FilterAdminRemoved is a free log retrieval operation binding the contract event 0xdb9d5d31320daf5bc7181d565b6da4d12e30f0f4d5aa324a992426c14a1d19ce.
⋮----
// Solidity: event AdminRemoved(address indexed account, address admin)
func (_IPermissionController *IPermissionControllerFilterer) FilterAdminRemoved(opts *bind.FilterOpts, account []common.Address) (*IPermissionControllerAdminRemovedIterator, error)
⋮----
var accountRule []interface{}
⋮----
// WatchAdminRemoved is a free log subscription operation binding the contract event 0xdb9d5d31320daf5bc7181d565b6da4d12e30f0f4d5aa324a992426c14a1d19ce.
⋮----
func (_IPermissionController *IPermissionControllerFilterer) WatchAdminRemoved(opts *bind.WatchOpts, sink chan<- *IPermissionControllerAdminRemoved, account []common.Address) (event.Subscription, error)
⋮----
// New log arrived, parse the event and forward to the user
⋮----
// ParseAdminRemoved is a log parse operation binding the contract event 0xdb9d5d31320daf5bc7181d565b6da4d12e30f0f4d5aa324a992426c14a1d19ce.
⋮----
func (_IPermissionController *IPermissionControllerFilterer) ParseAdminRemoved(log types.Log) (*IPermissionControllerAdminRemoved, error)
⋮----
// IPermissionControllerAdminSetIterator is returned from FilterAdminSet and is used to iterate over the raw logs and unpacked data for AdminSet events raised by the IPermissionController contract.
type IPermissionControllerAdminSetIterator struct {
	Event *IPermissionControllerAdminSet // 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
}
⋮----
Event *IPermissionControllerAdminSet // Event containing the contract specifics and raw log
⋮----
// IPermissionControllerAdminSet represents a AdminSet event raised by the IPermissionController contract.
type IPermissionControllerAdminSet struct {
	Account common.Address
	Admin   common.Address
	Raw     types.Log // Blockchain specific contextual infos
}
⋮----
// FilterAdminSet is a free log retrieval operation binding the contract event 0xbf265e8326285a2747e33e54d5945f7111f2b5edb826eb8c08d4677779b3ff97.
⋮----
// Solidity: event AdminSet(address indexed account, address admin)
func (_IPermissionController *IPermissionControllerFilterer) FilterAdminSet(opts *bind.FilterOpts, account []common.Address) (*IPermissionControllerAdminSetIterator, error)
⋮----
// WatchAdminSet is a free log subscription operation binding the contract event 0xbf265e8326285a2747e33e54d5945f7111f2b5edb826eb8c08d4677779b3ff97.
⋮----
func (_IPermissionController *IPermissionControllerFilterer) WatchAdminSet(opts *bind.WatchOpts, sink chan<- *IPermissionControllerAdminSet, account []common.Address) (event.Subscription, error)
⋮----
// ParseAdminSet is a log parse operation binding the contract event 0xbf265e8326285a2747e33e54d5945f7111f2b5edb826eb8c08d4677779b3ff97.
⋮----
func (_IPermissionController *IPermissionControllerFilterer) ParseAdminSet(log types.Log) (*IPermissionControllerAdminSet, error)
⋮----
// IPermissionControllerAppointeeRemovedIterator is returned from FilterAppointeeRemoved and is used to iterate over the raw logs and unpacked data for AppointeeRemoved events raised by the IPermissionController contract.
type IPermissionControllerAppointeeRemovedIterator struct {
	Event *IPermissionControllerAppointeeRemoved // 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
}
⋮----
Event *IPermissionControllerAppointeeRemoved // Event containing the contract specifics and raw log
⋮----
// IPermissionControllerAppointeeRemoved represents a AppointeeRemoved event raised by the IPermissionController contract.
type IPermissionControllerAppointeeRemoved struct {
	Account   common.Address
	Appointee common.Address
	Target    common.Address
	Selector  [4]byte
	Raw       types.Log // Blockchain specific contextual infos
}
⋮----
Raw       types.Log // Blockchain specific contextual infos
⋮----
// FilterAppointeeRemoved is a free log retrieval operation binding the contract event 0x18242326b6b862126970679759169f01f646bd55ec5bfcab85ba9f337a74e0c6.
⋮----
// Solidity: event AppointeeRemoved(address indexed account, address indexed appointee, address target, bytes4 selector)
func (_IPermissionController *IPermissionControllerFilterer) FilterAppointeeRemoved(opts *bind.FilterOpts, account []common.Address, appointee []common.Address) (*IPermissionControllerAppointeeRemovedIterator, error)
⋮----
var appointeeRule []interface{}
⋮----
// WatchAppointeeRemoved is a free log subscription operation binding the contract event 0x18242326b6b862126970679759169f01f646bd55ec5bfcab85ba9f337a74e0c6.
⋮----
func (_IPermissionController *IPermissionControllerFilterer) WatchAppointeeRemoved(opts *bind.WatchOpts, sink chan<- *IPermissionControllerAppointeeRemoved, account []common.Address, appointee []common.Address) (event.Subscription, error)
⋮----
// ParseAppointeeRemoved is a log parse operation binding the contract event 0x18242326b6b862126970679759169f01f646bd55ec5bfcab85ba9f337a74e0c6.
⋮----
func (_IPermissionController *IPermissionControllerFilterer) ParseAppointeeRemoved(log types.Log) (*IPermissionControllerAppointeeRemoved, error)
⋮----
// IPermissionControllerAppointeeSetIterator is returned from FilterAppointeeSet and is used to iterate over the raw logs and unpacked data for AppointeeSet events raised by the IPermissionController contract.
type IPermissionControllerAppointeeSetIterator struct {
	Event *IPermissionControllerAppointeeSet // 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
}
⋮----
Event *IPermissionControllerAppointeeSet // Event containing the contract specifics and raw log
⋮----
// IPermissionControllerAppointeeSet represents a AppointeeSet event raised by the IPermissionController contract.
type IPermissionControllerAppointeeSet struct {
	Account   common.Address
	Appointee common.Address
	Target    common.Address
	Selector  [4]byte
	Raw       types.Log // Blockchain specific contextual infos
}
⋮----
// FilterAppointeeSet is a free log retrieval operation binding the contract event 0x037f03a2ad6b967df4a01779b6d2b4c85950df83925d9e31362b519422fc0169.
⋮----
// Solidity: event AppointeeSet(address indexed account, address indexed appointee, address target, bytes4 selector)
func (_IPermissionController *IPermissionControllerFilterer) FilterAppointeeSet(opts *bind.FilterOpts, account []common.Address, appointee []common.Address) (*IPermissionControllerAppointeeSetIterator, error)
⋮----
// WatchAppointeeSet is a free log subscription operation binding the contract event 0x037f03a2ad6b967df4a01779b6d2b4c85950df83925d9e31362b519422fc0169.
⋮----
func (_IPermissionController *IPermissionControllerFilterer) WatchAppointeeSet(opts *bind.WatchOpts, sink chan<- *IPermissionControllerAppointeeSet, account []common.Address, appointee []common.Address) (event.Subscription, error)
⋮----
// ParseAppointeeSet is a log parse operation binding the contract event 0x037f03a2ad6b967df4a01779b6d2b4c85950df83925d9e31362b519422fc0169.
⋮----
func (_IPermissionController *IPermissionControllerFilterer) ParseAppointeeSet(log types.Log) (*IPermissionControllerAppointeeSet, error)
⋮----
// IPermissionControllerPendingAdminAddedIterator is returned from FilterPendingAdminAdded and is used to iterate over the raw logs and unpacked data for PendingAdminAdded events raised by the IPermissionController contract.
type IPermissionControllerPendingAdminAddedIterator struct {
	Event *IPermissionControllerPendingAdminAdded // 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
}
⋮----
Event *IPermissionControllerPendingAdminAdded // Event containing the contract specifics and raw log
⋮----
// IPermissionControllerPendingAdminAdded represents a PendingAdminAdded event raised by the IPermissionController contract.
type IPermissionControllerPendingAdminAdded struct {
	Account common.Address
	Admin   common.Address
	Raw     types.Log // Blockchain specific contextual infos
}
⋮----
// FilterPendingAdminAdded is a free log retrieval operation binding the contract event 0xb14b9a3d448c5b04f0e5b087b6f5193390db7955482a6ffb841e7b3ba61a460c.
⋮----
// Solidity: event PendingAdminAdded(address indexed account, address admin)
func (_IPermissionController *IPermissionControllerFilterer) FilterPendingAdminAdded(opts *bind.FilterOpts, account []common.Address) (*IPermissionControllerPendingAdminAddedIterator, error)
⋮----
// WatchPendingAdminAdded is a free log subscription operation binding the contract event 0xb14b9a3d448c5b04f0e5b087b6f5193390db7955482a6ffb841e7b3ba61a460c.
⋮----
func (_IPermissionController *IPermissionControllerFilterer) WatchPendingAdminAdded(opts *bind.WatchOpts, sink chan<- *IPermissionControllerPendingAdminAdded, account []common.Address) (event.Subscription, error)
⋮----
// ParsePendingAdminAdded is a log parse operation binding the contract event 0xb14b9a3d448c5b04f0e5b087b6f5193390db7955482a6ffb841e7b3ba61a460c.
⋮----
func (_IPermissionController *IPermissionControllerFilterer) ParsePendingAdminAdded(log types.Log) (*IPermissionControllerPendingAdminAdded, error)
⋮----
// IPermissionControllerPendingAdminRemovedIterator is returned from FilterPendingAdminRemoved and is used to iterate over the raw logs and unpacked data for PendingAdminRemoved events raised by the IPermissionController contract.
type IPermissionControllerPendingAdminRemovedIterator struct {
	Event *IPermissionControllerPendingAdminRemoved // 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
}
⋮----
Event *IPermissionControllerPendingAdminRemoved // Event containing the contract specifics and raw log
⋮----
// IPermissionControllerPendingAdminRemoved represents a PendingAdminRemoved event raised by the IPermissionController contract.
type IPermissionControllerPendingAdminRemoved struct {
	Account common.Address
	Admin   common.Address
	Raw     types.Log // Blockchain specific contextual infos
}
⋮----
// FilterPendingAdminRemoved is a free log retrieval operation binding the contract event 0xd706ed7ae044d795b49e54c9f519f663053951011985f663a862cd9ee72a9ac7.
⋮----
// Solidity: event PendingAdminRemoved(address indexed account, address admin)
func (_IPermissionController *IPermissionControllerFilterer) FilterPendingAdminRemoved(opts *bind.FilterOpts, account []common.Address) (*IPermissionControllerPendingAdminRemovedIterator, error)
⋮----
// WatchPendingAdminRemoved is a free log subscription operation binding the contract event 0xd706ed7ae044d795b49e54c9f519f663053951011985f663a862cd9ee72a9ac7.
⋮----
func (_IPermissionController *IPermissionControllerFilterer) WatchPendingAdminRemoved(opts *bind.WatchOpts, sink chan<- *IPermissionControllerPendingAdminRemoved, account []common.Address) (event.Subscription, error)
⋮----
// ParsePendingAdminRemoved is a log parse operation binding the contract event 0xd706ed7ae044d795b49e54c9f519f663053951011985f663a862cd9ee72a9ac7.
⋮----
func (_IPermissionController *IPermissionControllerFilterer) ParsePendingAdminRemoved(log types.Log) (*IPermissionControllerPendingAdminRemoved, error)
````

## File: pkg/bindings/IProtocolRegistry/binding.go
````go
// Code generated - DO NOT EDIT.
// This file is a generated binding and any manual changes will be lost.
⋮----
package IProtocolRegistry
⋮----
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"
)
⋮----
"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
)
⋮----
// IProtocolRegistryTypesDeploymentConfig is an auto generated low-level Go binding around an user-defined struct.
type IProtocolRegistryTypesDeploymentConfig struct {
	Pausable   bool
	Deprecated bool
}
⋮----
// IProtocolRegistryMetaData contains all meta data concerning the IProtocolRegistry contract.
var IProtocolRegistryMetaData = &bind.MetaData{
	ABI: "[{\"type\":\"function\",\"name\":\"PAUSER_ROLE\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"configure\",\"inputs\":[{\"name\":\"name\",\"type\":\"string\",\"internalType\":\"string\"},{\"name\":\"config\",\"type\":\"tuple\",\"internalType\":\"structIProtocolRegistryTypes.DeploymentConfig\",\"components\":[{\"name\":\"pausable\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"deprecated\",\"type\":\"bool\",\"internalType\":\"bool\"}]}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"getAddress\",\"inputs\":[{\"name\":\"name\",\"type\":\"string\",\"internalType\":\"string\"}],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getAllDeployments\",\"inputs\":[],\"outputs\":[{\"name\":\"names\",\"type\":\"string[]\",\"internalType\":\"string[]\"},{\"name\":\"addresses\",\"type\":\"address[]\",\"internalType\":\"address[]\"},{\"name\":\"configs\",\"type\":\"tuple[]\",\"internalType\":\"structIProtocolRegistryTypes.DeploymentConfig[]\",\"components\":[{\"name\":\"pausable\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"deprecated\",\"type\":\"bool\",\"internalType\":\"bool\"}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getDeployment\",\"inputs\":[{\"name\":\"name\",\"type\":\"string\",\"internalType\":\"string\"}],\"outputs\":[{\"name\":\"addr\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"config\",\"type\":\"tuple\",\"internalType\":\"structIProtocolRegistryTypes.DeploymentConfig\",\"components\":[{\"name\":\"pausable\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"deprecated\",\"type\":\"bool\",\"internalType\":\"bool\"}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"initialize\",\"inputs\":[{\"name\":\"initialAdmin\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"pauserMultisig\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"majorVersion\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"string\",\"internalType\":\"string\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"pauseAll\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"ship\",\"inputs\":[{\"name\":\"addresses\",\"type\":\"address[]\",\"internalType\":\"address[]\"},{\"name\":\"configs\",\"type\":\"tuple[]\",\"internalType\":\"structIProtocolRegistryTypes.DeploymentConfig[]\",\"components\":[{\"name\":\"pausable\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"deprecated\",\"type\":\"bool\",\"internalType\":\"bool\"}]},{\"name\":\"contractNames\",\"type\":\"string[]\",\"internalType\":\"string[]\"},{\"name\":\"semanticVersion\",\"type\":\"string\",\"internalType\":\"string\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"totalDeployments\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"version\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"string\",\"internalType\":\"string\"}],\"stateMutability\":\"view\"},{\"type\":\"event\",\"name\":\"DeploymentConfigDeleted\",\"inputs\":[{\"name\":\"addr\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"DeploymentConfigured\",\"inputs\":[{\"name\":\"addr\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"config\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structIProtocolRegistryTypes.DeploymentConfig\",\"components\":[{\"name\":\"pausable\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"deprecated\",\"type\":\"bool\",\"internalType\":\"bool\"}]}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"DeploymentShipped\",\"inputs\":[{\"name\":\"addr\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"config\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structIProtocolRegistryTypes.DeploymentConfig\",\"components\":[{\"name\":\"pausable\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"deprecated\",\"type\":\"bool\",\"internalType\":\"bool\"}]}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"SemanticVersionUpdated\",\"inputs\":[{\"name\":\"previousSemanticVersion\",\"type\":\"string\",\"indexed\":false,\"internalType\":\"string\"},{\"name\":\"semanticVersion\",\"type\":\"string\",\"indexed\":false,\"internalType\":\"string\"}],\"anonymous\":false},{\"type\":\"error\",\"name\":\"ArrayLengthMismatch\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"DeploymentNotShipped\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InputAddressZero\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InputNameEmpty\",\"inputs\":[]}]",
}
⋮----
// IProtocolRegistryABI is the input ABI used to generate the binding from.
// Deprecated: Use IProtocolRegistryMetaData.ABI instead.
var IProtocolRegistryABI = IProtocolRegistryMetaData.ABI
⋮----
// IProtocolRegistry is an auto generated Go binding around an Ethereum contract.
type IProtocolRegistry struct {
	IProtocolRegistryCaller     // Read-only binding to the contract
	IProtocolRegistryTransactor // Write-only binding to the contract
	IProtocolRegistryFilterer   // Log filterer for contract events
}
⋮----
IProtocolRegistryCaller     // Read-only binding to the contract
IProtocolRegistryTransactor // Write-only binding to the contract
IProtocolRegistryFilterer   // Log filterer for contract events
⋮----
// IProtocolRegistryCaller is an auto generated read-only Go binding around an Ethereum contract.
type IProtocolRegistryCaller struct {
	contract *bind.BoundContract // Generic contract wrapper for the low level calls
}
⋮----
contract *bind.BoundContract // Generic contract wrapper for the low level calls
⋮----
// IProtocolRegistryTransactor is an auto generated write-only Go binding around an Ethereum contract.
type IProtocolRegistryTransactor struct {
	contract *bind.BoundContract // Generic contract wrapper for the low level calls
}
⋮----
// IProtocolRegistryFilterer is an auto generated log filtering Go binding around an Ethereum contract events.
type IProtocolRegistryFilterer struct {
	contract *bind.BoundContract // Generic contract wrapper for the low level calls
}
⋮----
// IProtocolRegistrySession is an auto generated Go binding around an Ethereum contract,
// with pre-set call and transact options.
type IProtocolRegistrySession struct {
	Contract     *IProtocolRegistry // 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
}
⋮----
Contract     *IProtocolRegistry // 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
⋮----
// IProtocolRegistryCallerSession is an auto generated read-only Go binding around an Ethereum contract,
// with pre-set call options.
type IProtocolRegistryCallerSession struct {
	Contract *IProtocolRegistryCaller // Generic contract caller binding to set the session for
	CallOpts bind.CallOpts            // Call options to use throughout this session
}
⋮----
Contract *IProtocolRegistryCaller // Generic contract caller binding to set the session for
CallOpts bind.CallOpts            // Call options to use throughout this session
⋮----
// IProtocolRegistryTransactorSession is an auto generated write-only Go binding around an Ethereum contract,
// with pre-set transact options.
type IProtocolRegistryTransactorSession struct {
	Contract     *IProtocolRegistryTransactor // Generic contract transactor binding to set the session for
	TransactOpts bind.TransactOpts            // Transaction auth options to use throughout this session
}
⋮----
Contract     *IProtocolRegistryTransactor // Generic contract transactor binding to set the session for
TransactOpts bind.TransactOpts            // Transaction auth options to use throughout this session
⋮----
// IProtocolRegistryRaw is an auto generated low-level Go binding around an Ethereum contract.
type IProtocolRegistryRaw struct {
	Contract *IProtocolRegistry // Generic contract binding to access the raw methods on
}
⋮----
Contract *IProtocolRegistry // Generic contract binding to access the raw methods on
⋮----
// IProtocolRegistryCallerRaw is an auto generated low-level read-only Go binding around an Ethereum contract.
type IProtocolRegistryCallerRaw struct {
	Contract *IProtocolRegistryCaller // Generic read-only contract binding to access the raw methods on
}
⋮----
Contract *IProtocolRegistryCaller // Generic read-only contract binding to access the raw methods on
⋮----
// IProtocolRegistryTransactorRaw is an auto generated low-level write-only Go binding around an Ethereum contract.
type IProtocolRegistryTransactorRaw struct {
	Contract *IProtocolRegistryTransactor // Generic write-only contract binding to access the raw methods on
}
⋮----
Contract *IProtocolRegistryTransactor // Generic write-only contract binding to access the raw methods on
⋮----
// NewIProtocolRegistry creates a new instance of IProtocolRegistry, bound to a specific deployed contract.
func NewIProtocolRegistry(address common.Address, backend bind.ContractBackend) (*IProtocolRegistry, error)
⋮----
// NewIProtocolRegistryCaller creates a new read-only instance of IProtocolRegistry, bound to a specific deployed contract.
func NewIProtocolRegistryCaller(address common.Address, caller bind.ContractCaller) (*IProtocolRegistryCaller, error)
⋮----
// NewIProtocolRegistryTransactor creates a new write-only instance of IProtocolRegistry, bound to a specific deployed contract.
func NewIProtocolRegistryTransactor(address common.Address, transactor bind.ContractTransactor) (*IProtocolRegistryTransactor, error)
⋮----
// NewIProtocolRegistryFilterer creates a new log filterer instance of IProtocolRegistry, bound to a specific deployed contract.
func NewIProtocolRegistryFilterer(address common.Address, filterer bind.ContractFilterer) (*IProtocolRegistryFilterer, error)
⋮----
// bindIProtocolRegistry binds a generic wrapper to an already deployed contract.
func bindIProtocolRegistry(address common.Address, caller bind.ContractCaller, transactor bind.ContractTransactor, filterer bind.ContractFilterer) (*bind.BoundContract, error)
⋮----
// 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 (_IProtocolRegistry *IProtocolRegistryRaw) Call(opts *bind.CallOpts, result *[]interface
⋮----
// Transfer initiates a plain transaction to move funds to the contract, calling
// its default method if one is available.
func (_IProtocolRegistry *IProtocolRegistryRaw) Transfer(opts *bind.TransactOpts) (*types.Transaction, error)
⋮----
// Transact invokes the (paid) contract method with params as input values.
func (_IProtocolRegistry *IProtocolRegistryRaw) Transact(opts *bind.TransactOpts, method string, params ...interface
⋮----
// PAUSERROLE is a free data retrieval call binding the contract method 0xe63ab1e9.
//
// Solidity: function PAUSER_ROLE() view returns(bytes32)
func (_IProtocolRegistry *IProtocolRegistryCaller) PAUSERROLE(opts *bind.CallOpts) ([32]byte, error)
⋮----
var out []interface{}
⋮----
// GetAddress is a free data retrieval call binding the contract method 0xbf40fac1.
⋮----
// Solidity: function getAddress(string name) view returns(address)
func (_IProtocolRegistry *IProtocolRegistryCaller) GetAddress(opts *bind.CallOpts, name string) (common.Address, error)
⋮----
// GetAllDeployments is a free data retrieval call binding the contract method 0x8eec00b8.
⋮----
// Solidity: function getAllDeployments() view returns(string[] names, address[] addresses, (bool,bool)[] configs)
func (_IProtocolRegistry *IProtocolRegistryCaller) GetAllDeployments(opts *bind.CallOpts) (struct
⋮----
// GetDeployment is a free data retrieval call binding the contract method 0xa8091d97.
⋮----
// Solidity: function getDeployment(string name) view returns(address addr, (bool,bool) config)
func (_IProtocolRegistry *IProtocolRegistryCaller) GetDeployment(opts *bind.CallOpts, name string) (struct
⋮----
// MajorVersion is a free data retrieval call binding the contract method 0xaf05a5c5.
⋮----
// Solidity: function majorVersion() view returns(string)
func (_IProtocolRegistry *IProtocolRegistryCaller) MajorVersion(opts *bind.CallOpts) (string, error)
⋮----
// TotalDeployments is a free data retrieval call binding the contract method 0xfb35b4e4.
⋮----
// Solidity: function totalDeployments() view returns(uint256)
func (_IProtocolRegistry *IProtocolRegistryCaller) TotalDeployments(opts *bind.CallOpts) (*big.Int, error)
⋮----
// Version is a free data retrieval call binding the contract method 0x54fd4d50.
⋮----
// Solidity: function version() view returns(string)
func (_IProtocolRegistry *IProtocolRegistryCaller) Version(opts *bind.CallOpts) (string, error)
⋮----
// Configure is a paid mutator transaction binding the contract method 0x0b6cc4f9.
⋮----
// Solidity: function configure(string name, (bool,bool) config) returns()
func (_IProtocolRegistry *IProtocolRegistryTransactor) Configure(opts *bind.TransactOpts, name string, config IProtocolRegistryTypesDeploymentConfig) (*types.Transaction, error)
⋮----
// Initialize is a paid mutator transaction binding the contract method 0x485cc955.
⋮----
// Solidity: function initialize(address initialAdmin, address pauserMultisig) returns()
func (_IProtocolRegistry *IProtocolRegistryTransactor) Initialize(opts *bind.TransactOpts, initialAdmin common.Address, pauserMultisig common.Address) (*types.Transaction, error)
⋮----
// PauseAll is a paid mutator transaction binding the contract method 0x595c6a67.
⋮----
// Solidity: function pauseAll() returns()
func (_IProtocolRegistry *IProtocolRegistryTransactor) PauseAll(opts *bind.TransactOpts) (*types.Transaction, error)
⋮----
// Ship is a paid mutator transaction binding the contract method 0xfc434a8a.
⋮----
// Solidity: function ship(address[] addresses, (bool,bool)[] configs, string[] contractNames, string semanticVersion) returns()
func (_IProtocolRegistry *IProtocolRegistryTransactor) Ship(opts *bind.TransactOpts, addresses []common.Address, configs []IProtocolRegistryTypesDeploymentConfig, contractNames []string, semanticVersion string) (*types.Transaction, error)
⋮----
// IProtocolRegistryDeploymentConfigDeletedIterator is returned from FilterDeploymentConfigDeleted and is used to iterate over the raw logs and unpacked data for DeploymentConfigDeleted events raised by the IProtocolRegistry contract.
type IProtocolRegistryDeploymentConfigDeletedIterator struct {
	Event *IProtocolRegistryDeploymentConfigDeleted // 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
}
⋮----
Event *IProtocolRegistryDeploymentConfigDeleted // 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 *IProtocolRegistryDeploymentConfigDeletedIterator) Next() bool
⋮----
// If the iterator failed, stop iterating
⋮----
// If the iterator completed, deliver directly whatever's available
⋮----
// Iterator still in progress, wait for either a data or an error event
⋮----
// Error returns any retrieval or parsing error occurred during filtering.
func (it *IProtocolRegistryDeploymentConfigDeletedIterator) Error() error
⋮----
// Close terminates the iteration process, releasing any pending underlying
// resources.
func (it *IProtocolRegistryDeploymentConfigDeletedIterator) Close() error
⋮----
// IProtocolRegistryDeploymentConfigDeleted represents a DeploymentConfigDeleted event raised by the IProtocolRegistry contract.
type IProtocolRegistryDeploymentConfigDeleted struct {
	Addr common.Address
	Raw  types.Log // Blockchain specific contextual infos
}
⋮----
Raw  types.Log // Blockchain specific contextual infos
⋮----
// FilterDeploymentConfigDeleted is a free log retrieval operation binding the contract event 0xa69cccaa8b056f2577aa7e06e1eb14ae0eb526356819b9403f5b31f41f3bc509.
⋮----
// Solidity: event DeploymentConfigDeleted(address indexed addr)
func (_IProtocolRegistry *IProtocolRegistryFilterer) FilterDeploymentConfigDeleted(opts *bind.FilterOpts, addr []common.Address) (*IProtocolRegistryDeploymentConfigDeletedIterator, error)
⋮----
var addrRule []interface{}
⋮----
// WatchDeploymentConfigDeleted is a free log subscription operation binding the contract event 0xa69cccaa8b056f2577aa7e06e1eb14ae0eb526356819b9403f5b31f41f3bc509.
⋮----
func (_IProtocolRegistry *IProtocolRegistryFilterer) WatchDeploymentConfigDeleted(opts *bind.WatchOpts, sink chan<- *IProtocolRegistryDeploymentConfigDeleted, addr []common.Address) (event.Subscription, error)
⋮----
// New log arrived, parse the event and forward to the user
⋮----
// ParseDeploymentConfigDeleted is a log parse operation binding the contract event 0xa69cccaa8b056f2577aa7e06e1eb14ae0eb526356819b9403f5b31f41f3bc509.
⋮----
func (_IProtocolRegistry *IProtocolRegistryFilterer) ParseDeploymentConfigDeleted(log types.Log) (*IProtocolRegistryDeploymentConfigDeleted, error)
⋮----
// IProtocolRegistryDeploymentConfiguredIterator is returned from FilterDeploymentConfigured and is used to iterate over the raw logs and unpacked data for DeploymentConfigured events raised by the IProtocolRegistry contract.
type IProtocolRegistryDeploymentConfiguredIterator struct {
	Event *IProtocolRegistryDeploymentConfigured // 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
}
⋮----
Event *IProtocolRegistryDeploymentConfigured // Event containing the contract specifics and raw log
⋮----
// IProtocolRegistryDeploymentConfigured represents a DeploymentConfigured event raised by the IProtocolRegistry contract.
type IProtocolRegistryDeploymentConfigured struct {
	Addr   common.Address
	Config IProtocolRegistryTypesDeploymentConfig
	Raw    types.Log // Blockchain specific contextual infos
}
⋮----
Raw    types.Log // Blockchain specific contextual infos
⋮----
// FilterDeploymentConfigured is a free log retrieval operation binding the contract event 0x6c5879ec82f910f6d12844857cfb8eb474dcecc9aa5b8257c7a77dcb42990e9d.
⋮----
// Solidity: event DeploymentConfigured(address indexed addr, (bool,bool) config)
func (_IProtocolRegistry *IProtocolRegistryFilterer) FilterDeploymentConfigured(opts *bind.FilterOpts, addr []common.Address) (*IProtocolRegistryDeploymentConfiguredIterator, error)
⋮----
// WatchDeploymentConfigured is a free log subscription operation binding the contract event 0x6c5879ec82f910f6d12844857cfb8eb474dcecc9aa5b8257c7a77dcb42990e9d.
⋮----
func (_IProtocolRegistry *IProtocolRegistryFilterer) WatchDeploymentConfigured(opts *bind.WatchOpts, sink chan<- *IProtocolRegistryDeploymentConfigured, addr []common.Address) (event.Subscription, error)
⋮----
// ParseDeploymentConfigured is a log parse operation binding the contract event 0x6c5879ec82f910f6d12844857cfb8eb474dcecc9aa5b8257c7a77dcb42990e9d.
⋮----
func (_IProtocolRegistry *IProtocolRegistryFilterer) ParseDeploymentConfigured(log types.Log) (*IProtocolRegistryDeploymentConfigured, error)
⋮----
// IProtocolRegistryDeploymentShippedIterator is returned from FilterDeploymentShipped and is used to iterate over the raw logs and unpacked data for DeploymentShipped events raised by the IProtocolRegistry contract.
type IProtocolRegistryDeploymentShippedIterator struct {
	Event *IProtocolRegistryDeploymentShipped // 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
}
⋮----
Event *IProtocolRegistryDeploymentShipped // Event containing the contract specifics and raw log
⋮----
// IProtocolRegistryDeploymentShipped represents a DeploymentShipped event raised by the IProtocolRegistry contract.
type IProtocolRegistryDeploymentShipped struct {
	Addr   common.Address
	Config IProtocolRegistryTypesDeploymentConfig
	Raw    types.Log // Blockchain specific contextual infos
}
⋮----
// FilterDeploymentShipped is a free log retrieval operation binding the contract event 0x4e81e5495dbc85919bf1b9c12a9a4bb6d546f75d3f92fa0a36867fc29a51467c.
⋮----
// Solidity: event DeploymentShipped(address indexed addr, (bool,bool) config)
func (_IProtocolRegistry *IProtocolRegistryFilterer) FilterDeploymentShipped(opts *bind.FilterOpts, addr []common.Address) (*IProtocolRegistryDeploymentShippedIterator, error)
⋮----
// WatchDeploymentShipped is a free log subscription operation binding the contract event 0x4e81e5495dbc85919bf1b9c12a9a4bb6d546f75d3f92fa0a36867fc29a51467c.
⋮----
func (_IProtocolRegistry *IProtocolRegistryFilterer) WatchDeploymentShipped(opts *bind.WatchOpts, sink chan<- *IProtocolRegistryDeploymentShipped, addr []common.Address) (event.Subscription, error)
⋮----
// ParseDeploymentShipped is a log parse operation binding the contract event 0x4e81e5495dbc85919bf1b9c12a9a4bb6d546f75d3f92fa0a36867fc29a51467c.
⋮----
func (_IProtocolRegistry *IProtocolRegistryFilterer) ParseDeploymentShipped(log types.Log) (*IProtocolRegistryDeploymentShipped, error)
⋮----
// IProtocolRegistrySemanticVersionUpdatedIterator is returned from FilterSemanticVersionUpdated and is used to iterate over the raw logs and unpacked data for SemanticVersionUpdated events raised by the IProtocolRegistry contract.
type IProtocolRegistrySemanticVersionUpdatedIterator struct {
	Event *IProtocolRegistrySemanticVersionUpdated // 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
}
⋮----
Event *IProtocolRegistrySemanticVersionUpdated // Event containing the contract specifics and raw log
⋮----
// IProtocolRegistrySemanticVersionUpdated represents a SemanticVersionUpdated event raised by the IProtocolRegistry contract.
type IProtocolRegistrySemanticVersionUpdated struct {
	PreviousSemanticVersion string
	SemanticVersion         string
	Raw                     types.Log // Blockchain specific contextual infos
}
⋮----
Raw                     types.Log // Blockchain specific contextual infos
⋮----
// FilterSemanticVersionUpdated is a free log retrieval operation binding the contract event 0x769656e5cb3218f54758f85bd184d41e987639374d6cb9e244439cc9d1abe1e2.
⋮----
// Solidity: event SemanticVersionUpdated(string previousSemanticVersion, string semanticVersion)
func (_IProtocolRegistry *IProtocolRegistryFilterer) FilterSemanticVersionUpdated(opts *bind.FilterOpts) (*IProtocolRegistrySemanticVersionUpdatedIterator, error)
⋮----
// WatchSemanticVersionUpdated is a free log subscription operation binding the contract event 0x769656e5cb3218f54758f85bd184d41e987639374d6cb9e244439cc9d1abe1e2.
⋮----
func (_IProtocolRegistry *IProtocolRegistryFilterer) WatchSemanticVersionUpdated(opts *bind.WatchOpts, sink chan<- *IProtocolRegistrySemanticVersionUpdated) (event.Subscription, error)
⋮----
// ParseSemanticVersionUpdated is a log parse operation binding the contract event 0x769656e5cb3218f54758f85bd184d41e987639374d6cb9e244439cc9d1abe1e2.
⋮----
func (_IProtocolRegistry *IProtocolRegistryFilterer) ParseSemanticVersionUpdated(log types.Log) (*IProtocolRegistrySemanticVersionUpdated, error)
````

## File: pkg/bindings/IProxyAdmin/binding.go
````go
// Code generated - DO NOT EDIT.
// This file is a generated binding and any manual changes will be lost.
⋮----
package IProxyAdmin
⋮----
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"
)
⋮----
"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
)
⋮----
// IProxyAdminMetaData contains all meta data concerning the IProxyAdmin contract.
var IProxyAdminMetaData = &bind.MetaData{
	ABI: "[{\"type\":\"function\",\"name\":\"changeProxyAdmin\",\"inputs\":[{\"name\":\"proxy\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"newAdmin\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"getProxyAdmin\",\"inputs\":[{\"name\":\"proxy\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getProxyImplementation\",\"inputs\":[{\"name\":\"proxy\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"upgrade\",\"inputs\":[{\"name\":\"proxy\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"implementation\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"upgradeAndCall\",\"inputs\":[{\"name\":\"proxy\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"implementation\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"data\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[],\"stateMutability\":\"payable\"}]",
}
⋮----
// IProxyAdminABI is the input ABI used to generate the binding from.
// Deprecated: Use IProxyAdminMetaData.ABI instead.
var IProxyAdminABI = IProxyAdminMetaData.ABI
⋮----
// IProxyAdmin is an auto generated Go binding around an Ethereum contract.
type IProxyAdmin struct {
	IProxyAdminCaller     // Read-only binding to the contract
	IProxyAdminTransactor // Write-only binding to the contract
	IProxyAdminFilterer   // Log filterer for contract events
}
⋮----
IProxyAdminCaller     // Read-only binding to the contract
IProxyAdminTransactor // Write-only binding to the contract
IProxyAdminFilterer   // Log filterer for contract events
⋮----
// IProxyAdminCaller is an auto generated read-only Go binding around an Ethereum contract.
type IProxyAdminCaller struct {
	contract *bind.BoundContract // Generic contract wrapper for the low level calls
}
⋮----
contract *bind.BoundContract // Generic contract wrapper for the low level calls
⋮----
// IProxyAdminTransactor is an auto generated write-only Go binding around an Ethereum contract.
type IProxyAdminTransactor struct {
	contract *bind.BoundContract // Generic contract wrapper for the low level calls
}
⋮----
// IProxyAdminFilterer is an auto generated log filtering Go binding around an Ethereum contract events.
type IProxyAdminFilterer struct {
	contract *bind.BoundContract // Generic contract wrapper for the low level calls
}
⋮----
// IProxyAdminSession is an auto generated Go binding around an Ethereum contract,
// with pre-set call and transact options.
type IProxyAdminSession struct {
	Contract     *IProxyAdmin      // 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
}
⋮----
Contract     *IProxyAdmin      // 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
⋮----
// IProxyAdminCallerSession is an auto generated read-only Go binding around an Ethereum contract,
// with pre-set call options.
type IProxyAdminCallerSession struct {
	Contract *IProxyAdminCaller // Generic contract caller binding to set the session for
	CallOpts bind.CallOpts      // Call options to use throughout this session
}
⋮----
Contract *IProxyAdminCaller // Generic contract caller binding to set the session for
CallOpts bind.CallOpts      // Call options to use throughout this session
⋮----
// IProxyAdminTransactorSession is an auto generated write-only Go binding around an Ethereum contract,
// with pre-set transact options.
type IProxyAdminTransactorSession struct {
	Contract     *IProxyAdminTransactor // Generic contract transactor binding to set the session for
	TransactOpts bind.TransactOpts      // Transaction auth options to use throughout this session
}
⋮----
Contract     *IProxyAdminTransactor // Generic contract transactor binding to set the session for
TransactOpts bind.TransactOpts      // Transaction auth options to use throughout this session
⋮----
// IProxyAdminRaw is an auto generated low-level Go binding around an Ethereum contract.
type IProxyAdminRaw struct {
	Contract *IProxyAdmin // Generic contract binding to access the raw methods on
}
⋮----
Contract *IProxyAdmin // Generic contract binding to access the raw methods on
⋮----
// IProxyAdminCallerRaw is an auto generated low-level read-only Go binding around an Ethereum contract.
type IProxyAdminCallerRaw struct {
	Contract *IProxyAdminCaller // Generic read-only contract binding to access the raw methods on
}
⋮----
Contract *IProxyAdminCaller // Generic read-only contract binding to access the raw methods on
⋮----
// IProxyAdminTransactorRaw is an auto generated low-level write-only Go binding around an Ethereum contract.
type IProxyAdminTransactorRaw struct {
	Contract *IProxyAdminTransactor // Generic write-only contract binding to access the raw methods on
}
⋮----
Contract *IProxyAdminTransactor // Generic write-only contract binding to access the raw methods on
⋮----
// NewIProxyAdmin creates a new instance of IProxyAdmin, bound to a specific deployed contract.
func NewIProxyAdmin(address common.Address, backend bind.ContractBackend) (*IProxyAdmin, error)
⋮----
// NewIProxyAdminCaller creates a new read-only instance of IProxyAdmin, bound to a specific deployed contract.
func NewIProxyAdminCaller(address common.Address, caller bind.ContractCaller) (*IProxyAdminCaller, error)
⋮----
// NewIProxyAdminTransactor creates a new write-only instance of IProxyAdmin, bound to a specific deployed contract.
func NewIProxyAdminTransactor(address common.Address, transactor bind.ContractTransactor) (*IProxyAdminTransactor, error)
⋮----
// NewIProxyAdminFilterer creates a new log filterer instance of IProxyAdmin, bound to a specific deployed contract.
func NewIProxyAdminFilterer(address common.Address, filterer bind.ContractFilterer) (*IProxyAdminFilterer, error)
⋮----
// bindIProxyAdmin binds a generic wrapper to an already deployed contract.
func bindIProxyAdmin(address common.Address, caller bind.ContractCaller, transactor bind.ContractTransactor, filterer bind.ContractFilterer) (*bind.BoundContract, error)
⋮----
// 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 (_IProxyAdmin *IProxyAdminRaw) Call(opts *bind.CallOpts, result *[]interface
⋮----
// Transfer initiates a plain transaction to move funds to the contract, calling
// its default method if one is available.
func (_IProxyAdmin *IProxyAdminRaw) Transfer(opts *bind.TransactOpts) (*types.Transaction, error)
⋮----
// Transact invokes the (paid) contract method with params as input values.
func (_IProxyAdmin *IProxyAdminRaw) Transact(opts *bind.TransactOpts, method string, params ...interface
⋮----
// GetProxyAdmin is a free data retrieval call binding the contract method 0xf3b7dead.
//
// Solidity: function getProxyAdmin(address proxy) view returns(address)
func (_IProxyAdmin *IProxyAdminCaller) GetProxyAdmin(opts *bind.CallOpts, proxy common.Address) (common.Address, error)
⋮----
var out []interface{}
⋮----
// GetProxyImplementation is a free data retrieval call binding the contract method 0x204e1c7a.
⋮----
// Solidity: function getProxyImplementation(address proxy) view returns(address)
func (_IProxyAdmin *IProxyAdminCaller) GetProxyImplementation(opts *bind.CallOpts, proxy common.Address) (common.Address, error)
⋮----
// ChangeProxyAdmin is a paid mutator transaction binding the contract method 0x7eff275e.
⋮----
// Solidity: function changeProxyAdmin(address proxy, address newAdmin) returns()
func (_IProxyAdmin *IProxyAdminTransactor) ChangeProxyAdmin(opts *bind.TransactOpts, proxy common.Address, newAdmin common.Address) (*types.Transaction, error)
⋮----
// Upgrade is a paid mutator transaction binding the contract method 0x99a88ec4.
⋮----
// Solidity: function upgrade(address proxy, address implementation) returns()
func (_IProxyAdmin *IProxyAdminTransactor) Upgrade(opts *bind.TransactOpts, proxy common.Address, implementation common.Address) (*types.Transaction, error)
⋮----
// UpgradeAndCall is a paid mutator transaction binding the contract method 0x9623609d.
⋮----
// Solidity: function upgradeAndCall(address proxy, address implementation, bytes data) payable returns()
func (_IProxyAdmin *IProxyAdminTransactor) UpgradeAndCall(opts *bind.TransactOpts, proxy common.Address, implementation common.Address, data []byte) (*types.Transaction, error)
````

## File: pkg/bindings/IReleaseManager/binding.go
````go
// Code generated - DO NOT EDIT.
// This file is a generated binding and any manual changes will be lost.
⋮----
package IReleaseManager
⋮----
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"
)
⋮----
"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
)
⋮----
// IReleaseManagerTypesArtifact is an auto generated low-level Go binding around an user-defined struct.
type IReleaseManagerTypesArtifact struct {
	Digest   [32]byte
	Registry string
}
⋮----
// IReleaseManagerTypesRelease is an auto generated low-level Go binding around an user-defined struct.
type IReleaseManagerTypesRelease struct {
	Artifacts     []IReleaseManagerTypesArtifact
	UpgradeByTime uint32
}
⋮----
// OperatorSet is an auto generated low-level Go binding around an user-defined struct.
type OperatorSet struct {
	Avs common.Address
	Id  uint32
}
⋮----
// IReleaseManagerMetaData contains all meta data concerning the IReleaseManager contract.
var IReleaseManagerMetaData = &bind.MetaData{
	ABI: "[{\"type\":\"function\",\"name\":\"getLatestRelease\",\"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\"},{\"name\":\"\",\"type\":\"tuple\",\"internalType\":\"structIReleaseManagerTypes.Release\",\"components\":[{\"name\":\"artifacts\",\"type\":\"tuple[]\",\"internalType\":\"structIReleaseManagerTypes.Artifact[]\",\"components\":[{\"name\":\"digest\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"registry\",\"type\":\"string\",\"internalType\":\"string\"}]},{\"name\":\"upgradeByTime\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getLatestUpgradeByTime\",\"inputs\":[{\"name\":\"operatorSet\",\"type\":\"tuple\",\"internalType\":\"structOperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]}],\"outputs\":[{\"name\":\"\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getMetadataURI\",\"inputs\":[{\"name\":\"operatorSet\",\"type\":\"tuple\",\"internalType\":\"structOperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]}],\"outputs\":[{\"name\":\"\",\"type\":\"string\",\"internalType\":\"string\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getRelease\",\"inputs\":[{\"name\":\"operatorSet\",\"type\":\"tuple\",\"internalType\":\"structOperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]},{\"name\":\"releaseId\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"tuple\",\"internalType\":\"structIReleaseManagerTypes.Release\",\"components\":[{\"name\":\"artifacts\",\"type\":\"tuple[]\",\"internalType\":\"structIReleaseManagerTypes.Artifact[]\",\"components\":[{\"name\":\"digest\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"registry\",\"type\":\"string\",\"internalType\":\"string\"}]},{\"name\":\"upgradeByTime\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getTotalReleases\",\"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\":\"isValidRelease\",\"inputs\":[{\"name\":\"operatorSet\",\"type\":\"tuple\",\"internalType\":\"structOperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]},{\"name\":\"releaseId\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"publishMetadataURI\",\"inputs\":[{\"name\":\"operatorSet\",\"type\":\"tuple\",\"internalType\":\"structOperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]},{\"name\":\"metadataURI\",\"type\":\"string\",\"internalType\":\"string\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"publishRelease\",\"inputs\":[{\"name\":\"operatorSet\",\"type\":\"tuple\",\"internalType\":\"structOperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]},{\"name\":\"release\",\"type\":\"tuple\",\"internalType\":\"structIReleaseManagerTypes.Release\",\"components\":[{\"name\":\"artifacts\",\"type\":\"tuple[]\",\"internalType\":\"structIReleaseManagerTypes.Artifact[]\",\"components\":[{\"name\":\"digest\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"registry\",\"type\":\"string\",\"internalType\":\"string\"}]},{\"name\":\"upgradeByTime\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]}],\"outputs\":[{\"name\":\"releaseId\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"event\",\"name\":\"MetadataURIPublished\",\"inputs\":[{\"name\":\"operatorSet\",\"type\":\"tuple\",\"indexed\":true,\"internalType\":\"structOperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]},{\"name\":\"metadataURI\",\"type\":\"string\",\"indexed\":false,\"internalType\":\"string\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ReleasePublished\",\"inputs\":[{\"name\":\"operatorSet\",\"type\":\"tuple\",\"indexed\":true,\"internalType\":\"structOperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]},{\"name\":\"releaseId\",\"type\":\"uint256\",\"indexed\":true,\"internalType\":\"uint256\"},{\"name\":\"release\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structIReleaseManagerTypes.Release\",\"components\":[{\"name\":\"artifacts\",\"type\":\"tuple[]\",\"internalType\":\"structIReleaseManagerTypes.Artifact[]\",\"components\":[{\"name\":\"digest\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"registry\",\"type\":\"string\",\"internalType\":\"string\"}]},{\"name\":\"upgradeByTime\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]}],\"anonymous\":false},{\"type\":\"error\",\"name\":\"InvalidMetadataURI\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidUpgradeByTime\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"MustPublishMetadataURI\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"NoReleases\",\"inputs\":[]}]",
}
⋮----
// IReleaseManagerABI is the input ABI used to generate the binding from.
// Deprecated: Use IReleaseManagerMetaData.ABI instead.
var IReleaseManagerABI = IReleaseManagerMetaData.ABI
⋮----
// IReleaseManager is an auto generated Go binding around an Ethereum contract.
type IReleaseManager struct {
	IReleaseManagerCaller     // Read-only binding to the contract
	IReleaseManagerTransactor // Write-only binding to the contract
	IReleaseManagerFilterer   // Log filterer for contract events
}
⋮----
IReleaseManagerCaller     // Read-only binding to the contract
IReleaseManagerTransactor // Write-only binding to the contract
IReleaseManagerFilterer   // Log filterer for contract events
⋮----
// IReleaseManagerCaller is an auto generated read-only Go binding around an Ethereum contract.
type IReleaseManagerCaller struct {
	contract *bind.BoundContract // Generic contract wrapper for the low level calls
}
⋮----
contract *bind.BoundContract // Generic contract wrapper for the low level calls
⋮----
// IReleaseManagerTransactor is an auto generated write-only Go binding around an Ethereum contract.
type IReleaseManagerTransactor struct {
	contract *bind.BoundContract // Generic contract wrapper for the low level calls
}
⋮----
// IReleaseManagerFilterer is an auto generated log filtering Go binding around an Ethereum contract events.
type IReleaseManagerFilterer struct {
	contract *bind.BoundContract // Generic contract wrapper for the low level calls
}
⋮----
// IReleaseManagerSession is an auto generated Go binding around an Ethereum contract,
// with pre-set call and transact options.
type IReleaseManagerSession struct {
	Contract     *IReleaseManager  // 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
}
⋮----
Contract     *IReleaseManager  // 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
⋮----
// IReleaseManagerCallerSession is an auto generated read-only Go binding around an Ethereum contract,
// with pre-set call options.
type IReleaseManagerCallerSession struct {
	Contract *IReleaseManagerCaller // Generic contract caller binding to set the session for
	CallOpts bind.CallOpts          // Call options to use throughout this session
}
⋮----
Contract *IReleaseManagerCaller // Generic contract caller binding to set the session for
CallOpts bind.CallOpts          // Call options to use throughout this session
⋮----
// IReleaseManagerTransactorSession is an auto generated write-only Go binding around an Ethereum contract,
// with pre-set transact options.
type IReleaseManagerTransactorSession struct {
	Contract     *IReleaseManagerTransactor // Generic contract transactor binding to set the session for
	TransactOpts bind.TransactOpts          // Transaction auth options to use throughout this session
}
⋮----
Contract     *IReleaseManagerTransactor // Generic contract transactor binding to set the session for
TransactOpts bind.TransactOpts          // Transaction auth options to use throughout this session
⋮----
// IReleaseManagerRaw is an auto generated low-level Go binding around an Ethereum contract.
type IReleaseManagerRaw struct {
	Contract *IReleaseManager // Generic contract binding to access the raw methods on
}
⋮----
Contract *IReleaseManager // Generic contract binding to access the raw methods on
⋮----
// IReleaseManagerCallerRaw is an auto generated low-level read-only Go binding around an Ethereum contract.
type IReleaseManagerCallerRaw struct {
	Contract *IReleaseManagerCaller // Generic read-only contract binding to access the raw methods on
}
⋮----
Contract *IReleaseManagerCaller // Generic read-only contract binding to access the raw methods on
⋮----
// IReleaseManagerTransactorRaw is an auto generated low-level write-only Go binding around an Ethereum contract.
type IReleaseManagerTransactorRaw struct {
	Contract *IReleaseManagerTransactor // Generic write-only contract binding to access the raw methods on
}
⋮----
Contract *IReleaseManagerTransactor // Generic write-only contract binding to access the raw methods on
⋮----
// NewIReleaseManager creates a new instance of IReleaseManager, bound to a specific deployed contract.
func NewIReleaseManager(address common.Address, backend bind.ContractBackend) (*IReleaseManager, error)
⋮----
// NewIReleaseManagerCaller creates a new read-only instance of IReleaseManager, bound to a specific deployed contract.
func NewIReleaseManagerCaller(address common.Address, caller bind.ContractCaller) (*IReleaseManagerCaller, error)
⋮----
// NewIReleaseManagerTransactor creates a new write-only instance of IReleaseManager, bound to a specific deployed contract.
func NewIReleaseManagerTransactor(address common.Address, transactor bind.ContractTransactor) (*IReleaseManagerTransactor, error)
⋮----
// NewIReleaseManagerFilterer creates a new log filterer instance of IReleaseManager, bound to a specific deployed contract.
func NewIReleaseManagerFilterer(address common.Address, filterer bind.ContractFilterer) (*IReleaseManagerFilterer, error)
⋮----
// bindIReleaseManager binds a generic wrapper to an already deployed contract.
func bindIReleaseManager(address common.Address, caller bind.ContractCaller, transactor bind.ContractTransactor, filterer bind.ContractFilterer) (*bind.BoundContract, error)
⋮----
// 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 (_IReleaseManager *IReleaseManagerRaw) Call(opts *bind.CallOpts, result *[]interface
⋮----
// Transfer initiates a plain transaction to move funds to the contract, calling
// its default method if one is available.
func (_IReleaseManager *IReleaseManagerRaw) Transfer(opts *bind.TransactOpts) (*types.Transaction, error)
⋮----
// Transact invokes the (paid) contract method with params as input values.
func (_IReleaseManager *IReleaseManagerRaw) Transact(opts *bind.TransactOpts, method string, params ...interface
⋮----
// GetLatestRelease is a free data retrieval call binding the contract method 0xd30eeb88.
//
// Solidity: function getLatestRelease((address,uint32) operatorSet) view returns(uint256, ((bytes32,string)[],uint32))
func (_IReleaseManager *IReleaseManagerCaller) GetLatestRelease(opts *bind.CallOpts, operatorSet OperatorSet) (*big.Int, IReleaseManagerTypesRelease, error)
⋮----
var out []interface{}
⋮----
// GetLatestUpgradeByTime is a free data retrieval call binding the contract method 0xa9e0ed68.
⋮----
// Solidity: function getLatestUpgradeByTime((address,uint32) operatorSet) view returns(uint32)
func (_IReleaseManager *IReleaseManagerCaller) GetLatestUpgradeByTime(opts *bind.CallOpts, operatorSet OperatorSet) (uint32, error)
⋮----
// GetMetadataURI is a free data retrieval call binding the contract method 0xb053b56d.
⋮----
// Solidity: function getMetadataURI((address,uint32) operatorSet) view returns(string)
func (_IReleaseManager *IReleaseManagerCaller) GetMetadataURI(opts *bind.CallOpts, operatorSet OperatorSet) (string, error)
⋮----
// GetRelease is a free data retrieval call binding the contract method 0x3acab5fc.
⋮----
// Solidity: function getRelease((address,uint32) operatorSet, uint256 releaseId) view returns(((bytes32,string)[],uint32))
func (_IReleaseManager *IReleaseManagerCaller) GetRelease(opts *bind.CallOpts, operatorSet OperatorSet, releaseId *big.Int) (IReleaseManagerTypesRelease, error)
⋮----
// GetTotalReleases is a free data retrieval call binding the contract method 0x66f409f7.
⋮----
// Solidity: function getTotalReleases((address,uint32) operatorSet) view returns(uint256)
func (_IReleaseManager *IReleaseManagerCaller) GetTotalReleases(opts *bind.CallOpts, operatorSet OperatorSet) (*big.Int, error)
⋮----
// IsValidRelease is a free data retrieval call binding the contract method 0x517e4068.
⋮----
// Solidity: function isValidRelease((address,uint32) operatorSet, uint256 releaseId) view returns(bool)
func (_IReleaseManager *IReleaseManagerCaller) IsValidRelease(opts *bind.CallOpts, operatorSet OperatorSet, releaseId *big.Int) (bool, error)
⋮----
// PublishMetadataURI is a paid mutator transaction binding the contract method 0x4840a67c.
⋮----
// Solidity: function publishMetadataURI((address,uint32) operatorSet, string metadataURI) returns()
func (_IReleaseManager *IReleaseManagerTransactor) PublishMetadataURI(opts *bind.TransactOpts, operatorSet OperatorSet, metadataURI string) (*types.Transaction, error)
⋮----
// PublishRelease is a paid mutator transaction binding the contract method 0x7c09ea82.
⋮----
// Solidity: function publishRelease((address,uint32) operatorSet, ((bytes32,string)[],uint32) release) returns(uint256 releaseId)
func (_IReleaseManager *IReleaseManagerTransactor) PublishRelease(opts *bind.TransactOpts, operatorSet OperatorSet, release IReleaseManagerTypesRelease) (*types.Transaction, error)
⋮----
// IReleaseManagerMetadataURIPublishedIterator is returned from FilterMetadataURIPublished and is used to iterate over the raw logs and unpacked data for MetadataURIPublished events raised by the IReleaseManager contract.
type IReleaseManagerMetadataURIPublishedIterator struct {
	Event *IReleaseManagerMetadataURIPublished // 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
}
⋮----
Event *IReleaseManagerMetadataURIPublished // 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 *IReleaseManagerMetadataURIPublishedIterator) Next() bool
⋮----
// If the iterator failed, stop iterating
⋮----
// If the iterator completed, deliver directly whatever's available
⋮----
// Iterator still in progress, wait for either a data or an error event
⋮----
// Error returns any retrieval or parsing error occurred during filtering.
func (it *IReleaseManagerMetadataURIPublishedIterator) Error() error
⋮----
// Close terminates the iteration process, releasing any pending underlying
// resources.
func (it *IReleaseManagerMetadataURIPublishedIterator) Close() error
⋮----
// IReleaseManagerMetadataURIPublished represents a MetadataURIPublished event raised by the IReleaseManager contract.
type IReleaseManagerMetadataURIPublished struct {
	OperatorSet OperatorSet
	MetadataURI string
	Raw         types.Log // Blockchain specific contextual infos
}
⋮----
Raw         types.Log // Blockchain specific contextual infos
⋮----
// FilterMetadataURIPublished is a free log retrieval operation binding the contract event 0x209e95fbe8dd14c5e1fbf791ee0a83234f45f20cb85504c7068d5ca0d6224588.
⋮----
// Solidity: event MetadataURIPublished((address,uint32) indexed operatorSet, string metadataURI)
func (_IReleaseManager *IReleaseManagerFilterer) FilterMetadataURIPublished(opts *bind.FilterOpts, operatorSet []OperatorSet) (*IReleaseManagerMetadataURIPublishedIterator, error)
⋮----
var operatorSetRule []interface{}
⋮----
// WatchMetadataURIPublished is a free log subscription operation binding the contract event 0x209e95fbe8dd14c5e1fbf791ee0a83234f45f20cb85504c7068d5ca0d6224588.
⋮----
func (_IReleaseManager *IReleaseManagerFilterer) WatchMetadataURIPublished(opts *bind.WatchOpts, sink chan<- *IReleaseManagerMetadataURIPublished, operatorSet []OperatorSet) (event.Subscription, error)
⋮----
// New log arrived, parse the event and forward to the user
⋮----
// ParseMetadataURIPublished is a log parse operation binding the contract event 0x209e95fbe8dd14c5e1fbf791ee0a83234f45f20cb85504c7068d5ca0d6224588.
⋮----
func (_IReleaseManager *IReleaseManagerFilterer) ParseMetadataURIPublished(log types.Log) (*IReleaseManagerMetadataURIPublished, error)
⋮----
// IReleaseManagerReleasePublishedIterator is returned from FilterReleasePublished and is used to iterate over the raw logs and unpacked data for ReleasePublished events raised by the IReleaseManager contract.
type IReleaseManagerReleasePublishedIterator struct {
	Event *IReleaseManagerReleasePublished // 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
}
⋮----
Event *IReleaseManagerReleasePublished // Event containing the contract specifics and raw log
⋮----
// IReleaseManagerReleasePublished represents a ReleasePublished event raised by the IReleaseManager contract.
type IReleaseManagerReleasePublished struct {
	OperatorSet OperatorSet
	ReleaseId   *big.Int
	Release     IReleaseManagerTypesRelease
	Raw         types.Log // Blockchain specific contextual infos
}
⋮----
// FilterReleasePublished is a free log retrieval operation binding the contract event 0x2decd15222f7c4a8c3d4d2e14dcfdc5a0b52eb2d4b81796bfd010ee5cd972fd3.
⋮----
// Solidity: event ReleasePublished((address,uint32) indexed operatorSet, uint256 indexed releaseId, ((bytes32,string)[],uint32) release)
func (_IReleaseManager *IReleaseManagerFilterer) FilterReleasePublished(opts *bind.FilterOpts, operatorSet []OperatorSet, releaseId []*big.Int) (*IReleaseManagerReleasePublishedIterator, error)
⋮----
var releaseIdRule []interface{}
⋮----
// WatchReleasePublished is a free log subscription operation binding the contract event 0x2decd15222f7c4a8c3d4d2e14dcfdc5a0b52eb2d4b81796bfd010ee5cd972fd3.
⋮----
func (_IReleaseManager *IReleaseManagerFilterer) WatchReleasePublished(opts *bind.WatchOpts, sink chan<- *IReleaseManagerReleasePublished, operatorSet []OperatorSet, releaseId []*big.Int) (event.Subscription, error)
⋮----
// ParseReleasePublished is a log parse operation binding the contract event 0x2decd15222f7c4a8c3d4d2e14dcfdc5a0b52eb2d4b81796bfd010ee5cd972fd3.
⋮----
func (_IReleaseManager *IReleaseManagerFilterer) ParseReleasePublished(log types.Log) (*IReleaseManagerReleasePublished, error)
````

## File: pkg/bindings/IRewardsCoordinator/binding.go
````go
// Code generated - DO NOT EDIT.
// This file is a generated binding and any manual changes will be lost.
⋮----
package IRewardsCoordinator
⋮----
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"
)
⋮----
"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
)
⋮----
// IRewardsCoordinatorTypesDistributionRoot is an auto generated low-level Go binding around an user-defined struct.
type IRewardsCoordinatorTypesDistributionRoot struct {
	Root                           [32]byte
	RewardsCalculationEndTimestamp uint32
	ActivatedAt                    uint32
	Disabled                       bool
}
⋮----
// IRewardsCoordinatorTypesEarnerTreeMerkleLeaf is an auto generated low-level Go binding around an user-defined struct.
type IRewardsCoordinatorTypesEarnerTreeMerkleLeaf struct {
	Earner          common.Address
	EarnerTokenRoot [32]byte
}
⋮----
// IRewardsCoordinatorTypesOperatorDirectedRewardsSubmission is an auto generated low-level Go binding around an user-defined struct.
type IRewardsCoordinatorTypesOperatorDirectedRewardsSubmission struct {
	StrategiesAndMultipliers []IRewardsCoordinatorTypesStrategyAndMultiplier
	Token                    common.Address
	OperatorRewards          []IRewardsCoordinatorTypesOperatorReward
	StartTimestamp           uint32
	Duration                 uint32
	Description              string
}
⋮----
// IRewardsCoordinatorTypesOperatorReward is an auto generated low-level Go binding around an user-defined struct.
type IRewardsCoordinatorTypesOperatorReward struct {
	Operator common.Address
	Amount   *big.Int
}
⋮----
// IRewardsCoordinatorTypesRewardsMerkleClaim is an auto generated low-level Go binding around an user-defined struct.
type IRewardsCoordinatorTypesRewardsMerkleClaim struct {
	RootIndex       uint32
	EarnerIndex     uint32
	EarnerTreeProof []byte
	EarnerLeaf      IRewardsCoordinatorTypesEarnerTreeMerkleLeaf
	TokenIndices    []uint32
	TokenTreeProofs [][]byte
	TokenLeaves     []IRewardsCoordinatorTypesTokenTreeMerkleLeaf
}
⋮----
// IRewardsCoordinatorTypesRewardsSubmission is an auto generated low-level Go binding around an user-defined struct.
type IRewardsCoordinatorTypesRewardsSubmission struct {
	StrategiesAndMultipliers []IRewardsCoordinatorTypesStrategyAndMultiplier
	Token                    common.Address
	Amount                   *big.Int
	StartTimestamp           uint32
	Duration                 uint32
}
⋮----
// IRewardsCoordinatorTypesStrategyAndMultiplier is an auto generated low-level Go binding around an user-defined struct.
type IRewardsCoordinatorTypesStrategyAndMultiplier struct {
	Strategy   common.Address
	Multiplier *big.Int
}
⋮----
// IRewardsCoordinatorTypesTokenTreeMerkleLeaf is an auto generated low-level Go binding around an user-defined struct.
type IRewardsCoordinatorTypesTokenTreeMerkleLeaf struct {
	Token              common.Address
	CumulativeEarnings *big.Int
}
⋮----
// OperatorSet is an auto generated low-level Go binding around an user-defined struct.
type OperatorSet struct {
	Avs common.Address
	Id  uint32
}
⋮----
// 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\":\"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.
// Deprecated: Use IRewardsCoordinatorMetaData.ABI instead.
var IRewardsCoordinatorABI = IRewardsCoordinatorMetaData.ABI
⋮----
// IRewardsCoordinator is an auto generated Go binding around an Ethereum contract.
type IRewardsCoordinator struct {
	IRewardsCoordinatorCaller     // Read-only binding to the contract
	IRewardsCoordinatorTransactor // Write-only binding to the contract
	IRewardsCoordinatorFilterer   // Log filterer for contract events
}
⋮----
IRewardsCoordinatorCaller     // Read-only binding to the contract
IRewardsCoordinatorTransactor // Write-only binding to the contract
IRewardsCoordinatorFilterer   // Log filterer for contract events
⋮----
// IRewardsCoordinatorCaller is an auto generated read-only Go binding around an Ethereum contract.
type IRewardsCoordinatorCaller struct {
	contract *bind.BoundContract // Generic contract wrapper for the low level calls
}
⋮----
contract *bind.BoundContract // Generic contract wrapper for the low level calls
⋮----
// IRewardsCoordinatorTransactor is an auto generated write-only Go binding around an Ethereum contract.
type IRewardsCoordinatorTransactor struct {
	contract *bind.BoundContract // Generic contract wrapper for the low level calls
}
⋮----
// IRewardsCoordinatorFilterer is an auto generated log filtering Go binding around an Ethereum contract events.
type IRewardsCoordinatorFilterer struct {
	contract *bind.BoundContract // Generic contract wrapper for the low level calls
}
⋮----
// IRewardsCoordinatorSession is an auto generated Go binding around an Ethereum contract,
// with pre-set call and transact options.
type IRewardsCoordinatorSession struct {
	Contract     *IRewardsCoordinator // 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
}
⋮----
Contract     *IRewardsCoordinator // 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
⋮----
// IRewardsCoordinatorCallerSession is an auto generated read-only Go binding around an Ethereum contract,
// with pre-set call options.
type IRewardsCoordinatorCallerSession struct {
	Contract *IRewardsCoordinatorCaller // Generic contract caller binding to set the session for
	CallOpts bind.CallOpts              // Call options to use throughout this session
}
⋮----
Contract *IRewardsCoordinatorCaller // Generic contract caller binding to set the session for
CallOpts bind.CallOpts              // Call options to use throughout this session
⋮----
// IRewardsCoordinatorTransactorSession is an auto generated write-only Go binding around an Ethereum contract,
// with pre-set transact options.
type IRewardsCoordinatorTransactorSession struct {
	Contract     *IRewardsCoordinatorTransactor // Generic contract transactor binding to set the session for
	TransactOpts bind.TransactOpts              // Transaction auth options to use throughout this session
}
⋮----
Contract     *IRewardsCoordinatorTransactor // Generic contract transactor binding to set the session for
TransactOpts bind.TransactOpts              // Transaction auth options to use throughout this session
⋮----
// IRewardsCoordinatorRaw is an auto generated low-level Go binding around an Ethereum contract.
type IRewardsCoordinatorRaw struct {
	Contract *IRewardsCoordinator // Generic contract binding to access the raw methods on
}
⋮----
Contract *IRewardsCoordinator // Generic contract binding to access the raw methods on
⋮----
// IRewardsCoordinatorCallerRaw is an auto generated low-level read-only Go binding around an Ethereum contract.
type IRewardsCoordinatorCallerRaw struct {
	Contract *IRewardsCoordinatorCaller // Generic read-only contract binding to access the raw methods on
}
⋮----
Contract *IRewardsCoordinatorCaller // Generic read-only contract binding to access the raw methods on
⋮----
// IRewardsCoordinatorTransactorRaw is an auto generated low-level write-only Go binding around an Ethereum contract.
type IRewardsCoordinatorTransactorRaw struct {
	Contract *IRewardsCoordinatorTransactor // Generic write-only contract binding to access the raw methods on
}
⋮----
Contract *IRewardsCoordinatorTransactor // Generic write-only contract binding to access the raw methods on
⋮----
// NewIRewardsCoordinator creates a new instance of IRewardsCoordinator, bound to a specific deployed contract.
func NewIRewardsCoordinator(address common.Address, backend bind.ContractBackend) (*IRewardsCoordinator, error)
⋮----
// NewIRewardsCoordinatorCaller creates a new read-only instance of IRewardsCoordinator, bound to a specific deployed contract.
func NewIRewardsCoordinatorCaller(address common.Address, caller bind.ContractCaller) (*IRewardsCoordinatorCaller, error)
⋮----
// NewIRewardsCoordinatorTransactor creates a new write-only instance of IRewardsCoordinator, bound to a specific deployed contract.
func NewIRewardsCoordinatorTransactor(address common.Address, transactor bind.ContractTransactor) (*IRewardsCoordinatorTransactor, error)
⋮----
// NewIRewardsCoordinatorFilterer creates a new log filterer instance of IRewardsCoordinator, bound to a specific deployed contract.
func NewIRewardsCoordinatorFilterer(address common.Address, filterer bind.ContractFilterer) (*IRewardsCoordinatorFilterer, error)
⋮----
// bindIRewardsCoordinator binds a generic wrapper to an already deployed contract.
func bindIRewardsCoordinator(address common.Address, caller bind.ContractCaller, transactor bind.ContractTransactor, filterer bind.ContractFilterer) (*bind.BoundContract, error)
⋮----
// 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 (_IRewardsCoordinator *IRewardsCoordinatorRaw) Call(opts *bind.CallOpts, result *[]interface
⋮----
// Transfer initiates a plain transaction to move funds to the contract, calling
// its default method if one is available.
func (_IRewardsCoordinator *IRewardsCoordinatorRaw) Transfer(opts *bind.TransactOpts) (*types.Transaction, error)
⋮----
// Transact invokes the (paid) contract method with params as input values.
func (_IRewardsCoordinator *IRewardsCoordinatorRaw) Transact(opts *bind.TransactOpts, method string, params ...interface
⋮----
// CALCULATIONINTERVALSECONDS is a free data retrieval call binding the contract method 0x9d45c281.
//
// Solidity: function CALCULATION_INTERVAL_SECONDS() view returns(uint32)
func (_IRewardsCoordinator *IRewardsCoordinatorCaller) CALCULATIONINTERVALSECONDS(opts *bind.CallOpts) (uint32, error)
⋮----
var out []interface{}
⋮----
// GENESISREWARDSTIMESTAMP is a free data retrieval call binding the contract method 0x131433b4.
⋮----
// Solidity: function GENESIS_REWARDS_TIMESTAMP() view returns(uint32)
func (_IRewardsCoordinator *IRewardsCoordinatorCaller) GENESISREWARDSTIMESTAMP(opts *bind.CallOpts) (uint32, error)
⋮----
// MAXFUTURELENGTH is a free data retrieval call binding the contract method 0x04a0c502.
⋮----
// Solidity: function MAX_FUTURE_LENGTH() view returns(uint32)
func (_IRewardsCoordinator *IRewardsCoordinatorCaller) MAXFUTURELENGTH(opts *bind.CallOpts) (uint32, error)
⋮----
// MAXRETROACTIVELENGTH is a free data retrieval call binding the contract method 0x37838ed0.
⋮----
// Solidity: function MAX_RETROACTIVE_LENGTH() view returns(uint32)
func (_IRewardsCoordinator *IRewardsCoordinatorCaller) MAXRETROACTIVELENGTH(opts *bind.CallOpts) (uint32, error)
⋮----
// MAXREWARDSDURATION is a free data retrieval call binding the contract method 0xbf21a8aa.
⋮----
// Solidity: function MAX_REWARDS_DURATION() view returns(uint32)
func (_IRewardsCoordinator *IRewardsCoordinatorCaller) MAXREWARDSDURATION(opts *bind.CallOpts) (uint32, error)
⋮----
// ActivationDelay is a free data retrieval call binding the contract method 0x3a8c0786.
⋮----
// Solidity: function activationDelay() view returns(uint32)
func (_IRewardsCoordinator *IRewardsCoordinatorCaller) ActivationDelay(opts *bind.CallOpts) (uint32, error)
⋮----
// CalculateEarnerLeafHash is a free data retrieval call binding the contract method 0x149bc872.
⋮----
// Solidity: function calculateEarnerLeafHash((address,bytes32) leaf) pure returns(bytes32)
func (_IRewardsCoordinator *IRewardsCoordinatorCaller) CalculateEarnerLeafHash(opts *bind.CallOpts, leaf IRewardsCoordinatorTypesEarnerTreeMerkleLeaf) ([32]byte, error)
⋮----
// CalculateTokenLeafHash is a free data retrieval call binding the contract method 0xf8cd8448.
⋮----
// Solidity: function calculateTokenLeafHash((address,uint256) leaf) pure returns(bytes32)
func (_IRewardsCoordinator *IRewardsCoordinatorCaller) CalculateTokenLeafHash(opts *bind.CallOpts, leaf IRewardsCoordinatorTypesTokenTreeMerkleLeaf) ([32]byte, error)
⋮----
// CheckClaim is a free data retrieval call binding the contract method 0x5e9d8348.
⋮----
// Solidity: function checkClaim((uint32,uint32,bytes,(address,bytes32),uint32[],bytes[],(address,uint256)[]) claim) view returns(bool)
func (_IRewardsCoordinator *IRewardsCoordinatorCaller) CheckClaim(opts *bind.CallOpts, claim IRewardsCoordinatorTypesRewardsMerkleClaim) (bool, error)
⋮----
// ClaimerFor is a free data retrieval call binding the contract method 0x2b9f64a4.
⋮----
// Solidity: function claimerFor(address earner) view returns(address)
func (_IRewardsCoordinator *IRewardsCoordinatorCaller) ClaimerFor(opts *bind.CallOpts, earner common.Address) (common.Address, error)
⋮----
// CumulativeClaimed is a free data retrieval call binding the contract method 0x865c6953.
⋮----
// Solidity: function cumulativeClaimed(address claimer, address token) view returns(uint256)
func (_IRewardsCoordinator *IRewardsCoordinatorCaller) CumulativeClaimed(opts *bind.CallOpts, claimer common.Address, token common.Address) (*big.Int, error)
⋮----
// CurrRewardsCalculationEndTimestamp is a free data retrieval call binding the contract method 0x4d18cc35.
⋮----
// Solidity: function currRewardsCalculationEndTimestamp() view returns(uint32)
func (_IRewardsCoordinator *IRewardsCoordinatorCaller) CurrRewardsCalculationEndTimestamp(opts *bind.CallOpts) (uint32, error)
⋮----
// DefaultOperatorSplitBips is a free data retrieval call binding the contract method 0x63f6a798.
⋮----
// Solidity: function defaultOperatorSplitBips() view returns(uint16)
func (_IRewardsCoordinator *IRewardsCoordinatorCaller) DefaultOperatorSplitBips(opts *bind.CallOpts) (uint16, error)
⋮----
// GetCurrentClaimableDistributionRoot is a free data retrieval call binding the contract method 0x0e9a53cf.
⋮----
// Solidity: function getCurrentClaimableDistributionRoot() view returns((bytes32,uint32,uint32,bool))
func (_IRewardsCoordinator *IRewardsCoordinatorCaller) GetCurrentClaimableDistributionRoot(opts *bind.CallOpts) (IRewardsCoordinatorTypesDistributionRoot, error)
⋮----
// GetCurrentDistributionRoot is a free data retrieval call binding the contract method 0x9be3d4e4.
⋮----
// Solidity: function getCurrentDistributionRoot() view returns((bytes32,uint32,uint32,bool))
func (_IRewardsCoordinator *IRewardsCoordinatorCaller) GetCurrentDistributionRoot(opts *bind.CallOpts) (IRewardsCoordinatorTypesDistributionRoot, error)
⋮----
// GetDistributionRootAtIndex is a free data retrieval call binding the contract method 0xde02e503.
⋮----
// Solidity: function getDistributionRootAtIndex(uint256 index) view returns((bytes32,uint32,uint32,bool))
func (_IRewardsCoordinator *IRewardsCoordinatorCaller) GetDistributionRootAtIndex(opts *bind.CallOpts, index *big.Int) (IRewardsCoordinatorTypesDistributionRoot, error)
⋮----
// GetDistributionRootsLength is a free data retrieval call binding the contract method 0x7b8f8b05.
⋮----
// Solidity: function getDistributionRootsLength() view returns(uint256)
func (_IRewardsCoordinator *IRewardsCoordinatorCaller) GetDistributionRootsLength(opts *bind.CallOpts) (*big.Int, error)
⋮----
// GetOperatorAVSSplit is a free data retrieval call binding the contract method 0xe063f81f.
⋮----
// Solidity: function getOperatorAVSSplit(address operator, address avs) view returns(uint16)
func (_IRewardsCoordinator *IRewardsCoordinatorCaller) GetOperatorAVSSplit(opts *bind.CallOpts, operator common.Address, avs common.Address) (uint16, error)
⋮----
// GetOperatorPISplit is a free data retrieval call binding the contract method 0x4b943960.
⋮----
// Solidity: function getOperatorPISplit(address operator) view returns(uint16)
func (_IRewardsCoordinator *IRewardsCoordinatorCaller) GetOperatorPISplit(opts *bind.CallOpts, operator common.Address) (uint16, error)
⋮----
// GetOperatorSetSplit is a free data retrieval call binding the contract method 0x9de4b35f.
⋮----
// Solidity: function getOperatorSetSplit(address operator, (address,uint32) operatorSet) view returns(uint16)
func (_IRewardsCoordinator *IRewardsCoordinatorCaller) GetOperatorSetSplit(opts *bind.CallOpts, operator common.Address, operatorSet OperatorSet) (uint16, error)
⋮----
// GetRootIndexFromHash is a free data retrieval call binding the contract method 0xe810ce21.
⋮----
// Solidity: function getRootIndexFromHash(bytes32 rootHash) view returns(uint32)
func (_IRewardsCoordinator *IRewardsCoordinatorCaller) GetRootIndexFromHash(opts *bind.CallOpts, rootHash [32]byte) (uint32, error)
⋮----
// RewardsUpdater is a free data retrieval call binding the contract method 0xfbf1e2c1.
⋮----
// Solidity: function rewardsUpdater() view returns(address)
func (_IRewardsCoordinator *IRewardsCoordinatorCaller) RewardsUpdater(opts *bind.CallOpts) (common.Address, error)
⋮----
// CreateAVSRewardsSubmission is a paid mutator transaction binding the contract method 0xfce36c7d.
⋮----
// Solidity: function createAVSRewardsSubmission(((address,uint96)[],address,uint256,uint32,uint32)[] rewardsSubmissions) returns()
func (_IRewardsCoordinator *IRewardsCoordinatorTransactor) CreateAVSRewardsSubmission(opts *bind.TransactOpts, rewardsSubmissions []IRewardsCoordinatorTypesRewardsSubmission) (*types.Transaction, error)
⋮----
// 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)
⋮----
// 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()
func (_IRewardsCoordinator *IRewardsCoordinatorTransactor) CreateOperatorDirectedAVSRewardsSubmission(opts *bind.TransactOpts, avs common.Address, operatorDirectedRewardsSubmissions []IRewardsCoordinatorTypesOperatorDirectedRewardsSubmission) (*types.Transaction, error)
⋮----
// CreateOperatorDirectedOperatorSetRewardsSubmission is a paid mutator transaction binding the contract method 0x0ca29899.
⋮----
// Solidity: function createOperatorDirectedOperatorSetRewardsSubmission((address,uint32) operatorSet, ((address,uint96)[],address,(address,uint256)[],uint32,uint32,string)[] operatorDirectedRewardsSubmissions) returns()
func (_IRewardsCoordinator *IRewardsCoordinatorTransactor) CreateOperatorDirectedOperatorSetRewardsSubmission(opts *bind.TransactOpts, operatorSet OperatorSet, operatorDirectedRewardsSubmissions []IRewardsCoordinatorTypesOperatorDirectedRewardsSubmission) (*types.Transaction, error)
⋮----
// CreateRewardsForAllEarners is a paid mutator transaction binding the contract method 0xff9f6cce.
⋮----
// Solidity: function createRewardsForAllEarners(((address,uint96)[],address,uint256,uint32,uint32)[] rewardsSubmissions) returns()
func (_IRewardsCoordinator *IRewardsCoordinatorTransactor) CreateRewardsForAllEarners(opts *bind.TransactOpts, rewardsSubmissions []IRewardsCoordinatorTypesRewardsSubmission) (*types.Transaction, error)
⋮----
// CreateRewardsForAllSubmission is a paid mutator transaction binding the contract method 0x36af41fa.
⋮----
// Solidity: function createRewardsForAllSubmission(((address,uint96)[],address,uint256,uint32,uint32)[] rewardsSubmissions) returns()
func (_IRewardsCoordinator *IRewardsCoordinatorTransactor) CreateRewardsForAllSubmission(opts *bind.TransactOpts, rewardsSubmissions []IRewardsCoordinatorTypesRewardsSubmission) (*types.Transaction, error)
⋮----
// CreateTotalStakeRewardsSubmission is a paid mutator transaction binding the contract method 0x8cb0ae1b.
⋮----
// Solidity: function createTotalStakeRewardsSubmission((address,uint32) operatorSet, ((address,uint96)[],address,uint256,uint32,uint32)[] rewardsSubmissions) returns()
func (_IRewardsCoordinator *IRewardsCoordinatorTransactor) CreateTotalStakeRewardsSubmission(opts *bind.TransactOpts, operatorSet OperatorSet, rewardsSubmissions []IRewardsCoordinatorTypesRewardsSubmission) (*types.Transaction, error)
⋮----
// CreateUniqueStakeRewardsSubmission is a paid mutator transaction binding the contract method 0x7ae30583.
⋮----
// Solidity: function createUniqueStakeRewardsSubmission((address,uint32) operatorSet, ((address,uint96)[],address,uint256,uint32,uint32)[] rewardsSubmissions) returns()
func (_IRewardsCoordinator *IRewardsCoordinatorTransactor) CreateUniqueStakeRewardsSubmission(opts *bind.TransactOpts, operatorSet OperatorSet, rewardsSubmissions []IRewardsCoordinatorTypesRewardsSubmission) (*types.Transaction, error)
⋮----
// DisableRoot is a paid mutator transaction binding the contract method 0xf96abf2e.
⋮----
// Solidity: function disableRoot(uint32 rootIndex) returns()
func (_IRewardsCoordinator *IRewardsCoordinatorTransactor) DisableRoot(opts *bind.TransactOpts, rootIndex uint32) (*types.Transaction, error)
⋮----
// Initialize is a paid mutator transaction binding the contract method 0xacad7299.
⋮----
// 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)
⋮----
// ProcessClaim is a paid mutator transaction binding the contract method 0x3ccc861d.
⋮----
// Solidity: function processClaim((uint32,uint32,bytes,(address,bytes32),uint32[],bytes[],(address,uint256)[]) claim, address recipient) returns()
func (_IRewardsCoordinator *IRewardsCoordinatorTransactor) ProcessClaim(opts *bind.TransactOpts, claim IRewardsCoordinatorTypesRewardsMerkleClaim, recipient common.Address) (*types.Transaction, error)
⋮----
// ProcessClaims is a paid mutator transaction binding the contract method 0x4596021c.
⋮----
// Solidity: function processClaims((uint32,uint32,bytes,(address,bytes32),uint32[],bytes[],(address,uint256)[])[] claims, address recipient) returns()
func (_IRewardsCoordinator *IRewardsCoordinatorTransactor) ProcessClaims(opts *bind.TransactOpts, claims []IRewardsCoordinatorTypesRewardsMerkleClaim, recipient common.Address) (*types.Transaction, error)
⋮----
// SetActivationDelay is a paid mutator transaction binding the contract method 0x58baaa3e.
⋮----
// Solidity: function setActivationDelay(uint32 _activationDelay) returns()
func (_IRewardsCoordinator *IRewardsCoordinatorTransactor) SetActivationDelay(opts *bind.TransactOpts, _activationDelay uint32) (*types.Transaction, error)
⋮----
// SetClaimerFor is a paid mutator transaction binding the contract method 0xa0169ddd.
⋮----
// Solidity: function setClaimerFor(address claimer) returns()
func (_IRewardsCoordinator *IRewardsCoordinatorTransactor) SetClaimerFor(opts *bind.TransactOpts, claimer common.Address) (*types.Transaction, error)
⋮----
// SetClaimerFor0 is a paid mutator transaction binding the contract method 0xf22cef85.
⋮----
// Solidity: function setClaimerFor(address earner, address claimer) returns()
func (_IRewardsCoordinator *IRewardsCoordinatorTransactor) SetClaimerFor0(opts *bind.TransactOpts, earner common.Address, claimer common.Address) (*types.Transaction, error)
⋮----
// SetDefaultOperatorSplit is a paid mutator transaction binding the contract method 0xa50a1d9c.
⋮----
// Solidity: function setDefaultOperatorSplit(uint16 split) returns()
func (_IRewardsCoordinator *IRewardsCoordinatorTransactor) SetDefaultOperatorSplit(opts *bind.TransactOpts, split uint16) (*types.Transaction, error)
⋮----
// 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)
⋮----
// SetOperatorAVSSplit is a paid mutator transaction binding the contract method 0xdcbb03b3.
⋮----
// Solidity: function setOperatorAVSSplit(address operator, address avs, uint16 split) returns()
func (_IRewardsCoordinator *IRewardsCoordinatorTransactor) SetOperatorAVSSplit(opts *bind.TransactOpts, operator common.Address, avs common.Address, split uint16) (*types.Transaction, error)
⋮----
// SetOperatorPISplit is a paid mutator transaction binding the contract method 0xb3dbb0e0.
⋮----
// Solidity: function setOperatorPISplit(address operator, uint16 split) returns()
func (_IRewardsCoordinator *IRewardsCoordinatorTransactor) SetOperatorPISplit(opts *bind.TransactOpts, operator common.Address, split uint16) (*types.Transaction, error)
⋮----
// SetOperatorSetSplit is a paid mutator transaction binding the contract method 0xf74e8eac.
⋮----
// Solidity: function setOperatorSetSplit(address operator, (address,uint32) operatorSet, uint16 split) returns()
func (_IRewardsCoordinator *IRewardsCoordinatorTransactor) SetOperatorSetSplit(opts *bind.TransactOpts, operator common.Address, operatorSet OperatorSet, split uint16) (*types.Transaction, error)
⋮----
// 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)
⋮----
// SetRewardsForAllSubmitter is a paid mutator transaction binding the contract method 0x0eb38345.
⋮----
// Solidity: function setRewardsForAllSubmitter(address _submitter, bool _newValue) returns()
func (_IRewardsCoordinator *IRewardsCoordinatorTransactor) SetRewardsForAllSubmitter(opts *bind.TransactOpts, _submitter common.Address, _newValue bool) (*types.Transaction, error)
⋮----
// SetRewardsUpdater is a paid mutator transaction binding the contract method 0x863cb9a9.
⋮----
// Solidity: function setRewardsUpdater(address _rewardsUpdater) returns()
func (_IRewardsCoordinator *IRewardsCoordinatorTransactor) SetRewardsUpdater(opts *bind.TransactOpts, _rewardsUpdater common.Address) (*types.Transaction, error)
⋮----
// SubmitRoot is a paid mutator transaction binding the contract method 0x3efe1db6.
⋮----
// Solidity: function submitRoot(bytes32 root, uint32 rewardsCalculationEndTimestamp) returns()
func (_IRewardsCoordinator *IRewardsCoordinatorTransactor) SubmitRoot(opts *bind.TransactOpts, root [32]byte, rewardsCalculationEndTimestamp uint32) (*types.Transaction, error)
⋮----
// IRewardsCoordinatorAVSRewardsSubmissionCreatedIterator is returned from FilterAVSRewardsSubmissionCreated and is used to iterate over the raw logs and unpacked data for AVSRewardsSubmissionCreated events raised by the IRewardsCoordinator contract.
type IRewardsCoordinatorAVSRewardsSubmissionCreatedIterator struct {
	Event *IRewardsCoordinatorAVSRewardsSubmissionCreated // 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
}
⋮----
Event *IRewardsCoordinatorAVSRewardsSubmissionCreated // 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 *IRewardsCoordinatorAVSRewardsSubmissionCreatedIterator) Next() bool
⋮----
// If the iterator failed, stop iterating
⋮----
// If the iterator completed, deliver directly whatever's available
⋮----
// Iterator still in progress, wait for either a data or an error event
⋮----
// Error returns any retrieval or parsing error occurred during filtering.
func (it *IRewardsCoordinatorAVSRewardsSubmissionCreatedIterator) Error() error
⋮----
// Close terminates the iteration process, releasing any pending underlying
// resources.
func (it *IRewardsCoordinatorAVSRewardsSubmissionCreatedIterator) Close() error
⋮----
// IRewardsCoordinatorAVSRewardsSubmissionCreated represents a AVSRewardsSubmissionCreated event raised by the IRewardsCoordinator contract.
type IRewardsCoordinatorAVSRewardsSubmissionCreated struct {
	Avs                   common.Address
	SubmissionNonce       *big.Int
	RewardsSubmissionHash [32]byte
	RewardsSubmission     IRewardsCoordinatorTypesRewardsSubmission
	Raw                   types.Log // Blockchain specific contextual infos
}
⋮----
Raw                   types.Log // Blockchain specific contextual infos
⋮----
// FilterAVSRewardsSubmissionCreated is a free log retrieval operation binding the contract event 0x450a367a380c4e339e5ae7340c8464ef27af7781ad9945cfe8abd828f89e6281.
⋮----
// Solidity: event AVSRewardsSubmissionCreated(address indexed avs, uint256 indexed submissionNonce, bytes32 indexed rewardsSubmissionHash, ((address,uint96)[],address,uint256,uint32,uint32) rewardsSubmission)
func (_IRewardsCoordinator *IRewardsCoordinatorFilterer) FilterAVSRewardsSubmissionCreated(opts *bind.FilterOpts, avs []common.Address, submissionNonce []*big.Int, rewardsSubmissionHash [][32]byte) (*IRewardsCoordinatorAVSRewardsSubmissionCreatedIterator, error)
⋮----
var avsRule []interface{}
⋮----
var submissionNonceRule []interface{}
⋮----
var rewardsSubmissionHashRule []interface{}
⋮----
// WatchAVSRewardsSubmissionCreated is a free log subscription operation binding the contract event 0x450a367a380c4e339e5ae7340c8464ef27af7781ad9945cfe8abd828f89e6281.
⋮----
func (_IRewardsCoordinator *IRewardsCoordinatorFilterer) WatchAVSRewardsSubmissionCreated(opts *bind.WatchOpts, sink chan<- *IRewardsCoordinatorAVSRewardsSubmissionCreated, avs []common.Address, submissionNonce []*big.Int, rewardsSubmissionHash [][32]byte) (event.Subscription, error)
⋮----
// New log arrived, parse the event and forward to the user
⋮----
// ParseAVSRewardsSubmissionCreated is a log parse operation binding the contract event 0x450a367a380c4e339e5ae7340c8464ef27af7781ad9945cfe8abd828f89e6281.
⋮----
func (_IRewardsCoordinator *IRewardsCoordinatorFilterer) ParseAVSRewardsSubmissionCreated(log types.Log) (*IRewardsCoordinatorAVSRewardsSubmissionCreated, error)
⋮----
// IRewardsCoordinatorActivationDelaySetIterator is returned from FilterActivationDelaySet and is used to iterate over the raw logs and unpacked data for ActivationDelaySet events raised by the IRewardsCoordinator contract.
type IRewardsCoordinatorActivationDelaySetIterator struct {
	Event *IRewardsCoordinatorActivationDelaySet // 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
}
⋮----
Event *IRewardsCoordinatorActivationDelaySet // Event containing the contract specifics and raw log
⋮----
// IRewardsCoordinatorActivationDelaySet represents a ActivationDelaySet event raised by the IRewardsCoordinator contract.
type IRewardsCoordinatorActivationDelaySet struct {
	OldActivationDelay uint32
	NewActivationDelay uint32
	Raw                types.Log // Blockchain specific contextual infos
}
⋮----
Raw                types.Log // Blockchain specific contextual infos
⋮----
// FilterActivationDelaySet is a free log retrieval operation binding the contract event 0xaf557c6c02c208794817a705609cfa935f827312a1adfdd26494b6b95dd2b4b3.
⋮----
// Solidity: event ActivationDelaySet(uint32 oldActivationDelay, uint32 newActivationDelay)
func (_IRewardsCoordinator *IRewardsCoordinatorFilterer) FilterActivationDelaySet(opts *bind.FilterOpts) (*IRewardsCoordinatorActivationDelaySetIterator, error)
⋮----
// WatchActivationDelaySet is a free log subscription operation binding the contract event 0xaf557c6c02c208794817a705609cfa935f827312a1adfdd26494b6b95dd2b4b3.
⋮----
func (_IRewardsCoordinator *IRewardsCoordinatorFilterer) WatchActivationDelaySet(opts *bind.WatchOpts, sink chan<- *IRewardsCoordinatorActivationDelaySet) (event.Subscription, error)
⋮----
// ParseActivationDelaySet is a log parse operation binding the contract event 0xaf557c6c02c208794817a705609cfa935f827312a1adfdd26494b6b95dd2b4b3.
⋮----
func (_IRewardsCoordinator *IRewardsCoordinatorFilterer) ParseActivationDelaySet(log types.Log) (*IRewardsCoordinatorActivationDelaySet, error)
⋮----
// IRewardsCoordinatorClaimerForSetIterator is returned from FilterClaimerForSet and is used to iterate over the raw logs and unpacked data for ClaimerForSet events raised by the IRewardsCoordinator contract.
type IRewardsCoordinatorClaimerForSetIterator struct {
	Event *IRewardsCoordinatorClaimerForSet // 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
}
⋮----
Event *IRewardsCoordinatorClaimerForSet // Event containing the contract specifics and raw log
⋮----
// IRewardsCoordinatorClaimerForSet represents a ClaimerForSet event raised by the IRewardsCoordinator contract.
type IRewardsCoordinatorClaimerForSet struct {
	Earner     common.Address
	OldClaimer common.Address
	Claimer    common.Address
	Raw        types.Log // Blockchain specific contextual infos
}
⋮----
Raw        types.Log // Blockchain specific contextual infos
⋮----
// FilterClaimerForSet is a free log retrieval operation binding the contract event 0xbab947934d42e0ad206f25c9cab18b5bb6ae144acfb00f40b4e3aa59590ca312.
⋮----
// Solidity: event ClaimerForSet(address indexed earner, address indexed oldClaimer, address indexed claimer)
func (_IRewardsCoordinator *IRewardsCoordinatorFilterer) FilterClaimerForSet(opts *bind.FilterOpts, earner []common.Address, oldClaimer []common.Address, claimer []common.Address) (*IRewardsCoordinatorClaimerForSetIterator, error)
⋮----
var earnerRule []interface{}
⋮----
var oldClaimerRule []interface{}
⋮----
var claimerRule []interface{}
⋮----
// WatchClaimerForSet is a free log subscription operation binding the contract event 0xbab947934d42e0ad206f25c9cab18b5bb6ae144acfb00f40b4e3aa59590ca312.
⋮----
func (_IRewardsCoordinator *IRewardsCoordinatorFilterer) WatchClaimerForSet(opts *bind.WatchOpts, sink chan<- *IRewardsCoordinatorClaimerForSet, earner []common.Address, oldClaimer []common.Address, claimer []common.Address) (event.Subscription, error)
⋮----
// ParseClaimerForSet is a log parse operation binding the contract event 0xbab947934d42e0ad206f25c9cab18b5bb6ae144acfb00f40b4e3aa59590ca312.
⋮----
func (_IRewardsCoordinator *IRewardsCoordinatorFilterer) ParseClaimerForSet(log types.Log) (*IRewardsCoordinatorClaimerForSet, error)
⋮----
// IRewardsCoordinatorDefaultOperatorSplitBipsSetIterator is returned from FilterDefaultOperatorSplitBipsSet and is used to iterate over the raw logs and unpacked data for DefaultOperatorSplitBipsSet events raised by the IRewardsCoordinator contract.
type IRewardsCoordinatorDefaultOperatorSplitBipsSetIterator struct {
	Event *IRewardsCoordinatorDefaultOperatorSplitBipsSet // 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
}
⋮----
Event *IRewardsCoordinatorDefaultOperatorSplitBipsSet // Event containing the contract specifics and raw log
⋮----
// IRewardsCoordinatorDefaultOperatorSplitBipsSet represents a DefaultOperatorSplitBipsSet event raised by the IRewardsCoordinator contract.
type IRewardsCoordinatorDefaultOperatorSplitBipsSet struct {
	OldDefaultOperatorSplitBips uint16
	NewDefaultOperatorSplitBips uint16
	Raw                         types.Log // Blockchain specific contextual infos
}
⋮----
Raw                         types.Log // Blockchain specific contextual infos
⋮----
// FilterDefaultOperatorSplitBipsSet is a free log retrieval operation binding the contract event 0xe6cd4edfdcc1f6d130ab35f73d72378f3a642944fb4ee5bd84b7807a81ea1c4e.
⋮----
// Solidity: event DefaultOperatorSplitBipsSet(uint16 oldDefaultOperatorSplitBips, uint16 newDefaultOperatorSplitBips)
func (_IRewardsCoordinator *IRewardsCoordinatorFilterer) FilterDefaultOperatorSplitBipsSet(opts *bind.FilterOpts) (*IRewardsCoordinatorDefaultOperatorSplitBipsSetIterator, error)
⋮----
// WatchDefaultOperatorSplitBipsSet is a free log subscription operation binding the contract event 0xe6cd4edfdcc1f6d130ab35f73d72378f3a642944fb4ee5bd84b7807a81ea1c4e.
⋮----
func (_IRewardsCoordinator *IRewardsCoordinatorFilterer) WatchDefaultOperatorSplitBipsSet(opts *bind.WatchOpts, sink chan<- *IRewardsCoordinatorDefaultOperatorSplitBipsSet) (event.Subscription, error)
⋮----
// ParseDefaultOperatorSplitBipsSet is a log parse operation binding the contract event 0xe6cd4edfdcc1f6d130ab35f73d72378f3a642944fb4ee5bd84b7807a81ea1c4e.
⋮----
func (_IRewardsCoordinator *IRewardsCoordinatorFilterer) ParseDefaultOperatorSplitBipsSet(log types.Log) (*IRewardsCoordinatorDefaultOperatorSplitBipsSet, error)
⋮----
// IRewardsCoordinatorDistributionRootDisabledIterator is returned from FilterDistributionRootDisabled and is used to iterate over the raw logs and unpacked data for DistributionRootDisabled events raised by the IRewardsCoordinator contract.
type IRewardsCoordinatorDistributionRootDisabledIterator struct {
	Event *IRewardsCoordinatorDistributionRootDisabled // 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
}
⋮----
Event *IRewardsCoordinatorDistributionRootDisabled // Event containing the contract specifics and raw log
⋮----
// IRewardsCoordinatorDistributionRootDisabled represents a DistributionRootDisabled event raised by the IRewardsCoordinator contract.
type IRewardsCoordinatorDistributionRootDisabled struct {
	RootIndex uint32
	Raw       types.Log // Blockchain specific contextual infos
}
⋮----
Raw       types.Log // Blockchain specific contextual infos
⋮----
// FilterDistributionRootDisabled is a free log retrieval operation binding the contract event 0xd850e6e5dfa497b72661fa73df2923464eaed9dc2ff1d3cb82bccbfeabe5c41e.
⋮----
// Solidity: event DistributionRootDisabled(uint32 indexed rootIndex)
func (_IRewardsCoordinator *IRewardsCoordinatorFilterer) FilterDistributionRootDisabled(opts *bind.FilterOpts, rootIndex []uint32) (*IRewardsCoordinatorDistributionRootDisabledIterator, error)
⋮----
var rootIndexRule []interface{}
⋮----
// WatchDistributionRootDisabled is a free log subscription operation binding the contract event 0xd850e6e5dfa497b72661fa73df2923464eaed9dc2ff1d3cb82bccbfeabe5c41e.
⋮----
func (_IRewardsCoordinator *IRewardsCoordinatorFilterer) WatchDistributionRootDisabled(opts *bind.WatchOpts, sink chan<- *IRewardsCoordinatorDistributionRootDisabled, rootIndex []uint32) (event.Subscription, error)
⋮----
// ParseDistributionRootDisabled is a log parse operation binding the contract event 0xd850e6e5dfa497b72661fa73df2923464eaed9dc2ff1d3cb82bccbfeabe5c41e.
⋮----
func (_IRewardsCoordinator *IRewardsCoordinatorFilterer) ParseDistributionRootDisabled(log types.Log) (*IRewardsCoordinatorDistributionRootDisabled, error)
⋮----
// IRewardsCoordinatorDistributionRootSubmittedIterator is returned from FilterDistributionRootSubmitted and is used to iterate over the raw logs and unpacked data for DistributionRootSubmitted events raised by the IRewardsCoordinator contract.
type IRewardsCoordinatorDistributionRootSubmittedIterator struct {
	Event *IRewardsCoordinatorDistributionRootSubmitted // 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
}
⋮----
Event *IRewardsCoordinatorDistributionRootSubmitted // Event containing the contract specifics and raw log
⋮----
// IRewardsCoordinatorDistributionRootSubmitted represents a DistributionRootSubmitted event raised by the IRewardsCoordinator contract.
type IRewardsCoordinatorDistributionRootSubmitted struct {
	RootIndex                      uint32
	Root                           [32]byte
	RewardsCalculationEndTimestamp uint32
	ActivatedAt                    uint32
	Raw                            types.Log // Blockchain specific contextual infos
}
⋮----
Raw                            types.Log // Blockchain specific contextual infos
⋮----
// FilterDistributionRootSubmitted is a free log retrieval operation binding the contract event 0xecd866c3c158fa00bf34d803d5f6023000b57080bcb48af004c2b4b46b3afd08.
⋮----
// Solidity: event DistributionRootSubmitted(uint32 indexed rootIndex, bytes32 indexed root, uint32 indexed rewardsCalculationEndTimestamp, uint32 activatedAt)
func (_IRewardsCoordinator *IRewardsCoordinatorFilterer) FilterDistributionRootSubmitted(opts *bind.FilterOpts, rootIndex []uint32, root [][32]byte, rewardsCalculationEndTimestamp []uint32) (*IRewardsCoordinatorDistributionRootSubmittedIterator, error)
⋮----
var rootRule []interface{}
⋮----
var rewardsCalculationEndTimestampRule []interface{}
⋮----
// WatchDistributionRootSubmitted is a free log subscription operation binding the contract event 0xecd866c3c158fa00bf34d803d5f6023000b57080bcb48af004c2b4b46b3afd08.
⋮----
func (_IRewardsCoordinator *IRewardsCoordinatorFilterer) WatchDistributionRootSubmitted(opts *bind.WatchOpts, sink chan<- *IRewardsCoordinatorDistributionRootSubmitted, rootIndex []uint32, root [][32]byte, rewardsCalculationEndTimestamp []uint32) (event.Subscription, error)
⋮----
// ParseDistributionRootSubmitted is a log parse operation binding the contract event 0xecd866c3c158fa00bf34d803d5f6023000b57080bcb48af004c2b4b46b3afd08.
⋮----
func (_IRewardsCoordinator *IRewardsCoordinatorFilterer) ParseDistributionRootSubmitted(log types.Log) (*IRewardsCoordinatorDistributionRootSubmitted, error)
⋮----
// 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
}
⋮----
Event *IRewardsCoordinatorFeeRecipientSet // Event containing the contract specifics and raw log
⋮----
// 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
}
⋮----
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{}
⋮----
var newFeeRecipientRule []interface{}
⋮----
// WatchFeeRecipientSet is a free log subscription operation binding the contract event 0x15d80a013f22151bc7246e3bc132e12828cde19de98870475e3fa70840152721.
⋮----
func (_IRewardsCoordinator *IRewardsCoordinatorFilterer) WatchFeeRecipientSet(opts *bind.WatchOpts, sink chan<- *IRewardsCoordinatorFeeRecipientSet, oldFeeRecipient []common.Address, newFeeRecipient []common.Address) (event.Subscription, error)
⋮----
// ParseFeeRecipientSet is a log parse operation binding the contract event 0x15d80a013f22151bc7246e3bc132e12828cde19de98870475e3fa70840152721.
⋮----
func (_IRewardsCoordinator *IRewardsCoordinatorFilterer) ParseFeeRecipientSet(log types.Log) (*IRewardsCoordinatorFeeRecipientSet, error)
⋮----
// 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

	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
}
⋮----
Event *IRewardsCoordinatorOperatorAVSSplitBipsSet // Event containing the contract specifics and raw log
⋮----
// IRewardsCoordinatorOperatorAVSSplitBipsSet represents a OperatorAVSSplitBipsSet event raised by the IRewardsCoordinator contract.
type IRewardsCoordinatorOperatorAVSSplitBipsSet struct {
	Caller                  common.Address
	Operator                common.Address
	Avs                     common.Address
	ActivatedAt             uint32
	OldOperatorAVSSplitBips uint16
	NewOperatorAVSSplitBips uint16
	Raw                     types.Log // Blockchain specific contextual infos
}
⋮----
Raw                     types.Log // Blockchain specific contextual infos
⋮----
// FilterOperatorAVSSplitBipsSet is a free log retrieval operation binding the contract event 0x48e198b6ae357e529204ee53a8e514c470ff77d9cc8e4f7207f8b5d490ae6934.
⋮----
// Solidity: event OperatorAVSSplitBipsSet(address indexed caller, address indexed operator, address indexed avs, uint32 activatedAt, uint16 oldOperatorAVSSplitBips, uint16 newOperatorAVSSplitBips)
func (_IRewardsCoordinator *IRewardsCoordinatorFilterer) FilterOperatorAVSSplitBipsSet(opts *bind.FilterOpts, caller []common.Address, operator []common.Address, avs []common.Address) (*IRewardsCoordinatorOperatorAVSSplitBipsSetIterator, error)
⋮----
var callerRule []interface{}
⋮----
var operatorRule []interface{}
⋮----
// WatchOperatorAVSSplitBipsSet is a free log subscription operation binding the contract event 0x48e198b6ae357e529204ee53a8e514c470ff77d9cc8e4f7207f8b5d490ae6934.
⋮----
func (_IRewardsCoordinator *IRewardsCoordinatorFilterer) WatchOperatorAVSSplitBipsSet(opts *bind.WatchOpts, sink chan<- *IRewardsCoordinatorOperatorAVSSplitBipsSet, caller []common.Address, operator []common.Address, avs []common.Address) (event.Subscription, error)
⋮----
// ParseOperatorAVSSplitBipsSet is a log parse operation binding the contract event 0x48e198b6ae357e529204ee53a8e514c470ff77d9cc8e4f7207f8b5d490ae6934.
⋮----
func (_IRewardsCoordinator *IRewardsCoordinatorFilterer) ParseOperatorAVSSplitBipsSet(log types.Log) (*IRewardsCoordinatorOperatorAVSSplitBipsSet, error)
⋮----
// IRewardsCoordinatorOperatorDirectedAVSRewardsSubmissionCreatedIterator is returned from FilterOperatorDirectedAVSRewardsSubmissionCreated and is used to iterate over the raw logs and unpacked data for OperatorDirectedAVSRewardsSubmissionCreated events raised by the IRewardsCoordinator contract.
type IRewardsCoordinatorOperatorDirectedAVSRewardsSubmissionCreatedIterator struct {
	Event *IRewardsCoordinatorOperatorDirectedAVSRewardsSubmissionCreated // 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
}
⋮----
Event *IRewardsCoordinatorOperatorDirectedAVSRewardsSubmissionCreated // Event containing the contract specifics and raw log
⋮----
// IRewardsCoordinatorOperatorDirectedAVSRewardsSubmissionCreated represents a OperatorDirectedAVSRewardsSubmissionCreated event raised by the IRewardsCoordinator contract.
type IRewardsCoordinatorOperatorDirectedAVSRewardsSubmissionCreated struct {
	Caller                                common.Address
	Avs                                   common.Address
	OperatorDirectedRewardsSubmissionHash [32]byte
	SubmissionNonce                       *big.Int
	OperatorDirectedRewardsSubmission     IRewardsCoordinatorTypesOperatorDirectedRewardsSubmission
	Raw                                   types.Log // Blockchain specific contextual infos
}
⋮----
Raw                                   types.Log // Blockchain specific contextual infos
⋮----
// FilterOperatorDirectedAVSRewardsSubmissionCreated is a free log retrieval operation binding the contract event 0xfc8888bffd711da60bc5092b33f677d81896fe80ecc677b84cfab8184462b6e0.
⋮----
// Solidity: event OperatorDirectedAVSRewardsSubmissionCreated(address indexed caller, address indexed avs, bytes32 indexed operatorDirectedRewardsSubmissionHash, uint256 submissionNonce, ((address,uint96)[],address,(address,uint256)[],uint32,uint32,string) operatorDirectedRewardsSubmission)
func (_IRewardsCoordinator *IRewardsCoordinatorFilterer) FilterOperatorDirectedAVSRewardsSubmissionCreated(opts *bind.FilterOpts, caller []common.Address, avs []common.Address, operatorDirectedRewardsSubmissionHash [][32]byte) (*IRewardsCoordinatorOperatorDirectedAVSRewardsSubmissionCreatedIterator, error)
⋮----
var operatorDirectedRewardsSubmissionHashRule []interface{}
⋮----
// WatchOperatorDirectedAVSRewardsSubmissionCreated is a free log subscription operation binding the contract event 0xfc8888bffd711da60bc5092b33f677d81896fe80ecc677b84cfab8184462b6e0.
⋮----
func (_IRewardsCoordinator *IRewardsCoordinatorFilterer) WatchOperatorDirectedAVSRewardsSubmissionCreated(opts *bind.WatchOpts, sink chan<- *IRewardsCoordinatorOperatorDirectedAVSRewardsSubmissionCreated, caller []common.Address, avs []common.Address, operatorDirectedRewardsSubmissionHash [][32]byte) (event.Subscription, error)
⋮----
// ParseOperatorDirectedAVSRewardsSubmissionCreated is a log parse operation binding the contract event 0xfc8888bffd711da60bc5092b33f677d81896fe80ecc677b84cfab8184462b6e0.
⋮----
func (_IRewardsCoordinator *IRewardsCoordinatorFilterer) ParseOperatorDirectedAVSRewardsSubmissionCreated(log types.Log) (*IRewardsCoordinatorOperatorDirectedAVSRewardsSubmissionCreated, error)
⋮----
// IRewardsCoordinatorOperatorDirectedOperatorSetRewardsSubmissionCreatedIterator is returned from FilterOperatorDirectedOperatorSetRewardsSubmissionCreated and is used to iterate over the raw logs and unpacked data for OperatorDirectedOperatorSetRewardsSubmissionCreated events raised by the IRewardsCoordinator contract.
type IRewardsCoordinatorOperatorDirectedOperatorSetRewardsSubmissionCreatedIterator struct {
	Event *IRewardsCoordinatorOperatorDirectedOperatorSetRewardsSubmissionCreated // 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
}
⋮----
Event *IRewardsCoordinatorOperatorDirectedOperatorSetRewardsSubmissionCreated // Event containing the contract specifics and raw log
⋮----
// IRewardsCoordinatorOperatorDirectedOperatorSetRewardsSubmissionCreated represents a OperatorDirectedOperatorSetRewardsSubmissionCreated event raised by the IRewardsCoordinator contract.
type IRewardsCoordinatorOperatorDirectedOperatorSetRewardsSubmissionCreated struct {
	Caller                                common.Address
	OperatorDirectedRewardsSubmissionHash [32]byte
	OperatorSet                           OperatorSet
	SubmissionNonce                       *big.Int
	OperatorDirectedRewardsSubmission     IRewardsCoordinatorTypesOperatorDirectedRewardsSubmission
	Raw                                   types.Log // Blockchain specific contextual infos
}
⋮----
// FilterOperatorDirectedOperatorSetRewardsSubmissionCreated is a free log retrieval operation binding the contract event 0xfff0759ccb371dfb5691798724e70b4fa61cb3bfe730a33ac19fb86a48efc756.
⋮----
// Solidity: event OperatorDirectedOperatorSetRewardsSubmissionCreated(address indexed caller, bytes32 indexed operatorDirectedRewardsSubmissionHash, (address,uint32) operatorSet, uint256 submissionNonce, ((address,uint96)[],address,(address,uint256)[],uint32,uint32,string) operatorDirectedRewardsSubmission)
func (_IRewardsCoordinator *IRewardsCoordinatorFilterer) FilterOperatorDirectedOperatorSetRewardsSubmissionCreated(opts *bind.FilterOpts, caller []common.Address, operatorDirectedRewardsSubmissionHash [][32]byte) (*IRewardsCoordinatorOperatorDirectedOperatorSetRewardsSubmissionCreatedIterator, error)
⋮----
// WatchOperatorDirectedOperatorSetRewardsSubmissionCreated is a free log subscription operation binding the contract event 0xfff0759ccb371dfb5691798724e70b4fa61cb3bfe730a33ac19fb86a48efc756.
⋮----
func (_IRewardsCoordinator *IRewardsCoordinatorFilterer) WatchOperatorDirectedOperatorSetRewardsSubmissionCreated(opts *bind.WatchOpts, sink chan<- *IRewardsCoordinatorOperatorDirectedOperatorSetRewardsSubmissionCreated, caller []common.Address, operatorDirectedRewardsSubmissionHash [][32]byte) (event.Subscription, error)
⋮----
// ParseOperatorDirectedOperatorSetRewardsSubmissionCreated is a log parse operation binding the contract event 0xfff0759ccb371dfb5691798724e70b4fa61cb3bfe730a33ac19fb86a48efc756.
⋮----
func (_IRewardsCoordinator *IRewardsCoordinatorFilterer) ParseOperatorDirectedOperatorSetRewardsSubmissionCreated(log types.Log) (*IRewardsCoordinatorOperatorDirectedOperatorSetRewardsSubmissionCreated, error)
⋮----
// IRewardsCoordinatorOperatorPISplitBipsSetIterator is returned from FilterOperatorPISplitBipsSet and is used to iterate over the raw logs and unpacked data for OperatorPISplitBipsSet events raised by the IRewardsCoordinator contract.
type IRewardsCoordinatorOperatorPISplitBipsSetIterator struct {
	Event *IRewardsCoordinatorOperatorPISplitBipsSet // 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
}
⋮----
Event *IRewardsCoordinatorOperatorPISplitBipsSet // Event containing the contract specifics and raw log
⋮----
// IRewardsCoordinatorOperatorPISplitBipsSet represents a OperatorPISplitBipsSet event raised by the IRewardsCoordinator contract.
type IRewardsCoordinatorOperatorPISplitBipsSet struct {
	Caller                 common.Address
	Operator               common.Address
	ActivatedAt            uint32
	OldOperatorPISplitBips uint16
	NewOperatorPISplitBips uint16
	Raw                    types.Log // Blockchain specific contextual infos
}
⋮----
Raw                    types.Log // Blockchain specific contextual infos
⋮----
// FilterOperatorPISplitBipsSet is a free log retrieval operation binding the contract event 0xd1e028bd664486a46ad26040e999cd2d22e1e9a094ee6afe19fcf64678f16f74.
⋮----
// Solidity: event OperatorPISplitBipsSet(address indexed caller, address indexed operator, uint32 activatedAt, uint16 oldOperatorPISplitBips, uint16 newOperatorPISplitBips)
func (_IRewardsCoordinator *IRewardsCoordinatorFilterer) FilterOperatorPISplitBipsSet(opts *bind.FilterOpts, caller []common.Address, operator []common.Address) (*IRewardsCoordinatorOperatorPISplitBipsSetIterator, error)
⋮----
// WatchOperatorPISplitBipsSet is a free log subscription operation binding the contract event 0xd1e028bd664486a46ad26040e999cd2d22e1e9a094ee6afe19fcf64678f16f74.
⋮----
func (_IRewardsCoordinator *IRewardsCoordinatorFilterer) WatchOperatorPISplitBipsSet(opts *bind.WatchOpts, sink chan<- *IRewardsCoordinatorOperatorPISplitBipsSet, caller []common.Address, operator []common.Address) (event.Subscription, error)
⋮----
// ParseOperatorPISplitBipsSet is a log parse operation binding the contract event 0xd1e028bd664486a46ad26040e999cd2d22e1e9a094ee6afe19fcf64678f16f74.
⋮----
func (_IRewardsCoordinator *IRewardsCoordinatorFilterer) ParseOperatorPISplitBipsSet(log types.Log) (*IRewardsCoordinatorOperatorPISplitBipsSet, error)
⋮----
// IRewardsCoordinatorOperatorSetSplitBipsSetIterator is returned from FilterOperatorSetSplitBipsSet and is used to iterate over the raw logs and unpacked data for OperatorSetSplitBipsSet events raised by the IRewardsCoordinator contract.
type IRewardsCoordinatorOperatorSetSplitBipsSetIterator struct {
	Event *IRewardsCoordinatorOperatorSetSplitBipsSet // 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
}
⋮----
Event *IRewardsCoordinatorOperatorSetSplitBipsSet // Event containing the contract specifics and raw log
⋮----
// IRewardsCoordinatorOperatorSetSplitBipsSet represents a OperatorSetSplitBipsSet event raised by the IRewardsCoordinator contract.
type IRewardsCoordinatorOperatorSetSplitBipsSet struct {
	Caller                  common.Address
	Operator                common.Address
	OperatorSet             OperatorSet
	ActivatedAt             uint32
	OldOperatorSetSplitBips uint16
	NewOperatorSetSplitBips uint16
	Raw                     types.Log // Blockchain specific contextual infos
}
⋮----
// FilterOperatorSetSplitBipsSet is a free log retrieval operation binding the contract event 0x14918b3834ab6752eb2e1b489b6663a67810efb5f56f3944a97ede8ecf1fd9f1.
⋮----
// Solidity: event OperatorSetSplitBipsSet(address indexed caller, address indexed operator, (address,uint32) operatorSet, uint32 activatedAt, uint16 oldOperatorSetSplitBips, uint16 newOperatorSetSplitBips)
func (_IRewardsCoordinator *IRewardsCoordinatorFilterer) FilterOperatorSetSplitBipsSet(opts *bind.FilterOpts, caller []common.Address, operator []common.Address) (*IRewardsCoordinatorOperatorSetSplitBipsSetIterator, error)
⋮----
// WatchOperatorSetSplitBipsSet is a free log subscription operation binding the contract event 0x14918b3834ab6752eb2e1b489b6663a67810efb5f56f3944a97ede8ecf1fd9f1.
⋮----
func (_IRewardsCoordinator *IRewardsCoordinatorFilterer) WatchOperatorSetSplitBipsSet(opts *bind.WatchOpts, sink chan<- *IRewardsCoordinatorOperatorSetSplitBipsSet, caller []common.Address, operator []common.Address) (event.Subscription, error)
⋮----
// ParseOperatorSetSplitBipsSet is a log parse operation binding the contract event 0x14918b3834ab6752eb2e1b489b6663a67810efb5f56f3944a97ede8ecf1fd9f1.
⋮----
func (_IRewardsCoordinator *IRewardsCoordinatorFilterer) ParseOperatorSetSplitBipsSet(log types.Log) (*IRewardsCoordinatorOperatorSetSplitBipsSet, error)
⋮----
// 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
}
⋮----
Event *IRewardsCoordinatorOptInForProtocolFeeSet // Event containing the contract specifics and raw log
⋮----
// 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{}
⋮----
var oldValueRule []interface{}
⋮----
var newValueRule []interface{}
⋮----
// WatchOptInForProtocolFeeSet is a free log subscription operation binding the contract event 0xbb020e17dc9a72ff25958029a3ddf0c05cebaac105769b31b6238aaca3910cd2.
⋮----
func (_IRewardsCoordinator *IRewardsCoordinatorFilterer) WatchOptInForProtocolFeeSet(opts *bind.WatchOpts, sink chan<- *IRewardsCoordinatorOptInForProtocolFeeSet, submitter []common.Address, oldValue []bool, newValue []bool) (event.Subscription, error)
⋮----
// ParseOptInForProtocolFeeSet is a log parse operation binding the contract event 0xbb020e17dc9a72ff25958029a3ddf0c05cebaac105769b31b6238aaca3910cd2.
⋮----
func (_IRewardsCoordinator *IRewardsCoordinatorFilterer) ParseOptInForProtocolFeeSet(log types.Log) (*IRewardsCoordinatorOptInForProtocolFeeSet, error)
⋮----
// 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

	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
}
⋮----
Event *IRewardsCoordinatorRewardsClaimed // Event containing the contract specifics and raw log
⋮----
// IRewardsCoordinatorRewardsClaimed represents a RewardsClaimed event raised by the IRewardsCoordinator contract.
type IRewardsCoordinatorRewardsClaimed struct {
	Root          [32]byte
	Earner        common.Address
	Claimer       common.Address
	Recipient     common.Address
	Token         common.Address
	ClaimedAmount *big.Int
	Raw           types.Log // Blockchain specific contextual infos
}
⋮----
Raw           types.Log // Blockchain specific contextual infos
⋮----
// FilterRewardsClaimed is a free log retrieval operation binding the contract event 0x9543dbd55580842586a951f0386e24d68a5df99ae29e3b216588b45fd684ce31.
⋮----
// Solidity: event RewardsClaimed(bytes32 root, address indexed earner, address indexed claimer, address indexed recipient, address token, uint256 claimedAmount)
func (_IRewardsCoordinator *IRewardsCoordinatorFilterer) FilterRewardsClaimed(opts *bind.FilterOpts, earner []common.Address, claimer []common.Address, recipient []common.Address) (*IRewardsCoordinatorRewardsClaimedIterator, error)
⋮----
var recipientRule []interface{}
⋮----
// WatchRewardsClaimed is a free log subscription operation binding the contract event 0x9543dbd55580842586a951f0386e24d68a5df99ae29e3b216588b45fd684ce31.
⋮----
func (_IRewardsCoordinator *IRewardsCoordinatorFilterer) WatchRewardsClaimed(opts *bind.WatchOpts, sink chan<- *IRewardsCoordinatorRewardsClaimed, earner []common.Address, claimer []common.Address, recipient []common.Address) (event.Subscription, error)
⋮----
// ParseRewardsClaimed is a log parse operation binding the contract event 0x9543dbd55580842586a951f0386e24d68a5df99ae29e3b216588b45fd684ce31.
⋮----
func (_IRewardsCoordinator *IRewardsCoordinatorFilterer) ParseRewardsClaimed(log types.Log) (*IRewardsCoordinatorRewardsClaimed, error)
⋮----
// IRewardsCoordinatorRewardsForAllSubmitterSetIterator is returned from FilterRewardsForAllSubmitterSet and is used to iterate over the raw logs and unpacked data for RewardsForAllSubmitterSet events raised by the IRewardsCoordinator contract.
type IRewardsCoordinatorRewardsForAllSubmitterSetIterator struct {
	Event *IRewardsCoordinatorRewardsForAllSubmitterSet // 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
}
⋮----
Event *IRewardsCoordinatorRewardsForAllSubmitterSet // Event containing the contract specifics and raw log
⋮----
// IRewardsCoordinatorRewardsForAllSubmitterSet represents a RewardsForAllSubmitterSet event raised by the IRewardsCoordinator contract.
type IRewardsCoordinatorRewardsForAllSubmitterSet struct {
	RewardsForAllSubmitter common.Address
	OldValue               bool
	NewValue               bool
	Raw                    types.Log // Blockchain specific contextual infos
}
⋮----
// FilterRewardsForAllSubmitterSet is a free log retrieval operation binding the contract event 0x4de6293e668df1398422e1def12118052c1539a03cbfedc145895d48d7685f1c.
⋮----
// Solidity: event RewardsForAllSubmitterSet(address indexed rewardsForAllSubmitter, bool indexed oldValue, bool indexed newValue)
func (_IRewardsCoordinator *IRewardsCoordinatorFilterer) FilterRewardsForAllSubmitterSet(opts *bind.FilterOpts, rewardsForAllSubmitter []common.Address, oldValue []bool, newValue []bool) (*IRewardsCoordinatorRewardsForAllSubmitterSetIterator, error)
⋮----
var rewardsForAllSubmitterRule []interface{}
⋮----
// WatchRewardsForAllSubmitterSet is a free log subscription operation binding the contract event 0x4de6293e668df1398422e1def12118052c1539a03cbfedc145895d48d7685f1c.
⋮----
func (_IRewardsCoordinator *IRewardsCoordinatorFilterer) WatchRewardsForAllSubmitterSet(opts *bind.WatchOpts, sink chan<- *IRewardsCoordinatorRewardsForAllSubmitterSet, rewardsForAllSubmitter []common.Address, oldValue []bool, newValue []bool) (event.Subscription, error)
⋮----
// ParseRewardsForAllSubmitterSet is a log parse operation binding the contract event 0x4de6293e668df1398422e1def12118052c1539a03cbfedc145895d48d7685f1c.
⋮----
func (_IRewardsCoordinator *IRewardsCoordinatorFilterer) ParseRewardsForAllSubmitterSet(log types.Log) (*IRewardsCoordinatorRewardsForAllSubmitterSet, error)
⋮----
// IRewardsCoordinatorRewardsSubmissionForAllCreatedIterator is returned from FilterRewardsSubmissionForAllCreated and is used to iterate over the raw logs and unpacked data for RewardsSubmissionForAllCreated events raised by the IRewardsCoordinator contract.
type IRewardsCoordinatorRewardsSubmissionForAllCreatedIterator struct {
	Event *IRewardsCoordinatorRewardsSubmissionForAllCreated // 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
}
⋮----
Event *IRewardsCoordinatorRewardsSubmissionForAllCreated // Event containing the contract specifics and raw log
⋮----
// IRewardsCoordinatorRewardsSubmissionForAllCreated represents a RewardsSubmissionForAllCreated event raised by the IRewardsCoordinator contract.
type IRewardsCoordinatorRewardsSubmissionForAllCreated struct {
	Submitter             common.Address
	SubmissionNonce       *big.Int
	RewardsSubmissionHash [32]byte
	RewardsSubmission     IRewardsCoordinatorTypesRewardsSubmission
	Raw                   types.Log // Blockchain specific contextual infos
}
⋮----
// FilterRewardsSubmissionForAllCreated is a free log retrieval operation binding the contract event 0x51088b8c89628df3a8174002c2a034d0152fce6af8415d651b2a4734bf270482.
⋮----
// Solidity: event RewardsSubmissionForAllCreated(address indexed submitter, uint256 indexed submissionNonce, bytes32 indexed rewardsSubmissionHash, ((address,uint96)[],address,uint256,uint32,uint32) rewardsSubmission)
func (_IRewardsCoordinator *IRewardsCoordinatorFilterer) FilterRewardsSubmissionForAllCreated(opts *bind.FilterOpts, submitter []common.Address, submissionNonce []*big.Int, rewardsSubmissionHash [][32]byte) (*IRewardsCoordinatorRewardsSubmissionForAllCreatedIterator, error)
⋮----
// WatchRewardsSubmissionForAllCreated is a free log subscription operation binding the contract event 0x51088b8c89628df3a8174002c2a034d0152fce6af8415d651b2a4734bf270482.
⋮----
func (_IRewardsCoordinator *IRewardsCoordinatorFilterer) WatchRewardsSubmissionForAllCreated(opts *bind.WatchOpts, sink chan<- *IRewardsCoordinatorRewardsSubmissionForAllCreated, submitter []common.Address, submissionNonce []*big.Int, rewardsSubmissionHash [][32]byte) (event.Subscription, error)
⋮----
// ParseRewardsSubmissionForAllCreated is a log parse operation binding the contract event 0x51088b8c89628df3a8174002c2a034d0152fce6af8415d651b2a4734bf270482.
⋮----
func (_IRewardsCoordinator *IRewardsCoordinatorFilterer) ParseRewardsSubmissionForAllCreated(log types.Log) (*IRewardsCoordinatorRewardsSubmissionForAllCreated, error)
⋮----
// IRewardsCoordinatorRewardsSubmissionForAllEarnersCreatedIterator is returned from FilterRewardsSubmissionForAllEarnersCreated and is used to iterate over the raw logs and unpacked data for RewardsSubmissionForAllEarnersCreated events raised by the IRewardsCoordinator contract.
type IRewardsCoordinatorRewardsSubmissionForAllEarnersCreatedIterator struct {
	Event *IRewardsCoordinatorRewardsSubmissionForAllEarnersCreated // 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
}
⋮----
Event *IRewardsCoordinatorRewardsSubmissionForAllEarnersCreated // Event containing the contract specifics and raw log
⋮----
// IRewardsCoordinatorRewardsSubmissionForAllEarnersCreated represents a RewardsSubmissionForAllEarnersCreated event raised by the IRewardsCoordinator contract.
type IRewardsCoordinatorRewardsSubmissionForAllEarnersCreated struct {
	TokenHopper           common.Address
	SubmissionNonce       *big.Int
	RewardsSubmissionHash [32]byte
	RewardsSubmission     IRewardsCoordinatorTypesRewardsSubmission
	Raw                   types.Log // Blockchain specific contextual infos
}
⋮----
// FilterRewardsSubmissionForAllEarnersCreated is a free log retrieval operation binding the contract event 0x5251b6fdefcb5d81144e735f69ea4c695fd43b0289ca53dc075033f5fc80068b.
⋮----
// Solidity: event RewardsSubmissionForAllEarnersCreated(address indexed tokenHopper, uint256 indexed submissionNonce, bytes32 indexed rewardsSubmissionHash, ((address,uint96)[],address,uint256,uint32,uint32) rewardsSubmission)
func (_IRewardsCoordinator *IRewardsCoordinatorFilterer) FilterRewardsSubmissionForAllEarnersCreated(opts *bind.FilterOpts, tokenHopper []common.Address, submissionNonce []*big.Int, rewardsSubmissionHash [][32]byte) (*IRewardsCoordinatorRewardsSubmissionForAllEarnersCreatedIterator, error)
⋮----
var tokenHopperRule []interface{}
⋮----
// WatchRewardsSubmissionForAllEarnersCreated is a free log subscription operation binding the contract event 0x5251b6fdefcb5d81144e735f69ea4c695fd43b0289ca53dc075033f5fc80068b.
⋮----
func (_IRewardsCoordinator *IRewardsCoordinatorFilterer) WatchRewardsSubmissionForAllEarnersCreated(opts *bind.WatchOpts, sink chan<- *IRewardsCoordinatorRewardsSubmissionForAllEarnersCreated, tokenHopper []common.Address, submissionNonce []*big.Int, rewardsSubmissionHash [][32]byte) (event.Subscription, error)
⋮----
// ParseRewardsSubmissionForAllEarnersCreated is a log parse operation binding the contract event 0x5251b6fdefcb5d81144e735f69ea4c695fd43b0289ca53dc075033f5fc80068b.
⋮----
func (_IRewardsCoordinator *IRewardsCoordinatorFilterer) ParseRewardsSubmissionForAllEarnersCreated(log types.Log) (*IRewardsCoordinatorRewardsSubmissionForAllEarnersCreated, error)
⋮----
// IRewardsCoordinatorRewardsUpdaterSetIterator is returned from FilterRewardsUpdaterSet and is used to iterate over the raw logs and unpacked data for RewardsUpdaterSet events raised by the IRewardsCoordinator contract.
type IRewardsCoordinatorRewardsUpdaterSetIterator struct {
	Event *IRewardsCoordinatorRewardsUpdaterSet // 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
}
⋮----
Event *IRewardsCoordinatorRewardsUpdaterSet // Event containing the contract specifics and raw log
⋮----
// IRewardsCoordinatorRewardsUpdaterSet represents a RewardsUpdaterSet event raised by the IRewardsCoordinator contract.
type IRewardsCoordinatorRewardsUpdaterSet struct {
	OldRewardsUpdater common.Address
	NewRewardsUpdater common.Address
	Raw               types.Log // Blockchain specific contextual infos
}
⋮----
Raw               types.Log // Blockchain specific contextual infos
⋮----
// FilterRewardsUpdaterSet is a free log retrieval operation binding the contract event 0x237b82f438d75fc568ebab484b75b01d9287b9e98b490b7c23221623b6705dbb.
⋮----
// Solidity: event RewardsUpdaterSet(address indexed oldRewardsUpdater, address indexed newRewardsUpdater)
func (_IRewardsCoordinator *IRewardsCoordinatorFilterer) FilterRewardsUpdaterSet(opts *bind.FilterOpts, oldRewardsUpdater []common.Address, newRewardsUpdater []common.Address) (*IRewardsCoordinatorRewardsUpdaterSetIterator, error)
⋮----
var oldRewardsUpdaterRule []interface{}
⋮----
var newRewardsUpdaterRule []interface{}
⋮----
// WatchRewardsUpdaterSet is a free log subscription operation binding the contract event 0x237b82f438d75fc568ebab484b75b01d9287b9e98b490b7c23221623b6705dbb.
⋮----
func (_IRewardsCoordinator *IRewardsCoordinatorFilterer) WatchRewardsUpdaterSet(opts *bind.WatchOpts, sink chan<- *IRewardsCoordinatorRewardsUpdaterSet, oldRewardsUpdater []common.Address, newRewardsUpdater []common.Address) (event.Subscription, error)
⋮----
// ParseRewardsUpdaterSet is a log parse operation binding the contract event 0x237b82f438d75fc568ebab484b75b01d9287b9e98b490b7c23221623b6705dbb.
⋮----
func (_IRewardsCoordinator *IRewardsCoordinatorFilterer) ParseRewardsUpdaterSet(log types.Log) (*IRewardsCoordinatorRewardsUpdaterSet, error)
⋮----
// IRewardsCoordinatorTotalStakeRewardsSubmissionCreatedIterator is returned from FilterTotalStakeRewardsSubmissionCreated and is used to iterate over the raw logs and unpacked data for TotalStakeRewardsSubmissionCreated events raised by the IRewardsCoordinator contract.
type IRewardsCoordinatorTotalStakeRewardsSubmissionCreatedIterator struct {
	Event *IRewardsCoordinatorTotalStakeRewardsSubmissionCreated // 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
}
⋮----
Event *IRewardsCoordinatorTotalStakeRewardsSubmissionCreated // Event containing the contract specifics and raw log
⋮----
// IRewardsCoordinatorTotalStakeRewardsSubmissionCreated represents a TotalStakeRewardsSubmissionCreated event raised by the IRewardsCoordinator contract.
type IRewardsCoordinatorTotalStakeRewardsSubmissionCreated struct {
	Caller                common.Address
	RewardsSubmissionHash [32]byte
	OperatorSet           OperatorSet
	SubmissionNonce       *big.Int
	RewardsSubmission     IRewardsCoordinatorTypesRewardsSubmission
	Raw                   types.Log // Blockchain specific contextual infos
}
⋮----
// FilterTotalStakeRewardsSubmissionCreated is a free log retrieval operation binding the contract event 0x71836f06ac5c96075d4c5b5699a92b18e9c6d91579a382e9e55a1adf097f64df.
⋮----
// Solidity: event TotalStakeRewardsSubmissionCreated(address indexed caller, bytes32 indexed rewardsSubmissionHash, (address,uint32) operatorSet, uint256 submissionNonce, ((address,uint96)[],address,uint256,uint32,uint32) rewardsSubmission)
func (_IRewardsCoordinator *IRewardsCoordinatorFilterer) FilterTotalStakeRewardsSubmissionCreated(opts *bind.FilterOpts, caller []common.Address, rewardsSubmissionHash [][32]byte) (*IRewardsCoordinatorTotalStakeRewardsSubmissionCreatedIterator, error)
⋮----
// WatchTotalStakeRewardsSubmissionCreated is a free log subscription operation binding the contract event 0x71836f06ac5c96075d4c5b5699a92b18e9c6d91579a382e9e55a1adf097f64df.
⋮----
func (_IRewardsCoordinator *IRewardsCoordinatorFilterer) WatchTotalStakeRewardsSubmissionCreated(opts *bind.WatchOpts, sink chan<- *IRewardsCoordinatorTotalStakeRewardsSubmissionCreated, caller []common.Address, rewardsSubmissionHash [][32]byte) (event.Subscription, error)
⋮----
// ParseTotalStakeRewardsSubmissionCreated is a log parse operation binding the contract event 0x71836f06ac5c96075d4c5b5699a92b18e9c6d91579a382e9e55a1adf097f64df.
⋮----
func (_IRewardsCoordinator *IRewardsCoordinatorFilterer) ParseTotalStakeRewardsSubmissionCreated(log types.Log) (*IRewardsCoordinatorTotalStakeRewardsSubmissionCreated, error)
⋮----
// IRewardsCoordinatorUniqueStakeRewardsSubmissionCreatedIterator is returned from FilterUniqueStakeRewardsSubmissionCreated and is used to iterate over the raw logs and unpacked data for UniqueStakeRewardsSubmissionCreated events raised by the IRewardsCoordinator contract.
type IRewardsCoordinatorUniqueStakeRewardsSubmissionCreatedIterator struct {
	Event *IRewardsCoordinatorUniqueStakeRewardsSubmissionCreated // 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
}
⋮----
Event *IRewardsCoordinatorUniqueStakeRewardsSubmissionCreated // Event containing the contract specifics and raw log
⋮----
// IRewardsCoordinatorUniqueStakeRewardsSubmissionCreated represents a UniqueStakeRewardsSubmissionCreated event raised by the IRewardsCoordinator contract.
type IRewardsCoordinatorUniqueStakeRewardsSubmissionCreated struct {
	Caller                common.Address
	RewardsSubmissionHash [32]byte
	OperatorSet           OperatorSet
	SubmissionNonce       *big.Int
	RewardsSubmission     IRewardsCoordinatorTypesRewardsSubmission
	Raw                   types.Log // Blockchain specific contextual infos
}
⋮----
// FilterUniqueStakeRewardsSubmissionCreated is a free log retrieval operation binding the contract event 0xb3337dc034abe0f5e3694e1f115f3d6ec9fcee74e7835ea68f6e2d29bbc1b0aa.
⋮----
// Solidity: event UniqueStakeRewardsSubmissionCreated(address indexed caller, bytes32 indexed rewardsSubmissionHash, (address,uint32) operatorSet, uint256 submissionNonce, ((address,uint96)[],address,uint256,uint32,uint32) rewardsSubmission)
func (_IRewardsCoordinator *IRewardsCoordinatorFilterer) FilterUniqueStakeRewardsSubmissionCreated(opts *bind.FilterOpts, caller []common.Address, rewardsSubmissionHash [][32]byte) (*IRewardsCoordinatorUniqueStakeRewardsSubmissionCreatedIterator, error)
⋮----
// WatchUniqueStakeRewardsSubmissionCreated is a free log subscription operation binding the contract event 0xb3337dc034abe0f5e3694e1f115f3d6ec9fcee74e7835ea68f6e2d29bbc1b0aa.
⋮----
func (_IRewardsCoordinator *IRewardsCoordinatorFilterer) WatchUniqueStakeRewardsSubmissionCreated(opts *bind.WatchOpts, sink chan<- *IRewardsCoordinatorUniqueStakeRewardsSubmissionCreated, caller []common.Address, rewardsSubmissionHash [][32]byte) (event.Subscription, error)
⋮----
// ParseUniqueStakeRewardsSubmissionCreated is a log parse operation binding the contract event 0xb3337dc034abe0f5e3694e1f115f3d6ec9fcee74e7835ea68f6e2d29bbc1b0aa.
⋮----
func (_IRewardsCoordinator *IRewardsCoordinatorFilterer) ParseUniqueStakeRewardsSubmissionCreated(log types.Log) (*IRewardsCoordinatorUniqueStakeRewardsSubmissionCreated, error)
````

## File: pkg/bindings/ISemVerMixin/binding.go
````go
// Code generated - DO NOT EDIT.
// This file is a generated binding and any manual changes will be lost.
⋮----
package ISemVerMixin
⋮----
import (
	"errors"
	"math/big"
	"strings"

	ethereum "github.com/ethereum/go-ethereum"
	"github.com/ethereum/go-ethereum/accounts/abi"
	"github.com/ethereum/go-ethereum/accounts/abi/bind"
	"github.com/ethereum/go-ethereum/common"
	"github.com/ethereum/go-ethereum/core/types"
	"github.com/ethereum/go-ethereum/event"
)
⋮----
"errors"
"math/big"
"strings"
⋮----
ethereum "github.com/ethereum/go-ethereum"
"github.com/ethereum/go-ethereum/accounts/abi"
"github.com/ethereum/go-ethereum/accounts/abi/bind"
"github.com/ethereum/go-ethereum/common"
"github.com/ethereum/go-ethereum/core/types"
"github.com/ethereum/go-ethereum/event"
⋮----
// Reference imports to suppress errors if they are not otherwise used.
var (
	_ = errors.New
	_ = big.NewInt
	_ = strings.NewReader
	_ = ethereum.NotFound
	_ = bind.Bind
	_ = common.Big1
	_ = types.BloomLookup
	_ = event.NewSubscription
	_ = abi.ConvertType
)
⋮----
// ISemVerMixinMetaData contains all meta data concerning the ISemVerMixin contract.
var ISemVerMixinMetaData = &bind.MetaData{
	ABI: "[{\"type\":\"function\",\"name\":\"version\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"string\",\"internalType\":\"string\"}],\"stateMutability\":\"view\"}]",
}
⋮----
// ISemVerMixinABI is the input ABI used to generate the binding from.
// Deprecated: Use ISemVerMixinMetaData.ABI instead.
var ISemVerMixinABI = ISemVerMixinMetaData.ABI
⋮----
// ISemVerMixin is an auto generated Go binding around an Ethereum contract.
type ISemVerMixin struct {
	ISemVerMixinCaller     // Read-only binding to the contract
	ISemVerMixinTransactor // Write-only binding to the contract
	ISemVerMixinFilterer   // Log filterer for contract events
}
⋮----
ISemVerMixinCaller     // Read-only binding to the contract
ISemVerMixinTransactor // Write-only binding to the contract
ISemVerMixinFilterer   // Log filterer for contract events
⋮----
// ISemVerMixinCaller is an auto generated read-only Go binding around an Ethereum contract.
type ISemVerMixinCaller struct {
	contract *bind.BoundContract // Generic contract wrapper for the low level calls
}
⋮----
contract *bind.BoundContract // Generic contract wrapper for the low level calls
⋮----
// ISemVerMixinTransactor is an auto generated write-only Go binding around an Ethereum contract.
type ISemVerMixinTransactor struct {
	contract *bind.BoundContract // Generic contract wrapper for the low level calls
}
⋮----
// ISemVerMixinFilterer is an auto generated log filtering Go binding around an Ethereum contract events.
type ISemVerMixinFilterer struct {
	contract *bind.BoundContract // Generic contract wrapper for the low level calls
}
⋮----
// ISemVerMixinSession is an auto generated Go binding around an Ethereum contract,
// with pre-set call and transact options.
type ISemVerMixinSession struct {
	Contract     *ISemVerMixin     // Generic contract binding to set the session for
	CallOpts     bind.CallOpts     // Call options to use throughout this session
	TransactOpts bind.TransactOpts // Transaction auth options to use throughout this session
}
⋮----
Contract     *ISemVerMixin     // Generic contract binding to set the session for
CallOpts     bind.CallOpts     // Call options to use throughout this session
TransactOpts bind.TransactOpts // Transaction auth options to use throughout this session
⋮----
// ISemVerMixinCallerSession is an auto generated read-only Go binding around an Ethereum contract,
// with pre-set call options.
type ISemVerMixinCallerSession struct {
	Contract *ISemVerMixinCaller // Generic contract caller binding to set the session for
	CallOpts bind.CallOpts       // Call options to use throughout this session
}
⋮----
Contract *ISemVerMixinCaller // Generic contract caller binding to set the session for
CallOpts bind.CallOpts       // Call options to use throughout this session
⋮----
// ISemVerMixinTransactorSession is an auto generated write-only Go binding around an Ethereum contract,
// with pre-set transact options.
type ISemVerMixinTransactorSession struct {
	Contract     *ISemVerMixinTransactor // Generic contract transactor binding to set the session for
	TransactOpts bind.TransactOpts       // Transaction auth options to use throughout this session
}
⋮----
Contract     *ISemVerMixinTransactor // Generic contract transactor binding to set the session for
TransactOpts bind.TransactOpts       // Transaction auth options to use throughout this session
⋮----
// ISemVerMixinRaw is an auto generated low-level Go binding around an Ethereum contract.
type ISemVerMixinRaw struct {
	Contract *ISemVerMixin // Generic contract binding to access the raw methods on
}
⋮----
Contract *ISemVerMixin // Generic contract binding to access the raw methods on
⋮----
// ISemVerMixinCallerRaw is an auto generated low-level read-only Go binding around an Ethereum contract.
type ISemVerMixinCallerRaw struct {
	Contract *ISemVerMixinCaller // Generic read-only contract binding to access the raw methods on
}
⋮----
Contract *ISemVerMixinCaller // Generic read-only contract binding to access the raw methods on
⋮----
// ISemVerMixinTransactorRaw is an auto generated low-level write-only Go binding around an Ethereum contract.
type ISemVerMixinTransactorRaw struct {
	Contract *ISemVerMixinTransactor // Generic write-only contract binding to access the raw methods on
}
⋮----
Contract *ISemVerMixinTransactor // Generic write-only contract binding to access the raw methods on
⋮----
// NewISemVerMixin creates a new instance of ISemVerMixin, bound to a specific deployed contract.
func NewISemVerMixin(address common.Address, backend bind.ContractBackend) (*ISemVerMixin, error)
⋮----
// NewISemVerMixinCaller creates a new read-only instance of ISemVerMixin, bound to a specific deployed contract.
func NewISemVerMixinCaller(address common.Address, caller bind.ContractCaller) (*ISemVerMixinCaller, error)
⋮----
// NewISemVerMixinTransactor creates a new write-only instance of ISemVerMixin, bound to a specific deployed contract.
func NewISemVerMixinTransactor(address common.Address, transactor bind.ContractTransactor) (*ISemVerMixinTransactor, error)
⋮----
// NewISemVerMixinFilterer creates a new log filterer instance of ISemVerMixin, bound to a specific deployed contract.
func NewISemVerMixinFilterer(address common.Address, filterer bind.ContractFilterer) (*ISemVerMixinFilterer, error)
⋮----
// bindISemVerMixin binds a generic wrapper to an already deployed contract.
func bindISemVerMixin(address common.Address, caller bind.ContractCaller, transactor bind.ContractTransactor, filterer bind.ContractFilterer) (*bind.BoundContract, error)
⋮----
// Call invokes the (constant) contract method with params as input values and
// sets the output to result. The result type might be a single field for simple
// returns, a slice of interfaces for anonymous returns and a struct for named
// returns.
func (_ISemVerMixin *ISemVerMixinRaw) Call(opts *bind.CallOpts, result *[]interface
⋮----
// Transfer initiates a plain transaction to move funds to the contract, calling
// its default method if one is available.
func (_ISemVerMixin *ISemVerMixinRaw) Transfer(opts *bind.TransactOpts) (*types.Transaction, error)
⋮----
// Transact invokes the (paid) contract method with params as input values.
func (_ISemVerMixin *ISemVerMixinRaw) Transact(opts *bind.TransactOpts, method string, params ...interface
⋮----
// Version is a free data retrieval call binding the contract method 0x54fd4d50.
//
// Solidity: function version() view returns(string)
func (_ISemVerMixin *ISemVerMixinCaller) Version(opts *bind.CallOpts) (string, error)
⋮----
var out []interface{}
````

## File: pkg/bindings/IShareManager/binding.go
````go
// Code generated - DO NOT EDIT.
// This file is a generated binding and any manual changes will be lost.
⋮----
package IShareManager
⋮----
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"
)
⋮----
"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
)
⋮----
// OperatorSet is an auto generated low-level Go binding around an user-defined struct.
type OperatorSet struct {
	Avs common.Address
	Id  uint32
}
⋮----
// IShareManagerMetaData contains all meta data concerning the IShareManager contract.
var IShareManagerMetaData = &bind.MetaData{
	ABI: "[{\"type\":\"function\",\"name\":\"addShares\",\"inputs\":[{\"name\":\"staker\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"strategy\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"},{\"name\":\"shares\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"increaseBurnOrRedistributableShares\",\"inputs\":[{\"name\":\"operatorSet\",\"type\":\"tuple\",\"internalType\":\"structOperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]},{\"name\":\"slashId\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"strategy\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"},{\"name\":\"addedSharesToBurn\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"removeDepositShares\",\"inputs\":[{\"name\":\"staker\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"strategy\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"},{\"name\":\"depositSharesToRemove\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"stakerDepositShares\",\"inputs\":[{\"name\":\"user\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"strategy\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"}],\"outputs\":[{\"name\":\"depositShares\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"withdrawSharesAsTokens\",\"inputs\":[{\"name\":\"staker\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"strategy\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"},{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"contractIERC20\"},{\"name\":\"shares\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"}]",
}
⋮----
// IShareManagerABI is the input ABI used to generate the binding from.
// Deprecated: Use IShareManagerMetaData.ABI instead.
var IShareManagerABI = IShareManagerMetaData.ABI
⋮----
// IShareManager is an auto generated Go binding around an Ethereum contract.
type IShareManager struct {
	IShareManagerCaller     // Read-only binding to the contract
	IShareManagerTransactor // Write-only binding to the contract
	IShareManagerFilterer   // Log filterer for contract events
}
⋮----
IShareManagerCaller     // Read-only binding to the contract
IShareManagerTransactor // Write-only binding to the contract
IShareManagerFilterer   // Log filterer for contract events
⋮----
// IShareManagerCaller is an auto generated read-only Go binding around an Ethereum contract.
type IShareManagerCaller struct {
	contract *bind.BoundContract // Generic contract wrapper for the low level calls
}
⋮----
contract *bind.BoundContract // Generic contract wrapper for the low level calls
⋮----
// IShareManagerTransactor is an auto generated write-only Go binding around an Ethereum contract.
type IShareManagerTransactor struct {
	contract *bind.BoundContract // Generic contract wrapper for the low level calls
}
⋮----
// IShareManagerFilterer is an auto generated log filtering Go binding around an Ethereum contract events.
type IShareManagerFilterer struct {
	contract *bind.BoundContract // Generic contract wrapper for the low level calls
}
⋮----
// IShareManagerSession is an auto generated Go binding around an Ethereum contract,
// with pre-set call and transact options.
type IShareManagerSession struct {
	Contract     *IShareManager    // 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
}
⋮----
Contract     *IShareManager    // 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
⋮----
// IShareManagerCallerSession is an auto generated read-only Go binding around an Ethereum contract,
// with pre-set call options.
type IShareManagerCallerSession struct {
	Contract *IShareManagerCaller // Generic contract caller binding to set the session for
	CallOpts bind.CallOpts        // Call options to use throughout this session
}
⋮----
Contract *IShareManagerCaller // Generic contract caller binding to set the session for
CallOpts bind.CallOpts        // Call options to use throughout this session
⋮----
// IShareManagerTransactorSession is an auto generated write-only Go binding around an Ethereum contract,
// with pre-set transact options.
type IShareManagerTransactorSession struct {
	Contract     *IShareManagerTransactor // Generic contract transactor binding to set the session for
	TransactOpts bind.TransactOpts        // Transaction auth options to use throughout this session
}
⋮----
Contract     *IShareManagerTransactor // Generic contract transactor binding to set the session for
TransactOpts bind.TransactOpts        // Transaction auth options to use throughout this session
⋮----
// IShareManagerRaw is an auto generated low-level Go binding around an Ethereum contract.
type IShareManagerRaw struct {
	Contract *IShareManager // Generic contract binding to access the raw methods on
}
⋮----
Contract *IShareManager // Generic contract binding to access the raw methods on
⋮----
// IShareManagerCallerRaw is an auto generated low-level read-only Go binding around an Ethereum contract.
type IShareManagerCallerRaw struct {
	Contract *IShareManagerCaller // Generic read-only contract binding to access the raw methods on
}
⋮----
Contract *IShareManagerCaller // Generic read-only contract binding to access the raw methods on
⋮----
// IShareManagerTransactorRaw is an auto generated low-level write-only Go binding around an Ethereum contract.
type IShareManagerTransactorRaw struct {
	Contract *IShareManagerTransactor // Generic write-only contract binding to access the raw methods on
}
⋮----
Contract *IShareManagerTransactor // Generic write-only contract binding to access the raw methods on
⋮----
// NewIShareManager creates a new instance of IShareManager, bound to a specific deployed contract.
func NewIShareManager(address common.Address, backend bind.ContractBackend) (*IShareManager, error)
⋮----
// NewIShareManagerCaller creates a new read-only instance of IShareManager, bound to a specific deployed contract.
func NewIShareManagerCaller(address common.Address, caller bind.ContractCaller) (*IShareManagerCaller, error)
⋮----
// NewIShareManagerTransactor creates a new write-only instance of IShareManager, bound to a specific deployed contract.
func NewIShareManagerTransactor(address common.Address, transactor bind.ContractTransactor) (*IShareManagerTransactor, error)
⋮----
// NewIShareManagerFilterer creates a new log filterer instance of IShareManager, bound to a specific deployed contract.
func NewIShareManagerFilterer(address common.Address, filterer bind.ContractFilterer) (*IShareManagerFilterer, error)
⋮----
// bindIShareManager binds a generic wrapper to an already deployed contract.
func bindIShareManager(address common.Address, caller bind.ContractCaller, transactor bind.ContractTransactor, filterer bind.ContractFilterer) (*bind.BoundContract, error)
⋮----
// 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 (_IShareManager *IShareManagerRaw) Call(opts *bind.CallOpts, result *[]interface
⋮----
// Transfer initiates a plain transaction to move funds to the contract, calling
// its default method if one is available.
func (_IShareManager *IShareManagerRaw) Transfer(opts *bind.TransactOpts) (*types.Transaction, error)
⋮----
// Transact invokes the (paid) contract method with params as input values.
func (_IShareManager *IShareManagerRaw) Transact(opts *bind.TransactOpts, method string, params ...interface
⋮----
// StakerDepositShares is a free data retrieval call binding the contract method 0xfe243a17.
//
// Solidity: function stakerDepositShares(address user, address strategy) view returns(uint256 depositShares)
func (_IShareManager *IShareManagerCaller) StakerDepositShares(opts *bind.CallOpts, user common.Address, strategy common.Address) (*big.Int, error)
⋮----
var out []interface{}
⋮----
// AddShares is a paid mutator transaction binding the contract method 0x50ff7225.
⋮----
// Solidity: function addShares(address staker, address strategy, uint256 shares) returns(uint256, uint256)
func (_IShareManager *IShareManagerTransactor) AddShares(opts *bind.TransactOpts, staker common.Address, strategy common.Address, shares *big.Int) (*types.Transaction, error)
⋮----
// IncreaseBurnOrRedistributableShares is a paid mutator transaction binding the contract method 0x3fb99ca5.
⋮----
// Solidity: function increaseBurnOrRedistributableShares((address,uint32) operatorSet, uint256 slashId, address strategy, uint256 addedSharesToBurn) returns()
func (_IShareManager *IShareManagerTransactor) IncreaseBurnOrRedistributableShares(opts *bind.TransactOpts, operatorSet OperatorSet, slashId *big.Int, strategy common.Address, addedSharesToBurn *big.Int) (*types.Transaction, error)
⋮----
// RemoveDepositShares is a paid mutator transaction binding the contract method 0x724af423.
⋮----
// Solidity: function removeDepositShares(address staker, address strategy, uint256 depositSharesToRemove) returns(uint256)
func (_IShareManager *IShareManagerTransactor) RemoveDepositShares(opts *bind.TransactOpts, staker common.Address, strategy common.Address, depositSharesToRemove *big.Int) (*types.Transaction, error)
⋮----
// WithdrawSharesAsTokens is a paid mutator transaction binding the contract method 0x2eae418c.
⋮----
// Solidity: function withdrawSharesAsTokens(address staker, address strategy, address token, uint256 shares) returns()
func (_IShareManager *IShareManagerTransactor) WithdrawSharesAsTokens(opts *bind.TransactOpts, staker common.Address, strategy common.Address, token common.Address, shares *big.Int) (*types.Transaction, error)
````

## File: pkg/bindings/ISignatureUtils/binding.go
````go
// Code generated - DO NOT EDIT.
// This file is a generated binding and any manual changes will be lost.
⋮----
package ISignatureUtils
⋮----
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"
)
⋮----
"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
)
⋮----
// ISignatureUtilsMetaData contains all meta data concerning the ISignatureUtils contract.
var ISignatureUtilsMetaData = &bind.MetaData{
	ABI: "[{\"type\":\"error\",\"name\":\"InvalidSignature\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"SignatureExpired\",\"inputs\":[]}]",
}
⋮----
// ISignatureUtilsABI is the input ABI used to generate the binding from.
// Deprecated: Use ISignatureUtilsMetaData.ABI instead.
var ISignatureUtilsABI = ISignatureUtilsMetaData.ABI
⋮----
// ISignatureUtils is an auto generated Go binding around an Ethereum contract.
type ISignatureUtils struct {
	ISignatureUtilsCaller     // Read-only binding to the contract
	ISignatureUtilsTransactor // Write-only binding to the contract
	ISignatureUtilsFilterer   // Log filterer for contract events
}
⋮----
ISignatureUtilsCaller     // Read-only binding to the contract
ISignatureUtilsTransactor // Write-only binding to the contract
ISignatureUtilsFilterer   // Log filterer for contract events
⋮----
// ISignatureUtilsCaller is an auto generated read-only Go binding around an Ethereum contract.
type ISignatureUtilsCaller struct {
	contract *bind.BoundContract // Generic contract wrapper for the low level calls
}
⋮----
contract *bind.BoundContract // Generic contract wrapper for the low level calls
⋮----
// ISignatureUtilsTransactor is an auto generated write-only Go binding around an Ethereum contract.
type ISignatureUtilsTransactor struct {
	contract *bind.BoundContract // Generic contract wrapper for the low level calls
}
⋮----
// ISignatureUtilsFilterer is an auto generated log filtering Go binding around an Ethereum contract events.
type ISignatureUtilsFilterer struct {
	contract *bind.BoundContract // Generic contract wrapper for the low level calls
}
⋮----
// ISignatureUtilsSession is an auto generated Go binding around an Ethereum contract,
// with pre-set call and transact options.
type ISignatureUtilsSession struct {
	Contract     *ISignatureUtils  // 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
}
⋮----
Contract     *ISignatureUtils  // 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
⋮----
// ISignatureUtilsCallerSession is an auto generated read-only Go binding around an Ethereum contract,
// with pre-set call options.
type ISignatureUtilsCallerSession struct {
	Contract *ISignatureUtilsCaller // Generic contract caller binding to set the session for
	CallOpts bind.CallOpts          // Call options to use throughout this session
}
⋮----
Contract *ISignatureUtilsCaller // Generic contract caller binding to set the session for
CallOpts bind.CallOpts          // Call options to use throughout this session
⋮----
// ISignatureUtilsTransactorSession is an auto generated write-only Go binding around an Ethereum contract,
// with pre-set transact options.
type ISignatureUtilsTransactorSession struct {
	Contract     *ISignatureUtilsTransactor // Generic contract transactor binding to set the session for
	TransactOpts bind.TransactOpts          // Transaction auth options to use throughout this session
}
⋮----
Contract     *ISignatureUtilsTransactor // Generic contract transactor binding to set the session for
TransactOpts bind.TransactOpts          // Transaction auth options to use throughout this session
⋮----
// ISignatureUtilsRaw is an auto generated low-level Go binding around an Ethereum contract.
type ISignatureUtilsRaw struct {
	Contract *ISignatureUtils // Generic contract binding to access the raw methods on
}
⋮----
Contract *ISignatureUtils // Generic contract binding to access the raw methods on
⋮----
// ISignatureUtilsCallerRaw is an auto generated low-level read-only Go binding around an Ethereum contract.
type ISignatureUtilsCallerRaw struct {
	Contract *ISignatureUtilsCaller // Generic read-only contract binding to access the raw methods on
}
⋮----
Contract *ISignatureUtilsCaller // Generic read-only contract binding to access the raw methods on
⋮----
// ISignatureUtilsTransactorRaw is an auto generated low-level write-only Go binding around an Ethereum contract.
type ISignatureUtilsTransactorRaw struct {
	Contract *ISignatureUtilsTransactor // Generic write-only contract binding to access the raw methods on
}
⋮----
Contract *ISignatureUtilsTransactor // Generic write-only contract binding to access the raw methods on
⋮----
// NewISignatureUtils creates a new instance of ISignatureUtils, bound to a specific deployed contract.
func NewISignatureUtils(address common.Address, backend bind.ContractBackend) (*ISignatureUtils, error)
⋮----
// NewISignatureUtilsCaller creates a new read-only instance of ISignatureUtils, bound to a specific deployed contract.
func NewISignatureUtilsCaller(address common.Address, caller bind.ContractCaller) (*ISignatureUtilsCaller, error)
⋮----
// NewISignatureUtilsTransactor creates a new write-only instance of ISignatureUtils, bound to a specific deployed contract.
func NewISignatureUtilsTransactor(address common.Address, transactor bind.ContractTransactor) (*ISignatureUtilsTransactor, error)
⋮----
// NewISignatureUtilsFilterer creates a new log filterer instance of ISignatureUtils, bound to a specific deployed contract.
func NewISignatureUtilsFilterer(address common.Address, filterer bind.ContractFilterer) (*ISignatureUtilsFilterer, error)
⋮----
// bindISignatureUtils binds a generic wrapper to an already deployed contract.
func bindISignatureUtils(address common.Address, caller bind.ContractCaller, transactor bind.ContractTransactor, filterer bind.ContractFilterer) (*bind.BoundContract, error)
⋮----
// 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 (_ISignatureUtils *ISignatureUtilsRaw) Call(opts *bind.CallOpts, result *[]interface
⋮----
// Transfer initiates a plain transaction to move funds to the contract, calling
// its default method if one is available.
func (_ISignatureUtils *ISignatureUtilsRaw) Transfer(opts *bind.TransactOpts) (*types.Transaction, error)
⋮----
// Transact invokes the (paid) contract method with params as input values.
func (_ISignatureUtils *ISignatureUtilsRaw) Transact(opts *bind.TransactOpts, method string, params ...interface
````

## File: pkg/bindings/ISignatureUtilsMixin/binding.go
````go
// Code generated - DO NOT EDIT.
// This file is a generated binding and any manual changes will be lost.
⋮----
package ISignatureUtilsMixin
⋮----
import (
	"errors"
	"math/big"
	"strings"

	ethereum "github.com/ethereum/go-ethereum"
	"github.com/ethereum/go-ethereum/accounts/abi"
	"github.com/ethereum/go-ethereum/accounts/abi/bind"
	"github.com/ethereum/go-ethereum/common"
	"github.com/ethereum/go-ethereum/core/types"
	"github.com/ethereum/go-ethereum/event"
)
⋮----
"errors"
"math/big"
"strings"
⋮----
ethereum "github.com/ethereum/go-ethereum"
"github.com/ethereum/go-ethereum/accounts/abi"
"github.com/ethereum/go-ethereum/accounts/abi/bind"
"github.com/ethereum/go-ethereum/common"
"github.com/ethereum/go-ethereum/core/types"
"github.com/ethereum/go-ethereum/event"
⋮----
// Reference imports to suppress errors if they are not otherwise used.
var (
	_ = errors.New
	_ = big.NewInt
	_ = strings.NewReader
	_ = ethereum.NotFound
	_ = bind.Bind
	_ = common.Big1
	_ = types.BloomLookup
	_ = event.NewSubscription
	_ = abi.ConvertType
)
⋮----
// ISignatureUtilsMixinMetaData contains all meta data concerning the ISignatureUtilsMixin contract.
var ISignatureUtilsMixinMetaData = &bind.MetaData{
	ABI: "[{\"type\":\"function\",\"name\":\"domainSeparator\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"error\",\"name\":\"InvalidSignature\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"SignatureExpired\",\"inputs\":[]}]",
}
⋮----
// ISignatureUtilsMixinABI is the input ABI used to generate the binding from.
// Deprecated: Use ISignatureUtilsMixinMetaData.ABI instead.
var ISignatureUtilsMixinABI = ISignatureUtilsMixinMetaData.ABI
⋮----
// ISignatureUtilsMixin is an auto generated Go binding around an Ethereum contract.
type ISignatureUtilsMixin struct {
	ISignatureUtilsMixinCaller     // Read-only binding to the contract
	ISignatureUtilsMixinTransactor // Write-only binding to the contract
	ISignatureUtilsMixinFilterer   // Log filterer for contract events
}
⋮----
ISignatureUtilsMixinCaller     // Read-only binding to the contract
ISignatureUtilsMixinTransactor // Write-only binding to the contract
ISignatureUtilsMixinFilterer   // Log filterer for contract events
⋮----
// ISignatureUtilsMixinCaller is an auto generated read-only Go binding around an Ethereum contract.
type ISignatureUtilsMixinCaller struct {
	contract *bind.BoundContract // Generic contract wrapper for the low level calls
}
⋮----
contract *bind.BoundContract // Generic contract wrapper for the low level calls
⋮----
// ISignatureUtilsMixinTransactor is an auto generated write-only Go binding around an Ethereum contract.
type ISignatureUtilsMixinTransactor struct {
	contract *bind.BoundContract // Generic contract wrapper for the low level calls
}
⋮----
// ISignatureUtilsMixinFilterer is an auto generated log filtering Go binding around an Ethereum contract events.
type ISignatureUtilsMixinFilterer struct {
	contract *bind.BoundContract // Generic contract wrapper for the low level calls
}
⋮----
// ISignatureUtilsMixinSession is an auto generated Go binding around an Ethereum contract,
// with pre-set call and transact options.
type ISignatureUtilsMixinSession struct {
	Contract     *ISignatureUtilsMixin // Generic contract binding to set the session for
	CallOpts     bind.CallOpts         // Call options to use throughout this session
	TransactOpts bind.TransactOpts     // Transaction auth options to use throughout this session
}
⋮----
Contract     *ISignatureUtilsMixin // Generic contract binding to set the session for
CallOpts     bind.CallOpts         // Call options to use throughout this session
TransactOpts bind.TransactOpts     // Transaction auth options to use throughout this session
⋮----
// ISignatureUtilsMixinCallerSession is an auto generated read-only Go binding around an Ethereum contract,
// with pre-set call options.
type ISignatureUtilsMixinCallerSession struct {
	Contract *ISignatureUtilsMixinCaller // Generic contract caller binding to set the session for
	CallOpts bind.CallOpts               // Call options to use throughout this session
}
⋮----
Contract *ISignatureUtilsMixinCaller // Generic contract caller binding to set the session for
CallOpts bind.CallOpts               // Call options to use throughout this session
⋮----
// ISignatureUtilsMixinTransactorSession is an auto generated write-only Go binding around an Ethereum contract,
// with pre-set transact options.
type ISignatureUtilsMixinTransactorSession struct {
	Contract     *ISignatureUtilsMixinTransactor // Generic contract transactor binding to set the session for
	TransactOpts bind.TransactOpts               // Transaction auth options to use throughout this session
}
⋮----
Contract     *ISignatureUtilsMixinTransactor // Generic contract transactor binding to set the session for
TransactOpts bind.TransactOpts               // Transaction auth options to use throughout this session
⋮----
// ISignatureUtilsMixinRaw is an auto generated low-level Go binding around an Ethereum contract.
type ISignatureUtilsMixinRaw struct {
	Contract *ISignatureUtilsMixin // Generic contract binding to access the raw methods on
}
⋮----
Contract *ISignatureUtilsMixin // Generic contract binding to access the raw methods on
⋮----
// ISignatureUtilsMixinCallerRaw is an auto generated low-level read-only Go binding around an Ethereum contract.
type ISignatureUtilsMixinCallerRaw struct {
	Contract *ISignatureUtilsMixinCaller // Generic read-only contract binding to access the raw methods on
}
⋮----
Contract *ISignatureUtilsMixinCaller // Generic read-only contract binding to access the raw methods on
⋮----
// ISignatureUtilsMixinTransactorRaw is an auto generated low-level write-only Go binding around an Ethereum contract.
type ISignatureUtilsMixinTransactorRaw struct {
	Contract *ISignatureUtilsMixinTransactor // Generic write-only contract binding to access the raw methods on
}
⋮----
Contract *ISignatureUtilsMixinTransactor // Generic write-only contract binding to access the raw methods on
⋮----
// NewISignatureUtilsMixin creates a new instance of ISignatureUtilsMixin, bound to a specific deployed contract.
func NewISignatureUtilsMixin(address common.Address, backend bind.ContractBackend) (*ISignatureUtilsMixin, error)
⋮----
// NewISignatureUtilsMixinCaller creates a new read-only instance of ISignatureUtilsMixin, bound to a specific deployed contract.
func NewISignatureUtilsMixinCaller(address common.Address, caller bind.ContractCaller) (*ISignatureUtilsMixinCaller, error)
⋮----
// NewISignatureUtilsMixinTransactor creates a new write-only instance of ISignatureUtilsMixin, bound to a specific deployed contract.
func NewISignatureUtilsMixinTransactor(address common.Address, transactor bind.ContractTransactor) (*ISignatureUtilsMixinTransactor, error)
⋮----
// NewISignatureUtilsMixinFilterer creates a new log filterer instance of ISignatureUtilsMixin, bound to a specific deployed contract.
func NewISignatureUtilsMixinFilterer(address common.Address, filterer bind.ContractFilterer) (*ISignatureUtilsMixinFilterer, error)
⋮----
// bindISignatureUtilsMixin binds a generic wrapper to an already deployed contract.
func bindISignatureUtilsMixin(address common.Address, caller bind.ContractCaller, transactor bind.ContractTransactor, filterer bind.ContractFilterer) (*bind.BoundContract, error)
⋮----
// Call invokes the (constant) contract method with params as input values and
// sets the output to result. The result type might be a single field for simple
// returns, a slice of interfaces for anonymous returns and a struct for named
// returns.
func (_ISignatureUtilsMixin *ISignatureUtilsMixinRaw) Call(opts *bind.CallOpts, result *[]interface
⋮----
// Transfer initiates a plain transaction to move funds to the contract, calling
// its default method if one is available.
func (_ISignatureUtilsMixin *ISignatureUtilsMixinRaw) Transfer(opts *bind.TransactOpts) (*types.Transaction, error)
⋮----
// Transact invokes the (paid) contract method with params as input values.
func (_ISignatureUtilsMixin *ISignatureUtilsMixinRaw) Transact(opts *bind.TransactOpts, method string, params ...interface
⋮----
// DomainSeparator is a free data retrieval call binding the contract method 0xf698da25.
//
// Solidity: function domainSeparator() view returns(bytes32)
func (_ISignatureUtilsMixin *ISignatureUtilsMixinCaller) DomainSeparator(opts *bind.CallOpts) ([32]byte, error)
⋮----
var out []interface{}
````

## File: pkg/bindings/ISlashEscrow/binding.go
````go
// Code generated - DO NOT EDIT.
// This file is a generated binding and any manual changes will be lost.
⋮----
package ISlashEscrow
⋮----
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"
)
⋮----
"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
)
⋮----
// OperatorSet is an auto generated low-level Go binding around an user-defined struct.
type OperatorSet struct {
	Avs common.Address
	Id  uint32
}
⋮----
// ISlashEscrowMetaData contains all meta data concerning the ISlashEscrow contract.
var ISlashEscrowMetaData = &bind.MetaData{
	ABI: "[{\"type\":\"function\",\"name\":\"releaseTokens\",\"inputs\":[{\"name\":\"slashEscrowFactory\",\"type\":\"address\",\"internalType\":\"contractISlashEscrowFactory\"},{\"name\":\"slashEscrowImplementation\",\"type\":\"address\",\"internalType\":\"contractISlashEscrow\"},{\"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\":\"recipient\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"strategy\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"verifyDeploymentParameters\",\"inputs\":[{\"name\":\"slashEscrowFactory\",\"type\":\"address\",\"internalType\":\"contractISlashEscrowFactory\"},{\"name\":\"slashEscrowImplementation\",\"type\":\"address\",\"internalType\":\"contractISlashEscrow\"},{\"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\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"error\",\"name\":\"InvalidDeploymentParameters\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"OnlySlashEscrowFactory\",\"inputs\":[]}]",
}
⋮----
// ISlashEscrowABI is the input ABI used to generate the binding from.
// Deprecated: Use ISlashEscrowMetaData.ABI instead.
var ISlashEscrowABI = ISlashEscrowMetaData.ABI
⋮----
// ISlashEscrow is an auto generated Go binding around an Ethereum contract.
type ISlashEscrow struct {
	ISlashEscrowCaller     // Read-only binding to the contract
	ISlashEscrowTransactor // Write-only binding to the contract
	ISlashEscrowFilterer   // Log filterer for contract events
}
⋮----
ISlashEscrowCaller     // Read-only binding to the contract
ISlashEscrowTransactor // Write-only binding to the contract
ISlashEscrowFilterer   // Log filterer for contract events
⋮----
// ISlashEscrowCaller is an auto generated read-only Go binding around an Ethereum contract.
type ISlashEscrowCaller struct {
	contract *bind.BoundContract // Generic contract wrapper for the low level calls
}
⋮----
contract *bind.BoundContract // Generic contract wrapper for the low level calls
⋮----
// ISlashEscrowTransactor is an auto generated write-only Go binding around an Ethereum contract.
type ISlashEscrowTransactor struct {
	contract *bind.BoundContract // Generic contract wrapper for the low level calls
}
⋮----
// ISlashEscrowFilterer is an auto generated log filtering Go binding around an Ethereum contract events.
type ISlashEscrowFilterer struct {
	contract *bind.BoundContract // Generic contract wrapper for the low level calls
}
⋮----
// ISlashEscrowSession is an auto generated Go binding around an Ethereum contract,
// with pre-set call and transact options.
type ISlashEscrowSession struct {
	Contract     *ISlashEscrow     // 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
}
⋮----
Contract     *ISlashEscrow     // 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
⋮----
// ISlashEscrowCallerSession is an auto generated read-only Go binding around an Ethereum contract,
// with pre-set call options.
type ISlashEscrowCallerSession struct {
	Contract *ISlashEscrowCaller // Generic contract caller binding to set the session for
	CallOpts bind.CallOpts       // Call options to use throughout this session
}
⋮----
Contract *ISlashEscrowCaller // Generic contract caller binding to set the session for
CallOpts bind.CallOpts       // Call options to use throughout this session
⋮----
// ISlashEscrowTransactorSession is an auto generated write-only Go binding around an Ethereum contract,
// with pre-set transact options.
type ISlashEscrowTransactorSession struct {
	Contract     *ISlashEscrowTransactor // Generic contract transactor binding to set the session for
	TransactOpts bind.TransactOpts       // Transaction auth options to use throughout this session
}
⋮----
Contract     *ISlashEscrowTransactor // Generic contract transactor binding to set the session for
TransactOpts bind.TransactOpts       // Transaction auth options to use throughout this session
⋮----
// ISlashEscrowRaw is an auto generated low-level Go binding around an Ethereum contract.
type ISlashEscrowRaw struct {
	Contract *ISlashEscrow // Generic contract binding to access the raw methods on
}
⋮----
Contract *ISlashEscrow // Generic contract binding to access the raw methods on
⋮----
// ISlashEscrowCallerRaw is an auto generated low-level read-only Go binding around an Ethereum contract.
type ISlashEscrowCallerRaw struct {
	Contract *ISlashEscrowCaller // Generic read-only contract binding to access the raw methods on
}
⋮----
Contract *ISlashEscrowCaller // Generic read-only contract binding to access the raw methods on
⋮----
// ISlashEscrowTransactorRaw is an auto generated low-level write-only Go binding around an Ethereum contract.
type ISlashEscrowTransactorRaw struct {
	Contract *ISlashEscrowTransactor // Generic write-only contract binding to access the raw methods on
}
⋮----
Contract *ISlashEscrowTransactor // Generic write-only contract binding to access the raw methods on
⋮----
// NewISlashEscrow creates a new instance of ISlashEscrow, bound to a specific deployed contract.
func NewISlashEscrow(address common.Address, backend bind.ContractBackend) (*ISlashEscrow, error)
⋮----
// NewISlashEscrowCaller creates a new read-only instance of ISlashEscrow, bound to a specific deployed contract.
func NewISlashEscrowCaller(address common.Address, caller bind.ContractCaller) (*ISlashEscrowCaller, error)
⋮----
// NewISlashEscrowTransactor creates a new write-only instance of ISlashEscrow, bound to a specific deployed contract.
func NewISlashEscrowTransactor(address common.Address, transactor bind.ContractTransactor) (*ISlashEscrowTransactor, error)
⋮----
// NewISlashEscrowFilterer creates a new log filterer instance of ISlashEscrow, bound to a specific deployed contract.
func NewISlashEscrowFilterer(address common.Address, filterer bind.ContractFilterer) (*ISlashEscrowFilterer, error)
⋮----
// bindISlashEscrow binds a generic wrapper to an already deployed contract.
func bindISlashEscrow(address common.Address, caller bind.ContractCaller, transactor bind.ContractTransactor, filterer bind.ContractFilterer) (*bind.BoundContract, error)
⋮----
// 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 (_ISlashEscrow *ISlashEscrowRaw) Call(opts *bind.CallOpts, result *[]interface
⋮----
// Transfer initiates a plain transaction to move funds to the contract, calling
// its default method if one is available.
func (_ISlashEscrow *ISlashEscrowRaw) Transfer(opts *bind.TransactOpts) (*types.Transaction, error)
⋮----
// Transact invokes the (paid) contract method with params as input values.
func (_ISlashEscrow *ISlashEscrowRaw) Transact(opts *bind.TransactOpts, method string, params ...interface
⋮----
// VerifyDeploymentParameters is a free data retrieval call binding the contract method 0x0d9e4ef1.
//
// Solidity: function verifyDeploymentParameters(address slashEscrowFactory, address slashEscrowImplementation, (address,uint32) operatorSet, uint256 slashId) view returns(bool)
func (_ISlashEscrow *ISlashEscrowCaller) VerifyDeploymentParameters(opts *bind.CallOpts, slashEscrowFactory common.Address, slashEscrowImplementation common.Address, operatorSet OperatorSet, slashId *big.Int) (bool, error)
⋮----
var out []interface{}
⋮----
// ReleaseTokens is a paid mutator transaction binding the contract method 0xff491e65.
⋮----
// Solidity: function releaseTokens(address slashEscrowFactory, address slashEscrowImplementation, (address,uint32) operatorSet, uint256 slashId, address recipient, address strategy) returns()
func (_ISlashEscrow *ISlashEscrowTransactor) ReleaseTokens(opts *bind.TransactOpts, slashEscrowFactory common.Address, slashEscrowImplementation common.Address, operatorSet OperatorSet, slashId *big.Int, recipient common.Address, strategy common.Address) (*types.Transaction, error)
````

## File: pkg/bindings/ISlashEscrowFactory/binding.go
````go
// Code generated - DO NOT EDIT.
// This file is a generated binding and any manual changes will be lost.
⋮----
package ISlashEscrowFactory
⋮----
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"
)
⋮----
"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
)
⋮----
// OperatorSet is an auto generated low-level Go binding around an user-defined struct.
type OperatorSet struct {
	Avs common.Address
	Id  uint32
}
⋮----
// ISlashEscrowFactoryMetaData contains all meta data concerning the ISlashEscrowFactory contract.
var ISlashEscrowFactoryMetaData = &bind.MetaData{
	ABI: "[{\"type\":\"function\",\"name\":\"computeSlashEscrowSalt\",\"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\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"pure\"},{\"type\":\"function\",\"name\":\"getEscrowCompleteBlock\",\"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\":\"uint32\",\"internalType\":\"uint32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getEscrowStartBlock\",\"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\":\"getGlobalEscrowDelay\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getPendingEscrows\",\"inputs\":[],\"outputs\":[{\"name\":\"operatorSets\",\"type\":\"tuple[]\",\"internalType\":\"structOperatorSet[]\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]},{\"name\":\"isRedistributing\",\"type\":\"bool[]\",\"internalType\":\"bool[]\"},{\"name\":\"slashIds\",\"type\":\"uint256[][]\",\"internalType\":\"uint256[][]\"},{\"name\":\"completeBlocks\",\"type\":\"uint32[][]\",\"internalType\":\"uint32[][]\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getPendingOperatorSets\",\"inputs\":[],\"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\":\"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\":\"getPendingStrategiesForSlashId\",\"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\":\"strategies\",\"type\":\"address[]\",\"internalType\":\"contractIStrategy[]\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getPendingStrategiesForSlashIds\",\"inputs\":[{\"name\":\"operatorSet\",\"type\":\"tuple\",\"internalType\":\"structOperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]}],\"outputs\":[{\"name\":\"strategies\",\"type\":\"address[][]\",\"internalType\":\"contractIStrategy[][]\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getPendingUnderlyingAmountForStrategy\",\"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\":\"getSlashEscrow\",\"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\":\"contractISlashEscrow\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getStrategyEscrowDelay\",\"inputs\":[{\"name\":\"strategy\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getTotalPendingOperatorSets\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getTotalPendingSlashIds\",\"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\":\"getTotalPendingStrategiesForSlashId\",\"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\":\"initialize\",\"inputs\":[{\"name\":\"initialOwner\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"initialPausedStatus\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"initialGlobalDelayBlocks\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"initiateSlashEscrow\",\"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\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"isDeployedSlashEscrow\",\"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\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"isDeployedSlashEscrow\",\"inputs\":[{\"name\":\"slashEscrow\",\"type\":\"address\",\"internalType\":\"contractISlashEscrow\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"isEscrowPaused\",\"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\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"isPendingOperatorSet\",\"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\":\"isPendingSlashId\",\"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\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"pauseEscrow\",\"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\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"releaseSlashEscrow\",\"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\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"releaseSlashEscrowByStrategy\",\"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\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"setGlobalEscrowDelay\",\"inputs\":[{\"name\":\"delay\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"setStrategyEscrowDelay\",\"inputs\":[{\"name\":\"strategy\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"},{\"name\":\"delay\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"unpauseEscrow\",\"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\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"event\",\"name\":\"EscrowComplete\",\"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\":\"recipient\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"EscrowPaused\",\"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\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"EscrowUnpaused\",\"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\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"GlobalEscrowDelaySet\",\"inputs\":[{\"name\":\"delay\",\"type\":\"uint32\",\"indexed\":false,\"internalType\":\"uint32\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"StartEscrow\",\"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\":\"startBlock\",\"type\":\"uint32\",\"indexed\":false,\"internalType\":\"uint32\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"StrategyEscrowDelaySet\",\"inputs\":[{\"name\":\"strategy\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"contractIStrategy\"},{\"name\":\"delay\",\"type\":\"uint32\",\"indexed\":false,\"internalType\":\"uint32\"}],\"anonymous\":false},{\"type\":\"error\",\"name\":\"EscrowDelayNotElapsed\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"EscrowNotMature\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"OnlyRedistributionRecipient\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"OnlyStrategyManager\",\"inputs\":[]}]",
}
⋮----
// ISlashEscrowFactoryABI is the input ABI used to generate the binding from.
// Deprecated: Use ISlashEscrowFactoryMetaData.ABI instead.
var ISlashEscrowFactoryABI = ISlashEscrowFactoryMetaData.ABI
⋮----
// ISlashEscrowFactory is an auto generated Go binding around an Ethereum contract.
type ISlashEscrowFactory struct {
	ISlashEscrowFactoryCaller     // Read-only binding to the contract
	ISlashEscrowFactoryTransactor // Write-only binding to the contract
	ISlashEscrowFactoryFilterer   // Log filterer for contract events
}
⋮----
ISlashEscrowFactoryCaller     // Read-only binding to the contract
ISlashEscrowFactoryTransactor // Write-only binding to the contract
ISlashEscrowFactoryFilterer   // Log filterer for contract events
⋮----
// ISlashEscrowFactoryCaller is an auto generated read-only Go binding around an Ethereum contract.
type ISlashEscrowFactoryCaller struct {
	contract *bind.BoundContract // Generic contract wrapper for the low level calls
}
⋮----
contract *bind.BoundContract // Generic contract wrapper for the low level calls
⋮----
// ISlashEscrowFactoryTransactor is an auto generated write-only Go binding around an Ethereum contract.
type ISlashEscrowFactoryTransactor struct {
	contract *bind.BoundContract // Generic contract wrapper for the low level calls
}
⋮----
// ISlashEscrowFactoryFilterer is an auto generated log filtering Go binding around an Ethereum contract events.
type ISlashEscrowFactoryFilterer struct {
	contract *bind.BoundContract // Generic contract wrapper for the low level calls
}
⋮----
// ISlashEscrowFactorySession is an auto generated Go binding around an Ethereum contract,
// with pre-set call and transact options.
type ISlashEscrowFactorySession struct {
	Contract     *ISlashEscrowFactory // 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
}
⋮----
Contract     *ISlashEscrowFactory // 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
⋮----
// ISlashEscrowFactoryCallerSession is an auto generated read-only Go binding around an Ethereum contract,
// with pre-set call options.
type ISlashEscrowFactoryCallerSession struct {
	Contract *ISlashEscrowFactoryCaller // Generic contract caller binding to set the session for
	CallOpts bind.CallOpts              // Call options to use throughout this session
}
⋮----
Contract *ISlashEscrowFactoryCaller // Generic contract caller binding to set the session for
CallOpts bind.CallOpts              // Call options to use throughout this session
⋮----
// ISlashEscrowFactoryTransactorSession is an auto generated write-only Go binding around an Ethereum contract,
// with pre-set transact options.
type ISlashEscrowFactoryTransactorSession struct {
	Contract     *ISlashEscrowFactoryTransactor // Generic contract transactor binding to set the session for
	TransactOpts bind.TransactOpts              // Transaction auth options to use throughout this session
}
⋮----
Contract     *ISlashEscrowFactoryTransactor // Generic contract transactor binding to set the session for
TransactOpts bind.TransactOpts              // Transaction auth options to use throughout this session
⋮----
// ISlashEscrowFactoryRaw is an auto generated low-level Go binding around an Ethereum contract.
type ISlashEscrowFactoryRaw struct {
	Contract *ISlashEscrowFactory // Generic contract binding to access the raw methods on
}
⋮----
Contract *ISlashEscrowFactory // Generic contract binding to access the raw methods on
⋮----
// ISlashEscrowFactoryCallerRaw is an auto generated low-level read-only Go binding around an Ethereum contract.
type ISlashEscrowFactoryCallerRaw struct {
	Contract *ISlashEscrowFactoryCaller // Generic read-only contract binding to access the raw methods on
}
⋮----
Contract *ISlashEscrowFactoryCaller // Generic read-only contract binding to access the raw methods on
⋮----
// ISlashEscrowFactoryTransactorRaw is an auto generated low-level write-only Go binding around an Ethereum contract.
type ISlashEscrowFactoryTransactorRaw struct {
	Contract *ISlashEscrowFactoryTransactor // Generic write-only contract binding to access the raw methods on
}
⋮----
Contract *ISlashEscrowFactoryTransactor // Generic write-only contract binding to access the raw methods on
⋮----
// NewISlashEscrowFactory creates a new instance of ISlashEscrowFactory, bound to a specific deployed contract.
func NewISlashEscrowFactory(address common.Address, backend bind.ContractBackend) (*ISlashEscrowFactory, error)
⋮----
// NewISlashEscrowFactoryCaller creates a new read-only instance of ISlashEscrowFactory, bound to a specific deployed contract.
func NewISlashEscrowFactoryCaller(address common.Address, caller bind.ContractCaller) (*ISlashEscrowFactoryCaller, error)
⋮----
// NewISlashEscrowFactoryTransactor creates a new write-only instance of ISlashEscrowFactory, bound to a specific deployed contract.
func NewISlashEscrowFactoryTransactor(address common.Address, transactor bind.ContractTransactor) (*ISlashEscrowFactoryTransactor, error)
⋮----
// NewISlashEscrowFactoryFilterer creates a new log filterer instance of ISlashEscrowFactory, bound to a specific deployed contract.
func NewISlashEscrowFactoryFilterer(address common.Address, filterer bind.ContractFilterer) (*ISlashEscrowFactoryFilterer, error)
⋮----
// bindISlashEscrowFactory binds a generic wrapper to an already deployed contract.
func bindISlashEscrowFactory(address common.Address, caller bind.ContractCaller, transactor bind.ContractTransactor, filterer bind.ContractFilterer) (*bind.BoundContract, error)
⋮----
// 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 (_ISlashEscrowFactory *ISlashEscrowFactoryRaw) Call(opts *bind.CallOpts, result *[]interface
⋮----
// Transfer initiates a plain transaction to move funds to the contract, calling
// its default method if one is available.
func (_ISlashEscrowFactory *ISlashEscrowFactoryRaw) Transfer(opts *bind.TransactOpts) (*types.Transaction, error)
⋮----
// Transact invokes the (paid) contract method with params as input values.
func (_ISlashEscrowFactory *ISlashEscrowFactoryRaw) Transact(opts *bind.TransactOpts, method string, params ...interface
⋮----
// ComputeSlashEscrowSalt is a free data retrieval call binding the contract method 0xc2de7096.
//
// Solidity: function computeSlashEscrowSalt((address,uint32) operatorSet, uint256 slashId) pure returns(bytes32)
func (_ISlashEscrowFactory *ISlashEscrowFactoryCaller) ComputeSlashEscrowSalt(opts *bind.CallOpts, operatorSet OperatorSet, slashId *big.Int) ([32]byte, error)
⋮----
var out []interface{}
⋮----
// GetEscrowCompleteBlock is a free data retrieval call binding the contract method 0x0310f3e6.
⋮----
// Solidity: function getEscrowCompleteBlock((address,uint32) operatorSet, uint256 slashId) view returns(uint32)
func (_ISlashEscrowFactory *ISlashEscrowFactoryCaller) GetEscrowCompleteBlock(opts *bind.CallOpts, operatorSet OperatorSet, slashId *big.Int) (uint32, error)
⋮----
// GetEscrowStartBlock is a free data retrieval call binding the contract method 0x05a4dfbb.
⋮----
// Solidity: function getEscrowStartBlock((address,uint32) operatorSet, uint256 slashId) view returns(uint256)
func (_ISlashEscrowFactory *ISlashEscrowFactoryCaller) GetEscrowStartBlock(opts *bind.CallOpts, operatorSet OperatorSet, slashId *big.Int) (*big.Int, error)
⋮----
// GetGlobalEscrowDelay is a free data retrieval call binding the contract method 0x8a65d2d2.
⋮----
// Solidity: function getGlobalEscrowDelay() view returns(uint32)
func (_ISlashEscrowFactory *ISlashEscrowFactoryCaller) GetGlobalEscrowDelay(opts *bind.CallOpts) (uint32, error)
⋮----
// GetPendingEscrows is a free data retrieval call binding the contract method 0xc50f4e48.
⋮----
// Solidity: function getPendingEscrows() view returns((address,uint32)[] operatorSets, bool[] isRedistributing, uint256[][] slashIds, uint32[][] completeBlocks)
func (_ISlashEscrowFactory *ISlashEscrowFactoryCaller) GetPendingEscrows(opts *bind.CallOpts) (struct
⋮----
// GetPendingOperatorSets is a free data retrieval call binding the contract method 0x3f292b08.
⋮----
// Solidity: function getPendingOperatorSets() view returns((address,uint32)[] operatorSets)
func (_ISlashEscrowFactory *ISlashEscrowFactoryCaller) GetPendingOperatorSets(opts *bind.CallOpts) ([]OperatorSet, error)
⋮----
// GetPendingSlashIds is a free data retrieval call binding the contract method 0x7def1564.
⋮----
// Solidity: function getPendingSlashIds((address,uint32) operatorSet) view returns(uint256[])
func (_ISlashEscrowFactory *ISlashEscrowFactoryCaller) GetPendingSlashIds(opts *bind.CallOpts, operatorSet OperatorSet) ([]*big.Int, error)
⋮----
// GetPendingStrategiesForSlashId is a free data retrieval call binding the contract method 0x7130c423.
⋮----
// Solidity: function getPendingStrategiesForSlashId((address,uint32) operatorSet, uint256 slashId) view returns(address[] strategies)
func (_ISlashEscrowFactory *ISlashEscrowFactoryCaller) GetPendingStrategiesForSlashId(opts *bind.CallOpts, operatorSet OperatorSet, slashId *big.Int) ([]common.Address, error)
⋮----
// GetPendingStrategiesForSlashIds is a free data retrieval call binding the contract method 0xa56b21e4.
⋮----
// Solidity: function getPendingStrategiesForSlashIds((address,uint32) operatorSet) view returns(address[][] strategies)
func (_ISlashEscrowFactory *ISlashEscrowFactoryCaller) GetPendingStrategiesForSlashIds(opts *bind.CallOpts, operatorSet OperatorSet) ([][]common.Address, error)
⋮----
// GetPendingUnderlyingAmountForStrategy is a free data retrieval call binding the contract method 0xb23ff83b.
⋮----
// Solidity: function getPendingUnderlyingAmountForStrategy((address,uint32) operatorSet, uint256 slashId, address strategy) view returns(uint256)
func (_ISlashEscrowFactory *ISlashEscrowFactoryCaller) GetPendingUnderlyingAmountForStrategy(opts *bind.CallOpts, operatorSet OperatorSet, slashId *big.Int, strategy common.Address) (*big.Int, error)
⋮----
// GetSlashEscrow is a free data retrieval call binding the contract method 0x3453b234.
⋮----
// Solidity: function getSlashEscrow((address,uint32) operatorSet, uint256 slashId) view returns(address)
func (_ISlashEscrowFactory *ISlashEscrowFactoryCaller) GetSlashEscrow(opts *bind.CallOpts, operatorSet OperatorSet, slashId *big.Int) (common.Address, error)
⋮----
// GetStrategyEscrowDelay is a free data retrieval call binding the contract method 0x8d5d4036.
⋮----
// Solidity: function getStrategyEscrowDelay(address strategy) view returns(uint32)
func (_ISlashEscrowFactory *ISlashEscrowFactoryCaller) GetStrategyEscrowDelay(opts *bind.CallOpts, strategy common.Address) (uint32, error)
⋮----
// GetTotalPendingOperatorSets is a free data retrieval call binding the contract method 0x78cb9600.
⋮----
// Solidity: function getTotalPendingOperatorSets() view returns(uint256)
func (_ISlashEscrowFactory *ISlashEscrowFactoryCaller) GetTotalPendingOperatorSets(opts *bind.CallOpts) (*big.Int, error)
⋮----
// GetTotalPendingSlashIds is a free data retrieval call binding the contract method 0x6729b5db.
⋮----
// Solidity: function getTotalPendingSlashIds((address,uint32) operatorSet) view returns(uint256)
func (_ISlashEscrowFactory *ISlashEscrowFactoryCaller) GetTotalPendingSlashIds(opts *bind.CallOpts, operatorSet OperatorSet) (*big.Int, error)
⋮----
// GetTotalPendingStrategiesForSlashId is a free data retrieval call binding the contract method 0x277a9f0e.
⋮----
// Solidity: function getTotalPendingStrategiesForSlashId((address,uint32) operatorSet, uint256 slashId) view returns(uint256)
func (_ISlashEscrowFactory *ISlashEscrowFactoryCaller) GetTotalPendingStrategiesForSlashId(opts *bind.CallOpts, operatorSet OperatorSet, slashId *big.Int) (*big.Int, error)
⋮----
// IsDeployedSlashEscrow is a free data retrieval call binding the contract method 0x19f3db26.
⋮----
// Solidity: function isDeployedSlashEscrow((address,uint32) operatorSet, uint256 slashId) view returns(bool)
func (_ISlashEscrowFactory *ISlashEscrowFactoryCaller) IsDeployedSlashEscrow(opts *bind.CallOpts, operatorSet OperatorSet, slashId *big.Int) (bool, error)
⋮----
// IsDeployedSlashEscrow0 is a free data retrieval call binding the contract method 0xc8b5330c.
⋮----
// Solidity: function isDeployedSlashEscrow(address slashEscrow) view returns(bool)
func (_ISlashEscrowFactory *ISlashEscrowFactoryCaller) IsDeployedSlashEscrow0(opts *bind.CallOpts, slashEscrow common.Address) (bool, error)
⋮----
// IsEscrowPaused is a free data retrieval call binding the contract method 0x78748459.
⋮----
// Solidity: function isEscrowPaused((address,uint32) operatorSet, uint256 slashId) view returns(bool)
func (_ISlashEscrowFactory *ISlashEscrowFactoryCaller) IsEscrowPaused(opts *bind.CallOpts, operatorSet OperatorSet, slashId *big.Int) (bool, error)
⋮----
// IsPendingOperatorSet is a free data retrieval call binding the contract method 0x71e166e7.
⋮----
// Solidity: function isPendingOperatorSet((address,uint32) operatorSet) view returns(bool)
func (_ISlashEscrowFactory *ISlashEscrowFactoryCaller) IsPendingOperatorSet(opts *bind.CallOpts, operatorSet OperatorSet) (bool, error)
⋮----
// IsPendingSlashId is a free data retrieval call binding the contract method 0x87420b07.
⋮----
// Solidity: function isPendingSlashId((address,uint32) operatorSet, uint256 slashId) view returns(bool)
func (_ISlashEscrowFactory *ISlashEscrowFactoryCaller) IsPendingSlashId(opts *bind.CallOpts, operatorSet OperatorSet, slashId *big.Int) (bool, error)
⋮----
// Initialize is a paid mutator transaction binding the contract method 0x6c5ac81e.
⋮----
// Solidity: function initialize(address initialOwner, uint256 initialPausedStatus, uint32 initialGlobalDelayBlocks) returns()
func (_ISlashEscrowFactory *ISlashEscrowFactoryTransactor) Initialize(opts *bind.TransactOpts, initialOwner common.Address, initialPausedStatus *big.Int, initialGlobalDelayBlocks uint32) (*types.Transaction, error)
⋮----
// InitiateSlashEscrow is a paid mutator transaction binding the contract method 0x7a967611.
⋮----
// Solidity: function initiateSlashEscrow((address,uint32) operatorSet, uint256 slashId, address strategy) returns()
func (_ISlashEscrowFactory *ISlashEscrowFactoryTransactor) InitiateSlashEscrow(opts *bind.TransactOpts, operatorSet OperatorSet, slashId *big.Int, strategy common.Address) (*types.Transaction, error)
⋮----
// PauseEscrow is a paid mutator transaction binding the contract method 0xe7ed076b.
⋮----
// Solidity: function pauseEscrow((address,uint32) operatorSet, uint256 slashId) returns()
func (_ISlashEscrowFactory *ISlashEscrowFactoryTransactor) PauseEscrow(opts *bind.TransactOpts, operatorSet OperatorSet, slashId *big.Int) (*types.Transaction, error)
⋮----
// ReleaseSlashEscrow is a paid mutator transaction binding the contract method 0x5ffa5a81.
⋮----
// Solidity: function releaseSlashEscrow((address,uint32) operatorSet, uint256 slashId) returns()
func (_ISlashEscrowFactory *ISlashEscrowFactoryTransactor) ReleaseSlashEscrow(opts *bind.TransactOpts, operatorSet OperatorSet, slashId *big.Int) (*types.Transaction, error)
⋮----
// ReleaseSlashEscrowByStrategy is a paid mutator transaction binding the contract method 0x0e475b17.
⋮----
// Solidity: function releaseSlashEscrowByStrategy((address,uint32) operatorSet, uint256 slashId, address strategy) returns()
func (_ISlashEscrowFactory *ISlashEscrowFactoryTransactor) ReleaseSlashEscrowByStrategy(opts *bind.TransactOpts, operatorSet OperatorSet, slashId *big.Int, strategy common.Address) (*types.Transaction, error)
⋮----
// SetGlobalEscrowDelay is a paid mutator transaction binding the contract method 0x5e0a64c5.
⋮----
// Solidity: function setGlobalEscrowDelay(uint32 delay) returns()
func (_ISlashEscrowFactory *ISlashEscrowFactoryTransactor) SetGlobalEscrowDelay(opts *bind.TransactOpts, delay uint32) (*types.Transaction, error)
⋮----
// SetStrategyEscrowDelay is a paid mutator transaction binding the contract method 0x8fc46be5.
⋮----
// Solidity: function setStrategyEscrowDelay(address strategy, uint32 delay) returns()
func (_ISlashEscrowFactory *ISlashEscrowFactoryTransactor) SetStrategyEscrowDelay(opts *bind.TransactOpts, strategy common.Address, delay uint32) (*types.Transaction, error)
⋮----
// UnpauseEscrow is a paid mutator transaction binding the contract method 0x9b122356.
⋮----
// Solidity: function unpauseEscrow((address,uint32) operatorSet, uint256 slashId) returns()
func (_ISlashEscrowFactory *ISlashEscrowFactoryTransactor) UnpauseEscrow(opts *bind.TransactOpts, operatorSet OperatorSet, slashId *big.Int) (*types.Transaction, error)
⋮----
// ISlashEscrowFactoryEscrowCompleteIterator is returned from FilterEscrowComplete and is used to iterate over the raw logs and unpacked data for EscrowComplete events raised by the ISlashEscrowFactory contract.
type ISlashEscrowFactoryEscrowCompleteIterator struct {
	Event *ISlashEscrowFactoryEscrowComplete // 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
}
⋮----
Event *ISlashEscrowFactoryEscrowComplete // 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 *ISlashEscrowFactoryEscrowCompleteIterator) Next() bool
⋮----
// If the iterator failed, stop iterating
⋮----
// If the iterator completed, deliver directly whatever's available
⋮----
// Iterator still in progress, wait for either a data or an error event
⋮----
// Error returns any retrieval or parsing error occurred during filtering.
func (it *ISlashEscrowFactoryEscrowCompleteIterator) Error() error
⋮----
// Close terminates the iteration process, releasing any pending underlying
// resources.
func (it *ISlashEscrowFactoryEscrowCompleteIterator) Close() error
⋮----
// ISlashEscrowFactoryEscrowComplete represents a EscrowComplete event raised by the ISlashEscrowFactory contract.
type ISlashEscrowFactoryEscrowComplete struct {
	OperatorSet OperatorSet
	SlashId     *big.Int
	Strategy    common.Address
	Recipient   common.Address
	Raw         types.Log // Blockchain specific contextual infos
}
⋮----
Raw         types.Log // Blockchain specific contextual infos
⋮----
// FilterEscrowComplete is a free log retrieval operation binding the contract event 0x32be306ad5a833e756b7cb9724d5312afe0feda6163bfc2dd98ee713346a9abc.
⋮----
// Solidity: event EscrowComplete((address,uint32) operatorSet, uint256 slashId, address strategy, address recipient)
func (_ISlashEscrowFactory *ISlashEscrowFactoryFilterer) FilterEscrowComplete(opts *bind.FilterOpts) (*ISlashEscrowFactoryEscrowCompleteIterator, error)
⋮----
// WatchEscrowComplete is a free log subscription operation binding the contract event 0x32be306ad5a833e756b7cb9724d5312afe0feda6163bfc2dd98ee713346a9abc.
⋮----
func (_ISlashEscrowFactory *ISlashEscrowFactoryFilterer) WatchEscrowComplete(opts *bind.WatchOpts, sink chan<- *ISlashEscrowFactoryEscrowComplete) (event.Subscription, error)
⋮----
// New log arrived, parse the event and forward to the user
⋮----
// ParseEscrowComplete is a log parse operation binding the contract event 0x32be306ad5a833e756b7cb9724d5312afe0feda6163bfc2dd98ee713346a9abc.
⋮----
func (_ISlashEscrowFactory *ISlashEscrowFactoryFilterer) ParseEscrowComplete(log types.Log) (*ISlashEscrowFactoryEscrowComplete, error)
⋮----
// ISlashEscrowFactoryEscrowPausedIterator is returned from FilterEscrowPaused and is used to iterate over the raw logs and unpacked data for EscrowPaused events raised by the ISlashEscrowFactory contract.
type ISlashEscrowFactoryEscrowPausedIterator struct {
	Event *ISlashEscrowFactoryEscrowPaused // 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
}
⋮----
Event *ISlashEscrowFactoryEscrowPaused // Event containing the contract specifics and raw log
⋮----
// ISlashEscrowFactoryEscrowPaused represents a EscrowPaused event raised by the ISlashEscrowFactory contract.
type ISlashEscrowFactoryEscrowPaused struct {
	OperatorSet OperatorSet
	SlashId     *big.Int
	Raw         types.Log // Blockchain specific contextual infos
}
⋮----
// FilterEscrowPaused is a free log retrieval operation binding the contract event 0x050add19b1a78a4240cdebc8747899275f2dd070c88e83904a37ff7d1a539744.
⋮----
// Solidity: event EscrowPaused((address,uint32) operatorSet, uint256 slashId)
func (_ISlashEscrowFactory *ISlashEscrowFactoryFilterer) FilterEscrowPaused(opts *bind.FilterOpts) (*ISlashEscrowFactoryEscrowPausedIterator, error)
⋮----
// WatchEscrowPaused is a free log subscription operation binding the contract event 0x050add19b1a78a4240cdebc8747899275f2dd070c88e83904a37ff7d1a539744.
⋮----
func (_ISlashEscrowFactory *ISlashEscrowFactoryFilterer) WatchEscrowPaused(opts *bind.WatchOpts, sink chan<- *ISlashEscrowFactoryEscrowPaused) (event.Subscription, error)
⋮----
// ParseEscrowPaused is a log parse operation binding the contract event 0x050add19b1a78a4240cdebc8747899275f2dd070c88e83904a37ff7d1a539744.
⋮----
func (_ISlashEscrowFactory *ISlashEscrowFactoryFilterer) ParseEscrowPaused(log types.Log) (*ISlashEscrowFactoryEscrowPaused, error)
⋮----
// ISlashEscrowFactoryEscrowUnpausedIterator is returned from FilterEscrowUnpaused and is used to iterate over the raw logs and unpacked data for EscrowUnpaused events raised by the ISlashEscrowFactory contract.
type ISlashEscrowFactoryEscrowUnpausedIterator struct {
	Event *ISlashEscrowFactoryEscrowUnpaused // 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
}
⋮----
Event *ISlashEscrowFactoryEscrowUnpaused // Event containing the contract specifics and raw log
⋮----
// ISlashEscrowFactoryEscrowUnpaused represents a EscrowUnpaused event raised by the ISlashEscrowFactory contract.
type ISlashEscrowFactoryEscrowUnpaused struct {
	OperatorSet OperatorSet
	SlashId     *big.Int
	Raw         types.Log // Blockchain specific contextual infos
}
⋮----
// FilterEscrowUnpaused is a free log retrieval operation binding the contract event 0xb8877c6bf02d5f6603188eb653c9269271836b75b2012a5d7f5f233e7cf2f241.
⋮----
// Solidity: event EscrowUnpaused((address,uint32) operatorSet, uint256 slashId)
func (_ISlashEscrowFactory *ISlashEscrowFactoryFilterer) FilterEscrowUnpaused(opts *bind.FilterOpts) (*ISlashEscrowFactoryEscrowUnpausedIterator, error)
⋮----
// WatchEscrowUnpaused is a free log subscription operation binding the contract event 0xb8877c6bf02d5f6603188eb653c9269271836b75b2012a5d7f5f233e7cf2f241.
⋮----
func (_ISlashEscrowFactory *ISlashEscrowFactoryFilterer) WatchEscrowUnpaused(opts *bind.WatchOpts, sink chan<- *ISlashEscrowFactoryEscrowUnpaused) (event.Subscription, error)
⋮----
// ParseEscrowUnpaused is a log parse operation binding the contract event 0xb8877c6bf02d5f6603188eb653c9269271836b75b2012a5d7f5f233e7cf2f241.
⋮----
func (_ISlashEscrowFactory *ISlashEscrowFactoryFilterer) ParseEscrowUnpaused(log types.Log) (*ISlashEscrowFactoryEscrowUnpaused, error)
⋮----
// ISlashEscrowFactoryGlobalEscrowDelaySetIterator is returned from FilterGlobalEscrowDelaySet and is used to iterate over the raw logs and unpacked data for GlobalEscrowDelaySet events raised by the ISlashEscrowFactory contract.
type ISlashEscrowFactoryGlobalEscrowDelaySetIterator struct {
	Event *ISlashEscrowFactoryGlobalEscrowDelaySet // 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
}
⋮----
Event *ISlashEscrowFactoryGlobalEscrowDelaySet // Event containing the contract specifics and raw log
⋮----
// ISlashEscrowFactoryGlobalEscrowDelaySet represents a GlobalEscrowDelaySet event raised by the ISlashEscrowFactory contract.
type ISlashEscrowFactoryGlobalEscrowDelaySet struct {
	Delay uint32
	Raw   types.Log // Blockchain specific contextual infos
}
⋮----
Raw   types.Log // Blockchain specific contextual infos
⋮----
// FilterGlobalEscrowDelaySet is a free log retrieval operation binding the contract event 0x67d0077d22e4e06f761dd87f6c9f2310ac879c9ce17de50d381e05b72f45fbf6.
⋮----
// Solidity: event GlobalEscrowDelaySet(uint32 delay)
func (_ISlashEscrowFactory *ISlashEscrowFactoryFilterer) FilterGlobalEscrowDelaySet(opts *bind.FilterOpts) (*ISlashEscrowFactoryGlobalEscrowDelaySetIterator, error)
⋮----
// WatchGlobalEscrowDelaySet is a free log subscription operation binding the contract event 0x67d0077d22e4e06f761dd87f6c9f2310ac879c9ce17de50d381e05b72f45fbf6.
⋮----
func (_ISlashEscrowFactory *ISlashEscrowFactoryFilterer) WatchGlobalEscrowDelaySet(opts *bind.WatchOpts, sink chan<- *ISlashEscrowFactoryGlobalEscrowDelaySet) (event.Subscription, error)
⋮----
// ParseGlobalEscrowDelaySet is a log parse operation binding the contract event 0x67d0077d22e4e06f761dd87f6c9f2310ac879c9ce17de50d381e05b72f45fbf6.
⋮----
func (_ISlashEscrowFactory *ISlashEscrowFactoryFilterer) ParseGlobalEscrowDelaySet(log types.Log) (*ISlashEscrowFactoryGlobalEscrowDelaySet, error)
⋮----
// ISlashEscrowFactoryStartEscrowIterator is returned from FilterStartEscrow and is used to iterate over the raw logs and unpacked data for StartEscrow events raised by the ISlashEscrowFactory contract.
type ISlashEscrowFactoryStartEscrowIterator struct {
	Event *ISlashEscrowFactoryStartEscrow // 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
}
⋮----
Event *ISlashEscrowFactoryStartEscrow // Event containing the contract specifics and raw log
⋮----
// ISlashEscrowFactoryStartEscrow represents a StartEscrow event raised by the ISlashEscrowFactory contract.
type ISlashEscrowFactoryStartEscrow struct {
	OperatorSet OperatorSet
	SlashId     *big.Int
	Strategy    common.Address
	StartBlock  uint32
	Raw         types.Log // Blockchain specific contextual infos
}
⋮----
// FilterStartEscrow is a free log retrieval operation binding the contract event 0x3afae24c1d3dd2ce3649054ad82458a8c9967ebd9ce10a9a5a3d059f55bfaedb.
⋮----
// Solidity: event StartEscrow((address,uint32) operatorSet, uint256 slashId, address strategy, uint32 startBlock)
func (_ISlashEscrowFactory *ISlashEscrowFactoryFilterer) FilterStartEscrow(opts *bind.FilterOpts) (*ISlashEscrowFactoryStartEscrowIterator, error)
⋮----
// WatchStartEscrow is a free log subscription operation binding the contract event 0x3afae24c1d3dd2ce3649054ad82458a8c9967ebd9ce10a9a5a3d059f55bfaedb.
⋮----
func (_ISlashEscrowFactory *ISlashEscrowFactoryFilterer) WatchStartEscrow(opts *bind.WatchOpts, sink chan<- *ISlashEscrowFactoryStartEscrow) (event.Subscription, error)
⋮----
// ParseStartEscrow is a log parse operation binding the contract event 0x3afae24c1d3dd2ce3649054ad82458a8c9967ebd9ce10a9a5a3d059f55bfaedb.
⋮----
func (_ISlashEscrowFactory *ISlashEscrowFactoryFilterer) ParseStartEscrow(log types.Log) (*ISlashEscrowFactoryStartEscrow, error)
⋮----
// ISlashEscrowFactoryStrategyEscrowDelaySetIterator is returned from FilterStrategyEscrowDelaySet and is used to iterate over the raw logs and unpacked data for StrategyEscrowDelaySet events raised by the ISlashEscrowFactory contract.
type ISlashEscrowFactoryStrategyEscrowDelaySetIterator struct {
	Event *ISlashEscrowFactoryStrategyEscrowDelaySet // 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
}
⋮----
Event *ISlashEscrowFactoryStrategyEscrowDelaySet // Event containing the contract specifics and raw log
⋮----
// ISlashEscrowFactoryStrategyEscrowDelaySet represents a StrategyEscrowDelaySet event raised by the ISlashEscrowFactory contract.
type ISlashEscrowFactoryStrategyEscrowDelaySet struct {
	Strategy common.Address
	Delay    uint32
	Raw      types.Log // Blockchain specific contextual infos
}
⋮----
Raw      types.Log // Blockchain specific contextual infos
⋮----
// FilterStrategyEscrowDelaySet is a free log retrieval operation binding the contract event 0x5d2b33f07ae22a809e79005f96ffac70c3715df85a3b011b025e0a86a23a007b.
⋮----
// Solidity: event StrategyEscrowDelaySet(address strategy, uint32 delay)
func (_ISlashEscrowFactory *ISlashEscrowFactoryFilterer) FilterStrategyEscrowDelaySet(opts *bind.FilterOpts) (*ISlashEscrowFactoryStrategyEscrowDelaySetIterator, error)
⋮----
// WatchStrategyEscrowDelaySet is a free log subscription operation binding the contract event 0x5d2b33f07ae22a809e79005f96ffac70c3715df85a3b011b025e0a86a23a007b.
⋮----
func (_ISlashEscrowFactory *ISlashEscrowFactoryFilterer) WatchStrategyEscrowDelaySet(opts *bind.WatchOpts, sink chan<- *ISlashEscrowFactoryStrategyEscrowDelaySet) (event.Subscription, error)
⋮----
// ParseStrategyEscrowDelaySet is a log parse operation binding the contract event 0x5d2b33f07ae22a809e79005f96ffac70c3715df85a3b011b025e0a86a23a007b.
⋮----
func (_ISlashEscrowFactory *ISlashEscrowFactoryFilterer) ParseStrategyEscrowDelaySet(log types.Log) (*ISlashEscrowFactoryStrategyEscrowDelaySet, error)
````

## File: pkg/bindings/IStrategy/binding.go
````go
// Code generated - DO NOT EDIT.
// This file is a generated binding and any manual changes will be lost.
⋮----
package IStrategy
⋮----
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"
)
⋮----
"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
)
⋮----
// IStrategyMetaData contains all meta data concerning the IStrategy contract.
var IStrategyMetaData = &bind.MetaData{
	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.
// Deprecated: Use IStrategyMetaData.ABI instead.
var IStrategyABI = IStrategyMetaData.ABI
⋮----
// IStrategy is an auto generated Go binding around an Ethereum contract.
type IStrategy struct {
	IStrategyCaller     // Read-only binding to the contract
	IStrategyTransactor // Write-only binding to the contract
	IStrategyFilterer   // Log filterer for contract events
}
⋮----
IStrategyCaller     // Read-only binding to the contract
IStrategyTransactor // Write-only binding to the contract
IStrategyFilterer   // Log filterer for contract events
⋮----
// IStrategyCaller is an auto generated read-only Go binding around an Ethereum contract.
type IStrategyCaller struct {
	contract *bind.BoundContract // Generic contract wrapper for the low level calls
}
⋮----
contract *bind.BoundContract // Generic contract wrapper for the low level calls
⋮----
// IStrategyTransactor is an auto generated write-only Go binding around an Ethereum contract.
type IStrategyTransactor struct {
	contract *bind.BoundContract // Generic contract wrapper for the low level calls
}
⋮----
// IStrategyFilterer is an auto generated log filtering Go binding around an Ethereum contract events.
type IStrategyFilterer struct {
	contract *bind.BoundContract // Generic contract wrapper for the low level calls
}
⋮----
// IStrategySession is an auto generated Go binding around an Ethereum contract,
// with pre-set call and transact options.
type IStrategySession struct {
	Contract     *IStrategy        // 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
}
⋮----
Contract     *IStrategy        // 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
⋮----
// IStrategyCallerSession is an auto generated read-only Go binding around an Ethereum contract,
// with pre-set call options.
type IStrategyCallerSession struct {
	Contract *IStrategyCaller // Generic contract caller binding to set the session for
	CallOpts bind.CallOpts    // Call options to use throughout this session
}
⋮----
Contract *IStrategyCaller // Generic contract caller binding to set the session for
CallOpts bind.CallOpts    // Call options to use throughout this session
⋮----
// IStrategyTransactorSession is an auto generated write-only Go binding around an Ethereum contract,
// with pre-set transact options.
type IStrategyTransactorSession struct {
	Contract     *IStrategyTransactor // Generic contract transactor binding to set the session for
	TransactOpts bind.TransactOpts    // Transaction auth options to use throughout this session
}
⋮----
Contract     *IStrategyTransactor // Generic contract transactor binding to set the session for
TransactOpts bind.TransactOpts    // Transaction auth options to use throughout this session
⋮----
// IStrategyRaw is an auto generated low-level Go binding around an Ethereum contract.
type IStrategyRaw struct {
	Contract *IStrategy // Generic contract binding to access the raw methods on
}
⋮----
Contract *IStrategy // Generic contract binding to access the raw methods on
⋮----
// IStrategyCallerRaw is an auto generated low-level read-only Go binding around an Ethereum contract.
type IStrategyCallerRaw struct {
	Contract *IStrategyCaller // Generic read-only contract binding to access the raw methods on
}
⋮----
Contract *IStrategyCaller // Generic read-only contract binding to access the raw methods on
⋮----
// IStrategyTransactorRaw is an auto generated low-level write-only Go binding around an Ethereum contract.
type IStrategyTransactorRaw struct {
	Contract *IStrategyTransactor // Generic write-only contract binding to access the raw methods on
}
⋮----
Contract *IStrategyTransactor // Generic write-only contract binding to access the raw methods on
⋮----
// NewIStrategy creates a new instance of IStrategy, bound to a specific deployed contract.
func NewIStrategy(address common.Address, backend bind.ContractBackend) (*IStrategy, error)
⋮----
// NewIStrategyCaller creates a new read-only instance of IStrategy, bound to a specific deployed contract.
func NewIStrategyCaller(address common.Address, caller bind.ContractCaller) (*IStrategyCaller, error)
⋮----
// NewIStrategyTransactor creates a new write-only instance of IStrategy, bound to a specific deployed contract.
func NewIStrategyTransactor(address common.Address, transactor bind.ContractTransactor) (*IStrategyTransactor, error)
⋮----
// NewIStrategyFilterer creates a new log filterer instance of IStrategy, bound to a specific deployed contract.
func NewIStrategyFilterer(address common.Address, filterer bind.ContractFilterer) (*IStrategyFilterer, error)
⋮----
// bindIStrategy binds a generic wrapper to an already deployed contract.
func bindIStrategy(address common.Address, caller bind.ContractCaller, transactor bind.ContractTransactor, filterer bind.ContractFilterer) (*bind.BoundContract, error)
⋮----
// 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 (_IStrategy *IStrategyRaw) Call(opts *bind.CallOpts, result *[]interface
⋮----
// Transfer initiates a plain transaction to move funds to the contract, calling
// its default method if one is available.
func (_IStrategy *IStrategyRaw) Transfer(opts *bind.TransactOpts) (*types.Transaction, error)
⋮----
// Transact invokes the (paid) contract method with params as input values.
func (_IStrategy *IStrategyRaw) Transact(opts *bind.TransactOpts, method string, params ...interface
⋮----
// Explanation is a free data retrieval call binding the contract method 0xab5921e1.
//
// Solidity: function explanation() view returns(string)
func (_IStrategy *IStrategyCaller) Explanation(opts *bind.CallOpts) (string, error)
⋮----
var out []interface{}
⋮----
// Shares is a free data retrieval call binding the contract method 0xce7c2ac2.
⋮----
// Solidity: function shares(address user) view returns(uint256)
func (_IStrategy *IStrategyCaller) Shares(opts *bind.CallOpts, user common.Address) (*big.Int, error)
⋮----
// SharesToUnderlyingView is a free data retrieval call binding the contract method 0x7a8b2637.
⋮----
// Solidity: function sharesToUnderlyingView(uint256 amountShares) view returns(uint256)
func (_IStrategy *IStrategyCaller) SharesToUnderlyingView(opts *bind.CallOpts, amountShares *big.Int) (*big.Int, error)
⋮----
// TotalShares is a free data retrieval call binding the contract method 0x3a98ef39.
⋮----
// Solidity: function totalShares() view returns(uint256)
func (_IStrategy *IStrategyCaller) TotalShares(opts *bind.CallOpts) (*big.Int, error)
⋮----
// UnderlyingToSharesView is a free data retrieval call binding the contract method 0xe3dae51c.
⋮----
// Solidity: function underlyingToSharesView(uint256 amountUnderlying) view returns(uint256)
func (_IStrategy *IStrategyCaller) UnderlyingToSharesView(opts *bind.CallOpts, amountUnderlying *big.Int) (*big.Int, error)
⋮----
// UnderlyingToken is a free data retrieval call binding the contract method 0x2495a599.
⋮----
// Solidity: function underlyingToken() view returns(address)
func (_IStrategy *IStrategyCaller) UnderlyingToken(opts *bind.CallOpts) (common.Address, error)
⋮----
// UserUnderlyingView is a free data retrieval call binding the contract method 0x553ca5f8.
⋮----
// Solidity: function userUnderlyingView(address user) view returns(uint256)
func (_IStrategy *IStrategyCaller) UserUnderlyingView(opts *bind.CallOpts, user common.Address) (*big.Int, error)
⋮----
// 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)
⋮----
// 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)
⋮----
// Deposit is a paid mutator transaction binding the contract method 0x47e7ef24.
⋮----
// Solidity: function deposit(address token, uint256 amount) returns(uint256)
func (_IStrategy *IStrategyTransactor) Deposit(opts *bind.TransactOpts, token common.Address, amount *big.Int) (*types.Transaction, error)
⋮----
// SharesToUnderlying is a paid mutator transaction binding the contract method 0xf3e73875.
⋮----
// Solidity: function sharesToUnderlying(uint256 amountShares) returns(uint256)
func (_IStrategy *IStrategyTransactor) SharesToUnderlying(opts *bind.TransactOpts, amountShares *big.Int) (*types.Transaction, error)
⋮----
// UnderlyingToShares is a paid mutator transaction binding the contract method 0x8c871019.
⋮----
// Solidity: function underlyingToShares(uint256 amountUnderlying) returns(uint256)
func (_IStrategy *IStrategyTransactor) UnderlyingToShares(opts *bind.TransactOpts, amountUnderlying *big.Int) (*types.Transaction, error)
⋮----
// UserUnderlying is a paid mutator transaction binding the contract method 0x8f6a6240.
⋮----
// Solidity: function userUnderlying(address user) returns(uint256)
func (_IStrategy *IStrategyTransactor) UserUnderlying(opts *bind.TransactOpts, user common.Address) (*types.Transaction, error)
⋮----
// Withdraw is a paid mutator transaction binding the contract method 0xd9caed12.
⋮----
// Solidity: function withdraw(address recipient, address token, uint256 amountShares) returns(uint256)
func (_IStrategy *IStrategyTransactor) Withdraw(opts *bind.TransactOpts, recipient common.Address, token common.Address, amountShares *big.Int) (*types.Transaction, error)
⋮----
// IStrategyExchangeRateEmittedIterator is returned from FilterExchangeRateEmitted and is used to iterate over the raw logs and unpacked data for ExchangeRateEmitted events raised by the IStrategy contract.
type IStrategyExchangeRateEmittedIterator struct {
	Event *IStrategyExchangeRateEmitted // 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
}
⋮----
Event *IStrategyExchangeRateEmitted // 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 *IStrategyExchangeRateEmittedIterator) Next() bool
⋮----
// If the iterator failed, stop iterating
⋮----
// If the iterator completed, deliver directly whatever's available
⋮----
// Iterator still in progress, wait for either a data or an error event
⋮----
// Error returns any retrieval or parsing error occurred during filtering.
func (it *IStrategyExchangeRateEmittedIterator) Error() error
⋮----
// Close terminates the iteration process, releasing any pending underlying
// resources.
func (it *IStrategyExchangeRateEmittedIterator) Close() error
⋮----
// IStrategyExchangeRateEmitted represents a ExchangeRateEmitted event raised by the IStrategy contract.
type IStrategyExchangeRateEmitted struct {
	Rate *big.Int
	Raw  types.Log // Blockchain specific contextual infos
}
⋮----
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 (_IStrategy *IStrategyFilterer) FilterExchangeRateEmitted(opts *bind.FilterOpts) (*IStrategyExchangeRateEmittedIterator, error)
⋮----
// WatchExchangeRateEmitted is a free log subscription operation binding the contract event 0xd2494f3479e5da49d386657c292c610b5b01df313d07c62eb0cfa49924a31be8.
⋮----
func (_IStrategy *IStrategyFilterer) WatchExchangeRateEmitted(opts *bind.WatchOpts, sink chan<- *IStrategyExchangeRateEmitted) (event.Subscription, error)
⋮----
// New log arrived, parse the event and forward to the user
⋮----
// ParseExchangeRateEmitted is a log parse operation binding the contract event 0xd2494f3479e5da49d386657c292c610b5b01df313d07c62eb0cfa49924a31be8.
⋮----
func (_IStrategy *IStrategyFilterer) ParseExchangeRateEmitted(log types.Log) (*IStrategyExchangeRateEmitted, error)
⋮----
// IStrategyStrategyTokenSetIterator is returned from FilterStrategyTokenSet and is used to iterate over the raw logs and unpacked data for StrategyTokenSet events raised by the IStrategy contract.
type IStrategyStrategyTokenSetIterator struct {
	Event *IStrategyStrategyTokenSet // 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
}
⋮----
Event *IStrategyStrategyTokenSet // Event containing the contract specifics and raw log
⋮----
// IStrategyStrategyTokenSet represents a StrategyTokenSet event raised by the IStrategy contract.
type IStrategyStrategyTokenSet struct {
	Token    common.Address
	Decimals uint8
	Raw      types.Log // Blockchain specific contextual infos
}
⋮----
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 (_IStrategy *IStrategyFilterer) FilterStrategyTokenSet(opts *bind.FilterOpts) (*IStrategyStrategyTokenSetIterator, error)
⋮----
// WatchStrategyTokenSet is a free log subscription operation binding the contract event 0x1c540707b00eb5427b6b774fc799d756516a54aee108b64b327acc55af557507.
⋮----
func (_IStrategy *IStrategyFilterer) WatchStrategyTokenSet(opts *bind.WatchOpts, sink chan<- *IStrategyStrategyTokenSet) (event.Subscription, error)
⋮----
// ParseStrategyTokenSet is a log parse operation binding the contract event 0x1c540707b00eb5427b6b774fc799d756516a54aee108b64b327acc55af557507.
⋮----
func (_IStrategy *IStrategyFilterer) ParseStrategyTokenSet(log types.Log) (*IStrategyStrategyTokenSet, error)
````

## File: pkg/bindings/IStrategyFactory/binding.go
````go
// Code generated - DO NOT EDIT.
// This file is a generated binding and any manual changes will be lost.
⋮----
package IStrategyFactory
⋮----
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"
)
⋮----
"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
}
⋮----
// IStrategyFactoryMetaData contains all meta data concerning the IStrategyFactory contract.
var IStrategyFactoryMetaData = &bind.MetaData{
	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.
// Deprecated: Use IStrategyFactoryMetaData.ABI instead.
var IStrategyFactoryABI = IStrategyFactoryMetaData.ABI
⋮----
// IStrategyFactory is an auto generated Go binding around an Ethereum contract.
type IStrategyFactory struct {
	IStrategyFactoryCaller     // Read-only binding to the contract
	IStrategyFactoryTransactor // Write-only binding to the contract
	IStrategyFactoryFilterer   // Log filterer for contract events
}
⋮----
IStrategyFactoryCaller     // Read-only binding to the contract
IStrategyFactoryTransactor // Write-only binding to the contract
IStrategyFactoryFilterer   // Log filterer for contract events
⋮----
// IStrategyFactoryCaller is an auto generated read-only Go binding around an Ethereum contract.
type IStrategyFactoryCaller struct {
	contract *bind.BoundContract // Generic contract wrapper for the low level calls
}
⋮----
contract *bind.BoundContract // Generic contract wrapper for the low level calls
⋮----
// IStrategyFactoryTransactor is an auto generated write-only Go binding around an Ethereum contract.
type IStrategyFactoryTransactor struct {
	contract *bind.BoundContract // Generic contract wrapper for the low level calls
}
⋮----
// IStrategyFactoryFilterer is an auto generated log filtering Go binding around an Ethereum contract events.
type IStrategyFactoryFilterer struct {
	contract *bind.BoundContract // Generic contract wrapper for the low level calls
}
⋮----
// IStrategyFactorySession is an auto generated Go binding around an Ethereum contract,
// with pre-set call and transact options.
type IStrategyFactorySession struct {
	Contract     *IStrategyFactory // 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
}
⋮----
Contract     *IStrategyFactory // 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
⋮----
// IStrategyFactoryCallerSession is an auto generated read-only Go binding around an Ethereum contract,
// with pre-set call options.
type IStrategyFactoryCallerSession struct {
	Contract *IStrategyFactoryCaller // Generic contract caller binding to set the session for
	CallOpts bind.CallOpts           // Call options to use throughout this session
}
⋮----
Contract *IStrategyFactoryCaller // Generic contract caller binding to set the session for
CallOpts bind.CallOpts           // Call options to use throughout this session
⋮----
// IStrategyFactoryTransactorSession is an auto generated write-only Go binding around an Ethereum contract,
// with pre-set transact options.
type IStrategyFactoryTransactorSession struct {
	Contract     *IStrategyFactoryTransactor // Generic contract transactor binding to set the session for
	TransactOpts bind.TransactOpts           // Transaction auth options to use throughout this session
}
⋮----
Contract     *IStrategyFactoryTransactor // Generic contract transactor binding to set the session for
TransactOpts bind.TransactOpts           // Transaction auth options to use throughout this session
⋮----
// IStrategyFactoryRaw is an auto generated low-level Go binding around an Ethereum contract.
type IStrategyFactoryRaw struct {
	Contract *IStrategyFactory // Generic contract binding to access the raw methods on
}
⋮----
Contract *IStrategyFactory // Generic contract binding to access the raw methods on
⋮----
// IStrategyFactoryCallerRaw is an auto generated low-level read-only Go binding around an Ethereum contract.
type IStrategyFactoryCallerRaw struct {
	Contract *IStrategyFactoryCaller // Generic read-only contract binding to access the raw methods on
}
⋮----
Contract *IStrategyFactoryCaller // Generic read-only contract binding to access the raw methods on
⋮----
// IStrategyFactoryTransactorRaw is an auto generated low-level write-only Go binding around an Ethereum contract.
type IStrategyFactoryTransactorRaw struct {
	Contract *IStrategyFactoryTransactor // Generic write-only contract binding to access the raw methods on
}
⋮----
Contract *IStrategyFactoryTransactor // Generic write-only contract binding to access the raw methods on
⋮----
// NewIStrategyFactory creates a new instance of IStrategyFactory, bound to a specific deployed contract.
func NewIStrategyFactory(address common.Address, backend bind.ContractBackend) (*IStrategyFactory, error)
⋮----
// NewIStrategyFactoryCaller creates a new read-only instance of IStrategyFactory, bound to a specific deployed contract.
func NewIStrategyFactoryCaller(address common.Address, caller bind.ContractCaller) (*IStrategyFactoryCaller, error)
⋮----
// NewIStrategyFactoryTransactor creates a new write-only instance of IStrategyFactory, bound to a specific deployed contract.
func NewIStrategyFactoryTransactor(address common.Address, transactor bind.ContractTransactor) (*IStrategyFactoryTransactor, error)
⋮----
// NewIStrategyFactoryFilterer creates a new log filterer instance of IStrategyFactory, bound to a specific deployed contract.
func NewIStrategyFactoryFilterer(address common.Address, filterer bind.ContractFilterer) (*IStrategyFactoryFilterer, error)
⋮----
// bindIStrategyFactory binds a generic wrapper to an already deployed contract.
func bindIStrategyFactory(address common.Address, caller bind.ContractCaller, transactor bind.ContractTransactor, filterer bind.ContractFilterer) (*bind.BoundContract, error)
⋮----
// 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 (_IStrategyFactory *IStrategyFactoryRaw) Call(opts *bind.CallOpts, result *[]interface
⋮----
// Transfer initiates a plain transaction to move funds to the contract, calling
// its default method if one is available.
func (_IStrategyFactory *IStrategyFactoryRaw) Transfer(opts *bind.TransactOpts) (*types.Transaction, error)
⋮----
// Transact invokes the (paid) contract method with params as input values.
func (_IStrategyFactory *IStrategyFactoryRaw) Transact(opts *bind.TransactOpts, method string, params ...interface
⋮----
// DeployedStrategies is a free data retrieval call binding the contract method 0x581dfd65.
//
// Solidity: function deployedStrategies(address token) view returns(address)
func (_IStrategyFactory *IStrategyFactoryCaller) DeployedStrategies(opts *bind.CallOpts, token common.Address) (common.Address, error)
⋮----
var out []interface{}
⋮----
// 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)
⋮----
// 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)
⋮----
// 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)
⋮----
// StrategyBeacon is a free data retrieval call binding the contract method 0xf0062d9a.
⋮----
// Solidity: function strategyBeacon() view returns(address)
func (_IStrategyFactory *IStrategyFactoryCaller) StrategyBeacon(opts *bind.CallOpts) (common.Address, error)
⋮----
// 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)
⋮----
// DeployNewStrategy is a paid mutator transaction binding the contract method 0x6b9b6229.
⋮----
// Solidity: function deployNewStrategy(address token) returns(address newStrategy)
func (_IStrategyFactory *IStrategyFactoryTransactor) DeployNewStrategy(opts *bind.TransactOpts, token common.Address) (*types.Transaction, error)
⋮----
// RemoveStrategiesFromWhitelist is a paid mutator transaction binding the contract method 0xfe38b32d.
⋮----
// Solidity: function removeStrategiesFromWhitelist(address[] strategiesToRemoveFromWhitelist) returns()
func (_IStrategyFactory *IStrategyFactoryTransactor) RemoveStrategiesFromWhitelist(opts *bind.TransactOpts, strategiesToRemoveFromWhitelist []common.Address) (*types.Transaction, error)
⋮----
// WhitelistStrategies is a paid mutator transaction binding the contract method 0xb768ebc9.
⋮----
// Solidity: function whitelistStrategies(address[] strategiesToWhitelist) returns()
func (_IStrategyFactory *IStrategyFactoryTransactor) WhitelistStrategies(opts *bind.TransactOpts, strategiesToWhitelist []common.Address) (*types.Transaction, error)
⋮----
// 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

	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
}
⋮----
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
⋮----
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 *IStrategyFactoryDurationVaultDeployedIterator) Next() bool
⋮----
// If the iterator failed, stop iterating
⋮----
// If the iterator completed, deliver directly whatever's available
⋮----
// Iterator still in progress, wait for either a data or an error event
⋮----
// Error returns any retrieval or parsing error occurred during filtering.
func (it *IStrategyFactoryDurationVaultDeployedIterator) Error() error
⋮----
// Close terminates the iteration process, releasing any pending underlying
// resources.
func (it *IStrategyFactoryDurationVaultDeployedIterator) Close() error
⋮----
// 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
}
⋮----
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 (_IStrategyFactory *IStrategyFactoryFilterer) FilterDurationVaultDeployed(opts *bind.FilterOpts, vault []common.Address, underlyingToken []common.Address, vaultAdmin []common.Address) (*IStrategyFactoryDurationVaultDeployedIterator, error)
⋮----
var vaultRule []interface{}
⋮----
var underlyingTokenRule []interface{}
⋮----
var vaultAdminRule []interface{}
⋮----
// WatchDurationVaultDeployed is a free log subscription operation binding the contract event 0x6c9e2cbc6fcd0f5b21ee2edb38f3421d7538cd98b8ff00803f81879345568504.
⋮----
func (_IStrategyFactory *IStrategyFactoryFilterer) WatchDurationVaultDeployed(opts *bind.WatchOpts, sink chan<- *IStrategyFactoryDurationVaultDeployed, vault []common.Address, underlyingToken []common.Address, vaultAdmin []common.Address) (event.Subscription, error)
⋮----
// New log arrived, parse the event and forward to the user
⋮----
// ParseDurationVaultDeployed is a log parse operation binding the contract event 0x6c9e2cbc6fcd0f5b21ee2edb38f3421d7538cd98b8ff00803f81879345568504.
⋮----
func (_IStrategyFactory *IStrategyFactoryFilterer) ParseDurationVaultDeployed(log types.Log) (*IStrategyFactoryDurationVaultDeployed, error)
⋮----
// IStrategyFactoryStrategySetForTokenIterator is returned from FilterStrategySetForToken and is used to iterate over the raw logs and unpacked data for StrategySetForToken events raised by the IStrategyFactory contract.
type IStrategyFactoryStrategySetForTokenIterator struct {
	Event *IStrategyFactoryStrategySetForToken // 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
}
⋮----
Event *IStrategyFactoryStrategySetForToken // Event containing the contract specifics and raw log
⋮----
// IStrategyFactoryStrategySetForToken represents a StrategySetForToken event raised by the IStrategyFactory contract.
type IStrategyFactoryStrategySetForToken struct {
	Token    common.Address
	Strategy common.Address
	Raw      types.Log // Blockchain specific contextual infos
}
⋮----
Raw      types.Log // Blockchain specific contextual infos
⋮----
// FilterStrategySetForToken is a free log retrieval operation binding the contract event 0x6852a55230ef089d785bce7ffbf757985de34026df90a87d7b4a6e56f95d251f.
⋮----
// Solidity: event StrategySetForToken(address token, address strategy)
func (_IStrategyFactory *IStrategyFactoryFilterer) FilterStrategySetForToken(opts *bind.FilterOpts) (*IStrategyFactoryStrategySetForTokenIterator, error)
⋮----
// WatchStrategySetForToken is a free log subscription operation binding the contract event 0x6852a55230ef089d785bce7ffbf757985de34026df90a87d7b4a6e56f95d251f.
⋮----
func (_IStrategyFactory *IStrategyFactoryFilterer) WatchStrategySetForToken(opts *bind.WatchOpts, sink chan<- *IStrategyFactoryStrategySetForToken) (event.Subscription, error)
⋮----
// ParseStrategySetForToken is a log parse operation binding the contract event 0x6852a55230ef089d785bce7ffbf757985de34026df90a87d7b4a6e56f95d251f.
⋮----
func (_IStrategyFactory *IStrategyFactoryFilterer) ParseStrategySetForToken(log types.Log) (*IStrategyFactoryStrategySetForToken, error)
⋮----
// IStrategyFactoryTokenBlacklistedIterator is returned from FilterTokenBlacklisted and is used to iterate over the raw logs and unpacked data for TokenBlacklisted events raised by the IStrategyFactory contract.
type IStrategyFactoryTokenBlacklistedIterator struct {
	Event *IStrategyFactoryTokenBlacklisted // 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
}
⋮----
Event *IStrategyFactoryTokenBlacklisted // Event containing the contract specifics and raw log
⋮----
// IStrategyFactoryTokenBlacklisted represents a TokenBlacklisted event raised by the IStrategyFactory contract.
type IStrategyFactoryTokenBlacklisted struct {
	Token common.Address
	Raw   types.Log // Blockchain specific contextual infos
}
⋮----
Raw   types.Log // Blockchain specific contextual infos
⋮----
// FilterTokenBlacklisted is a free log retrieval operation binding the contract event 0x75519c51f39873ec0e27dd3bbc09549e4865a113f505393fb9eab5898f6418b3.
⋮----
// Solidity: event TokenBlacklisted(address token)
func (_IStrategyFactory *IStrategyFactoryFilterer) FilterTokenBlacklisted(opts *bind.FilterOpts) (*IStrategyFactoryTokenBlacklistedIterator, error)
⋮----
// WatchTokenBlacklisted is a free log subscription operation binding the contract event 0x75519c51f39873ec0e27dd3bbc09549e4865a113f505393fb9eab5898f6418b3.
⋮----
func (_IStrategyFactory *IStrategyFactoryFilterer) WatchTokenBlacklisted(opts *bind.WatchOpts, sink chan<- *IStrategyFactoryTokenBlacklisted) (event.Subscription, error)
⋮----
// ParseTokenBlacklisted is a log parse operation binding the contract event 0x75519c51f39873ec0e27dd3bbc09549e4865a113f505393fb9eab5898f6418b3.
⋮----
func (_IStrategyFactory *IStrategyFactoryFilterer) ParseTokenBlacklisted(log types.Log) (*IStrategyFactoryTokenBlacklisted, error)
````

## File: pkg/bindings/IStrategyManager/binding.go
````go
// Code generated - DO NOT EDIT.
// This file is a generated binding and any manual changes will be lost.
⋮----
package IStrategyManager
⋮----
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"
)
⋮----
"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
)
⋮----
// OperatorSet is an auto generated low-level Go binding around an user-defined struct.
type OperatorSet struct {
	Avs common.Address
	Id  uint32
}
⋮----
// IStrategyManagerMetaData contains all meta data concerning the IStrategyManager contract.
var IStrategyManagerMetaData = &bind.MetaData{
	ABI: "[{\"type\":\"function\",\"name\":\"addShares\",\"inputs\":[{\"name\":\"staker\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"strategy\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"},{\"name\":\"shares\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"addStrategiesToDepositWhitelist\",\"inputs\":[{\"name\":\"strategiesToWhitelist\",\"type\":\"address[]\",\"internalType\":\"contractIStrategy[]\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"burnShares\",\"inputs\":[{\"name\":\"strategy\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"calculateStrategyDepositDigestHash\",\"inputs\":[{\"name\":\"staker\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"strategy\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"},{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"contractIERC20\"},{\"name\":\"amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"nonce\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"expiry\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"clearBurnOrRedistributableShares\",\"inputs\":[{\"name\":\"operatorSet\",\"type\":\"tuple\",\"internalType\":\"structOperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]},{\"name\":\"slashId\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256[]\",\"internalType\":\"uint256[]\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"clearBurnOrRedistributableSharesByStrategy\",\"inputs\":[{\"name\":\"operatorSet\",\"type\":\"tuple\",\"internalType\":\"structOperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]},{\"name\":\"slashId\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"strategy\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"delegation\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIDelegationManager\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"depositIntoStrategy\",\"inputs\":[{\"name\":\"strategy\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"},{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"contractIERC20\"},{\"name\":\"amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"depositShares\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"depositIntoStrategyWithSignature\",\"inputs\":[{\"name\":\"strategy\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"},{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"contractIERC20\"},{\"name\":\"amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"staker\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"expiry\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"signature\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[{\"name\":\"depositShares\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"getBurnOrRedistributableCount\",\"inputs\":[{\"name\":\"operatorSet\",\"type\":\"tuple\",\"internalType\":\"structOperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]},{\"name\":\"slashId\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getBurnOrRedistributableShares\",\"inputs\":[{\"name\":\"operatorSet\",\"type\":\"tuple\",\"internalType\":\"structOperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]},{\"name\":\"slashId\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"address[]\",\"internalType\":\"contractIStrategy[]\"},{\"name\":\"\",\"type\":\"uint256[]\",\"internalType\":\"uint256[]\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getBurnOrRedistributableShares\",\"inputs\":[{\"name\":\"operatorSet\",\"type\":\"tuple\",\"internalType\":\"structOperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]},{\"name\":\"slashId\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"strategy\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getBurnableShares\",\"inputs\":[{\"name\":\"strategy\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getDeposits\",\"inputs\":[{\"name\":\"staker\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"address[]\",\"internalType\":\"contractIStrategy[]\"},{\"name\":\"\",\"type\":\"uint256[]\",\"internalType\":\"uint256[]\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getPendingOperatorSets\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"tuple[]\",\"internalType\":\"structOperatorSet[]\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getPendingSlashIds\",\"inputs\":[{\"name\":\"operatorSet\",\"type\":\"tuple\",\"internalType\":\"structOperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256[]\",\"internalType\":\"uint256[]\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getStakerStrategyList\",\"inputs\":[{\"name\":\"staker\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"address[]\",\"internalType\":\"contractIStrategy[]\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getStrategiesWithBurnableShares\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address[]\",\"internalType\":\"address[]\"},{\"name\":\"\",\"type\":\"uint256[]\",\"internalType\":\"uint256[]\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"increaseBurnOrRedistributableShares\",\"inputs\":[{\"name\":\"operatorSet\",\"type\":\"tuple\",\"internalType\":\"structOperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]},{\"name\":\"slashId\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"strategy\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"},{\"name\":\"addedSharesToBurn\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"initialize\",\"inputs\":[{\"name\":\"initialOwner\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"initialStrategyWhitelister\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"initialPausedStatus\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"removeDepositShares\",\"inputs\":[{\"name\":\"staker\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"strategy\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"},{\"name\":\"depositSharesToRemove\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"removeStrategiesFromDepositWhitelist\",\"inputs\":[{\"name\":\"strategiesToRemoveFromWhitelist\",\"type\":\"address[]\",\"internalType\":\"contractIStrategy[]\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"setStrategyWhitelister\",\"inputs\":[{\"name\":\"newStrategyWhitelister\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"stakerDepositShares\",\"inputs\":[{\"name\":\"user\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"strategy\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"}],\"outputs\":[{\"name\":\"shares\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"stakerStrategyListLength\",\"inputs\":[{\"name\":\"staker\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"strategyIsWhitelistedForDeposit\",\"inputs\":[{\"name\":\"strategy\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"strategyWhitelister\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"withdrawSharesAsTokens\",\"inputs\":[{\"name\":\"staker\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"strategy\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"},{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"contractIERC20\"},{\"name\":\"shares\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"event\",\"name\":\"BurnOrRedistributableSharesDecreased\",\"inputs\":[{\"name\":\"operatorSet\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structOperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]},{\"name\":\"slashId\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"strategy\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"contractIStrategy\"},{\"name\":\"shares\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"BurnOrRedistributableSharesIncreased\",\"inputs\":[{\"name\":\"operatorSet\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structOperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]},{\"name\":\"slashId\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"strategy\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"contractIStrategy\"},{\"name\":\"shares\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"BurnableSharesDecreased\",\"inputs\":[{\"name\":\"strategy\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"contractIStrategy\"},{\"name\":\"shares\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Deposit\",\"inputs\":[{\"name\":\"staker\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"},{\"name\":\"strategy\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"contractIStrategy\"},{\"name\":\"shares\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"StrategyAddedToDepositWhitelist\",\"inputs\":[{\"name\":\"strategy\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"contractIStrategy\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"StrategyRemovedFromDepositWhitelist\",\"inputs\":[{\"name\":\"strategy\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"contractIStrategy\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"StrategyWhitelisterChanged\",\"inputs\":[{\"name\":\"previousAddress\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"},{\"name\":\"newAddress\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"error\",\"name\":\"MaxStrategiesExceeded\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"OnlyDelegationManager\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"OnlyStrategyWhitelister\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"SharesAmountTooHigh\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"SharesAmountZero\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"StakerAddressZero\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"StrategyAlreadyInSlash\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"StrategyNotFound\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"StrategyNotWhitelisted\",\"inputs\":[]}]",
}
⋮----
// IStrategyManagerABI is the input ABI used to generate the binding from.
// Deprecated: Use IStrategyManagerMetaData.ABI instead.
var IStrategyManagerABI = IStrategyManagerMetaData.ABI
⋮----
// IStrategyManager is an auto generated Go binding around an Ethereum contract.
type IStrategyManager struct {
	IStrategyManagerCaller     // Read-only binding to the contract
	IStrategyManagerTransactor // Write-only binding to the contract
	IStrategyManagerFilterer   // Log filterer for contract events
}
⋮----
IStrategyManagerCaller     // Read-only binding to the contract
IStrategyManagerTransactor // Write-only binding to the contract
IStrategyManagerFilterer   // Log filterer for contract events
⋮----
// IStrategyManagerCaller is an auto generated read-only Go binding around an Ethereum contract.
type IStrategyManagerCaller struct {
	contract *bind.BoundContract // Generic contract wrapper for the low level calls
}
⋮----
contract *bind.BoundContract // Generic contract wrapper for the low level calls
⋮----
// IStrategyManagerTransactor is an auto generated write-only Go binding around an Ethereum contract.
type IStrategyManagerTransactor struct {
	contract *bind.BoundContract // Generic contract wrapper for the low level calls
}
⋮----
// IStrategyManagerFilterer is an auto generated log filtering Go binding around an Ethereum contract events.
type IStrategyManagerFilterer struct {
	contract *bind.BoundContract // Generic contract wrapper for the low level calls
}
⋮----
// IStrategyManagerSession is an auto generated Go binding around an Ethereum contract,
// with pre-set call and transact options.
type IStrategyManagerSession struct {
	Contract     *IStrategyManager // 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
}
⋮----
Contract     *IStrategyManager // 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
⋮----
// IStrategyManagerCallerSession is an auto generated read-only Go binding around an Ethereum contract,
// with pre-set call options.
type IStrategyManagerCallerSession struct {
	Contract *IStrategyManagerCaller // Generic contract caller binding to set the session for
	CallOpts bind.CallOpts           // Call options to use throughout this session
}
⋮----
Contract *IStrategyManagerCaller // Generic contract caller binding to set the session for
CallOpts bind.CallOpts           // Call options to use throughout this session
⋮----
// IStrategyManagerTransactorSession is an auto generated write-only Go binding around an Ethereum contract,
// with pre-set transact options.
type IStrategyManagerTransactorSession struct {
	Contract     *IStrategyManagerTransactor // Generic contract transactor binding to set the session for
	TransactOpts bind.TransactOpts           // Transaction auth options to use throughout this session
}
⋮----
Contract     *IStrategyManagerTransactor // Generic contract transactor binding to set the session for
TransactOpts bind.TransactOpts           // Transaction auth options to use throughout this session
⋮----
// IStrategyManagerRaw is an auto generated low-level Go binding around an Ethereum contract.
type IStrategyManagerRaw struct {
	Contract *IStrategyManager // Generic contract binding to access the raw methods on
}
⋮----
Contract *IStrategyManager // Generic contract binding to access the raw methods on
⋮----
// IStrategyManagerCallerRaw is an auto generated low-level read-only Go binding around an Ethereum contract.
type IStrategyManagerCallerRaw struct {
	Contract *IStrategyManagerCaller // Generic read-only contract binding to access the raw methods on
}
⋮----
Contract *IStrategyManagerCaller // Generic read-only contract binding to access the raw methods on
⋮----
// IStrategyManagerTransactorRaw is an auto generated low-level write-only Go binding around an Ethereum contract.
type IStrategyManagerTransactorRaw struct {
	Contract *IStrategyManagerTransactor // Generic write-only contract binding to access the raw methods on
}
⋮----
Contract *IStrategyManagerTransactor // Generic write-only contract binding to access the raw methods on
⋮----
// NewIStrategyManager creates a new instance of IStrategyManager, bound to a specific deployed contract.
func NewIStrategyManager(address common.Address, backend bind.ContractBackend) (*IStrategyManager, error)
⋮----
// NewIStrategyManagerCaller creates a new read-only instance of IStrategyManager, bound to a specific deployed contract.
func NewIStrategyManagerCaller(address common.Address, caller bind.ContractCaller) (*IStrategyManagerCaller, error)
⋮----
// NewIStrategyManagerTransactor creates a new write-only instance of IStrategyManager, bound to a specific deployed contract.
func NewIStrategyManagerTransactor(address common.Address, transactor bind.ContractTransactor) (*IStrategyManagerTransactor, error)
⋮----
// NewIStrategyManagerFilterer creates a new log filterer instance of IStrategyManager, bound to a specific deployed contract.
func NewIStrategyManagerFilterer(address common.Address, filterer bind.ContractFilterer) (*IStrategyManagerFilterer, error)
⋮----
// bindIStrategyManager binds a generic wrapper to an already deployed contract.
func bindIStrategyManager(address common.Address, caller bind.ContractCaller, transactor bind.ContractTransactor, filterer bind.ContractFilterer) (*bind.BoundContract, error)
⋮----
// 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 (_IStrategyManager *IStrategyManagerRaw) Call(opts *bind.CallOpts, result *[]interface
⋮----
// Transfer initiates a plain transaction to move funds to the contract, calling
// its default method if one is available.
func (_IStrategyManager *IStrategyManagerRaw) Transfer(opts *bind.TransactOpts) (*types.Transaction, error)
⋮----
// Transact invokes the (paid) contract method with params as input values.
func (_IStrategyManager *IStrategyManagerRaw) Transact(opts *bind.TransactOpts, method string, params ...interface
⋮----
// CalculateStrategyDepositDigestHash is a free data retrieval call binding the contract method 0x9ac01d61.
//
// Solidity: function calculateStrategyDepositDigestHash(address staker, address strategy, address token, uint256 amount, uint256 nonce, uint256 expiry) view returns(bytes32)
func (_IStrategyManager *IStrategyManagerCaller) CalculateStrategyDepositDigestHash(opts *bind.CallOpts, staker common.Address, strategy common.Address, token common.Address, amount *big.Int, nonce *big.Int, expiry *big.Int) ([32]byte, error)
⋮----
var out []interface{}
⋮----
// Delegation is a free data retrieval call binding the contract method 0xdf5cf723.
⋮----
// Solidity: function delegation() view returns(address)
func (_IStrategyManager *IStrategyManagerCaller) Delegation(opts *bind.CallOpts) (common.Address, error)
⋮----
// GetBurnOrRedistributableCount is a free data retrieval call binding the contract method 0x829fca73.
⋮----
// Solidity: function getBurnOrRedistributableCount((address,uint32) operatorSet, uint256 slashId) view returns(uint256)
func (_IStrategyManager *IStrategyManagerCaller) GetBurnOrRedistributableCount(opts *bind.CallOpts, operatorSet OperatorSet, slashId *big.Int) (*big.Int, error)
⋮----
// GetBurnOrRedistributableShares is a free data retrieval call binding the contract method 0x31f8fb4c.
⋮----
// Solidity: function getBurnOrRedistributableShares((address,uint32) operatorSet, uint256 slashId) view returns(address[], uint256[])
func (_IStrategyManager *IStrategyManagerCaller) GetBurnOrRedistributableShares(opts *bind.CallOpts, operatorSet OperatorSet, slashId *big.Int) ([]common.Address, []*big.Int, error)
⋮----
// GetBurnOrRedistributableShares0 is a free data retrieval call binding the contract method 0x76fb162b.
⋮----
// Solidity: function getBurnOrRedistributableShares((address,uint32) operatorSet, uint256 slashId, address strategy) view returns(uint256)
func (_IStrategyManager *IStrategyManagerCaller) GetBurnOrRedistributableShares0(opts *bind.CallOpts, operatorSet OperatorSet, slashId *big.Int, strategy common.Address) (*big.Int, error)
⋮----
// GetBurnableShares is a free data retrieval call binding the contract method 0xfd980423.
⋮----
// Solidity: function getBurnableShares(address strategy) view returns(uint256)
func (_IStrategyManager *IStrategyManagerCaller) GetBurnableShares(opts *bind.CallOpts, strategy common.Address) (*big.Int, error)
⋮----
// GetDeposits is a free data retrieval call binding the contract method 0x94f649dd.
⋮----
// Solidity: function getDeposits(address staker) view returns(address[], uint256[])
func (_IStrategyManager *IStrategyManagerCaller) GetDeposits(opts *bind.CallOpts, staker common.Address) ([]common.Address, []*big.Int, error)
⋮----
// GetPendingOperatorSets is a free data retrieval call binding the contract method 0x3f292b08.
⋮----
// Solidity: function getPendingOperatorSets() view returns((address,uint32)[])
func (_IStrategyManager *IStrategyManagerCaller) GetPendingOperatorSets(opts *bind.CallOpts) ([]OperatorSet, error)
⋮----
// GetPendingSlashIds is a free data retrieval call binding the contract method 0x7def1564.
⋮----
// Solidity: function getPendingSlashIds((address,uint32) operatorSet) view returns(uint256[])
func (_IStrategyManager *IStrategyManagerCaller) GetPendingSlashIds(opts *bind.CallOpts, operatorSet OperatorSet) ([]*big.Int, error)
⋮----
// GetStakerStrategyList is a free data retrieval call binding the contract method 0xde44acb6.
⋮----
// Solidity: function getStakerStrategyList(address staker) view returns(address[])
func (_IStrategyManager *IStrategyManagerCaller) GetStakerStrategyList(opts *bind.CallOpts, staker common.Address) ([]common.Address, error)
⋮----
// GetStrategiesWithBurnableShares is a free data retrieval call binding the contract method 0x36a8c500.
⋮----
// Solidity: function getStrategiesWithBurnableShares() view returns(address[], uint256[])
func (_IStrategyManager *IStrategyManagerCaller) GetStrategiesWithBurnableShares(opts *bind.CallOpts) ([]common.Address, []*big.Int, error)
⋮----
// StakerDepositShares is a free data retrieval call binding the contract method 0xfe243a17.
⋮----
// Solidity: function stakerDepositShares(address user, address strategy) view returns(uint256 shares)
func (_IStrategyManager *IStrategyManagerCaller) StakerDepositShares(opts *bind.CallOpts, user common.Address, strategy common.Address) (*big.Int, error)
⋮----
// StakerStrategyListLength is a free data retrieval call binding the contract method 0x8b8aac3c.
⋮----
// Solidity: function stakerStrategyListLength(address staker) view returns(uint256)
func (_IStrategyManager *IStrategyManagerCaller) StakerStrategyListLength(opts *bind.CallOpts, staker common.Address) (*big.Int, error)
⋮----
// StrategyIsWhitelistedForDeposit is a free data retrieval call binding the contract method 0x663c1de4.
⋮----
// Solidity: function strategyIsWhitelistedForDeposit(address strategy) view returns(bool)
func (_IStrategyManager *IStrategyManagerCaller) StrategyIsWhitelistedForDeposit(opts *bind.CallOpts, strategy common.Address) (bool, error)
⋮----
// StrategyWhitelister is a free data retrieval call binding the contract method 0x967fc0d2.
⋮----
// Solidity: function strategyWhitelister() view returns(address)
func (_IStrategyManager *IStrategyManagerCaller) StrategyWhitelister(opts *bind.CallOpts) (common.Address, error)
⋮----
// AddShares is a paid mutator transaction binding the contract method 0x50ff7225.
⋮----
// Solidity: function addShares(address staker, address strategy, uint256 shares) returns(uint256, uint256)
func (_IStrategyManager *IStrategyManagerTransactor) AddShares(opts *bind.TransactOpts, staker common.Address, strategy common.Address, shares *big.Int) (*types.Transaction, error)
⋮----
// AddStrategiesToDepositWhitelist is a paid mutator transaction binding the contract method 0x5de08ff2.
⋮----
// Solidity: function addStrategiesToDepositWhitelist(address[] strategiesToWhitelist) returns()
func (_IStrategyManager *IStrategyManagerTransactor) AddStrategiesToDepositWhitelist(opts *bind.TransactOpts, strategiesToWhitelist []common.Address) (*types.Transaction, error)
⋮----
// BurnShares is a paid mutator transaction binding the contract method 0x4b6d5d6e.
⋮----
// Solidity: function burnShares(address strategy) returns()
func (_IStrategyManager *IStrategyManagerTransactor) BurnShares(opts *bind.TransactOpts, strategy common.Address) (*types.Transaction, error)
⋮----
// ClearBurnOrRedistributableShares is a paid mutator transaction binding the contract method 0x88c10299.
⋮----
// Solidity: function clearBurnOrRedistributableShares((address,uint32) operatorSet, uint256 slashId) returns(uint256[])
func (_IStrategyManager *IStrategyManagerTransactor) ClearBurnOrRedistributableShares(opts *bind.TransactOpts, operatorSet OperatorSet, slashId *big.Int) (*types.Transaction, error)
⋮----
// ClearBurnOrRedistributableSharesByStrategy is a paid mutator transaction binding the contract method 0x2d44def6.
⋮----
// Solidity: function clearBurnOrRedistributableSharesByStrategy((address,uint32) operatorSet, uint256 slashId, address strategy) returns(uint256)
func (_IStrategyManager *IStrategyManagerTransactor) ClearBurnOrRedistributableSharesByStrategy(opts *bind.TransactOpts, operatorSet OperatorSet, slashId *big.Int, strategy common.Address) (*types.Transaction, error)
⋮----
// DepositIntoStrategy is a paid mutator transaction binding the contract method 0xe7a050aa.
⋮----
// Solidity: function depositIntoStrategy(address strategy, address token, uint256 amount) returns(uint256 depositShares)
func (_IStrategyManager *IStrategyManagerTransactor) DepositIntoStrategy(opts *bind.TransactOpts, strategy common.Address, token common.Address, amount *big.Int) (*types.Transaction, error)
⋮----
// DepositIntoStrategyWithSignature is a paid mutator transaction binding the contract method 0x32e89ace.
⋮----
// Solidity: function depositIntoStrategyWithSignature(address strategy, address token, uint256 amount, address staker, uint256 expiry, bytes signature) returns(uint256 depositShares)
func (_IStrategyManager *IStrategyManagerTransactor) DepositIntoStrategyWithSignature(opts *bind.TransactOpts, strategy common.Address, token common.Address, amount *big.Int, staker common.Address, expiry *big.Int, signature []byte) (*types.Transaction, error)
⋮----
// IncreaseBurnOrRedistributableShares is a paid mutator transaction binding the contract method 0x3fb99ca5.
⋮----
// Solidity: function increaseBurnOrRedistributableShares((address,uint32) operatorSet, uint256 slashId, address strategy, uint256 addedSharesToBurn) returns()
func (_IStrategyManager *IStrategyManagerTransactor) IncreaseBurnOrRedistributableShares(opts *bind.TransactOpts, operatorSet OperatorSet, slashId *big.Int, strategy common.Address, addedSharesToBurn *big.Int) (*types.Transaction, error)
⋮----
// Initialize is a paid mutator transaction binding the contract method 0x1794bb3c.
⋮----
// Solidity: function initialize(address initialOwner, address initialStrategyWhitelister, uint256 initialPausedStatus) returns()
func (_IStrategyManager *IStrategyManagerTransactor) Initialize(opts *bind.TransactOpts, initialOwner common.Address, initialStrategyWhitelister common.Address, initialPausedStatus *big.Int) (*types.Transaction, error)
⋮----
// RemoveDepositShares is a paid mutator transaction binding the contract method 0x724af423.
⋮----
// Solidity: function removeDepositShares(address staker, address strategy, uint256 depositSharesToRemove) returns(uint256)
func (_IStrategyManager *IStrategyManagerTransactor) RemoveDepositShares(opts *bind.TransactOpts, staker common.Address, strategy common.Address, depositSharesToRemove *big.Int) (*types.Transaction, error)
⋮----
// RemoveStrategiesFromDepositWhitelist is a paid mutator transaction binding the contract method 0xb5d8b5b8.
⋮----
// Solidity: function removeStrategiesFromDepositWhitelist(address[] strategiesToRemoveFromWhitelist) returns()
func (_IStrategyManager *IStrategyManagerTransactor) RemoveStrategiesFromDepositWhitelist(opts *bind.TransactOpts, strategiesToRemoveFromWhitelist []common.Address) (*types.Transaction, error)
⋮----
// SetStrategyWhitelister is a paid mutator transaction binding the contract method 0xc6656702.
⋮----
// Solidity: function setStrategyWhitelister(address newStrategyWhitelister) returns()
func (_IStrategyManager *IStrategyManagerTransactor) SetStrategyWhitelister(opts *bind.TransactOpts, newStrategyWhitelister common.Address) (*types.Transaction, error)
⋮----
// WithdrawSharesAsTokens is a paid mutator transaction binding the contract method 0x2eae418c.
⋮----
// Solidity: function withdrawSharesAsTokens(address staker, address strategy, address token, uint256 shares) returns()
func (_IStrategyManager *IStrategyManagerTransactor) WithdrawSharesAsTokens(opts *bind.TransactOpts, staker common.Address, strategy common.Address, token common.Address, shares *big.Int) (*types.Transaction, error)
⋮----
// IStrategyManagerBurnOrRedistributableSharesDecreasedIterator is returned from FilterBurnOrRedistributableSharesDecreased and is used to iterate over the raw logs and unpacked data for BurnOrRedistributableSharesDecreased events raised by the IStrategyManager contract.
type IStrategyManagerBurnOrRedistributableSharesDecreasedIterator struct {
	Event *IStrategyManagerBurnOrRedistributableSharesDecreased // 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
}
⋮----
Event *IStrategyManagerBurnOrRedistributableSharesDecreased // 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 *IStrategyManagerBurnOrRedistributableSharesDecreasedIterator) Next() bool
⋮----
// If the iterator failed, stop iterating
⋮----
// If the iterator completed, deliver directly whatever's available
⋮----
// Iterator still in progress, wait for either a data or an error event
⋮----
// Error returns any retrieval or parsing error occurred during filtering.
func (it *IStrategyManagerBurnOrRedistributableSharesDecreasedIterator) Error() error
⋮----
// Close terminates the iteration process, releasing any pending underlying
// resources.
func (it *IStrategyManagerBurnOrRedistributableSharesDecreasedIterator) Close() error
⋮----
// IStrategyManagerBurnOrRedistributableSharesDecreased represents a BurnOrRedistributableSharesDecreased event raised by the IStrategyManager contract.
type IStrategyManagerBurnOrRedistributableSharesDecreased struct {
	OperatorSet OperatorSet
	SlashId     *big.Int
	Strategy    common.Address
	Shares      *big.Int
	Raw         types.Log // Blockchain specific contextual infos
}
⋮----
Raw         types.Log // Blockchain specific contextual infos
⋮----
// FilterBurnOrRedistributableSharesDecreased is a free log retrieval operation binding the contract event 0xe6413aa0c789e437b0a06bf64b20926584f066c79a2d8b80a759c85472f7b0af.
⋮----
// Solidity: event BurnOrRedistributableSharesDecreased((address,uint32) operatorSet, uint256 slashId, address strategy, uint256 shares)
func (_IStrategyManager *IStrategyManagerFilterer) FilterBurnOrRedistributableSharesDecreased(opts *bind.FilterOpts) (*IStrategyManagerBurnOrRedistributableSharesDecreasedIterator, error)
⋮----
// WatchBurnOrRedistributableSharesDecreased is a free log subscription operation binding the contract event 0xe6413aa0c789e437b0a06bf64b20926584f066c79a2d8b80a759c85472f7b0af.
⋮----
func (_IStrategyManager *IStrategyManagerFilterer) WatchBurnOrRedistributableSharesDecreased(opts *bind.WatchOpts, sink chan<- *IStrategyManagerBurnOrRedistributableSharesDecreased) (event.Subscription, error)
⋮----
// New log arrived, parse the event and forward to the user
⋮----
// ParseBurnOrRedistributableSharesDecreased is a log parse operation binding the contract event 0xe6413aa0c789e437b0a06bf64b20926584f066c79a2d8b80a759c85472f7b0af.
⋮----
func (_IStrategyManager *IStrategyManagerFilterer) ParseBurnOrRedistributableSharesDecreased(log types.Log) (*IStrategyManagerBurnOrRedistributableSharesDecreased, error)
⋮----
// IStrategyManagerBurnOrRedistributableSharesIncreasedIterator is returned from FilterBurnOrRedistributableSharesIncreased and is used to iterate over the raw logs and unpacked data for BurnOrRedistributableSharesIncreased events raised by the IStrategyManager contract.
type IStrategyManagerBurnOrRedistributableSharesIncreasedIterator struct {
	Event *IStrategyManagerBurnOrRedistributableSharesIncreased // 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
}
⋮----
Event *IStrategyManagerBurnOrRedistributableSharesIncreased // Event containing the contract specifics and raw log
⋮----
// IStrategyManagerBurnOrRedistributableSharesIncreased represents a BurnOrRedistributableSharesIncreased event raised by the IStrategyManager contract.
type IStrategyManagerBurnOrRedistributableSharesIncreased struct {
	OperatorSet OperatorSet
	SlashId     *big.Int
	Strategy    common.Address
	Shares      *big.Int
	Raw         types.Log // Blockchain specific contextual infos
}
⋮----
// FilterBurnOrRedistributableSharesIncreased is a free log retrieval operation binding the contract event 0x5f5209798bbac45a16d2dc3bc67319fab26ee00153916d6f07b69f8a134a1e8b.
⋮----
// Solidity: event BurnOrRedistributableSharesIncreased((address,uint32) operatorSet, uint256 slashId, address strategy, uint256 shares)
func (_IStrategyManager *IStrategyManagerFilterer) FilterBurnOrRedistributableSharesIncreased(opts *bind.FilterOpts) (*IStrategyManagerBurnOrRedistributableSharesIncreasedIterator, error)
⋮----
// WatchBurnOrRedistributableSharesIncreased is a free log subscription operation binding the contract event 0x5f5209798bbac45a16d2dc3bc67319fab26ee00153916d6f07b69f8a134a1e8b.
⋮----
func (_IStrategyManager *IStrategyManagerFilterer) WatchBurnOrRedistributableSharesIncreased(opts *bind.WatchOpts, sink chan<- *IStrategyManagerBurnOrRedistributableSharesIncreased) (event.Subscription, error)
⋮----
// ParseBurnOrRedistributableSharesIncreased is a log parse operation binding the contract event 0x5f5209798bbac45a16d2dc3bc67319fab26ee00153916d6f07b69f8a134a1e8b.
⋮----
func (_IStrategyManager *IStrategyManagerFilterer) ParseBurnOrRedistributableSharesIncreased(log types.Log) (*IStrategyManagerBurnOrRedistributableSharesIncreased, error)
⋮----
// IStrategyManagerBurnableSharesDecreasedIterator is returned from FilterBurnableSharesDecreased and is used to iterate over the raw logs and unpacked data for BurnableSharesDecreased events raised by the IStrategyManager contract.
type IStrategyManagerBurnableSharesDecreasedIterator struct {
	Event *IStrategyManagerBurnableSharesDecreased // 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
}
⋮----
Event *IStrategyManagerBurnableSharesDecreased // Event containing the contract specifics and raw log
⋮----
// IStrategyManagerBurnableSharesDecreased represents a BurnableSharesDecreased event raised by the IStrategyManager contract.
type IStrategyManagerBurnableSharesDecreased struct {
	Strategy common.Address
	Shares   *big.Int
	Raw      types.Log // Blockchain specific contextual infos
}
⋮----
Raw      types.Log // Blockchain specific contextual infos
⋮----
// FilterBurnableSharesDecreased is a free log retrieval operation binding the contract event 0xd9d082c3ec4f3a3ffa55c324939a06407f5fbcb87d5e0ce3b9508c92c84ed839.
⋮----
// Solidity: event BurnableSharesDecreased(address strategy, uint256 shares)
func (_IStrategyManager *IStrategyManagerFilterer) FilterBurnableSharesDecreased(opts *bind.FilterOpts) (*IStrategyManagerBurnableSharesDecreasedIterator, error)
⋮----
// WatchBurnableSharesDecreased is a free log subscription operation binding the contract event 0xd9d082c3ec4f3a3ffa55c324939a06407f5fbcb87d5e0ce3b9508c92c84ed839.
⋮----
func (_IStrategyManager *IStrategyManagerFilterer) WatchBurnableSharesDecreased(opts *bind.WatchOpts, sink chan<- *IStrategyManagerBurnableSharesDecreased) (event.Subscription, error)
⋮----
// ParseBurnableSharesDecreased is a log parse operation binding the contract event 0xd9d082c3ec4f3a3ffa55c324939a06407f5fbcb87d5e0ce3b9508c92c84ed839.
⋮----
func (_IStrategyManager *IStrategyManagerFilterer) ParseBurnableSharesDecreased(log types.Log) (*IStrategyManagerBurnableSharesDecreased, error)
⋮----
// IStrategyManagerDepositIterator is returned from FilterDeposit and is used to iterate over the raw logs and unpacked data for Deposit events raised by the IStrategyManager contract.
type IStrategyManagerDepositIterator struct {
	Event *IStrategyManagerDeposit // 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
}
⋮----
Event *IStrategyManagerDeposit // Event containing the contract specifics and raw log
⋮----
// IStrategyManagerDeposit represents a Deposit event raised by the IStrategyManager contract.
type IStrategyManagerDeposit struct {
	Staker   common.Address
	Strategy common.Address
	Shares   *big.Int
	Raw      types.Log // Blockchain specific contextual infos
}
⋮----
// FilterDeposit is a free log retrieval operation binding the contract event 0x5548c837ab068cf56a2c2479df0882a4922fd203edb7517321831d95078c5f62.
⋮----
// Solidity: event Deposit(address staker, address strategy, uint256 shares)
func (_IStrategyManager *IStrategyManagerFilterer) FilterDeposit(opts *bind.FilterOpts) (*IStrategyManagerDepositIterator, error)
⋮----
// WatchDeposit is a free log subscription operation binding the contract event 0x5548c837ab068cf56a2c2479df0882a4922fd203edb7517321831d95078c5f62.
⋮----
func (_IStrategyManager *IStrategyManagerFilterer) WatchDeposit(opts *bind.WatchOpts, sink chan<- *IStrategyManagerDeposit) (event.Subscription, error)
⋮----
// ParseDeposit is a log parse operation binding the contract event 0x5548c837ab068cf56a2c2479df0882a4922fd203edb7517321831d95078c5f62.
⋮----
func (_IStrategyManager *IStrategyManagerFilterer) ParseDeposit(log types.Log) (*IStrategyManagerDeposit, error)
⋮----
// IStrategyManagerStrategyAddedToDepositWhitelistIterator is returned from FilterStrategyAddedToDepositWhitelist and is used to iterate over the raw logs and unpacked data for StrategyAddedToDepositWhitelist events raised by the IStrategyManager contract.
type IStrategyManagerStrategyAddedToDepositWhitelistIterator struct {
	Event *IStrategyManagerStrategyAddedToDepositWhitelist // 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
}
⋮----
Event *IStrategyManagerStrategyAddedToDepositWhitelist // Event containing the contract specifics and raw log
⋮----
// IStrategyManagerStrategyAddedToDepositWhitelist represents a StrategyAddedToDepositWhitelist event raised by the IStrategyManager contract.
type IStrategyManagerStrategyAddedToDepositWhitelist struct {
	Strategy common.Address
	Raw      types.Log // Blockchain specific contextual infos
}
⋮----
// FilterStrategyAddedToDepositWhitelist is a free log retrieval operation binding the contract event 0x0c35b17d91c96eb2751cd456e1252f42a386e524ef9ff26ecc9950859fdc04fe.
⋮----
// Solidity: event StrategyAddedToDepositWhitelist(address strategy)
func (_IStrategyManager *IStrategyManagerFilterer) FilterStrategyAddedToDepositWhitelist(opts *bind.FilterOpts) (*IStrategyManagerStrategyAddedToDepositWhitelistIterator, error)
⋮----
// WatchStrategyAddedToDepositWhitelist is a free log subscription operation binding the contract event 0x0c35b17d91c96eb2751cd456e1252f42a386e524ef9ff26ecc9950859fdc04fe.
⋮----
func (_IStrategyManager *IStrategyManagerFilterer) WatchStrategyAddedToDepositWhitelist(opts *bind.WatchOpts, sink chan<- *IStrategyManagerStrategyAddedToDepositWhitelist) (event.Subscription, error)
⋮----
// ParseStrategyAddedToDepositWhitelist is a log parse operation binding the contract event 0x0c35b17d91c96eb2751cd456e1252f42a386e524ef9ff26ecc9950859fdc04fe.
⋮----
func (_IStrategyManager *IStrategyManagerFilterer) ParseStrategyAddedToDepositWhitelist(log types.Log) (*IStrategyManagerStrategyAddedToDepositWhitelist, error)
⋮----
// IStrategyManagerStrategyRemovedFromDepositWhitelistIterator is returned from FilterStrategyRemovedFromDepositWhitelist and is used to iterate over the raw logs and unpacked data for StrategyRemovedFromDepositWhitelist events raised by the IStrategyManager contract.
type IStrategyManagerStrategyRemovedFromDepositWhitelistIterator struct {
	Event *IStrategyManagerStrategyRemovedFromDepositWhitelist // 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
}
⋮----
Event *IStrategyManagerStrategyRemovedFromDepositWhitelist // Event containing the contract specifics and raw log
⋮----
// IStrategyManagerStrategyRemovedFromDepositWhitelist represents a StrategyRemovedFromDepositWhitelist event raised by the IStrategyManager contract.
type IStrategyManagerStrategyRemovedFromDepositWhitelist struct {
	Strategy common.Address
	Raw      types.Log // Blockchain specific contextual infos
}
⋮----
// FilterStrategyRemovedFromDepositWhitelist is a free log retrieval operation binding the contract event 0x4074413b4b443e4e58019f2855a8765113358c7c72e39509c6af45fc0f5ba030.
⋮----
// Solidity: event StrategyRemovedFromDepositWhitelist(address strategy)
func (_IStrategyManager *IStrategyManagerFilterer) FilterStrategyRemovedFromDepositWhitelist(opts *bind.FilterOpts) (*IStrategyManagerStrategyRemovedFromDepositWhitelistIterator, error)
⋮----
// WatchStrategyRemovedFromDepositWhitelist is a free log subscription operation binding the contract event 0x4074413b4b443e4e58019f2855a8765113358c7c72e39509c6af45fc0f5ba030.
⋮----
func (_IStrategyManager *IStrategyManagerFilterer) WatchStrategyRemovedFromDepositWhitelist(opts *bind.WatchOpts, sink chan<- *IStrategyManagerStrategyRemovedFromDepositWhitelist) (event.Subscription, error)
⋮----
// ParseStrategyRemovedFromDepositWhitelist is a log parse operation binding the contract event 0x4074413b4b443e4e58019f2855a8765113358c7c72e39509c6af45fc0f5ba030.
⋮----
func (_IStrategyManager *IStrategyManagerFilterer) ParseStrategyRemovedFromDepositWhitelist(log types.Log) (*IStrategyManagerStrategyRemovedFromDepositWhitelist, error)
⋮----
// IStrategyManagerStrategyWhitelisterChangedIterator is returned from FilterStrategyWhitelisterChanged and is used to iterate over the raw logs and unpacked data for StrategyWhitelisterChanged events raised by the IStrategyManager contract.
type IStrategyManagerStrategyWhitelisterChangedIterator struct {
	Event *IStrategyManagerStrategyWhitelisterChanged // 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
}
⋮----
Event *IStrategyManagerStrategyWhitelisterChanged // Event containing the contract specifics and raw log
⋮----
// IStrategyManagerStrategyWhitelisterChanged represents a StrategyWhitelisterChanged event raised by the IStrategyManager contract.
type IStrategyManagerStrategyWhitelisterChanged struct {
	PreviousAddress common.Address
	NewAddress      common.Address
	Raw             types.Log // Blockchain specific contextual infos
}
⋮----
Raw             types.Log // Blockchain specific contextual infos
⋮----
// FilterStrategyWhitelisterChanged is a free log retrieval operation binding the contract event 0x4264275e593955ff9d6146a51a4525f6ddace2e81db9391abcc9d1ca48047d29.
⋮----
// Solidity: event StrategyWhitelisterChanged(address previousAddress, address newAddress)
func (_IStrategyManager *IStrategyManagerFilterer) FilterStrategyWhitelisterChanged(opts *bind.FilterOpts) (*IStrategyManagerStrategyWhitelisterChangedIterator, error)
⋮----
// WatchStrategyWhitelisterChanged is a free log subscription operation binding the contract event 0x4264275e593955ff9d6146a51a4525f6ddace2e81db9391abcc9d1ca48047d29.
⋮----
func (_IStrategyManager *IStrategyManagerFilterer) WatchStrategyWhitelisterChanged(opts *bind.WatchOpts, sink chan<- *IStrategyManagerStrategyWhitelisterChanged) (event.Subscription, error)
⋮----
// ParseStrategyWhitelisterChanged is a log parse operation binding the contract event 0x4264275e593955ff9d6146a51a4525f6ddace2e81db9391abcc9d1ca48047d29.
⋮----
func (_IStrategyManager *IStrategyManagerFilterer) ParseStrategyWhitelisterChanged(log types.Log) (*IStrategyManagerStrategyWhitelisterChanged, error)
````

## File: pkg/bindings/ITaskMailbox/binding.go
````go
// Code generated - DO NOT EDIT.
// This file is a generated binding and any manual changes will be lost.
⋮----
package ITaskMailbox
⋮----
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"
)
⋮----
"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
)
⋮----
// BN254G1Point is an auto generated low-level Go binding around an user-defined struct.
type BN254G1Point struct {
	X *big.Int
	Y *big.Int
}
⋮----
// BN254G2Point is an auto generated low-level Go binding around an user-defined struct.
type BN254G2Point struct {
	X [2]*big.Int
	Y [2]*big.Int
}
⋮----
// IBN254CertificateVerifierTypesBN254Certificate is an auto generated low-level Go binding around an user-defined struct.
type IBN254CertificateVerifierTypesBN254Certificate struct {
	ReferenceTimestamp uint32
	MessageHash        [32]byte
	Signature          BN254G1Point
	Apk                BN254G2Point
	NonSignerWitnesses []IBN254CertificateVerifierTypesBN254OperatorInfoWitness
}
⋮----
// IBN254CertificateVerifierTypesBN254OperatorInfoWitness is an auto generated low-level Go binding around an user-defined struct.
type IBN254CertificateVerifierTypesBN254OperatorInfoWitness struct {
	OperatorIndex     uint32
	OperatorInfoProof []byte
	OperatorInfo      IOperatorTableCalculatorTypesBN254OperatorInfo
}
⋮----
// IECDSACertificateVerifierTypesECDSACertificate is an auto generated low-level Go binding around an user-defined struct.
type IECDSACertificateVerifierTypesECDSACertificate struct {
	ReferenceTimestamp uint32
	MessageHash        [32]byte
	Sig                []byte
}
⋮----
// IOperatorTableCalculatorTypesBN254OperatorInfo is an auto generated low-level Go binding around an user-defined struct.
type IOperatorTableCalculatorTypesBN254OperatorInfo struct {
	Pubkey  BN254G1Point
	Weights []*big.Int
}
⋮----
// ITaskMailboxTypesConsensus is an auto generated low-level Go binding around an user-defined struct.
type ITaskMailboxTypesConsensus struct {
	ConsensusType uint8
	Value         []byte
}
⋮----
// ITaskMailboxTypesExecutorOperatorSetTaskConfig is an auto generated low-level Go binding around an user-defined struct.
type ITaskMailboxTypesExecutorOperatorSetTaskConfig struct {
	TaskHook     common.Address
	TaskSLA      *big.Int
	FeeToken     common.Address
	CurveType    uint8
	FeeCollector common.Address
	Consensus    ITaskMailboxTypesConsensus
	TaskMetadata []byte
}
⋮----
// ITaskMailboxTypesTask is an auto generated low-level Go binding around an user-defined struct.
type ITaskMailboxTypesTask struct {
	Creator                         common.Address
	CreationTime                    *big.Int
	Avs                             common.Address
	AvsFee                          *big.Int
	RefundCollector                 common.Address
	ExecutorOperatorSetId           uint32
	FeeSplit                        uint16
	Status                          uint8
	IsFeeRefunded                   bool
	OperatorTableReferenceTimestamp uint32
	ExecutorOperatorSetTaskConfig   ITaskMailboxTypesExecutorOperatorSetTaskConfig
	Payload                         []byte
	ExecutorCert                    []byte
	Result                          []byte
}
⋮----
// ITaskMailboxTypesTaskParams is an auto generated low-level Go binding around an user-defined struct.
type ITaskMailboxTypesTaskParams struct {
	RefundCollector     common.Address
	ExecutorOperatorSet OperatorSet
	Payload             []byte
}
⋮----
// OperatorSet is an auto generated low-level Go binding around an user-defined struct.
type OperatorSet struct {
	Avs common.Address
	Id  uint32
}
⋮----
// ITaskMailboxMetaData contains all meta data concerning the ITaskMailbox contract.
var ITaskMailboxMetaData = &bind.MetaData{
	ABI: "[{\"type\":\"function\",\"name\":\"BN254_CERTIFICATE_VERIFIER\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"ECDSA_CERTIFICATE_VERIFIER\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"MAX_TASK_SLA\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint96\",\"internalType\":\"uint96\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"createTask\",\"inputs\":[{\"name\":\"taskParams\",\"type\":\"tuple\",\"internalType\":\"structITaskMailboxTypes.TaskParams\",\"components\":[{\"name\":\"refundCollector\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"executorOperatorSet\",\"type\":\"tuple\",\"internalType\":\"structOperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]},{\"name\":\"payload\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]}],\"outputs\":[{\"name\":\"taskHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"feeSplit\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint16\",\"internalType\":\"uint16\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"feeSplitCollector\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getBN254CertificateBytes\",\"inputs\":[{\"name\":\"cert\",\"type\":\"tuple\",\"internalType\":\"structIBN254CertificateVerifierTypes.BN254Certificate\",\"components\":[{\"name\":\"referenceTimestamp\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"messageHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"signature\",\"type\":\"tuple\",\"internalType\":\"structBN254.G1Point\",\"components\":[{\"name\":\"X\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"Y\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]},{\"name\":\"apk\",\"type\":\"tuple\",\"internalType\":\"structBN254.G2Point\",\"components\":[{\"name\":\"X\",\"type\":\"uint256[2]\",\"internalType\":\"uint256[2]\"},{\"name\":\"Y\",\"type\":\"uint256[2]\",\"internalType\":\"uint256[2]\"}]},{\"name\":\"nonSignerWitnesses\",\"type\":\"tuple[]\",\"internalType\":\"structIBN254CertificateVerifierTypes.BN254OperatorInfoWitness[]\",\"components\":[{\"name\":\"operatorIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"operatorInfoProof\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"operatorInfo\",\"type\":\"tuple\",\"internalType\":\"structIOperatorTableCalculatorTypes.BN254OperatorInfo\",\"components\":[{\"name\":\"pubkey\",\"type\":\"tuple\",\"internalType\":\"structBN254.G1Point\",\"components\":[{\"name\":\"X\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"Y\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]},{\"name\":\"weights\",\"type\":\"uint256[]\",\"internalType\":\"uint256[]\"}]}]}]}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"stateMutability\":\"pure\"},{\"type\":\"function\",\"name\":\"getECDSACertificateBytes\",\"inputs\":[{\"name\":\"cert\",\"type\":\"tuple\",\"internalType\":\"structIECDSACertificateVerifierTypes.ECDSACertificate\",\"components\":[{\"name\":\"referenceTimestamp\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"messageHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"sig\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"stateMutability\":\"pure\"},{\"type\":\"function\",\"name\":\"getExecutorOperatorSetTaskConfig\",\"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\":\"structITaskMailboxTypes.ExecutorOperatorSetTaskConfig\",\"components\":[{\"name\":\"taskHook\",\"type\":\"address\",\"internalType\":\"contractIAVSTaskHook\"},{\"name\":\"taskSLA\",\"type\":\"uint96\",\"internalType\":\"uint96\"},{\"name\":\"feeToken\",\"type\":\"address\",\"internalType\":\"contractIERC20\"},{\"name\":\"curveType\",\"type\":\"uint8\",\"internalType\":\"enumIKeyRegistrarTypes.CurveType\"},{\"name\":\"feeCollector\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"consensus\",\"type\":\"tuple\",\"internalType\":\"structITaskMailboxTypes.Consensus\",\"components\":[{\"name\":\"consensusType\",\"type\":\"uint8\",\"internalType\":\"enumITaskMailboxTypes.ConsensusType\"},{\"name\":\"value\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]},{\"name\":\"taskMetadata\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getMessageHash\",\"inputs\":[{\"name\":\"taskHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"result\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"pure\"},{\"type\":\"function\",\"name\":\"getTaskInfo\",\"inputs\":[{\"name\":\"taskHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"tuple\",\"internalType\":\"structITaskMailboxTypes.Task\",\"components\":[{\"name\":\"creator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"creationTime\",\"type\":\"uint96\",\"internalType\":\"uint96\"},{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"avsFee\",\"type\":\"uint96\",\"internalType\":\"uint96\"},{\"name\":\"refundCollector\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"executorOperatorSetId\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"feeSplit\",\"type\":\"uint16\",\"internalType\":\"uint16\"},{\"name\":\"status\",\"type\":\"uint8\",\"internalType\":\"enumITaskMailboxTypes.TaskStatus\"},{\"name\":\"isFeeRefunded\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"operatorTableReferenceTimestamp\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"executorOperatorSetTaskConfig\",\"type\":\"tuple\",\"internalType\":\"structITaskMailboxTypes.ExecutorOperatorSetTaskConfig\",\"components\":[{\"name\":\"taskHook\",\"type\":\"address\",\"internalType\":\"contractIAVSTaskHook\"},{\"name\":\"taskSLA\",\"type\":\"uint96\",\"internalType\":\"uint96\"},{\"name\":\"feeToken\",\"type\":\"address\",\"internalType\":\"contractIERC20\"},{\"name\":\"curveType\",\"type\":\"uint8\",\"internalType\":\"enumIKeyRegistrarTypes.CurveType\"},{\"name\":\"feeCollector\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"consensus\",\"type\":\"tuple\",\"internalType\":\"structITaskMailboxTypes.Consensus\",\"components\":[{\"name\":\"consensusType\",\"type\":\"uint8\",\"internalType\":\"enumITaskMailboxTypes.ConsensusType\"},{\"name\":\"value\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]},{\"name\":\"taskMetadata\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]},{\"name\":\"payload\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"executorCert\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"result\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getTaskResult\",\"inputs\":[{\"name\":\"taskHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getTaskStatus\",\"inputs\":[{\"name\":\"taskHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint8\",\"internalType\":\"enumITaskMailboxTypes.TaskStatus\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"initialize\",\"inputs\":[{\"name\":\"owner\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"feeSplit\",\"type\":\"uint16\",\"internalType\":\"uint16\"},{\"name\":\"feeSplitCollector\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"isExecutorOperatorSetRegistered\",\"inputs\":[{\"name\":\"operatorSetKey\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"refundFee\",\"inputs\":[{\"name\":\"taskHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"registerExecutorOperatorSet\",\"inputs\":[{\"name\":\"operatorSet\",\"type\":\"tuple\",\"internalType\":\"structOperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]},{\"name\":\"isRegistered\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"setExecutorOperatorSetTaskConfig\",\"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\":\"structITaskMailboxTypes.ExecutorOperatorSetTaskConfig\",\"components\":[{\"name\":\"taskHook\",\"type\":\"address\",\"internalType\":\"contractIAVSTaskHook\"},{\"name\":\"taskSLA\",\"type\":\"uint96\",\"internalType\":\"uint96\"},{\"name\":\"feeToken\",\"type\":\"address\",\"internalType\":\"contractIERC20\"},{\"name\":\"curveType\",\"type\":\"uint8\",\"internalType\":\"enumIKeyRegistrarTypes.CurveType\"},{\"name\":\"feeCollector\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"consensus\",\"type\":\"tuple\",\"internalType\":\"structITaskMailboxTypes.Consensus\",\"components\":[{\"name\":\"consensusType\",\"type\":\"uint8\",\"internalType\":\"enumITaskMailboxTypes.ConsensusType\"},{\"name\":\"value\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]},{\"name\":\"taskMetadata\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"setFeeSplit\",\"inputs\":[{\"name\":\"feeSplit\",\"type\":\"uint16\",\"internalType\":\"uint16\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"setFeeSplitCollector\",\"inputs\":[{\"name\":\"feeSplitCollector\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"submitResult\",\"inputs\":[{\"name\":\"taskHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"executorCert\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"result\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"event\",\"name\":\"ExecutorOperatorSetRegistered\",\"inputs\":[{\"name\":\"caller\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"avs\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"executorOperatorSetId\",\"type\":\"uint32\",\"indexed\":true,\"internalType\":\"uint32\"},{\"name\":\"isRegistered\",\"type\":\"bool\",\"indexed\":false,\"internalType\":\"bool\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ExecutorOperatorSetTaskConfigSet\",\"inputs\":[{\"name\":\"caller\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"avs\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"executorOperatorSetId\",\"type\":\"uint32\",\"indexed\":true,\"internalType\":\"uint32\"},{\"name\":\"config\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structITaskMailboxTypes.ExecutorOperatorSetTaskConfig\",\"components\":[{\"name\":\"taskHook\",\"type\":\"address\",\"internalType\":\"contractIAVSTaskHook\"},{\"name\":\"taskSLA\",\"type\":\"uint96\",\"internalType\":\"uint96\"},{\"name\":\"feeToken\",\"type\":\"address\",\"internalType\":\"contractIERC20\"},{\"name\":\"curveType\",\"type\":\"uint8\",\"internalType\":\"enumIKeyRegistrarTypes.CurveType\"},{\"name\":\"feeCollector\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"consensus\",\"type\":\"tuple\",\"internalType\":\"structITaskMailboxTypes.Consensus\",\"components\":[{\"name\":\"consensusType\",\"type\":\"uint8\",\"internalType\":\"enumITaskMailboxTypes.ConsensusType\"},{\"name\":\"value\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]},{\"name\":\"taskMetadata\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"FeeRefunded\",\"inputs\":[{\"name\":\"refundCollector\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"taskHash\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"avsFee\",\"type\":\"uint96\",\"indexed\":false,\"internalType\":\"uint96\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"FeeSplitCollectorSet\",\"inputs\":[{\"name\":\"feeSplitCollector\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"FeeSplitSet\",\"inputs\":[{\"name\":\"feeSplit\",\"type\":\"uint16\",\"indexed\":false,\"internalType\":\"uint16\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"TaskCreated\",\"inputs\":[{\"name\":\"creator\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"taskHash\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"avs\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"executorOperatorSetId\",\"type\":\"uint32\",\"indexed\":false,\"internalType\":\"uint32\"},{\"name\":\"operatorTableReferenceTimestamp\",\"type\":\"uint32\",\"indexed\":false,\"internalType\":\"uint32\"},{\"name\":\"refundCollector\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"},{\"name\":\"avsFee\",\"type\":\"uint96\",\"indexed\":false,\"internalType\":\"uint96\"},{\"name\":\"taskDeadline\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"payload\",\"type\":\"bytes\",\"indexed\":false,\"internalType\":\"bytes\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"TaskVerified\",\"inputs\":[{\"name\":\"aggregator\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"taskHash\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"avs\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"executorOperatorSetId\",\"type\":\"uint32\",\"indexed\":false,\"internalType\":\"uint32\"},{\"name\":\"executorCert\",\"type\":\"bytes\",\"indexed\":false,\"internalType\":\"bytes\"},{\"name\":\"result\",\"type\":\"bytes\",\"indexed\":false,\"internalType\":\"bytes\"}],\"anonymous\":false},{\"type\":\"error\",\"name\":\"CertificateStale\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"EmptyCertificateSignature\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ExecutorOperatorSetNotRegistered\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ExecutorOperatorSetTaskConfigNotSet\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"FeeAlreadyRefunded\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidAddressZero\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidConsensusType\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidConsensusValue\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidCurveType\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidFeeReceiver\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidFeeSplit\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidMessageHash\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidOperatorSetOwner\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidReferenceTimestamp\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidTaskCreator\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidTaskStatus\",\"inputs\":[{\"name\":\"expected\",\"type\":\"uint8\",\"internalType\":\"enumITaskMailboxTypes.TaskStatus\"},{\"name\":\"actual\",\"type\":\"uint8\",\"internalType\":\"enumITaskMailboxTypes.TaskStatus\"}]},{\"type\":\"error\",\"name\":\"OnlyRefundCollector\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"PayloadIsEmpty\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"TaskSLAExceedsMaximum\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ThresholdNotMet\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"TimestampAtCreation\",\"inputs\":[]}]",
}
⋮----
// ITaskMailboxABI is the input ABI used to generate the binding from.
// Deprecated: Use ITaskMailboxMetaData.ABI instead.
var ITaskMailboxABI = ITaskMailboxMetaData.ABI
⋮----
// ITaskMailbox is an auto generated Go binding around an Ethereum contract.
type ITaskMailbox struct {
	ITaskMailboxCaller     // Read-only binding to the contract
	ITaskMailboxTransactor // Write-only binding to the contract
	ITaskMailboxFilterer   // Log filterer for contract events
}
⋮----
ITaskMailboxCaller     // Read-only binding to the contract
ITaskMailboxTransactor // Write-only binding to the contract
ITaskMailboxFilterer   // Log filterer for contract events
⋮----
// ITaskMailboxCaller is an auto generated read-only Go binding around an Ethereum contract.
type ITaskMailboxCaller struct {
	contract *bind.BoundContract // Generic contract wrapper for the low level calls
}
⋮----
contract *bind.BoundContract // Generic contract wrapper for the low level calls
⋮----
// ITaskMailboxTransactor is an auto generated write-only Go binding around an Ethereum contract.
type ITaskMailboxTransactor struct {
	contract *bind.BoundContract // Generic contract wrapper for the low level calls
}
⋮----
// ITaskMailboxFilterer is an auto generated log filtering Go binding around an Ethereum contract events.
type ITaskMailboxFilterer struct {
	contract *bind.BoundContract // Generic contract wrapper for the low level calls
}
⋮----
// ITaskMailboxSession is an auto generated Go binding around an Ethereum contract,
// with pre-set call and transact options.
type ITaskMailboxSession struct {
	Contract     *ITaskMailbox     // 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
}
⋮----
Contract     *ITaskMailbox     // 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
⋮----
// ITaskMailboxCallerSession is an auto generated read-only Go binding around an Ethereum contract,
// with pre-set call options.
type ITaskMailboxCallerSession struct {
	Contract *ITaskMailboxCaller // Generic contract caller binding to set the session for
	CallOpts bind.CallOpts       // Call options to use throughout this session
}
⋮----
Contract *ITaskMailboxCaller // Generic contract caller binding to set the session for
CallOpts bind.CallOpts       // Call options to use throughout this session
⋮----
// ITaskMailboxTransactorSession is an auto generated write-only Go binding around an Ethereum contract,
// with pre-set transact options.
type ITaskMailboxTransactorSession struct {
	Contract     *ITaskMailboxTransactor // Generic contract transactor binding to set the session for
	TransactOpts bind.TransactOpts       // Transaction auth options to use throughout this session
}
⋮----
Contract     *ITaskMailboxTransactor // Generic contract transactor binding to set the session for
TransactOpts bind.TransactOpts       // Transaction auth options to use throughout this session
⋮----
// ITaskMailboxRaw is an auto generated low-level Go binding around an Ethereum contract.
type ITaskMailboxRaw struct {
	Contract *ITaskMailbox // Generic contract binding to access the raw methods on
}
⋮----
Contract *ITaskMailbox // Generic contract binding to access the raw methods on
⋮----
// ITaskMailboxCallerRaw is an auto generated low-level read-only Go binding around an Ethereum contract.
type ITaskMailboxCallerRaw struct {
	Contract *ITaskMailboxCaller // Generic read-only contract binding to access the raw methods on
}
⋮----
Contract *ITaskMailboxCaller // Generic read-only contract binding to access the raw methods on
⋮----
// ITaskMailboxTransactorRaw is an auto generated low-level write-only Go binding around an Ethereum contract.
type ITaskMailboxTransactorRaw struct {
	Contract *ITaskMailboxTransactor // Generic write-only contract binding to access the raw methods on
}
⋮----
Contract *ITaskMailboxTransactor // Generic write-only contract binding to access the raw methods on
⋮----
// NewITaskMailbox creates a new instance of ITaskMailbox, bound to a specific deployed contract.
func NewITaskMailbox(address common.Address, backend bind.ContractBackend) (*ITaskMailbox, error)
⋮----
// NewITaskMailboxCaller creates a new read-only instance of ITaskMailbox, bound to a specific deployed contract.
func NewITaskMailboxCaller(address common.Address, caller bind.ContractCaller) (*ITaskMailboxCaller, error)
⋮----
// NewITaskMailboxTransactor creates a new write-only instance of ITaskMailbox, bound to a specific deployed contract.
func NewITaskMailboxTransactor(address common.Address, transactor bind.ContractTransactor) (*ITaskMailboxTransactor, error)
⋮----
// NewITaskMailboxFilterer creates a new log filterer instance of ITaskMailbox, bound to a specific deployed contract.
func NewITaskMailboxFilterer(address common.Address, filterer bind.ContractFilterer) (*ITaskMailboxFilterer, error)
⋮----
// bindITaskMailbox binds a generic wrapper to an already deployed contract.
func bindITaskMailbox(address common.Address, caller bind.ContractCaller, transactor bind.ContractTransactor, filterer bind.ContractFilterer) (*bind.BoundContract, error)
⋮----
// 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 (_ITaskMailbox *ITaskMailboxRaw) Call(opts *bind.CallOpts, result *[]interface
⋮----
// Transfer initiates a plain transaction to move funds to the contract, calling
// its default method if one is available.
func (_ITaskMailbox *ITaskMailboxRaw) Transfer(opts *bind.TransactOpts) (*types.Transaction, error)
⋮----
// Transact invokes the (paid) contract method with params as input values.
func (_ITaskMailbox *ITaskMailboxRaw) Transact(opts *bind.TransactOpts, method string, params ...interface
⋮----
// BN254CERTIFICATEVERIFIER is a free data retrieval call binding the contract method 0xf7424fc9.
//
// Solidity: function BN254_CERTIFICATE_VERIFIER() view returns(address)
func (_ITaskMailbox *ITaskMailboxCaller) BN254CERTIFICATEVERIFIER(opts *bind.CallOpts) (common.Address, error)
⋮----
var out []interface{}
⋮----
// ECDSACERTIFICATEVERIFIER is a free data retrieval call binding the contract method 0x54743ad2.
⋮----
// Solidity: function ECDSA_CERTIFICATE_VERIFIER() view returns(address)
func (_ITaskMailbox *ITaskMailboxCaller) ECDSACERTIFICATEVERIFIER(opts *bind.CallOpts) (common.Address, error)
⋮----
// MAXTASKSLA is a free data retrieval call binding the contract method 0xd3e043aa.
⋮----
// Solidity: function MAX_TASK_SLA() view returns(uint96)
func (_ITaskMailbox *ITaskMailboxCaller) MAXTASKSLA(opts *bind.CallOpts) (*big.Int, error)
⋮----
// FeeSplit is a free data retrieval call binding the contract method 0x6373ea69.
⋮----
// Solidity: function feeSplit() view returns(uint16)
func (_ITaskMailbox *ITaskMailboxCaller) FeeSplit(opts *bind.CallOpts) (uint16, error)
⋮----
// FeeSplitCollector is a free data retrieval call binding the contract method 0x1a20c505.
⋮----
// Solidity: function feeSplitCollector() view returns(address)
func (_ITaskMailbox *ITaskMailboxCaller) FeeSplitCollector(opts *bind.CallOpts) (common.Address, error)
⋮----
// GetBN254CertificateBytes is a free data retrieval call binding the contract method 0x1ae370eb.
⋮----
// Solidity: function getBN254CertificateBytes((uint32,bytes32,(uint256,uint256),(uint256[2],uint256[2]),(uint32,bytes,((uint256,uint256),uint256[]))[]) cert) pure returns(bytes)
func (_ITaskMailbox *ITaskMailboxCaller) GetBN254CertificateBytes(opts *bind.CallOpts, cert IBN254CertificateVerifierTypesBN254Certificate) ([]byte, error)
⋮----
// GetECDSACertificateBytes is a free data retrieval call binding the contract method 0x1270a892.
⋮----
// Solidity: function getECDSACertificateBytes((uint32,bytes32,bytes) cert) pure returns(bytes)
func (_ITaskMailbox *ITaskMailboxCaller) GetECDSACertificateBytes(opts *bind.CallOpts, cert IECDSACertificateVerifierTypesECDSACertificate) ([]byte, error)
⋮----
// GetExecutorOperatorSetTaskConfig is a free data retrieval call binding the contract method 0x6bf6fad5.
⋮----
// Solidity: function getExecutorOperatorSetTaskConfig((address,uint32) operatorSet) view returns((address,uint96,address,uint8,address,(uint8,bytes),bytes))
func (_ITaskMailbox *ITaskMailboxCaller) GetExecutorOperatorSetTaskConfig(opts *bind.CallOpts, operatorSet OperatorSet) (ITaskMailboxTypesExecutorOperatorSetTaskConfig, error)
⋮----
// GetMessageHash is a free data retrieval call binding the contract method 0x37eaa104.
⋮----
// Solidity: function getMessageHash(bytes32 taskHash, bytes result) pure returns(bytes32)
func (_ITaskMailbox *ITaskMailboxCaller) GetMessageHash(opts *bind.CallOpts, taskHash [32]byte, result []byte) ([32]byte, error)
⋮----
// GetTaskInfo is a free data retrieval call binding the contract method 0x4ad52e02.
⋮----
// Solidity: function getTaskInfo(bytes32 taskHash) view returns((address,uint96,address,uint96,address,uint32,uint16,uint8,bool,uint32,(address,uint96,address,uint8,address,(uint8,bytes),bytes),bytes,bytes,bytes))
func (_ITaskMailbox *ITaskMailboxCaller) GetTaskInfo(opts *bind.CallOpts, taskHash [32]byte) (ITaskMailboxTypesTask, error)
⋮----
// GetTaskResult is a free data retrieval call binding the contract method 0x62fee037.
⋮----
// Solidity: function getTaskResult(bytes32 taskHash) view returns(bytes)
func (_ITaskMailbox *ITaskMailboxCaller) GetTaskResult(opts *bind.CallOpts, taskHash [32]byte) ([]byte, error)
⋮----
// GetTaskStatus is a free data retrieval call binding the contract method 0x2bf6cc79.
⋮----
// Solidity: function getTaskStatus(bytes32 taskHash) view returns(uint8)
func (_ITaskMailbox *ITaskMailboxCaller) GetTaskStatus(opts *bind.CallOpts, taskHash [32]byte) (uint8, error)
⋮----
// IsExecutorOperatorSetRegistered is a free data retrieval call binding the contract method 0xfa2c0b37.
⋮----
// Solidity: function isExecutorOperatorSetRegistered(bytes32 operatorSetKey) view returns(bool)
func (_ITaskMailbox *ITaskMailboxCaller) IsExecutorOperatorSetRegistered(opts *bind.CallOpts, operatorSetKey [32]byte) (bool, error)
⋮----
// CreateTask is a paid mutator transaction binding the contract method 0x1fb66f5d.
⋮----
// Solidity: function createTask((address,(address,uint32),bytes) taskParams) returns(bytes32 taskHash)
func (_ITaskMailbox *ITaskMailboxTransactor) CreateTask(opts *bind.TransactOpts, taskParams ITaskMailboxTypesTaskParams) (*types.Transaction, error)
⋮----
// Initialize is a paid mutator transaction binding the contract method 0x708c0db9.
⋮----
// Solidity: function initialize(address owner, uint16 feeSplit, address feeSplitCollector) returns()
func (_ITaskMailbox *ITaskMailboxTransactor) Initialize(opts *bind.TransactOpts, owner common.Address, feeSplit uint16, feeSplitCollector common.Address) (*types.Transaction, error)
⋮----
// RefundFee is a paid mutator transaction binding the contract method 0xb8694166.
⋮----
// Solidity: function refundFee(bytes32 taskHash) returns()
func (_ITaskMailbox *ITaskMailboxTransactor) RefundFee(opts *bind.TransactOpts, taskHash [32]byte) (*types.Transaction, error)
⋮----
// RegisterExecutorOperatorSet is a paid mutator transaction binding the contract method 0x49acd884.
⋮----
// Solidity: function registerExecutorOperatorSet((address,uint32) operatorSet, bool isRegistered) returns()
func (_ITaskMailbox *ITaskMailboxTransactor) RegisterExecutorOperatorSet(opts *bind.TransactOpts, operatorSet OperatorSet, isRegistered bool) (*types.Transaction, error)
⋮----
// SetExecutorOperatorSetTaskConfig is a paid mutator transaction binding the contract method 0xf741e81a.
⋮----
// Solidity: function setExecutorOperatorSetTaskConfig((address,uint32) operatorSet, (address,uint96,address,uint8,address,(uint8,bytes),bytes) config) returns()
func (_ITaskMailbox *ITaskMailboxTransactor) SetExecutorOperatorSetTaskConfig(opts *bind.TransactOpts, operatorSet OperatorSet, config ITaskMailboxTypesExecutorOperatorSetTaskConfig) (*types.Transaction, error)
⋮----
// SetFeeSplit is a paid mutator transaction binding the contract method 0x468c07a0.
⋮----
// Solidity: function setFeeSplit(uint16 feeSplit) returns()
func (_ITaskMailbox *ITaskMailboxTransactor) SetFeeSplit(opts *bind.TransactOpts, feeSplit uint16) (*types.Transaction, error)
⋮----
// SetFeeSplitCollector is a paid mutator transaction binding the contract method 0x678fbdb3.
⋮----
// Solidity: function setFeeSplitCollector(address feeSplitCollector) returns()
func (_ITaskMailbox *ITaskMailboxTransactor) SetFeeSplitCollector(opts *bind.TransactOpts, feeSplitCollector common.Address) (*types.Transaction, error)
⋮----
// SubmitResult is a paid mutator transaction binding the contract method 0xa5fabc81.
⋮----
// Solidity: function submitResult(bytes32 taskHash, bytes executorCert, bytes result) returns()
func (_ITaskMailbox *ITaskMailboxTransactor) SubmitResult(opts *bind.TransactOpts, taskHash [32]byte, executorCert []byte, result []byte) (*types.Transaction, error)
⋮----
// ITaskMailboxExecutorOperatorSetRegisteredIterator is returned from FilterExecutorOperatorSetRegistered and is used to iterate over the raw logs and unpacked data for ExecutorOperatorSetRegistered events raised by the ITaskMailbox contract.
type ITaskMailboxExecutorOperatorSetRegisteredIterator struct {
	Event *ITaskMailboxExecutorOperatorSetRegistered // 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
}
⋮----
Event *ITaskMailboxExecutorOperatorSetRegistered // 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 *ITaskMailboxExecutorOperatorSetRegisteredIterator) Next() bool
⋮----
// If the iterator failed, stop iterating
⋮----
// If the iterator completed, deliver directly whatever's available
⋮----
// Iterator still in progress, wait for either a data or an error event
⋮----
// Error returns any retrieval or parsing error occurred during filtering.
func (it *ITaskMailboxExecutorOperatorSetRegisteredIterator) Error() error
⋮----
// Close terminates the iteration process, releasing any pending underlying
// resources.
func (it *ITaskMailboxExecutorOperatorSetRegisteredIterator) Close() error
⋮----
// ITaskMailboxExecutorOperatorSetRegistered represents a ExecutorOperatorSetRegistered event raised by the ITaskMailbox contract.
type ITaskMailboxExecutorOperatorSetRegistered struct {
	Caller                common.Address
	Avs                   common.Address
	ExecutorOperatorSetId uint32
	IsRegistered          bool
	Raw                   types.Log // Blockchain specific contextual infos
}
⋮----
Raw                   types.Log // Blockchain specific contextual infos
⋮----
// FilterExecutorOperatorSetRegistered is a free log retrieval operation binding the contract event 0x48b63f21a1eb9dd6880e196de6d7db3fbd0c282b74f1298dcb4cf53472298f39.
⋮----
// Solidity: event ExecutorOperatorSetRegistered(address indexed caller, address indexed avs, uint32 indexed executorOperatorSetId, bool isRegistered)
func (_ITaskMailbox *ITaskMailboxFilterer) FilterExecutorOperatorSetRegistered(opts *bind.FilterOpts, caller []common.Address, avs []common.Address, executorOperatorSetId []uint32) (*ITaskMailboxExecutorOperatorSetRegisteredIterator, error)
⋮----
var callerRule []interface{}
⋮----
var avsRule []interface{}
⋮----
var executorOperatorSetIdRule []interface{}
⋮----
// WatchExecutorOperatorSetRegistered is a free log subscription operation binding the contract event 0x48b63f21a1eb9dd6880e196de6d7db3fbd0c282b74f1298dcb4cf53472298f39.
⋮----
func (_ITaskMailbox *ITaskMailboxFilterer) WatchExecutorOperatorSetRegistered(opts *bind.WatchOpts, sink chan<- *ITaskMailboxExecutorOperatorSetRegistered, caller []common.Address, avs []common.Address, executorOperatorSetId []uint32) (event.Subscription, error)
⋮----
// New log arrived, parse the event and forward to the user
⋮----
// ParseExecutorOperatorSetRegistered is a log parse operation binding the contract event 0x48b63f21a1eb9dd6880e196de6d7db3fbd0c282b74f1298dcb4cf53472298f39.
⋮----
func (_ITaskMailbox *ITaskMailboxFilterer) ParseExecutorOperatorSetRegistered(log types.Log) (*ITaskMailboxExecutorOperatorSetRegistered, error)
⋮----
// ITaskMailboxExecutorOperatorSetTaskConfigSetIterator is returned from FilterExecutorOperatorSetTaskConfigSet and is used to iterate over the raw logs and unpacked data for ExecutorOperatorSetTaskConfigSet events raised by the ITaskMailbox contract.
type ITaskMailboxExecutorOperatorSetTaskConfigSetIterator struct {
	Event *ITaskMailboxExecutorOperatorSetTaskConfigSet // 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
}
⋮----
Event *ITaskMailboxExecutorOperatorSetTaskConfigSet // Event containing the contract specifics and raw log
⋮----
// ITaskMailboxExecutorOperatorSetTaskConfigSet represents a ExecutorOperatorSetTaskConfigSet event raised by the ITaskMailbox contract.
type ITaskMailboxExecutorOperatorSetTaskConfigSet struct {
	Caller                common.Address
	Avs                   common.Address
	ExecutorOperatorSetId uint32
	Config                ITaskMailboxTypesExecutorOperatorSetTaskConfig
	Raw                   types.Log // Blockchain specific contextual infos
}
⋮----
// FilterExecutorOperatorSetTaskConfigSet is a free log retrieval operation binding the contract event 0x7cd76abd4025a20959a1b20f7c1536e3894a0735cd8de0215dde803ddea7f2d2.
⋮----
// Solidity: event ExecutorOperatorSetTaskConfigSet(address indexed caller, address indexed avs, uint32 indexed executorOperatorSetId, (address,uint96,address,uint8,address,(uint8,bytes),bytes) config)
func (_ITaskMailbox *ITaskMailboxFilterer) FilterExecutorOperatorSetTaskConfigSet(opts *bind.FilterOpts, caller []common.Address, avs []common.Address, executorOperatorSetId []uint32) (*ITaskMailboxExecutorOperatorSetTaskConfigSetIterator, error)
⋮----
// WatchExecutorOperatorSetTaskConfigSet is a free log subscription operation binding the contract event 0x7cd76abd4025a20959a1b20f7c1536e3894a0735cd8de0215dde803ddea7f2d2.
⋮----
func (_ITaskMailbox *ITaskMailboxFilterer) WatchExecutorOperatorSetTaskConfigSet(opts *bind.WatchOpts, sink chan<- *ITaskMailboxExecutorOperatorSetTaskConfigSet, caller []common.Address, avs []common.Address, executorOperatorSetId []uint32) (event.Subscription, error)
⋮----
// ParseExecutorOperatorSetTaskConfigSet is a log parse operation binding the contract event 0x7cd76abd4025a20959a1b20f7c1536e3894a0735cd8de0215dde803ddea7f2d2.
⋮----
func (_ITaskMailbox *ITaskMailboxFilterer) ParseExecutorOperatorSetTaskConfigSet(log types.Log) (*ITaskMailboxExecutorOperatorSetTaskConfigSet, error)
⋮----
// ITaskMailboxFeeRefundedIterator is returned from FilterFeeRefunded and is used to iterate over the raw logs and unpacked data for FeeRefunded events raised by the ITaskMailbox contract.
type ITaskMailboxFeeRefundedIterator struct {
	Event *ITaskMailboxFeeRefunded // 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
}
⋮----
Event *ITaskMailboxFeeRefunded // Event containing the contract specifics and raw log
⋮----
// ITaskMailboxFeeRefunded represents a FeeRefunded event raised by the ITaskMailbox contract.
type ITaskMailboxFeeRefunded struct {
	RefundCollector common.Address
	TaskHash        [32]byte
	AvsFee          *big.Int
	Raw             types.Log // Blockchain specific contextual infos
}
⋮----
Raw             types.Log // Blockchain specific contextual infos
⋮----
// FilterFeeRefunded is a free log retrieval operation binding the contract event 0xe3ed40d31808582f7a92a30beacc0ec788d5091407ec6c10c1b999b3f317aea3.
⋮----
// Solidity: event FeeRefunded(address indexed refundCollector, bytes32 indexed taskHash, uint96 avsFee)
func (_ITaskMailbox *ITaskMailboxFilterer) FilterFeeRefunded(opts *bind.FilterOpts, refundCollector []common.Address, taskHash [][32]byte) (*ITaskMailboxFeeRefundedIterator, error)
⋮----
var refundCollectorRule []interface{}
⋮----
var taskHashRule []interface{}
⋮----
// WatchFeeRefunded is a free log subscription operation binding the contract event 0xe3ed40d31808582f7a92a30beacc0ec788d5091407ec6c10c1b999b3f317aea3.
⋮----
func (_ITaskMailbox *ITaskMailboxFilterer) WatchFeeRefunded(opts *bind.WatchOpts, sink chan<- *ITaskMailboxFeeRefunded, refundCollector []common.Address, taskHash [][32]byte) (event.Subscription, error)
⋮----
// ParseFeeRefunded is a log parse operation binding the contract event 0xe3ed40d31808582f7a92a30beacc0ec788d5091407ec6c10c1b999b3f317aea3.
⋮----
func (_ITaskMailbox *ITaskMailboxFilterer) ParseFeeRefunded(log types.Log) (*ITaskMailboxFeeRefunded, error)
⋮----
// ITaskMailboxFeeSplitCollectorSetIterator is returned from FilterFeeSplitCollectorSet and is used to iterate over the raw logs and unpacked data for FeeSplitCollectorSet events raised by the ITaskMailbox contract.
type ITaskMailboxFeeSplitCollectorSetIterator struct {
	Event *ITaskMailboxFeeSplitCollectorSet // 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
}
⋮----
Event *ITaskMailboxFeeSplitCollectorSet // Event containing the contract specifics and raw log
⋮----
// ITaskMailboxFeeSplitCollectorSet represents a FeeSplitCollectorSet event raised by the ITaskMailbox contract.
type ITaskMailboxFeeSplitCollectorSet struct {
	FeeSplitCollector common.Address
	Raw               types.Log // Blockchain specific contextual infos
}
⋮----
Raw               types.Log // Blockchain specific contextual infos
⋮----
// FilterFeeSplitCollectorSet is a free log retrieval operation binding the contract event 0x262aa27c244f6f0088cb3092548a0adcaddedf459070a9ccab2dc6a07abe701d.
⋮----
// Solidity: event FeeSplitCollectorSet(address indexed feeSplitCollector)
func (_ITaskMailbox *ITaskMailboxFilterer) FilterFeeSplitCollectorSet(opts *bind.FilterOpts, feeSplitCollector []common.Address) (*ITaskMailboxFeeSplitCollectorSetIterator, error)
⋮----
var feeSplitCollectorRule []interface{}
⋮----
// WatchFeeSplitCollectorSet is a free log subscription operation binding the contract event 0x262aa27c244f6f0088cb3092548a0adcaddedf459070a9ccab2dc6a07abe701d.
⋮----
func (_ITaskMailbox *ITaskMailboxFilterer) WatchFeeSplitCollectorSet(opts *bind.WatchOpts, sink chan<- *ITaskMailboxFeeSplitCollectorSet, feeSplitCollector []common.Address) (event.Subscription, error)
⋮----
// ParseFeeSplitCollectorSet is a log parse operation binding the contract event 0x262aa27c244f6f0088cb3092548a0adcaddedf459070a9ccab2dc6a07abe701d.
⋮----
func (_ITaskMailbox *ITaskMailboxFilterer) ParseFeeSplitCollectorSet(log types.Log) (*ITaskMailboxFeeSplitCollectorSet, error)
⋮----
// ITaskMailboxFeeSplitSetIterator is returned from FilterFeeSplitSet and is used to iterate over the raw logs and unpacked data for FeeSplitSet events raised by the ITaskMailbox contract.
type ITaskMailboxFeeSplitSetIterator struct {
	Event *ITaskMailboxFeeSplitSet // 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
}
⋮----
Event *ITaskMailboxFeeSplitSet // Event containing the contract specifics and raw log
⋮----
// ITaskMailboxFeeSplitSet represents a FeeSplitSet event raised by the ITaskMailbox contract.
type ITaskMailboxFeeSplitSet struct {
	FeeSplit uint16
	Raw      types.Log // Blockchain specific contextual infos
}
⋮----
Raw      types.Log // Blockchain specific contextual infos
⋮----
// FilterFeeSplitSet is a free log retrieval operation binding the contract event 0x886b2cfcb151fd8b19ed902cc88f4a06dd9fe351a4a9ab93f33fe84abc157edf.
⋮----
// Solidity: event FeeSplitSet(uint16 feeSplit)
func (_ITaskMailbox *ITaskMailboxFilterer) FilterFeeSplitSet(opts *bind.FilterOpts) (*ITaskMailboxFeeSplitSetIterator, error)
⋮----
// WatchFeeSplitSet is a free log subscription operation binding the contract event 0x886b2cfcb151fd8b19ed902cc88f4a06dd9fe351a4a9ab93f33fe84abc157edf.
⋮----
func (_ITaskMailbox *ITaskMailboxFilterer) WatchFeeSplitSet(opts *bind.WatchOpts, sink chan<- *ITaskMailboxFeeSplitSet) (event.Subscription, error)
⋮----
// ParseFeeSplitSet is a log parse operation binding the contract event 0x886b2cfcb151fd8b19ed902cc88f4a06dd9fe351a4a9ab93f33fe84abc157edf.
⋮----
func (_ITaskMailbox *ITaskMailboxFilterer) ParseFeeSplitSet(log types.Log) (*ITaskMailboxFeeSplitSet, error)
⋮----
// ITaskMailboxTaskCreatedIterator is returned from FilterTaskCreated and is used to iterate over the raw logs and unpacked data for TaskCreated events raised by the ITaskMailbox contract.
type ITaskMailboxTaskCreatedIterator struct {
	Event *ITaskMailboxTaskCreated // 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
}
⋮----
Event *ITaskMailboxTaskCreated // Event containing the contract specifics and raw log
⋮----
// ITaskMailboxTaskCreated represents a TaskCreated event raised by the ITaskMailbox contract.
type ITaskMailboxTaskCreated struct {
	Creator                         common.Address
	TaskHash                        [32]byte
	Avs                             common.Address
	ExecutorOperatorSetId           uint32
	OperatorTableReferenceTimestamp uint32
	RefundCollector                 common.Address
	AvsFee                          *big.Int
	TaskDeadline                    *big.Int
	Payload                         []byte
	Raw                             types.Log // Blockchain specific contextual infos
}
⋮----
Raw                             types.Log // Blockchain specific contextual infos
⋮----
// FilterTaskCreated is a free log retrieval operation binding the contract event 0x33add0b01e02278be5459fbfa3274aee699ec47f4ee7236b59e7a2c8b5000c26.
⋮----
// Solidity: event TaskCreated(address indexed creator, bytes32 indexed taskHash, address indexed avs, uint32 executorOperatorSetId, uint32 operatorTableReferenceTimestamp, address refundCollector, uint96 avsFee, uint256 taskDeadline, bytes payload)
func (_ITaskMailbox *ITaskMailboxFilterer) FilterTaskCreated(opts *bind.FilterOpts, creator []common.Address, taskHash [][32]byte, avs []common.Address) (*ITaskMailboxTaskCreatedIterator, error)
⋮----
var creatorRule []interface{}
⋮----
// WatchTaskCreated is a free log subscription operation binding the contract event 0x33add0b01e02278be5459fbfa3274aee699ec47f4ee7236b59e7a2c8b5000c26.
⋮----
func (_ITaskMailbox *ITaskMailboxFilterer) WatchTaskCreated(opts *bind.WatchOpts, sink chan<- *ITaskMailboxTaskCreated, creator []common.Address, taskHash [][32]byte, avs []common.Address) (event.Subscription, error)
⋮----
// ParseTaskCreated is a log parse operation binding the contract event 0x33add0b01e02278be5459fbfa3274aee699ec47f4ee7236b59e7a2c8b5000c26.
⋮----
func (_ITaskMailbox *ITaskMailboxFilterer) ParseTaskCreated(log types.Log) (*ITaskMailboxTaskCreated, error)
⋮----
// ITaskMailboxTaskVerifiedIterator is returned from FilterTaskVerified and is used to iterate over the raw logs and unpacked data for TaskVerified events raised by the ITaskMailbox contract.
type ITaskMailboxTaskVerifiedIterator struct {
	Event *ITaskMailboxTaskVerified // 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
}
⋮----
Event *ITaskMailboxTaskVerified // Event containing the contract specifics and raw log
⋮----
// ITaskMailboxTaskVerified represents a TaskVerified event raised by the ITaskMailbox contract.
type ITaskMailboxTaskVerified struct {
	Aggregator            common.Address
	TaskHash              [32]byte
	Avs                   common.Address
	ExecutorOperatorSetId uint32
	ExecutorCert          []byte
	Result                []byte
	Raw                   types.Log // Blockchain specific contextual infos
}
⋮----
// FilterTaskVerified is a free log retrieval operation binding the contract event 0x659f23b2e7edf490e5fd6561c5148691ed0375ed7ddd3ab1bcfcfdbec4f209a9.
⋮----
// Solidity: event TaskVerified(address indexed aggregator, bytes32 indexed taskHash, address indexed avs, uint32 executorOperatorSetId, bytes executorCert, bytes result)
func (_ITaskMailbox *ITaskMailboxFilterer) FilterTaskVerified(opts *bind.FilterOpts, aggregator []common.Address, taskHash [][32]byte, avs []common.Address) (*ITaskMailboxTaskVerifiedIterator, error)
⋮----
var aggregatorRule []interface{}
⋮----
// WatchTaskVerified is a free log subscription operation binding the contract event 0x659f23b2e7edf490e5fd6561c5148691ed0375ed7ddd3ab1bcfcfdbec4f209a9.
⋮----
func (_ITaskMailbox *ITaskMailboxFilterer) WatchTaskVerified(opts *bind.WatchOpts, sink chan<- *ITaskMailboxTaskVerified, aggregator []common.Address, taskHash [][32]byte, avs []common.Address) (event.Subscription, error)
⋮----
// ParseTaskVerified is a log parse operation binding the contract event 0x659f23b2e7edf490e5fd6561c5148691ed0375ed7ddd3ab1bcfcfdbec4f209a9.
⋮----
func (_ITaskMailbox *ITaskMailboxFilterer) ParseTaskVerified(log types.Log) (*ITaskMailboxTaskVerified, error)
````

## File: pkg/bindings/KeyRegistrar/binding.go
````go
// Code generated - DO NOT EDIT.
// This file is a generated binding and any manual changes will be lost.
⋮----
package KeyRegistrar
⋮----
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"
)
⋮----
"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
)
⋮----
// BN254G1Point is an auto generated low-level Go binding around an user-defined struct.
type BN254G1Point struct {
	X *big.Int
	Y *big.Int
}
⋮----
// BN254G2Point is an auto generated low-level Go binding around an user-defined struct.
type BN254G2Point struct {
	X [2]*big.Int
	Y [2]*big.Int
}
⋮----
// OperatorSet is an auto generated low-level Go binding around an user-defined struct.
type OperatorSet struct {
	Avs common.Address
	Id  uint32
}
⋮----
// 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: "0x60e060405234801561000f575f5ffd5b5060405161311838038061311883398101604081905261002e916100cb565b6001600160a01b03808316608052831660a052808061004c8161005a565b60c052506101fc9350505050565b5f5f829050601f8151111561008d578260405163305a27a960e01b815260040161008491906101a1565b60405180910390fd5b8051610098826101d6565b179392505050565b6001600160a01b03811681146100b4575f5ffd5b50565b634e487b7160e01b5f52604160045260245ffd5b5f5f5f606084860312156100dd575f5ffd5b83516100e8816100a0565b60208501519093506100f9816100a0565b60408501519092506001600160401b03811115610114575f5ffd5b8401601f81018613610124575f5ffd5b80516001600160401b0381111561013d5761013d6100b7565b604051601f8201601f19908116603f011681016001600160401b038111828210171561016b5761016b6100b7565b604052818152828201602001881015610182575f5ffd5b8160208401602083015e5f602083830101528093505050509250925092565b602081525f82518060208401528060208501604085015e5f604082850101526040601f19601f83011684010191505092915050565b805160208083015191908110156101f6575f198160200360031b1b821691505b50919050565b60805160a05160c051612edd61023b5f395f81816103fa015261161801525f818161019501526116ea01525f818161033b01526106000152612edd5ff3fe608060405234801561000f575f5ffd5b5060043610610127575f3560e01c8063aa165c30116100a9578063d9f12db21161006e578063d9f12db214610370578063dab42d7e14610383578063ea0d8149146103a5578063ea194e2e146103b8578063f698da25146103cb575f5ffd5b8063aa165c30146102d9578063b05c8f6d146102ec578063bd30a0b914610313578063ca8aa7c714610336578063d40cda161461035d575f5ffd5b80637690e395116100ef5780637690e3951461023e5780637cffe48c146102515780638256909c1461027157806387ab86f4146102a35780639a43e3fb146102b8575f5ffd5b8063166aa1271461012b5780633b32a7bd146101655780634657e26a1461019057806350435add146101b757806354fd4d5014610236575b5f5ffd5b6101527f991b0a3376ce87f8ecc5d70962279ac09cdce934e8b5b9683e73c8ff087c7f8181565b6040519081526020015b60405180910390f35b61017861017336600461256a565b6103d3565b6040516001600160a01b03909116815260200161015c565b6101787f000000000000000000000000000000000000000000000000000000000000000081565b6102296101c53660046125eb565b8151602080840151835180519083015185840151805190850151604080519687019790975295850193909352606084810192909252608084015260a083019190915260c082019290925260e001604051602081830303815290604052905092915050565b60405161015c9190612696565b6102296103f3565b61015261024c3660046126e6565b610423565b61026461025f366004612744565b6104cb565b60405161015c9190612792565b61028461027f3660046127a0565b6104f1565b604080516001600160a01b03909316835290151560208301520161015c565b6102b66102b1366004612846565b6105df565b005b6102cb6102c636600461256a565b6108d3565b60405161015c929190612891565b6102296102e736600461256a565b610abb565b6101527fda86e76deaed01641f80ff5f72c372a038fa5182697aeb967e8b1f9819d58d8181565b61032661032136600461256a565b610bf8565b604051901515815260200161015c565b6101787f000000000000000000000000000000000000000000000000000000000000000081565b6102b661036b3660046128ce565b610c35565b61015261037e36600461295f565b610d89565b6103266103913660046129a0565b5f9081526002602052604090205460ff1690565b6102b66103b33660046129b7565b610e22565b6101526103c636600461256a565b610f48565b610152611070565b5f6103de8383610abb565b6103e7906129f0565b60601c90505b92915050565b606061041e7f0000000000000000000000000000000000000000000000000000000000000000611129565b905090565b5f5f7fda86e76deaed01641f80ff5f72c372a038fa5182697aeb967e8b1f9819d58d8186865f015187602001518787604051610460929190612a48565b6040805191829003822060208301969096526001600160a01b039485169082015292909116606083015263ffffffff16608082015260a081019190915260c0016040516020818303038152906040528051906020012090506104c181611166565b9695505050505050565b5f60015f6104d8846111ac565b815260208101919091526040015f205460ff1692915050565b5f5f5f60015f610500876111ac565b815260208101919091526040015f9081205460ff169150600182600281111561052b5761052b61275e565b0361053d5750835160208501206105ae565b60028260028111156105515761055161275e565b03610595575f5f8680602001905181019061056c9190612a57565b60408051808201825283815260209081019283525f9384529151909152902092506105ae915050565b60405163fdea7c0960e01b815260040160405180910390fd5b5f818152600360205260409020546001600160a01b0316806105d08882610bf8565b945094505050505b9250929050565b816105e98161120a565b6040516309a961f360e11b81526001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001690631352c3e6906106379086908690600401612a79565b602060405180830381865afa158015610652573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906106769190612aaf565b15828490916106c357604051631070287960e01b815282516001600160a01b03908116600483015260209093015163ffffffff166024820152911660448201526064015b60405180910390fd5b50505f60015f6106d2856111ac565b815260208101919091526040015f9081205460ff1691508160028111156106fb576106fb61275e565b0361071957604051635cd3106d60e11b815260040160405180910390fd5b5f5f5f610725866111ac565b815260208082019290925260409081015f9081206001600160a01b038916825283528190208151808301909252805460ff1615158252600181018054929391929184019161077290612ace565b80601f016020809104026020016040519081016040528092919081815260200182805461079e90612ace565b80156107e95780601f106107c0576101008083540402835291602001916107e9565b820191905f5260205f20905b8154815290600101906020018083116107cc57829003601f168201915b5050505050815250509050805f01518486909161083f57604051632e40e18760e01b815282516001600160a01b03908116600483015260209093015163ffffffff166024820152911660448201526064016106ba565b50505f5f61084c866111ac565b815260208082019290925260409081015f9081206001600160a01b03891682529092528120805460ff19168155906108876001830182612372565b5050846001600160a01b03167f28d3c3cee49478ec6fd219cfd685cd15cd01d95cabf69b4b7b57f9eaa3eb644285846040516108c4929190612b06565b60405180910390a25050505050565b604080518082019091525f80825260208201526108ee6123a9565b5f60015f6108fb876111ac565b815260208101919091526040015f205460ff16905060028160028111156109245761092461275e565b146109425760405163fdea7c0960e01b815260040160405180910390fd5b5f5f5f61094e886111ac565b815260208082019290925260409081015f9081206001600160a01b038916825283528190208151808301909252805460ff1615158252600181018054929391929184019161099b90612ace565b80601f01602080910402602001604051908101604052809291908181526020018280546109c790612ace565b8015610a125780601f106109e957610100808354040283529160200191610a12565b820191905f5260205f20905b8154815290600101906020018083116109f557829003601f168201915b5050505050815250509050805f0151610a675750506040805180820182525f808252602080830182905283518085018552828152808201929092528351808501909452828452830191909152925090506105d8565b5f5f5f5f8460200151806020019051810190610a839190612b78565b604080518082018252948552602080860194909452805180820190915291825291810191909152909b909a5098505050505050505050565b60605f60015f610aca866111ac565b815260208101919091526040015f205460ff1690506001816002811115610af357610af361275e565b14610b115760405163fdea7c0960e01b815260040160405180910390fd5b5f5f5f610b1d876111ac565b815260208082019290925260409081015f9081206001600160a01b038816825283528190208151808301909252805460ff16151582526001810180549293919291840191610b6a90612ace565b80601f0160208091040260200160405190810160405280929190818152602001828054610b9690612ace565b8015610be15780601f10610bb857610100808354040283529160200191610be1565b820191905f5260205f20905b815481529060010190602001808311610bc457829003601f168201915b505050919092525050506020015195945050505050565b5f5f5f610c04856111ac565b815260208082019290925260409081015f9081206001600160a01b038616825290925290205460ff16905092915050565b85610c3f8161120a565b5f60015f610c4c896111ac565b815260208101919091526040015f9081205460ff169150816002811115610c7557610c7561275e565b03610c9357604051635cd3106d60e11b815260040160405180910390fd5b5f5f610c9e896111ac565b815260208082019290925260409081015f9081206001600160a01b038c16825290925290205460ff1615610ce5576040516342ee68b560e01b815260040160405180910390fd5b6001816002811115610cf957610cf961275e565b03610d1157610d0c878988888888611233565b610d38565b6002816002811115610d2557610d2561275e565b0361059557610d0c878988888888611394565b876001600160a01b03167f1201ce0c5e577111bce91e907fd99cb183da5edc1e3fb650ca40769e4e9176dd88838989604051610d779493929190612bbe565b60405180910390a25050505050505050565b81516020808401516040515f938493610df6937f991b0a3376ce87f8ecc5d70962279ac09cdce934e8b5b9683e73c8ff087c7f81938a93928991019485526001600160a01b039384166020860152918316604085015263ffffffff16606084015216608082015260a00190565b604051602081830303815290604052805190602001209050610e1781611166565b9150505b9392505050565b8151610e2d8161120a565b6001826002811115610e4157610e4161275e565b1480610e5e57506002826002811115610e5c57610e5c61275e565b145b610e7b5760405163fdea7c0960e01b815260040160405180910390fd5b5f60015f610e88866111ac565b815260208101919091526040015f9081205460ff169150816002811115610eb157610eb161275e565b14610ece576040516281f09f60e01b815260040160405180910390fd5b8260015f610edb876111ac565b815260208101919091526040015f20805460ff19166001836002811115610f0457610f0461275e565b02179055507fb2266cb118e57095fcdbedb24dabd9fc9f5127e2dbedf62ce6ee71696fb8b6e78484604051610f3a929190612b06565b60405180910390a150505050565b5f5f5f5f610f55866111ac565b815260208082019290925260409081015f9081206001600160a01b038716825283528190208151808301909252805460ff16151582526001810180549293919291840191610fa290612ace565b80601f0160208091040260200160405190810160405280929190818152602001828054610fce90612ace565b80156110195780601f10610ff057610100808354040283529160200191611019565b820191905f5260205f20905b815481529060010190602001808311610ffc57829003601f168201915b50505050508152505090505f60015f611031876111ac565b815260208101919091526040015f2054825160ff909116915061105957505f91506103ed9050565b61106782602001518261158f565b95945050505050565b60408051808201909152600a81526922b4b3b2b72630bcb2b960b11b6020909101525f7f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f7f71b625cfad44bac63b13dba07f2e1d6084ee04b6f8752101ece6126d584ee6ea6110dd611610565b805160209182012060408051928301949094529281019190915260608101919091524660808201523060a082015260c00160405160208183030381529060405280519060200120905090565b60605f61113583611685565b6040805160208082528183019092529192505f91906020820181803683375050509182525060208101929092525090565b5f61116f611070565b60405161190160f01b6020820152602281019190915260428101839052606201604051602081830303815290604052805190602001209050919050565b5f815f0151826020015163ffffffff166040516020016111f292919060609290921b6001600160601b031916825260a01b6001600160a01b031916601482015260200190565b6040516020818303038152906040526103ed90612c1b565b611213816116ac565b6112305760405163932d94f760e01b815260040160405180910390fd5b50565b601483146112545760405163d109118160e01b815260040160405180910390fd5b5f61125f8486612c3e565b60601c90508061128257604051634935505f60e01b815260040160405180910390fd5b5f6112c486868080601f0160208091040260200160405190810160405280939291908181526020018383808284375f920191909152506001925061158f915050565b5f8181526002602052604090205490915060ff16156112f657604051630c7bc20160e11b815260040160405180910390fd5b5f611302888a85610d89565b9050611347838287878080601f0160208091040260200160405190810160405280939291908181526020018383808284375f920191909152505f199250611755915050565b611389898989898080601f0160208091040260200160405190810160405280939291908181526020018383808284375f920191909152508892506117ad915050565b505050505050505050565b60c083146113b55760405163d109118160e01b815260040160405180910390fd5b604081146113d657604051638baa579f60e01b815260040160405180910390fd5b604080518082019091525f80825260208201526113f16123a9565b5f808080611401898b018b612c7c565b93509350935093506040518060400160405280858152602001848152509550835f14801561142d575082155b1561144b57604051634935505f60e01b815260040160405180910390fd5b60408051808201909152918252602082015292505f91506114709050888a8989610423565b90505f8061148086880188612cb6565b604080518082019091528281526020810182905291935091505f6114a885838989858061185a565b915050806114c957604051638baa579f60e01b815260040160405180910390fd5b5f61150b8c8c8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f920191909152506002925061158f915050565b5f8181526002602052604090205490915060ff161561153d57604051630c7bc20160e11b815260040160405180910390fd5b61157f8e8e8e8e8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f920191909152508792506117ad915050565b5050505050505050505050505050565b5f60018260028111156115a4576115a461275e565b036115b65750815160208301206103ed565b60028260028111156115ca576115ca61275e565b03610595575f5f848060200190518101906115e59190612b78565b505060408051808201825283815260209081019283525f9384529151909152902092506103ed915050565b60605f61163c7f0000000000000000000000000000000000000000000000000000000000000000611129565b9050805f8151811061165057611650612a34565b016020908101516040516001600160f81b03199091169181019190915260210160405160208183030381529060405291505090565b5f60ff8216601f8111156103ed57604051632cd44ac360e21b815260040160405180910390fd5b604051631beb2b9760e31b81526001600160a01b0382811660048301523360248301523060448301525f80356001600160e01b0319166064840152917f00000000000000000000000000000000000000000000000000000000000000009091169063df595cb890608401602060405180830381865afa158015611731573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906103ed9190612aaf565b4281101561177657604051630819bdcd60e01b815260040160405180910390fd5b61178a6001600160a01b0385168484611922565b6117a757604051638baa579f60e01b815260040160405180910390fd5b50505050565b6040805180820190915260018152602081018390525f806117cd876111ac565b815260208082019290925260409081015f9081206001600160a01b03881682528352208251815460ff19169015151781559082015160018201906118119082612d22565b5050505f908152600260209081526040808320805460ff191660011790556003909152902080546001600160a01b039093166001600160a01b0319909316929092179091555050565b5f5f5f61186689611976565b90505f6118758a89898c611a00565b90505f61188c6118858a84611aab565b8b90611b1b565b90505f6118ce6118c7846118c16040805180820182525f80825260209182015281518083019092526001825260029082015290565b90611aab565b8590611b1b565b905087156118f3576118ea826118e2611b8f565b838c8b611c4f565b96509450611913565b611906826118ff611b8f565b838c611e63565b9550851561191357600194505b50505050965096945050505050565b5f5f5f61192f858561209a565b90925090505f8160048111156119475761194761275e565b1480156119655750856001600160a01b0316826001600160a01b0316145b806104c157506104c18686866120d9565b604080518082019091525f80825260208201525f80806119a35f516020612e885f395f51905f5286612ddd565b90505b6119af816121c0565b90935091505f516020612e885f395f51905f5282830983036119e7576040805180820190915290815260208101919091529392505050565b5f516020612e885f395f51905f526001820890506119a6565b8251602080850151845180519083015186840151805190850151875188870151604080519889018e90528801989098526060870195909552608086019390935260a085019190915260c084015260e08301526101008201526101208101919091525f907f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000019061014001604051602081830303815290604052805190602001205f1c6110679190612ddd565b604080518082019091525f8082526020820152611ac66123ce565b835181526020808501519082015260408082018490525f908360608460076107d05a03fa90508080611af457fe5b5080611b1357604051632319df1960e11b815260040160405180910390fd5b505092915050565b604080518082019091525f8082526020820152611b366123ec565b835181526020808501518183015283516040808401919091529084015160608301525f908360808460066107d05a03fa90508080611b7057fe5b5080611b135760405163d4b68fd760e01b815260040160405180910390fd5b611b976123a9565b50604080516080810182527f198e9393920d483a7260bfb731fb5d25f1aa493335a9e71297e485b7aef312c28183019081527f1800deef121f1e76426a00665e5c4479674322d4f75edadd46debd5cd992f6ed6060830152815281518083019092527f275dc4a288d1afb3cbb1ac09187524c7db36395df7be3b99e673b13a075a65ec82527f1d9befcd05a5323e6da4d435f3b617cdb3af83285c2df711ef39c01571827f9d60208381019190915281019190915290565b6040805180820182528681526020808201869052825180840190935286835282018490525f91829190611c8061240a565b5f5b6002811015611e37575f611c97826006612e10565b9050848260028110611cab57611cab612a34565b60200201515183611cbc835f612e27565b600c8110611ccc57611ccc612a34565b6020020152848260028110611ce357611ce3612a34565b60200201516020015183826001611cfa9190612e27565b600c8110611d0a57611d0a612a34565b6020020152838260028110611d2157611d21612a34565b6020020151515183611d34836002612e27565b600c8110611d4457611d44612a34565b6020020152838260028110611d5b57611d5b612a34565b6020020151516001602002015183611d74836003612e27565b600c8110611d8457611d84612a34565b6020020152838260028110611d9b57611d9b612a34565b6020020151602001515f60028110611db557611db5612a34565b602002015183611dc6836004612e27565b600c8110611dd657611dd6612a34565b6020020152838260028110611ded57611ded612a34565b602002015160200151600160028110611e0857611e08612a34565b602002015183611e19836005612e27565b600c8110611e2957611e29612a34565b602002015250600101611c82565b50611e40612429565b5f6020826101808560088cfa9151919c9115159b50909950505050505050505050565b6040805180820182528581526020808201859052825180840190935285835282018390525f91611e9161240a565b5f5b6002811015612048575f611ea8826006612e10565b9050848260028110611ebc57611ebc612a34565b60200201515183611ecd835f612e27565b600c8110611edd57611edd612a34565b6020020152848260028110611ef457611ef4612a34565b60200201516020015183826001611f0b9190612e27565b600c8110611f1b57611f1b612a34565b6020020152838260028110611f3257611f32612a34565b6020020151515183611f45836002612e27565b600c8110611f5557611f55612a34565b6020020152838260028110611f6c57611f6c612a34565b6020020151516001602002015183611f85836003612e27565b600c8110611f9557611f95612a34565b6020020152838260028110611fac57611fac612a34565b6020020151602001515f60028110611fc657611fc6612a34565b602002015183611fd7836004612e27565b600c8110611fe757611fe7612a34565b6020020152838260028110611ffe57611ffe612a34565b60200201516020015160016002811061201957612019612a34565b60200201518361202a836005612e27565b600c811061203a5761203a612a34565b602002015250600101611e93565b50612051612429565b5f6020826101808560086107d05a03fa9050808061206b57fe5b508061208a576040516324ccc79360e21b815260040160405180910390fd5b5051151598975050505050505050565b5f5f82516041036120ce576020830151604084015160608501515f1a6120c28782858561223c565b945094505050506105d8565b505f905060026105d8565b5f5f5f856001600160a01b0316631626ba7e60e01b8686604051602401612101929190612e3a565b60408051601f198184030181529181526020820180516001600160e01b03166001600160e01b031990941693909317909252905161213f9190612e5a565b5f60405180830381855afa9150503d805f8114612177576040519150601f19603f3d011682016040523d82523d5f602084013e61217c565b606091505b509150915081801561219057506020815110155b80156104c157508051630b135d3f60e11b906121b59083016020908101908401612e70565b149695505050505050565b5f80805f516020612e885f395f51905f5260035f516020612e885f395f51905f52865f516020612e885f395f51905f52888909090890505f612230827f0c19139cb84c680a6e14116da060561765e05aa45a1c72a34f082305b61f3f525f516020612e885f395f51905f526122f9565b91959194509092505050565b5f807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a083111561227157505f905060036122f0565b604080515f8082526020820180845289905260ff881692820192909252606081018690526080810185905260019060a0016020604051602081039080840390855afa1580156122c2573d5f5f3e3d5ffd5b5050604051601f1901519150506001600160a01b0381166122ea575f600192509250506122f0565b91505f90505b94509492505050565b5f5f612303612429565b61230b612447565b602080825281810181905260408201819052606082018890526080820187905260a082018690528260c08360056107d05a03fa9250828061234857fe5b50826123675760405163d51edae360e01b815260040160405180910390fd5b505195945050505050565b50805461237e90612ace565b5f825580601f1061238d575050565b601f0160209004905f5260205f20908101906112309190612465565b60405180604001604052806123bc61247d565b81526020016123c961247d565b905290565b60405180606001604052806003906020820280368337509192915050565b60405180608001604052806004906020820280368337509192915050565b604051806101800160405280600c906020820280368337509192915050565b60405180602001604052806001906020820280368337509192915050565b6040518060c001604052806006906020820280368337509192915050565b5b80821115612479575f8155600101612466565b5090565b60405180604001604052806002906020820280368337509192915050565b634e487b7160e01b5f52604160045260245ffd5b6040805190810167ffffffffffffffff811182821017156124d2576124d261249b565b60405290565b604051601f8201601f1916810167ffffffffffffffff811182821017156125015761250161249b565b604052919050565b80356001600160a01b038116811461251f575f5ffd5b919050565b5f60408284031215612534575f5ffd5b61253c6124af565b905061254782612509565b8152602082013563ffffffff8116811461255f575f5ffd5b602082015292915050565b5f5f6060838503121561257b575f5ffd5b6125858484612524565b915061259360408401612509565b90509250929050565b5f82601f8301126125ab575f5ffd5b6125b560406124d8565b8060408401858111156125c6575f5ffd5b845b818110156125e05780358452602093840193016125c8565b509095945050505050565b5f5f82840360c08112156125fd575f5ffd5b604081121561260a575f5ffd5b6126126124af565b843581526020808601359082015292506080603f1982011215612633575f5ffd5b5061263c6124af565b612649856040860161259c565b8152612658856080860161259c565b6020820152809150509250929050565b5f81518084528060208401602086015e5f602082860101526020601f19601f83011685010191505092915050565b602081525f610e1b6020830184612668565b5f5f83601f8401126126b8575f5ffd5b50813567ffffffffffffffff8111156126cf575f5ffd5b6020830191508360208285010111156105d8575f5ffd5b5f5f5f5f608085870312156126f9575f5ffd5b61270285612509565b93506127118660208701612524565b9250606085013567ffffffffffffffff81111561272c575f5ffd5b612738878288016126a8565b95989497509550505050565b5f60408284031215612754575f5ffd5b610e1b8383612524565b634e487b7160e01b5f52602160045260245ffd5b6003811061278e57634e487b7160e01b5f52602160045260245ffd5b9052565b602081016103ed8284612772565b5f5f606083850312156127b1575f5ffd5b6127bb8484612524565b9150604083013567ffffffffffffffff8111156127d6575f5ffd5b8301601f810185136127e6575f5ffd5b803567ffffffffffffffff8111156128005761280061249b565b612813601f8201601f19166020016124d8565b818152866020838501011115612827575f5ffd5b816020840160208301375f602083830101528093505050509250929050565b5f5f60608385031215612857575f5ffd5b61286083612509565b91506125938460208501612524565b805f5b60028110156117a7578151845260209384019390910190600101612872565b5f60c08201905083518252602084015160208301526128b460408301845161286f565b60208301516128c6608084018261286f565b509392505050565b5f5f5f5f5f5f60a087890312156128e3575f5ffd5b6128ec87612509565b95506128fb8860208901612524565b9450606087013567ffffffffffffffff811115612916575f5ffd5b61292289828a016126a8565b909550935050608087013567ffffffffffffffff811115612941575f5ffd5b61294d89828a016126a8565b979a9699509497509295939492505050565b5f5f5f60808486031215612971575f5ffd5b61297a84612509565b92506129898560208601612524565b915061299760608501612509565b90509250925092565b5f602082840312156129b0575f5ffd5b5035919050565b5f5f606083850312156129c8575f5ffd5b6129d28484612524565b91506040830135600381106129e5575f5ffd5b809150509250929050565b805160208201516001600160601b0319811691906014821015612a2d576001600160601b03196001600160601b03198360140360031b1b82161692505b5050919050565b634e487b7160e01b5f52603260045260245ffd5b818382375f9101908152919050565b5f5f60408385031215612a68575f5ffd5b505080516020909101519092909150565b6001600160a01b038316815260608101610e1b602083018480516001600160a01b0316825260209081015163ffffffff16910152565b5f60208284031215612abf575f5ffd5b81518015158114610e1b575f5ffd5b600181811c90821680612ae257607f821691505b602082108103612b0057634e487b7160e01b5f52602260045260245ffd5b50919050565b82516001600160a01b0316815260208084015163ffffffff169082015260608101610e1b6040830184612772565b5f82601f830112612b43575f5ffd5b612b4d60406124d8565b806040840185811115612b5e575f5ffd5b845b818110156125e0578051845260209384019301612b60565b5f5f5f5f60c08587031215612b8b575f5ffd5b845160208601519094509250612ba48660408701612b34565b9150612bb38660808701612b34565b905092959194509250565b84516001600160a01b0316815260208086015163ffffffff1690820152612be86040820185612772565b60806060820152816080820152818360a08301375f81830160a090810191909152601f909201601f191601019392505050565b80516020808301519190811015612b00575f1960209190910360031b1b16919050565b80356001600160601b03198116906014841015612c75576001600160601b03196001600160601b03198560140360031b1b82161691505b5092915050565b5f5f5f5f60c08587031215612c8f575f5ffd5b8435935060208501359250612ca7866040870161259c565b9150612bb3866080870161259c565b5f5f60408385031215612cc7575f5ffd5b50508035926020909101359150565b601f821115612d1d57805f5260205f20601f840160051c81016020851015612cfb5750805b601f840160051c820191505b81811015612d1a575f8155600101612d07565b50505b505050565b815167ffffffffffffffff811115612d3c57612d3c61249b565b612d5081612d4a8454612ace565b84612cd6565b6020601f821160018114612d82575f8315612d6b5750848201515b5f19600385901b1c1916600184901b178455612d1a565b5f84815260208120601f198516915b82811015612db15787850151825560209485019460019092019101612d91565b5084821015612dce57868401515f19600387901b60f8161c191681555b50505050600190811b01905550565b5f82612df757634e487b7160e01b5f52601260045260245ffd5b500690565b634e487b7160e01b5f52601160045260245ffd5b80820281158282048414176103ed576103ed612dfc565b808201808211156103ed576103ed612dfc565b828152604060208201525f612e526040830184612668565b949350505050565b5f82518060208501845e5f920191825250919050565b5f60208284031215612e80575f5ffd5b505191905056fe30644e72e131a029b85045b68181585d97816a916871ca8d3c208c16d87cfd47a2646970667358221220c5372579b19aaa725b7b59a759ed9f8fea7d53af64d9872500de95b65fe6b2a764736f6c634300081e0033",
}
⋮----
// KeyRegistrarABI is the input ABI used to generate the binding from.
// Deprecated: Use KeyRegistrarMetaData.ABI instead.
var KeyRegistrarABI = KeyRegistrarMetaData.ABI
⋮----
// KeyRegistrarBin is the compiled bytecode used for deploying new contracts.
// Deprecated: Use KeyRegistrarMetaData.Bin instead.
var KeyRegistrarBin = KeyRegistrarMetaData.Bin
⋮----
// DeployKeyRegistrar deploys a new Ethereum contract, binding an instance of KeyRegistrar to it.
func DeployKeyRegistrar(auth *bind.TransactOpts, backend bind.ContractBackend, _permissionController common.Address, _allocationManager common.Address, _version string) (common.Address, *types.Transaction, *KeyRegistrar, error)
⋮----
// KeyRegistrar is an auto generated Go binding around an Ethereum contract.
type KeyRegistrar struct {
	KeyRegistrarCaller     // Read-only binding to the contract
	KeyRegistrarTransactor // Write-only binding to the contract
	KeyRegistrarFilterer   // Log filterer for contract events
}
⋮----
KeyRegistrarCaller     // Read-only binding to the contract
KeyRegistrarTransactor // Write-only binding to the contract
KeyRegistrarFilterer   // Log filterer for contract events
⋮----
// KeyRegistrarCaller is an auto generated read-only Go binding around an Ethereum contract.
type KeyRegistrarCaller struct {
	contract *bind.BoundContract // Generic contract wrapper for the low level calls
}
⋮----
contract *bind.BoundContract // Generic contract wrapper for the low level calls
⋮----
// KeyRegistrarTransactor is an auto generated write-only Go binding around an Ethereum contract.
type KeyRegistrarTransactor struct {
	contract *bind.BoundContract // Generic contract wrapper for the low level calls
}
⋮----
// KeyRegistrarFilterer is an auto generated log filtering Go binding around an Ethereum contract events.
type KeyRegistrarFilterer struct {
	contract *bind.BoundContract // Generic contract wrapper for the low level calls
}
⋮----
// KeyRegistrarSession is an auto generated Go binding around an Ethereum contract,
// with pre-set call and transact options.
type KeyRegistrarSession struct {
	Contract     *KeyRegistrar     // 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
}
⋮----
Contract     *KeyRegistrar     // 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
⋮----
// KeyRegistrarCallerSession is an auto generated read-only Go binding around an Ethereum contract,
// with pre-set call options.
type KeyRegistrarCallerSession struct {
	Contract *KeyRegistrarCaller // Generic contract caller binding to set the session for
	CallOpts bind.CallOpts       // Call options to use throughout this session
}
⋮----
Contract *KeyRegistrarCaller // Generic contract caller binding to set the session for
CallOpts bind.CallOpts       // Call options to use throughout this session
⋮----
// KeyRegistrarTransactorSession is an auto generated write-only Go binding around an Ethereum contract,
// with pre-set transact options.
type KeyRegistrarTransactorSession struct {
	Contract     *KeyRegistrarTransactor // Generic contract transactor binding to set the session for
	TransactOpts bind.TransactOpts       // Transaction auth options to use throughout this session
}
⋮----
Contract     *KeyRegistrarTransactor // Generic contract transactor binding to set the session for
TransactOpts bind.TransactOpts       // Transaction auth options to use throughout this session
⋮----
// KeyRegistrarRaw is an auto generated low-level Go binding around an Ethereum contract.
type KeyRegistrarRaw struct {
	Contract *KeyRegistrar // Generic contract binding to access the raw methods on
}
⋮----
Contract *KeyRegistrar // Generic contract binding to access the raw methods on
⋮----
// KeyRegistrarCallerRaw is an auto generated low-level read-only Go binding around an Ethereum contract.
type KeyRegistrarCallerRaw struct {
	Contract *KeyRegistrarCaller // Generic read-only contract binding to access the raw methods on
}
⋮----
Contract *KeyRegistrarCaller // Generic read-only contract binding to access the raw methods on
⋮----
// KeyRegistrarTransactorRaw is an auto generated low-level write-only Go binding around an Ethereum contract.
type KeyRegistrarTransactorRaw struct {
	Contract *KeyRegistrarTransactor // Generic write-only contract binding to access the raw methods on
}
⋮----
Contract *KeyRegistrarTransactor // Generic write-only contract binding to access the raw methods on
⋮----
// NewKeyRegistrar creates a new instance of KeyRegistrar, bound to a specific deployed contract.
func NewKeyRegistrar(address common.Address, backend bind.ContractBackend) (*KeyRegistrar, error)
⋮----
// NewKeyRegistrarCaller creates a new read-only instance of KeyRegistrar, bound to a specific deployed contract.
func NewKeyRegistrarCaller(address common.Address, caller bind.ContractCaller) (*KeyRegistrarCaller, error)
⋮----
// NewKeyRegistrarTransactor creates a new write-only instance of KeyRegistrar, bound to a specific deployed contract.
func NewKeyRegistrarTransactor(address common.Address, transactor bind.ContractTransactor) (*KeyRegistrarTransactor, error)
⋮----
// NewKeyRegistrarFilterer creates a new log filterer instance of KeyRegistrar, bound to a specific deployed contract.
func NewKeyRegistrarFilterer(address common.Address, filterer bind.ContractFilterer) (*KeyRegistrarFilterer, error)
⋮----
// bindKeyRegistrar binds a generic wrapper to an already deployed contract.
func bindKeyRegistrar(address common.Address, caller bind.ContractCaller, transactor bind.ContractTransactor, filterer bind.ContractFilterer) (*bind.BoundContract, error)
⋮----
// 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 (_KeyRegistrar *KeyRegistrarRaw) Call(opts *bind.CallOpts, result *[]interface
⋮----
// Transfer initiates a plain transaction to move funds to the contract, calling
// its default method if one is available.
func (_KeyRegistrar *KeyRegistrarRaw) Transfer(opts *bind.TransactOpts) (*types.Transaction, error)
⋮----
// Transact invokes the (paid) contract method with params as input values.
func (_KeyRegistrar *KeyRegistrarRaw) Transact(opts *bind.TransactOpts, method string, params ...interface
⋮----
// BN254KEYREGISTRATIONTYPEHASH is a free data retrieval call binding the contract method 0xb05c8f6d.
//
// Solidity: function BN254_KEY_REGISTRATION_TYPEHASH() view returns(bytes32)
func (_KeyRegistrar *KeyRegistrarCaller) BN254KEYREGISTRATIONTYPEHASH(opts *bind.CallOpts) ([32]byte, error)
⋮----
var out []interface{}
⋮----
// ECDSAKEYREGISTRATIONTYPEHASH is a free data retrieval call binding the contract method 0x166aa127.
⋮----
// Solidity: function ECDSA_KEY_REGISTRATION_TYPEHASH() view returns(bytes32)
func (_KeyRegistrar *KeyRegistrarCaller) ECDSAKEYREGISTRATIONTYPEHASH(opts *bind.CallOpts) ([32]byte, error)
⋮----
// AllocationManager is a free data retrieval call binding the contract method 0xca8aa7c7.
⋮----
// Solidity: function allocationManager() view returns(address)
func (_KeyRegistrar *KeyRegistrarCaller) AllocationManager(opts *bind.CallOpts) (common.Address, error)
⋮----
// DomainSeparator is a free data retrieval call binding the contract method 0xf698da25.
⋮----
// Solidity: function domainSeparator() view returns(bytes32)
func (_KeyRegistrar *KeyRegistrarCaller) DomainSeparator(opts *bind.CallOpts) ([32]byte, error)
⋮----
// EncodeBN254KeyData is a free data retrieval call binding the contract method 0x50435add.
⋮----
// Solidity: function encodeBN254KeyData((uint256,uint256) g1Point, (uint256[2],uint256[2]) g2Point) pure returns(bytes)
func (_KeyRegistrar *KeyRegistrarCaller) EncodeBN254KeyData(opts *bind.CallOpts, g1Point BN254G1Point, g2Point BN254G2Point) ([]byte, error)
⋮----
// GetBN254Key is a free data retrieval call binding the contract method 0x9a43e3fb.
⋮----
// Solidity: function getBN254Key((address,uint32) operatorSet, address operator) view returns((uint256,uint256) g1Point, (uint256[2],uint256[2]) g2Point)
func (_KeyRegistrar *KeyRegistrarCaller) GetBN254Key(opts *bind.CallOpts, operatorSet OperatorSet, operator common.Address) (struct
⋮----
// GetBN254KeyRegistrationMessageHash is a free data retrieval call binding the contract method 0x7690e395.
⋮----
// Solidity: function getBN254KeyRegistrationMessageHash(address operator, (address,uint32) operatorSet, bytes keyData) view returns(bytes32)
func (_KeyRegistrar *KeyRegistrarCaller) GetBN254KeyRegistrationMessageHash(opts *bind.CallOpts, operator common.Address, operatorSet OperatorSet, keyData []byte) ([32]byte, error)
⋮----
// GetECDSAAddress is a free data retrieval call binding the contract method 0x3b32a7bd.
⋮----
// Solidity: function getECDSAAddress((address,uint32) operatorSet, address operator) view returns(address)
func (_KeyRegistrar *KeyRegistrarCaller) GetECDSAAddress(opts *bind.CallOpts, operatorSet OperatorSet, operator common.Address) (common.Address, error)
⋮----
// GetECDSAKey is a free data retrieval call binding the contract method 0xaa165c30.
⋮----
// Solidity: function getECDSAKey((address,uint32) operatorSet, address operator) view returns(bytes)
func (_KeyRegistrar *KeyRegistrarCaller) GetECDSAKey(opts *bind.CallOpts, operatorSet OperatorSet, operator common.Address) ([]byte, error)
⋮----
// GetECDSAKeyRegistrationMessageHash is a free data retrieval call binding the contract method 0xd9f12db2.
⋮----
// Solidity: function getECDSAKeyRegistrationMessageHash(address operator, (address,uint32) operatorSet, address keyAddress) view returns(bytes32)
func (_KeyRegistrar *KeyRegistrarCaller) GetECDSAKeyRegistrationMessageHash(opts *bind.CallOpts, operator common.Address, operatorSet OperatorSet, keyAddress common.Address) ([32]byte, error)
⋮----
// GetKeyHash is a free data retrieval call binding the contract method 0xea194e2e.
⋮----
// Solidity: function getKeyHash((address,uint32) operatorSet, address operator) view returns(bytes32)
func (_KeyRegistrar *KeyRegistrarCaller) GetKeyHash(opts *bind.CallOpts, operatorSet OperatorSet, operator common.Address) ([32]byte, error)
⋮----
// GetOperatorFromSigningKey is a free data retrieval call binding the contract method 0x8256909c.
⋮----
// Solidity: function getOperatorFromSigningKey((address,uint32) operatorSet, bytes keyData) view returns(address, bool)
func (_KeyRegistrar *KeyRegistrarCaller) GetOperatorFromSigningKey(opts *bind.CallOpts, operatorSet OperatorSet, keyData []byte) (common.Address, bool, error)
⋮----
// GetOperatorSetCurveType is a free data retrieval call binding the contract method 0x7cffe48c.
⋮----
// Solidity: function getOperatorSetCurveType((address,uint32) operatorSet) view returns(uint8)
func (_KeyRegistrar *KeyRegistrarCaller) GetOperatorSetCurveType(opts *bind.CallOpts, operatorSet OperatorSet) (uint8, error)
⋮----
// IsKeyGloballyRegistered is a free data retrieval call binding the contract method 0xdab42d7e.
⋮----
// Solidity: function isKeyGloballyRegistered(bytes32 keyHash) view returns(bool)
func (_KeyRegistrar *KeyRegistrarCaller) IsKeyGloballyRegistered(opts *bind.CallOpts, keyHash [32]byte) (bool, error)
⋮----
// IsRegistered is a free data retrieval call binding the contract method 0xbd30a0b9.
⋮----
// Solidity: function isRegistered((address,uint32) operatorSet, address operator) view returns(bool)
func (_KeyRegistrar *KeyRegistrarCaller) IsRegistered(opts *bind.CallOpts, operatorSet OperatorSet, operator common.Address) (bool, error)
⋮----
// PermissionController is a free data retrieval call binding the contract method 0x4657e26a.
⋮----
// Solidity: function permissionController() view returns(address)
func (_KeyRegistrar *KeyRegistrarCaller) PermissionController(opts *bind.CallOpts) (common.Address, error)
⋮----
// Version is a free data retrieval call binding the contract method 0x54fd4d50.
⋮----
// Solidity: function version() view returns(string)
func (_KeyRegistrar *KeyRegistrarCaller) Version(opts *bind.CallOpts) (string, error)
⋮----
// ConfigureOperatorSet is a paid mutator transaction binding the contract method 0xea0d8149.
⋮----
// Solidity: function configureOperatorSet((address,uint32) operatorSet, uint8 curveType) returns()
func (_KeyRegistrar *KeyRegistrarTransactor) ConfigureOperatorSet(opts *bind.TransactOpts, operatorSet OperatorSet, curveType uint8) (*types.Transaction, error)
⋮----
// DeregisterKey is a paid mutator transaction binding the contract method 0x87ab86f4.
⋮----
// Solidity: function deregisterKey(address operator, (address,uint32) operatorSet) returns()
func (_KeyRegistrar *KeyRegistrarTransactor) DeregisterKey(opts *bind.TransactOpts, operator common.Address, operatorSet OperatorSet) (*types.Transaction, error)
⋮----
// RegisterKey is a paid mutator transaction binding the contract method 0xd40cda16.
⋮----
// Solidity: function registerKey(address operator, (address,uint32) operatorSet, bytes keyData, bytes signature) returns()
func (_KeyRegistrar *KeyRegistrarTransactor) RegisterKey(opts *bind.TransactOpts, operator common.Address, operatorSet OperatorSet, keyData []byte, signature []byte) (*types.Transaction, error)
⋮----
// KeyRegistrarAggregateBN254KeyUpdatedIterator is returned from FilterAggregateBN254KeyUpdated and is used to iterate over the raw logs and unpacked data for AggregateBN254KeyUpdated events raised by the KeyRegistrar contract.
type KeyRegistrarAggregateBN254KeyUpdatedIterator struct {
	Event *KeyRegistrarAggregateBN254KeyUpdated // 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
}
⋮----
Event *KeyRegistrarAggregateBN254KeyUpdated // 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 *KeyRegistrarAggregateBN254KeyUpdatedIterator) Next() bool
⋮----
// If the iterator failed, stop iterating
⋮----
// If the iterator completed, deliver directly whatever's available
⋮----
// Iterator still in progress, wait for either a data or an error event
⋮----
// Error returns any retrieval or parsing error occurred during filtering.
func (it *KeyRegistrarAggregateBN254KeyUpdatedIterator) Error() error
⋮----
// Close terminates the iteration process, releasing any pending underlying
// resources.
func (it *KeyRegistrarAggregateBN254KeyUpdatedIterator) Close() error
⋮----
// KeyRegistrarAggregateBN254KeyUpdated represents a AggregateBN254KeyUpdated event raised by the KeyRegistrar contract.
type KeyRegistrarAggregateBN254KeyUpdated struct {
	OperatorSet     OperatorSet
	NewAggregateKey BN254G1Point
	Raw             types.Log // Blockchain specific contextual infos
}
⋮----
Raw             types.Log // Blockchain specific contextual infos
⋮----
// FilterAggregateBN254KeyUpdated is a free log retrieval operation binding the contract event 0xdfa2f59e55747ba641fbdff4eb78577de8789d605920d5be4a74ee3a6470d1d1.
⋮----
// Solidity: event AggregateBN254KeyUpdated((address,uint32) operatorSet, (uint256,uint256) newAggregateKey)
func (_KeyRegistrar *KeyRegistrarFilterer) FilterAggregateBN254KeyUpdated(opts *bind.FilterOpts) (*KeyRegistrarAggregateBN254KeyUpdatedIterator, error)
⋮----
// WatchAggregateBN254KeyUpdated is a free log subscription operation binding the contract event 0xdfa2f59e55747ba641fbdff4eb78577de8789d605920d5be4a74ee3a6470d1d1.
⋮----
func (_KeyRegistrar *KeyRegistrarFilterer) WatchAggregateBN254KeyUpdated(opts *bind.WatchOpts, sink chan<- *KeyRegistrarAggregateBN254KeyUpdated) (event.Subscription, error)
⋮----
// New log arrived, parse the event and forward to the user
⋮----
// ParseAggregateBN254KeyUpdated is a log parse operation binding the contract event 0xdfa2f59e55747ba641fbdff4eb78577de8789d605920d5be4a74ee3a6470d1d1.
⋮----
func (_KeyRegistrar *KeyRegistrarFilterer) ParseAggregateBN254KeyUpdated(log types.Log) (*KeyRegistrarAggregateBN254KeyUpdated, error)
⋮----
// KeyRegistrarKeyDeregisteredIterator is returned from FilterKeyDeregistered and is used to iterate over the raw logs and unpacked data for KeyDeregistered events raised by the KeyRegistrar contract.
type KeyRegistrarKeyDeregisteredIterator struct {
	Event *KeyRegistrarKeyDeregistered // 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
}
⋮----
Event *KeyRegistrarKeyDeregistered // Event containing the contract specifics and raw log
⋮----
// KeyRegistrarKeyDeregistered represents a KeyDeregistered event raised by the KeyRegistrar contract.
type KeyRegistrarKeyDeregistered struct {
	OperatorSet OperatorSet
	Operator    common.Address
	CurveType   uint8
	Raw         types.Log // Blockchain specific contextual infos
}
⋮----
Raw         types.Log // Blockchain specific contextual infos
⋮----
// FilterKeyDeregistered is a free log retrieval operation binding the contract event 0x28d3c3cee49478ec6fd219cfd685cd15cd01d95cabf69b4b7b57f9eaa3eb6442.
⋮----
// Solidity: event KeyDeregistered((address,uint32) operatorSet, address indexed operator, uint8 curveType)
func (_KeyRegistrar *KeyRegistrarFilterer) FilterKeyDeregistered(opts *bind.FilterOpts, operator []common.Address) (*KeyRegistrarKeyDeregisteredIterator, error)
⋮----
var operatorRule []interface{}
⋮----
// WatchKeyDeregistered is a free log subscription operation binding the contract event 0x28d3c3cee49478ec6fd219cfd685cd15cd01d95cabf69b4b7b57f9eaa3eb6442.
⋮----
func (_KeyRegistrar *KeyRegistrarFilterer) WatchKeyDeregistered(opts *bind.WatchOpts, sink chan<- *KeyRegistrarKeyDeregistered, operator []common.Address) (event.Subscription, error)
⋮----
// ParseKeyDeregistered is a log parse operation binding the contract event 0x28d3c3cee49478ec6fd219cfd685cd15cd01d95cabf69b4b7b57f9eaa3eb6442.
⋮----
func (_KeyRegistrar *KeyRegistrarFilterer) ParseKeyDeregistered(log types.Log) (*KeyRegistrarKeyDeregistered, error)
⋮----
// KeyRegistrarKeyRegisteredIterator is returned from FilterKeyRegistered and is used to iterate over the raw logs and unpacked data for KeyRegistered events raised by the KeyRegistrar contract.
type KeyRegistrarKeyRegisteredIterator struct {
	Event *KeyRegistrarKeyRegistered // 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
}
⋮----
Event *KeyRegistrarKeyRegistered // Event containing the contract specifics and raw log
⋮----
// KeyRegistrarKeyRegistered represents a KeyRegistered event raised by the KeyRegistrar contract.
type KeyRegistrarKeyRegistered struct {
	OperatorSet OperatorSet
	Operator    common.Address
	CurveType   uint8
	Pubkey      []byte
	Raw         types.Log // Blockchain specific contextual infos
}
⋮----
// FilterKeyRegistered is a free log retrieval operation binding the contract event 0x1201ce0c5e577111bce91e907fd99cb183da5edc1e3fb650ca40769e4e9176dd.
⋮----
// Solidity: event KeyRegistered((address,uint32) operatorSet, address indexed operator, uint8 curveType, bytes pubkey)
func (_KeyRegistrar *KeyRegistrarFilterer) FilterKeyRegistered(opts *bind.FilterOpts, operator []common.Address) (*KeyRegistrarKeyRegisteredIterator, error)
⋮----
// WatchKeyRegistered is a free log subscription operation binding the contract event 0x1201ce0c5e577111bce91e907fd99cb183da5edc1e3fb650ca40769e4e9176dd.
⋮----
func (_KeyRegistrar *KeyRegistrarFilterer) WatchKeyRegistered(opts *bind.WatchOpts, sink chan<- *KeyRegistrarKeyRegistered, operator []common.Address) (event.Subscription, error)
⋮----
// ParseKeyRegistered is a log parse operation binding the contract event 0x1201ce0c5e577111bce91e907fd99cb183da5edc1e3fb650ca40769e4e9176dd.
⋮----
func (_KeyRegistrar *KeyRegistrarFilterer) ParseKeyRegistered(log types.Log) (*KeyRegistrarKeyRegistered, error)
⋮----
// KeyRegistrarOperatorSetConfiguredIterator is returned from FilterOperatorSetConfigured and is used to iterate over the raw logs and unpacked data for OperatorSetConfigured events raised by the KeyRegistrar contract.
type KeyRegistrarOperatorSetConfiguredIterator struct {
	Event *KeyRegistrarOperatorSetConfigured // 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
}
⋮----
Event *KeyRegistrarOperatorSetConfigured // Event containing the contract specifics and raw log
⋮----
// KeyRegistrarOperatorSetConfigured represents a OperatorSetConfigured event raised by the KeyRegistrar contract.
type KeyRegistrarOperatorSetConfigured struct {
	OperatorSet OperatorSet
	CurveType   uint8
	Raw         types.Log // Blockchain specific contextual infos
}
⋮----
// FilterOperatorSetConfigured is a free log retrieval operation binding the contract event 0xb2266cb118e57095fcdbedb24dabd9fc9f5127e2dbedf62ce6ee71696fb8b6e7.
⋮----
// Solidity: event OperatorSetConfigured((address,uint32) operatorSet, uint8 curveType)
func (_KeyRegistrar *KeyRegistrarFilterer) FilterOperatorSetConfigured(opts *bind.FilterOpts) (*KeyRegistrarOperatorSetConfiguredIterator, error)
⋮----
// WatchOperatorSetConfigured is a free log subscription operation binding the contract event 0xb2266cb118e57095fcdbedb24dabd9fc9f5127e2dbedf62ce6ee71696fb8b6e7.
⋮----
func (_KeyRegistrar *KeyRegistrarFilterer) WatchOperatorSetConfigured(opts *bind.WatchOpts, sink chan<- *KeyRegistrarOperatorSetConfigured) (event.Subscription, error)
⋮----
// ParseOperatorSetConfigured is a log parse operation binding the contract event 0xb2266cb118e57095fcdbedb24dabd9fc9f5127e2dbedf62ce6ee71696fb8b6e7.
⋮----
func (_KeyRegistrar *KeyRegistrarFilterer) ParseOperatorSetConfigured(log types.Log) (*KeyRegistrarOperatorSetConfigured, error)
````

## File: pkg/bindings/KeyRegistrarStorage/binding.go
````go
// Code generated - DO NOT EDIT.
// This file is a generated binding and any manual changes will be lost.
⋮----
package KeyRegistrarStorage
⋮----
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"
)
⋮----
"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
)
⋮----
// BN254G1Point is an auto generated low-level Go binding around an user-defined struct.
type BN254G1Point struct {
	X *big.Int
	Y *big.Int
}
⋮----
// BN254G2Point is an auto generated low-level Go binding around an user-defined struct.
type BN254G2Point struct {
	X [2]*big.Int
	Y [2]*big.Int
}
⋮----
// OperatorSet is an auto generated low-level Go binding around an user-defined struct.
type OperatorSet struct {
	Avs common.Address
	Id  uint32
}
⋮----
// KeyRegistrarStorageMetaData contains all meta data concerning the KeyRegistrarStorage contract.
var KeyRegistrarStorageMetaData = &bind.MetaData{
	ABI: "[{\"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\":\"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\":\"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\":\"pubkey\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"signature\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"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\":\"InvalidCurveType\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidKeyFormat\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidKeypair\",\"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\":\"ZeroAddress\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ZeroPubkey\",\"inputs\":[]}]",
}
⋮----
// KeyRegistrarStorageABI is the input ABI used to generate the binding from.
// Deprecated: Use KeyRegistrarStorageMetaData.ABI instead.
var KeyRegistrarStorageABI = KeyRegistrarStorageMetaData.ABI
⋮----
// KeyRegistrarStorage is an auto generated Go binding around an Ethereum contract.
type KeyRegistrarStorage struct {
	KeyRegistrarStorageCaller     // Read-only binding to the contract
	KeyRegistrarStorageTransactor // Write-only binding to the contract
	KeyRegistrarStorageFilterer   // Log filterer for contract events
}
⋮----
KeyRegistrarStorageCaller     // Read-only binding to the contract
KeyRegistrarStorageTransactor // Write-only binding to the contract
KeyRegistrarStorageFilterer   // Log filterer for contract events
⋮----
// KeyRegistrarStorageCaller is an auto generated read-only Go binding around an Ethereum contract.
type KeyRegistrarStorageCaller struct {
	contract *bind.BoundContract // Generic contract wrapper for the low level calls
}
⋮----
contract *bind.BoundContract // Generic contract wrapper for the low level calls
⋮----
// KeyRegistrarStorageTransactor is an auto generated write-only Go binding around an Ethereum contract.
type KeyRegistrarStorageTransactor struct {
	contract *bind.BoundContract // Generic contract wrapper for the low level calls
}
⋮----
// KeyRegistrarStorageFilterer is an auto generated log filtering Go binding around an Ethereum contract events.
type KeyRegistrarStorageFilterer struct {
	contract *bind.BoundContract // Generic contract wrapper for the low level calls
}
⋮----
// KeyRegistrarStorageSession is an auto generated Go binding around an Ethereum contract,
// with pre-set call and transact options.
type KeyRegistrarStorageSession struct {
	Contract     *KeyRegistrarStorage // 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
}
⋮----
Contract     *KeyRegistrarStorage // 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
⋮----
// KeyRegistrarStorageCallerSession is an auto generated read-only Go binding around an Ethereum contract,
// with pre-set call options.
type KeyRegistrarStorageCallerSession struct {
	Contract *KeyRegistrarStorageCaller // Generic contract caller binding to set the session for
	CallOpts bind.CallOpts              // Call options to use throughout this session
}
⋮----
Contract *KeyRegistrarStorageCaller // Generic contract caller binding to set the session for
CallOpts bind.CallOpts              // Call options to use throughout this session
⋮----
// KeyRegistrarStorageTransactorSession is an auto generated write-only Go binding around an Ethereum contract,
// with pre-set transact options.
type KeyRegistrarStorageTransactorSession struct {
	Contract     *KeyRegistrarStorageTransactor // Generic contract transactor binding to set the session for
	TransactOpts bind.TransactOpts              // Transaction auth options to use throughout this session
}
⋮----
Contract     *KeyRegistrarStorageTransactor // Generic contract transactor binding to set the session for
TransactOpts bind.TransactOpts              // Transaction auth options to use throughout this session
⋮----
// KeyRegistrarStorageRaw is an auto generated low-level Go binding around an Ethereum contract.
type KeyRegistrarStorageRaw struct {
	Contract *KeyRegistrarStorage // Generic contract binding to access the raw methods on
}
⋮----
Contract *KeyRegistrarStorage // Generic contract binding to access the raw methods on
⋮----
// KeyRegistrarStorageCallerRaw is an auto generated low-level read-only Go binding around an Ethereum contract.
type KeyRegistrarStorageCallerRaw struct {
	Contract *KeyRegistrarStorageCaller // Generic read-only contract binding to access the raw methods on
}
⋮----
Contract *KeyRegistrarStorageCaller // Generic read-only contract binding to access the raw methods on
⋮----
// KeyRegistrarStorageTransactorRaw is an auto generated low-level write-only Go binding around an Ethereum contract.
type KeyRegistrarStorageTransactorRaw struct {
	Contract *KeyRegistrarStorageTransactor // Generic write-only contract binding to access the raw methods on
}
⋮----
Contract *KeyRegistrarStorageTransactor // Generic write-only contract binding to access the raw methods on
⋮----
// NewKeyRegistrarStorage creates a new instance of KeyRegistrarStorage, bound to a specific deployed contract.
func NewKeyRegistrarStorage(address common.Address, backend bind.ContractBackend) (*KeyRegistrarStorage, error)
⋮----
// NewKeyRegistrarStorageCaller creates a new read-only instance of KeyRegistrarStorage, bound to a specific deployed contract.
func NewKeyRegistrarStorageCaller(address common.Address, caller bind.ContractCaller) (*KeyRegistrarStorageCaller, error)
⋮----
// NewKeyRegistrarStorageTransactor creates a new write-only instance of KeyRegistrarStorage, bound to a specific deployed contract.
func NewKeyRegistrarStorageTransactor(address common.Address, transactor bind.ContractTransactor) (*KeyRegistrarStorageTransactor, error)
⋮----
// NewKeyRegistrarStorageFilterer creates a new log filterer instance of KeyRegistrarStorage, bound to a specific deployed contract.
func NewKeyRegistrarStorageFilterer(address common.Address, filterer bind.ContractFilterer) (*KeyRegistrarStorageFilterer, error)
⋮----
// bindKeyRegistrarStorage binds a generic wrapper to an already deployed contract.
func bindKeyRegistrarStorage(address common.Address, caller bind.ContractCaller, transactor bind.ContractTransactor, filterer bind.ContractFilterer) (*bind.BoundContract, error)
⋮----
// 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 (_KeyRegistrarStorage *KeyRegistrarStorageRaw) Call(opts *bind.CallOpts, result *[]interface
⋮----
// Transfer initiates a plain transaction to move funds to the contract, calling
// its default method if one is available.
func (_KeyRegistrarStorage *KeyRegistrarStorageRaw) Transfer(opts *bind.TransactOpts) (*types.Transaction, error)
⋮----
// Transact invokes the (paid) contract method with params as input values.
func (_KeyRegistrarStorage *KeyRegistrarStorageRaw) Transact(opts *bind.TransactOpts, method string, params ...interface
⋮----
// AllocationManager is a free data retrieval call binding the contract method 0xca8aa7c7.
//
// Solidity: function allocationManager() view returns(address)
func (_KeyRegistrarStorage *KeyRegistrarStorageCaller) AllocationManager(opts *bind.CallOpts) (common.Address, error)
⋮----
var out []interface{}
⋮----
// EncodeBN254KeyData is a free data retrieval call binding the contract method 0x50435add.
⋮----
// Solidity: function encodeBN254KeyData((uint256,uint256) g1Point, (uint256[2],uint256[2]) g2Point) pure returns(bytes)
func (_KeyRegistrarStorage *KeyRegistrarStorageCaller) EncodeBN254KeyData(opts *bind.CallOpts, g1Point BN254G1Point, g2Point BN254G2Point) ([]byte, error)
⋮----
// GetBN254Key is a free data retrieval call binding the contract method 0x9a43e3fb.
⋮----
// Solidity: function getBN254Key((address,uint32) operatorSet, address operator) view returns((uint256,uint256) g1Point, (uint256[2],uint256[2]) g2Point)
func (_KeyRegistrarStorage *KeyRegistrarStorageCaller) GetBN254Key(opts *bind.CallOpts, operatorSet OperatorSet, operator common.Address) (struct
⋮----
// GetBN254KeyRegistrationMessageHash is a free data retrieval call binding the contract method 0x7690e395.
⋮----
// Solidity: function getBN254KeyRegistrationMessageHash(address operator, (address,uint32) operatorSet, bytes keyData) view returns(bytes32)
func (_KeyRegistrarStorage *KeyRegistrarStorageCaller) GetBN254KeyRegistrationMessageHash(opts *bind.CallOpts, operator common.Address, operatorSet OperatorSet, keyData []byte) ([32]byte, error)
⋮----
// GetECDSAAddress is a free data retrieval call binding the contract method 0x3b32a7bd.
⋮----
// Solidity: function getECDSAAddress((address,uint32) operatorSet, address operator) view returns(address)
func (_KeyRegistrarStorage *KeyRegistrarStorageCaller) GetECDSAAddress(opts *bind.CallOpts, operatorSet OperatorSet, operator common.Address) (common.Address, error)
⋮----
// GetECDSAKey is a free data retrieval call binding the contract method 0xaa165c30.
⋮----
// Solidity: function getECDSAKey((address,uint32) operatorSet, address operator) view returns(bytes)
func (_KeyRegistrarStorage *KeyRegistrarStorageCaller) GetECDSAKey(opts *bind.CallOpts, operatorSet OperatorSet, operator common.Address) ([]byte, error)
⋮----
// GetECDSAKeyRegistrationMessageHash is a free data retrieval call binding the contract method 0xd9f12db2.
⋮----
// Solidity: function getECDSAKeyRegistrationMessageHash(address operator, (address,uint32) operatorSet, address keyAddress) view returns(bytes32)
func (_KeyRegistrarStorage *KeyRegistrarStorageCaller) GetECDSAKeyRegistrationMessageHash(opts *bind.CallOpts, operator common.Address, operatorSet OperatorSet, keyAddress common.Address) ([32]byte, error)
⋮----
// GetKeyHash is a free data retrieval call binding the contract method 0xea194e2e.
⋮----
// Solidity: function getKeyHash((address,uint32) operatorSet, address operator) view returns(bytes32)
func (_KeyRegistrarStorage *KeyRegistrarStorageCaller) GetKeyHash(opts *bind.CallOpts, operatorSet OperatorSet, operator common.Address) ([32]byte, error)
⋮----
// GetOperatorFromSigningKey is a free data retrieval call binding the contract method 0x8256909c.
⋮----
// Solidity: function getOperatorFromSigningKey((address,uint32) operatorSet, bytes keyData) view returns(address, bool)
func (_KeyRegistrarStorage *KeyRegistrarStorageCaller) GetOperatorFromSigningKey(opts *bind.CallOpts, operatorSet OperatorSet, keyData []byte) (common.Address, bool, error)
⋮----
// GetOperatorSetCurveType is a free data retrieval call binding the contract method 0x7cffe48c.
⋮----
// Solidity: function getOperatorSetCurveType((address,uint32) operatorSet) view returns(uint8)
func (_KeyRegistrarStorage *KeyRegistrarStorageCaller) GetOperatorSetCurveType(opts *bind.CallOpts, operatorSet OperatorSet) (uint8, error)
⋮----
// IsKeyGloballyRegistered is a free data retrieval call binding the contract method 0xdab42d7e.
⋮----
// Solidity: function isKeyGloballyRegistered(bytes32 keyHash) view returns(bool)
func (_KeyRegistrarStorage *KeyRegistrarStorageCaller) IsKeyGloballyRegistered(opts *bind.CallOpts, keyHash [32]byte) (bool, error)
⋮----
// IsRegistered is a free data retrieval call binding the contract method 0xbd30a0b9.
⋮----
// Solidity: function isRegistered((address,uint32) operatorSet, address operator) view returns(bool)
func (_KeyRegistrarStorage *KeyRegistrarStorageCaller) IsRegistered(opts *bind.CallOpts, operatorSet OperatorSet, operator common.Address) (bool, error)
⋮----
// ConfigureOperatorSet is a paid mutator transaction binding the contract method 0xea0d8149.
⋮----
// Solidity: function configureOperatorSet((address,uint32) operatorSet, uint8 curveType) returns()
func (_KeyRegistrarStorage *KeyRegistrarStorageTransactor) ConfigureOperatorSet(opts *bind.TransactOpts, operatorSet OperatorSet, curveType uint8) (*types.Transaction, error)
⋮----
// DeregisterKey is a paid mutator transaction binding the contract method 0x87ab86f4.
⋮----
// Solidity: function deregisterKey(address operator, (address,uint32) operatorSet) returns()
func (_KeyRegistrarStorage *KeyRegistrarStorageTransactor) DeregisterKey(opts *bind.TransactOpts, operator common.Address, operatorSet OperatorSet) (*types.Transaction, error)
⋮----
// RegisterKey is a paid mutator transaction binding the contract method 0xd40cda16.
⋮----
// Solidity: function registerKey(address operator, (address,uint32) operatorSet, bytes pubkey, bytes signature) returns()
func (_KeyRegistrarStorage *KeyRegistrarStorageTransactor) RegisterKey(opts *bind.TransactOpts, operator common.Address, operatorSet OperatorSet, pubkey []byte, signature []byte) (*types.Transaction, error)
⋮----
// KeyRegistrarStorageAggregateBN254KeyUpdatedIterator is returned from FilterAggregateBN254KeyUpdated and is used to iterate over the raw logs and unpacked data for AggregateBN254KeyUpdated events raised by the KeyRegistrarStorage contract.
type KeyRegistrarStorageAggregateBN254KeyUpdatedIterator struct {
	Event *KeyRegistrarStorageAggregateBN254KeyUpdated // 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
}
⋮----
Event *KeyRegistrarStorageAggregateBN254KeyUpdated // 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 *KeyRegistrarStorageAggregateBN254KeyUpdatedIterator) Next() bool
⋮----
// If the iterator failed, stop iterating
⋮----
// If the iterator completed, deliver directly whatever's available
⋮----
// Iterator still in progress, wait for either a data or an error event
⋮----
// Error returns any retrieval or parsing error occurred during filtering.
func (it *KeyRegistrarStorageAggregateBN254KeyUpdatedIterator) Error() error
⋮----
// Close terminates the iteration process, releasing any pending underlying
// resources.
func (it *KeyRegistrarStorageAggregateBN254KeyUpdatedIterator) Close() error
⋮----
// KeyRegistrarStorageAggregateBN254KeyUpdated represents a AggregateBN254KeyUpdated event raised by the KeyRegistrarStorage contract.
type KeyRegistrarStorageAggregateBN254KeyUpdated struct {
	OperatorSet     OperatorSet
	NewAggregateKey BN254G1Point
	Raw             types.Log // Blockchain specific contextual infos
}
⋮----
Raw             types.Log // Blockchain specific contextual infos
⋮----
// FilterAggregateBN254KeyUpdated is a free log retrieval operation binding the contract event 0xdfa2f59e55747ba641fbdff4eb78577de8789d605920d5be4a74ee3a6470d1d1.
⋮----
// Solidity: event AggregateBN254KeyUpdated((address,uint32) operatorSet, (uint256,uint256) newAggregateKey)
func (_KeyRegistrarStorage *KeyRegistrarStorageFilterer) FilterAggregateBN254KeyUpdated(opts *bind.FilterOpts) (*KeyRegistrarStorageAggregateBN254KeyUpdatedIterator, error)
⋮----
// WatchAggregateBN254KeyUpdated is a free log subscription operation binding the contract event 0xdfa2f59e55747ba641fbdff4eb78577de8789d605920d5be4a74ee3a6470d1d1.
⋮----
func (_KeyRegistrarStorage *KeyRegistrarStorageFilterer) WatchAggregateBN254KeyUpdated(opts *bind.WatchOpts, sink chan<- *KeyRegistrarStorageAggregateBN254KeyUpdated) (event.Subscription, error)
⋮----
// New log arrived, parse the event and forward to the user
⋮----
// ParseAggregateBN254KeyUpdated is a log parse operation binding the contract event 0xdfa2f59e55747ba641fbdff4eb78577de8789d605920d5be4a74ee3a6470d1d1.
⋮----
func (_KeyRegistrarStorage *KeyRegistrarStorageFilterer) ParseAggregateBN254KeyUpdated(log types.Log) (*KeyRegistrarStorageAggregateBN254KeyUpdated, error)
⋮----
// KeyRegistrarStorageKeyDeregisteredIterator is returned from FilterKeyDeregistered and is used to iterate over the raw logs and unpacked data for KeyDeregistered events raised by the KeyRegistrarStorage contract.
type KeyRegistrarStorageKeyDeregisteredIterator struct {
	Event *KeyRegistrarStorageKeyDeregistered // 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
}
⋮----
Event *KeyRegistrarStorageKeyDeregistered // Event containing the contract specifics and raw log
⋮----
// KeyRegistrarStorageKeyDeregistered represents a KeyDeregistered event raised by the KeyRegistrarStorage contract.
type KeyRegistrarStorageKeyDeregistered struct {
	OperatorSet OperatorSet
	Operator    common.Address
	CurveType   uint8
	Raw         types.Log // Blockchain specific contextual infos
}
⋮----
Raw         types.Log // Blockchain specific contextual infos
⋮----
// FilterKeyDeregistered is a free log retrieval operation binding the contract event 0x28d3c3cee49478ec6fd219cfd685cd15cd01d95cabf69b4b7b57f9eaa3eb6442.
⋮----
// Solidity: event KeyDeregistered((address,uint32) operatorSet, address indexed operator, uint8 curveType)
func (_KeyRegistrarStorage *KeyRegistrarStorageFilterer) FilterKeyDeregistered(opts *bind.FilterOpts, operator []common.Address) (*KeyRegistrarStorageKeyDeregisteredIterator, error)
⋮----
var operatorRule []interface{}
⋮----
// WatchKeyDeregistered is a free log subscription operation binding the contract event 0x28d3c3cee49478ec6fd219cfd685cd15cd01d95cabf69b4b7b57f9eaa3eb6442.
⋮----
func (_KeyRegistrarStorage *KeyRegistrarStorageFilterer) WatchKeyDeregistered(opts *bind.WatchOpts, sink chan<- *KeyRegistrarStorageKeyDeregistered, operator []common.Address) (event.Subscription, error)
⋮----
// ParseKeyDeregistered is a log parse operation binding the contract event 0x28d3c3cee49478ec6fd219cfd685cd15cd01d95cabf69b4b7b57f9eaa3eb6442.
⋮----
func (_KeyRegistrarStorage *KeyRegistrarStorageFilterer) ParseKeyDeregistered(log types.Log) (*KeyRegistrarStorageKeyDeregistered, error)
⋮----
// KeyRegistrarStorageKeyRegisteredIterator is returned from FilterKeyRegistered and is used to iterate over the raw logs and unpacked data for KeyRegistered events raised by the KeyRegistrarStorage contract.
type KeyRegistrarStorageKeyRegisteredIterator struct {
	Event *KeyRegistrarStorageKeyRegistered // 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
}
⋮----
Event *KeyRegistrarStorageKeyRegistered // Event containing the contract specifics and raw log
⋮----
// KeyRegistrarStorageKeyRegistered represents a KeyRegistered event raised by the KeyRegistrarStorage contract.
type KeyRegistrarStorageKeyRegistered struct {
	OperatorSet OperatorSet
	Operator    common.Address
	CurveType   uint8
	Pubkey      []byte
	Raw         types.Log // Blockchain specific contextual infos
}
⋮----
// FilterKeyRegistered is a free log retrieval operation binding the contract event 0x1201ce0c5e577111bce91e907fd99cb183da5edc1e3fb650ca40769e4e9176dd.
⋮----
// Solidity: event KeyRegistered((address,uint32) operatorSet, address indexed operator, uint8 curveType, bytes pubkey)
func (_KeyRegistrarStorage *KeyRegistrarStorageFilterer) FilterKeyRegistered(opts *bind.FilterOpts, operator []common.Address) (*KeyRegistrarStorageKeyRegisteredIterator, error)
⋮----
// WatchKeyRegistered is a free log subscription operation binding the contract event 0x1201ce0c5e577111bce91e907fd99cb183da5edc1e3fb650ca40769e4e9176dd.
⋮----
func (_KeyRegistrarStorage *KeyRegistrarStorageFilterer) WatchKeyRegistered(opts *bind.WatchOpts, sink chan<- *KeyRegistrarStorageKeyRegistered, operator []common.Address) (event.Subscription, error)
⋮----
// ParseKeyRegistered is a log parse operation binding the contract event 0x1201ce0c5e577111bce91e907fd99cb183da5edc1e3fb650ca40769e4e9176dd.
⋮----
func (_KeyRegistrarStorage *KeyRegistrarStorageFilterer) ParseKeyRegistered(log types.Log) (*KeyRegistrarStorageKeyRegistered, error)
⋮----
// KeyRegistrarStorageOperatorSetConfiguredIterator is returned from FilterOperatorSetConfigured and is used to iterate over the raw logs and unpacked data for OperatorSetConfigured events raised by the KeyRegistrarStorage contract.
type KeyRegistrarStorageOperatorSetConfiguredIterator struct {
	Event *KeyRegistrarStorageOperatorSetConfigured // 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
}
⋮----
Event *KeyRegistrarStorageOperatorSetConfigured // Event containing the contract specifics and raw log
⋮----
// KeyRegistrarStorageOperatorSetConfigured represents a OperatorSetConfigured event raised by the KeyRegistrarStorage contract.
type KeyRegistrarStorageOperatorSetConfigured struct {
	OperatorSet OperatorSet
	CurveType   uint8
	Raw         types.Log // Blockchain specific contextual infos
}
⋮----
// FilterOperatorSetConfigured is a free log retrieval operation binding the contract event 0xb2266cb118e57095fcdbedb24dabd9fc9f5127e2dbedf62ce6ee71696fb8b6e7.
⋮----
// Solidity: event OperatorSetConfigured((address,uint32) operatorSet, uint8 curveType)
func (_KeyRegistrarStorage *KeyRegistrarStorageFilterer) FilterOperatorSetConfigured(opts *bind.FilterOpts) (*KeyRegistrarStorageOperatorSetConfiguredIterator, error)
⋮----
// WatchOperatorSetConfigured is a free log subscription operation binding the contract event 0xb2266cb118e57095fcdbedb24dabd9fc9f5127e2dbedf62ce6ee71696fb8b6e7.
⋮----
func (_KeyRegistrarStorage *KeyRegistrarStorageFilterer) WatchOperatorSetConfigured(opts *bind.WatchOpts, sink chan<- *KeyRegistrarStorageOperatorSetConfigured) (event.Subscription, error)
⋮----
// ParseOperatorSetConfigured is a log parse operation binding the contract event 0xb2266cb118e57095fcdbedb24dabd9fc9f5127e2dbedf62ce6ee71696fb8b6e7.
⋮----
func (_KeyRegistrarStorage *KeyRegistrarStorageFilterer) ParseOperatorSetConfigured(log types.Log) (*KeyRegistrarStorageOperatorSetConfigured, error)
````

## File: pkg/bindings/LeafCalculatorMixin/binding.go
````go
// Code generated - DO NOT EDIT.
// This file is a generated binding and any manual changes will be lost.
⋮----
package LeafCalculatorMixin
⋮----
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"
)
⋮----
"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
)
⋮----
// BN254G1Point is an auto generated low-level Go binding around an user-defined struct.
type BN254G1Point struct {
	X *big.Int
	Y *big.Int
}
⋮----
// IOperatorTableCalculatorTypesBN254OperatorInfo is an auto generated low-level Go binding around an user-defined struct.
type IOperatorTableCalculatorTypesBN254OperatorInfo struct {
	Pubkey  BN254G1Point
	Weights []*big.Int
}
⋮----
// LeafCalculatorMixinMetaData contains all meta data concerning the LeafCalculatorMixin contract.
var LeafCalculatorMixinMetaData = &bind.MetaData{
	ABI: "[{\"type\":\"function\",\"name\":\"OPERATOR_INFO_LEAF_SALT\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint8\",\"internalType\":\"uint8\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"OPERATOR_TABLE_LEAF_SALT\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint8\",\"internalType\":\"uint8\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"calculateOperatorInfoLeaf\",\"inputs\":[{\"name\":\"operatorInfo\",\"type\":\"tuple\",\"internalType\":\"structIOperatorTableCalculatorTypes.BN254OperatorInfo\",\"components\":[{\"name\":\"pubkey\",\"type\":\"tuple\",\"internalType\":\"structBN254.G1Point\",\"components\":[{\"name\":\"X\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"Y\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]},{\"name\":\"weights\",\"type\":\"uint256[]\",\"internalType\":\"uint256[]\"}]}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"pure\"},{\"type\":\"function\",\"name\":\"calculateOperatorTableLeaf\",\"inputs\":[{\"name\":\"operatorTableBytes\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"pure\"}]",
}
⋮----
// LeafCalculatorMixinABI is the input ABI used to generate the binding from.
// Deprecated: Use LeafCalculatorMixinMetaData.ABI instead.
var LeafCalculatorMixinABI = LeafCalculatorMixinMetaData.ABI
⋮----
// LeafCalculatorMixin is an auto generated Go binding around an Ethereum contract.
type LeafCalculatorMixin struct {
	LeafCalculatorMixinCaller     // Read-only binding to the contract
	LeafCalculatorMixinTransactor // Write-only binding to the contract
	LeafCalculatorMixinFilterer   // Log filterer for contract events
}
⋮----
LeafCalculatorMixinCaller     // Read-only binding to the contract
LeafCalculatorMixinTransactor // Write-only binding to the contract
LeafCalculatorMixinFilterer   // Log filterer for contract events
⋮----
// LeafCalculatorMixinCaller is an auto generated read-only Go binding around an Ethereum contract.
type LeafCalculatorMixinCaller struct {
	contract *bind.BoundContract // Generic contract wrapper for the low level calls
}
⋮----
contract *bind.BoundContract // Generic contract wrapper for the low level calls
⋮----
// LeafCalculatorMixinTransactor is an auto generated write-only Go binding around an Ethereum contract.
type LeafCalculatorMixinTransactor struct {
	contract *bind.BoundContract // Generic contract wrapper for the low level calls
}
⋮----
// LeafCalculatorMixinFilterer is an auto generated log filtering Go binding around an Ethereum contract events.
type LeafCalculatorMixinFilterer struct {
	contract *bind.BoundContract // Generic contract wrapper for the low level calls
}
⋮----
// LeafCalculatorMixinSession is an auto generated Go binding around an Ethereum contract,
// with pre-set call and transact options.
type LeafCalculatorMixinSession struct {
	Contract     *LeafCalculatorMixin // 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
}
⋮----
Contract     *LeafCalculatorMixin // 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
⋮----
// LeafCalculatorMixinCallerSession is an auto generated read-only Go binding around an Ethereum contract,
// with pre-set call options.
type LeafCalculatorMixinCallerSession struct {
	Contract *LeafCalculatorMixinCaller // Generic contract caller binding to set the session for
	CallOpts bind.CallOpts              // Call options to use throughout this session
}
⋮----
Contract *LeafCalculatorMixinCaller // Generic contract caller binding to set the session for
CallOpts bind.CallOpts              // Call options to use throughout this session
⋮----
// LeafCalculatorMixinTransactorSession is an auto generated write-only Go binding around an Ethereum contract,
// with pre-set transact options.
type LeafCalculatorMixinTransactorSession struct {
	Contract     *LeafCalculatorMixinTransactor // Generic contract transactor binding to set the session for
	TransactOpts bind.TransactOpts              // Transaction auth options to use throughout this session
}
⋮----
Contract     *LeafCalculatorMixinTransactor // Generic contract transactor binding to set the session for
TransactOpts bind.TransactOpts              // Transaction auth options to use throughout this session
⋮----
// LeafCalculatorMixinRaw is an auto generated low-level Go binding around an Ethereum contract.
type LeafCalculatorMixinRaw struct {
	Contract *LeafCalculatorMixin // Generic contract binding to access the raw methods on
}
⋮----
Contract *LeafCalculatorMixin // Generic contract binding to access the raw methods on
⋮----
// LeafCalculatorMixinCallerRaw is an auto generated low-level read-only Go binding around an Ethereum contract.
type LeafCalculatorMixinCallerRaw struct {
	Contract *LeafCalculatorMixinCaller // Generic read-only contract binding to access the raw methods on
}
⋮----
Contract *LeafCalculatorMixinCaller // Generic read-only contract binding to access the raw methods on
⋮----
// LeafCalculatorMixinTransactorRaw is an auto generated low-level write-only Go binding around an Ethereum contract.
type LeafCalculatorMixinTransactorRaw struct {
	Contract *LeafCalculatorMixinTransactor // Generic write-only contract binding to access the raw methods on
}
⋮----
Contract *LeafCalculatorMixinTransactor // Generic write-only contract binding to access the raw methods on
⋮----
// NewLeafCalculatorMixin creates a new instance of LeafCalculatorMixin, bound to a specific deployed contract.
func NewLeafCalculatorMixin(address common.Address, backend bind.ContractBackend) (*LeafCalculatorMixin, error)
⋮----
// NewLeafCalculatorMixinCaller creates a new read-only instance of LeafCalculatorMixin, bound to a specific deployed contract.
func NewLeafCalculatorMixinCaller(address common.Address, caller bind.ContractCaller) (*LeafCalculatorMixinCaller, error)
⋮----
// NewLeafCalculatorMixinTransactor creates a new write-only instance of LeafCalculatorMixin, bound to a specific deployed contract.
func NewLeafCalculatorMixinTransactor(address common.Address, transactor bind.ContractTransactor) (*LeafCalculatorMixinTransactor, error)
⋮----
// NewLeafCalculatorMixinFilterer creates a new log filterer instance of LeafCalculatorMixin, bound to a specific deployed contract.
func NewLeafCalculatorMixinFilterer(address common.Address, filterer bind.ContractFilterer) (*LeafCalculatorMixinFilterer, error)
⋮----
// bindLeafCalculatorMixin binds a generic wrapper to an already deployed contract.
func bindLeafCalculatorMixin(address common.Address, caller bind.ContractCaller, transactor bind.ContractTransactor, filterer bind.ContractFilterer) (*bind.BoundContract, error)
⋮----
// 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 (_LeafCalculatorMixin *LeafCalculatorMixinRaw) Call(opts *bind.CallOpts, result *[]interface
⋮----
// Transfer initiates a plain transaction to move funds to the contract, calling
// its default method if one is available.
func (_LeafCalculatorMixin *LeafCalculatorMixinRaw) Transfer(opts *bind.TransactOpts) (*types.Transaction, error)
⋮----
// Transact invokes the (paid) contract method with params as input values.
func (_LeafCalculatorMixin *LeafCalculatorMixinRaw) Transact(opts *bind.TransactOpts, method string, params ...interface
⋮----
// OPERATORINFOLEAFSALT is a free data retrieval call binding the contract method 0xa2c902f5.
//
// Solidity: function OPERATOR_INFO_LEAF_SALT() view returns(uint8)
func (_LeafCalculatorMixin *LeafCalculatorMixinCaller) OPERATORINFOLEAFSALT(opts *bind.CallOpts) (uint8, error)
⋮----
var out []interface{}
⋮----
// OPERATORTABLELEAFSALT is a free data retrieval call binding the contract method 0x121409ea.
⋮----
// Solidity: function OPERATOR_TABLE_LEAF_SALT() view returns(uint8)
func (_LeafCalculatorMixin *LeafCalculatorMixinCaller) OPERATORTABLELEAFSALT(opts *bind.CallOpts) (uint8, error)
⋮----
// CalculateOperatorInfoLeaf is a free data retrieval call binding the contract method 0x538a3790.
⋮----
// Solidity: function calculateOperatorInfoLeaf(((uint256,uint256),uint256[]) operatorInfo) pure returns(bytes32)
func (_LeafCalculatorMixin *LeafCalculatorMixinCaller) CalculateOperatorInfoLeaf(opts *bind.CallOpts, operatorInfo IOperatorTableCalculatorTypesBN254OperatorInfo) ([32]byte, error)
⋮----
// CalculateOperatorTableLeaf is a free data retrieval call binding the contract method 0xa2f2e24d.
⋮----
// Solidity: function calculateOperatorTableLeaf(bytes operatorTableBytes) pure returns(bytes32)
func (_LeafCalculatorMixin *LeafCalculatorMixinCaller) CalculateOperatorTableLeaf(opts *bind.CallOpts, operatorTableBytes []byte) ([32]byte, error)
````

## File: pkg/bindings/Merkle/binding.go
````go
// Code generated - DO NOT EDIT.
// This file is a generated binding and any manual changes will be lost.
⋮----
package Merkle
⋮----
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"
)
⋮----
"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
)
⋮----
// MerkleMetaData contains all meta data concerning the Merkle contract.
var MerkleMetaData = &bind.MetaData{
	ABI: "[{\"type\":\"error\",\"name\":\"EmptyRoot\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidIndex\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidProofLength\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"LeavesNotPowerOfTwo\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"NoLeaves\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"NotEnoughLeaves\",\"inputs\":[]}]",
	Bin: "0x60556032600b8282823980515f1a607314602657634e487b7160e01b5f525f60045260245ffd5b305f52607381538281f3fe730000000000000000000000000000000000000000301460806040525f5ffdfea2646970667358221220d59da8641ede146e3c844faefb393dcc8a753d97dc94bdb0fcfe9e5e7484e7ef64736f6c634300081e0033",
}
⋮----
// MerkleABI is the input ABI used to generate the binding from.
// Deprecated: Use MerkleMetaData.ABI instead.
var MerkleABI = MerkleMetaData.ABI
⋮----
// MerkleBin is the compiled bytecode used for deploying new contracts.
// Deprecated: Use MerkleMetaData.Bin instead.
var MerkleBin = MerkleMetaData.Bin
⋮----
// DeployMerkle deploys a new Ethereum contract, binding an instance of Merkle to it.
func DeployMerkle(auth *bind.TransactOpts, backend bind.ContractBackend) (common.Address, *types.Transaction, *Merkle, error)
⋮----
// Merkle is an auto generated Go binding around an Ethereum contract.
type Merkle struct {
	MerkleCaller     // Read-only binding to the contract
	MerkleTransactor // Write-only binding to the contract
	MerkleFilterer   // Log filterer for contract events
}
⋮----
MerkleCaller     // Read-only binding to the contract
MerkleTransactor // Write-only binding to the contract
MerkleFilterer   // Log filterer for contract events
⋮----
// MerkleCaller is an auto generated read-only Go binding around an Ethereum contract.
type MerkleCaller struct {
	contract *bind.BoundContract // Generic contract wrapper for the low level calls
}
⋮----
contract *bind.BoundContract // Generic contract wrapper for the low level calls
⋮----
// MerkleTransactor is an auto generated write-only Go binding around an Ethereum contract.
type MerkleTransactor struct {
	contract *bind.BoundContract // Generic contract wrapper for the low level calls
}
⋮----
// MerkleFilterer is an auto generated log filtering Go binding around an Ethereum contract events.
type MerkleFilterer struct {
	contract *bind.BoundContract // Generic contract wrapper for the low level calls
}
⋮----
// MerkleSession is an auto generated Go binding around an Ethereum contract,
// with pre-set call and transact options.
type MerkleSession struct {
	Contract     *Merkle           // 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
}
⋮----
Contract     *Merkle           // 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
⋮----
// MerkleCallerSession is an auto generated read-only Go binding around an Ethereum contract,
// with pre-set call options.
type MerkleCallerSession struct {
	Contract *MerkleCaller // Generic contract caller binding to set the session for
	CallOpts bind.CallOpts // Call options to use throughout this session
}
⋮----
Contract *MerkleCaller // Generic contract caller binding to set the session for
CallOpts bind.CallOpts // Call options to use throughout this session
⋮----
// MerkleTransactorSession is an auto generated write-only Go binding around an Ethereum contract,
// with pre-set transact options.
type MerkleTransactorSession struct {
	Contract     *MerkleTransactor // Generic contract transactor binding to set the session for
	TransactOpts bind.TransactOpts // Transaction auth options to use throughout this session
}
⋮----
Contract     *MerkleTransactor // Generic contract transactor binding to set the session for
⋮----
// MerkleRaw is an auto generated low-level Go binding around an Ethereum contract.
type MerkleRaw struct {
	Contract *Merkle // Generic contract binding to access the raw methods on
}
⋮----
Contract *Merkle // Generic contract binding to access the raw methods on
⋮----
// MerkleCallerRaw is an auto generated low-level read-only Go binding around an Ethereum contract.
type MerkleCallerRaw struct {
	Contract *MerkleCaller // Generic read-only contract binding to access the raw methods on
}
⋮----
Contract *MerkleCaller // Generic read-only contract binding to access the raw methods on
⋮----
// MerkleTransactorRaw is an auto generated low-level write-only Go binding around an Ethereum contract.
type MerkleTransactorRaw struct {
	Contract *MerkleTransactor // Generic write-only contract binding to access the raw methods on
}
⋮----
Contract *MerkleTransactor // Generic write-only contract binding to access the raw methods on
⋮----
// NewMerkle creates a new instance of Merkle, bound to a specific deployed contract.
func NewMerkle(address common.Address, backend bind.ContractBackend) (*Merkle, error)
⋮----
// NewMerkleCaller creates a new read-only instance of Merkle, bound to a specific deployed contract.
func NewMerkleCaller(address common.Address, caller bind.ContractCaller) (*MerkleCaller, error)
⋮----
// NewMerkleTransactor creates a new write-only instance of Merkle, bound to a specific deployed contract.
func NewMerkleTransactor(address common.Address, transactor bind.ContractTransactor) (*MerkleTransactor, error)
⋮----
// NewMerkleFilterer creates a new log filterer instance of Merkle, bound to a specific deployed contract.
func NewMerkleFilterer(address common.Address, filterer bind.ContractFilterer) (*MerkleFilterer, error)
⋮----
// bindMerkle binds a generic wrapper to an already deployed contract.
func bindMerkle(address common.Address, caller bind.ContractCaller, transactor bind.ContractTransactor, filterer bind.ContractFilterer) (*bind.BoundContract, error)
⋮----
// 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 (_Merkle *MerkleRaw) Call(opts *bind.CallOpts, result *[]interface
⋮----
// Transfer initiates a plain transaction to move funds to the contract, calling
// its default method if one is available.
func (_Merkle *MerkleRaw) Transfer(opts *bind.TransactOpts) (*types.Transaction, error)
⋮----
// Transact invokes the (paid) contract method with params as input values.
func (_Merkle *MerkleRaw) Transact(opts *bind.TransactOpts, method string, params ...interface
````

## File: pkg/bindings/OperatorSetLib/binding.go
````go
// Code generated - DO NOT EDIT.
// This file is a generated binding and any manual changes will be lost.
⋮----
package OperatorSetLib
⋮----
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"
)
⋮----
"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
)
⋮----
// OperatorSetLibMetaData contains all meta data concerning the OperatorSetLib contract.
var OperatorSetLibMetaData = &bind.MetaData{
	ABI: "[]",
	Bin: "0x60556032600b8282823980515f1a607314602657634e487b7160e01b5f525f60045260245ffd5b305f52607381538281f3fe730000000000000000000000000000000000000000301460806040525f5ffdfea264697066735822122085b2452bf0f2a77203246c6256e1196dda1229bc8916f41d3cd62061d65f1a7464736f6c634300081e0033",
}
⋮----
// OperatorSetLibABI is the input ABI used to generate the binding from.
// Deprecated: Use OperatorSetLibMetaData.ABI instead.
var OperatorSetLibABI = OperatorSetLibMetaData.ABI
⋮----
// OperatorSetLibBin is the compiled bytecode used for deploying new contracts.
// Deprecated: Use OperatorSetLibMetaData.Bin instead.
var OperatorSetLibBin = OperatorSetLibMetaData.Bin
⋮----
// DeployOperatorSetLib deploys a new Ethereum contract, binding an instance of OperatorSetLib to it.
func DeployOperatorSetLib(auth *bind.TransactOpts, backend bind.ContractBackend) (common.Address, *types.Transaction, *OperatorSetLib, error)
⋮----
// OperatorSetLib is an auto generated Go binding around an Ethereum contract.
type OperatorSetLib struct {
	OperatorSetLibCaller     // Read-only binding to the contract
	OperatorSetLibTransactor // Write-only binding to the contract
	OperatorSetLibFilterer   // Log filterer for contract events
}
⋮----
OperatorSetLibCaller     // Read-only binding to the contract
OperatorSetLibTransactor // Write-only binding to the contract
OperatorSetLibFilterer   // Log filterer for contract events
⋮----
// OperatorSetLibCaller is an auto generated read-only Go binding around an Ethereum contract.
type OperatorSetLibCaller struct {
	contract *bind.BoundContract // Generic contract wrapper for the low level calls
}
⋮----
contract *bind.BoundContract // Generic contract wrapper for the low level calls
⋮----
// OperatorSetLibTransactor is an auto generated write-only Go binding around an Ethereum contract.
type OperatorSetLibTransactor struct {
	contract *bind.BoundContract // Generic contract wrapper for the low level calls
}
⋮----
// OperatorSetLibFilterer is an auto generated log filtering Go binding around an Ethereum contract events.
type OperatorSetLibFilterer struct {
	contract *bind.BoundContract // Generic contract wrapper for the low level calls
}
⋮----
// OperatorSetLibSession is an auto generated Go binding around an Ethereum contract,
// with pre-set call and transact options.
type OperatorSetLibSession struct {
	Contract     *OperatorSetLib   // 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
}
⋮----
Contract     *OperatorSetLib   // 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
⋮----
// OperatorSetLibCallerSession is an auto generated read-only Go binding around an Ethereum contract,
// with pre-set call options.
type OperatorSetLibCallerSession struct {
	Contract *OperatorSetLibCaller // Generic contract caller binding to set the session for
	CallOpts bind.CallOpts         // Call options to use throughout this session
}
⋮----
Contract *OperatorSetLibCaller // Generic contract caller binding to set the session for
CallOpts bind.CallOpts         // Call options to use throughout this session
⋮----
// OperatorSetLibTransactorSession is an auto generated write-only Go binding around an Ethereum contract,
// with pre-set transact options.
type OperatorSetLibTransactorSession struct {
	Contract     *OperatorSetLibTransactor // Generic contract transactor binding to set the session for
	TransactOpts bind.TransactOpts         // Transaction auth options to use throughout this session
}
⋮----
Contract     *OperatorSetLibTransactor // Generic contract transactor binding to set the session for
TransactOpts bind.TransactOpts         // Transaction auth options to use throughout this session
⋮----
// OperatorSetLibRaw is an auto generated low-level Go binding around an Ethereum contract.
type OperatorSetLibRaw struct {
	Contract *OperatorSetLib // Generic contract binding to access the raw methods on
}
⋮----
Contract *OperatorSetLib // Generic contract binding to access the raw methods on
⋮----
// OperatorSetLibCallerRaw is an auto generated low-level read-only Go binding around an Ethereum contract.
type OperatorSetLibCallerRaw struct {
	Contract *OperatorSetLibCaller // Generic read-only contract binding to access the raw methods on
}
⋮----
Contract *OperatorSetLibCaller // Generic read-only contract binding to access the raw methods on
⋮----
// OperatorSetLibTransactorRaw is an auto generated low-level write-only Go binding around an Ethereum contract.
type OperatorSetLibTransactorRaw struct {
	Contract *OperatorSetLibTransactor // Generic write-only contract binding to access the raw methods on
}
⋮----
Contract *OperatorSetLibTransactor // Generic write-only contract binding to access the raw methods on
⋮----
// NewOperatorSetLib creates a new instance of OperatorSetLib, bound to a specific deployed contract.
func NewOperatorSetLib(address common.Address, backend bind.ContractBackend) (*OperatorSetLib, error)
⋮----
// NewOperatorSetLibCaller creates a new read-only instance of OperatorSetLib, bound to a specific deployed contract.
func NewOperatorSetLibCaller(address common.Address, caller bind.ContractCaller) (*OperatorSetLibCaller, error)
⋮----
// NewOperatorSetLibTransactor creates a new write-only instance of OperatorSetLib, bound to a specific deployed contract.
func NewOperatorSetLibTransactor(address common.Address, transactor bind.ContractTransactor) (*OperatorSetLibTransactor, error)
⋮----
// NewOperatorSetLibFilterer creates a new log filterer instance of OperatorSetLib, bound to a specific deployed contract.
func NewOperatorSetLibFilterer(address common.Address, filterer bind.ContractFilterer) (*OperatorSetLibFilterer, error)
⋮----
// bindOperatorSetLib binds a generic wrapper to an already deployed contract.
func bindOperatorSetLib(address common.Address, caller bind.ContractCaller, transactor bind.ContractTransactor, filterer bind.ContractFilterer) (*bind.BoundContract, error)
⋮----
// 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 (_OperatorSetLib *OperatorSetLibRaw) Call(opts *bind.CallOpts, result *[]interface
⋮----
// Transfer initiates a plain transaction to move funds to the contract, calling
// its default method if one is available.
func (_OperatorSetLib *OperatorSetLibRaw) Transfer(opts *bind.TransactOpts) (*types.Transaction, error)
⋮----
// Transact invokes the (paid) contract method with params as input values.
func (_OperatorSetLib *OperatorSetLibRaw) Transact(opts *bind.TransactOpts, method string, params ...interface
````

## File: pkg/bindings/OperatorTableUpdater/binding.go
````go
// Code generated - DO NOT EDIT.
// This file is a generated binding and any manual changes will be lost.
⋮----
package OperatorTableUpdater
⋮----
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"
)
⋮----
"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
)
⋮----
// BN254G1Point is an auto generated low-level Go binding around an user-defined struct.
type BN254G1Point struct {
	X *big.Int
	Y *big.Int
}
⋮----
// BN254G2Point is an auto generated low-level Go binding around an user-defined struct.
type BN254G2Point struct {
	X [2]*big.Int
	Y [2]*big.Int
}
⋮----
// IBN254CertificateVerifierTypesBN254Certificate is an auto generated low-level Go binding around an user-defined struct.
type IBN254CertificateVerifierTypesBN254Certificate struct {
	ReferenceTimestamp uint32
	MessageHash        [32]byte
	Signature          BN254G1Point
	Apk                BN254G2Point
	NonSignerWitnesses []IBN254CertificateVerifierTypesBN254OperatorInfoWitness
}
⋮----
// IBN254CertificateVerifierTypesBN254OperatorInfoWitness is an auto generated low-level Go binding around an user-defined struct.
type IBN254CertificateVerifierTypesBN254OperatorInfoWitness struct {
	OperatorIndex     uint32
	OperatorInfoProof []byte
	OperatorInfo      IOperatorTableCalculatorTypesBN254OperatorInfo
}
⋮----
// ICrossChainRegistryTypesOperatorSetConfig is an auto generated low-level Go binding around an user-defined struct.
type ICrossChainRegistryTypesOperatorSetConfig struct {
	Owner              common.Address
	MaxStalenessPeriod uint32
}
⋮----
// IOperatorTableCalculatorTypesBN254OperatorInfo is an auto generated low-level Go binding around an user-defined struct.
type IOperatorTableCalculatorTypesBN254OperatorInfo struct {
	Pubkey  BN254G1Point
	Weights []*big.Int
}
⋮----
// IOperatorTableCalculatorTypesBN254OperatorSetInfo is an auto generated low-level Go binding around an user-defined struct.
type IOperatorTableCalculatorTypesBN254OperatorSetInfo struct {
	OperatorInfoTreeRoot [32]byte
	NumOperators         *big.Int
	AggregatePubkey      BN254G1Point
	TotalWeights         []*big.Int
}
⋮----
// OperatorSet is an auto generated low-level Go binding around an user-defined struct.
type OperatorSet struct {
	Avs common.Address
	Id  uint32
}
⋮----
// OperatorTableUpdaterMetaData contains all meta data concerning the OperatorTableUpdater contract.
var OperatorTableUpdaterMetaData = &bind.MetaData{
	ABI: "[{\"type\":\"constructor\",\"inputs\":[{\"name\":\"_bn254CertificateVerifier\",\"type\":\"address\",\"internalType\":\"contractIBN254CertificateVerifier\"},{\"name\":\"_ecdsaCertificateVerifier\",\"type\":\"address\",\"internalType\":\"contractIECDSACertificateVerifier\"},{\"name\":\"_pauserRegistry\",\"type\":\"address\",\"internalType\":\"contractIPauserRegistry\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"GENERATOR_GLOBAL_TABLE_ROOT\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"GENERATOR_MAX_STALENESS_PERIOD\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"GENERATOR_REFERENCE_TIMESTAMP\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"GLOBAL_TABLE_ROOT_CERT_TYPEHASH\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"MAX_BPS\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint16\",\"internalType\":\"uint16\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"OPERATOR_INFO_LEAF_SALT\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint8\",\"internalType\":\"uint8\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"OPERATOR_TABLE_LEAF_SALT\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint8\",\"internalType\":\"uint8\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"bn254CertificateVerifier\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIBN254CertificateVerifier\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"calculateOperatorInfoLeaf\",\"inputs\":[{\"name\":\"operatorInfo\",\"type\":\"tuple\",\"internalType\":\"structIOperatorTableCalculatorTypes.BN254OperatorInfo\",\"components\":[{\"name\":\"pubkey\",\"type\":\"tuple\",\"internalType\":\"structBN254.G1Point\",\"components\":[{\"name\":\"X\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"Y\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]},{\"name\":\"weights\",\"type\":\"uint256[]\",\"internalType\":\"uint256[]\"}]}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"pure\"},{\"type\":\"function\",\"name\":\"calculateOperatorTableLeaf\",\"inputs\":[{\"name\":\"operatorTableBytes\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"pure\"},{\"type\":\"function\",\"name\":\"confirmGlobalTableRoot\",\"inputs\":[{\"name\":\"globalTableRootCert\",\"type\":\"tuple\",\"internalType\":\"structIBN254CertificateVerifierTypes.BN254Certificate\",\"components\":[{\"name\":\"referenceTimestamp\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"messageHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"signature\",\"type\":\"tuple\",\"internalType\":\"structBN254.G1Point\",\"components\":[{\"name\":\"X\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"Y\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]},{\"name\":\"apk\",\"type\":\"tuple\",\"internalType\":\"structBN254.G2Point\",\"components\":[{\"name\":\"X\",\"type\":\"uint256[2]\",\"internalType\":\"uint256[2]\"},{\"name\":\"Y\",\"type\":\"uint256[2]\",\"internalType\":\"uint256[2]\"}]},{\"name\":\"nonSignerWitnesses\",\"type\":\"tuple[]\",\"internalType\":\"structIBN254CertificateVerifierTypes.BN254OperatorInfoWitness[]\",\"components\":[{\"name\":\"operatorIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"operatorInfoProof\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"operatorInfo\",\"type\":\"tuple\",\"internalType\":\"structIOperatorTableCalculatorTypes.BN254OperatorInfo\",\"components\":[{\"name\":\"pubkey\",\"type\":\"tuple\",\"internalType\":\"structBN254.G1Point\",\"components\":[{\"name\":\"X\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"Y\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]},{\"name\":\"weights\",\"type\":\"uint256[]\",\"internalType\":\"uint256[]\"}]}]}]},{\"name\":\"globalTableRoot\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"referenceTimestamp\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"referenceBlockNumber\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"disableRoot\",\"inputs\":[{\"name\":\"globalTableRoot\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"ecdsaCertificateVerifier\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIECDSACertificateVerifier\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getCertificateVerifier\",\"inputs\":[{\"name\":\"curveType\",\"type\":\"uint8\",\"internalType\":\"enumIKeyRegistrarTypes.CurveType\"}],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getCurrentGlobalTableRoot\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getGenerator\",\"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\":\"getGeneratorConfig\",\"inputs\":[],\"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\":\"getGeneratorReferenceTimestamp\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getGlobalTableRootByTimestamp\",\"inputs\":[{\"name\":\"referenceTimestamp\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getGlobalTableUpdateMessageHash\",\"inputs\":[{\"name\":\"globalTableRoot\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"referenceTimestamp\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"referenceBlockNumber\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"pure\"},{\"type\":\"function\",\"name\":\"getGlobalTableUpdateSignableDigest\",\"inputs\":[{\"name\":\"globalTableRoot\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"referenceTimestamp\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"referenceBlockNumber\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getLatestReferenceBlockNumber\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getLatestReferenceTimestamp\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getReferenceBlockNumberByTimestamp\",\"inputs\":[{\"name\":\"referenceTimestamp\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getReferenceTimestampByBlockNumber\",\"inputs\":[{\"name\":\"referenceBlockNumber\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"globalRootConfirmationThreshold\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint16\",\"internalType\":\"uint16\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"initialize\",\"inputs\":[{\"name\":\"_owner\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"initialPausedStatus\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"_initialGenerator\",\"type\":\"tuple\",\"internalType\":\"structOperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]},{\"name\":\"_globalRootConfirmationThreshold\",\"type\":\"uint16\",\"internalType\":\"uint16\"},{\"name\":\"generatorInfo\",\"type\":\"tuple\",\"internalType\":\"structIOperatorTableCalculatorTypes.BN254OperatorSetInfo\",\"components\":[{\"name\":\"operatorInfoTreeRoot\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"numOperators\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"aggregatePubkey\",\"type\":\"tuple\",\"internalType\":\"structBN254.G1Point\",\"components\":[{\"name\":\"X\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"Y\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]},{\"name\":\"totalWeights\",\"type\":\"uint256[]\",\"internalType\":\"uint256[]\"}]}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"isRootValid\",\"inputs\":[{\"name\":\"globalTableRoot\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"isRootValidByTimestamp\",\"inputs\":[{\"name\":\"referenceTimestamp\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"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\":\"renounceOwnership\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"setGlobalRootConfirmationThreshold\",\"inputs\":[{\"name\":\"bps\",\"type\":\"uint16\",\"internalType\":\"uint16\"}],\"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\":\"updateGenerator\",\"inputs\":[{\"name\":\"generator\",\"type\":\"tuple\",\"internalType\":\"structOperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]},{\"name\":\"generatorInfo\",\"type\":\"tuple\",\"internalType\":\"structIOperatorTableCalculatorTypes.BN254OperatorSetInfo\",\"components\":[{\"name\":\"operatorInfoTreeRoot\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"numOperators\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"aggregatePubkey\",\"type\":\"tuple\",\"internalType\":\"structBN254.G1Point\",\"components\":[{\"name\":\"X\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"Y\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]},{\"name\":\"totalWeights\",\"type\":\"uint256[]\",\"internalType\":\"uint256[]\"}]}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"updateOperatorTable\",\"inputs\":[{\"name\":\"referenceTimestamp\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"globalTableRoot\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"operatorSetIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"proof\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"operatorTableBytes\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"event\",\"name\":\"GeneratorUpdated\",\"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\":\"GlobalRootConfirmationThresholdUpdated\",\"inputs\":[{\"name\":\"bps\",\"type\":\"uint16\",\"indexed\":false,\"internalType\":\"uint16\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"GlobalRootDisabled\",\"inputs\":[{\"name\":\"globalTableRoot\",\"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\":\"NewGlobalTableRoot\",\"inputs\":[{\"name\":\"referenceTimestamp\",\"type\":\"uint32\",\"indexed\":true,\"internalType\":\"uint32\"},{\"name\":\"globalTableRoot\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"}],\"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\":\"CannotDisableGeneratorRoot\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"CertificateInvalid\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"CurrentlyPaused\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"EmptyRoot\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"GlobalTableRootInFuture\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"GlobalTableRootStale\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InputAddressZero\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidConfirmationThreshold\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidCurveType\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidGenerator\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidGlobalTableRoot\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidIndex\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidMessageHash\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidNewPausedStatus\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidOperatorSet\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidOperatorSetProof\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidProofLength\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidRoot\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"OnlyPauser\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"OnlyUnpauser\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"TableUpdateForPastTimestamp\",\"inputs\":[]}]",
	Bin: "0x60e060405234801561000f575f5ffd5b50604051612c1c380380612c1c83398101604081905261002e91610153565b8282826001600160a01b038116610058576040516339b190bb60e11b815260040160405180910390fd5b6001600160a01b0390811660805291821660a0521660c052610078610080565b50505061019d565b5f54610100900460ff16156100eb5760405162461bcd60e51b815260206004820152602760248201527f496e697469616c697a61626c653a20636f6e747261637420697320696e697469604482015266616c697a696e6760c81b606482015260840160405180910390fd5b5f5460ff9081161461013a575f805460ff191660ff9081179091556040519081527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b565b6001600160a01b0381168114610150575f5ffd5b50565b5f5f5f60608486031215610165575f5ffd5b83516101708161013c565b60208501519093506101818161013c565b60408501519092506101928161013c565b809150509250925092565b60805160a05160c051612a086102145f395f818161059501528181610a5d0152610e2201525f81816105fc0152818161092101528181610a1d01528181610ac901528181610d7d015281816110f7015281816113e0015261149201525f818161051c015281816115be015261186d0152612a085ff3fe608060405234801561000f575f5ffd5b506004361061024a575f3560e01c80636f728c5011610140578063ad0f9582116100bf578063c3be1e3311610084578063c3be1e3314610652578063c5916a3914610665578063eaaed9d51461068a578063f2fde38b1461069d578063fabc1cbc146106b0578063fd967f47146106c3575f5ffd5b8063ad0f958214610590578063b0cb3a24146105b7578063b8c14306146105f7578063c252aa221461061e578063c3621f0a1461063f575f5ffd5b80638da5cb5b116101055780638da5cb5b1461053e5780639ea947781461054f5780639f7e206f14610562578063a2c902f514610575578063a2f2e24d1461057d575f5ffd5b80636f728c50146104d5578063715018a6146105005780637551ba3414610508578063790961ea14610510578063886f119514610517575f5ffd5b806331a599d2116101cc578063595c6a6711610191578063595c6a67146104655780635ac86ab71461046d5780635c975abb14610490578063612abcb01461049857806364e1df84146104a0575f5ffd5b806331a599d2146103df5780633ef6cd7a14610404578063401c370f1461042b5780634624e6a31461043e578063538a379014610452575f5ffd5b80631e2ca260116102125780631e2ca260146103075780632370356c1461035057806323b7b5b21461036357806328522d791461038b57806330ef41b4146103ad575f5ffd5b806306f518751461024e578063121409ea14610263578063136439dd14610282578063193b79f3146102955780631bdc0deb146102d2575b5f5ffd5b61026161025c366004611aa0565b6106cc565b005b61026b608e81565b60405160ff90911681526020015b60405180910390f35b610261610290366004611b16565b6108a6565b6102bd6102a3366004611b3e565b63ffffffff9081165f908152609b60205260409020541690565b60405163ffffffff9091168152602001610279565b6102f97fcefe99cb2e240b5f07de5cd472a75fc6e345370b73588ab161cb25c4a259a86981565b604051908152602001610279565b6040805180820182525f80825260209182015281518083019092526098546001600160a01b0381168352600160a01b900463ffffffff16908201525b6040516102799190611b77565b61026161035e366004611b85565b6108e0565b6102bd610371366004611b3e565b63ffffffff9081165f908152609a60205260409020541690565b60975462010000900463ffffffff165f908152609960205260409020546102f9565b6103cf6103bb366004611b16565b5f908152609c602052604090205460ff1690565b6040519015158152602001610279565b60975462010000900463ffffffff9081165f908152609a6020526040902054166102bd565b6102f97f4491f5ee91595f938885ef73c9a1fa8a6d14ff9b9dab4aa24b8802bbb9bfc1cc81565b6102f9610439366004611b9e565b6108f4565b60975462010000900463ffffffff166102bd565b6102f9610460366004611c8d565b61099d565b6102616109ec565b6103cf61047b366004611d85565b606654600160ff9092169190911b9081161490565b6066546102f9565b6102bd600181565b6103cf6104ae366004611b3e565b63ffffffff165f908152609960209081526040808320548352609c90915290205460ff1690565b6104e86104e3366004611db3565b610a00565b6040516001600160a01b039091168152602001610279565b610261610a9f565b6102bd610ab0565b6102bd5f81565b6104e87f000000000000000000000000000000000000000000000000000000000000000081565b6033546001600160a01b03166104e8565b61026161055d366004611e10565b610b43565b610261610570366004611eab565b610e93565b61026b607581565b6102f961058b366004611ef6565b610ea5565b6104e87f000000000000000000000000000000000000000000000000000000000000000081565b6040805180820182525f8082526020918201528151808301909252609d546001600160a01b0381168352600160a01b900463ffffffff1690820152610343565b6104e87f000000000000000000000000000000000000000000000000000000000000000081565b60975461062c9061ffff1681565b60405161ffff9091168152602001610279565b61026161064d366004611b16565b610edb565b6102f9610660366004611b9e565b610f90565b6102f9610673366004611b3e565b63ffffffff165f9081526099602052604090205490565b610261610698366004611f34565b610ff8565b6102616106ab366004611fa0565b611247565b6102616106be366004611b16565b6112bd565b61062c61271081565b5f54610100900460ff16158080156106ea57505f54600160ff909116105b806107035750303b15801561070357505f5460ff166001145b61076b5760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b60648201526084015b60405180910390fd5b5f805460ff19166001179055801561078c575f805461ff0019166101001790555b6107958661132a565b61079e8561137b565b609d80546001600160c01b031916301790556107ba84836113b8565b6107c383611538565b7fcefe99cb2e240b5f07de5cd472a75fc6e345370b73588ab161cb25c4a259a8697fbb86fbc034f4e382929974bcd8419ed626b0ea647f962d89ba2fb6bd28785ab98190555f52609c6020527f38353ab40115e4013d688e07cff5857dde443bd05e72c49fcb5e684a9bb9efc4805460ff19166001179055609780544263ffffffff16620100000265ffffffff000019909116179055801561089e575f805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b505050505050565b6108ae6115a9565b60665481811681146108d35760405163c61dca5d60e01b815260040160405180910390fd5b6108dc8261137b565b5050565b6108e861164c565b6108f181611538565b50565b5f5f610901858585610f90565b6040516306119d0d60e21b815260016004820152602481018290529091507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031690631846743490604401602060405180830381865afa15801561096e573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906109929190611fbb565b9150505b9392505050565b5f6075826040516020016109b1919061200c565b60408051601f19818403018152908290526109cf9291602001612039565b604051602081830303815290604052805190602001209050919050565b6109f46115a9565b6109fe5f1961137b565b565b5f6002826002811115610a1557610a15612062565b03610a4157507f0000000000000000000000000000000000000000000000000000000000000000919050565b6001826002811115610a5557610a55612062565b03610a8157507f0000000000000000000000000000000000000000000000000000000000000000919050565b60405163fdea7c0960e01b815260040160405180910390fd5b919050565b610aa761164c565b6109fe5f61132a565b604051635ddb9b5b60e01b81525f906001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001690635ddb9b5b90610aff90609890600401612076565b602060405180830381865afa158015610b1a573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610b3e919061209d565b905090565b6001610b4e816116a6565b610b566116d1565b5f5f5f5f610b64878761172a565b5f8f8152609c60205260409020549397509195509350915060ff16610b9c5760405163504570e360e01b815260040160405180910390fd5b604080518082019091526098546001600160a01b0381168252600160a01b900463ffffffff166020820152610bd090611771565b610bd985611771565b03610bf757604051631fb1705560e21b815260040160405180910390fd5b610c0083610a00565b6001600160a01b031663cd83a72b858e6040518363ffffffff1660e01b8152600401610c2d9291906120b8565b602060405180830381865afa158015610c48573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610c6c91906120d9565b15610c7a5750505050610e7f565b610c8383610a00565b6001600160a01b0316635ddb9b5b856040518263ffffffff1660e01b8152600401610cae9190611b77565b602060405180830381865afa158015610cc9573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610ced919061209d565b63ffffffff168c63ffffffff1611610d185760405163207617df60e01b815260040160405180910390fd5b63ffffffff8c165f908152609960205260409020548b14610d4c5760405163639d09b560e11b815260040160405180910390fd5b610d628b8b8b8b610d5d8c8c610ea5565b6117d4565b6002836002811115610d7657610d76612062565b03610e07577f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316636738c40b858e610db585611839565b866040518563ffffffff1660e01b8152600401610dd594939291906120f8565b5f604051808303815f87803b158015610dec575f5ffd5b505af1158015610dfe573d5f5f3e3d5ffd5b50505050610e7a565b6001836002811115610e1b57610e1b612062565b03610a81577f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166356d482f5858e610e5a85611855565b866040518563ffffffff1660e01b8152600401610dd59493929190612179565b505050505b610e89600160c955565b5050505050505050565b610e9b61164c565b6108dc82826113b8565b5f608e8383604051602001610ebc9392919061221e565b6040516020818303038152906040528051906020012090505b92915050565b610ee36115a9565b5f818152609c602052604090205460ff16610f115760405163504570e360e01b815260040160405180910390fd5b7fcefe99cb2e240b5f07de5cd472a75fc6e345370b73588ab161cb25c4a259a8698103610f51576040516319920afd60e11b815260040160405180910390fd5b5f818152609c6020526040808220805460ff191690555182917f8bd43de1250f58fe6ec9a78671a8b78dba70f0018656d157a3aeaabec389df3491a250565b604080517f4491f5ee91595f938885ef73c9a1fa8a6d14ff9b9dab4aa24b8802bbb9bfc1cc602082015290810184905263ffffffff8084166060830152821660808201525f9060a0016040516020818303038152906040528051906020012090509392505050565b5f611002816116a6565b61100a6116d1565b428363ffffffff16111561103157604051635a119db560e11b815260040160405180910390fd5b60975463ffffffff620100009091048116908416116110635760405163037fa86b60e31b815260040160405180910390fd5b61106e848484610f90565b85602001351461109157604051638b56642d60e01b815260040160405180910390fd5b6040805160018082528183019092525f91602080830190803683375050609754825192935061ffff16918391505f906110cc576110cc612245565b61ffff90921660209283029190910190910152604051625f5e5d60e21b81525f906001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169063017d797490611131906098908b908790600401612377565b6020604051808303815f875af115801561114d573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061117191906120d9565b90508061119157604051633042041f60e21b815260040160405180910390fd5b6097805463ffffffff80881662010000810265ffffffff000019909316929092179092555f818152609a602090815260408083208054958a1663ffffffff1996871681179091558352609b825280832080549095168417909455828252609981528382208a9055898252609c9052828120805460ff19166001179055915188927f010dcbe0d1e019c93357711f7bb6287d543b7ff7de74f29df3fb5ecceec8d36991a35050611240600160c955565b5050505050565b61124f61164c565b6001600160a01b0381166112b45760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610762565b6108f18161132a565b6112c561186b565b606654801982198116146112ec5760405163c61dca5d60e01b815260040160405180910390fd5b606682905560405182815233907f3582d1828e26bf56bd801502bc021ac0bc8afb57c826e4986b45593c8fad389c9060200160405180910390a25050565b603380546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a35050565b606681905560405181815233907fab40a374bc51de372200a8bc981af8c9ecdc08dfdaef0bb6e09f88f3c616ef3d9060200160405180910390a250565b8160986113c58282612504565b5050604051635ddb9b5b60e01b81525f906001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001690635ddb9b5b90611415908690600401612595565b602060405180830381865afa158015611430573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611454919061209d565b905063ffffffff81161561147b57604051636446f91760e01b815260040160405180910390fd5b604051636738c40b60e01b81526001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001690636738c40b906114cf9086906001908790609d906004016125a3565b5f604051808303815f87803b1580156114e6575f5ffd5b505af11580156114f8573d5f5f3e3d5ffd5b505050507f3463431b09dfd43dec7349f8f24acfa753fe4cf40a26235402d213373df158568360405161152b9190612595565b60405180910390a1505050565b61271061ffff8216111561155f576040516307336f0360e11b815260040160405180910390fd5b6097805461ffff191661ffff83169081179091556040519081527ff5d1836df8fcd7c1e54047e94ac8773d2855395603e2ef9ba5f5f16905f225929060200160405180910390a150565b60405163237dfb4760e11b81523360048201527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906346fbf68e90602401602060405180830381865afa15801561160b573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061162f91906120d9565b6109fe57604051631d77d47760e21b815260040160405180910390fd5b6033546001600160a01b031633146109fe5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610762565b606654600160ff83161b908116036108f15760405163840a48d560e01b815260040160405180910390fd5b600260c954036117235760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401610762565b600260c955565b604080518082019091525f8082526020820152604080518082019091525f808252602082018190529060606117618587018761267c565b9299919850965090945092505050565b5f815f0151826020015163ffffffff166040516020016117bc92919060609290921b6bffffffffffffffffffffffff1916825260a01b6001600160a01b031916601482015260200190565b604051602081830303815290604052610ed590612741565b61181c83838080601f0160208091040260200160405190810160405280939291908181526020018383808284375f920191909152508992508591505063ffffffff881661191c565b6112405760405163afa42ca760e01b815260040160405180910390fd5b611841611a16565b81806020019051810190610ed591906127c9565b606081806020019051810190610ed59190612878565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663eab66d7a6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156118c7573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906118eb9190612979565b6001600160a01b0316336001600160a01b0316146109fe5760405163794821ff60e01b815260040160405180910390fd5b5f8361193b576040516329e7276760e11b815260040160405180910390fd5b83611947868585611951565b1495945050505050565b5f83515f03611961575081610996565b6020845161196f9190612994565b1561198d576040516313717da960e21b815260040160405180910390fd5b8260205b855181116119ee576119a4600285612994565b5f036119c557815f528086015160205260405f2091506002840493506119dc565b808601515f528160205260405f2091506002840493505b6119e76020826129b3565b9050611991565b508215611a0e576040516363df817160e01b815260040160405180910390fd5b949350505050565b60405180608001604052805f81526020015f8152602001611a4860405180604001604052805f81526020015f81525090565b8152602001606081525090565b6001600160a01b03811681146108f1575f5ffd5b5f60408284031215611a79575f5ffd5b50919050565b803561ffff81168114610a9a575f5ffd5b5f60a08284031215611a79575f5ffd5b5f5f5f5f5f60c08688031215611ab4575f5ffd5b8535611abf81611a55565b945060208601359350611ad58760408801611a69565b9250611ae360808701611a7f565b915060a08601356001600160401b03811115611afd575f5ffd5b611b0988828901611a90565b9150509295509295909350565b5f60208284031215611b26575f5ffd5b5035919050565b63ffffffff811681146108f1575f5ffd5b5f60208284031215611b4e575f5ffd5b813561099681611b2d565b80516001600160a01b0316825260209081015163ffffffff16910152565b60408101610ed58284611b59565b5f60208284031215611b95575f5ffd5b61099682611a7f565b5f5f5f60608486031215611bb0575f5ffd5b833592506020840135611bc281611b2d565b91506040840135611bd281611b2d565b809150509250925092565b634e487b7160e01b5f52604160045260245ffd5b604080519081016001600160401b0381118282101715611c1357611c13611bdd565b60405290565b604051608081016001600160401b0381118282101715611c1357611c13611bdd565b604051601f8201601f191681016001600160401b0381118282101715611c6357611c63611bdd565b604052919050565b5f6001600160401b03821115611c8357611c83611bdd565b5060051b60200190565b5f60208284031215611c9d575f5ffd5b81356001600160401b03811115611cb2575f5ffd5b82018084036060811215611cc4575f5ffd5b611ccc611bf1565b6040821215611cd9575f5ffd5b611ce1611bf1565b83358152602080850135908201528152604083013591506001600160401b03821115611d0b575f5ffd5b818301925085601f840112611d1e575f5ffd5b82359150611d33611d2e83611c6b565b611c3b565b8083825260208201915060208460051b860101935087841115611d54575f5ffd5b6020850194505b83851015611d76578435825260209485019490910190611d5b565b60208301525095945050505050565b5f60208284031215611d95575f5ffd5b813560ff81168114610996575f5ffd5b803560038110610a9a575f5ffd5b5f60208284031215611dc3575f5ffd5b61099682611da5565b5f5f83601f840112611ddc575f5ffd5b5081356001600160401b03811115611df2575f5ffd5b602083019150836020828501011115611e09575f5ffd5b9250929050565b5f5f5f5f5f5f5f60a0888a031215611e26575f5ffd5b8735611e3181611b2d565b9650602088013595506040880135611e4881611b2d565b945060608801356001600160401b03811115611e62575f5ffd5b611e6e8a828b01611dcc565b90955093505060808801356001600160401b03811115611e8c575f5ffd5b611e988a828b01611dcc565b989b979a50959850939692959293505050565b5f5f60608385031215611ebc575f5ffd5b611ec68484611a69565b915060408301356001600160401b03811115611ee0575f5ffd5b611eec85828601611a90565b9150509250929050565b5f5f60208385031215611f07575f5ffd5b82356001600160401b03811115611f1c575f5ffd5b611f2885828601611dcc565b90969095509350505050565b5f5f5f5f60808587031215611f47575f5ffd5b84356001600160401b03811115611f5c575f5ffd5b85016101208188031215611f6e575f5ffd5b9350602085013592506040850135611f8581611b2d565b91506060850135611f9581611b2d565b939692955090935050565b5f60208284031215611fb0575f5ffd5b813561099681611a55565b5f60208284031215611fcb575f5ffd5b5051919050565b5f8151808452602084019350602083015f5b82811015612002578151865260209586019590910190600101611fe4565b5093949350505050565b60208082528251805183830152015160408201525f6020830151606080840152611a0e6080840182611fd2565b60ff60f81b8360f81b1681525f82518060208501600185015e5f92016001019182525092915050565b634e487b7160e01b5f52602160045260245ffd5b60408101610ed58284546001600160a01b038116825260a01c63ffffffff16602090910152565b5f602082840312156120ad575f5ffd5b815161099681611b2d565b606081016120c68285611b59565b63ffffffff831660408301529392505050565b5f602082840312156120e9575f5ffd5b81518015158114610996575f5ffd5b6121028186611b59565b63ffffffff8416604082015260c06060820152825160c0820152602083015160e08201525f604084015161214461010084018280518252602090810151910152565b50606084015160a0610140840152612160610160840182611fd2565b9150506121706080830184611b59565b95945050505050565b5f60c082016121888388611b59565b63ffffffff8616604084015260c0606084015280855180835260e08501915060e08160051b8601019250602087015f5b828110156122095786850360df19018452815180516001600160a01b031686526020908101516040918701829052906121f390870182611fd2565b95505060209384019391909101906001016121b8565b50505050809150506121706080830184611b59565b60f884901b6001600160f81b0319168152818360018301375f910160010190815292915050565b634e487b7160e01b5f52603260045260245ffd5b5f5f8335601e1984360301811261226e575f5ffd5b83016020810192503590506001600160401b0381111561228c575f5ffd5b8060051b3603821315611e09575f5ffd5b81835281816020850137505f828201602090810191909152601f909101601f19169091010190565b5f8235605e198336030181126122d9575f5ffd5b90910192915050565b8183525f6001600160fb1b038311156122f9575f5ffd5b8260051b80836020870137939093016020019392505050565b80358252602080820135908301525f61232e6040830183612259565b606060408601526121706060860182846122e2565b5f8151808452602084019350602083015f5b8281101561200257815161ffff16865260209586019590910190600101612355565b61239a8185546001600160a01b038116825260a01c63ffffffff16602090910152565b608060408201525f6101a0820184356123b281611b2d565b63ffffffff166080840152602085013560a0840152604085013560c0840152606085013560e0840152604060808601610100850137604060c08601610140850137612401610100860186612259565b610120610180860152828184526101c0860190506101c08260051b8701019350825f5b838110156124e3578786036101bf1901835261244082866122c5565b803561244b81611b2d565b63ffffffff168752602081013536829003601e1901811261246a575f5ffd5b81016020810190356001600160401b03811115612485575f5ffd5b803603821315612493575f5ffd5b606060208a01526124a860608a01828461229d565b9150506124b860408301836122c5565b915087810360408901526124cc8183612312565b975050506020928301929190910190600101612424565b505050505082810360608401526124fa8185612343565b9695505050505050565b813561250f81611a55565b81546001600160a01b031981166001600160a01b03929092169182178355602084013561253b81611b2d565b6001600160c01b03199190911690911760a09190911b63ffffffff60a01b1617905550565b803561256b81611a55565b6001600160a01b03168252602081013561258481611b2d565b63ffffffff81166020840152505050565b60408101610ed58284612560565b6125ad8186612560565b63ffffffff841660408281019190915260c06060808401829052853591840191909152602085013560e0840152908401356101008301528301356101208201525f6125fb6080850185612259565b60a0610140850152612612610160850182846122e2565b925050506121706080830184546001600160a01b038116825260a01c63ffffffff16602090910152565b5f6040828403121561264c575f5ffd5b612654611bf1565b9050813561266181611a55565b8152602082013561267181611b2d565b602082015292915050565b5f5f5f5f60c0858703121561268f575f5ffd5b612699868661263c565b93506126a760408601611da5565b92506126b6866060870161263c565b915060a08501356001600160401b038111156126d0575f5ffd5b8501601f810187136126e0575f5ffd5b80356001600160401b038111156126f9576126f9611bdd565b61270c601f8201601f1916602001611c3b565b818152886020838501011115612720575f5ffd5b816020840160208301375f6020838301015280935050505092959194509250565b80516020808301519190811015611a79575f1960209190910360031b1b16919050565b5f82601f830112612773575f5ffd5b8151612781611d2e82611c6b565b8082825260208201915060208360051b8601019250858311156127a2575f5ffd5b602085015b838110156127bf5780518352602092830192016127a7565b5095945050505050565b5f602082840312156127d9575f5ffd5b81516001600160401b038111156127ee575f5ffd5b820180840360a0811215612800575f5ffd5b612808611c19565b82518152602080840151908201526040603f1983011215612827575f5ffd5b61282f611bf1565b604084810151825260608501516020830152820152608083015191506001600160401b0382111561285e575f5ffd5b61286a86838501612764565b606082015295945050505050565b5f60208284031215612888575f5ffd5b81516001600160401b0381111561289d575f5ffd5b8201601f810184136128ad575f5ffd5b80516128bb611d2e82611c6b565b8082825260208201915060208360051b8501019250868311156128dc575f5ffd5b602084015b8381101561296e5780516001600160401b038111156128fe575f5ffd5b85016040818a03601f19011215612913575f5ffd5b61291b611bf1565b602082015161292981611a55565b815260408201516001600160401b03811115612943575f5ffd5b6129528b602083860101612764565b60208301525080855250506020830192506020810190506128e1565b509695505050505050565b5f60208284031215612989575f5ffd5b815161099681611a55565b5f826129ae57634e487b7160e01b5f52601260045260245ffd5b500690565b80820180821115610ed557634e487b7160e01b5f52601160045260245ffdfea264697066735822122070d27e03d7765281c4ed1c92ba0e8b63372fd22174b869044525ce55d3c1751c64736f6c634300081e0033",
}
⋮----
// OperatorTableUpdaterABI is the input ABI used to generate the binding from.
// Deprecated: Use OperatorTableUpdaterMetaData.ABI instead.
var OperatorTableUpdaterABI = OperatorTableUpdaterMetaData.ABI
⋮----
// OperatorTableUpdaterBin is the compiled bytecode used for deploying new contracts.
// Deprecated: Use OperatorTableUpdaterMetaData.Bin instead.
var OperatorTableUpdaterBin = OperatorTableUpdaterMetaData.Bin
⋮----
// DeployOperatorTableUpdater deploys a new Ethereum contract, binding an instance of OperatorTableUpdater to it.
func DeployOperatorTableUpdater(auth *bind.TransactOpts, backend bind.ContractBackend, _bn254CertificateVerifier common.Address, _ecdsaCertificateVerifier common.Address, _pauserRegistry common.Address) (common.Address, *types.Transaction, *OperatorTableUpdater, error)
⋮----
// OperatorTableUpdater is an auto generated Go binding around an Ethereum contract.
type OperatorTableUpdater struct {
	OperatorTableUpdaterCaller     // Read-only binding to the contract
	OperatorTableUpdaterTransactor // Write-only binding to the contract
	OperatorTableUpdaterFilterer   // Log filterer for contract events
}
⋮----
OperatorTableUpdaterCaller     // Read-only binding to the contract
OperatorTableUpdaterTransactor // Write-only binding to the contract
OperatorTableUpdaterFilterer   // Log filterer for contract events
⋮----
// OperatorTableUpdaterCaller is an auto generated read-only Go binding around an Ethereum contract.
type OperatorTableUpdaterCaller struct {
	contract *bind.BoundContract // Generic contract wrapper for the low level calls
}
⋮----
contract *bind.BoundContract // Generic contract wrapper for the low level calls
⋮----
// OperatorTableUpdaterTransactor is an auto generated write-only Go binding around an Ethereum contract.
type OperatorTableUpdaterTransactor struct {
	contract *bind.BoundContract // Generic contract wrapper for the low level calls
}
⋮----
// OperatorTableUpdaterFilterer is an auto generated log filtering Go binding around an Ethereum contract events.
type OperatorTableUpdaterFilterer struct {
	contract *bind.BoundContract // Generic contract wrapper for the low level calls
}
⋮----
// OperatorTableUpdaterSession is an auto generated Go binding around an Ethereum contract,
// with pre-set call and transact options.
type OperatorTableUpdaterSession struct {
	Contract     *OperatorTableUpdater // 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
}
⋮----
Contract     *OperatorTableUpdater // 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
⋮----
// OperatorTableUpdaterCallerSession is an auto generated read-only Go binding around an Ethereum contract,
// with pre-set call options.
type OperatorTableUpdaterCallerSession struct {
	Contract *OperatorTableUpdaterCaller // Generic contract caller binding to set the session for
	CallOpts bind.CallOpts               // Call options to use throughout this session
}
⋮----
Contract *OperatorTableUpdaterCaller // Generic contract caller binding to set the session for
CallOpts bind.CallOpts               // Call options to use throughout this session
⋮----
// OperatorTableUpdaterTransactorSession is an auto generated write-only Go binding around an Ethereum contract,
// with pre-set transact options.
type OperatorTableUpdaterTransactorSession struct {
	Contract     *OperatorTableUpdaterTransactor // Generic contract transactor binding to set the session for
	TransactOpts bind.TransactOpts               // Transaction auth options to use throughout this session
}
⋮----
Contract     *OperatorTableUpdaterTransactor // Generic contract transactor binding to set the session for
TransactOpts bind.TransactOpts               // Transaction auth options to use throughout this session
⋮----
// OperatorTableUpdaterRaw is an auto generated low-level Go binding around an Ethereum contract.
type OperatorTableUpdaterRaw struct {
	Contract *OperatorTableUpdater // Generic contract binding to access the raw methods on
}
⋮----
Contract *OperatorTableUpdater // Generic contract binding to access the raw methods on
⋮----
// OperatorTableUpdaterCallerRaw is an auto generated low-level read-only Go binding around an Ethereum contract.
type OperatorTableUpdaterCallerRaw struct {
	Contract *OperatorTableUpdaterCaller // Generic read-only contract binding to access the raw methods on
}
⋮----
Contract *OperatorTableUpdaterCaller // Generic read-only contract binding to access the raw methods on
⋮----
// OperatorTableUpdaterTransactorRaw is an auto generated low-level write-only Go binding around an Ethereum contract.
type OperatorTableUpdaterTransactorRaw struct {
	Contract *OperatorTableUpdaterTransactor // Generic write-only contract binding to access the raw methods on
}
⋮----
Contract *OperatorTableUpdaterTransactor // Generic write-only contract binding to access the raw methods on
⋮----
// NewOperatorTableUpdater creates a new instance of OperatorTableUpdater, bound to a specific deployed contract.
func NewOperatorTableUpdater(address common.Address, backend bind.ContractBackend) (*OperatorTableUpdater, error)
⋮----
// NewOperatorTableUpdaterCaller creates a new read-only instance of OperatorTableUpdater, bound to a specific deployed contract.
func NewOperatorTableUpdaterCaller(address common.Address, caller bind.ContractCaller) (*OperatorTableUpdaterCaller, error)
⋮----
// NewOperatorTableUpdaterTransactor creates a new write-only instance of OperatorTableUpdater, bound to a specific deployed contract.
func NewOperatorTableUpdaterTransactor(address common.Address, transactor bind.ContractTransactor) (*OperatorTableUpdaterTransactor, error)
⋮----
// NewOperatorTableUpdaterFilterer creates a new log filterer instance of OperatorTableUpdater, bound to a specific deployed contract.
func NewOperatorTableUpdaterFilterer(address common.Address, filterer bind.ContractFilterer) (*OperatorTableUpdaterFilterer, error)
⋮----
// bindOperatorTableUpdater binds a generic wrapper to an already deployed contract.
func bindOperatorTableUpdater(address common.Address, caller bind.ContractCaller, transactor bind.ContractTransactor, filterer bind.ContractFilterer) (*bind.BoundContract, error)
⋮----
// 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 (_OperatorTableUpdater *OperatorTableUpdaterRaw) Call(opts *bind.CallOpts, result *[]interface
⋮----
// Transfer initiates a plain transaction to move funds to the contract, calling
// its default method if one is available.
func (_OperatorTableUpdater *OperatorTableUpdaterRaw) Transfer(opts *bind.TransactOpts) (*types.Transaction, error)
⋮----
// Transact invokes the (paid) contract method with params as input values.
func (_OperatorTableUpdater *OperatorTableUpdaterRaw) Transact(opts *bind.TransactOpts, method string, params ...interface
⋮----
// GENERATORGLOBALTABLEROOT is a free data retrieval call binding the contract method 0x1bdc0deb.
//
// Solidity: function GENERATOR_GLOBAL_TABLE_ROOT() view returns(bytes32)
func (_OperatorTableUpdater *OperatorTableUpdaterCaller) GENERATORGLOBALTABLEROOT(opts *bind.CallOpts) ([32]byte, error)
⋮----
var out []interface{}
⋮----
// GENERATORMAXSTALENESSPERIOD is a free data retrieval call binding the contract method 0x790961ea.
⋮----
// Solidity: function GENERATOR_MAX_STALENESS_PERIOD() view returns(uint32)
func (_OperatorTableUpdater *OperatorTableUpdaterCaller) GENERATORMAXSTALENESSPERIOD(opts *bind.CallOpts) (uint32, error)
⋮----
// GENERATORREFERENCETIMESTAMP is a free data retrieval call binding the contract method 0x612abcb0.
⋮----
// Solidity: function GENERATOR_REFERENCE_TIMESTAMP() view returns(uint32)
func (_OperatorTableUpdater *OperatorTableUpdaterCaller) GENERATORREFERENCETIMESTAMP(opts *bind.CallOpts) (uint32, error)
⋮----
// GLOBALTABLEROOTCERTTYPEHASH is a free data retrieval call binding the contract method 0x3ef6cd7a.
⋮----
// Solidity: function GLOBAL_TABLE_ROOT_CERT_TYPEHASH() view returns(bytes32)
func (_OperatorTableUpdater *OperatorTableUpdaterCaller) GLOBALTABLEROOTCERTTYPEHASH(opts *bind.CallOpts) ([32]byte, error)
⋮----
// MAXBPS is a free data retrieval call binding the contract method 0xfd967f47.
⋮----
// Solidity: function MAX_BPS() view returns(uint16)
func (_OperatorTableUpdater *OperatorTableUpdaterCaller) MAXBPS(opts *bind.CallOpts) (uint16, error)
⋮----
// OPERATORINFOLEAFSALT is a free data retrieval call binding the contract method 0xa2c902f5.
⋮----
// Solidity: function OPERATOR_INFO_LEAF_SALT() view returns(uint8)
func (_OperatorTableUpdater *OperatorTableUpdaterCaller) OPERATORINFOLEAFSALT(opts *bind.CallOpts) (uint8, error)
⋮----
// OPERATORTABLELEAFSALT is a free data retrieval call binding the contract method 0x121409ea.
⋮----
// Solidity: function OPERATOR_TABLE_LEAF_SALT() view returns(uint8)
func (_OperatorTableUpdater *OperatorTableUpdaterCaller) OPERATORTABLELEAFSALT(opts *bind.CallOpts) (uint8, error)
⋮----
// Bn254CertificateVerifier is a free data retrieval call binding the contract method 0xb8c14306.
⋮----
// Solidity: function bn254CertificateVerifier() view returns(address)
func (_OperatorTableUpdater *OperatorTableUpdaterCaller) Bn254CertificateVerifier(opts *bind.CallOpts) (common.Address, error)
⋮----
// CalculateOperatorInfoLeaf is a free data retrieval call binding the contract method 0x538a3790.
⋮----
// Solidity: function calculateOperatorInfoLeaf(((uint256,uint256),uint256[]) operatorInfo) pure returns(bytes32)
func (_OperatorTableUpdater *OperatorTableUpdaterCaller) CalculateOperatorInfoLeaf(opts *bind.CallOpts, operatorInfo IOperatorTableCalculatorTypesBN254OperatorInfo) ([32]byte, error)
⋮----
// CalculateOperatorTableLeaf is a free data retrieval call binding the contract method 0xa2f2e24d.
⋮----
// Solidity: function calculateOperatorTableLeaf(bytes operatorTableBytes) pure returns(bytes32)
func (_OperatorTableUpdater *OperatorTableUpdaterCaller) CalculateOperatorTableLeaf(opts *bind.CallOpts, operatorTableBytes []byte) ([32]byte, error)
⋮----
// EcdsaCertificateVerifier is a free data retrieval call binding the contract method 0xad0f9582.
⋮----
// Solidity: function ecdsaCertificateVerifier() view returns(address)
func (_OperatorTableUpdater *OperatorTableUpdaterCaller) EcdsaCertificateVerifier(opts *bind.CallOpts) (common.Address, error)
⋮----
// GetCertificateVerifier is a free data retrieval call binding the contract method 0x6f728c50.
⋮----
// Solidity: function getCertificateVerifier(uint8 curveType) view returns(address)
func (_OperatorTableUpdater *OperatorTableUpdaterCaller) GetCertificateVerifier(opts *bind.CallOpts, curveType uint8) (common.Address, error)
⋮----
// GetCurrentGlobalTableRoot is a free data retrieval call binding the contract method 0x28522d79.
⋮----
// Solidity: function getCurrentGlobalTableRoot() view returns(bytes32)
func (_OperatorTableUpdater *OperatorTableUpdaterCaller) GetCurrentGlobalTableRoot(opts *bind.CallOpts) ([32]byte, error)
⋮----
// GetGenerator is a free data retrieval call binding the contract method 0x1e2ca260.
⋮----
// Solidity: function getGenerator() view returns((address,uint32))
func (_OperatorTableUpdater *OperatorTableUpdaterCaller) GetGenerator(opts *bind.CallOpts) (OperatorSet, error)
⋮----
// GetGeneratorConfig is a free data retrieval call binding the contract method 0xb0cb3a24.
⋮----
// Solidity: function getGeneratorConfig() view returns((address,uint32))
func (_OperatorTableUpdater *OperatorTableUpdaterCaller) GetGeneratorConfig(opts *bind.CallOpts) (ICrossChainRegistryTypesOperatorSetConfig, error)
⋮----
// GetGeneratorReferenceTimestamp is a free data retrieval call binding the contract method 0x7551ba34.
⋮----
// Solidity: function getGeneratorReferenceTimestamp() view returns(uint32)
func (_OperatorTableUpdater *OperatorTableUpdaterCaller) GetGeneratorReferenceTimestamp(opts *bind.CallOpts) (uint32, error)
⋮----
// GetGlobalTableRootByTimestamp is a free data retrieval call binding the contract method 0xc5916a39.
⋮----
// Solidity: function getGlobalTableRootByTimestamp(uint32 referenceTimestamp) view returns(bytes32)
func (_OperatorTableUpdater *OperatorTableUpdaterCaller) GetGlobalTableRootByTimestamp(opts *bind.CallOpts, referenceTimestamp uint32) ([32]byte, error)
⋮----
// GetGlobalTableUpdateMessageHash is a free data retrieval call binding the contract method 0xc3be1e33.
⋮----
// Solidity: function getGlobalTableUpdateMessageHash(bytes32 globalTableRoot, uint32 referenceTimestamp, uint32 referenceBlockNumber) pure returns(bytes32)
func (_OperatorTableUpdater *OperatorTableUpdaterCaller) GetGlobalTableUpdateMessageHash(opts *bind.CallOpts, globalTableRoot [32]byte, referenceTimestamp uint32, referenceBlockNumber uint32) ([32]byte, error)
⋮----
// GetGlobalTableUpdateSignableDigest is a free data retrieval call binding the contract method 0x401c370f.
⋮----
// Solidity: function getGlobalTableUpdateSignableDigest(bytes32 globalTableRoot, uint32 referenceTimestamp, uint32 referenceBlockNumber) view returns(bytes32)
func (_OperatorTableUpdater *OperatorTableUpdaterCaller) GetGlobalTableUpdateSignableDigest(opts *bind.CallOpts, globalTableRoot [32]byte, referenceTimestamp uint32, referenceBlockNumber uint32) ([32]byte, error)
⋮----
// GetLatestReferenceBlockNumber is a free data retrieval call binding the contract method 0x31a599d2.
⋮----
// Solidity: function getLatestReferenceBlockNumber() view returns(uint32)
func (_OperatorTableUpdater *OperatorTableUpdaterCaller) GetLatestReferenceBlockNumber(opts *bind.CallOpts) (uint32, error)
⋮----
// GetLatestReferenceTimestamp is a free data retrieval call binding the contract method 0x4624e6a3.
⋮----
// Solidity: function getLatestReferenceTimestamp() view returns(uint32)
func (_OperatorTableUpdater *OperatorTableUpdaterCaller) GetLatestReferenceTimestamp(opts *bind.CallOpts) (uint32, error)
⋮----
// GetReferenceBlockNumberByTimestamp is a free data retrieval call binding the contract method 0x23b7b5b2.
⋮----
// Solidity: function getReferenceBlockNumberByTimestamp(uint32 referenceTimestamp) view returns(uint32)
func (_OperatorTableUpdater *OperatorTableUpdaterCaller) GetReferenceBlockNumberByTimestamp(opts *bind.CallOpts, referenceTimestamp uint32) (uint32, error)
⋮----
// GetReferenceTimestampByBlockNumber is a free data retrieval call binding the contract method 0x193b79f3.
⋮----
// Solidity: function getReferenceTimestampByBlockNumber(uint32 referenceBlockNumber) view returns(uint32)
func (_OperatorTableUpdater *OperatorTableUpdaterCaller) GetReferenceTimestampByBlockNumber(opts *bind.CallOpts, referenceBlockNumber uint32) (uint32, error)
⋮----
// GlobalRootConfirmationThreshold is a free data retrieval call binding the contract method 0xc252aa22.
⋮----
// Solidity: function globalRootConfirmationThreshold() view returns(uint16)
func (_OperatorTableUpdater *OperatorTableUpdaterCaller) GlobalRootConfirmationThreshold(opts *bind.CallOpts) (uint16, error)
⋮----
// IsRootValid is a free data retrieval call binding the contract method 0x30ef41b4.
⋮----
// Solidity: function isRootValid(bytes32 globalTableRoot) view returns(bool)
func (_OperatorTableUpdater *OperatorTableUpdaterCaller) IsRootValid(opts *bind.CallOpts, globalTableRoot [32]byte) (bool, error)
⋮----
// IsRootValidByTimestamp is a free data retrieval call binding the contract method 0x64e1df84.
⋮----
// Solidity: function isRootValidByTimestamp(uint32 referenceTimestamp) view returns(bool)
func (_OperatorTableUpdater *OperatorTableUpdaterCaller) IsRootValidByTimestamp(opts *bind.CallOpts, referenceTimestamp uint32) (bool, error)
⋮----
// Owner is a free data retrieval call binding the contract method 0x8da5cb5b.
⋮----
// Solidity: function owner() view returns(address)
func (_OperatorTableUpdater *OperatorTableUpdaterCaller) Owner(opts *bind.CallOpts) (common.Address, error)
⋮----
// Paused is a free data retrieval call binding the contract method 0x5ac86ab7.
⋮----
// Solidity: function paused(uint8 index) view returns(bool)
func (_OperatorTableUpdater *OperatorTableUpdaterCaller) Paused(opts *bind.CallOpts, index uint8) (bool, error)
⋮----
// Paused0 is a free data retrieval call binding the contract method 0x5c975abb.
⋮----
// Solidity: function paused() view returns(uint256)
func (_OperatorTableUpdater *OperatorTableUpdaterCaller) Paused0(opts *bind.CallOpts) (*big.Int, error)
⋮----
// PauserRegistry is a free data retrieval call binding the contract method 0x886f1195.
⋮----
// Solidity: function pauserRegistry() view returns(address)
func (_OperatorTableUpdater *OperatorTableUpdaterCaller) PauserRegistry(opts *bind.CallOpts) (common.Address, error)
⋮----
// ConfirmGlobalTableRoot is a paid mutator transaction binding the contract method 0xeaaed9d5.
⋮----
// Solidity: function confirmGlobalTableRoot((uint32,bytes32,(uint256,uint256),(uint256[2],uint256[2]),(uint32,bytes,((uint256,uint256),uint256[]))[]) globalTableRootCert, bytes32 globalTableRoot, uint32 referenceTimestamp, uint32 referenceBlockNumber) returns()
func (_OperatorTableUpdater *OperatorTableUpdaterTransactor) ConfirmGlobalTableRoot(opts *bind.TransactOpts, globalTableRootCert IBN254CertificateVerifierTypesBN254Certificate, globalTableRoot [32]byte, referenceTimestamp uint32, referenceBlockNumber uint32) (*types.Transaction, error)
⋮----
// DisableRoot is a paid mutator transaction binding the contract method 0xc3621f0a.
⋮----
// Solidity: function disableRoot(bytes32 globalTableRoot) returns()
func (_OperatorTableUpdater *OperatorTableUpdaterTransactor) DisableRoot(opts *bind.TransactOpts, globalTableRoot [32]byte) (*types.Transaction, error)
⋮----
// Initialize is a paid mutator transaction binding the contract method 0x06f51875.
⋮----
// Solidity: function initialize(address _owner, uint256 initialPausedStatus, (address,uint32) _initialGenerator, uint16 _globalRootConfirmationThreshold, (bytes32,uint256,(uint256,uint256),uint256[]) generatorInfo) returns()
func (_OperatorTableUpdater *OperatorTableUpdaterTransactor) Initialize(opts *bind.TransactOpts, _owner common.Address, initialPausedStatus *big.Int, _initialGenerator OperatorSet, _globalRootConfirmationThreshold uint16, generatorInfo IOperatorTableCalculatorTypesBN254OperatorSetInfo) (*types.Transaction, error)
⋮----
// Pause is a paid mutator transaction binding the contract method 0x136439dd.
⋮----
// Solidity: function pause(uint256 newPausedStatus) returns()
func (_OperatorTableUpdater *OperatorTableUpdaterTransactor) Pause(opts *bind.TransactOpts, newPausedStatus *big.Int) (*types.Transaction, error)
⋮----
// PauseAll is a paid mutator transaction binding the contract method 0x595c6a67.
⋮----
// Solidity: function pauseAll() returns()
func (_OperatorTableUpdater *OperatorTableUpdaterTransactor) PauseAll(opts *bind.TransactOpts) (*types.Transaction, error)
⋮----
// RenounceOwnership is a paid mutator transaction binding the contract method 0x715018a6.
⋮----
// Solidity: function renounceOwnership() returns()
func (_OperatorTableUpdater *OperatorTableUpdaterTransactor) RenounceOwnership(opts *bind.TransactOpts) (*types.Transaction, error)
⋮----
// SetGlobalRootConfirmationThreshold is a paid mutator transaction binding the contract method 0x2370356c.
⋮----
// Solidity: function setGlobalRootConfirmationThreshold(uint16 bps) returns()
func (_OperatorTableUpdater *OperatorTableUpdaterTransactor) SetGlobalRootConfirmationThreshold(opts *bind.TransactOpts, bps uint16) (*types.Transaction, error)
⋮----
// TransferOwnership is a paid mutator transaction binding the contract method 0xf2fde38b.
⋮----
// Solidity: function transferOwnership(address newOwner) returns()
func (_OperatorTableUpdater *OperatorTableUpdaterTransactor) TransferOwnership(opts *bind.TransactOpts, newOwner common.Address) (*types.Transaction, error)
⋮----
// Unpause is a paid mutator transaction binding the contract method 0xfabc1cbc.
⋮----
// Solidity: function unpause(uint256 newPausedStatus) returns()
func (_OperatorTableUpdater *OperatorTableUpdaterTransactor) Unpause(opts *bind.TransactOpts, newPausedStatus *big.Int) (*types.Transaction, error)
⋮----
// UpdateGenerator is a paid mutator transaction binding the contract method 0x9f7e206f.
⋮----
// Solidity: function updateGenerator((address,uint32) generator, (bytes32,uint256,(uint256,uint256),uint256[]) generatorInfo) returns()
func (_OperatorTableUpdater *OperatorTableUpdaterTransactor) UpdateGenerator(opts *bind.TransactOpts, generator OperatorSet, generatorInfo IOperatorTableCalculatorTypesBN254OperatorSetInfo) (*types.Transaction, error)
⋮----
// UpdateOperatorTable is a paid mutator transaction binding the contract method 0x9ea94778.
⋮----
// Solidity: function updateOperatorTable(uint32 referenceTimestamp, bytes32 globalTableRoot, uint32 operatorSetIndex, bytes proof, bytes operatorTableBytes) returns()
func (_OperatorTableUpdater *OperatorTableUpdaterTransactor) UpdateOperatorTable(opts *bind.TransactOpts, referenceTimestamp uint32, globalTableRoot [32]byte, operatorSetIndex uint32, proof []byte, operatorTableBytes []byte) (*types.Transaction, error)
⋮----
// OperatorTableUpdaterGeneratorUpdatedIterator is returned from FilterGeneratorUpdated and is used to iterate over the raw logs and unpacked data for GeneratorUpdated events raised by the OperatorTableUpdater contract.
type OperatorTableUpdaterGeneratorUpdatedIterator struct {
	Event *OperatorTableUpdaterGeneratorUpdated // 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
}
⋮----
Event *OperatorTableUpdaterGeneratorUpdated // 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 *OperatorTableUpdaterGeneratorUpdatedIterator) Next() bool
⋮----
// If the iterator failed, stop iterating
⋮----
// If the iterator completed, deliver directly whatever's available
⋮----
// Iterator still in progress, wait for either a data or an error event
⋮----
// Error returns any retrieval or parsing error occurred during filtering.
func (it *OperatorTableUpdaterGeneratorUpdatedIterator) Error() error
⋮----
// Close terminates the iteration process, releasing any pending underlying
// resources.
func (it *OperatorTableUpdaterGeneratorUpdatedIterator) Close() error
⋮----
// OperatorTableUpdaterGeneratorUpdated represents a GeneratorUpdated event raised by the OperatorTableUpdater contract.
type OperatorTableUpdaterGeneratorUpdated struct {
	OperatorSet OperatorSet
	Raw         types.Log // Blockchain specific contextual infos
}
⋮----
Raw         types.Log // Blockchain specific contextual infos
⋮----
// FilterGeneratorUpdated is a free log retrieval operation binding the contract event 0x3463431b09dfd43dec7349f8f24acfa753fe4cf40a26235402d213373df15856.
⋮----
// Solidity: event GeneratorUpdated((address,uint32) operatorSet)
func (_OperatorTableUpdater *OperatorTableUpdaterFilterer) FilterGeneratorUpdated(opts *bind.FilterOpts) (*OperatorTableUpdaterGeneratorUpdatedIterator, error)
⋮----
// WatchGeneratorUpdated is a free log subscription operation binding the contract event 0x3463431b09dfd43dec7349f8f24acfa753fe4cf40a26235402d213373df15856.
⋮----
func (_OperatorTableUpdater *OperatorTableUpdaterFilterer) WatchGeneratorUpdated(opts *bind.WatchOpts, sink chan<- *OperatorTableUpdaterGeneratorUpdated) (event.Subscription, error)
⋮----
// New log arrived, parse the event and forward to the user
⋮----
// ParseGeneratorUpdated is a log parse operation binding the contract event 0x3463431b09dfd43dec7349f8f24acfa753fe4cf40a26235402d213373df15856.
⋮----
func (_OperatorTableUpdater *OperatorTableUpdaterFilterer) ParseGeneratorUpdated(log types.Log) (*OperatorTableUpdaterGeneratorUpdated, error)
⋮----
// OperatorTableUpdaterGlobalRootConfirmationThresholdUpdatedIterator is returned from FilterGlobalRootConfirmationThresholdUpdated and is used to iterate over the raw logs and unpacked data for GlobalRootConfirmationThresholdUpdated events raised by the OperatorTableUpdater contract.
type OperatorTableUpdaterGlobalRootConfirmationThresholdUpdatedIterator struct {
	Event *OperatorTableUpdaterGlobalRootConfirmationThresholdUpdated // 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
}
⋮----
Event *OperatorTableUpdaterGlobalRootConfirmationThresholdUpdated // Event containing the contract specifics and raw log
⋮----
// OperatorTableUpdaterGlobalRootConfirmationThresholdUpdated represents a GlobalRootConfirmationThresholdUpdated event raised by the OperatorTableUpdater contract.
type OperatorTableUpdaterGlobalRootConfirmationThresholdUpdated struct {
	Bps uint16
	Raw types.Log // Blockchain specific contextual infos
}
⋮----
Raw types.Log // Blockchain specific contextual infos
⋮----
// FilterGlobalRootConfirmationThresholdUpdated is a free log retrieval operation binding the contract event 0xf5d1836df8fcd7c1e54047e94ac8773d2855395603e2ef9ba5f5f16905f22592.
⋮----
// Solidity: event GlobalRootConfirmationThresholdUpdated(uint16 bps)
func (_OperatorTableUpdater *OperatorTableUpdaterFilterer) FilterGlobalRootConfirmationThresholdUpdated(opts *bind.FilterOpts) (*OperatorTableUpdaterGlobalRootConfirmationThresholdUpdatedIterator, error)
⋮----
// WatchGlobalRootConfirmationThresholdUpdated is a free log subscription operation binding the contract event 0xf5d1836df8fcd7c1e54047e94ac8773d2855395603e2ef9ba5f5f16905f22592.
⋮----
func (_OperatorTableUpdater *OperatorTableUpdaterFilterer) WatchGlobalRootConfirmationThresholdUpdated(opts *bind.WatchOpts, sink chan<- *OperatorTableUpdaterGlobalRootConfirmationThresholdUpdated) (event.Subscription, error)
⋮----
// ParseGlobalRootConfirmationThresholdUpdated is a log parse operation binding the contract event 0xf5d1836df8fcd7c1e54047e94ac8773d2855395603e2ef9ba5f5f16905f22592.
⋮----
func (_OperatorTableUpdater *OperatorTableUpdaterFilterer) ParseGlobalRootConfirmationThresholdUpdated(log types.Log) (*OperatorTableUpdaterGlobalRootConfirmationThresholdUpdated, error)
⋮----
// OperatorTableUpdaterGlobalRootDisabledIterator is returned from FilterGlobalRootDisabled and is used to iterate over the raw logs and unpacked data for GlobalRootDisabled events raised by the OperatorTableUpdater contract.
type OperatorTableUpdaterGlobalRootDisabledIterator struct {
	Event *OperatorTableUpdaterGlobalRootDisabled // 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
}
⋮----
Event *OperatorTableUpdaterGlobalRootDisabled // Event containing the contract specifics and raw log
⋮----
// OperatorTableUpdaterGlobalRootDisabled represents a GlobalRootDisabled event raised by the OperatorTableUpdater contract.
type OperatorTableUpdaterGlobalRootDisabled struct {
	GlobalTableRoot [32]byte
	Raw             types.Log // Blockchain specific contextual infos
}
⋮----
Raw             types.Log // Blockchain specific contextual infos
⋮----
// FilterGlobalRootDisabled is a free log retrieval operation binding the contract event 0x8bd43de1250f58fe6ec9a78671a8b78dba70f0018656d157a3aeaabec389df34.
⋮----
// Solidity: event GlobalRootDisabled(bytes32 indexed globalTableRoot)
func (_OperatorTableUpdater *OperatorTableUpdaterFilterer) FilterGlobalRootDisabled(opts *bind.FilterOpts, globalTableRoot [][32]byte) (*OperatorTableUpdaterGlobalRootDisabledIterator, error)
⋮----
var globalTableRootRule []interface{}
⋮----
// WatchGlobalRootDisabled is a free log subscription operation binding the contract event 0x8bd43de1250f58fe6ec9a78671a8b78dba70f0018656d157a3aeaabec389df34.
⋮----
func (_OperatorTableUpdater *OperatorTableUpdaterFilterer) WatchGlobalRootDisabled(opts *bind.WatchOpts, sink chan<- *OperatorTableUpdaterGlobalRootDisabled, globalTableRoot [][32]byte) (event.Subscription, error)
⋮----
// ParseGlobalRootDisabled is a log parse operation binding the contract event 0x8bd43de1250f58fe6ec9a78671a8b78dba70f0018656d157a3aeaabec389df34.
⋮----
func (_OperatorTableUpdater *OperatorTableUpdaterFilterer) ParseGlobalRootDisabled(log types.Log) (*OperatorTableUpdaterGlobalRootDisabled, error)
⋮----
// OperatorTableUpdaterInitializedIterator is returned from FilterInitialized and is used to iterate over the raw logs and unpacked data for Initialized events raised by the OperatorTableUpdater contract.
type OperatorTableUpdaterInitializedIterator struct {
	Event *OperatorTableUpdaterInitialized // 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
}
⋮----
Event *OperatorTableUpdaterInitialized // Event containing the contract specifics and raw log
⋮----
// OperatorTableUpdaterInitialized represents a Initialized event raised by the OperatorTableUpdater contract.
type OperatorTableUpdaterInitialized struct {
	Version uint8
	Raw     types.Log // Blockchain specific contextual infos
}
⋮----
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 (_OperatorTableUpdater *OperatorTableUpdaterFilterer) FilterInitialized(opts *bind.FilterOpts) (*OperatorTableUpdaterInitializedIterator, error)
⋮----
// WatchInitialized is a free log subscription operation binding the contract event 0x7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb3847402498.
⋮----
func (_OperatorTableUpdater *OperatorTableUpdaterFilterer) WatchInitialized(opts *bind.WatchOpts, sink chan<- *OperatorTableUpdaterInitialized) (event.Subscription, error)
⋮----
// ParseInitialized is a log parse operation binding the contract event 0x7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb3847402498.
⋮----
func (_OperatorTableUpdater *OperatorTableUpdaterFilterer) ParseInitialized(log types.Log) (*OperatorTableUpdaterInitialized, error)
⋮----
// OperatorTableUpdaterNewGlobalTableRootIterator is returned from FilterNewGlobalTableRoot and is used to iterate over the raw logs and unpacked data for NewGlobalTableRoot events raised by the OperatorTableUpdater contract.
type OperatorTableUpdaterNewGlobalTableRootIterator struct {
	Event *OperatorTableUpdaterNewGlobalTableRoot // 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
}
⋮----
Event *OperatorTableUpdaterNewGlobalTableRoot // Event containing the contract specifics and raw log
⋮----
// OperatorTableUpdaterNewGlobalTableRoot represents a NewGlobalTableRoot event raised by the OperatorTableUpdater contract.
type OperatorTableUpdaterNewGlobalTableRoot struct {
	ReferenceTimestamp uint32
	GlobalTableRoot    [32]byte
	Raw                types.Log // Blockchain specific contextual infos
}
⋮----
Raw                types.Log // Blockchain specific contextual infos
⋮----
// FilterNewGlobalTableRoot is a free log retrieval operation binding the contract event 0x010dcbe0d1e019c93357711f7bb6287d543b7ff7de74f29df3fb5ecceec8d369.
⋮----
// Solidity: event NewGlobalTableRoot(uint32 indexed referenceTimestamp, bytes32 indexed globalTableRoot)
func (_OperatorTableUpdater *OperatorTableUpdaterFilterer) FilterNewGlobalTableRoot(opts *bind.FilterOpts, referenceTimestamp []uint32, globalTableRoot [][32]byte) (*OperatorTableUpdaterNewGlobalTableRootIterator, error)
⋮----
var referenceTimestampRule []interface{}
⋮----
// WatchNewGlobalTableRoot is a free log subscription operation binding the contract event 0x010dcbe0d1e019c93357711f7bb6287d543b7ff7de74f29df3fb5ecceec8d369.
⋮----
func (_OperatorTableUpdater *OperatorTableUpdaterFilterer) WatchNewGlobalTableRoot(opts *bind.WatchOpts, sink chan<- *OperatorTableUpdaterNewGlobalTableRoot, referenceTimestamp []uint32, globalTableRoot [][32]byte) (event.Subscription, error)
⋮----
// ParseNewGlobalTableRoot is a log parse operation binding the contract event 0x010dcbe0d1e019c93357711f7bb6287d543b7ff7de74f29df3fb5ecceec8d369.
⋮----
func (_OperatorTableUpdater *OperatorTableUpdaterFilterer) ParseNewGlobalTableRoot(log types.Log) (*OperatorTableUpdaterNewGlobalTableRoot, error)
⋮----
// OperatorTableUpdaterOwnershipTransferredIterator is returned from FilterOwnershipTransferred and is used to iterate over the raw logs and unpacked data for OwnershipTransferred events raised by the OperatorTableUpdater contract.
type OperatorTableUpdaterOwnershipTransferredIterator struct {
	Event *OperatorTableUpdaterOwnershipTransferred // 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
}
⋮----
Event *OperatorTableUpdaterOwnershipTransferred // Event containing the contract specifics and raw log
⋮----
// OperatorTableUpdaterOwnershipTransferred represents a OwnershipTransferred event raised by the OperatorTableUpdater contract.
type OperatorTableUpdaterOwnershipTransferred struct {
	PreviousOwner common.Address
	NewOwner      common.Address
	Raw           types.Log // Blockchain specific contextual infos
}
⋮----
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 (_OperatorTableUpdater *OperatorTableUpdaterFilterer) FilterOwnershipTransferred(opts *bind.FilterOpts, previousOwner []common.Address, newOwner []common.Address) (*OperatorTableUpdaterOwnershipTransferredIterator, error)
⋮----
var previousOwnerRule []interface{}
⋮----
var newOwnerRule []interface{}
⋮----
// WatchOwnershipTransferred is a free log subscription operation binding the contract event 0x8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0.
⋮----
func (_OperatorTableUpdater *OperatorTableUpdaterFilterer) WatchOwnershipTransferred(opts *bind.WatchOpts, sink chan<- *OperatorTableUpdaterOwnershipTransferred, previousOwner []common.Address, newOwner []common.Address) (event.Subscription, error)
⋮----
// ParseOwnershipTransferred is a log parse operation binding the contract event 0x8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0.
⋮----
func (_OperatorTableUpdater *OperatorTableUpdaterFilterer) ParseOwnershipTransferred(log types.Log) (*OperatorTableUpdaterOwnershipTransferred, error)
⋮----
// OperatorTableUpdaterPausedIterator is returned from FilterPaused and is used to iterate over the raw logs and unpacked data for Paused events raised by the OperatorTableUpdater contract.
type OperatorTableUpdaterPausedIterator struct {
	Event *OperatorTableUpdaterPaused // 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
}
⋮----
Event *OperatorTableUpdaterPaused // Event containing the contract specifics and raw log
⋮----
// OperatorTableUpdaterPaused represents a Paused event raised by the OperatorTableUpdater contract.
type OperatorTableUpdaterPaused 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 (_OperatorTableUpdater *OperatorTableUpdaterFilterer) FilterPaused(opts *bind.FilterOpts, account []common.Address) (*OperatorTableUpdaterPausedIterator, error)
⋮----
var accountRule []interface{}
⋮----
// WatchPaused is a free log subscription operation binding the contract event 0xab40a374bc51de372200a8bc981af8c9ecdc08dfdaef0bb6e09f88f3c616ef3d.
⋮----
func (_OperatorTableUpdater *OperatorTableUpdaterFilterer) WatchPaused(opts *bind.WatchOpts, sink chan<- *OperatorTableUpdaterPaused, account []common.Address) (event.Subscription, error)
⋮----
// ParsePaused is a log parse operation binding the contract event 0xab40a374bc51de372200a8bc981af8c9ecdc08dfdaef0bb6e09f88f3c616ef3d.
⋮----
func (_OperatorTableUpdater *OperatorTableUpdaterFilterer) ParsePaused(log types.Log) (*OperatorTableUpdaterPaused, error)
⋮----
// OperatorTableUpdaterUnpausedIterator is returned from FilterUnpaused and is used to iterate over the raw logs and unpacked data for Unpaused events raised by the OperatorTableUpdater contract.
type OperatorTableUpdaterUnpausedIterator struct {
	Event *OperatorTableUpdaterUnpaused // 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
}
⋮----
Event *OperatorTableUpdaterUnpaused // Event containing the contract specifics and raw log
⋮----
// OperatorTableUpdaterUnpaused represents a Unpaused event raised by the OperatorTableUpdater contract.
type OperatorTableUpdaterUnpaused 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 (_OperatorTableUpdater *OperatorTableUpdaterFilterer) FilterUnpaused(opts *bind.FilterOpts, account []common.Address) (*OperatorTableUpdaterUnpausedIterator, error)
⋮----
// WatchUnpaused is a free log subscription operation binding the contract event 0x3582d1828e26bf56bd801502bc021ac0bc8afb57c826e4986b45593c8fad389c.
⋮----
func (_OperatorTableUpdater *OperatorTableUpdaterFilterer) WatchUnpaused(opts *bind.WatchOpts, sink chan<- *OperatorTableUpdaterUnpaused, account []common.Address) (event.Subscription, error)
⋮----
// ParseUnpaused is a log parse operation binding the contract event 0x3582d1828e26bf56bd801502bc021ac0bc8afb57c826e4986b45593c8fad389c.
⋮----
func (_OperatorTableUpdater *OperatorTableUpdaterFilterer) ParseUnpaused(log types.Log) (*OperatorTableUpdaterUnpaused, error)
````

## File: pkg/bindings/OperatorTableUpdaterStorage/binding.go
````go
// Code generated - DO NOT EDIT.
// This file is a generated binding and any manual changes will be lost.
⋮----
package OperatorTableUpdaterStorage
⋮----
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"
)
⋮----
"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
)
⋮----
// BN254G1Point is an auto generated low-level Go binding around an user-defined struct.
type BN254G1Point struct {
	X *big.Int
	Y *big.Int
}
⋮----
// BN254G2Point is an auto generated low-level Go binding around an user-defined struct.
type BN254G2Point struct {
	X [2]*big.Int
	Y [2]*big.Int
}
⋮----
// IBN254CertificateVerifierTypesBN254Certificate is an auto generated low-level Go binding around an user-defined struct.
type IBN254CertificateVerifierTypesBN254Certificate struct {
	ReferenceTimestamp uint32
	MessageHash        [32]byte
	Signature          BN254G1Point
	Apk                BN254G2Point
	NonSignerWitnesses []IBN254CertificateVerifierTypesBN254OperatorInfoWitness
}
⋮----
// IBN254CertificateVerifierTypesBN254OperatorInfoWitness is an auto generated low-level Go binding around an user-defined struct.
type IBN254CertificateVerifierTypesBN254OperatorInfoWitness struct {
	OperatorIndex     uint32
	OperatorInfoProof []byte
	OperatorInfo      IOperatorTableCalculatorTypesBN254OperatorInfo
}
⋮----
// ICrossChainRegistryTypesOperatorSetConfig is an auto generated low-level Go binding around an user-defined struct.
type ICrossChainRegistryTypesOperatorSetConfig struct {
	Owner              common.Address
	MaxStalenessPeriod uint32
}
⋮----
// IOperatorTableCalculatorTypesBN254OperatorInfo is an auto generated low-level Go binding around an user-defined struct.
type IOperatorTableCalculatorTypesBN254OperatorInfo struct {
	Pubkey  BN254G1Point
	Weights []*big.Int
}
⋮----
// IOperatorTableCalculatorTypesBN254OperatorSetInfo is an auto generated low-level Go binding around an user-defined struct.
type IOperatorTableCalculatorTypesBN254OperatorSetInfo struct {
	OperatorInfoTreeRoot [32]byte
	NumOperators         *big.Int
	AggregatePubkey      BN254G1Point
	TotalWeights         []*big.Int
}
⋮----
// OperatorSet is an auto generated low-level Go binding around an user-defined struct.
type OperatorSet struct {
	Avs common.Address
	Id  uint32
}
⋮----
// OperatorTableUpdaterStorageMetaData contains all meta data concerning the OperatorTableUpdaterStorage contract.
var OperatorTableUpdaterStorageMetaData = &bind.MetaData{
	ABI: "[{\"type\":\"function\",\"name\":\"GENERATOR_GLOBAL_TABLE_ROOT\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"GENERATOR_MAX_STALENESS_PERIOD\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"GENERATOR_REFERENCE_TIMESTAMP\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"GLOBAL_TABLE_ROOT_CERT_TYPEHASH\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"MAX_BPS\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint16\",\"internalType\":\"uint16\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"bn254CertificateVerifier\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIBN254CertificateVerifier\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"confirmGlobalTableRoot\",\"inputs\":[{\"name\":\"globalTableRootCert\",\"type\":\"tuple\",\"internalType\":\"structIBN254CertificateVerifierTypes.BN254Certificate\",\"components\":[{\"name\":\"referenceTimestamp\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"messageHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"signature\",\"type\":\"tuple\",\"internalType\":\"structBN254.G1Point\",\"components\":[{\"name\":\"X\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"Y\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]},{\"name\":\"apk\",\"type\":\"tuple\",\"internalType\":\"structBN254.G2Point\",\"components\":[{\"name\":\"X\",\"type\":\"uint256[2]\",\"internalType\":\"uint256[2]\"},{\"name\":\"Y\",\"type\":\"uint256[2]\",\"internalType\":\"uint256[2]\"}]},{\"name\":\"nonSignerWitnesses\",\"type\":\"tuple[]\",\"internalType\":\"structIBN254CertificateVerifierTypes.BN254OperatorInfoWitness[]\",\"components\":[{\"name\":\"operatorIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"operatorInfoProof\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"operatorInfo\",\"type\":\"tuple\",\"internalType\":\"structIOperatorTableCalculatorTypes.BN254OperatorInfo\",\"components\":[{\"name\":\"pubkey\",\"type\":\"tuple\",\"internalType\":\"structBN254.G1Point\",\"components\":[{\"name\":\"X\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"Y\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]},{\"name\":\"weights\",\"type\":\"uint256[]\",\"internalType\":\"uint256[]\"}]}]}]},{\"name\":\"globalTableRoot\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"referenceTimestamp\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"referenceBlockNumber\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"disableRoot\",\"inputs\":[{\"name\":\"globalTableRoot\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"ecdsaCertificateVerifier\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIECDSACertificateVerifier\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getCertificateVerifier\",\"inputs\":[{\"name\":\"curveType\",\"type\":\"uint8\",\"internalType\":\"enumIKeyRegistrarTypes.CurveType\"}],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getCurrentGlobalTableRoot\",\"inputs\":[],\"outputs\":[{\"name\":\"globalTableRoot\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getGenerator\",\"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\":\"getGeneratorConfig\",\"inputs\":[],\"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\":\"getGeneratorReferenceTimestamp\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getGlobalTableRootByTimestamp\",\"inputs\":[{\"name\":\"referenceTimestamp\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"outputs\":[{\"name\":\"tableRoot\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getGlobalTableUpdateMessageHash\",\"inputs\":[{\"name\":\"globalTableRoot\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"referenceTimestamp\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"referenceBlockNumber\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getGlobalTableUpdateSignableDigest\",\"inputs\":[{\"name\":\"globalTableRoot\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"referenceTimestamp\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"referenceBlockNumber\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getLatestReferenceBlockNumber\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getLatestReferenceTimestamp\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getReferenceBlockNumberByTimestamp\",\"inputs\":[{\"name\":\"referenceTimestamp\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getReferenceTimestampByBlockNumber\",\"inputs\":[{\"name\":\"referenceBlockNumber\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"globalRootConfirmationThreshold\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint16\",\"internalType\":\"uint16\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"isRootValid\",\"inputs\":[{\"name\":\"globalTableRoot\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"isRootValidByTimestamp\",\"inputs\":[{\"name\":\"referenceTimestamp\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"setGlobalRootConfirmationThreshold\",\"inputs\":[{\"name\":\"bps\",\"type\":\"uint16\",\"internalType\":\"uint16\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"updateGenerator\",\"inputs\":[{\"name\":\"generator\",\"type\":\"tuple\",\"internalType\":\"structOperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]},{\"name\":\"generatorInfo\",\"type\":\"tuple\",\"internalType\":\"structIOperatorTableCalculatorTypes.BN254OperatorSetInfo\",\"components\":[{\"name\":\"operatorInfoTreeRoot\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"numOperators\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"aggregatePubkey\",\"type\":\"tuple\",\"internalType\":\"structBN254.G1Point\",\"components\":[{\"name\":\"X\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"Y\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]},{\"name\":\"totalWeights\",\"type\":\"uint256[]\",\"internalType\":\"uint256[]\"}]}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"updateOperatorTable\",\"inputs\":[{\"name\":\"referenceTimestamp\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"globalTableRoot\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"operatorSetIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"proof\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"operatorTableBytes\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"event\",\"name\":\"GeneratorUpdated\",\"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\":\"GlobalRootConfirmationThresholdUpdated\",\"inputs\":[{\"name\":\"bps\",\"type\":\"uint16\",\"indexed\":false,\"internalType\":\"uint16\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"GlobalRootDisabled\",\"inputs\":[{\"name\":\"globalTableRoot\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"NewGlobalTableRoot\",\"inputs\":[{\"name\":\"referenceTimestamp\",\"type\":\"uint32\",\"indexed\":true,\"internalType\":\"uint32\"},{\"name\":\"globalTableRoot\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"}],\"anonymous\":false},{\"type\":\"error\",\"name\":\"CannotDisableGeneratorRoot\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"CertificateInvalid\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"GlobalTableRootInFuture\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"GlobalTableRootStale\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidConfirmationThreshold\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidCurveType\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidGenerator\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidGlobalTableRoot\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidMessageHash\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidOperatorSet\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidOperatorSetProof\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidRoot\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"TableUpdateForPastTimestamp\",\"inputs\":[]}]",
}
⋮----
// OperatorTableUpdaterStorageABI is the input ABI used to generate the binding from.
// Deprecated: Use OperatorTableUpdaterStorageMetaData.ABI instead.
var OperatorTableUpdaterStorageABI = OperatorTableUpdaterStorageMetaData.ABI
⋮----
// OperatorTableUpdaterStorage is an auto generated Go binding around an Ethereum contract.
type OperatorTableUpdaterStorage struct {
	OperatorTableUpdaterStorageCaller     // Read-only binding to the contract
	OperatorTableUpdaterStorageTransactor // Write-only binding to the contract
	OperatorTableUpdaterStorageFilterer   // Log filterer for contract events
}
⋮----
OperatorTableUpdaterStorageCaller     // Read-only binding to the contract
OperatorTableUpdaterStorageTransactor // Write-only binding to the contract
OperatorTableUpdaterStorageFilterer   // Log filterer for contract events
⋮----
// OperatorTableUpdaterStorageCaller is an auto generated read-only Go binding around an Ethereum contract.
type OperatorTableUpdaterStorageCaller struct {
	contract *bind.BoundContract // Generic contract wrapper for the low level calls
}
⋮----
contract *bind.BoundContract // Generic contract wrapper for the low level calls
⋮----
// OperatorTableUpdaterStorageTransactor is an auto generated write-only Go binding around an Ethereum contract.
type OperatorTableUpdaterStorageTransactor struct {
	contract *bind.BoundContract // Generic contract wrapper for the low level calls
}
⋮----
// OperatorTableUpdaterStorageFilterer is an auto generated log filtering Go binding around an Ethereum contract events.
type OperatorTableUpdaterStorageFilterer struct {
	contract *bind.BoundContract // Generic contract wrapper for the low level calls
}
⋮----
// OperatorTableUpdaterStorageSession is an auto generated Go binding around an Ethereum contract,
// with pre-set call and transact options.
type OperatorTableUpdaterStorageSession struct {
	Contract     *OperatorTableUpdaterStorage // 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
}
⋮----
Contract     *OperatorTableUpdaterStorage // 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
⋮----
// OperatorTableUpdaterStorageCallerSession is an auto generated read-only Go binding around an Ethereum contract,
// with pre-set call options.
type OperatorTableUpdaterStorageCallerSession struct {
	Contract *OperatorTableUpdaterStorageCaller // Generic contract caller binding to set the session for
	CallOpts bind.CallOpts                      // Call options to use throughout this session
}
⋮----
Contract *OperatorTableUpdaterStorageCaller // Generic contract caller binding to set the session for
CallOpts bind.CallOpts                      // Call options to use throughout this session
⋮----
// OperatorTableUpdaterStorageTransactorSession is an auto generated write-only Go binding around an Ethereum contract,
// with pre-set transact options.
type OperatorTableUpdaterStorageTransactorSession struct {
	Contract     *OperatorTableUpdaterStorageTransactor // Generic contract transactor binding to set the session for
	TransactOpts bind.TransactOpts                      // Transaction auth options to use throughout this session
}
⋮----
Contract     *OperatorTableUpdaterStorageTransactor // Generic contract transactor binding to set the session for
TransactOpts bind.TransactOpts                      // Transaction auth options to use throughout this session
⋮----
// OperatorTableUpdaterStorageRaw is an auto generated low-level Go binding around an Ethereum contract.
type OperatorTableUpdaterStorageRaw struct {
	Contract *OperatorTableUpdaterStorage // Generic contract binding to access the raw methods on
}
⋮----
Contract *OperatorTableUpdaterStorage // Generic contract binding to access the raw methods on
⋮----
// OperatorTableUpdaterStorageCallerRaw is an auto generated low-level read-only Go binding around an Ethereum contract.
type OperatorTableUpdaterStorageCallerRaw struct {
	Contract *OperatorTableUpdaterStorageCaller // Generic read-only contract binding to access the raw methods on
}
⋮----
Contract *OperatorTableUpdaterStorageCaller // Generic read-only contract binding to access the raw methods on
⋮----
// OperatorTableUpdaterStorageTransactorRaw is an auto generated low-level write-only Go binding around an Ethereum contract.
type OperatorTableUpdaterStorageTransactorRaw struct {
	Contract *OperatorTableUpdaterStorageTransactor // Generic write-only contract binding to access the raw methods on
}
⋮----
Contract *OperatorTableUpdaterStorageTransactor // Generic write-only contract binding to access the raw methods on
⋮----
// NewOperatorTableUpdaterStorage creates a new instance of OperatorTableUpdaterStorage, bound to a specific deployed contract.
func NewOperatorTableUpdaterStorage(address common.Address, backend bind.ContractBackend) (*OperatorTableUpdaterStorage, error)
⋮----
// NewOperatorTableUpdaterStorageCaller creates a new read-only instance of OperatorTableUpdaterStorage, bound to a specific deployed contract.
func NewOperatorTableUpdaterStorageCaller(address common.Address, caller bind.ContractCaller) (*OperatorTableUpdaterStorageCaller, error)
⋮----
// NewOperatorTableUpdaterStorageTransactor creates a new write-only instance of OperatorTableUpdaterStorage, bound to a specific deployed contract.
func NewOperatorTableUpdaterStorageTransactor(address common.Address, transactor bind.ContractTransactor) (*OperatorTableUpdaterStorageTransactor, error)
⋮----
// NewOperatorTableUpdaterStorageFilterer creates a new log filterer instance of OperatorTableUpdaterStorage, bound to a specific deployed contract.
func NewOperatorTableUpdaterStorageFilterer(address common.Address, filterer bind.ContractFilterer) (*OperatorTableUpdaterStorageFilterer, error)
⋮----
// bindOperatorTableUpdaterStorage binds a generic wrapper to an already deployed contract.
func bindOperatorTableUpdaterStorage(address common.Address, caller bind.ContractCaller, transactor bind.ContractTransactor, filterer bind.ContractFilterer) (*bind.BoundContract, error)
⋮----
// 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 (_OperatorTableUpdaterStorage *OperatorTableUpdaterStorageRaw) Call(opts *bind.CallOpts, result *[]interface
⋮----
// Transfer initiates a plain transaction to move funds to the contract, calling
// its default method if one is available.
func (_OperatorTableUpdaterStorage *OperatorTableUpdaterStorageRaw) Transfer(opts *bind.TransactOpts) (*types.Transaction, error)
⋮----
// Transact invokes the (paid) contract method with params as input values.
func (_OperatorTableUpdaterStorage *OperatorTableUpdaterStorageRaw) Transact(opts *bind.TransactOpts, method string, params ...interface
⋮----
// GENERATORGLOBALTABLEROOT is a free data retrieval call binding the contract method 0x1bdc0deb.
//
// Solidity: function GENERATOR_GLOBAL_TABLE_ROOT() view returns(bytes32)
func (_OperatorTableUpdaterStorage *OperatorTableUpdaterStorageCaller) GENERATORGLOBALTABLEROOT(opts *bind.CallOpts) ([32]byte, error)
⋮----
var out []interface{}
⋮----
// GENERATORMAXSTALENESSPERIOD is a free data retrieval call binding the contract method 0x790961ea.
⋮----
// Solidity: function GENERATOR_MAX_STALENESS_PERIOD() view returns(uint32)
func (_OperatorTableUpdaterStorage *OperatorTableUpdaterStorageCaller) GENERATORMAXSTALENESSPERIOD(opts *bind.CallOpts) (uint32, error)
⋮----
// GENERATORREFERENCETIMESTAMP is a free data retrieval call binding the contract method 0x612abcb0.
⋮----
// Solidity: function GENERATOR_REFERENCE_TIMESTAMP() view returns(uint32)
func (_OperatorTableUpdaterStorage *OperatorTableUpdaterStorageCaller) GENERATORREFERENCETIMESTAMP(opts *bind.CallOpts) (uint32, error)
⋮----
// GLOBALTABLEROOTCERTTYPEHASH is a free data retrieval call binding the contract method 0x3ef6cd7a.
⋮----
// Solidity: function GLOBAL_TABLE_ROOT_CERT_TYPEHASH() view returns(bytes32)
func (_OperatorTableUpdaterStorage *OperatorTableUpdaterStorageCaller) GLOBALTABLEROOTCERTTYPEHASH(opts *bind.CallOpts) ([32]byte, error)
⋮----
// MAXBPS is a free data retrieval call binding the contract method 0xfd967f47.
⋮----
// Solidity: function MAX_BPS() view returns(uint16)
func (_OperatorTableUpdaterStorage *OperatorTableUpdaterStorageCaller) MAXBPS(opts *bind.CallOpts) (uint16, error)
⋮----
// Bn254CertificateVerifier is a free data retrieval call binding the contract method 0xb8c14306.
⋮----
// Solidity: function bn254CertificateVerifier() view returns(address)
func (_OperatorTableUpdaterStorage *OperatorTableUpdaterStorageCaller) Bn254CertificateVerifier(opts *bind.CallOpts) (common.Address, error)
⋮----
// EcdsaCertificateVerifier is a free data retrieval call binding the contract method 0xad0f9582.
⋮----
// Solidity: function ecdsaCertificateVerifier() view returns(address)
func (_OperatorTableUpdaterStorage *OperatorTableUpdaterStorageCaller) EcdsaCertificateVerifier(opts *bind.CallOpts) (common.Address, error)
⋮----
// GetCertificateVerifier is a free data retrieval call binding the contract method 0x6f728c50.
⋮----
// Solidity: function getCertificateVerifier(uint8 curveType) view returns(address)
func (_OperatorTableUpdaterStorage *OperatorTableUpdaterStorageCaller) GetCertificateVerifier(opts *bind.CallOpts, curveType uint8) (common.Address, error)
⋮----
// GetCurrentGlobalTableRoot is a free data retrieval call binding the contract method 0x28522d79.
⋮----
// Solidity: function getCurrentGlobalTableRoot() view returns(bytes32 globalTableRoot)
func (_OperatorTableUpdaterStorage *OperatorTableUpdaterStorageCaller) GetCurrentGlobalTableRoot(opts *bind.CallOpts) ([32]byte, error)
⋮----
// GetGenerator is a free data retrieval call binding the contract method 0x1e2ca260.
⋮----
// Solidity: function getGenerator() view returns((address,uint32))
func (_OperatorTableUpdaterStorage *OperatorTableUpdaterStorageCaller) GetGenerator(opts *bind.CallOpts) (OperatorSet, error)
⋮----
// GetGeneratorConfig is a free data retrieval call binding the contract method 0xb0cb3a24.
⋮----
// Solidity: function getGeneratorConfig() view returns((address,uint32))
func (_OperatorTableUpdaterStorage *OperatorTableUpdaterStorageCaller) GetGeneratorConfig(opts *bind.CallOpts) (ICrossChainRegistryTypesOperatorSetConfig, error)
⋮----
// GetGeneratorReferenceTimestamp is a free data retrieval call binding the contract method 0x7551ba34.
⋮----
// Solidity: function getGeneratorReferenceTimestamp() view returns(uint32)
func (_OperatorTableUpdaterStorage *OperatorTableUpdaterStorageCaller) GetGeneratorReferenceTimestamp(opts *bind.CallOpts) (uint32, error)
⋮----
// GetGlobalTableRootByTimestamp is a free data retrieval call binding the contract method 0xc5916a39.
⋮----
// Solidity: function getGlobalTableRootByTimestamp(uint32 referenceTimestamp) view returns(bytes32 tableRoot)
func (_OperatorTableUpdaterStorage *OperatorTableUpdaterStorageCaller) GetGlobalTableRootByTimestamp(opts *bind.CallOpts, referenceTimestamp uint32) ([32]byte, error)
⋮----
// GetGlobalTableUpdateMessageHash is a free data retrieval call binding the contract method 0xc3be1e33.
⋮----
// Solidity: function getGlobalTableUpdateMessageHash(bytes32 globalTableRoot, uint32 referenceTimestamp, uint32 referenceBlockNumber) view returns(bytes32)
func (_OperatorTableUpdaterStorage *OperatorTableUpdaterStorageCaller) GetGlobalTableUpdateMessageHash(opts *bind.CallOpts, globalTableRoot [32]byte, referenceTimestamp uint32, referenceBlockNumber uint32) ([32]byte, error)
⋮----
// GetGlobalTableUpdateSignableDigest is a free data retrieval call binding the contract method 0x401c370f.
⋮----
// Solidity: function getGlobalTableUpdateSignableDigest(bytes32 globalTableRoot, uint32 referenceTimestamp, uint32 referenceBlockNumber) view returns(bytes32)
func (_OperatorTableUpdaterStorage *OperatorTableUpdaterStorageCaller) GetGlobalTableUpdateSignableDigest(opts *bind.CallOpts, globalTableRoot [32]byte, referenceTimestamp uint32, referenceBlockNumber uint32) ([32]byte, error)
⋮----
// GetLatestReferenceBlockNumber is a free data retrieval call binding the contract method 0x31a599d2.
⋮----
// Solidity: function getLatestReferenceBlockNumber() view returns(uint32)
func (_OperatorTableUpdaterStorage *OperatorTableUpdaterStorageCaller) GetLatestReferenceBlockNumber(opts *bind.CallOpts) (uint32, error)
⋮----
// GetLatestReferenceTimestamp is a free data retrieval call binding the contract method 0x4624e6a3.
⋮----
// Solidity: function getLatestReferenceTimestamp() view returns(uint32)
func (_OperatorTableUpdaterStorage *OperatorTableUpdaterStorageCaller) GetLatestReferenceTimestamp(opts *bind.CallOpts) (uint32, error)
⋮----
// GetReferenceBlockNumberByTimestamp is a free data retrieval call binding the contract method 0x23b7b5b2.
⋮----
// Solidity: function getReferenceBlockNumberByTimestamp(uint32 referenceTimestamp) view returns(uint32)
func (_OperatorTableUpdaterStorage *OperatorTableUpdaterStorageCaller) GetReferenceBlockNumberByTimestamp(opts *bind.CallOpts, referenceTimestamp uint32) (uint32, error)
⋮----
// GetReferenceTimestampByBlockNumber is a free data retrieval call binding the contract method 0x193b79f3.
⋮----
// Solidity: function getReferenceTimestampByBlockNumber(uint32 referenceBlockNumber) view returns(uint32)
func (_OperatorTableUpdaterStorage *OperatorTableUpdaterStorageCaller) GetReferenceTimestampByBlockNumber(opts *bind.CallOpts, referenceBlockNumber uint32) (uint32, error)
⋮----
// GlobalRootConfirmationThreshold is a free data retrieval call binding the contract method 0xc252aa22.
⋮----
// Solidity: function globalRootConfirmationThreshold() view returns(uint16)
func (_OperatorTableUpdaterStorage *OperatorTableUpdaterStorageCaller) GlobalRootConfirmationThreshold(opts *bind.CallOpts) (uint16, error)
⋮----
// IsRootValid is a free data retrieval call binding the contract method 0x30ef41b4.
⋮----
// Solidity: function isRootValid(bytes32 globalTableRoot) view returns(bool)
func (_OperatorTableUpdaterStorage *OperatorTableUpdaterStorageCaller) IsRootValid(opts *bind.CallOpts, globalTableRoot [32]byte) (bool, error)
⋮----
// IsRootValidByTimestamp is a free data retrieval call binding the contract method 0x64e1df84.
⋮----
// Solidity: function isRootValidByTimestamp(uint32 referenceTimestamp) view returns(bool)
func (_OperatorTableUpdaterStorage *OperatorTableUpdaterStorageCaller) IsRootValidByTimestamp(opts *bind.CallOpts, referenceTimestamp uint32) (bool, error)
⋮----
// ConfirmGlobalTableRoot is a paid mutator transaction binding the contract method 0xeaaed9d5.
⋮----
// Solidity: function confirmGlobalTableRoot((uint32,bytes32,(uint256,uint256),(uint256[2],uint256[2]),(uint32,bytes,((uint256,uint256),uint256[]))[]) globalTableRootCert, bytes32 globalTableRoot, uint32 referenceTimestamp, uint32 referenceBlockNumber) returns()
func (_OperatorTableUpdaterStorage *OperatorTableUpdaterStorageTransactor) ConfirmGlobalTableRoot(opts *bind.TransactOpts, globalTableRootCert IBN254CertificateVerifierTypesBN254Certificate, globalTableRoot [32]byte, referenceTimestamp uint32, referenceBlockNumber uint32) (*types.Transaction, error)
⋮----
// DisableRoot is a paid mutator transaction binding the contract method 0xc3621f0a.
⋮----
// Solidity: function disableRoot(bytes32 globalTableRoot) returns()
func (_OperatorTableUpdaterStorage *OperatorTableUpdaterStorageTransactor) DisableRoot(opts *bind.TransactOpts, globalTableRoot [32]byte) (*types.Transaction, error)
⋮----
// SetGlobalRootConfirmationThreshold is a paid mutator transaction binding the contract method 0x2370356c.
⋮----
// Solidity: function setGlobalRootConfirmationThreshold(uint16 bps) returns()
func (_OperatorTableUpdaterStorage *OperatorTableUpdaterStorageTransactor) SetGlobalRootConfirmationThreshold(opts *bind.TransactOpts, bps uint16) (*types.Transaction, error)
⋮----
// UpdateGenerator is a paid mutator transaction binding the contract method 0x9f7e206f.
⋮----
// Solidity: function updateGenerator((address,uint32) generator, (bytes32,uint256,(uint256,uint256),uint256[]) generatorInfo) returns()
func (_OperatorTableUpdaterStorage *OperatorTableUpdaterStorageTransactor) UpdateGenerator(opts *bind.TransactOpts, generator OperatorSet, generatorInfo IOperatorTableCalculatorTypesBN254OperatorSetInfo) (*types.Transaction, error)
⋮----
// UpdateOperatorTable is a paid mutator transaction binding the contract method 0x9ea94778.
⋮----
// Solidity: function updateOperatorTable(uint32 referenceTimestamp, bytes32 globalTableRoot, uint32 operatorSetIndex, bytes proof, bytes operatorTableBytes) returns()
func (_OperatorTableUpdaterStorage *OperatorTableUpdaterStorageTransactor) UpdateOperatorTable(opts *bind.TransactOpts, referenceTimestamp uint32, globalTableRoot [32]byte, operatorSetIndex uint32, proof []byte, operatorTableBytes []byte) (*types.Transaction, error)
⋮----
// OperatorTableUpdaterStorageGeneratorUpdatedIterator is returned from FilterGeneratorUpdated and is used to iterate over the raw logs and unpacked data for GeneratorUpdated events raised by the OperatorTableUpdaterStorage contract.
type OperatorTableUpdaterStorageGeneratorUpdatedIterator struct {
	Event *OperatorTableUpdaterStorageGeneratorUpdated // 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
}
⋮----
Event *OperatorTableUpdaterStorageGeneratorUpdated // 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 *OperatorTableUpdaterStorageGeneratorUpdatedIterator) Next() bool
⋮----
// If the iterator failed, stop iterating
⋮----
// If the iterator completed, deliver directly whatever's available
⋮----
// Iterator still in progress, wait for either a data or an error event
⋮----
// Error returns any retrieval or parsing error occurred during filtering.
func (it *OperatorTableUpdaterStorageGeneratorUpdatedIterator) Error() error
⋮----
// Close terminates the iteration process, releasing any pending underlying
// resources.
func (it *OperatorTableUpdaterStorageGeneratorUpdatedIterator) Close() error
⋮----
// OperatorTableUpdaterStorageGeneratorUpdated represents a GeneratorUpdated event raised by the OperatorTableUpdaterStorage contract.
type OperatorTableUpdaterStorageGeneratorUpdated struct {
	OperatorSet OperatorSet
	Raw         types.Log // Blockchain specific contextual infos
}
⋮----
Raw         types.Log // Blockchain specific contextual infos
⋮----
// FilterGeneratorUpdated is a free log retrieval operation binding the contract event 0x3463431b09dfd43dec7349f8f24acfa753fe4cf40a26235402d213373df15856.
⋮----
// Solidity: event GeneratorUpdated((address,uint32) operatorSet)
func (_OperatorTableUpdaterStorage *OperatorTableUpdaterStorageFilterer) FilterGeneratorUpdated(opts *bind.FilterOpts) (*OperatorTableUpdaterStorageGeneratorUpdatedIterator, error)
⋮----
// WatchGeneratorUpdated is a free log subscription operation binding the contract event 0x3463431b09dfd43dec7349f8f24acfa753fe4cf40a26235402d213373df15856.
⋮----
func (_OperatorTableUpdaterStorage *OperatorTableUpdaterStorageFilterer) WatchGeneratorUpdated(opts *bind.WatchOpts, sink chan<- *OperatorTableUpdaterStorageGeneratorUpdated) (event.Subscription, error)
⋮----
// New log arrived, parse the event and forward to the user
⋮----
// ParseGeneratorUpdated is a log parse operation binding the contract event 0x3463431b09dfd43dec7349f8f24acfa753fe4cf40a26235402d213373df15856.
⋮----
func (_OperatorTableUpdaterStorage *OperatorTableUpdaterStorageFilterer) ParseGeneratorUpdated(log types.Log) (*OperatorTableUpdaterStorageGeneratorUpdated, error)
⋮----
// OperatorTableUpdaterStorageGlobalRootConfirmationThresholdUpdatedIterator is returned from FilterGlobalRootConfirmationThresholdUpdated and is used to iterate over the raw logs and unpacked data for GlobalRootConfirmationThresholdUpdated events raised by the OperatorTableUpdaterStorage contract.
type OperatorTableUpdaterStorageGlobalRootConfirmationThresholdUpdatedIterator struct {
	Event *OperatorTableUpdaterStorageGlobalRootConfirmationThresholdUpdated // 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
}
⋮----
Event *OperatorTableUpdaterStorageGlobalRootConfirmationThresholdUpdated // Event containing the contract specifics and raw log
⋮----
// OperatorTableUpdaterStorageGlobalRootConfirmationThresholdUpdated represents a GlobalRootConfirmationThresholdUpdated event raised by the OperatorTableUpdaterStorage contract.
type OperatorTableUpdaterStorageGlobalRootConfirmationThresholdUpdated struct {
	Bps uint16
	Raw types.Log // Blockchain specific contextual infos
}
⋮----
Raw types.Log // Blockchain specific contextual infos
⋮----
// FilterGlobalRootConfirmationThresholdUpdated is a free log retrieval operation binding the contract event 0xf5d1836df8fcd7c1e54047e94ac8773d2855395603e2ef9ba5f5f16905f22592.
⋮----
// Solidity: event GlobalRootConfirmationThresholdUpdated(uint16 bps)
func (_OperatorTableUpdaterStorage *OperatorTableUpdaterStorageFilterer) FilterGlobalRootConfirmationThresholdUpdated(opts *bind.FilterOpts) (*OperatorTableUpdaterStorageGlobalRootConfirmationThresholdUpdatedIterator, error)
⋮----
// WatchGlobalRootConfirmationThresholdUpdated is a free log subscription operation binding the contract event 0xf5d1836df8fcd7c1e54047e94ac8773d2855395603e2ef9ba5f5f16905f22592.
⋮----
func (_OperatorTableUpdaterStorage *OperatorTableUpdaterStorageFilterer) WatchGlobalRootConfirmationThresholdUpdated(opts *bind.WatchOpts, sink chan<- *OperatorTableUpdaterStorageGlobalRootConfirmationThresholdUpdated) (event.Subscription, error)
⋮----
// ParseGlobalRootConfirmationThresholdUpdated is a log parse operation binding the contract event 0xf5d1836df8fcd7c1e54047e94ac8773d2855395603e2ef9ba5f5f16905f22592.
⋮----
func (_OperatorTableUpdaterStorage *OperatorTableUpdaterStorageFilterer) ParseGlobalRootConfirmationThresholdUpdated(log types.Log) (*OperatorTableUpdaterStorageGlobalRootConfirmationThresholdUpdated, error)
⋮----
// OperatorTableUpdaterStorageGlobalRootDisabledIterator is returned from FilterGlobalRootDisabled and is used to iterate over the raw logs and unpacked data for GlobalRootDisabled events raised by the OperatorTableUpdaterStorage contract.
type OperatorTableUpdaterStorageGlobalRootDisabledIterator struct {
	Event *OperatorTableUpdaterStorageGlobalRootDisabled // 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
}
⋮----
Event *OperatorTableUpdaterStorageGlobalRootDisabled // Event containing the contract specifics and raw log
⋮----
// OperatorTableUpdaterStorageGlobalRootDisabled represents a GlobalRootDisabled event raised by the OperatorTableUpdaterStorage contract.
type OperatorTableUpdaterStorageGlobalRootDisabled struct {
	GlobalTableRoot [32]byte
	Raw             types.Log // Blockchain specific contextual infos
}
⋮----
Raw             types.Log // Blockchain specific contextual infos
⋮----
// FilterGlobalRootDisabled is a free log retrieval operation binding the contract event 0x8bd43de1250f58fe6ec9a78671a8b78dba70f0018656d157a3aeaabec389df34.
⋮----
// Solidity: event GlobalRootDisabled(bytes32 indexed globalTableRoot)
func (_OperatorTableUpdaterStorage *OperatorTableUpdaterStorageFilterer) FilterGlobalRootDisabled(opts *bind.FilterOpts, globalTableRoot [][32]byte) (*OperatorTableUpdaterStorageGlobalRootDisabledIterator, error)
⋮----
var globalTableRootRule []interface{}
⋮----
// WatchGlobalRootDisabled is a free log subscription operation binding the contract event 0x8bd43de1250f58fe6ec9a78671a8b78dba70f0018656d157a3aeaabec389df34.
⋮----
func (_OperatorTableUpdaterStorage *OperatorTableUpdaterStorageFilterer) WatchGlobalRootDisabled(opts *bind.WatchOpts, sink chan<- *OperatorTableUpdaterStorageGlobalRootDisabled, globalTableRoot [][32]byte) (event.Subscription, error)
⋮----
// ParseGlobalRootDisabled is a log parse operation binding the contract event 0x8bd43de1250f58fe6ec9a78671a8b78dba70f0018656d157a3aeaabec389df34.
⋮----
func (_OperatorTableUpdaterStorage *OperatorTableUpdaterStorageFilterer) ParseGlobalRootDisabled(log types.Log) (*OperatorTableUpdaterStorageGlobalRootDisabled, error)
⋮----
// OperatorTableUpdaterStorageNewGlobalTableRootIterator is returned from FilterNewGlobalTableRoot and is used to iterate over the raw logs and unpacked data for NewGlobalTableRoot events raised by the OperatorTableUpdaterStorage contract.
type OperatorTableUpdaterStorageNewGlobalTableRootIterator struct {
	Event *OperatorTableUpdaterStorageNewGlobalTableRoot // 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
}
⋮----
Event *OperatorTableUpdaterStorageNewGlobalTableRoot // Event containing the contract specifics and raw log
⋮----
// OperatorTableUpdaterStorageNewGlobalTableRoot represents a NewGlobalTableRoot event raised by the OperatorTableUpdaterStorage contract.
type OperatorTableUpdaterStorageNewGlobalTableRoot struct {
	ReferenceTimestamp uint32
	GlobalTableRoot    [32]byte
	Raw                types.Log // Blockchain specific contextual infos
}
⋮----
Raw                types.Log // Blockchain specific contextual infos
⋮----
// FilterNewGlobalTableRoot is a free log retrieval operation binding the contract event 0x010dcbe0d1e019c93357711f7bb6287d543b7ff7de74f29df3fb5ecceec8d369.
⋮----
// Solidity: event NewGlobalTableRoot(uint32 indexed referenceTimestamp, bytes32 indexed globalTableRoot)
func (_OperatorTableUpdaterStorage *OperatorTableUpdaterStorageFilterer) FilterNewGlobalTableRoot(opts *bind.FilterOpts, referenceTimestamp []uint32, globalTableRoot [][32]byte) (*OperatorTableUpdaterStorageNewGlobalTableRootIterator, error)
⋮----
var referenceTimestampRule []interface{}
⋮----
// WatchNewGlobalTableRoot is a free log subscription operation binding the contract event 0x010dcbe0d1e019c93357711f7bb6287d543b7ff7de74f29df3fb5ecceec8d369.
⋮----
func (_OperatorTableUpdaterStorage *OperatorTableUpdaterStorageFilterer) WatchNewGlobalTableRoot(opts *bind.WatchOpts, sink chan<- *OperatorTableUpdaterStorageNewGlobalTableRoot, referenceTimestamp []uint32, globalTableRoot [][32]byte) (event.Subscription, error)
⋮----
// ParseNewGlobalTableRoot is a log parse operation binding the contract event 0x010dcbe0d1e019c93357711f7bb6287d543b7ff7de74f29df3fb5ecceec8d369.
⋮----
func (_OperatorTableUpdaterStorage *OperatorTableUpdaterStorageFilterer) ParseNewGlobalTableRoot(log types.Log) (*OperatorTableUpdaterStorageNewGlobalTableRoot, error)
````

## File: pkg/bindings/Pausable/binding.go
````go
// Code generated - DO NOT EDIT.
// This file is a generated binding and any manual changes will be lost.
⋮----
package Pausable
⋮----
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"
)
⋮----
"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
)
⋮----
// PausableMetaData contains all meta data concerning the Pausable contract.
var PausableMetaData = &bind.MetaData{
	ABI: "[{\"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\":\"unpause\",\"inputs\":[{\"name\":\"newPausedStatus\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"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\":\"OnlyPauser\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"OnlyUnpauser\",\"inputs\":[]}]",
}
⋮----
// PausableABI is the input ABI used to generate the binding from.
// Deprecated: Use PausableMetaData.ABI instead.
var PausableABI = PausableMetaData.ABI
⋮----
// Pausable is an auto generated Go binding around an Ethereum contract.
type Pausable struct {
	PausableCaller     // Read-only binding to the contract
	PausableTransactor // Write-only binding to the contract
	PausableFilterer   // Log filterer for contract events
}
⋮----
PausableCaller     // Read-only binding to the contract
PausableTransactor // Write-only binding to the contract
PausableFilterer   // Log filterer for contract events
⋮----
// PausableCaller is an auto generated read-only Go binding around an Ethereum contract.
type PausableCaller struct {
	contract *bind.BoundContract // Generic contract wrapper for the low level calls
}
⋮----
contract *bind.BoundContract // Generic contract wrapper for the low level calls
⋮----
// PausableTransactor is an auto generated write-only Go binding around an Ethereum contract.
type PausableTransactor struct {
	contract *bind.BoundContract // Generic contract wrapper for the low level calls
}
⋮----
// PausableFilterer is an auto generated log filtering Go binding around an Ethereum contract events.
type PausableFilterer struct {
	contract *bind.BoundContract // Generic contract wrapper for the low level calls
}
⋮----
// PausableSession is an auto generated Go binding around an Ethereum contract,
// with pre-set call and transact options.
type PausableSession struct {
	Contract     *Pausable         // 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
}
⋮----
Contract     *Pausable         // 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
⋮----
// PausableCallerSession is an auto generated read-only Go binding around an Ethereum contract,
// with pre-set call options.
type PausableCallerSession struct {
	Contract *PausableCaller // Generic contract caller binding to set the session for
	CallOpts bind.CallOpts   // Call options to use throughout this session
}
⋮----
Contract *PausableCaller // Generic contract caller binding to set the session for
CallOpts bind.CallOpts   // Call options to use throughout this session
⋮----
// PausableTransactorSession is an auto generated write-only Go binding around an Ethereum contract,
// with pre-set transact options.
type PausableTransactorSession struct {
	Contract     *PausableTransactor // Generic contract transactor binding to set the session for
	TransactOpts bind.TransactOpts   // Transaction auth options to use throughout this session
}
⋮----
Contract     *PausableTransactor // Generic contract transactor binding to set the session for
TransactOpts bind.TransactOpts   // Transaction auth options to use throughout this session
⋮----
// PausableRaw is an auto generated low-level Go binding around an Ethereum contract.
type PausableRaw struct {
	Contract *Pausable // Generic contract binding to access the raw methods on
}
⋮----
Contract *Pausable // Generic contract binding to access the raw methods on
⋮----
// PausableCallerRaw is an auto generated low-level read-only Go binding around an Ethereum contract.
type PausableCallerRaw struct {
	Contract *PausableCaller // Generic read-only contract binding to access the raw methods on
}
⋮----
Contract *PausableCaller // Generic read-only contract binding to access the raw methods on
⋮----
// PausableTransactorRaw is an auto generated low-level write-only Go binding around an Ethereum contract.
type PausableTransactorRaw struct {
	Contract *PausableTransactor // Generic write-only contract binding to access the raw methods on
}
⋮----
Contract *PausableTransactor // Generic write-only contract binding to access the raw methods on
⋮----
// NewPausable creates a new instance of Pausable, bound to a specific deployed contract.
func NewPausable(address common.Address, backend bind.ContractBackend) (*Pausable, error)
⋮----
// NewPausableCaller creates a new read-only instance of Pausable, bound to a specific deployed contract.
func NewPausableCaller(address common.Address, caller bind.ContractCaller) (*PausableCaller, error)
⋮----
// NewPausableTransactor creates a new write-only instance of Pausable, bound to a specific deployed contract.
func NewPausableTransactor(address common.Address, transactor bind.ContractTransactor) (*PausableTransactor, error)
⋮----
// NewPausableFilterer creates a new log filterer instance of Pausable, bound to a specific deployed contract.
func NewPausableFilterer(address common.Address, filterer bind.ContractFilterer) (*PausableFilterer, error)
⋮----
// bindPausable binds a generic wrapper to an already deployed contract.
func bindPausable(address common.Address, caller bind.ContractCaller, transactor bind.ContractTransactor, filterer bind.ContractFilterer) (*bind.BoundContract, error)
⋮----
// 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 (_Pausable *PausableRaw) Call(opts *bind.CallOpts, result *[]interface
⋮----
// Transfer initiates a plain transaction to move funds to the contract, calling
// its default method if one is available.
func (_Pausable *PausableRaw) Transfer(opts *bind.TransactOpts) (*types.Transaction, error)
⋮----
// Transact invokes the (paid) contract method with params as input values.
func (_Pausable *PausableRaw) Transact(opts *bind.TransactOpts, method string, params ...interface
⋮----
// Paused is a free data retrieval call binding the contract method 0x5ac86ab7.
//
// Solidity: function paused(uint8 index) view returns(bool)
func (_Pausable *PausableCaller) Paused(opts *bind.CallOpts, index uint8) (bool, error)
⋮----
var out []interface{}
⋮----
// Paused0 is a free data retrieval call binding the contract method 0x5c975abb.
⋮----
// Solidity: function paused() view returns(uint256)
func (_Pausable *PausableCaller) Paused0(opts *bind.CallOpts) (*big.Int, error)
⋮----
// PauserRegistry is a free data retrieval call binding the contract method 0x886f1195.
⋮----
// Solidity: function pauserRegistry() view returns(address)
func (_Pausable *PausableCaller) PauserRegistry(opts *bind.CallOpts) (common.Address, error)
⋮----
// Pause is a paid mutator transaction binding the contract method 0x136439dd.
⋮----
// Solidity: function pause(uint256 newPausedStatus) returns()
func (_Pausable *PausableTransactor) Pause(opts *bind.TransactOpts, newPausedStatus *big.Int) (*types.Transaction, error)
⋮----
// PauseAll is a paid mutator transaction binding the contract method 0x595c6a67.
⋮----
// Solidity: function pauseAll() returns()
func (_Pausable *PausableTransactor) PauseAll(opts *bind.TransactOpts) (*types.Transaction, error)
⋮----
// Unpause is a paid mutator transaction binding the contract method 0xfabc1cbc.
⋮----
// Solidity: function unpause(uint256 newPausedStatus) returns()
func (_Pausable *PausableTransactor) Unpause(opts *bind.TransactOpts, newPausedStatus *big.Int) (*types.Transaction, error)
⋮----
// PausablePausedIterator is returned from FilterPaused and is used to iterate over the raw logs and unpacked data for Paused events raised by the Pausable contract.
type PausablePausedIterator struct {
	Event *PausablePaused // 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
}
⋮----
Event *PausablePaused // 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 *PausablePausedIterator) Next() bool
⋮----
// If the iterator failed, stop iterating
⋮----
// If the iterator completed, deliver directly whatever's available
⋮----
// Iterator still in progress, wait for either a data or an error event
⋮----
// Error returns any retrieval or parsing error occurred during filtering.
func (it *PausablePausedIterator) Error() error
⋮----
// Close terminates the iteration process, releasing any pending underlying
// resources.
func (it *PausablePausedIterator) Close() error
⋮----
// PausablePaused represents a Paused event raised by the Pausable contract.
type PausablePaused struct {
	Account         common.Address
	NewPausedStatus *big.Int
	Raw             types.Log // Blockchain specific contextual infos
}
⋮----
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 (_Pausable *PausableFilterer) FilterPaused(opts *bind.FilterOpts, account []common.Address) (*PausablePausedIterator, error)
⋮----
var accountRule []interface{}
⋮----
// WatchPaused is a free log subscription operation binding the contract event 0xab40a374bc51de372200a8bc981af8c9ecdc08dfdaef0bb6e09f88f3c616ef3d.
⋮----
func (_Pausable *PausableFilterer) WatchPaused(opts *bind.WatchOpts, sink chan<- *PausablePaused, account []common.Address) (event.Subscription, error)
⋮----
// New log arrived, parse the event and forward to the user
⋮----
// ParsePaused is a log parse operation binding the contract event 0xab40a374bc51de372200a8bc981af8c9ecdc08dfdaef0bb6e09f88f3c616ef3d.
⋮----
func (_Pausable *PausableFilterer) ParsePaused(log types.Log) (*PausablePaused, error)
⋮----
// PausableUnpausedIterator is returned from FilterUnpaused and is used to iterate over the raw logs and unpacked data for Unpaused events raised by the Pausable contract.
type PausableUnpausedIterator struct {
	Event *PausableUnpaused // 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
}
⋮----
Event *PausableUnpaused // Event containing the contract specifics and raw log
⋮----
// PausableUnpaused represents a Unpaused event raised by the Pausable contract.
type PausableUnpaused 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 (_Pausable *PausableFilterer) FilterUnpaused(opts *bind.FilterOpts, account []common.Address) (*PausableUnpausedIterator, error)
⋮----
// WatchUnpaused is a free log subscription operation binding the contract event 0x3582d1828e26bf56bd801502bc021ac0bc8afb57c826e4986b45593c8fad389c.
⋮----
func (_Pausable *PausableFilterer) WatchUnpaused(opts *bind.WatchOpts, sink chan<- *PausableUnpaused, account []common.Address) (event.Subscription, error)
⋮----
// ParseUnpaused is a log parse operation binding the contract event 0x3582d1828e26bf56bd801502bc021ac0bc8afb57c826e4986b45593c8fad389c.
⋮----
func (_Pausable *PausableFilterer) ParseUnpaused(log types.Log) (*PausableUnpaused, error)
````

## File: pkg/bindings/PauserRegistry/binding.go
````go
// Code generated - DO NOT EDIT.
// This file is a generated binding and any manual changes will be lost.
⋮----
package PauserRegistry
⋮----
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"
)
⋮----
"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
)
⋮----
// PauserRegistryMetaData contains all meta data concerning the PauserRegistry contract.
var PauserRegistryMetaData = &bind.MetaData{
	ABI: "[{\"type\":\"constructor\",\"inputs\":[{\"name\":\"_pausers\",\"type\":\"address[]\",\"internalType\":\"address[]\"},{\"name\":\"_unpauser\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"isPauser\",\"inputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"setIsPauser\",\"inputs\":[{\"name\":\"newPauser\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"canPause\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"setUnpauser\",\"inputs\":[{\"name\":\"newUnpauser\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"unpauser\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"event\",\"name\":\"PauserStatusChanged\",\"inputs\":[{\"name\":\"pauser\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"},{\"name\":\"canPause\",\"type\":\"bool\",\"indexed\":false,\"internalType\":\"bool\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"UnpauserChanged\",\"inputs\":[{\"name\":\"previousUnpauser\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"},{\"name\":\"newUnpauser\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"error\",\"name\":\"InputAddressZero\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"OnlyUnpauser\",\"inputs\":[]}]",
	Bin: "0x608060405234801561000f575f5ffd5b506040516105c83803806105c883398101604081905261002e916101c2565b5f5b825181101561006b5761006383828151811061004e5761004e61029e565b6020026020010151600161007c60201b60201c565b600101610030565b5061007581610103565b50506102b2565b6001600160a01b0382166100a3576040516339b190bb60e11b815260040160405180910390fd5b6001600160a01b0382165f8181526020818152604091829020805460ff19168515159081179091558251938452908301527f65d3a1fd4c13f05cba164f80d03ce90fb4b5e21946bfc3ab7dbd434c2d0b9152910160405180910390a15050565b6001600160a01b03811661012a576040516339b190bb60e11b815260040160405180910390fd5b600154604080516001600160a01b03928316815291831660208301527f06b4167a2528887a1e97a366eefe8549bfbf1ea3e6ac81cb2564a934d20e8892910160405180910390a1600180546001600160a01b0319166001600160a01b0392909216919091179055565b634e487b7160e01b5f52604160045260245ffd5b80516001600160a01b03811681146101bd575f5ffd5b919050565b5f5f604083850312156101d3575f5ffd5b82516001600160401b038111156101e8575f5ffd5b8301601f810185136101f8575f5ffd5b80516001600160401b0381111561021157610211610193565b604051600582901b90603f8201601f191681016001600160401b038111828210171561023f5761023f610193565b60405291825260208184018101929081018884111561025c575f5ffd5b6020850194505b8385101561028257610274856101a7565b815260209485019401610263565b50945061029592505050602084016101a7565b90509250929050565b634e487b7160e01b5f52603260045260245ffd5b610309806102bf5f395ff3fe608060405234801561000f575f5ffd5b506004361061004a575f3560e01c806346fbf68e1461004e5780638568520614610085578063ce5484281461009a578063eab66d7a146100ad575b5f5ffd5b61007061005c36600461027a565b5f6020819052908152604090205460ff1681565b60405190151581526020015b60405180910390f35b61009861009336600461029a565b6100d8565b005b6100986100a836600461027a565b610111565b6001546100c0906001600160a01b031681565b6040516001600160a01b03909116815260200161007c565b6001546001600160a01b031633146101035760405163794821ff60e01b815260040160405180910390fd5b61010d8282610148565b5050565b6001546001600160a01b0316331461013c5760405163794821ff60e01b815260040160405180910390fd5b610145816101cf565b50565b6001600160a01b03821661016f576040516339b190bb60e11b815260040160405180910390fd5b6001600160a01b0382165f8181526020818152604091829020805460ff19168515159081179091558251938452908301527f65d3a1fd4c13f05cba164f80d03ce90fb4b5e21946bfc3ab7dbd434c2d0b9152910160405180910390a15050565b6001600160a01b0381166101f6576040516339b190bb60e11b815260040160405180910390fd5b600154604080516001600160a01b03928316815291831660208301527f06b4167a2528887a1e97a366eefe8549bfbf1ea3e6ac81cb2564a934d20e8892910160405180910390a1600180546001600160a01b0319166001600160a01b0392909216919091179055565b80356001600160a01b0381168114610275575f5ffd5b919050565b5f6020828403121561028a575f5ffd5b6102938261025f565b9392505050565b5f5f604083850312156102ab575f5ffd5b6102b48361025f565b9150602083013580151581146102c8575f5ffd5b80915050925092905056fea264697066735822122071501aecbae4787d0072f2be51247cdaa33b40643b53eb978af689d95167caa464736f6c634300081e0033",
}
⋮----
// PauserRegistryABI is the input ABI used to generate the binding from.
// Deprecated: Use PauserRegistryMetaData.ABI instead.
var PauserRegistryABI = PauserRegistryMetaData.ABI
⋮----
// PauserRegistryBin is the compiled bytecode used for deploying new contracts.
// Deprecated: Use PauserRegistryMetaData.Bin instead.
var PauserRegistryBin = PauserRegistryMetaData.Bin
⋮----
// DeployPauserRegistry deploys a new Ethereum contract, binding an instance of PauserRegistry to it.
func DeployPauserRegistry(auth *bind.TransactOpts, backend bind.ContractBackend, _pausers []common.Address, _unpauser common.Address) (common.Address, *types.Transaction, *PauserRegistry, error)
⋮----
// PauserRegistry is an auto generated Go binding around an Ethereum contract.
type PauserRegistry struct {
	PauserRegistryCaller     // Read-only binding to the contract
	PauserRegistryTransactor // Write-only binding to the contract
	PauserRegistryFilterer   // Log filterer for contract events
}
⋮----
PauserRegistryCaller     // Read-only binding to the contract
PauserRegistryTransactor // Write-only binding to the contract
PauserRegistryFilterer   // Log filterer for contract events
⋮----
// PauserRegistryCaller is an auto generated read-only Go binding around an Ethereum contract.
type PauserRegistryCaller struct {
	contract *bind.BoundContract // Generic contract wrapper for the low level calls
}
⋮----
contract *bind.BoundContract // Generic contract wrapper for the low level calls
⋮----
// PauserRegistryTransactor is an auto generated write-only Go binding around an Ethereum contract.
type PauserRegistryTransactor struct {
	contract *bind.BoundContract // Generic contract wrapper for the low level calls
}
⋮----
// PauserRegistryFilterer is an auto generated log filtering Go binding around an Ethereum contract events.
type PauserRegistryFilterer struct {
	contract *bind.BoundContract // Generic contract wrapper for the low level calls
}
⋮----
// PauserRegistrySession is an auto generated Go binding around an Ethereum contract,
// with pre-set call and transact options.
type PauserRegistrySession struct {
	Contract     *PauserRegistry   // 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
}
⋮----
Contract     *PauserRegistry   // 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
⋮----
// PauserRegistryCallerSession is an auto generated read-only Go binding around an Ethereum contract,
// with pre-set call options.
type PauserRegistryCallerSession struct {
	Contract *PauserRegistryCaller // Generic contract caller binding to set the session for
	CallOpts bind.CallOpts         // Call options to use throughout this session
}
⋮----
Contract *PauserRegistryCaller // Generic contract caller binding to set the session for
CallOpts bind.CallOpts         // Call options to use throughout this session
⋮----
// PauserRegistryTransactorSession is an auto generated write-only Go binding around an Ethereum contract,
// with pre-set transact options.
type PauserRegistryTransactorSession struct {
	Contract     *PauserRegistryTransactor // Generic contract transactor binding to set the session for
	TransactOpts bind.TransactOpts         // Transaction auth options to use throughout this session
}
⋮----
Contract     *PauserRegistryTransactor // Generic contract transactor binding to set the session for
TransactOpts bind.TransactOpts         // Transaction auth options to use throughout this session
⋮----
// PauserRegistryRaw is an auto generated low-level Go binding around an Ethereum contract.
type PauserRegistryRaw struct {
	Contract *PauserRegistry // Generic contract binding to access the raw methods on
}
⋮----
Contract *PauserRegistry // Generic contract binding to access the raw methods on
⋮----
// PauserRegistryCallerRaw is an auto generated low-level read-only Go binding around an Ethereum contract.
type PauserRegistryCallerRaw struct {
	Contract *PauserRegistryCaller // Generic read-only contract binding to access the raw methods on
}
⋮----
Contract *PauserRegistryCaller // Generic read-only contract binding to access the raw methods on
⋮----
// PauserRegistryTransactorRaw is an auto generated low-level write-only Go binding around an Ethereum contract.
type PauserRegistryTransactorRaw struct {
	Contract *PauserRegistryTransactor // Generic write-only contract binding to access the raw methods on
}
⋮----
Contract *PauserRegistryTransactor // Generic write-only contract binding to access the raw methods on
⋮----
// NewPauserRegistry creates a new instance of PauserRegistry, bound to a specific deployed contract.
func NewPauserRegistry(address common.Address, backend bind.ContractBackend) (*PauserRegistry, error)
⋮----
// NewPauserRegistryCaller creates a new read-only instance of PauserRegistry, bound to a specific deployed contract.
func NewPauserRegistryCaller(address common.Address, caller bind.ContractCaller) (*PauserRegistryCaller, error)
⋮----
// NewPauserRegistryTransactor creates a new write-only instance of PauserRegistry, bound to a specific deployed contract.
func NewPauserRegistryTransactor(address common.Address, transactor bind.ContractTransactor) (*PauserRegistryTransactor, error)
⋮----
// NewPauserRegistryFilterer creates a new log filterer instance of PauserRegistry, bound to a specific deployed contract.
func NewPauserRegistryFilterer(address common.Address, filterer bind.ContractFilterer) (*PauserRegistryFilterer, error)
⋮----
// bindPauserRegistry binds a generic wrapper to an already deployed contract.
func bindPauserRegistry(address common.Address, caller bind.ContractCaller, transactor bind.ContractTransactor, filterer bind.ContractFilterer) (*bind.BoundContract, error)
⋮----
// 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 (_PauserRegistry *PauserRegistryRaw) Call(opts *bind.CallOpts, result *[]interface
⋮----
// Transfer initiates a plain transaction to move funds to the contract, calling
// its default method if one is available.
func (_PauserRegistry *PauserRegistryRaw) Transfer(opts *bind.TransactOpts) (*types.Transaction, error)
⋮----
// Transact invokes the (paid) contract method with params as input values.
func (_PauserRegistry *PauserRegistryRaw) Transact(opts *bind.TransactOpts, method string, params ...interface
⋮----
// IsPauser is a free data retrieval call binding the contract method 0x46fbf68e.
//
// Solidity: function isPauser(address ) view returns(bool)
func (_PauserRegistry *PauserRegistryCaller) IsPauser(opts *bind.CallOpts, arg0 common.Address) (bool, error)
⋮----
var out []interface{}
⋮----
// Unpauser is a free data retrieval call binding the contract method 0xeab66d7a.
⋮----
// Solidity: function unpauser() view returns(address)
func (_PauserRegistry *PauserRegistryCaller) Unpauser(opts *bind.CallOpts) (common.Address, error)
⋮----
// SetIsPauser is a paid mutator transaction binding the contract method 0x85685206.
⋮----
// Solidity: function setIsPauser(address newPauser, bool canPause) returns()
func (_PauserRegistry *PauserRegistryTransactor) SetIsPauser(opts *bind.TransactOpts, newPauser common.Address, canPause bool) (*types.Transaction, error)
⋮----
// SetUnpauser is a paid mutator transaction binding the contract method 0xce548428.
⋮----
// Solidity: function setUnpauser(address newUnpauser) returns()
func (_PauserRegistry *PauserRegistryTransactor) SetUnpauser(opts *bind.TransactOpts, newUnpauser common.Address) (*types.Transaction, error)
⋮----
// PauserRegistryPauserStatusChangedIterator is returned from FilterPauserStatusChanged and is used to iterate over the raw logs and unpacked data for PauserStatusChanged events raised by the PauserRegistry contract.
type PauserRegistryPauserStatusChangedIterator struct {
	Event *PauserRegistryPauserStatusChanged // 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
}
⋮----
Event *PauserRegistryPauserStatusChanged // 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 *PauserRegistryPauserStatusChangedIterator) Next() bool
⋮----
// If the iterator failed, stop iterating
⋮----
// If the iterator completed, deliver directly whatever's available
⋮----
// Iterator still in progress, wait for either a data or an error event
⋮----
// Error returns any retrieval or parsing error occurred during filtering.
func (it *PauserRegistryPauserStatusChangedIterator) Error() error
⋮----
// Close terminates the iteration process, releasing any pending underlying
// resources.
func (it *PauserRegistryPauserStatusChangedIterator) Close() error
⋮----
// PauserRegistryPauserStatusChanged represents a PauserStatusChanged event raised by the PauserRegistry contract.
type PauserRegistryPauserStatusChanged struct {
	Pauser   common.Address
	CanPause bool
	Raw      types.Log // Blockchain specific contextual infos
}
⋮----
Raw      types.Log // Blockchain specific contextual infos
⋮----
// FilterPauserStatusChanged is a free log retrieval operation binding the contract event 0x65d3a1fd4c13f05cba164f80d03ce90fb4b5e21946bfc3ab7dbd434c2d0b9152.
⋮----
// Solidity: event PauserStatusChanged(address pauser, bool canPause)
func (_PauserRegistry *PauserRegistryFilterer) FilterPauserStatusChanged(opts *bind.FilterOpts) (*PauserRegistryPauserStatusChangedIterator, error)
⋮----
// WatchPauserStatusChanged is a free log subscription operation binding the contract event 0x65d3a1fd4c13f05cba164f80d03ce90fb4b5e21946bfc3ab7dbd434c2d0b9152.
⋮----
func (_PauserRegistry *PauserRegistryFilterer) WatchPauserStatusChanged(opts *bind.WatchOpts, sink chan<- *PauserRegistryPauserStatusChanged) (event.Subscription, error)
⋮----
// New log arrived, parse the event and forward to the user
⋮----
// ParsePauserStatusChanged is a log parse operation binding the contract event 0x65d3a1fd4c13f05cba164f80d03ce90fb4b5e21946bfc3ab7dbd434c2d0b9152.
⋮----
func (_PauserRegistry *PauserRegistryFilterer) ParsePauserStatusChanged(log types.Log) (*PauserRegistryPauserStatusChanged, error)
⋮----
// PauserRegistryUnpauserChangedIterator is returned from FilterUnpauserChanged and is used to iterate over the raw logs and unpacked data for UnpauserChanged events raised by the PauserRegistry contract.
type PauserRegistryUnpauserChangedIterator struct {
	Event *PauserRegistryUnpauserChanged // 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
}
⋮----
Event *PauserRegistryUnpauserChanged // Event containing the contract specifics and raw log
⋮----
// PauserRegistryUnpauserChanged represents a UnpauserChanged event raised by the PauserRegistry contract.
type PauserRegistryUnpauserChanged struct {
	PreviousUnpauser common.Address
	NewUnpauser      common.Address
	Raw              types.Log // Blockchain specific contextual infos
}
⋮----
Raw              types.Log // Blockchain specific contextual infos
⋮----
// FilterUnpauserChanged is a free log retrieval operation binding the contract event 0x06b4167a2528887a1e97a366eefe8549bfbf1ea3e6ac81cb2564a934d20e8892.
⋮----
// Solidity: event UnpauserChanged(address previousUnpauser, address newUnpauser)
func (_PauserRegistry *PauserRegistryFilterer) FilterUnpauserChanged(opts *bind.FilterOpts) (*PauserRegistryUnpauserChangedIterator, error)
⋮----
// WatchUnpauserChanged is a free log subscription operation binding the contract event 0x06b4167a2528887a1e97a366eefe8549bfbf1ea3e6ac81cb2564a934d20e8892.
⋮----
func (_PauserRegistry *PauserRegistryFilterer) WatchUnpauserChanged(opts *bind.WatchOpts, sink chan<- *PauserRegistryUnpauserChanged) (event.Subscription, error)
⋮----
// ParseUnpauserChanged is a log parse operation binding the contract event 0x06b4167a2528887a1e97a366eefe8549bfbf1ea3e6ac81cb2564a934d20e8892.
⋮----
func (_PauserRegistry *PauserRegistryFilterer) ParseUnpauserChanged(log types.Log) (*PauserRegistryUnpauserChanged, error)
````

## File: pkg/bindings/PermissionController/binding.go
````go
// Code generated - DO NOT EDIT.
// This file is a generated binding and any manual changes will be lost.
⋮----
package PermissionController
⋮----
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"
)
⋮----
"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
)
⋮----
// PermissionControllerMetaData contains all meta data concerning the PermissionController contract.
var PermissionControllerMetaData = &bind.MetaData{
	ABI: "[{\"type\":\"constructor\",\"inputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"acceptAdmin\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"addPendingAdmin\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"admin\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"canCall\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"caller\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"target\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"selector\",\"type\":\"bytes4\",\"internalType\":\"bytes4\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getAdmins\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"address[]\",\"internalType\":\"address[]\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getAppointeePermissions\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"appointee\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"address[]\",\"internalType\":\"address[]\"},{\"name\":\"\",\"type\":\"bytes4[]\",\"internalType\":\"bytes4[]\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getAppointees\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"target\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"selector\",\"type\":\"bytes4\",\"internalType\":\"bytes4\"}],\"outputs\":[{\"name\":\"\",\"type\":\"address[]\",\"internalType\":\"address[]\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getPendingAdmins\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"address[]\",\"internalType\":\"address[]\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"isAdmin\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"caller\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"isPendingAdmin\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"pendingAdmin\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"removeAdmin\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"admin\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"removeAppointee\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"appointee\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"target\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"selector\",\"type\":\"bytes4\",\"internalType\":\"bytes4\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"removePendingAdmin\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"admin\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"setAppointee\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"appointee\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"target\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"selector\",\"type\":\"bytes4\",\"internalType\":\"bytes4\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"event\",\"name\":\"AdminRemoved\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"admin\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"AdminSet\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"admin\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"AppointeeRemoved\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"appointee\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"target\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"},{\"name\":\"selector\",\"type\":\"bytes4\",\"indexed\":false,\"internalType\":\"bytes4\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"AppointeeSet\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"appointee\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"target\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"},{\"name\":\"selector\",\"type\":\"bytes4\",\"indexed\":false,\"internalType\":\"bytes4\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Initialized\",\"inputs\":[{\"name\":\"version\",\"type\":\"uint8\",\"indexed\":false,\"internalType\":\"uint8\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"PendingAdminAdded\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"admin\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"PendingAdminRemoved\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"admin\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"error\",\"name\":\"AdminAlreadyPending\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"AdminAlreadySet\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"AdminNotPending\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"AdminNotSet\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"AppointeeAlreadySet\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"AppointeeNotSet\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"CannotHaveZeroAdmins\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"NotAdmin\",\"inputs\":[]}]",
	Bin: "0x6080604052348015600e575f5ffd5b5060156019565b60d3565b5f54610100900460ff161560835760405162461bcd60e51b815260206004820152602760248201527f496e697469616c697a61626c653a20636f6e747261637420697320696e697469604482015266616c697a696e6760c81b606482015260840160405180910390fd5b5f5460ff9081161460d1575f805460ff191660ff9081179091556040519081527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b565b610f40806100e05f395ff3fe608060405234801561000f575f5ffd5b50600436106100cb575f3560e01c80639100674511610088578063ad8aca7711610063578063ad8aca77146101b0578063df595cb8146101c3578063eb5a4e87146101d6578063fddbdefd146101e9575f5ffd5b80639100674514610167578063950d806e1461018a578063ad5f22101461019d575f5ffd5b806306641201146100cf578063268959e5146100e45780634f906cf9146100f7578063628806ef1461010a5780636bddfa1f1461011d578063882a3b3814610146575b5f5ffd5b6100e26100dd366004610cfa565b6101fc565b005b6100e26100f2366004610d4b565b61031d565b6100e2610105366004610d4b565b6103f8565b6100e2610118366004610d7c565b61049b565b61013061012b366004610d7c565b610529565b60405161013d9190610dd8565b60405180910390f35b610159610154366004610d4b565b610552565b60405161013d929190610dea565b61017a610175366004610d4b565b6106b3565b604051901515815260200161013d565b6100e2610198366004610cfa565b610723565b6101306101ab366004610d7c565b610834565b61017a6101be366004610d4b565b6108da565b61017a6101d1366004610cfa565b6108fb565b6100e26101e4366004610d4b565b610950565b6101306101f7366004610e4c565b610a1e565b8361020781336106b3565b61022457604051637bfa4b9f60e01b815260040160405180910390fd5b6001600160a01b0385165f908152600160205260408120906102468585610a5c565b6001600160a01b0387165f908152600484016020526040902090915061026c9082610a89565b6102895760405163262118cd60e01b815260040160405180910390fd5b6001600160a01b0386165f90815260048301602052604090206102ac9082610aa0565b505f81815260058301602052604090206102c69087610aab565b50856001600160a01b0316876001600160a01b03167f18242326b6b862126970679759169f01f646bd55ec5bfcab85ba9f337a74e0c6878760405161030c929190610e8c565b60405180910390a350505050505050565b8161032881336106b3565b61034557604051637bfa4b9f60e01b815260040160405180910390fd5b6001600160a01b0383165f9081526001602081905260409091206002019061036c82610abf565b1161038a576040516310ce892b60e31b815260040160405180910390fd5b6103948184610aab565b6103b157604051630716d81b60e51b815260040160405180910390fd5b6040516001600160a01b0384811682528516907fdb9d5d31320daf5bc7181d565b6da4d12e30f0f4d5aa324a992426c14a1d19ce906020015b60405180910390a250505050565b8161040381336106b3565b61042057604051637bfa4b9f60e01b815260040160405180910390fd5b6001600160a01b0383165f9081526001602052604090206104418184610aab565b61045e5760405163bed8295f60e01b815260040160405180910390fd5b6040516001600160a01b0384811682528516907fd706ed7ae044d795b49e54c9f519f663053951011985f663a862cd9ee72a9ac7906020016103ea565b6001600160a01b0381165f9081526001602052604090206104bc8133610aab565b6104d95760405163bed8295f60e01b815260040160405180910390fd5b6104e66002820133610ac8565b506040513381526001600160a01b038316907fbf265e8326285a2747e33e54d5945f7111f2b5edb826eb8c08d4677779b3ff979060200160405180910390a25050565b6001600160a01b0381165f90815260016020526040902060609061054c90610adc565b92915050565b6001600160a01b038083165f90815260016020908152604080832093851683526004909301905290812060609182919061058b82610abf565b90505f8167ffffffffffffffff8111156105a7576105a7610eaf565b6040519080825280602002602001820160405280156105d0578160200160208202803683370190505b5090505f8267ffffffffffffffff8111156105ed576105ed610eaf565b604051908082528060200260200182016040528015610616578160200160208202803683370190505b5090505f5b838110156106a5576106496106308683610ae8565b606081901c9160a09190911b6001600160e01b03191690565b84838151811061065b5761065b610ec3565b6020026020010184848151811061067457610674610ec3565b6001600160e01b0319909316602093840291909101909201919091526001600160a01b03909116905260010161061b565b509097909650945050505050565b6001600160a01b0382165f9081526001602052604081206106d690600201610abf565b5f036106f857816001600160a01b0316836001600160a01b031614905061054c565b6001600160a01b0383165f90815260016020526040902061071c9060020183610af3565b9392505050565b8361072e81336106b3565b61074b57604051637bfa4b9f60e01b815260040160405180910390fd5b6001600160a01b0385165f9081526001602052604081209061076d8585610a5c565b6001600160a01b0387165f90815260048401602052604090209091506107939082610a89565b156107b15760405163ad8efeb760e01b815260040160405180910390fd5b6001600160a01b0386165f90815260048301602052604090206107d49082610b14565b505f81815260058301602052604090206107ee9087610ac8565b50856001600160a01b0316876001600160a01b03167f037f03a2ad6b967df4a01779b6d2b4c85950df83925d9e31362b519422fc0169878760405161030c929190610e8c565b6001600160a01b0381165f90815260016020526040902060609061085a90600201610abf565b5f036108b2576040805160018082528183019092525f916020808301908036833701905050905082815f8151811061089457610894610ec3565b6001600160a01b039092166020928302919091019091015292915050565b6001600160a01b0382165f90815260016020526040902061054c90600201610adc565b919050565b6001600160a01b0382165f90815260016020526040812061071c9083610af3565b5f61090685856106b3565b8061094757506109476109198484610a5c565b6001600160a01b038088165f908152600160209081526040808320938a168352600490930190522090610a89565b95945050505050565b8161095b81336106b3565b61097857604051637bfa4b9f60e01b815260040160405180910390fd5b6001600160a01b0383165f90815260016020526040902061099c6002820184610af3565b156109ba5760405163130160e560e31b815260040160405180910390fd5b6109c48184610ac8565b6109e1576040516319abede360e11b815260040160405180910390fd5b6040516001600160a01b0384811682528516907fb14b9a3d448c5b04f0e5b087b6f5193390db7955482a6ffb841e7b3ba61a460c906020016103ea565b60605f610a2b8484610a5c565b6001600160a01b0386165f908152600160209081526040808320848452600501909152902090915061094790610adc565b60609190911b6bffffffffffffffffffffffff191660a09190911c6bffffffff0000000000000000161790565b5f818152600183016020526040812054151561071c565b5f61071c8383610b1f565b5f61071c836001600160a01b038416610b1f565b5f61054c825490565b5f61071c836001600160a01b038416610c02565b60605f61071c83610c4e565b5f61071c8383610ca7565b6001600160a01b0381165f908152600183016020526040812054151561071c565b5f61071c8383610c02565b5f8181526001830160205260408120548015610bf9575f610b41600183610ed7565b85549091505f90610b5490600190610ed7565b9050818114610bb3575f865f018281548110610b7257610b72610ec3565b905f5260205f200154905080875f018481548110610b9257610b92610ec3565b5f918252602080832090910192909255918252600188019052604090208390555b8554869080610bc457610bc4610ef6565b600190038181905f5260205f20015f90559055856001015f8681526020019081526020015f205f90556001935050505061054c565b5f91505061054c565b5f818152600183016020526040812054610c4757508154600181810184555f84815260208082209093018490558454848252828601909352604090209190915561054c565b505f61054c565b6060815f01805480602002602001604051908101604052809291908181526020018280548015610c9b57602002820191905f5260205f20905b815481526020019060010190808311610c87575b50505050509050919050565b5f825f018281548110610cbc57610cbc610ec3565b905f5260205f200154905092915050565b80356001600160a01b03811681146108d5575f5ffd5b80356001600160e01b0319811681146108d5575f5ffd5b5f5f5f5f60808587031215610d0d575f5ffd5b610d1685610ccd565b9350610d2460208601610ccd565b9250610d3260408601610ccd565b9150610d4060608601610ce3565b905092959194509250565b5f5f60408385031215610d5c575f5ffd5b610d6583610ccd565b9150610d7360208401610ccd565b90509250929050565b5f60208284031215610d8c575f5ffd5b61071c82610ccd565b5f8151808452602084019350602083015f5b82811015610dce5781516001600160a01b0316865260209586019590910190600101610da7565b5093949350505050565b602081525f61071c6020830184610d95565b604081525f610dfc6040830185610d95565b82810360208401528084518083526020830191506020860192505f5b81811015610e405783516001600160e01b031916835260209384019390920191600101610e18565b50909695505050505050565b5f5f5f60608486031215610e5e575f5ffd5b610e6784610ccd565b9250610e7560208501610ccd565b9150610e8360408501610ce3565b90509250925092565b6001600160a01b039290921682526001600160e01b031916602082015260400190565b634e487b7160e01b5f52604160045260245ffd5b634e487b7160e01b5f52603260045260245ffd5b8181038181111561054c57634e487b7160e01b5f52601160045260245ffd5b634e487b7160e01b5f52603160045260245ffdfea26469706673582212206e3572db81ec5d7a9054035a23c796cbd433cdb537e79424f8576d0ec7504bab64736f6c634300081e0033",
}
⋮----
// PermissionControllerABI is the input ABI used to generate the binding from.
// Deprecated: Use PermissionControllerMetaData.ABI instead.
var PermissionControllerABI = PermissionControllerMetaData.ABI
⋮----
// PermissionControllerBin is the compiled bytecode used for deploying new contracts.
// Deprecated: Use PermissionControllerMetaData.Bin instead.
var PermissionControllerBin = PermissionControllerMetaData.Bin
⋮----
// DeployPermissionController deploys a new Ethereum contract, binding an instance of PermissionController to it.
func DeployPermissionController(auth *bind.TransactOpts, backend bind.ContractBackend) (common.Address, *types.Transaction, *PermissionController, error)
⋮----
// PermissionController is an auto generated Go binding around an Ethereum contract.
type PermissionController struct {
	PermissionControllerCaller     // Read-only binding to the contract
	PermissionControllerTransactor // Write-only binding to the contract
	PermissionControllerFilterer   // Log filterer for contract events
}
⋮----
PermissionControllerCaller     // Read-only binding to the contract
PermissionControllerTransactor // Write-only binding to the contract
PermissionControllerFilterer   // Log filterer for contract events
⋮----
// PermissionControllerCaller is an auto generated read-only Go binding around an Ethereum contract.
type PermissionControllerCaller struct {
	contract *bind.BoundContract // Generic contract wrapper for the low level calls
}
⋮----
contract *bind.BoundContract // Generic contract wrapper for the low level calls
⋮----
// PermissionControllerTransactor is an auto generated write-only Go binding around an Ethereum contract.
type PermissionControllerTransactor struct {
	contract *bind.BoundContract // Generic contract wrapper for the low level calls
}
⋮----
// PermissionControllerFilterer is an auto generated log filtering Go binding around an Ethereum contract events.
type PermissionControllerFilterer struct {
	contract *bind.BoundContract // Generic contract wrapper for the low level calls
}
⋮----
// PermissionControllerSession is an auto generated Go binding around an Ethereum contract,
// with pre-set call and transact options.
type PermissionControllerSession struct {
	Contract     *PermissionController // 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
}
⋮----
Contract     *PermissionController // 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
⋮----
// PermissionControllerCallerSession is an auto generated read-only Go binding around an Ethereum contract,
// with pre-set call options.
type PermissionControllerCallerSession struct {
	Contract *PermissionControllerCaller // Generic contract caller binding to set the session for
	CallOpts bind.CallOpts               // Call options to use throughout this session
}
⋮----
Contract *PermissionControllerCaller // Generic contract caller binding to set the session for
CallOpts bind.CallOpts               // Call options to use throughout this session
⋮----
// PermissionControllerTransactorSession is an auto generated write-only Go binding around an Ethereum contract,
// with pre-set transact options.
type PermissionControllerTransactorSession struct {
	Contract     *PermissionControllerTransactor // Generic contract transactor binding to set the session for
	TransactOpts bind.TransactOpts               // Transaction auth options to use throughout this session
}
⋮----
Contract     *PermissionControllerTransactor // Generic contract transactor binding to set the session for
TransactOpts bind.TransactOpts               // Transaction auth options to use throughout this session
⋮----
// PermissionControllerRaw is an auto generated low-level Go binding around an Ethereum contract.
type PermissionControllerRaw struct {
	Contract *PermissionController // Generic contract binding to access the raw methods on
}
⋮----
Contract *PermissionController // Generic contract binding to access the raw methods on
⋮----
// PermissionControllerCallerRaw is an auto generated low-level read-only Go binding around an Ethereum contract.
type PermissionControllerCallerRaw struct {
	Contract *PermissionControllerCaller // Generic read-only contract binding to access the raw methods on
}
⋮----
Contract *PermissionControllerCaller // Generic read-only contract binding to access the raw methods on
⋮----
// PermissionControllerTransactorRaw is an auto generated low-level write-only Go binding around an Ethereum contract.
type PermissionControllerTransactorRaw struct {
	Contract *PermissionControllerTransactor // Generic write-only contract binding to access the raw methods on
}
⋮----
Contract *PermissionControllerTransactor // Generic write-only contract binding to access the raw methods on
⋮----
// NewPermissionController creates a new instance of PermissionController, bound to a specific deployed contract.
func NewPermissionController(address common.Address, backend bind.ContractBackend) (*PermissionController, error)
⋮----
// NewPermissionControllerCaller creates a new read-only instance of PermissionController, bound to a specific deployed contract.
func NewPermissionControllerCaller(address common.Address, caller bind.ContractCaller) (*PermissionControllerCaller, error)
⋮----
// NewPermissionControllerTransactor creates a new write-only instance of PermissionController, bound to a specific deployed contract.
func NewPermissionControllerTransactor(address common.Address, transactor bind.ContractTransactor) (*PermissionControllerTransactor, error)
⋮----
// NewPermissionControllerFilterer creates a new log filterer instance of PermissionController, bound to a specific deployed contract.
func NewPermissionControllerFilterer(address common.Address, filterer bind.ContractFilterer) (*PermissionControllerFilterer, error)
⋮----
// bindPermissionController binds a generic wrapper to an already deployed contract.
func bindPermissionController(address common.Address, caller bind.ContractCaller, transactor bind.ContractTransactor, filterer bind.ContractFilterer) (*bind.BoundContract, error)
⋮----
// 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 (_PermissionController *PermissionControllerRaw) Call(opts *bind.CallOpts, result *[]interface
⋮----
// Transfer initiates a plain transaction to move funds to the contract, calling
// its default method if one is available.
func (_PermissionController *PermissionControllerRaw) Transfer(opts *bind.TransactOpts) (*types.Transaction, error)
⋮----
// Transact invokes the (paid) contract method with params as input values.
func (_PermissionController *PermissionControllerRaw) Transact(opts *bind.TransactOpts, method string, params ...interface
⋮----
// CanCall is a free data retrieval call binding the contract method 0xdf595cb8.
//
// Solidity: function canCall(address account, address caller, address target, bytes4 selector) view returns(bool)
func (_PermissionController *PermissionControllerCaller) CanCall(opts *bind.CallOpts, account common.Address, caller common.Address, target common.Address, selector [4]byte) (bool, error)
⋮----
var out []interface{}
⋮----
// GetAdmins is a free data retrieval call binding the contract method 0xad5f2210.
⋮----
// Solidity: function getAdmins(address account) view returns(address[])
func (_PermissionController *PermissionControllerCaller) GetAdmins(opts *bind.CallOpts, account common.Address) ([]common.Address, error)
⋮----
// GetAppointeePermissions is a free data retrieval call binding the contract method 0x882a3b38.
⋮----
// Solidity: function getAppointeePermissions(address account, address appointee) view returns(address[], bytes4[])
func (_PermissionController *PermissionControllerCaller) GetAppointeePermissions(opts *bind.CallOpts, account common.Address, appointee common.Address) ([]common.Address, [][4]byte, error)
⋮----
// GetAppointees is a free data retrieval call binding the contract method 0xfddbdefd.
⋮----
// Solidity: function getAppointees(address account, address target, bytes4 selector) view returns(address[])
func (_PermissionController *PermissionControllerCaller) GetAppointees(opts *bind.CallOpts, account common.Address, target common.Address, selector [4]byte) ([]common.Address, error)
⋮----
// GetPendingAdmins is a free data retrieval call binding the contract method 0x6bddfa1f.
⋮----
// Solidity: function getPendingAdmins(address account) view returns(address[])
func (_PermissionController *PermissionControllerCaller) GetPendingAdmins(opts *bind.CallOpts, account common.Address) ([]common.Address, error)
⋮----
// IsAdmin is a free data retrieval call binding the contract method 0x91006745.
⋮----
// Solidity: function isAdmin(address account, address caller) view returns(bool)
func (_PermissionController *PermissionControllerCaller) IsAdmin(opts *bind.CallOpts, account common.Address, caller common.Address) (bool, error)
⋮----
// IsPendingAdmin is a free data retrieval call binding the contract method 0xad8aca77.
⋮----
// Solidity: function isPendingAdmin(address account, address pendingAdmin) view returns(bool)
func (_PermissionController *PermissionControllerCaller) IsPendingAdmin(opts *bind.CallOpts, account common.Address, pendingAdmin common.Address) (bool, error)
⋮----
// AcceptAdmin is a paid mutator transaction binding the contract method 0x628806ef.
⋮----
// Solidity: function acceptAdmin(address account) returns()
func (_PermissionController *PermissionControllerTransactor) AcceptAdmin(opts *bind.TransactOpts, account common.Address) (*types.Transaction, error)
⋮----
// AddPendingAdmin is a paid mutator transaction binding the contract method 0xeb5a4e87.
⋮----
// Solidity: function addPendingAdmin(address account, address admin) returns()
func (_PermissionController *PermissionControllerTransactor) AddPendingAdmin(opts *bind.TransactOpts, account common.Address, admin common.Address) (*types.Transaction, error)
⋮----
// RemoveAdmin is a paid mutator transaction binding the contract method 0x268959e5.
⋮----
// Solidity: function removeAdmin(address account, address admin) returns()
func (_PermissionController *PermissionControllerTransactor) RemoveAdmin(opts *bind.TransactOpts, account common.Address, admin common.Address) (*types.Transaction, error)
⋮----
// RemoveAppointee is a paid mutator transaction binding the contract method 0x06641201.
⋮----
// Solidity: function removeAppointee(address account, address appointee, address target, bytes4 selector) returns()
func (_PermissionController *PermissionControllerTransactor) RemoveAppointee(opts *bind.TransactOpts, account common.Address, appointee common.Address, target common.Address, selector [4]byte) (*types.Transaction, error)
⋮----
// RemovePendingAdmin is a paid mutator transaction binding the contract method 0x4f906cf9.
⋮----
// Solidity: function removePendingAdmin(address account, address admin) returns()
func (_PermissionController *PermissionControllerTransactor) RemovePendingAdmin(opts *bind.TransactOpts, account common.Address, admin common.Address) (*types.Transaction, error)
⋮----
// SetAppointee is a paid mutator transaction binding the contract method 0x950d806e.
⋮----
// Solidity: function setAppointee(address account, address appointee, address target, bytes4 selector) returns()
func (_PermissionController *PermissionControllerTransactor) SetAppointee(opts *bind.TransactOpts, account common.Address, appointee common.Address, target common.Address, selector [4]byte) (*types.Transaction, error)
⋮----
// PermissionControllerAdminRemovedIterator is returned from FilterAdminRemoved and is used to iterate over the raw logs and unpacked data for AdminRemoved events raised by the PermissionController contract.
type PermissionControllerAdminRemovedIterator struct {
	Event *PermissionControllerAdminRemoved // 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
}
⋮----
Event *PermissionControllerAdminRemoved // 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 *PermissionControllerAdminRemovedIterator) Next() bool
⋮----
// If the iterator failed, stop iterating
⋮----
// If the iterator completed, deliver directly whatever's available
⋮----
// Iterator still in progress, wait for either a data or an error event
⋮----
// Error returns any retrieval or parsing error occurred during filtering.
func (it *PermissionControllerAdminRemovedIterator) Error() error
⋮----
// Close terminates the iteration process, releasing any pending underlying
// resources.
func (it *PermissionControllerAdminRemovedIterator) Close() error
⋮----
// PermissionControllerAdminRemoved represents a AdminRemoved event raised by the PermissionController contract.
type PermissionControllerAdminRemoved struct {
	Account common.Address
	Admin   common.Address
	Raw     types.Log // Blockchain specific contextual infos
}
⋮----
Raw     types.Log // Blockchain specific contextual infos
⋮----
// FilterAdminRemoved is a free log retrieval operation binding the contract event 0xdb9d5d31320daf5bc7181d565b6da4d12e30f0f4d5aa324a992426c14a1d19ce.
⋮----
// Solidity: event AdminRemoved(address indexed account, address admin)
func (_PermissionController *PermissionControllerFilterer) FilterAdminRemoved(opts *bind.FilterOpts, account []common.Address) (*PermissionControllerAdminRemovedIterator, error)
⋮----
var accountRule []interface{}
⋮----
// WatchAdminRemoved is a free log subscription operation binding the contract event 0xdb9d5d31320daf5bc7181d565b6da4d12e30f0f4d5aa324a992426c14a1d19ce.
⋮----
func (_PermissionController *PermissionControllerFilterer) WatchAdminRemoved(opts *bind.WatchOpts, sink chan<- *PermissionControllerAdminRemoved, account []common.Address) (event.Subscription, error)
⋮----
// New log arrived, parse the event and forward to the user
⋮----
// ParseAdminRemoved is a log parse operation binding the contract event 0xdb9d5d31320daf5bc7181d565b6da4d12e30f0f4d5aa324a992426c14a1d19ce.
⋮----
func (_PermissionController *PermissionControllerFilterer) ParseAdminRemoved(log types.Log) (*PermissionControllerAdminRemoved, error)
⋮----
// PermissionControllerAdminSetIterator is returned from FilterAdminSet and is used to iterate over the raw logs and unpacked data for AdminSet events raised by the PermissionController contract.
type PermissionControllerAdminSetIterator struct {
	Event *PermissionControllerAdminSet // 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
}
⋮----
Event *PermissionControllerAdminSet // Event containing the contract specifics and raw log
⋮----
// PermissionControllerAdminSet represents a AdminSet event raised by the PermissionController contract.
type PermissionControllerAdminSet struct {
	Account common.Address
	Admin   common.Address
	Raw     types.Log // Blockchain specific contextual infos
}
⋮----
// FilterAdminSet is a free log retrieval operation binding the contract event 0xbf265e8326285a2747e33e54d5945f7111f2b5edb826eb8c08d4677779b3ff97.
⋮----
// Solidity: event AdminSet(address indexed account, address admin)
func (_PermissionController *PermissionControllerFilterer) FilterAdminSet(opts *bind.FilterOpts, account []common.Address) (*PermissionControllerAdminSetIterator, error)
⋮----
// WatchAdminSet is a free log subscription operation binding the contract event 0xbf265e8326285a2747e33e54d5945f7111f2b5edb826eb8c08d4677779b3ff97.
⋮----
func (_PermissionController *PermissionControllerFilterer) WatchAdminSet(opts *bind.WatchOpts, sink chan<- *PermissionControllerAdminSet, account []common.Address) (event.Subscription, error)
⋮----
// ParseAdminSet is a log parse operation binding the contract event 0xbf265e8326285a2747e33e54d5945f7111f2b5edb826eb8c08d4677779b3ff97.
⋮----
func (_PermissionController *PermissionControllerFilterer) ParseAdminSet(log types.Log) (*PermissionControllerAdminSet, error)
⋮----
// PermissionControllerAppointeeRemovedIterator is returned from FilterAppointeeRemoved and is used to iterate over the raw logs and unpacked data for AppointeeRemoved events raised by the PermissionController contract.
type PermissionControllerAppointeeRemovedIterator struct {
	Event *PermissionControllerAppointeeRemoved // 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
}
⋮----
Event *PermissionControllerAppointeeRemoved // Event containing the contract specifics and raw log
⋮----
// PermissionControllerAppointeeRemoved represents a AppointeeRemoved event raised by the PermissionController contract.
type PermissionControllerAppointeeRemoved struct {
	Account   common.Address
	Appointee common.Address
	Target    common.Address
	Selector  [4]byte
	Raw       types.Log // Blockchain specific contextual infos
}
⋮----
Raw       types.Log // Blockchain specific contextual infos
⋮----
// FilterAppointeeRemoved is a free log retrieval operation binding the contract event 0x18242326b6b862126970679759169f01f646bd55ec5bfcab85ba9f337a74e0c6.
⋮----
// Solidity: event AppointeeRemoved(address indexed account, address indexed appointee, address target, bytes4 selector)
func (_PermissionController *PermissionControllerFilterer) FilterAppointeeRemoved(opts *bind.FilterOpts, account []common.Address, appointee []common.Address) (*PermissionControllerAppointeeRemovedIterator, error)
⋮----
var appointeeRule []interface{}
⋮----
// WatchAppointeeRemoved is a free log subscription operation binding the contract event 0x18242326b6b862126970679759169f01f646bd55ec5bfcab85ba9f337a74e0c6.
⋮----
func (_PermissionController *PermissionControllerFilterer) WatchAppointeeRemoved(opts *bind.WatchOpts, sink chan<- *PermissionControllerAppointeeRemoved, account []common.Address, appointee []common.Address) (event.Subscription, error)
⋮----
// ParseAppointeeRemoved is a log parse operation binding the contract event 0x18242326b6b862126970679759169f01f646bd55ec5bfcab85ba9f337a74e0c6.
⋮----
func (_PermissionController *PermissionControllerFilterer) ParseAppointeeRemoved(log types.Log) (*PermissionControllerAppointeeRemoved, error)
⋮----
// PermissionControllerAppointeeSetIterator is returned from FilterAppointeeSet and is used to iterate over the raw logs and unpacked data for AppointeeSet events raised by the PermissionController contract.
type PermissionControllerAppointeeSetIterator struct {
	Event *PermissionControllerAppointeeSet // 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
}
⋮----
Event *PermissionControllerAppointeeSet // Event containing the contract specifics and raw log
⋮----
// PermissionControllerAppointeeSet represents a AppointeeSet event raised by the PermissionController contract.
type PermissionControllerAppointeeSet struct {
	Account   common.Address
	Appointee common.Address
	Target    common.Address
	Selector  [4]byte
	Raw       types.Log // Blockchain specific contextual infos
}
⋮----
// FilterAppointeeSet is a free log retrieval operation binding the contract event 0x037f03a2ad6b967df4a01779b6d2b4c85950df83925d9e31362b519422fc0169.
⋮----
// Solidity: event AppointeeSet(address indexed account, address indexed appointee, address target, bytes4 selector)
func (_PermissionController *PermissionControllerFilterer) FilterAppointeeSet(opts *bind.FilterOpts, account []common.Address, appointee []common.Address) (*PermissionControllerAppointeeSetIterator, error)
⋮----
// WatchAppointeeSet is a free log subscription operation binding the contract event 0x037f03a2ad6b967df4a01779b6d2b4c85950df83925d9e31362b519422fc0169.
⋮----
func (_PermissionController *PermissionControllerFilterer) WatchAppointeeSet(opts *bind.WatchOpts, sink chan<- *PermissionControllerAppointeeSet, account []common.Address, appointee []common.Address) (event.Subscription, error)
⋮----
// ParseAppointeeSet is a log parse operation binding the contract event 0x037f03a2ad6b967df4a01779b6d2b4c85950df83925d9e31362b519422fc0169.
⋮----
func (_PermissionController *PermissionControllerFilterer) ParseAppointeeSet(log types.Log) (*PermissionControllerAppointeeSet, error)
⋮----
// PermissionControllerInitializedIterator is returned from FilterInitialized and is used to iterate over the raw logs and unpacked data for Initialized events raised by the PermissionController contract.
type PermissionControllerInitializedIterator struct {
	Event *PermissionControllerInitialized // 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
}
⋮----
Event *PermissionControllerInitialized // Event containing the contract specifics and raw log
⋮----
// PermissionControllerInitialized represents a Initialized event raised by the PermissionController contract.
type PermissionControllerInitialized 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 (_PermissionController *PermissionControllerFilterer) FilterInitialized(opts *bind.FilterOpts) (*PermissionControllerInitializedIterator, error)
⋮----
// WatchInitialized is a free log subscription operation binding the contract event 0x7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb3847402498.
⋮----
func (_PermissionController *PermissionControllerFilterer) WatchInitialized(opts *bind.WatchOpts, sink chan<- *PermissionControllerInitialized) (event.Subscription, error)
⋮----
// ParseInitialized is a log parse operation binding the contract event 0x7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb3847402498.
⋮----
func (_PermissionController *PermissionControllerFilterer) ParseInitialized(log types.Log) (*PermissionControllerInitialized, error)
⋮----
// PermissionControllerPendingAdminAddedIterator is returned from FilterPendingAdminAdded and is used to iterate over the raw logs and unpacked data for PendingAdminAdded events raised by the PermissionController contract.
type PermissionControllerPendingAdminAddedIterator struct {
	Event *PermissionControllerPendingAdminAdded // 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
}
⋮----
Event *PermissionControllerPendingAdminAdded // Event containing the contract specifics and raw log
⋮----
// PermissionControllerPendingAdminAdded represents a PendingAdminAdded event raised by the PermissionController contract.
type PermissionControllerPendingAdminAdded struct {
	Account common.Address
	Admin   common.Address
	Raw     types.Log // Blockchain specific contextual infos
}
⋮----
// FilterPendingAdminAdded is a free log retrieval operation binding the contract event 0xb14b9a3d448c5b04f0e5b087b6f5193390db7955482a6ffb841e7b3ba61a460c.
⋮----
// Solidity: event PendingAdminAdded(address indexed account, address admin)
func (_PermissionController *PermissionControllerFilterer) FilterPendingAdminAdded(opts *bind.FilterOpts, account []common.Address) (*PermissionControllerPendingAdminAddedIterator, error)
⋮----
// WatchPendingAdminAdded is a free log subscription operation binding the contract event 0xb14b9a3d448c5b04f0e5b087b6f5193390db7955482a6ffb841e7b3ba61a460c.
⋮----
func (_PermissionController *PermissionControllerFilterer) WatchPendingAdminAdded(opts *bind.WatchOpts, sink chan<- *PermissionControllerPendingAdminAdded, account []common.Address) (event.Subscription, error)
⋮----
// ParsePendingAdminAdded is a log parse operation binding the contract event 0xb14b9a3d448c5b04f0e5b087b6f5193390db7955482a6ffb841e7b3ba61a460c.
⋮----
func (_PermissionController *PermissionControllerFilterer) ParsePendingAdminAdded(log types.Log) (*PermissionControllerPendingAdminAdded, error)
⋮----
// PermissionControllerPendingAdminRemovedIterator is returned from FilterPendingAdminRemoved and is used to iterate over the raw logs and unpacked data for PendingAdminRemoved events raised by the PermissionController contract.
type PermissionControllerPendingAdminRemovedIterator struct {
	Event *PermissionControllerPendingAdminRemoved // 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
}
⋮----
Event *PermissionControllerPendingAdminRemoved // Event containing the contract specifics and raw log
⋮----
// PermissionControllerPendingAdminRemoved represents a PendingAdminRemoved event raised by the PermissionController contract.
type PermissionControllerPendingAdminRemoved struct {
	Account common.Address
	Admin   common.Address
	Raw     types.Log // Blockchain specific contextual infos
}
⋮----
// FilterPendingAdminRemoved is a free log retrieval operation binding the contract event 0xd706ed7ae044d795b49e54c9f519f663053951011985f663a862cd9ee72a9ac7.
⋮----
// Solidity: event PendingAdminRemoved(address indexed account, address admin)
func (_PermissionController *PermissionControllerFilterer) FilterPendingAdminRemoved(opts *bind.FilterOpts, account []common.Address) (*PermissionControllerPendingAdminRemovedIterator, error)
⋮----
// WatchPendingAdminRemoved is a free log subscription operation binding the contract event 0xd706ed7ae044d795b49e54c9f519f663053951011985f663a862cd9ee72a9ac7.
⋮----
func (_PermissionController *PermissionControllerFilterer) WatchPendingAdminRemoved(opts *bind.WatchOpts, sink chan<- *PermissionControllerPendingAdminRemoved, account []common.Address) (event.Subscription, error)
⋮----
// ParsePendingAdminRemoved is a log parse operation binding the contract event 0xd706ed7ae044d795b49e54c9f519f663053951011985f663a862cd9ee72a9ac7.
⋮----
func (_PermissionController *PermissionControllerFilterer) ParsePendingAdminRemoved(log types.Log) (*PermissionControllerPendingAdminRemoved, error)
````

## File: pkg/bindings/PermissionControllerMixin/binding.go
````go
// Code generated - DO NOT EDIT.
// This file is a generated binding and any manual changes will be lost.
⋮----
package PermissionControllerMixin
⋮----
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"
)
⋮----
"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
)
⋮----
// PermissionControllerMixinMetaData contains all meta data concerning the PermissionControllerMixin contract.
var PermissionControllerMixinMetaData = &bind.MetaData{
	ABI: "[{\"type\":\"function\",\"name\":\"permissionController\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIPermissionController\"}],\"stateMutability\":\"view\"},{\"type\":\"error\",\"name\":\"InvalidPermissions\",\"inputs\":[]}]",
}
⋮----
// PermissionControllerMixinABI is the input ABI used to generate the binding from.
// Deprecated: Use PermissionControllerMixinMetaData.ABI instead.
var PermissionControllerMixinABI = PermissionControllerMixinMetaData.ABI
⋮----
// PermissionControllerMixin is an auto generated Go binding around an Ethereum contract.
type PermissionControllerMixin struct {
	PermissionControllerMixinCaller     // Read-only binding to the contract
	PermissionControllerMixinTransactor // Write-only binding to the contract
	PermissionControllerMixinFilterer   // Log filterer for contract events
}
⋮----
PermissionControllerMixinCaller     // Read-only binding to the contract
PermissionControllerMixinTransactor // Write-only binding to the contract
PermissionControllerMixinFilterer   // Log filterer for contract events
⋮----
// PermissionControllerMixinCaller is an auto generated read-only Go binding around an Ethereum contract.
type PermissionControllerMixinCaller struct {
	contract *bind.BoundContract // Generic contract wrapper for the low level calls
}
⋮----
contract *bind.BoundContract // Generic contract wrapper for the low level calls
⋮----
// PermissionControllerMixinTransactor is an auto generated write-only Go binding around an Ethereum contract.
type PermissionControllerMixinTransactor struct {
	contract *bind.BoundContract // Generic contract wrapper for the low level calls
}
⋮----
// PermissionControllerMixinFilterer is an auto generated log filtering Go binding around an Ethereum contract events.
type PermissionControllerMixinFilterer struct {
	contract *bind.BoundContract // Generic contract wrapper for the low level calls
}
⋮----
// PermissionControllerMixinSession is an auto generated Go binding around an Ethereum contract,
// with pre-set call and transact options.
type PermissionControllerMixinSession struct {
	Contract     *PermissionControllerMixin // 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
}
⋮----
Contract     *PermissionControllerMixin // 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
⋮----
// PermissionControllerMixinCallerSession is an auto generated read-only Go binding around an Ethereum contract,
// with pre-set call options.
type PermissionControllerMixinCallerSession struct {
	Contract *PermissionControllerMixinCaller // Generic contract caller binding to set the session for
	CallOpts bind.CallOpts                    // Call options to use throughout this session
}
⋮----
Contract *PermissionControllerMixinCaller // Generic contract caller binding to set the session for
CallOpts bind.CallOpts                    // Call options to use throughout this session
⋮----
// PermissionControllerMixinTransactorSession is an auto generated write-only Go binding around an Ethereum contract,
// with pre-set transact options.
type PermissionControllerMixinTransactorSession struct {
	Contract     *PermissionControllerMixinTransactor // Generic contract transactor binding to set the session for
	TransactOpts bind.TransactOpts                    // Transaction auth options to use throughout this session
}
⋮----
Contract     *PermissionControllerMixinTransactor // Generic contract transactor binding to set the session for
TransactOpts bind.TransactOpts                    // Transaction auth options to use throughout this session
⋮----
// PermissionControllerMixinRaw is an auto generated low-level Go binding around an Ethereum contract.
type PermissionControllerMixinRaw struct {
	Contract *PermissionControllerMixin // Generic contract binding to access the raw methods on
}
⋮----
Contract *PermissionControllerMixin // Generic contract binding to access the raw methods on
⋮----
// PermissionControllerMixinCallerRaw is an auto generated low-level read-only Go binding around an Ethereum contract.
type PermissionControllerMixinCallerRaw struct {
	Contract *PermissionControllerMixinCaller // Generic read-only contract binding to access the raw methods on
}
⋮----
Contract *PermissionControllerMixinCaller // Generic read-only contract binding to access the raw methods on
⋮----
// PermissionControllerMixinTransactorRaw is an auto generated low-level write-only Go binding around an Ethereum contract.
type PermissionControllerMixinTransactorRaw struct {
	Contract *PermissionControllerMixinTransactor // Generic write-only contract binding to access the raw methods on
}
⋮----
Contract *PermissionControllerMixinTransactor // Generic write-only contract binding to access the raw methods on
⋮----
// NewPermissionControllerMixin creates a new instance of PermissionControllerMixin, bound to a specific deployed contract.
func NewPermissionControllerMixin(address common.Address, backend bind.ContractBackend) (*PermissionControllerMixin, error)
⋮----
// NewPermissionControllerMixinCaller creates a new read-only instance of PermissionControllerMixin, bound to a specific deployed contract.
func NewPermissionControllerMixinCaller(address common.Address, caller bind.ContractCaller) (*PermissionControllerMixinCaller, error)
⋮----
// NewPermissionControllerMixinTransactor creates a new write-only instance of PermissionControllerMixin, bound to a specific deployed contract.
func NewPermissionControllerMixinTransactor(address common.Address, transactor bind.ContractTransactor) (*PermissionControllerMixinTransactor, error)
⋮----
// NewPermissionControllerMixinFilterer creates a new log filterer instance of PermissionControllerMixin, bound to a specific deployed contract.
func NewPermissionControllerMixinFilterer(address common.Address, filterer bind.ContractFilterer) (*PermissionControllerMixinFilterer, error)
⋮----
// bindPermissionControllerMixin binds a generic wrapper to an already deployed contract.
func bindPermissionControllerMixin(address common.Address, caller bind.ContractCaller, transactor bind.ContractTransactor, filterer bind.ContractFilterer) (*bind.BoundContract, error)
⋮----
// 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 (_PermissionControllerMixin *PermissionControllerMixinRaw) Call(opts *bind.CallOpts, result *[]interface
⋮----
// Transfer initiates a plain transaction to move funds to the contract, calling
// its default method if one is available.
func (_PermissionControllerMixin *PermissionControllerMixinRaw) Transfer(opts *bind.TransactOpts) (*types.Transaction, error)
⋮----
// Transact invokes the (paid) contract method with params as input values.
func (_PermissionControllerMixin *PermissionControllerMixinRaw) Transact(opts *bind.TransactOpts, method string, params ...interface
⋮----
// PermissionController is a free data retrieval call binding the contract method 0x4657e26a.
//
// Solidity: function permissionController() view returns(address)
func (_PermissionControllerMixin *PermissionControllerMixinCaller) PermissionController(opts *bind.CallOpts) (common.Address, error)
⋮----
var out []interface{}
````

## File: pkg/bindings/PermissionControllerStorage/binding.go
````go
// Code generated - DO NOT EDIT.
// This file is a generated binding and any manual changes will be lost.
⋮----
package PermissionControllerStorage
⋮----
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"
)
⋮----
"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
)
⋮----
// PermissionControllerStorageMetaData contains all meta data concerning the PermissionControllerStorage contract.
var PermissionControllerStorageMetaData = &bind.MetaData{
	ABI: "[{\"type\":\"function\",\"name\":\"acceptAdmin\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"addPendingAdmin\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"admin\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"canCall\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"caller\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"target\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"selector\",\"type\":\"bytes4\",\"internalType\":\"bytes4\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getAdmins\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"address[]\",\"internalType\":\"address[]\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getAppointeePermissions\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"appointee\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"address[]\",\"internalType\":\"address[]\"},{\"name\":\"\",\"type\":\"bytes4[]\",\"internalType\":\"bytes4[]\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getAppointees\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"target\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"selector\",\"type\":\"bytes4\",\"internalType\":\"bytes4\"}],\"outputs\":[{\"name\":\"\",\"type\":\"address[]\",\"internalType\":\"address[]\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getPendingAdmins\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"address[]\",\"internalType\":\"address[]\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"isAdmin\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"caller\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"isPendingAdmin\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"pendingAdmin\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"removeAdmin\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"admin\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"removeAppointee\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"appointee\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"target\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"selector\",\"type\":\"bytes4\",\"internalType\":\"bytes4\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"removePendingAdmin\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"admin\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"setAppointee\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"appointee\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"target\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"selector\",\"type\":\"bytes4\",\"internalType\":\"bytes4\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"event\",\"name\":\"AdminRemoved\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"admin\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"AdminSet\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"admin\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"AppointeeRemoved\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"appointee\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"target\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"},{\"name\":\"selector\",\"type\":\"bytes4\",\"indexed\":false,\"internalType\":\"bytes4\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"AppointeeSet\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"appointee\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"target\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"},{\"name\":\"selector\",\"type\":\"bytes4\",\"indexed\":false,\"internalType\":\"bytes4\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"PendingAdminAdded\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"admin\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"PendingAdminRemoved\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"admin\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"error\",\"name\":\"AdminAlreadyPending\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"AdminAlreadySet\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"AdminNotPending\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"AdminNotSet\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"AppointeeAlreadySet\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"AppointeeNotSet\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"CannotHaveZeroAdmins\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"NotAdmin\",\"inputs\":[]}]",
}
⋮----
// PermissionControllerStorageABI is the input ABI used to generate the binding from.
// Deprecated: Use PermissionControllerStorageMetaData.ABI instead.
var PermissionControllerStorageABI = PermissionControllerStorageMetaData.ABI
⋮----
// PermissionControllerStorage is an auto generated Go binding around an Ethereum contract.
type PermissionControllerStorage struct {
	PermissionControllerStorageCaller     // Read-only binding to the contract
	PermissionControllerStorageTransactor // Write-only binding to the contract
	PermissionControllerStorageFilterer   // Log filterer for contract events
}
⋮----
PermissionControllerStorageCaller     // Read-only binding to the contract
PermissionControllerStorageTransactor // Write-only binding to the contract
PermissionControllerStorageFilterer   // Log filterer for contract events
⋮----
// PermissionControllerStorageCaller is an auto generated read-only Go binding around an Ethereum contract.
type PermissionControllerStorageCaller struct {
	contract *bind.BoundContract // Generic contract wrapper for the low level calls
}
⋮----
contract *bind.BoundContract // Generic contract wrapper for the low level calls
⋮----
// PermissionControllerStorageTransactor is an auto generated write-only Go binding around an Ethereum contract.
type PermissionControllerStorageTransactor struct {
	contract *bind.BoundContract // Generic contract wrapper for the low level calls
}
⋮----
// PermissionControllerStorageFilterer is an auto generated log filtering Go binding around an Ethereum contract events.
type PermissionControllerStorageFilterer struct {
	contract *bind.BoundContract // Generic contract wrapper for the low level calls
}
⋮----
// PermissionControllerStorageSession is an auto generated Go binding around an Ethereum contract,
// with pre-set call and transact options.
type PermissionControllerStorageSession struct {
	Contract     *PermissionControllerStorage // 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
}
⋮----
Contract     *PermissionControllerStorage // 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
⋮----
// PermissionControllerStorageCallerSession is an auto generated read-only Go binding around an Ethereum contract,
// with pre-set call options.
type PermissionControllerStorageCallerSession struct {
	Contract *PermissionControllerStorageCaller // Generic contract caller binding to set the session for
	CallOpts bind.CallOpts                      // Call options to use throughout this session
}
⋮----
Contract *PermissionControllerStorageCaller // Generic contract caller binding to set the session for
CallOpts bind.CallOpts                      // Call options to use throughout this session
⋮----
// PermissionControllerStorageTransactorSession is an auto generated write-only Go binding around an Ethereum contract,
// with pre-set transact options.
type PermissionControllerStorageTransactorSession struct {
	Contract     *PermissionControllerStorageTransactor // Generic contract transactor binding to set the session for
	TransactOpts bind.TransactOpts                      // Transaction auth options to use throughout this session
}
⋮----
Contract     *PermissionControllerStorageTransactor // Generic contract transactor binding to set the session for
TransactOpts bind.TransactOpts                      // Transaction auth options to use throughout this session
⋮----
// PermissionControllerStorageRaw is an auto generated low-level Go binding around an Ethereum contract.
type PermissionControllerStorageRaw struct {
	Contract *PermissionControllerStorage // Generic contract binding to access the raw methods on
}
⋮----
Contract *PermissionControllerStorage // Generic contract binding to access the raw methods on
⋮----
// PermissionControllerStorageCallerRaw is an auto generated low-level read-only Go binding around an Ethereum contract.
type PermissionControllerStorageCallerRaw struct {
	Contract *PermissionControllerStorageCaller // Generic read-only contract binding to access the raw methods on
}
⋮----
Contract *PermissionControllerStorageCaller // Generic read-only contract binding to access the raw methods on
⋮----
// PermissionControllerStorageTransactorRaw is an auto generated low-level write-only Go binding around an Ethereum contract.
type PermissionControllerStorageTransactorRaw struct {
	Contract *PermissionControllerStorageTransactor // Generic write-only contract binding to access the raw methods on
}
⋮----
Contract *PermissionControllerStorageTransactor // Generic write-only contract binding to access the raw methods on
⋮----
// NewPermissionControllerStorage creates a new instance of PermissionControllerStorage, bound to a specific deployed contract.
func NewPermissionControllerStorage(address common.Address, backend bind.ContractBackend) (*PermissionControllerStorage, error)
⋮----
// NewPermissionControllerStorageCaller creates a new read-only instance of PermissionControllerStorage, bound to a specific deployed contract.
func NewPermissionControllerStorageCaller(address common.Address, caller bind.ContractCaller) (*PermissionControllerStorageCaller, error)
⋮----
// NewPermissionControllerStorageTransactor creates a new write-only instance of PermissionControllerStorage, bound to a specific deployed contract.
func NewPermissionControllerStorageTransactor(address common.Address, transactor bind.ContractTransactor) (*PermissionControllerStorageTransactor, error)
⋮----
// NewPermissionControllerStorageFilterer creates a new log filterer instance of PermissionControllerStorage, bound to a specific deployed contract.
func NewPermissionControllerStorageFilterer(address common.Address, filterer bind.ContractFilterer) (*PermissionControllerStorageFilterer, error)
⋮----
// bindPermissionControllerStorage binds a generic wrapper to an already deployed contract.
func bindPermissionControllerStorage(address common.Address, caller bind.ContractCaller, transactor bind.ContractTransactor, filterer bind.ContractFilterer) (*bind.BoundContract, error)
⋮----
// 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 (_PermissionControllerStorage *PermissionControllerStorageRaw) Call(opts *bind.CallOpts, result *[]interface
⋮----
// Transfer initiates a plain transaction to move funds to the contract, calling
// its default method if one is available.
func (_PermissionControllerStorage *PermissionControllerStorageRaw) Transfer(opts *bind.TransactOpts) (*types.Transaction, error)
⋮----
// Transact invokes the (paid) contract method with params as input values.
func (_PermissionControllerStorage *PermissionControllerStorageRaw) Transact(opts *bind.TransactOpts, method string, params ...interface
⋮----
// CanCall is a free data retrieval call binding the contract method 0xdf595cb8.
//
// Solidity: function canCall(address account, address caller, address target, bytes4 selector) view returns(bool)
func (_PermissionControllerStorage *PermissionControllerStorageCaller) CanCall(opts *bind.CallOpts, account common.Address, caller common.Address, target common.Address, selector [4]byte) (bool, error)
⋮----
var out []interface{}
⋮----
// GetAdmins is a free data retrieval call binding the contract method 0xad5f2210.
⋮----
// Solidity: function getAdmins(address account) view returns(address[])
func (_PermissionControllerStorage *PermissionControllerStorageCaller) GetAdmins(opts *bind.CallOpts, account common.Address) ([]common.Address, error)
⋮----
// GetAppointeePermissions is a free data retrieval call binding the contract method 0x882a3b38.
⋮----
// Solidity: function getAppointeePermissions(address account, address appointee) view returns(address[], bytes4[])
func (_PermissionControllerStorage *PermissionControllerStorageCaller) GetAppointeePermissions(opts *bind.CallOpts, account common.Address, appointee common.Address) ([]common.Address, [][4]byte, error)
⋮----
// GetAppointees is a free data retrieval call binding the contract method 0xfddbdefd.
⋮----
// Solidity: function getAppointees(address account, address target, bytes4 selector) view returns(address[])
func (_PermissionControllerStorage *PermissionControllerStorageCaller) GetAppointees(opts *bind.CallOpts, account common.Address, target common.Address, selector [4]byte) ([]common.Address, error)
⋮----
// GetPendingAdmins is a free data retrieval call binding the contract method 0x6bddfa1f.
⋮----
// Solidity: function getPendingAdmins(address account) view returns(address[])
func (_PermissionControllerStorage *PermissionControllerStorageCaller) GetPendingAdmins(opts *bind.CallOpts, account common.Address) ([]common.Address, error)
⋮----
// IsAdmin is a free data retrieval call binding the contract method 0x91006745.
⋮----
// Solidity: function isAdmin(address account, address caller) view returns(bool)
func (_PermissionControllerStorage *PermissionControllerStorageCaller) IsAdmin(opts *bind.CallOpts, account common.Address, caller common.Address) (bool, error)
⋮----
// IsPendingAdmin is a free data retrieval call binding the contract method 0xad8aca77.
⋮----
// Solidity: function isPendingAdmin(address account, address pendingAdmin) view returns(bool)
func (_PermissionControllerStorage *PermissionControllerStorageCaller) IsPendingAdmin(opts *bind.CallOpts, account common.Address, pendingAdmin common.Address) (bool, error)
⋮----
// AcceptAdmin is a paid mutator transaction binding the contract method 0x628806ef.
⋮----
// Solidity: function acceptAdmin(address account) returns()
func (_PermissionControllerStorage *PermissionControllerStorageTransactor) AcceptAdmin(opts *bind.TransactOpts, account common.Address) (*types.Transaction, error)
⋮----
// AddPendingAdmin is a paid mutator transaction binding the contract method 0xeb5a4e87.
⋮----
// Solidity: function addPendingAdmin(address account, address admin) returns()
func (_PermissionControllerStorage *PermissionControllerStorageTransactor) AddPendingAdmin(opts *bind.TransactOpts, account common.Address, admin common.Address) (*types.Transaction, error)
⋮----
// RemoveAdmin is a paid mutator transaction binding the contract method 0x268959e5.
⋮----
// Solidity: function removeAdmin(address account, address admin) returns()
func (_PermissionControllerStorage *PermissionControllerStorageTransactor) RemoveAdmin(opts *bind.TransactOpts, account common.Address, admin common.Address) (*types.Transaction, error)
⋮----
// RemoveAppointee is a paid mutator transaction binding the contract method 0x06641201.
⋮----
// Solidity: function removeAppointee(address account, address appointee, address target, bytes4 selector) returns()
func (_PermissionControllerStorage *PermissionControllerStorageTransactor) RemoveAppointee(opts *bind.TransactOpts, account common.Address, appointee common.Address, target common.Address, selector [4]byte) (*types.Transaction, error)
⋮----
// RemovePendingAdmin is a paid mutator transaction binding the contract method 0x4f906cf9.
⋮----
// Solidity: function removePendingAdmin(address account, address admin) returns()
func (_PermissionControllerStorage *PermissionControllerStorageTransactor) RemovePendingAdmin(opts *bind.TransactOpts, account common.Address, admin common.Address) (*types.Transaction, error)
⋮----
// SetAppointee is a paid mutator transaction binding the contract method 0x950d806e.
⋮----
// Solidity: function setAppointee(address account, address appointee, address target, bytes4 selector) returns()
func (_PermissionControllerStorage *PermissionControllerStorageTransactor) SetAppointee(opts *bind.TransactOpts, account common.Address, appointee common.Address, target common.Address, selector [4]byte) (*types.Transaction, error)
⋮----
// PermissionControllerStorageAdminRemovedIterator is returned from FilterAdminRemoved and is used to iterate over the raw logs and unpacked data for AdminRemoved events raised by the PermissionControllerStorage contract.
type PermissionControllerStorageAdminRemovedIterator struct {
	Event *PermissionControllerStorageAdminRemoved // 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
}
⋮----
Event *PermissionControllerStorageAdminRemoved // 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 *PermissionControllerStorageAdminRemovedIterator) Next() bool
⋮----
// If the iterator failed, stop iterating
⋮----
// If the iterator completed, deliver directly whatever's available
⋮----
// Iterator still in progress, wait for either a data or an error event
⋮----
// Error returns any retrieval or parsing error occurred during filtering.
func (it *PermissionControllerStorageAdminRemovedIterator) Error() error
⋮----
// Close terminates the iteration process, releasing any pending underlying
// resources.
func (it *PermissionControllerStorageAdminRemovedIterator) Close() error
⋮----
// PermissionControllerStorageAdminRemoved represents a AdminRemoved event raised by the PermissionControllerStorage contract.
type PermissionControllerStorageAdminRemoved struct {
	Account common.Address
	Admin   common.Address
	Raw     types.Log // Blockchain specific contextual infos
}
⋮----
Raw     types.Log // Blockchain specific contextual infos
⋮----
// FilterAdminRemoved is a free log retrieval operation binding the contract event 0xdb9d5d31320daf5bc7181d565b6da4d12e30f0f4d5aa324a992426c14a1d19ce.
⋮----
// Solidity: event AdminRemoved(address indexed account, address admin)
func (_PermissionControllerStorage *PermissionControllerStorageFilterer) FilterAdminRemoved(opts *bind.FilterOpts, account []common.Address) (*PermissionControllerStorageAdminRemovedIterator, error)
⋮----
var accountRule []interface{}
⋮----
// WatchAdminRemoved is a free log subscription operation binding the contract event 0xdb9d5d31320daf5bc7181d565b6da4d12e30f0f4d5aa324a992426c14a1d19ce.
⋮----
func (_PermissionControllerStorage *PermissionControllerStorageFilterer) WatchAdminRemoved(opts *bind.WatchOpts, sink chan<- *PermissionControllerStorageAdminRemoved, account []common.Address) (event.Subscription, error)
⋮----
// New log arrived, parse the event and forward to the user
⋮----
// ParseAdminRemoved is a log parse operation binding the contract event 0xdb9d5d31320daf5bc7181d565b6da4d12e30f0f4d5aa324a992426c14a1d19ce.
⋮----
func (_PermissionControllerStorage *PermissionControllerStorageFilterer) ParseAdminRemoved(log types.Log) (*PermissionControllerStorageAdminRemoved, error)
⋮----
// PermissionControllerStorageAdminSetIterator is returned from FilterAdminSet and is used to iterate over the raw logs and unpacked data for AdminSet events raised by the PermissionControllerStorage contract.
type PermissionControllerStorageAdminSetIterator struct {
	Event *PermissionControllerStorageAdminSet // 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
}
⋮----
Event *PermissionControllerStorageAdminSet // Event containing the contract specifics and raw log
⋮----
// PermissionControllerStorageAdminSet represents a AdminSet event raised by the PermissionControllerStorage contract.
type PermissionControllerStorageAdminSet struct {
	Account common.Address
	Admin   common.Address
	Raw     types.Log // Blockchain specific contextual infos
}
⋮----
// FilterAdminSet is a free log retrieval operation binding the contract event 0xbf265e8326285a2747e33e54d5945f7111f2b5edb826eb8c08d4677779b3ff97.
⋮----
// Solidity: event AdminSet(address indexed account, address admin)
func (_PermissionControllerStorage *PermissionControllerStorageFilterer) FilterAdminSet(opts *bind.FilterOpts, account []common.Address) (*PermissionControllerStorageAdminSetIterator, error)
⋮----
// WatchAdminSet is a free log subscription operation binding the contract event 0xbf265e8326285a2747e33e54d5945f7111f2b5edb826eb8c08d4677779b3ff97.
⋮----
func (_PermissionControllerStorage *PermissionControllerStorageFilterer) WatchAdminSet(opts *bind.WatchOpts, sink chan<- *PermissionControllerStorageAdminSet, account []common.Address) (event.Subscription, error)
⋮----
// ParseAdminSet is a log parse operation binding the contract event 0xbf265e8326285a2747e33e54d5945f7111f2b5edb826eb8c08d4677779b3ff97.
⋮----
func (_PermissionControllerStorage *PermissionControllerStorageFilterer) ParseAdminSet(log types.Log) (*PermissionControllerStorageAdminSet, error)
⋮----
// PermissionControllerStorageAppointeeRemovedIterator is returned from FilterAppointeeRemoved and is used to iterate over the raw logs and unpacked data for AppointeeRemoved events raised by the PermissionControllerStorage contract.
type PermissionControllerStorageAppointeeRemovedIterator struct {
	Event *PermissionControllerStorageAppointeeRemoved // 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
}
⋮----
Event *PermissionControllerStorageAppointeeRemoved // Event containing the contract specifics and raw log
⋮----
// PermissionControllerStorageAppointeeRemoved represents a AppointeeRemoved event raised by the PermissionControllerStorage contract.
type PermissionControllerStorageAppointeeRemoved struct {
	Account   common.Address
	Appointee common.Address
	Target    common.Address
	Selector  [4]byte
	Raw       types.Log // Blockchain specific contextual infos
}
⋮----
Raw       types.Log // Blockchain specific contextual infos
⋮----
// FilterAppointeeRemoved is a free log retrieval operation binding the contract event 0x18242326b6b862126970679759169f01f646bd55ec5bfcab85ba9f337a74e0c6.
⋮----
// Solidity: event AppointeeRemoved(address indexed account, address indexed appointee, address target, bytes4 selector)
func (_PermissionControllerStorage *PermissionControllerStorageFilterer) FilterAppointeeRemoved(opts *bind.FilterOpts, account []common.Address, appointee []common.Address) (*PermissionControllerStorageAppointeeRemovedIterator, error)
⋮----
var appointeeRule []interface{}
⋮----
// WatchAppointeeRemoved is a free log subscription operation binding the contract event 0x18242326b6b862126970679759169f01f646bd55ec5bfcab85ba9f337a74e0c6.
⋮----
func (_PermissionControllerStorage *PermissionControllerStorageFilterer) WatchAppointeeRemoved(opts *bind.WatchOpts, sink chan<- *PermissionControllerStorageAppointeeRemoved, account []common.Address, appointee []common.Address) (event.Subscription, error)
⋮----
// ParseAppointeeRemoved is a log parse operation binding the contract event 0x18242326b6b862126970679759169f01f646bd55ec5bfcab85ba9f337a74e0c6.
⋮----
func (_PermissionControllerStorage *PermissionControllerStorageFilterer) ParseAppointeeRemoved(log types.Log) (*PermissionControllerStorageAppointeeRemoved, error)
⋮----
// PermissionControllerStorageAppointeeSetIterator is returned from FilterAppointeeSet and is used to iterate over the raw logs and unpacked data for AppointeeSet events raised by the PermissionControllerStorage contract.
type PermissionControllerStorageAppointeeSetIterator struct {
	Event *PermissionControllerStorageAppointeeSet // 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
}
⋮----
Event *PermissionControllerStorageAppointeeSet // Event containing the contract specifics and raw log
⋮----
// PermissionControllerStorageAppointeeSet represents a AppointeeSet event raised by the PermissionControllerStorage contract.
type PermissionControllerStorageAppointeeSet struct {
	Account   common.Address
	Appointee common.Address
	Target    common.Address
	Selector  [4]byte
	Raw       types.Log // Blockchain specific contextual infos
}
⋮----
// FilterAppointeeSet is a free log retrieval operation binding the contract event 0x037f03a2ad6b967df4a01779b6d2b4c85950df83925d9e31362b519422fc0169.
⋮----
// Solidity: event AppointeeSet(address indexed account, address indexed appointee, address target, bytes4 selector)
func (_PermissionControllerStorage *PermissionControllerStorageFilterer) FilterAppointeeSet(opts *bind.FilterOpts, account []common.Address, appointee []common.Address) (*PermissionControllerStorageAppointeeSetIterator, error)
⋮----
// WatchAppointeeSet is a free log subscription operation binding the contract event 0x037f03a2ad6b967df4a01779b6d2b4c85950df83925d9e31362b519422fc0169.
⋮----
func (_PermissionControllerStorage *PermissionControllerStorageFilterer) WatchAppointeeSet(opts *bind.WatchOpts, sink chan<- *PermissionControllerStorageAppointeeSet, account []common.Address, appointee []common.Address) (event.Subscription, error)
⋮----
// ParseAppointeeSet is a log parse operation binding the contract event 0x037f03a2ad6b967df4a01779b6d2b4c85950df83925d9e31362b519422fc0169.
⋮----
func (_PermissionControllerStorage *PermissionControllerStorageFilterer) ParseAppointeeSet(log types.Log) (*PermissionControllerStorageAppointeeSet, error)
⋮----
// PermissionControllerStoragePendingAdminAddedIterator is returned from FilterPendingAdminAdded and is used to iterate over the raw logs and unpacked data for PendingAdminAdded events raised by the PermissionControllerStorage contract.
type PermissionControllerStoragePendingAdminAddedIterator struct {
	Event *PermissionControllerStoragePendingAdminAdded // 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
}
⋮----
Event *PermissionControllerStoragePendingAdminAdded // Event containing the contract specifics and raw log
⋮----
// PermissionControllerStoragePendingAdminAdded represents a PendingAdminAdded event raised by the PermissionControllerStorage contract.
type PermissionControllerStoragePendingAdminAdded struct {
	Account common.Address
	Admin   common.Address
	Raw     types.Log // Blockchain specific contextual infos
}
⋮----
// FilterPendingAdminAdded is a free log retrieval operation binding the contract event 0xb14b9a3d448c5b04f0e5b087b6f5193390db7955482a6ffb841e7b3ba61a460c.
⋮----
// Solidity: event PendingAdminAdded(address indexed account, address admin)
func (_PermissionControllerStorage *PermissionControllerStorageFilterer) FilterPendingAdminAdded(opts *bind.FilterOpts, account []common.Address) (*PermissionControllerStoragePendingAdminAddedIterator, error)
⋮----
// WatchPendingAdminAdded is a free log subscription operation binding the contract event 0xb14b9a3d448c5b04f0e5b087b6f5193390db7955482a6ffb841e7b3ba61a460c.
⋮----
func (_PermissionControllerStorage *PermissionControllerStorageFilterer) WatchPendingAdminAdded(opts *bind.WatchOpts, sink chan<- *PermissionControllerStoragePendingAdminAdded, account []common.Address) (event.Subscription, error)
⋮----
// ParsePendingAdminAdded is a log parse operation binding the contract event 0xb14b9a3d448c5b04f0e5b087b6f5193390db7955482a6ffb841e7b3ba61a460c.
⋮----
func (_PermissionControllerStorage *PermissionControllerStorageFilterer) ParsePendingAdminAdded(log types.Log) (*PermissionControllerStoragePendingAdminAdded, error)
⋮----
// PermissionControllerStoragePendingAdminRemovedIterator is returned from FilterPendingAdminRemoved and is used to iterate over the raw logs and unpacked data for PendingAdminRemoved events raised by the PermissionControllerStorage contract.
type PermissionControllerStoragePendingAdminRemovedIterator struct {
	Event *PermissionControllerStoragePendingAdminRemoved // 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
}
⋮----
Event *PermissionControllerStoragePendingAdminRemoved // Event containing the contract specifics and raw log
⋮----
// PermissionControllerStoragePendingAdminRemoved represents a PendingAdminRemoved event raised by the PermissionControllerStorage contract.
type PermissionControllerStoragePendingAdminRemoved struct {
	Account common.Address
	Admin   common.Address
	Raw     types.Log // Blockchain specific contextual infos
}
⋮----
// FilterPendingAdminRemoved is a free log retrieval operation binding the contract event 0xd706ed7ae044d795b49e54c9f519f663053951011985f663a862cd9ee72a9ac7.
⋮----
// Solidity: event PendingAdminRemoved(address indexed account, address admin)
func (_PermissionControllerStorage *PermissionControllerStorageFilterer) FilterPendingAdminRemoved(opts *bind.FilterOpts, account []common.Address) (*PermissionControllerStoragePendingAdminRemovedIterator, error)
⋮----
// WatchPendingAdminRemoved is a free log subscription operation binding the contract event 0xd706ed7ae044d795b49e54c9f519f663053951011985f663a862cd9ee72a9ac7.
⋮----
func (_PermissionControllerStorage *PermissionControllerStorageFilterer) WatchPendingAdminRemoved(opts *bind.WatchOpts, sink chan<- *PermissionControllerStoragePendingAdminRemoved, account []common.Address) (event.Subscription, error)
⋮----
// ParsePendingAdminRemoved is a log parse operation binding the contract event 0xd706ed7ae044d795b49e54c9f519f663053951011985f663a862cd9ee72a9ac7.
⋮----
func (_PermissionControllerStorage *PermissionControllerStorageFilterer) ParsePendingAdminRemoved(log types.Log) (*PermissionControllerStoragePendingAdminRemoved, error)
````

## File: pkg/bindings/ProtocolRegistry/binding.go
````go
// Code generated - DO NOT EDIT.
// This file is a generated binding and any manual changes will be lost.
⋮----
package ProtocolRegistry
⋮----
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"
)
⋮----
"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
)
⋮----
// IProtocolRegistryTypesDeploymentConfig is an auto generated low-level Go binding around an user-defined struct.
type IProtocolRegistryTypesDeploymentConfig struct {
	Pausable   bool
	Deprecated bool
}
⋮----
// ProtocolRegistryMetaData contains all meta data concerning the ProtocolRegistry contract.
var ProtocolRegistryMetaData = &bind.MetaData{
	ABI: "[{\"type\":\"constructor\",\"inputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"DEFAULT_ADMIN_ROLE\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"PAUSER_ROLE\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"configure\",\"inputs\":[{\"name\":\"name\",\"type\":\"string\",\"internalType\":\"string\"},{\"name\":\"config\",\"type\":\"tuple\",\"internalType\":\"structIProtocolRegistryTypes.DeploymentConfig\",\"components\":[{\"name\":\"pausable\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"deprecated\",\"type\":\"bool\",\"internalType\":\"bool\"}]}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"getAddress\",\"inputs\":[{\"name\":\"name\",\"type\":\"string\",\"internalType\":\"string\"}],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getAllDeployments\",\"inputs\":[],\"outputs\":[{\"name\":\"names\",\"type\":\"string[]\",\"internalType\":\"string[]\"},{\"name\":\"addresses\",\"type\":\"address[]\",\"internalType\":\"address[]\"},{\"name\":\"configs\",\"type\":\"tuple[]\",\"internalType\":\"structIProtocolRegistryTypes.DeploymentConfig[]\",\"components\":[{\"name\":\"pausable\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"deprecated\",\"type\":\"bool\",\"internalType\":\"bool\"}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getDeployment\",\"inputs\":[{\"name\":\"name\",\"type\":\"string\",\"internalType\":\"string\"}],\"outputs\":[{\"name\":\"addr\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"config\",\"type\":\"tuple\",\"internalType\":\"structIProtocolRegistryTypes.DeploymentConfig\",\"components\":[{\"name\":\"pausable\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"deprecated\",\"type\":\"bool\",\"internalType\":\"bool\"}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getRoleAdmin\",\"inputs\":[{\"name\":\"role\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getRoleMember\",\"inputs\":[{\"name\":\"role\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"index\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getRoleMemberCount\",\"inputs\":[{\"name\":\"role\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"grantRole\",\"inputs\":[{\"name\":\"role\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"account\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"hasRole\",\"inputs\":[{\"name\":\"role\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"account\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"initialize\",\"inputs\":[{\"name\":\"initialAdmin\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"pauserMultisig\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"majorVersion\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"string\",\"internalType\":\"string\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"pauseAll\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"renounceRole\",\"inputs\":[{\"name\":\"role\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"account\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"revokeRole\",\"inputs\":[{\"name\":\"role\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"account\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"ship\",\"inputs\":[{\"name\":\"addresses\",\"type\":\"address[]\",\"internalType\":\"address[]\"},{\"name\":\"configs\",\"type\":\"tuple[]\",\"internalType\":\"structIProtocolRegistryTypes.DeploymentConfig[]\",\"components\":[{\"name\":\"pausable\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"deprecated\",\"type\":\"bool\",\"internalType\":\"bool\"}]},{\"name\":\"names\",\"type\":\"string[]\",\"internalType\":\"string[]\"},{\"name\":\"semanticVersion\",\"type\":\"string\",\"internalType\":\"string\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"supportsInterface\",\"inputs\":[{\"name\":\"interfaceId\",\"type\":\"bytes4\",\"internalType\":\"bytes4\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"totalDeployments\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"version\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"string\",\"internalType\":\"string\"}],\"stateMutability\":\"view\"},{\"type\":\"event\",\"name\":\"DeploymentConfigDeleted\",\"inputs\":[{\"name\":\"addr\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"DeploymentConfigured\",\"inputs\":[{\"name\":\"addr\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"config\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structIProtocolRegistryTypes.DeploymentConfig\",\"components\":[{\"name\":\"pausable\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"deprecated\",\"type\":\"bool\",\"internalType\":\"bool\"}]}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"DeploymentShipped\",\"inputs\":[{\"name\":\"addr\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"config\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structIProtocolRegistryTypes.DeploymentConfig\",\"components\":[{\"name\":\"pausable\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"deprecated\",\"type\":\"bool\",\"internalType\":\"bool\"}]}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Initialized\",\"inputs\":[{\"name\":\"version\",\"type\":\"uint8\",\"indexed\":false,\"internalType\":\"uint8\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"RoleAdminChanged\",\"inputs\":[{\"name\":\"role\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"previousAdminRole\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"newAdminRole\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"RoleGranted\",\"inputs\":[{\"name\":\"role\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"account\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"sender\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"RoleRevoked\",\"inputs\":[{\"name\":\"role\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"account\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"sender\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"SemanticVersionUpdated\",\"inputs\":[{\"name\":\"previousSemanticVersion\",\"type\":\"string\",\"indexed\":false,\"internalType\":\"string\"},{\"name\":\"semanticVersion\",\"type\":\"string\",\"indexed\":false,\"internalType\":\"string\"}],\"anonymous\":false},{\"type\":\"error\",\"name\":\"ArrayLengthMismatch\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"DeploymentNotShipped\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InputAddressZero\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InputNameEmpty\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidShortString\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"StringTooLong\",\"inputs\":[{\"name\":\"str\",\"type\":\"string\",\"internalType\":\"string\"}]}]",
	Bin: "0x6080604052348015600e575f5ffd5b5060156019565b60d3565b5f54610100900460ff161560835760405162461bcd60e51b815260206004820152602760248201527f496e697469616c697a61626c653a20636f6e747261637420697320696e697469604482015266616c697a696e6760c81b606482015260840160405180910390fd5b5f5460ff9081161460d1575f805460ff191660ff9081179091556040519081527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b565b611b62806100e05f395ff3fe608060405234801561000f575f5ffd5b5060043610610127575f3560e01c806391d14854116100a9578063ca15c8731161006e578063ca15c87314610286578063d547741f14610299578063e63ab1e9146102ac578063fb35b4e4146102b7578063fc434a8a146102bf575f5ffd5b806391d1485414610230578063a217fddf14610243578063a8091d971461024a578063af05a5c51461026b578063bf40fac114610273575f5ffd5b8063485cc955116100ef578063485cc955146101be57806354fd4d50146101d1578063595c6a67146101e65780638eec00b8146101ee5780639010d07c14610205575f5ffd5b806301ffc9a71461012b5780630b6cc4f914610153578063248a9ca3146101685780632f2ff15d1461019857806336568abe146101ab575b5f5ffd5b61013e610139366004611478565b6102d2565b60405190151581526020015b60405180910390f35b6101666101613660046114dc565b6102fc565b005b61018a610176366004611535565b5f9081526065602052604090206001015490565b60405190815260200161014a565b6101666101a6366004611567565b6103e8565b6101666101b9366004611567565b610411565b6101666101cc366004611591565b610494565b6101d96105b1565b60405161014a91906115e7565b6101666105c3565b6101f66106a3565b60405161014a9392919061164c565b610218610213366004611709565b610876565b6040516001600160a01b03909116815260200161014a565b61013e61023e366004611567565b610894565b61018a5f81565b61025d610258366004611729565b6108be565b60405161014a929190611767565b6101d9610967565b610218610281366004611729565b6109be565b61018a610294366004611535565b610a03565b6101666102a7366004611567565b610a19565b61018a600160f81b81565b61018a610a3d565b6101666102cd3660046117d2565b610a48565b5f6001600160e01b03198216635a05180f60e01b14806102f657506102f682610ba4565b92915050565b5f61030681610bd8565b5f5f61035761034f61034c88888080601f0160208091040260200160405190810160405280939291908181526020018383808284375f92019190915250610be592505050565b90565b60ca90610c22565b91509150816103795760405163732e48b560e11b815260040160405180910390fd5b6001600160a01b0381165f90815260cd60205260409020849061039c82826118da565b905050806001600160a01b03167f6c5879ec82f910f6d12844857cfb8eb474dcecc9aa5b8257c7a77dcb42990e9d856040516103d89190611920565b60405180910390a2505050505050565b5f8281526065602052604090206001015461040281610bd8565b61040c8383610c3d565b505050565b6001600160a01b03811633146104865760405162461bcd60e51b815260206004820152602f60248201527f416363657373436f6e74726f6c3a2063616e206f6e6c792072656e6f756e636560448201526e103937b632b9903337b91039b2b63360891b60648201526084015b60405180910390fd5b6104908282610c5e565b5050565b5f54610100900460ff16158080156104b257505f54600160ff909116105b806104cb5750303b1580156104cb57505f5460ff166001145b61052e5760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b606482015260840161047d565b5f805460ff19166001179055801561054f575f805461ff0019166101001790555b6105595f84610c3d565b610567600160f81b83610c3d565b801561040c575f805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb3847402498906020015b60405180910390a1505050565b60606105be60c954610c7f565b905090565b600160f81b6105d181610bd8565b5f6105da610a3d565b90505f5b8181101561040c575f6105f260ca83610cbc565b6001600160a01b0381165f90815260cd602090815260409182902082518084019093525460ff80821615801580865261010090930490911615159284019290925292945090925061064557508060200151155b1561069957816001600160a01b031663595c6a676040518163ffffffff1660e01b81526004015f604051808303815f87803b158015610682575f5ffd5b505af1158015610694573d5f5f3e3d5ffd5b505050505b50506001016105de565b60608060605f6106b1610a3d565b9050806001600160401b038111156106cb576106cb611950565b6040519080825280602002602001820160405280156106fe57816020015b60608152602001906001900390816106e95790505b509350806001600160401b0381111561071957610719611950565b604051908082528060200260200182016040528015610742578160200160208202803683370190505b509250806001600160401b0381111561075d5761075d611950565b6040519080825280602002602001820160405280156107a157816020015b604080518082019091525f808252602082015281526020019060019003908161077b5790505b5091505f5b8181101561086f575f806107bb60ca84610cbc565b90925090506107c982610c7f565b8784815181106107db576107db611964565b6020026020010181905250808684815181106107f9576107f9611964565b6001600160a01b039283166020918202929092018101919091529082165f90815260cd825260409081902081518083019092525460ff8082161515835261010090910416151591810191909152855186908590811061085a5761085a611964565b602090810291909101015250506001016107a6565b5050909192565b5f82815260976020526040812061088d9083610cca565b9392505050565b5f9182526065602090815260408084206001600160a01b0393909316845291905290205460ff1690565b604080518082019091525f808252602082018190529061092061091861034c86868080601f0160208091040260200160405190810160405280939291908181526020018383808284375f92019190915250610be592505050565b60ca90610cd5565b6001600160a01b0381165f90815260cd602090815260409182902082518084019093525460ff808216151584526101009091041615159082015290925090505b9250929050565b60605f61097560c954610c7f565b9050805f8151811061098957610989611964565b016020908101516040516001600160f81b03199091169181019190915260210160405160208183030381529060405291505090565b5f61088d61091861034c85858080601f0160208091040260200160405190810160405280939291908181526020018383808284375f92019190915250610be592505050565b5f8181526097602052604081206102f690610ce0565b5f82815260656020526040902060010154610a3381610bd8565b61040c8383610c5e565b5f6105be60ca610ce9565b5f610a5281610bd8565b8786148015610a6057508584145b610a7d5760405163512509d360e11b815260040160405180910390fd5b610a878383610cf3565b5f5b88811015610b98575f8a8a83818110610aa457610aa4611964565b9050602002016020810190610ab99190611978565b6001600160a01b031603610ae0576040516339b190bb60e11b815260040160405180910390fd5b5f868683818110610af357610af3611964565b9050602002810190610b059190611991565b905011610b2557604051630866694d60e01b815260040160405180910390fd5b610b908a8a83818110610b3a57610b3a611964565b9050602002016020810190610b4f9190611978565b898984818110610b6157610b61611964565b905060400201888885818110610b7957610b79611964565b9050602002810190610b8b9190611991565b610d76565b600101610a89565b50505050505050505050565b5f6001600160e01b03198216637965db0b60e01b14806102f657506301ffc9a760e01b6001600160e01b03198316146102f6565b610be28133610eb3565b50565b5f5f829050601f81511115610c0f578260405163305a27a960e01b815260040161047d91906115e7565b8051610c1a826119d3565b179392505050565b5f808080610c308686610f0c565b9097909650945050505050565b610c478282610f44565b5f82815260976020526040902061040c9082610fc9565b610c688282610fdd565b5f82815260976020526040902061040c9082611043565b60605f610c8b83611057565b6040805160208082528183019092529192505f91906020820181803683375050509182525060208101929092525090565b5f808080610c30868661107e565b5f61088d83836110a7565b5f61088d83836110cd565b5f6102f6825490565b5f6102f68261113c565b5f610cff60c954610c7f565b9050610d3f83838080601f0160208091040260200160405190810160405280939291908181526020018383808284375f92019190915250610be592505050565b60c9556040517f769656e5cb3218f54758f85bd184d41e987639374d6cb9e244439cc9d1abe1e2906105a4908390869086906119f9565b5f610db861034c84848080601f0160208091040260200160405190810160405280939291908181526020018383808284375f92019190915250610be592505050565b90505f80610dc760ca84610c22565b91509150818015610dea5750866001600160a01b0316816001600160a01b031614155b15610e36576001600160a01b0381165f81815260cd6020526040808220805461ffff19169055517fa69cccaa8b056f2577aa7e06e1eb14ae0eb526356819b9403f5b31f41f3bc5099190a25b610e4260ca8489611146565b506001600160a01b0387165f90815260cd602052604090208690610e6682826118da565b905050866001600160a01b03167f4e81e5495dbc85919bf1b9c12a9a4bb6d546f75d3f92fa0a36867fc29a51467c87604051610ea29190611920565b60405180910390a250505050505050565b610ebd8282610894565b61049057610eca81611163565b610ed5836020611175565b604051602001610ee6929190611a54565b60408051601f198184030181529082905262461bcd60e51b825261047d916004016115e7565b5f818152600283016020526040812054819080610f3957610f2d858561130a565b92505f91506109609050565b600192509050610960565b610f4e8282610894565b610490575f8281526065602090815260408083206001600160a01b03851684529091529020805460ff19166001179055610f853390565b6001600160a01b0316816001600160a01b0316837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45050565b5f61088d836001600160a01b038416611327565b610fe78282610894565b15610490575f8281526065602090815260408083206001600160a01b0385168085529252808320805460ff1916905551339285917ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b9190a45050565b5f61088d836001600160a01b038416611373565b5f60ff8216601f8111156102f657604051632cd44ac360e21b815260040160405180910390fd5b5f808061108b8585610cca565b5f81815260029690960160205260409095205494959350505050565b5f825f0182815481106110bc576110bc611964565b905f5260205f200154905092915050565b5f818152600283016020526040812054801515806110f057506110f0848461130a565b61088d5760405162461bcd60e51b815260206004820152601e60248201527f456e756d657261626c654d61703a206e6f6e6578697374656e74206b65790000604482015260640161047d565b5f6102f682610ce0565b5f61115b84846001600160a01b038516611456565b949350505050565b60606102f66001600160a01b03831660145b60605f611183836002611ac6565b61118e906002611add565b6001600160401b038111156111a5576111a5611950565b6040519080825280601f01601f1916602001820160405280156111cf576020820181803683370190505b509050600360fc1b815f815181106111e9576111e9611964565b60200101906001600160f81b03191690815f1a905350600f60fb1b8160018151811061121757611217611964565b60200101906001600160f81b03191690815f1a9053505f611239846002611ac6565b611244906001611add565b90505b60018111156112bb576f181899199a1a9b1b9c1cb0b131b232b360811b85600f166010811061127857611278611964565b1a60f81b82828151811061128e5761128e611964565b60200101906001600160f81b03191690815f1a90535060049490941c936112b481611af0565b9050611247565b50831561088d5760405162461bcd60e51b815260206004820181905260248201527f537472696e67733a20686578206c656e67746820696e73756666696369656e74604482015260640161047d565b5f61088d83835f818152600183016020526040812054151561088d565b5f81815260018301602052604081205461136c57508154600181810184555f8481526020808220909301849055845484825282860190935260409020919091556102f6565b505f6102f6565b5f818152600183016020526040812054801561144d575f611395600183611b05565b85549091505f906113a890600190611b05565b9050818114611407575f865f0182815481106113c6576113c6611964565b905f5260205f200154905080875f0184815481106113e6576113e6611964565b5f918252602080832090910192909255918252600188019052604090208390555b855486908061141857611418611b18565b600190038181905f5260205f20015f90559055856001015f8681526020019081526020015f205f9055600193505050506102f6565b5f9150506102f6565b5f828152600284016020526040812082905561115b84845f61088d8383611327565b5f60208284031215611488575f5ffd5b81356001600160e01b03198116811461088d575f5ffd5b5f5f83601f8401126114af575f5ffd5b5081356001600160401b038111156114c5575f5ffd5b602083019150836020828501011115610960575f5ffd5b5f5f5f83850360608112156114ef575f5ffd5b84356001600160401b03811115611504575f5ffd5b6115108782880161149f565b9095509350506040601f1982011215611527575f5ffd5b506020840190509250925092565b5f60208284031215611545575f5ffd5b5035919050565b80356001600160a01b0381168114611562575f5ffd5b919050565b5f5f60408385031215611578575f5ffd5b823591506115886020840161154c565b90509250929050565b5f5f604083850312156115a2575f5ffd5b6115ab8361154c565b91506115886020840161154c565b5f81518084528060208401602086015e5f602082860101526020601f19601f83011685010191505092915050565b602081525f61088d60208301846115b9565b5f8151808452602084019350602083015f5b828110156116425761162c8683518051151582526020908101511515910152565b604095909501946020919091019060010161160b565b5093949350505050565b5f606082016060835280865180835260808501915060808160051b8601019250602088015f5b828110156116a357607f1987860301845261168e8583516115b9565b94506020938401939190910190600101611672565b5050505082810360208401528085518083526020830191506020870192505f5b818110156116ea5783516001600160a01b03168352602093840193909201916001016116c3565b505083810360408501526116fe81866115f9565b979650505050505050565b5f5f6040838503121561171a575f5ffd5b50508035926020909101359150565b5f5f6020838503121561173a575f5ffd5b82356001600160401b0381111561174f575f5ffd5b61175b8582860161149f565b90969095509350505050565b6001600160a01b03831681526060810161088d60208301848051151582526020908101511515910152565b5f5f83601f8401126117a2575f5ffd5b5081356001600160401b038111156117b8575f5ffd5b6020830191508360208260051b8501011115610960575f5ffd5b5f5f5f5f5f5f5f5f6080898b0312156117e9575f5ffd5b88356001600160401b038111156117fe575f5ffd5b61180a8b828c01611792565b90995097505060208901356001600160401b03811115611828575f5ffd5b8901601f81018b13611838575f5ffd5b80356001600160401b0381111561184d575f5ffd5b8b60208260061b8401011115611861575f5ffd5b6020919091019650945060408901356001600160401b03811115611883575f5ffd5b61188f8b828c01611792565b90955093505060608901356001600160401b038111156118ad575f5ffd5b6118b98b828c0161149f565b999c989b5096995094979396929594505050565b8015158114610be2575f5ffd5b81356118e5816118cd565b815460ff19811691151560ff1691821783556020840135611905816118cd565b61ffff199190911690911790151560081b61ff001617905550565b60408101823561192f816118cd565b151582526020830135611941816118cd565b80151560208401525092915050565b634e487b7160e01b5f52604160045260245ffd5b634e487b7160e01b5f52603260045260245ffd5b5f60208284031215611988575f5ffd5b61088d8261154c565b5f5f8335601e198436030181126119a6575f5ffd5b8301803591506001600160401b038211156119bf575f5ffd5b602001915036819003821315610960575f5ffd5b805160208083015191908110156119f3575f198160200360031b1b821691505b50919050565b604081525f611a0b60408301866115b9565b8281036020840152838152838560208301375f602085830101526020601f19601f860116820101915050949350505050565b5f81518060208401855e5f93019283525090919050565b7f416363657373436f6e74726f6c3a206163636f756e742000000000000000000081525f611a856017830185611a3d565b7001034b99036b4b9b9b4b733903937b6329607d1b8152611aa96011820185611a3d565b95945050505050565b634e487b7160e01b5f52601160045260245ffd5b80820281158282048414176102f6576102f6611ab2565b808201808211156102f6576102f6611ab2565b5f81611afe57611afe611ab2565b505f190190565b818103818111156102f6576102f6611ab2565b634e487b7160e01b5f52603160045260245ffdfea2646970667358221220774dcb259a40d82ca183e5df8ed92673ab82358dc5cd40c8edeaf12196e1f36864736f6c634300081e0033",
}
⋮----
// ProtocolRegistryABI is the input ABI used to generate the binding from.
// Deprecated: Use ProtocolRegistryMetaData.ABI instead.
var ProtocolRegistryABI = ProtocolRegistryMetaData.ABI
⋮----
// ProtocolRegistryBin is the compiled bytecode used for deploying new contracts.
// Deprecated: Use ProtocolRegistryMetaData.Bin instead.
var ProtocolRegistryBin = ProtocolRegistryMetaData.Bin
⋮----
// DeployProtocolRegistry deploys a new Ethereum contract, binding an instance of ProtocolRegistry to it.
func DeployProtocolRegistry(auth *bind.TransactOpts, backend bind.ContractBackend) (common.Address, *types.Transaction, *ProtocolRegistry, error)
⋮----
// ProtocolRegistry is an auto generated Go binding around an Ethereum contract.
type ProtocolRegistry struct {
	ProtocolRegistryCaller     // Read-only binding to the contract
	ProtocolRegistryTransactor // Write-only binding to the contract
	ProtocolRegistryFilterer   // Log filterer for contract events
}
⋮----
ProtocolRegistryCaller     // Read-only binding to the contract
ProtocolRegistryTransactor // Write-only binding to the contract
ProtocolRegistryFilterer   // Log filterer for contract events
⋮----
// ProtocolRegistryCaller is an auto generated read-only Go binding around an Ethereum contract.
type ProtocolRegistryCaller struct {
	contract *bind.BoundContract // Generic contract wrapper for the low level calls
}
⋮----
contract *bind.BoundContract // Generic contract wrapper for the low level calls
⋮----
// ProtocolRegistryTransactor is an auto generated write-only Go binding around an Ethereum contract.
type ProtocolRegistryTransactor struct {
	contract *bind.BoundContract // Generic contract wrapper for the low level calls
}
⋮----
// ProtocolRegistryFilterer is an auto generated log filtering Go binding around an Ethereum contract events.
type ProtocolRegistryFilterer struct {
	contract *bind.BoundContract // Generic contract wrapper for the low level calls
}
⋮----
// ProtocolRegistrySession is an auto generated Go binding around an Ethereum contract,
// with pre-set call and transact options.
type ProtocolRegistrySession struct {
	Contract     *ProtocolRegistry // 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
}
⋮----
Contract     *ProtocolRegistry // 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
⋮----
// ProtocolRegistryCallerSession is an auto generated read-only Go binding around an Ethereum contract,
// with pre-set call options.
type ProtocolRegistryCallerSession struct {
	Contract *ProtocolRegistryCaller // Generic contract caller binding to set the session for
	CallOpts bind.CallOpts           // Call options to use throughout this session
}
⋮----
Contract *ProtocolRegistryCaller // Generic contract caller binding to set the session for
CallOpts bind.CallOpts           // Call options to use throughout this session
⋮----
// ProtocolRegistryTransactorSession is an auto generated write-only Go binding around an Ethereum contract,
// with pre-set transact options.
type ProtocolRegistryTransactorSession struct {
	Contract     *ProtocolRegistryTransactor // Generic contract transactor binding to set the session for
	TransactOpts bind.TransactOpts           // Transaction auth options to use throughout this session
}
⋮----
Contract     *ProtocolRegistryTransactor // Generic contract transactor binding to set the session for
TransactOpts bind.TransactOpts           // Transaction auth options to use throughout this session
⋮----
// ProtocolRegistryRaw is an auto generated low-level Go binding around an Ethereum contract.
type ProtocolRegistryRaw struct {
	Contract *ProtocolRegistry // Generic contract binding to access the raw methods on
}
⋮----
Contract *ProtocolRegistry // Generic contract binding to access the raw methods on
⋮----
// ProtocolRegistryCallerRaw is an auto generated low-level read-only Go binding around an Ethereum contract.
type ProtocolRegistryCallerRaw struct {
	Contract *ProtocolRegistryCaller // Generic read-only contract binding to access the raw methods on
}
⋮----
Contract *ProtocolRegistryCaller // Generic read-only contract binding to access the raw methods on
⋮----
// ProtocolRegistryTransactorRaw is an auto generated low-level write-only Go binding around an Ethereum contract.
type ProtocolRegistryTransactorRaw struct {
	Contract *ProtocolRegistryTransactor // Generic write-only contract binding to access the raw methods on
}
⋮----
Contract *ProtocolRegistryTransactor // Generic write-only contract binding to access the raw methods on
⋮----
// NewProtocolRegistry creates a new instance of ProtocolRegistry, bound to a specific deployed contract.
func NewProtocolRegistry(address common.Address, backend bind.ContractBackend) (*ProtocolRegistry, error)
⋮----
// NewProtocolRegistryCaller creates a new read-only instance of ProtocolRegistry, bound to a specific deployed contract.
func NewProtocolRegistryCaller(address common.Address, caller bind.ContractCaller) (*ProtocolRegistryCaller, error)
⋮----
// NewProtocolRegistryTransactor creates a new write-only instance of ProtocolRegistry, bound to a specific deployed contract.
func NewProtocolRegistryTransactor(address common.Address, transactor bind.ContractTransactor) (*ProtocolRegistryTransactor, error)
⋮----
// NewProtocolRegistryFilterer creates a new log filterer instance of ProtocolRegistry, bound to a specific deployed contract.
func NewProtocolRegistryFilterer(address common.Address, filterer bind.ContractFilterer) (*ProtocolRegistryFilterer, error)
⋮----
// bindProtocolRegistry binds a generic wrapper to an already deployed contract.
func bindProtocolRegistry(address common.Address, caller bind.ContractCaller, transactor bind.ContractTransactor, filterer bind.ContractFilterer) (*bind.BoundContract, error)
⋮----
// 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 (_ProtocolRegistry *ProtocolRegistryRaw) Call(opts *bind.CallOpts, result *[]interface
⋮----
// Transfer initiates a plain transaction to move funds to the contract, calling
// its default method if one is available.
func (_ProtocolRegistry *ProtocolRegistryRaw) Transfer(opts *bind.TransactOpts) (*types.Transaction, error)
⋮----
// Transact invokes the (paid) contract method with params as input values.
func (_ProtocolRegistry *ProtocolRegistryRaw) Transact(opts *bind.TransactOpts, method string, params ...interface
⋮----
// DEFAULTADMINROLE is a free data retrieval call binding the contract method 0xa217fddf.
//
// Solidity: function DEFAULT_ADMIN_ROLE() view returns(bytes32)
func (_ProtocolRegistry *ProtocolRegistryCaller) DEFAULTADMINROLE(opts *bind.CallOpts) ([32]byte, error)
⋮----
var out []interface{}
⋮----
// PAUSERROLE is a free data retrieval call binding the contract method 0xe63ab1e9.
⋮----
// Solidity: function PAUSER_ROLE() view returns(bytes32)
func (_ProtocolRegistry *ProtocolRegistryCaller) PAUSERROLE(opts *bind.CallOpts) ([32]byte, error)
⋮----
// GetAddress is a free data retrieval call binding the contract method 0xbf40fac1.
⋮----
// Solidity: function getAddress(string name) view returns(address)
func (_ProtocolRegistry *ProtocolRegistryCaller) GetAddress(opts *bind.CallOpts, name string) (common.Address, error)
⋮----
// GetAllDeployments is a free data retrieval call binding the contract method 0x8eec00b8.
⋮----
// Solidity: function getAllDeployments() view returns(string[] names, address[] addresses, (bool,bool)[] configs)
func (_ProtocolRegistry *ProtocolRegistryCaller) GetAllDeployments(opts *bind.CallOpts) (struct
⋮----
// GetDeployment is a free data retrieval call binding the contract method 0xa8091d97.
⋮----
// Solidity: function getDeployment(string name) view returns(address addr, (bool,bool) config)
func (_ProtocolRegistry *ProtocolRegistryCaller) GetDeployment(opts *bind.CallOpts, name string) (struct
⋮----
// GetRoleAdmin is a free data retrieval call binding the contract method 0x248a9ca3.
⋮----
// Solidity: function getRoleAdmin(bytes32 role) view returns(bytes32)
func (_ProtocolRegistry *ProtocolRegistryCaller) GetRoleAdmin(opts *bind.CallOpts, role [32]byte) ([32]byte, error)
⋮----
// GetRoleMember is a free data retrieval call binding the contract method 0x9010d07c.
⋮----
// Solidity: function getRoleMember(bytes32 role, uint256 index) view returns(address)
func (_ProtocolRegistry *ProtocolRegistryCaller) GetRoleMember(opts *bind.CallOpts, role [32]byte, index *big.Int) (common.Address, error)
⋮----
// GetRoleMemberCount is a free data retrieval call binding the contract method 0xca15c873.
⋮----
// Solidity: function getRoleMemberCount(bytes32 role) view returns(uint256)
func (_ProtocolRegistry *ProtocolRegistryCaller) GetRoleMemberCount(opts *bind.CallOpts, role [32]byte) (*big.Int, error)
⋮----
// HasRole is a free data retrieval call binding the contract method 0x91d14854.
⋮----
// Solidity: function hasRole(bytes32 role, address account) view returns(bool)
func (_ProtocolRegistry *ProtocolRegistryCaller) HasRole(opts *bind.CallOpts, role [32]byte, account common.Address) (bool, error)
⋮----
// MajorVersion is a free data retrieval call binding the contract method 0xaf05a5c5.
⋮----
// Solidity: function majorVersion() view returns(string)
func (_ProtocolRegistry *ProtocolRegistryCaller) MajorVersion(opts *bind.CallOpts) (string, error)
⋮----
// SupportsInterface is a free data retrieval call binding the contract method 0x01ffc9a7.
⋮----
// Solidity: function supportsInterface(bytes4 interfaceId) view returns(bool)
func (_ProtocolRegistry *ProtocolRegistryCaller) SupportsInterface(opts *bind.CallOpts, interfaceId [4]byte) (bool, error)
⋮----
// TotalDeployments is a free data retrieval call binding the contract method 0xfb35b4e4.
⋮----
// Solidity: function totalDeployments() view returns(uint256)
func (_ProtocolRegistry *ProtocolRegistryCaller) TotalDeployments(opts *bind.CallOpts) (*big.Int, error)
⋮----
// Version is a free data retrieval call binding the contract method 0x54fd4d50.
⋮----
// Solidity: function version() view returns(string)
func (_ProtocolRegistry *ProtocolRegistryCaller) Version(opts *bind.CallOpts) (string, error)
⋮----
// Configure is a paid mutator transaction binding the contract method 0x0b6cc4f9.
⋮----
// Solidity: function configure(string name, (bool,bool) config) returns()
func (_ProtocolRegistry *ProtocolRegistryTransactor) Configure(opts *bind.TransactOpts, name string, config IProtocolRegistryTypesDeploymentConfig) (*types.Transaction, error)
⋮----
// GrantRole is a paid mutator transaction binding the contract method 0x2f2ff15d.
⋮----
// Solidity: function grantRole(bytes32 role, address account) returns()
func (_ProtocolRegistry *ProtocolRegistryTransactor) GrantRole(opts *bind.TransactOpts, role [32]byte, account common.Address) (*types.Transaction, error)
⋮----
// Initialize is a paid mutator transaction binding the contract method 0x485cc955.
⋮----
// Solidity: function initialize(address initialAdmin, address pauserMultisig) returns()
func (_ProtocolRegistry *ProtocolRegistryTransactor) Initialize(opts *bind.TransactOpts, initialAdmin common.Address, pauserMultisig common.Address) (*types.Transaction, error)
⋮----
// PauseAll is a paid mutator transaction binding the contract method 0x595c6a67.
⋮----
// Solidity: function pauseAll() returns()
func (_ProtocolRegistry *ProtocolRegistryTransactor) PauseAll(opts *bind.TransactOpts) (*types.Transaction, error)
⋮----
// RenounceRole is a paid mutator transaction binding the contract method 0x36568abe.
⋮----
// Solidity: function renounceRole(bytes32 role, address account) returns()
func (_ProtocolRegistry *ProtocolRegistryTransactor) RenounceRole(opts *bind.TransactOpts, role [32]byte, account common.Address) (*types.Transaction, error)
⋮----
// RevokeRole is a paid mutator transaction binding the contract method 0xd547741f.
⋮----
// Solidity: function revokeRole(bytes32 role, address account) returns()
func (_ProtocolRegistry *ProtocolRegistryTransactor) RevokeRole(opts *bind.TransactOpts, role [32]byte, account common.Address) (*types.Transaction, error)
⋮----
// Ship is a paid mutator transaction binding the contract method 0xfc434a8a.
⋮----
// Solidity: function ship(address[] addresses, (bool,bool)[] configs, string[] names, string semanticVersion) returns()
func (_ProtocolRegistry *ProtocolRegistryTransactor) Ship(opts *bind.TransactOpts, addresses []common.Address, configs []IProtocolRegistryTypesDeploymentConfig, names []string, semanticVersion string) (*types.Transaction, error)
⋮----
// ProtocolRegistryDeploymentConfigDeletedIterator is returned from FilterDeploymentConfigDeleted and is used to iterate over the raw logs and unpacked data for DeploymentConfigDeleted events raised by the ProtocolRegistry contract.
type ProtocolRegistryDeploymentConfigDeletedIterator struct {
	Event *ProtocolRegistryDeploymentConfigDeleted // 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
}
⋮----
Event *ProtocolRegistryDeploymentConfigDeleted // 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 *ProtocolRegistryDeploymentConfigDeletedIterator) Next() bool
⋮----
// If the iterator failed, stop iterating
⋮----
// If the iterator completed, deliver directly whatever's available
⋮----
// Iterator still in progress, wait for either a data or an error event
⋮----
// Error returns any retrieval or parsing error occurred during filtering.
func (it *ProtocolRegistryDeploymentConfigDeletedIterator) Error() error
⋮----
// Close terminates the iteration process, releasing any pending underlying
// resources.
func (it *ProtocolRegistryDeploymentConfigDeletedIterator) Close() error
⋮----
// ProtocolRegistryDeploymentConfigDeleted represents a DeploymentConfigDeleted event raised by the ProtocolRegistry contract.
type ProtocolRegistryDeploymentConfigDeleted struct {
	Addr common.Address
	Raw  types.Log // Blockchain specific contextual infos
}
⋮----
Raw  types.Log // Blockchain specific contextual infos
⋮----
// FilterDeploymentConfigDeleted is a free log retrieval operation binding the contract event 0xa69cccaa8b056f2577aa7e06e1eb14ae0eb526356819b9403f5b31f41f3bc509.
⋮----
// Solidity: event DeploymentConfigDeleted(address indexed addr)
func (_ProtocolRegistry *ProtocolRegistryFilterer) FilterDeploymentConfigDeleted(opts *bind.FilterOpts, addr []common.Address) (*ProtocolRegistryDeploymentConfigDeletedIterator, error)
⋮----
var addrRule []interface{}
⋮----
// WatchDeploymentConfigDeleted is a free log subscription operation binding the contract event 0xa69cccaa8b056f2577aa7e06e1eb14ae0eb526356819b9403f5b31f41f3bc509.
⋮----
func (_ProtocolRegistry *ProtocolRegistryFilterer) WatchDeploymentConfigDeleted(opts *bind.WatchOpts, sink chan<- *ProtocolRegistryDeploymentConfigDeleted, addr []common.Address) (event.Subscription, error)
⋮----
// New log arrived, parse the event and forward to the user
⋮----
// ParseDeploymentConfigDeleted is a log parse operation binding the contract event 0xa69cccaa8b056f2577aa7e06e1eb14ae0eb526356819b9403f5b31f41f3bc509.
⋮----
func (_ProtocolRegistry *ProtocolRegistryFilterer) ParseDeploymentConfigDeleted(log types.Log) (*ProtocolRegistryDeploymentConfigDeleted, error)
⋮----
// ProtocolRegistryDeploymentConfiguredIterator is returned from FilterDeploymentConfigured and is used to iterate over the raw logs and unpacked data for DeploymentConfigured events raised by the ProtocolRegistry contract.
type ProtocolRegistryDeploymentConfiguredIterator struct {
	Event *ProtocolRegistryDeploymentConfigured // 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
}
⋮----
Event *ProtocolRegistryDeploymentConfigured // Event containing the contract specifics and raw log
⋮----
// ProtocolRegistryDeploymentConfigured represents a DeploymentConfigured event raised by the ProtocolRegistry contract.
type ProtocolRegistryDeploymentConfigured struct {
	Addr   common.Address
	Config IProtocolRegistryTypesDeploymentConfig
	Raw    types.Log // Blockchain specific contextual infos
}
⋮----
Raw    types.Log // Blockchain specific contextual infos
⋮----
// FilterDeploymentConfigured is a free log retrieval operation binding the contract event 0x6c5879ec82f910f6d12844857cfb8eb474dcecc9aa5b8257c7a77dcb42990e9d.
⋮----
// Solidity: event DeploymentConfigured(address indexed addr, (bool,bool) config)
func (_ProtocolRegistry *ProtocolRegistryFilterer) FilterDeploymentConfigured(opts *bind.FilterOpts, addr []common.Address) (*ProtocolRegistryDeploymentConfiguredIterator, error)
⋮----
// WatchDeploymentConfigured is a free log subscription operation binding the contract event 0x6c5879ec82f910f6d12844857cfb8eb474dcecc9aa5b8257c7a77dcb42990e9d.
⋮----
func (_ProtocolRegistry *ProtocolRegistryFilterer) WatchDeploymentConfigured(opts *bind.WatchOpts, sink chan<- *ProtocolRegistryDeploymentConfigured, addr []common.Address) (event.Subscription, error)
⋮----
// ParseDeploymentConfigured is a log parse operation binding the contract event 0x6c5879ec82f910f6d12844857cfb8eb474dcecc9aa5b8257c7a77dcb42990e9d.
⋮----
func (_ProtocolRegistry *ProtocolRegistryFilterer) ParseDeploymentConfigured(log types.Log) (*ProtocolRegistryDeploymentConfigured, error)
⋮----
// ProtocolRegistryDeploymentShippedIterator is returned from FilterDeploymentShipped and is used to iterate over the raw logs and unpacked data for DeploymentShipped events raised by the ProtocolRegistry contract.
type ProtocolRegistryDeploymentShippedIterator struct {
	Event *ProtocolRegistryDeploymentShipped // 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
}
⋮----
Event *ProtocolRegistryDeploymentShipped // Event containing the contract specifics and raw log
⋮----
// ProtocolRegistryDeploymentShipped represents a DeploymentShipped event raised by the ProtocolRegistry contract.
type ProtocolRegistryDeploymentShipped struct {
	Addr   common.Address
	Config IProtocolRegistryTypesDeploymentConfig
	Raw    types.Log // Blockchain specific contextual infos
}
⋮----
// FilterDeploymentShipped is a free log retrieval operation binding the contract event 0x4e81e5495dbc85919bf1b9c12a9a4bb6d546f75d3f92fa0a36867fc29a51467c.
⋮----
// Solidity: event DeploymentShipped(address indexed addr, (bool,bool) config)
func (_ProtocolRegistry *ProtocolRegistryFilterer) FilterDeploymentShipped(opts *bind.FilterOpts, addr []common.Address) (*ProtocolRegistryDeploymentShippedIterator, error)
⋮----
// WatchDeploymentShipped is a free log subscription operation binding the contract event 0x4e81e5495dbc85919bf1b9c12a9a4bb6d546f75d3f92fa0a36867fc29a51467c.
⋮----
func (_ProtocolRegistry *ProtocolRegistryFilterer) WatchDeploymentShipped(opts *bind.WatchOpts, sink chan<- *ProtocolRegistryDeploymentShipped, addr []common.Address) (event.Subscription, error)
⋮----
// ParseDeploymentShipped is a log parse operation binding the contract event 0x4e81e5495dbc85919bf1b9c12a9a4bb6d546f75d3f92fa0a36867fc29a51467c.
⋮----
func (_ProtocolRegistry *ProtocolRegistryFilterer) ParseDeploymentShipped(log types.Log) (*ProtocolRegistryDeploymentShipped, error)
⋮----
// ProtocolRegistryInitializedIterator is returned from FilterInitialized and is used to iterate over the raw logs and unpacked data for Initialized events raised by the ProtocolRegistry contract.
type ProtocolRegistryInitializedIterator struct {
	Event *ProtocolRegistryInitialized // 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
}
⋮----
Event *ProtocolRegistryInitialized // Event containing the contract specifics and raw log
⋮----
// ProtocolRegistryInitialized represents a Initialized event raised by the ProtocolRegistry contract.
type ProtocolRegistryInitialized struct {
	Version uint8
	Raw     types.Log // Blockchain specific contextual infos
}
⋮----
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 (_ProtocolRegistry *ProtocolRegistryFilterer) FilterInitialized(opts *bind.FilterOpts) (*ProtocolRegistryInitializedIterator, error)
⋮----
// WatchInitialized is a free log subscription operation binding the contract event 0x7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb3847402498.
⋮----
func (_ProtocolRegistry *ProtocolRegistryFilterer) WatchInitialized(opts *bind.WatchOpts, sink chan<- *ProtocolRegistryInitialized) (event.Subscription, error)
⋮----
// ParseInitialized is a log parse operation binding the contract event 0x7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb3847402498.
⋮----
func (_ProtocolRegistry *ProtocolRegistryFilterer) ParseInitialized(log types.Log) (*ProtocolRegistryInitialized, error)
⋮----
// ProtocolRegistryRoleAdminChangedIterator is returned from FilterRoleAdminChanged and is used to iterate over the raw logs and unpacked data for RoleAdminChanged events raised by the ProtocolRegistry contract.
type ProtocolRegistryRoleAdminChangedIterator struct {
	Event *ProtocolRegistryRoleAdminChanged // 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
}
⋮----
Event *ProtocolRegistryRoleAdminChanged // Event containing the contract specifics and raw log
⋮----
// ProtocolRegistryRoleAdminChanged represents a RoleAdminChanged event raised by the ProtocolRegistry contract.
type ProtocolRegistryRoleAdminChanged struct {
	Role              [32]byte
	PreviousAdminRole [32]byte
	NewAdminRole      [32]byte
	Raw               types.Log // Blockchain specific contextual infos
}
⋮----
Raw               types.Log // Blockchain specific contextual infos
⋮----
// FilterRoleAdminChanged is a free log retrieval operation binding the contract event 0xbd79b86ffe0ab8e8776151514217cd7cacd52c909f66475c3af44e129f0b00ff.
⋮----
// Solidity: event RoleAdminChanged(bytes32 indexed role, bytes32 indexed previousAdminRole, bytes32 indexed newAdminRole)
func (_ProtocolRegistry *ProtocolRegistryFilterer) FilterRoleAdminChanged(opts *bind.FilterOpts, role [][32]byte, previousAdminRole [][32]byte, newAdminRole [][32]byte) (*ProtocolRegistryRoleAdminChangedIterator, error)
⋮----
var roleRule []interface{}
⋮----
var previousAdminRoleRule []interface{}
⋮----
var newAdminRoleRule []interface{}
⋮----
// WatchRoleAdminChanged is a free log subscription operation binding the contract event 0xbd79b86ffe0ab8e8776151514217cd7cacd52c909f66475c3af44e129f0b00ff.
⋮----
func (_ProtocolRegistry *ProtocolRegistryFilterer) WatchRoleAdminChanged(opts *bind.WatchOpts, sink chan<- *ProtocolRegistryRoleAdminChanged, role [][32]byte, previousAdminRole [][32]byte, newAdminRole [][32]byte) (event.Subscription, error)
⋮----
// ParseRoleAdminChanged is a log parse operation binding the contract event 0xbd79b86ffe0ab8e8776151514217cd7cacd52c909f66475c3af44e129f0b00ff.
⋮----
func (_ProtocolRegistry *ProtocolRegistryFilterer) ParseRoleAdminChanged(log types.Log) (*ProtocolRegistryRoleAdminChanged, error)
⋮----
// ProtocolRegistryRoleGrantedIterator is returned from FilterRoleGranted and is used to iterate over the raw logs and unpacked data for RoleGranted events raised by the ProtocolRegistry contract.
type ProtocolRegistryRoleGrantedIterator struct {
	Event *ProtocolRegistryRoleGranted // 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
}
⋮----
Event *ProtocolRegistryRoleGranted // Event containing the contract specifics and raw log
⋮----
// ProtocolRegistryRoleGranted represents a RoleGranted event raised by the ProtocolRegistry contract.
type ProtocolRegistryRoleGranted struct {
	Role    [32]byte
	Account common.Address
	Sender  common.Address
	Raw     types.Log // Blockchain specific contextual infos
}
⋮----
// FilterRoleGranted is a free log retrieval operation binding the contract event 0x2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d.
⋮----
// Solidity: event RoleGranted(bytes32 indexed role, address indexed account, address indexed sender)
func (_ProtocolRegistry *ProtocolRegistryFilterer) FilterRoleGranted(opts *bind.FilterOpts, role [][32]byte, account []common.Address, sender []common.Address) (*ProtocolRegistryRoleGrantedIterator, error)
⋮----
var accountRule []interface{}
⋮----
var senderRule []interface{}
⋮----
// WatchRoleGranted is a free log subscription operation binding the contract event 0x2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d.
⋮----
func (_ProtocolRegistry *ProtocolRegistryFilterer) WatchRoleGranted(opts *bind.WatchOpts, sink chan<- *ProtocolRegistryRoleGranted, role [][32]byte, account []common.Address, sender []common.Address) (event.Subscription, error)
⋮----
// ParseRoleGranted is a log parse operation binding the contract event 0x2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d.
⋮----
func (_ProtocolRegistry *ProtocolRegistryFilterer) ParseRoleGranted(log types.Log) (*ProtocolRegistryRoleGranted, error)
⋮----
// ProtocolRegistryRoleRevokedIterator is returned from FilterRoleRevoked and is used to iterate over the raw logs and unpacked data for RoleRevoked events raised by the ProtocolRegistry contract.
type ProtocolRegistryRoleRevokedIterator struct {
	Event *ProtocolRegistryRoleRevoked // 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
}
⋮----
Event *ProtocolRegistryRoleRevoked // Event containing the contract specifics and raw log
⋮----
// ProtocolRegistryRoleRevoked represents a RoleRevoked event raised by the ProtocolRegistry contract.
type ProtocolRegistryRoleRevoked struct {
	Role    [32]byte
	Account common.Address
	Sender  common.Address
	Raw     types.Log // Blockchain specific contextual infos
}
⋮----
// FilterRoleRevoked is a free log retrieval operation binding the contract event 0xf6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b.
⋮----
// Solidity: event RoleRevoked(bytes32 indexed role, address indexed account, address indexed sender)
func (_ProtocolRegistry *ProtocolRegistryFilterer) FilterRoleRevoked(opts *bind.FilterOpts, role [][32]byte, account []common.Address, sender []common.Address) (*ProtocolRegistryRoleRevokedIterator, error)
⋮----
// WatchRoleRevoked is a free log subscription operation binding the contract event 0xf6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b.
⋮----
func (_ProtocolRegistry *ProtocolRegistryFilterer) WatchRoleRevoked(opts *bind.WatchOpts, sink chan<- *ProtocolRegistryRoleRevoked, role [][32]byte, account []common.Address, sender []common.Address) (event.Subscription, error)
⋮----
// ParseRoleRevoked is a log parse operation binding the contract event 0xf6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b.
⋮----
func (_ProtocolRegistry *ProtocolRegistryFilterer) ParseRoleRevoked(log types.Log) (*ProtocolRegistryRoleRevoked, error)
⋮----
// ProtocolRegistrySemanticVersionUpdatedIterator is returned from FilterSemanticVersionUpdated and is used to iterate over the raw logs and unpacked data for SemanticVersionUpdated events raised by the ProtocolRegistry contract.
type ProtocolRegistrySemanticVersionUpdatedIterator struct {
	Event *ProtocolRegistrySemanticVersionUpdated // 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
}
⋮----
Event *ProtocolRegistrySemanticVersionUpdated // Event containing the contract specifics and raw log
⋮----
// ProtocolRegistrySemanticVersionUpdated represents a SemanticVersionUpdated event raised by the ProtocolRegistry contract.
type ProtocolRegistrySemanticVersionUpdated struct {
	PreviousSemanticVersion string
	SemanticVersion         string
	Raw                     types.Log // Blockchain specific contextual infos
}
⋮----
Raw                     types.Log // Blockchain specific contextual infos
⋮----
// FilterSemanticVersionUpdated is a free log retrieval operation binding the contract event 0x769656e5cb3218f54758f85bd184d41e987639374d6cb9e244439cc9d1abe1e2.
⋮----
// Solidity: event SemanticVersionUpdated(string previousSemanticVersion, string semanticVersion)
func (_ProtocolRegistry *ProtocolRegistryFilterer) FilterSemanticVersionUpdated(opts *bind.FilterOpts) (*ProtocolRegistrySemanticVersionUpdatedIterator, error)
⋮----
// WatchSemanticVersionUpdated is a free log subscription operation binding the contract event 0x769656e5cb3218f54758f85bd184d41e987639374d6cb9e244439cc9d1abe1e2.
⋮----
func (_ProtocolRegistry *ProtocolRegistryFilterer) WatchSemanticVersionUpdated(opts *bind.WatchOpts, sink chan<- *ProtocolRegistrySemanticVersionUpdated) (event.Subscription, error)
⋮----
// ParseSemanticVersionUpdated is a log parse operation binding the contract event 0x769656e5cb3218f54758f85bd184d41e987639374d6cb9e244439cc9d1abe1e2.
⋮----
func (_ProtocolRegistry *ProtocolRegistryFilterer) ParseSemanticVersionUpdated(log types.Log) (*ProtocolRegistrySemanticVersionUpdated, error)
````

## File: pkg/bindings/ProtocolRegistryStorage/binding.go
````go
// Code generated - DO NOT EDIT.
// This file is a generated binding and any manual changes will be lost.
⋮----
package ProtocolRegistryStorage
⋮----
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"
)
⋮----
"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
)
⋮----
// IProtocolRegistryTypesDeploymentConfig is an auto generated low-level Go binding around an user-defined struct.
type IProtocolRegistryTypesDeploymentConfig struct {
	Pausable   bool
	Deprecated bool
}
⋮----
// ProtocolRegistryStorageMetaData contains all meta data concerning the ProtocolRegistryStorage contract.
var ProtocolRegistryStorageMetaData = &bind.MetaData{
	ABI: "[{\"type\":\"function\",\"name\":\"PAUSER_ROLE\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"configure\",\"inputs\":[{\"name\":\"name\",\"type\":\"string\",\"internalType\":\"string\"},{\"name\":\"config\",\"type\":\"tuple\",\"internalType\":\"structIProtocolRegistryTypes.DeploymentConfig\",\"components\":[{\"name\":\"pausable\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"deprecated\",\"type\":\"bool\",\"internalType\":\"bool\"}]}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"getAddress\",\"inputs\":[{\"name\":\"name\",\"type\":\"string\",\"internalType\":\"string\"}],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getAllDeployments\",\"inputs\":[],\"outputs\":[{\"name\":\"names\",\"type\":\"string[]\",\"internalType\":\"string[]\"},{\"name\":\"addresses\",\"type\":\"address[]\",\"internalType\":\"address[]\"},{\"name\":\"configs\",\"type\":\"tuple[]\",\"internalType\":\"structIProtocolRegistryTypes.DeploymentConfig[]\",\"components\":[{\"name\":\"pausable\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"deprecated\",\"type\":\"bool\",\"internalType\":\"bool\"}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getDeployment\",\"inputs\":[{\"name\":\"name\",\"type\":\"string\",\"internalType\":\"string\"}],\"outputs\":[{\"name\":\"addr\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"config\",\"type\":\"tuple\",\"internalType\":\"structIProtocolRegistryTypes.DeploymentConfig\",\"components\":[{\"name\":\"pausable\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"deprecated\",\"type\":\"bool\",\"internalType\":\"bool\"}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"initialize\",\"inputs\":[{\"name\":\"initialAdmin\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"pauserMultisig\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"majorVersion\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"string\",\"internalType\":\"string\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"pauseAll\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"ship\",\"inputs\":[{\"name\":\"addresses\",\"type\":\"address[]\",\"internalType\":\"address[]\"},{\"name\":\"configs\",\"type\":\"tuple[]\",\"internalType\":\"structIProtocolRegistryTypes.DeploymentConfig[]\",\"components\":[{\"name\":\"pausable\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"deprecated\",\"type\":\"bool\",\"internalType\":\"bool\"}]},{\"name\":\"contractNames\",\"type\":\"string[]\",\"internalType\":\"string[]\"},{\"name\":\"semanticVersion\",\"type\":\"string\",\"internalType\":\"string\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"totalDeployments\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"version\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"string\",\"internalType\":\"string\"}],\"stateMutability\":\"view\"},{\"type\":\"event\",\"name\":\"DeploymentConfigDeleted\",\"inputs\":[{\"name\":\"addr\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"DeploymentConfigured\",\"inputs\":[{\"name\":\"addr\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"config\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structIProtocolRegistryTypes.DeploymentConfig\",\"components\":[{\"name\":\"pausable\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"deprecated\",\"type\":\"bool\",\"internalType\":\"bool\"}]}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"DeploymentShipped\",\"inputs\":[{\"name\":\"addr\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"config\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structIProtocolRegistryTypes.DeploymentConfig\",\"components\":[{\"name\":\"pausable\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"deprecated\",\"type\":\"bool\",\"internalType\":\"bool\"}]}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"SemanticVersionUpdated\",\"inputs\":[{\"name\":\"previousSemanticVersion\",\"type\":\"string\",\"indexed\":false,\"internalType\":\"string\"},{\"name\":\"semanticVersion\",\"type\":\"string\",\"indexed\":false,\"internalType\":\"string\"}],\"anonymous\":false},{\"type\":\"error\",\"name\":\"ArrayLengthMismatch\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"DeploymentNotShipped\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InputAddressZero\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InputNameEmpty\",\"inputs\":[]}]",
}
⋮----
// ProtocolRegistryStorageABI is the input ABI used to generate the binding from.
// Deprecated: Use ProtocolRegistryStorageMetaData.ABI instead.
var ProtocolRegistryStorageABI = ProtocolRegistryStorageMetaData.ABI
⋮----
// ProtocolRegistryStorage is an auto generated Go binding around an Ethereum contract.
type ProtocolRegistryStorage struct {
	ProtocolRegistryStorageCaller     // Read-only binding to the contract
	ProtocolRegistryStorageTransactor // Write-only binding to the contract
	ProtocolRegistryStorageFilterer   // Log filterer for contract events
}
⋮----
ProtocolRegistryStorageCaller     // Read-only binding to the contract
ProtocolRegistryStorageTransactor // Write-only binding to the contract
ProtocolRegistryStorageFilterer   // Log filterer for contract events
⋮----
// ProtocolRegistryStorageCaller is an auto generated read-only Go binding around an Ethereum contract.
type ProtocolRegistryStorageCaller struct {
	contract *bind.BoundContract // Generic contract wrapper for the low level calls
}
⋮----
contract *bind.BoundContract // Generic contract wrapper for the low level calls
⋮----
// ProtocolRegistryStorageTransactor is an auto generated write-only Go binding around an Ethereum contract.
type ProtocolRegistryStorageTransactor struct {
	contract *bind.BoundContract // Generic contract wrapper for the low level calls
}
⋮----
// ProtocolRegistryStorageFilterer is an auto generated log filtering Go binding around an Ethereum contract events.
type ProtocolRegistryStorageFilterer struct {
	contract *bind.BoundContract // Generic contract wrapper for the low level calls
}
⋮----
// ProtocolRegistryStorageSession is an auto generated Go binding around an Ethereum contract,
// with pre-set call and transact options.
type ProtocolRegistryStorageSession struct {
	Contract     *ProtocolRegistryStorage // 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
}
⋮----
Contract     *ProtocolRegistryStorage // 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
⋮----
// ProtocolRegistryStorageCallerSession is an auto generated read-only Go binding around an Ethereum contract,
// with pre-set call options.
type ProtocolRegistryStorageCallerSession struct {
	Contract *ProtocolRegistryStorageCaller // Generic contract caller binding to set the session for
	CallOpts bind.CallOpts                  // Call options to use throughout this session
}
⋮----
Contract *ProtocolRegistryStorageCaller // Generic contract caller binding to set the session for
CallOpts bind.CallOpts                  // Call options to use throughout this session
⋮----
// ProtocolRegistryStorageTransactorSession is an auto generated write-only Go binding around an Ethereum contract,
// with pre-set transact options.
type ProtocolRegistryStorageTransactorSession struct {
	Contract     *ProtocolRegistryStorageTransactor // Generic contract transactor binding to set the session for
	TransactOpts bind.TransactOpts                  // Transaction auth options to use throughout this session
}
⋮----
Contract     *ProtocolRegistryStorageTransactor // Generic contract transactor binding to set the session for
TransactOpts bind.TransactOpts                  // Transaction auth options to use throughout this session
⋮----
// ProtocolRegistryStorageRaw is an auto generated low-level Go binding around an Ethereum contract.
type ProtocolRegistryStorageRaw struct {
	Contract *ProtocolRegistryStorage // Generic contract binding to access the raw methods on
}
⋮----
Contract *ProtocolRegistryStorage // Generic contract binding to access the raw methods on
⋮----
// ProtocolRegistryStorageCallerRaw is an auto generated low-level read-only Go binding around an Ethereum contract.
type ProtocolRegistryStorageCallerRaw struct {
	Contract *ProtocolRegistryStorageCaller // Generic read-only contract binding to access the raw methods on
}
⋮----
Contract *ProtocolRegistryStorageCaller // Generic read-only contract binding to access the raw methods on
⋮----
// ProtocolRegistryStorageTransactorRaw is an auto generated low-level write-only Go binding around an Ethereum contract.
type ProtocolRegistryStorageTransactorRaw struct {
	Contract *ProtocolRegistryStorageTransactor // Generic write-only contract binding to access the raw methods on
}
⋮----
Contract *ProtocolRegistryStorageTransactor // Generic write-only contract binding to access the raw methods on
⋮----
// NewProtocolRegistryStorage creates a new instance of ProtocolRegistryStorage, bound to a specific deployed contract.
func NewProtocolRegistryStorage(address common.Address, backend bind.ContractBackend) (*ProtocolRegistryStorage, error)
⋮----
// NewProtocolRegistryStorageCaller creates a new read-only instance of ProtocolRegistryStorage, bound to a specific deployed contract.
func NewProtocolRegistryStorageCaller(address common.Address, caller bind.ContractCaller) (*ProtocolRegistryStorageCaller, error)
⋮----
// NewProtocolRegistryStorageTransactor creates a new write-only instance of ProtocolRegistryStorage, bound to a specific deployed contract.
func NewProtocolRegistryStorageTransactor(address common.Address, transactor bind.ContractTransactor) (*ProtocolRegistryStorageTransactor, error)
⋮----
// NewProtocolRegistryStorageFilterer creates a new log filterer instance of ProtocolRegistryStorage, bound to a specific deployed contract.
func NewProtocolRegistryStorageFilterer(address common.Address, filterer bind.ContractFilterer) (*ProtocolRegistryStorageFilterer, error)
⋮----
// bindProtocolRegistryStorage binds a generic wrapper to an already deployed contract.
func bindProtocolRegistryStorage(address common.Address, caller bind.ContractCaller, transactor bind.ContractTransactor, filterer bind.ContractFilterer) (*bind.BoundContract, error)
⋮----
// 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 (_ProtocolRegistryStorage *ProtocolRegistryStorageRaw) Call(opts *bind.CallOpts, result *[]interface
⋮----
// Transfer initiates a plain transaction to move funds to the contract, calling
// its default method if one is available.
func (_ProtocolRegistryStorage *ProtocolRegistryStorageRaw) Transfer(opts *bind.TransactOpts) (*types.Transaction, error)
⋮----
// Transact invokes the (paid) contract method with params as input values.
func (_ProtocolRegistryStorage *ProtocolRegistryStorageRaw) Transact(opts *bind.TransactOpts, method string, params ...interface
⋮----
// PAUSERROLE is a free data retrieval call binding the contract method 0xe63ab1e9.
//
// Solidity: function PAUSER_ROLE() view returns(bytes32)
func (_ProtocolRegistryStorage *ProtocolRegistryStorageCaller) PAUSERROLE(opts *bind.CallOpts) ([32]byte, error)
⋮----
var out []interface{}
⋮----
// GetAddress is a free data retrieval call binding the contract method 0xbf40fac1.
⋮----
// Solidity: function getAddress(string name) view returns(address)
func (_ProtocolRegistryStorage *ProtocolRegistryStorageCaller) GetAddress(opts *bind.CallOpts, name string) (common.Address, error)
⋮----
// GetAllDeployments is a free data retrieval call binding the contract method 0x8eec00b8.
⋮----
// Solidity: function getAllDeployments() view returns(string[] names, address[] addresses, (bool,bool)[] configs)
func (_ProtocolRegistryStorage *ProtocolRegistryStorageCaller) GetAllDeployments(opts *bind.CallOpts) (struct
⋮----
// GetDeployment is a free data retrieval call binding the contract method 0xa8091d97.
⋮----
// Solidity: function getDeployment(string name) view returns(address addr, (bool,bool) config)
func (_ProtocolRegistryStorage *ProtocolRegistryStorageCaller) GetDeployment(opts *bind.CallOpts, name string) (struct
⋮----
// MajorVersion is a free data retrieval call binding the contract method 0xaf05a5c5.
⋮----
// Solidity: function majorVersion() view returns(string)
func (_ProtocolRegistryStorage *ProtocolRegistryStorageCaller) MajorVersion(opts *bind.CallOpts) (string, error)
⋮----
// TotalDeployments is a free data retrieval call binding the contract method 0xfb35b4e4.
⋮----
// Solidity: function totalDeployments() view returns(uint256)
func (_ProtocolRegistryStorage *ProtocolRegistryStorageCaller) TotalDeployments(opts *bind.CallOpts) (*big.Int, error)
⋮----
// Version is a free data retrieval call binding the contract method 0x54fd4d50.
⋮----
// Solidity: function version() view returns(string)
func (_ProtocolRegistryStorage *ProtocolRegistryStorageCaller) Version(opts *bind.CallOpts) (string, error)
⋮----
// Configure is a paid mutator transaction binding the contract method 0x0b6cc4f9.
⋮----
// Solidity: function configure(string name, (bool,bool) config) returns()
func (_ProtocolRegistryStorage *ProtocolRegistryStorageTransactor) Configure(opts *bind.TransactOpts, name string, config IProtocolRegistryTypesDeploymentConfig) (*types.Transaction, error)
⋮----
// Initialize is a paid mutator transaction binding the contract method 0x485cc955.
⋮----
// Solidity: function initialize(address initialAdmin, address pauserMultisig) returns()
func (_ProtocolRegistryStorage *ProtocolRegistryStorageTransactor) Initialize(opts *bind.TransactOpts, initialAdmin common.Address, pauserMultisig common.Address) (*types.Transaction, error)
⋮----
// PauseAll is a paid mutator transaction binding the contract method 0x595c6a67.
⋮----
// Solidity: function pauseAll() returns()
func (_ProtocolRegistryStorage *ProtocolRegistryStorageTransactor) PauseAll(opts *bind.TransactOpts) (*types.Transaction, error)
⋮----
// Ship is a paid mutator transaction binding the contract method 0xfc434a8a.
⋮----
// Solidity: function ship(address[] addresses, (bool,bool)[] configs, string[] contractNames, string semanticVersion) returns()
func (_ProtocolRegistryStorage *ProtocolRegistryStorageTransactor) Ship(opts *bind.TransactOpts, addresses []common.Address, configs []IProtocolRegistryTypesDeploymentConfig, contractNames []string, semanticVersion string) (*types.Transaction, error)
⋮----
// ProtocolRegistryStorageDeploymentConfigDeletedIterator is returned from FilterDeploymentConfigDeleted and is used to iterate over the raw logs and unpacked data for DeploymentConfigDeleted events raised by the ProtocolRegistryStorage contract.
type ProtocolRegistryStorageDeploymentConfigDeletedIterator struct {
	Event *ProtocolRegistryStorageDeploymentConfigDeleted // 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
}
⋮----
Event *ProtocolRegistryStorageDeploymentConfigDeleted // 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 *ProtocolRegistryStorageDeploymentConfigDeletedIterator) Next() bool
⋮----
// If the iterator failed, stop iterating
⋮----
// If the iterator completed, deliver directly whatever's available
⋮----
// Iterator still in progress, wait for either a data or an error event
⋮----
// Error returns any retrieval or parsing error occurred during filtering.
func (it *ProtocolRegistryStorageDeploymentConfigDeletedIterator) Error() error
⋮----
// Close terminates the iteration process, releasing any pending underlying
// resources.
func (it *ProtocolRegistryStorageDeploymentConfigDeletedIterator) Close() error
⋮----
// ProtocolRegistryStorageDeploymentConfigDeleted represents a DeploymentConfigDeleted event raised by the ProtocolRegistryStorage contract.
type ProtocolRegistryStorageDeploymentConfigDeleted struct {
	Addr common.Address
	Raw  types.Log // Blockchain specific contextual infos
}
⋮----
Raw  types.Log // Blockchain specific contextual infos
⋮----
// FilterDeploymentConfigDeleted is a free log retrieval operation binding the contract event 0xa69cccaa8b056f2577aa7e06e1eb14ae0eb526356819b9403f5b31f41f3bc509.
⋮----
// Solidity: event DeploymentConfigDeleted(address indexed addr)
func (_ProtocolRegistryStorage *ProtocolRegistryStorageFilterer) FilterDeploymentConfigDeleted(opts *bind.FilterOpts, addr []common.Address) (*ProtocolRegistryStorageDeploymentConfigDeletedIterator, error)
⋮----
var addrRule []interface{}
⋮----
// WatchDeploymentConfigDeleted is a free log subscription operation binding the contract event 0xa69cccaa8b056f2577aa7e06e1eb14ae0eb526356819b9403f5b31f41f3bc509.
⋮----
func (_ProtocolRegistryStorage *ProtocolRegistryStorageFilterer) WatchDeploymentConfigDeleted(opts *bind.WatchOpts, sink chan<- *ProtocolRegistryStorageDeploymentConfigDeleted, addr []common.Address) (event.Subscription, error)
⋮----
// New log arrived, parse the event and forward to the user
⋮----
// ParseDeploymentConfigDeleted is a log parse operation binding the contract event 0xa69cccaa8b056f2577aa7e06e1eb14ae0eb526356819b9403f5b31f41f3bc509.
⋮----
func (_ProtocolRegistryStorage *ProtocolRegistryStorageFilterer) ParseDeploymentConfigDeleted(log types.Log) (*ProtocolRegistryStorageDeploymentConfigDeleted, error)
⋮----
// ProtocolRegistryStorageDeploymentConfiguredIterator is returned from FilterDeploymentConfigured and is used to iterate over the raw logs and unpacked data for DeploymentConfigured events raised by the ProtocolRegistryStorage contract.
type ProtocolRegistryStorageDeploymentConfiguredIterator struct {
	Event *ProtocolRegistryStorageDeploymentConfigured // 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
}
⋮----
Event *ProtocolRegistryStorageDeploymentConfigured // Event containing the contract specifics and raw log
⋮----
// ProtocolRegistryStorageDeploymentConfigured represents a DeploymentConfigured event raised by the ProtocolRegistryStorage contract.
type ProtocolRegistryStorageDeploymentConfigured struct {
	Addr   common.Address
	Config IProtocolRegistryTypesDeploymentConfig
	Raw    types.Log // Blockchain specific contextual infos
}
⋮----
Raw    types.Log // Blockchain specific contextual infos
⋮----
// FilterDeploymentConfigured is a free log retrieval operation binding the contract event 0x6c5879ec82f910f6d12844857cfb8eb474dcecc9aa5b8257c7a77dcb42990e9d.
⋮----
// Solidity: event DeploymentConfigured(address indexed addr, (bool,bool) config)
func (_ProtocolRegistryStorage *ProtocolRegistryStorageFilterer) FilterDeploymentConfigured(opts *bind.FilterOpts, addr []common.Address) (*ProtocolRegistryStorageDeploymentConfiguredIterator, error)
⋮----
// WatchDeploymentConfigured is a free log subscription operation binding the contract event 0x6c5879ec82f910f6d12844857cfb8eb474dcecc9aa5b8257c7a77dcb42990e9d.
⋮----
func (_ProtocolRegistryStorage *ProtocolRegistryStorageFilterer) WatchDeploymentConfigured(opts *bind.WatchOpts, sink chan<- *ProtocolRegistryStorageDeploymentConfigured, addr []common.Address) (event.Subscription, error)
⋮----
// ParseDeploymentConfigured is a log parse operation binding the contract event 0x6c5879ec82f910f6d12844857cfb8eb474dcecc9aa5b8257c7a77dcb42990e9d.
⋮----
func (_ProtocolRegistryStorage *ProtocolRegistryStorageFilterer) ParseDeploymentConfigured(log types.Log) (*ProtocolRegistryStorageDeploymentConfigured, error)
⋮----
// ProtocolRegistryStorageDeploymentShippedIterator is returned from FilterDeploymentShipped and is used to iterate over the raw logs and unpacked data for DeploymentShipped events raised by the ProtocolRegistryStorage contract.
type ProtocolRegistryStorageDeploymentShippedIterator struct {
	Event *ProtocolRegistryStorageDeploymentShipped // 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
}
⋮----
Event *ProtocolRegistryStorageDeploymentShipped // Event containing the contract specifics and raw log
⋮----
// ProtocolRegistryStorageDeploymentShipped represents a DeploymentShipped event raised by the ProtocolRegistryStorage contract.
type ProtocolRegistryStorageDeploymentShipped struct {
	Addr   common.Address
	Config IProtocolRegistryTypesDeploymentConfig
	Raw    types.Log // Blockchain specific contextual infos
}
⋮----
// FilterDeploymentShipped is a free log retrieval operation binding the contract event 0x4e81e5495dbc85919bf1b9c12a9a4bb6d546f75d3f92fa0a36867fc29a51467c.
⋮----
// Solidity: event DeploymentShipped(address indexed addr, (bool,bool) config)
func (_ProtocolRegistryStorage *ProtocolRegistryStorageFilterer) FilterDeploymentShipped(opts *bind.FilterOpts, addr []common.Address) (*ProtocolRegistryStorageDeploymentShippedIterator, error)
⋮----
// WatchDeploymentShipped is a free log subscription operation binding the contract event 0x4e81e5495dbc85919bf1b9c12a9a4bb6d546f75d3f92fa0a36867fc29a51467c.
⋮----
func (_ProtocolRegistryStorage *ProtocolRegistryStorageFilterer) WatchDeploymentShipped(opts *bind.WatchOpts, sink chan<- *ProtocolRegistryStorageDeploymentShipped, addr []common.Address) (event.Subscription, error)
⋮----
// ParseDeploymentShipped is a log parse operation binding the contract event 0x4e81e5495dbc85919bf1b9c12a9a4bb6d546f75d3f92fa0a36867fc29a51467c.
⋮----
func (_ProtocolRegistryStorage *ProtocolRegistryStorageFilterer) ParseDeploymentShipped(log types.Log) (*ProtocolRegistryStorageDeploymentShipped, error)
⋮----
// ProtocolRegistryStorageSemanticVersionUpdatedIterator is returned from FilterSemanticVersionUpdated and is used to iterate over the raw logs and unpacked data for SemanticVersionUpdated events raised by the ProtocolRegistryStorage contract.
type ProtocolRegistryStorageSemanticVersionUpdatedIterator struct {
	Event *ProtocolRegistryStorageSemanticVersionUpdated // 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
}
⋮----
Event *ProtocolRegistryStorageSemanticVersionUpdated // Event containing the contract specifics and raw log
⋮----
// ProtocolRegistryStorageSemanticVersionUpdated represents a SemanticVersionUpdated event raised by the ProtocolRegistryStorage contract.
type ProtocolRegistryStorageSemanticVersionUpdated struct {
	PreviousSemanticVersion string
	SemanticVersion         string
	Raw                     types.Log // Blockchain specific contextual infos
}
⋮----
Raw                     types.Log // Blockchain specific contextual infos
⋮----
// FilterSemanticVersionUpdated is a free log retrieval operation binding the contract event 0x769656e5cb3218f54758f85bd184d41e987639374d6cb9e244439cc9d1abe1e2.
⋮----
// Solidity: event SemanticVersionUpdated(string previousSemanticVersion, string semanticVersion)
func (_ProtocolRegistryStorage *ProtocolRegistryStorageFilterer) FilterSemanticVersionUpdated(opts *bind.FilterOpts) (*ProtocolRegistryStorageSemanticVersionUpdatedIterator, error)
⋮----
// WatchSemanticVersionUpdated is a free log subscription operation binding the contract event 0x769656e5cb3218f54758f85bd184d41e987639374d6cb9e244439cc9d1abe1e2.
⋮----
func (_ProtocolRegistryStorage *ProtocolRegistryStorageFilterer) WatchSemanticVersionUpdated(opts *bind.WatchOpts, sink chan<- *ProtocolRegistryStorageSemanticVersionUpdated) (event.Subscription, error)
⋮----
// ParseSemanticVersionUpdated is a log parse operation binding the contract event 0x769656e5cb3218f54758f85bd184d41e987639374d6cb9e244439cc9d1abe1e2.
⋮----
func (_ProtocolRegistryStorage *ProtocolRegistryStorageFilterer) ParseSemanticVersionUpdated(log types.Log) (*ProtocolRegistryStorageSemanticVersionUpdated, error)
````

## File: pkg/bindings/ReleaseManager/binding.go
````go
// Code generated - DO NOT EDIT.
// This file is a generated binding and any manual changes will be lost.
⋮----
package ReleaseManager
⋮----
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"
)
⋮----
"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
)
⋮----
// IReleaseManagerTypesArtifact is an auto generated low-level Go binding around an user-defined struct.
type IReleaseManagerTypesArtifact struct {
	Digest   [32]byte
	Registry string
}
⋮----
// IReleaseManagerTypesRelease is an auto generated low-level Go binding around an user-defined struct.
type IReleaseManagerTypesRelease struct {
	Artifacts     []IReleaseManagerTypesArtifact
	UpgradeByTime uint32
}
⋮----
// OperatorSet is an auto generated low-level Go binding around an user-defined struct.
type OperatorSet struct {
	Avs common.Address
	Id  uint32
}
⋮----
// ReleaseManagerMetaData contains all meta data concerning the ReleaseManager contract.
var ReleaseManagerMetaData = &bind.MetaData{
	ABI: "[{\"type\":\"constructor\",\"inputs\":[{\"name\":\"_permissionController\",\"type\":\"address\",\"internalType\":\"contractIPermissionController\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"getLatestRelease\",\"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\"},{\"name\":\"\",\"type\":\"tuple\",\"internalType\":\"structIReleaseManagerTypes.Release\",\"components\":[{\"name\":\"artifacts\",\"type\":\"tuple[]\",\"internalType\":\"structIReleaseManagerTypes.Artifact[]\",\"components\":[{\"name\":\"digest\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"registry\",\"type\":\"string\",\"internalType\":\"string\"}]},{\"name\":\"upgradeByTime\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getLatestUpgradeByTime\",\"inputs\":[{\"name\":\"operatorSet\",\"type\":\"tuple\",\"internalType\":\"structOperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]}],\"outputs\":[{\"name\":\"\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getMetadataURI\",\"inputs\":[{\"name\":\"operatorSet\",\"type\":\"tuple\",\"internalType\":\"structOperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]}],\"outputs\":[{\"name\":\"\",\"type\":\"string\",\"internalType\":\"string\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getRelease\",\"inputs\":[{\"name\":\"operatorSet\",\"type\":\"tuple\",\"internalType\":\"structOperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]},{\"name\":\"releaseId\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"tuple\",\"internalType\":\"structIReleaseManagerTypes.Release\",\"components\":[{\"name\":\"artifacts\",\"type\":\"tuple[]\",\"internalType\":\"structIReleaseManagerTypes.Artifact[]\",\"components\":[{\"name\":\"digest\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"registry\",\"type\":\"string\",\"internalType\":\"string\"}]},{\"name\":\"upgradeByTime\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getTotalReleases\",\"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\":\"isValidRelease\",\"inputs\":[{\"name\":\"operatorSet\",\"type\":\"tuple\",\"internalType\":\"structOperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]},{\"name\":\"releaseId\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"permissionController\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIPermissionController\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"publishMetadataURI\",\"inputs\":[{\"name\":\"operatorSet\",\"type\":\"tuple\",\"internalType\":\"structOperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]},{\"name\":\"metadataURI\",\"type\":\"string\",\"internalType\":\"string\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"publishRelease\",\"inputs\":[{\"name\":\"operatorSet\",\"type\":\"tuple\",\"internalType\":\"structOperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]},{\"name\":\"release\",\"type\":\"tuple\",\"internalType\":\"structIReleaseManagerTypes.Release\",\"components\":[{\"name\":\"artifacts\",\"type\":\"tuple[]\",\"internalType\":\"structIReleaseManagerTypes.Artifact[]\",\"components\":[{\"name\":\"digest\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"registry\",\"type\":\"string\",\"internalType\":\"string\"}]},{\"name\":\"upgradeByTime\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]}],\"outputs\":[{\"name\":\"releaseId\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"event\",\"name\":\"Initialized\",\"inputs\":[{\"name\":\"version\",\"type\":\"uint8\",\"indexed\":false,\"internalType\":\"uint8\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"MetadataURIPublished\",\"inputs\":[{\"name\":\"operatorSet\",\"type\":\"tuple\",\"indexed\":true,\"internalType\":\"structOperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]},{\"name\":\"metadataURI\",\"type\":\"string\",\"indexed\":false,\"internalType\":\"string\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ReleasePublished\",\"inputs\":[{\"name\":\"operatorSet\",\"type\":\"tuple\",\"indexed\":true,\"internalType\":\"structOperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]},{\"name\":\"releaseId\",\"type\":\"uint256\",\"indexed\":true,\"internalType\":\"uint256\"},{\"name\":\"release\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structIReleaseManagerTypes.Release\",\"components\":[{\"name\":\"artifacts\",\"type\":\"tuple[]\",\"internalType\":\"structIReleaseManagerTypes.Artifact[]\",\"components\":[{\"name\":\"digest\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"registry\",\"type\":\"string\",\"internalType\":\"string\"}]},{\"name\":\"upgradeByTime\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]}],\"anonymous\":false},{\"type\":\"error\",\"name\":\"InvalidMetadataURI\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidPermissions\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidUpgradeByTime\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"MustPublishMetadataURI\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"NoReleases\",\"inputs\":[]}]",
	Bin: "0x60a060405234801561000f575f5ffd5b5060405161146238038061146283398101604081905261002e91610105565b6001600160a01b038116608052610043610049565b50610132565b5f54610100900460ff16156100b45760405162461bcd60e51b815260206004820152602760248201527f496e697469616c697a61626c653a20636f6e747261637420697320696e697469604482015266616c697a696e6760c81b606482015260840160405180910390fd5b5f5460ff90811614610103575f805460ff191660ff9081179091556040519081527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b565b5f60208284031215610115575f5ffd5b81516001600160a01b038116811461012b575f5ffd5b9392505050565b6080516113126101505f395f818160c2015261095a01526113125ff3fe608060405234801561000f575f5ffd5b5060043610610090575f3560e01c806366f409f71161006357806366f409f7146101345780637c09ea8214610155578063a9e0ed6814610168578063b053b56d14610190578063d30eeb88146101b0575f5ffd5b80633acab5fc146100945780634657e26a146100bd5780634840a67c146100fc578063517e406814610111575b5f5ffd5b6100a76100a2366004610a6f565b6101d1565b6040516100b49190610b5b565b60405180910390f35b6100e47f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b0390911681526020016100b4565b61010f61010a366004610b8a565b610335565b005b61012461011f366004610a6f565b6103f8565b60405190151581526020016100b4565b610147610142366004610c09565b61043a565b6040519081526020016100b4565b610147610163366004610c23565b61045d565b61017b610176366004610c09565b6105b9565b60405163ffffffff90911681526020016100b4565b6101a361019e366004610c09565b61063f565b6040516100b49190610c6f565b6101c36101be366004610c09565b6106e8565b6040516100b4929190610c81565b60408051808201909152606081525f602082015260015f6101f185610890565b81526020019081526020015f20828154811061020f5761020f610ca1565b905f5260205f2090600202016040518060400160405290815f8201805480602002602001604051908101604052809291908181526020015f905b82821015610312578382905f5260205f2090600202016040518060400160405290815f820154815260200160018201805461028390610cb5565b80601f01602080910402602001604051908101604052809291908181526020018280546102af90610cb5565b80156102fa5780601f106102d1576101008083540402835291602001916102fa565b820191905f5260205f20905b8154815290600101906020018083116102dd57829003601f168201915b50505050508152505081526020019060010190610249565b505050908252506001919091015463ffffffff1660209091015290505b92915050565b6103426020840184610ce7565b61034b816108f3565b5f82900361036c57604051630eec403f60e41b815260040160405180910390fd5b828260025f610388610383368a90038a018a610c09565b610890565b81526020019081526020015f2091826103a2929190610d57565b50836040516103b19190610e11565b60405180910390207f209e95fbe8dd14c5e1fbf791ee0a83234f45f20cb85504c7068d5ca0d622458884846040516103ea929190610e70565b60405180910390a250505050565b5f5f6104038461043a565b90505f811161042557604051637a31a0a160e11b815260040160405180910390fd5b610430600182610e97565b9092149392505050565b5f60015f61044784610890565b815260208101919091526040015f205492915050565b5f61046b6020840184610ce7565b610474816108f3565b5f60018161048a61038336899003890189610c09565b81526020019081526020015f20905060025f6104b0878036038101906103839190610c09565b81526020019081526020015f2080546104c890610cb5565b90505f036104e95760405163413e6e5760e11b815260040160405180910390fd5b6104f96040850160208601610eaa565b63ffffffff1615806105205750426105176040860160208701610eaa565b63ffffffff1610155b61053d5760405163325ec75f60e01b815260040160405180910390fd5b80546001810182555f82815260209020909350849060028502016105618282610fe8565b505082856040516105729190610e11565b60405180910390207f2decd15222f7c4a8c3d4d2e14dcfdc5a0b52eb2d4b81796bfd010ee5cd972fd3866040516105a99190611173565b60405180910390a3505092915050565b5f5f60015f6105c785610890565b81526020019081526020015f2090505f8180549050116105fa57604051637a31a0a160e11b815260040160405180910390fd5b80545f9061060a90600190610e97565b905081818154811061061e5761061e610ca1565b5f91825260209091206001600290920201015463ffffffff16949350505050565b606060025f61064d84610890565b81526020019081526020015f20805461066590610cb5565b80601f016020809104026020016040519081016040528092919081815260200182805461069190610cb5565b80156106dc5780601f106106b3576101008083540402835291602001916106dc565b820191905f5260205f20905b8154815290600101906020018083116106bf57829003601f168201915b50505050509050919050565b60408051808201909152606081525f60208201819052905f60015f61070c86610890565b81526020019081526020015f2090505f81805490501161073f57604051637a31a0a160e11b815260040160405180910390fd5b80545f9061074f90600190610e97565b90508082828154811061076457610764610ca1565b905f5260205f209060020201806040518060400160405290815f8201805480602002602001604051908101604052809291908181526020015f905b82821015610868578382905f5260205f2090600202016040518060400160405290815f82015481526020016001820180546107d990610cb5565b80601f016020809104026020016040519081016040528092919081815260200182805461080590610cb5565b80156108505780601f1061082757610100808354040283529160200191610850565b820191905f5260205f20905b81548152906001019060200180831161083357829003601f168201915b5050505050815250508152602001906001019061079f565b505050908252506001919091015463ffffffff16602090910152919791965090945050505050565b5f815f0151826020015163ffffffff166040516020016108db92919060609290921b6bffffffffffffffffffffffff1916825260a01b6001600160a01b031916601482015260200190565b60405160208183030381529060405261032f9061129a565b6108fc8161091c565b6109195760405163932d94f760e01b815260040160405180910390fd5b50565b604051631beb2b9760e31b81526001600160a01b0382811660048301523360248301523060448301525f80356001600160e01b0319166064840152917f00000000000000000000000000000000000000000000000000000000000000009091169063df595cb890608401602060405180830381865afa1580156109a1573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061032f91906112bd565b634e487b7160e01b5f52604160045260245ffd5b80356001600160a01b03811681146109ef575f5ffd5b919050565b63ffffffff81168114610919575f5ffd5b80356109ef816109f4565b5f60408284031215610a20575f5ffd5b6040516040810181811067ffffffffffffffff82111715610a4357610a436109c5565b604052905080610a52836109d9565b81526020830135610a62816109f4565b6020919091015292915050565b5f5f60608385031215610a80575f5ffd5b610a8a8484610a10565b946040939093013593505050565b5f81518084528060208401602086015e5f602082860101526020601f19601f83011685010191505092915050565b5f6040830182516040855281815180845260608701915060608160051b88010193506020830192505f5b81811015610b3857605f198886030183528351805186526020810151905060406020870152610b226040870182610a98565b9550506020938401939290920191600101610af0565b505050506020830151610b53602086018263ffffffff169052565b509392505050565b602081525f610b6d6020830184610ac6565b9392505050565b5f60408284031215610b84575f5ffd5b50919050565b5f5f5f60608486031215610b9c575f5ffd5b610ba68585610b74565b9250604084013567ffffffffffffffff811115610bc1575f5ffd5b8401601f81018613610bd1575f5ffd5b803567ffffffffffffffff811115610be7575f5ffd5b866020828401011115610bf8575f5ffd5b939660209190910195509293505050565b5f60408284031215610c19575f5ffd5b610b6d8383610a10565b5f5f60608385031215610c34575f5ffd5b610c3e8484610b74565b9150604083013567ffffffffffffffff811115610c59575f5ffd5b610c6585828601610b74565b9150509250929050565b602081525f610b6d6020830184610a98565b828152604060208201525f610c996040830184610ac6565b949350505050565b634e487b7160e01b5f52603260045260245ffd5b600181811c90821680610cc957607f821691505b602082108103610b8457634e487b7160e01b5f52602260045260245ffd5b5f60208284031215610cf7575f5ffd5b610b6d826109d9565b5b81811015610d14575f8155600101610d01565b5050565b601f821115610d5257805f5260205f20601f840160051c81016020851015610d3d5750805b610d4f601f850160051c830182610d00565b50505b505050565b67ffffffffffffffff831115610d6f57610d6f6109c5565b610d8383610d7d8354610cb5565b83610d18565b5f601f841160018114610db4575f8515610d9d5750838201355b5f19600387901b1c1916600186901b178355610d4f565b5f83815260208120601f198716915b82811015610de35786850135825560209485019460019092019101610dc3565b5086821015610dff575f1960f88860031b161c19848701351681555b505060018560011b0183555050505050565b6001600160a01b03610e22836109d9565b1681525f6020830135610e34816109f4565b63ffffffff16602083015250604001919050565b81835281816020850137505f828201602090810191909152601f909101601f19169091010190565b602081525f610c99602083018486610e48565b634e487b7160e01b5f52601160045260245ffd5b8181038181111561032f5761032f610e83565b5f60208284031215610eba575f5ffd5b8135610b6d816109f4565b5f8235603e19833603018112610ed9575f5ffd5b9190910192915050565b81358155600181016020830135601e19843603018112610f01575f5ffd5b8301803567ffffffffffffffff81118015610f1a575f5ffd5b813603602084011315610f2b575f5ffd5b5f905050610f4381610f3d8554610cb5565b85610d18565b5f601f821160018114610f77575f8315610f605750838201602001355b5f19600385901b1c1916600184901b178555610fd3565b5f85815260208120601f198516915b82811015610fa857602085880181013583559485019460019092019101610f86565b5084821015610fc7575f1960f88660031b161c19602085880101351681555b505060018360011b0185555b50505050505050565b5f813561032f816109f4565b8135601e19833603018112610ffb575f5ffd5b8201803567ffffffffffffffff811115611013575f5ffd5b6020820191508060051b360382131561102a575f5ffd5b68010000000000000000811115611043576110436109c5565b825481845580821015611107576001600160ff1b038116811461106857611068610e83565b6001600160ff1b038216821461108057611080610e83565b835f5260205f208160011b81018360011b820191505b80821015611104575f82556001820180546110b090610cb5565b80156110f757601f8111600181146110ca575f83556110f5565b5f838152602090206110e7601f840160051c820160018301610d00565b505f83815260208120818555555b505b5050600282019150611096565b50505b505f8381526020812083915b838110156111445761112e6111288487610ec5565b83610ee3565b6020929092019160029190910190600101611113565b5050505050610d1461115860208401610fdc565b6001830163ffffffff821663ffffffff198254161781555050565b602081525f606082018335601e1985360301811261118f575f5ffd5b840180356020820167ffffffffffffffff8211156111ab575f5ffd5b8160051b8036038213156111bd575f5ffd5b604060208801529382905260809386018401935f908701605e1936869003015b8483101561127757888703607f1901825283358181126111fb575f5ffd5b860160208101358852604081013536829003603e1901811261121b575f5ffd5b0160408101906020013567ffffffffffffffff811115611239575f5ffd5b803603821315611247575f5ffd5b604060208a015261125c60408a018284610e48565b985050506020840193506020820191506001830192506111dd565b50505050505061128960208501610a05565b63ffffffff81166040850152610b53565b80516020808301519190811015610b84575f1960209190910360031b1b16919050565b5f602082840312156112cd575f5ffd5b81518015158114610b6d575f5ffdfea264697066735822122005612e05e63b4f904e703ae970fa68ac728005f1ec5704420bf10d481e10d8da64736f6c634300081e0033",
}
⋮----
// ReleaseManagerABI is the input ABI used to generate the binding from.
// Deprecated: Use ReleaseManagerMetaData.ABI instead.
var ReleaseManagerABI = ReleaseManagerMetaData.ABI
⋮----
// ReleaseManagerBin is the compiled bytecode used for deploying new contracts.
// Deprecated: Use ReleaseManagerMetaData.Bin instead.
var ReleaseManagerBin = ReleaseManagerMetaData.Bin
⋮----
// DeployReleaseManager deploys a new Ethereum contract, binding an instance of ReleaseManager to it.
func DeployReleaseManager(auth *bind.TransactOpts, backend bind.ContractBackend, _permissionController common.Address) (common.Address, *types.Transaction, *ReleaseManager, error)
⋮----
// ReleaseManager is an auto generated Go binding around an Ethereum contract.
type ReleaseManager struct {
	ReleaseManagerCaller     // Read-only binding to the contract
	ReleaseManagerTransactor // Write-only binding to the contract
	ReleaseManagerFilterer   // Log filterer for contract events
}
⋮----
ReleaseManagerCaller     // Read-only binding to the contract
ReleaseManagerTransactor // Write-only binding to the contract
ReleaseManagerFilterer   // Log filterer for contract events
⋮----
// ReleaseManagerCaller is an auto generated read-only Go binding around an Ethereum contract.
type ReleaseManagerCaller struct {
	contract *bind.BoundContract // Generic contract wrapper for the low level calls
}
⋮----
contract *bind.BoundContract // Generic contract wrapper for the low level calls
⋮----
// ReleaseManagerTransactor is an auto generated write-only Go binding around an Ethereum contract.
type ReleaseManagerTransactor struct {
	contract *bind.BoundContract // Generic contract wrapper for the low level calls
}
⋮----
// ReleaseManagerFilterer is an auto generated log filtering Go binding around an Ethereum contract events.
type ReleaseManagerFilterer struct {
	contract *bind.BoundContract // Generic contract wrapper for the low level calls
}
⋮----
// ReleaseManagerSession is an auto generated Go binding around an Ethereum contract,
// with pre-set call and transact options.
type ReleaseManagerSession struct {
	Contract     *ReleaseManager   // 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
}
⋮----
Contract     *ReleaseManager   // 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
⋮----
// ReleaseManagerCallerSession is an auto generated read-only Go binding around an Ethereum contract,
// with pre-set call options.
type ReleaseManagerCallerSession struct {
	Contract *ReleaseManagerCaller // Generic contract caller binding to set the session for
	CallOpts bind.CallOpts         // Call options to use throughout this session
}
⋮----
Contract *ReleaseManagerCaller // Generic contract caller binding to set the session for
CallOpts bind.CallOpts         // Call options to use throughout this session
⋮----
// ReleaseManagerTransactorSession is an auto generated write-only Go binding around an Ethereum contract,
// with pre-set transact options.
type ReleaseManagerTransactorSession struct {
	Contract     *ReleaseManagerTransactor // Generic contract transactor binding to set the session for
	TransactOpts bind.TransactOpts         // Transaction auth options to use throughout this session
}
⋮----
Contract     *ReleaseManagerTransactor // Generic contract transactor binding to set the session for
TransactOpts bind.TransactOpts         // Transaction auth options to use throughout this session
⋮----
// ReleaseManagerRaw is an auto generated low-level Go binding around an Ethereum contract.
type ReleaseManagerRaw struct {
	Contract *ReleaseManager // Generic contract binding to access the raw methods on
}
⋮----
Contract *ReleaseManager // Generic contract binding to access the raw methods on
⋮----
// ReleaseManagerCallerRaw is an auto generated low-level read-only Go binding around an Ethereum contract.
type ReleaseManagerCallerRaw struct {
	Contract *ReleaseManagerCaller // Generic read-only contract binding to access the raw methods on
}
⋮----
Contract *ReleaseManagerCaller // Generic read-only contract binding to access the raw methods on
⋮----
// ReleaseManagerTransactorRaw is an auto generated low-level write-only Go binding around an Ethereum contract.
type ReleaseManagerTransactorRaw struct {
	Contract *ReleaseManagerTransactor // Generic write-only contract binding to access the raw methods on
}
⋮----
Contract *ReleaseManagerTransactor // Generic write-only contract binding to access the raw methods on
⋮----
// NewReleaseManager creates a new instance of ReleaseManager, bound to a specific deployed contract.
func NewReleaseManager(address common.Address, backend bind.ContractBackend) (*ReleaseManager, error)
⋮----
// NewReleaseManagerCaller creates a new read-only instance of ReleaseManager, bound to a specific deployed contract.
func NewReleaseManagerCaller(address common.Address, caller bind.ContractCaller) (*ReleaseManagerCaller, error)
⋮----
// NewReleaseManagerTransactor creates a new write-only instance of ReleaseManager, bound to a specific deployed contract.
func NewReleaseManagerTransactor(address common.Address, transactor bind.ContractTransactor) (*ReleaseManagerTransactor, error)
⋮----
// NewReleaseManagerFilterer creates a new log filterer instance of ReleaseManager, bound to a specific deployed contract.
func NewReleaseManagerFilterer(address common.Address, filterer bind.ContractFilterer) (*ReleaseManagerFilterer, error)
⋮----
// bindReleaseManager binds a generic wrapper to an already deployed contract.
func bindReleaseManager(address common.Address, caller bind.ContractCaller, transactor bind.ContractTransactor, filterer bind.ContractFilterer) (*bind.BoundContract, error)
⋮----
// 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 (_ReleaseManager *ReleaseManagerRaw) Call(opts *bind.CallOpts, result *[]interface
⋮----
// Transfer initiates a plain transaction to move funds to the contract, calling
// its default method if one is available.
func (_ReleaseManager *ReleaseManagerRaw) Transfer(opts *bind.TransactOpts) (*types.Transaction, error)
⋮----
// Transact invokes the (paid) contract method with params as input values.
func (_ReleaseManager *ReleaseManagerRaw) Transact(opts *bind.TransactOpts, method string, params ...interface
⋮----
// GetLatestRelease is a free data retrieval call binding the contract method 0xd30eeb88.
//
// Solidity: function getLatestRelease((address,uint32) operatorSet) view returns(uint256, ((bytes32,string)[],uint32))
func (_ReleaseManager *ReleaseManagerCaller) GetLatestRelease(opts *bind.CallOpts, operatorSet OperatorSet) (*big.Int, IReleaseManagerTypesRelease, error)
⋮----
var out []interface{}
⋮----
// GetLatestUpgradeByTime is a free data retrieval call binding the contract method 0xa9e0ed68.
⋮----
// Solidity: function getLatestUpgradeByTime((address,uint32) operatorSet) view returns(uint32)
func (_ReleaseManager *ReleaseManagerCaller) GetLatestUpgradeByTime(opts *bind.CallOpts, operatorSet OperatorSet) (uint32, error)
⋮----
// GetMetadataURI is a free data retrieval call binding the contract method 0xb053b56d.
⋮----
// Solidity: function getMetadataURI((address,uint32) operatorSet) view returns(string)
func (_ReleaseManager *ReleaseManagerCaller) GetMetadataURI(opts *bind.CallOpts, operatorSet OperatorSet) (string, error)
⋮----
// GetRelease is a free data retrieval call binding the contract method 0x3acab5fc.
⋮----
// Solidity: function getRelease((address,uint32) operatorSet, uint256 releaseId) view returns(((bytes32,string)[],uint32))
func (_ReleaseManager *ReleaseManagerCaller) GetRelease(opts *bind.CallOpts, operatorSet OperatorSet, releaseId *big.Int) (IReleaseManagerTypesRelease, error)
⋮----
// GetTotalReleases is a free data retrieval call binding the contract method 0x66f409f7.
⋮----
// Solidity: function getTotalReleases((address,uint32) operatorSet) view returns(uint256)
func (_ReleaseManager *ReleaseManagerCaller) GetTotalReleases(opts *bind.CallOpts, operatorSet OperatorSet) (*big.Int, error)
⋮----
// IsValidRelease is a free data retrieval call binding the contract method 0x517e4068.
⋮----
// Solidity: function isValidRelease((address,uint32) operatorSet, uint256 releaseId) view returns(bool)
func (_ReleaseManager *ReleaseManagerCaller) IsValidRelease(opts *bind.CallOpts, operatorSet OperatorSet, releaseId *big.Int) (bool, error)
⋮----
// PermissionController is a free data retrieval call binding the contract method 0x4657e26a.
⋮----
// Solidity: function permissionController() view returns(address)
func (_ReleaseManager *ReleaseManagerCaller) PermissionController(opts *bind.CallOpts) (common.Address, error)
⋮----
// PublishMetadataURI is a paid mutator transaction binding the contract method 0x4840a67c.
⋮----
// Solidity: function publishMetadataURI((address,uint32) operatorSet, string metadataURI) returns()
func (_ReleaseManager *ReleaseManagerTransactor) PublishMetadataURI(opts *bind.TransactOpts, operatorSet OperatorSet, metadataURI string) (*types.Transaction, error)
⋮----
// PublishRelease is a paid mutator transaction binding the contract method 0x7c09ea82.
⋮----
// Solidity: function publishRelease((address,uint32) operatorSet, ((bytes32,string)[],uint32) release) returns(uint256 releaseId)
func (_ReleaseManager *ReleaseManagerTransactor) PublishRelease(opts *bind.TransactOpts, operatorSet OperatorSet, release IReleaseManagerTypesRelease) (*types.Transaction, error)
⋮----
// ReleaseManagerInitializedIterator is returned from FilterInitialized and is used to iterate over the raw logs and unpacked data for Initialized events raised by the ReleaseManager contract.
type ReleaseManagerInitializedIterator struct {
	Event *ReleaseManagerInitialized // 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
}
⋮----
Event *ReleaseManagerInitialized // 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 *ReleaseManagerInitializedIterator) Next() bool
⋮----
// If the iterator failed, stop iterating
⋮----
// If the iterator completed, deliver directly whatever's available
⋮----
// Iterator still in progress, wait for either a data or an error event
⋮----
// Error returns any retrieval or parsing error occurred during filtering.
func (it *ReleaseManagerInitializedIterator) Error() error
⋮----
// Close terminates the iteration process, releasing any pending underlying
// resources.
func (it *ReleaseManagerInitializedIterator) Close() error
⋮----
// ReleaseManagerInitialized represents a Initialized event raised by the ReleaseManager contract.
type ReleaseManagerInitialized struct {
	Version uint8
	Raw     types.Log // Blockchain specific contextual infos
}
⋮----
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 (_ReleaseManager *ReleaseManagerFilterer) FilterInitialized(opts *bind.FilterOpts) (*ReleaseManagerInitializedIterator, error)
⋮----
// WatchInitialized is a free log subscription operation binding the contract event 0x7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb3847402498.
⋮----
func (_ReleaseManager *ReleaseManagerFilterer) WatchInitialized(opts *bind.WatchOpts, sink chan<- *ReleaseManagerInitialized) (event.Subscription, error)
⋮----
// New log arrived, parse the event and forward to the user
⋮----
// ParseInitialized is a log parse operation binding the contract event 0x7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb3847402498.
⋮----
func (_ReleaseManager *ReleaseManagerFilterer) ParseInitialized(log types.Log) (*ReleaseManagerInitialized, error)
⋮----
// ReleaseManagerMetadataURIPublishedIterator is returned from FilterMetadataURIPublished and is used to iterate over the raw logs and unpacked data for MetadataURIPublished events raised by the ReleaseManager contract.
type ReleaseManagerMetadataURIPublishedIterator struct {
	Event *ReleaseManagerMetadataURIPublished // 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
}
⋮----
Event *ReleaseManagerMetadataURIPublished // Event containing the contract specifics and raw log
⋮----
// ReleaseManagerMetadataURIPublished represents a MetadataURIPublished event raised by the ReleaseManager contract.
type ReleaseManagerMetadataURIPublished struct {
	OperatorSet OperatorSet
	MetadataURI string
	Raw         types.Log // Blockchain specific contextual infos
}
⋮----
Raw         types.Log // Blockchain specific contextual infos
⋮----
// FilterMetadataURIPublished is a free log retrieval operation binding the contract event 0x209e95fbe8dd14c5e1fbf791ee0a83234f45f20cb85504c7068d5ca0d6224588.
⋮----
// Solidity: event MetadataURIPublished((address,uint32) indexed operatorSet, string metadataURI)
func (_ReleaseManager *ReleaseManagerFilterer) FilterMetadataURIPublished(opts *bind.FilterOpts, operatorSet []OperatorSet) (*ReleaseManagerMetadataURIPublishedIterator, error)
⋮----
var operatorSetRule []interface{}
⋮----
// WatchMetadataURIPublished is a free log subscription operation binding the contract event 0x209e95fbe8dd14c5e1fbf791ee0a83234f45f20cb85504c7068d5ca0d6224588.
⋮----
func (_ReleaseManager *ReleaseManagerFilterer) WatchMetadataURIPublished(opts *bind.WatchOpts, sink chan<- *ReleaseManagerMetadataURIPublished, operatorSet []OperatorSet) (event.Subscription, error)
⋮----
// ParseMetadataURIPublished is a log parse operation binding the contract event 0x209e95fbe8dd14c5e1fbf791ee0a83234f45f20cb85504c7068d5ca0d6224588.
⋮----
func (_ReleaseManager *ReleaseManagerFilterer) ParseMetadataURIPublished(log types.Log) (*ReleaseManagerMetadataURIPublished, error)
⋮----
// ReleaseManagerReleasePublishedIterator is returned from FilterReleasePublished and is used to iterate over the raw logs and unpacked data for ReleasePublished events raised by the ReleaseManager contract.
type ReleaseManagerReleasePublishedIterator struct {
	Event *ReleaseManagerReleasePublished // 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
}
⋮----
Event *ReleaseManagerReleasePublished // Event containing the contract specifics and raw log
⋮----
// ReleaseManagerReleasePublished represents a ReleasePublished event raised by the ReleaseManager contract.
type ReleaseManagerReleasePublished struct {
	OperatorSet OperatorSet
	ReleaseId   *big.Int
	Release     IReleaseManagerTypesRelease
	Raw         types.Log // Blockchain specific contextual infos
}
⋮----
// FilterReleasePublished is a free log retrieval operation binding the contract event 0x2decd15222f7c4a8c3d4d2e14dcfdc5a0b52eb2d4b81796bfd010ee5cd972fd3.
⋮----
// Solidity: event ReleasePublished((address,uint32) indexed operatorSet, uint256 indexed releaseId, ((bytes32,string)[],uint32) release)
func (_ReleaseManager *ReleaseManagerFilterer) FilterReleasePublished(opts *bind.FilterOpts, operatorSet []OperatorSet, releaseId []*big.Int) (*ReleaseManagerReleasePublishedIterator, error)
⋮----
var releaseIdRule []interface{}
⋮----
// WatchReleasePublished is a free log subscription operation binding the contract event 0x2decd15222f7c4a8c3d4d2e14dcfdc5a0b52eb2d4b81796bfd010ee5cd972fd3.
⋮----
func (_ReleaseManager *ReleaseManagerFilterer) WatchReleasePublished(opts *bind.WatchOpts, sink chan<- *ReleaseManagerReleasePublished, operatorSet []OperatorSet, releaseId []*big.Int) (event.Subscription, error)
⋮----
// ParseReleasePublished is a log parse operation binding the contract event 0x2decd15222f7c4a8c3d4d2e14dcfdc5a0b52eb2d4b81796bfd010ee5cd972fd3.
⋮----
func (_ReleaseManager *ReleaseManagerFilterer) ParseReleasePublished(log types.Log) (*ReleaseManagerReleasePublished, error)
````

## File: pkg/bindings/ReleaseManagerStorage/binding.go
````go
// Code generated - DO NOT EDIT.
// This file is a generated binding and any manual changes will be lost.
⋮----
package ReleaseManagerStorage
⋮----
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"
)
⋮----
"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
)
⋮----
// IReleaseManagerTypesArtifact is an auto generated low-level Go binding around an user-defined struct.
type IReleaseManagerTypesArtifact struct {
	Digest   [32]byte
	Registry string
}
⋮----
// IReleaseManagerTypesRelease is an auto generated low-level Go binding around an user-defined struct.
type IReleaseManagerTypesRelease struct {
	Artifacts     []IReleaseManagerTypesArtifact
	UpgradeByTime uint32
}
⋮----
// OperatorSet is an auto generated low-level Go binding around an user-defined struct.
type OperatorSet struct {
	Avs common.Address
	Id  uint32
}
⋮----
// ReleaseManagerStorageMetaData contains all meta data concerning the ReleaseManagerStorage contract.
var ReleaseManagerStorageMetaData = &bind.MetaData{
	ABI: "[{\"type\":\"function\",\"name\":\"getLatestRelease\",\"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\"},{\"name\":\"\",\"type\":\"tuple\",\"internalType\":\"structIReleaseManagerTypes.Release\",\"components\":[{\"name\":\"artifacts\",\"type\":\"tuple[]\",\"internalType\":\"structIReleaseManagerTypes.Artifact[]\",\"components\":[{\"name\":\"digest\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"registry\",\"type\":\"string\",\"internalType\":\"string\"}]},{\"name\":\"upgradeByTime\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getLatestUpgradeByTime\",\"inputs\":[{\"name\":\"operatorSet\",\"type\":\"tuple\",\"internalType\":\"structOperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]}],\"outputs\":[{\"name\":\"\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getMetadataURI\",\"inputs\":[{\"name\":\"operatorSet\",\"type\":\"tuple\",\"internalType\":\"structOperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]}],\"outputs\":[{\"name\":\"\",\"type\":\"string\",\"internalType\":\"string\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getRelease\",\"inputs\":[{\"name\":\"operatorSet\",\"type\":\"tuple\",\"internalType\":\"structOperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]},{\"name\":\"releaseId\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"tuple\",\"internalType\":\"structIReleaseManagerTypes.Release\",\"components\":[{\"name\":\"artifacts\",\"type\":\"tuple[]\",\"internalType\":\"structIReleaseManagerTypes.Artifact[]\",\"components\":[{\"name\":\"digest\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"registry\",\"type\":\"string\",\"internalType\":\"string\"}]},{\"name\":\"upgradeByTime\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getTotalReleases\",\"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\":\"isValidRelease\",\"inputs\":[{\"name\":\"operatorSet\",\"type\":\"tuple\",\"internalType\":\"structOperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]},{\"name\":\"releaseId\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"publishMetadataURI\",\"inputs\":[{\"name\":\"operatorSet\",\"type\":\"tuple\",\"internalType\":\"structOperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]},{\"name\":\"metadataURI\",\"type\":\"string\",\"internalType\":\"string\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"publishRelease\",\"inputs\":[{\"name\":\"operatorSet\",\"type\":\"tuple\",\"internalType\":\"structOperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]},{\"name\":\"release\",\"type\":\"tuple\",\"internalType\":\"structIReleaseManagerTypes.Release\",\"components\":[{\"name\":\"artifacts\",\"type\":\"tuple[]\",\"internalType\":\"structIReleaseManagerTypes.Artifact[]\",\"components\":[{\"name\":\"digest\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"registry\",\"type\":\"string\",\"internalType\":\"string\"}]},{\"name\":\"upgradeByTime\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]}],\"outputs\":[{\"name\":\"releaseId\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"event\",\"name\":\"MetadataURIPublished\",\"inputs\":[{\"name\":\"operatorSet\",\"type\":\"tuple\",\"indexed\":true,\"internalType\":\"structOperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]},{\"name\":\"metadataURI\",\"type\":\"string\",\"indexed\":false,\"internalType\":\"string\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ReleasePublished\",\"inputs\":[{\"name\":\"operatorSet\",\"type\":\"tuple\",\"indexed\":true,\"internalType\":\"structOperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]},{\"name\":\"releaseId\",\"type\":\"uint256\",\"indexed\":true,\"internalType\":\"uint256\"},{\"name\":\"release\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structIReleaseManagerTypes.Release\",\"components\":[{\"name\":\"artifacts\",\"type\":\"tuple[]\",\"internalType\":\"structIReleaseManagerTypes.Artifact[]\",\"components\":[{\"name\":\"digest\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"registry\",\"type\":\"string\",\"internalType\":\"string\"}]},{\"name\":\"upgradeByTime\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]}],\"anonymous\":false},{\"type\":\"error\",\"name\":\"InvalidMetadataURI\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidUpgradeByTime\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"MustPublishMetadataURI\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"NoReleases\",\"inputs\":[]}]",
}
⋮----
// ReleaseManagerStorageABI is the input ABI used to generate the binding from.
// Deprecated: Use ReleaseManagerStorageMetaData.ABI instead.
var ReleaseManagerStorageABI = ReleaseManagerStorageMetaData.ABI
⋮----
// ReleaseManagerStorage is an auto generated Go binding around an Ethereum contract.
type ReleaseManagerStorage struct {
	ReleaseManagerStorageCaller     // Read-only binding to the contract
	ReleaseManagerStorageTransactor // Write-only binding to the contract
	ReleaseManagerStorageFilterer   // Log filterer for contract events
}
⋮----
ReleaseManagerStorageCaller     // Read-only binding to the contract
ReleaseManagerStorageTransactor // Write-only binding to the contract
ReleaseManagerStorageFilterer   // Log filterer for contract events
⋮----
// ReleaseManagerStorageCaller is an auto generated read-only Go binding around an Ethereum contract.
type ReleaseManagerStorageCaller struct {
	contract *bind.BoundContract // Generic contract wrapper for the low level calls
}
⋮----
contract *bind.BoundContract // Generic contract wrapper for the low level calls
⋮----
// ReleaseManagerStorageTransactor is an auto generated write-only Go binding around an Ethereum contract.
type ReleaseManagerStorageTransactor struct {
	contract *bind.BoundContract // Generic contract wrapper for the low level calls
}
⋮----
// ReleaseManagerStorageFilterer is an auto generated log filtering Go binding around an Ethereum contract events.
type ReleaseManagerStorageFilterer struct {
	contract *bind.BoundContract // Generic contract wrapper for the low level calls
}
⋮----
// ReleaseManagerStorageSession is an auto generated Go binding around an Ethereum contract,
// with pre-set call and transact options.
type ReleaseManagerStorageSession struct {
	Contract     *ReleaseManagerStorage // 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
}
⋮----
Contract     *ReleaseManagerStorage // 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
⋮----
// ReleaseManagerStorageCallerSession is an auto generated read-only Go binding around an Ethereum contract,
// with pre-set call options.
type ReleaseManagerStorageCallerSession struct {
	Contract *ReleaseManagerStorageCaller // Generic contract caller binding to set the session for
	CallOpts bind.CallOpts                // Call options to use throughout this session
}
⋮----
Contract *ReleaseManagerStorageCaller // Generic contract caller binding to set the session for
CallOpts bind.CallOpts                // Call options to use throughout this session
⋮----
// ReleaseManagerStorageTransactorSession is an auto generated write-only Go binding around an Ethereum contract,
// with pre-set transact options.
type ReleaseManagerStorageTransactorSession struct {
	Contract     *ReleaseManagerStorageTransactor // Generic contract transactor binding to set the session for
	TransactOpts bind.TransactOpts                // Transaction auth options to use throughout this session
}
⋮----
Contract     *ReleaseManagerStorageTransactor // Generic contract transactor binding to set the session for
TransactOpts bind.TransactOpts                // Transaction auth options to use throughout this session
⋮----
// ReleaseManagerStorageRaw is an auto generated low-level Go binding around an Ethereum contract.
type ReleaseManagerStorageRaw struct {
	Contract *ReleaseManagerStorage // Generic contract binding to access the raw methods on
}
⋮----
Contract *ReleaseManagerStorage // Generic contract binding to access the raw methods on
⋮----
// ReleaseManagerStorageCallerRaw is an auto generated low-level read-only Go binding around an Ethereum contract.
type ReleaseManagerStorageCallerRaw struct {
	Contract *ReleaseManagerStorageCaller // Generic read-only contract binding to access the raw methods on
}
⋮----
Contract *ReleaseManagerStorageCaller // Generic read-only contract binding to access the raw methods on
⋮----
// ReleaseManagerStorageTransactorRaw is an auto generated low-level write-only Go binding around an Ethereum contract.
type ReleaseManagerStorageTransactorRaw struct {
	Contract *ReleaseManagerStorageTransactor // Generic write-only contract binding to access the raw methods on
}
⋮----
Contract *ReleaseManagerStorageTransactor // Generic write-only contract binding to access the raw methods on
⋮----
// NewReleaseManagerStorage creates a new instance of ReleaseManagerStorage, bound to a specific deployed contract.
func NewReleaseManagerStorage(address common.Address, backend bind.ContractBackend) (*ReleaseManagerStorage, error)
⋮----
// NewReleaseManagerStorageCaller creates a new read-only instance of ReleaseManagerStorage, bound to a specific deployed contract.
func NewReleaseManagerStorageCaller(address common.Address, caller bind.ContractCaller) (*ReleaseManagerStorageCaller, error)
⋮----
// NewReleaseManagerStorageTransactor creates a new write-only instance of ReleaseManagerStorage, bound to a specific deployed contract.
func NewReleaseManagerStorageTransactor(address common.Address, transactor bind.ContractTransactor) (*ReleaseManagerStorageTransactor, error)
⋮----
// NewReleaseManagerStorageFilterer creates a new log filterer instance of ReleaseManagerStorage, bound to a specific deployed contract.
func NewReleaseManagerStorageFilterer(address common.Address, filterer bind.ContractFilterer) (*ReleaseManagerStorageFilterer, error)
⋮----
// bindReleaseManagerStorage binds a generic wrapper to an already deployed contract.
func bindReleaseManagerStorage(address common.Address, caller bind.ContractCaller, transactor bind.ContractTransactor, filterer bind.ContractFilterer) (*bind.BoundContract, error)
⋮----
// 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 (_ReleaseManagerStorage *ReleaseManagerStorageRaw) Call(opts *bind.CallOpts, result *[]interface
⋮----
// Transfer initiates a plain transaction to move funds to the contract, calling
// its default method if one is available.
func (_ReleaseManagerStorage *ReleaseManagerStorageRaw) Transfer(opts *bind.TransactOpts) (*types.Transaction, error)
⋮----
// Transact invokes the (paid) contract method with params as input values.
func (_ReleaseManagerStorage *ReleaseManagerStorageRaw) Transact(opts *bind.TransactOpts, method string, params ...interface
⋮----
// GetLatestRelease is a free data retrieval call binding the contract method 0xd30eeb88.
//
// Solidity: function getLatestRelease((address,uint32) operatorSet) view returns(uint256, ((bytes32,string)[],uint32))
func (_ReleaseManagerStorage *ReleaseManagerStorageCaller) GetLatestRelease(opts *bind.CallOpts, operatorSet OperatorSet) (*big.Int, IReleaseManagerTypesRelease, error)
⋮----
var out []interface{}
⋮----
// GetLatestUpgradeByTime is a free data retrieval call binding the contract method 0xa9e0ed68.
⋮----
// Solidity: function getLatestUpgradeByTime((address,uint32) operatorSet) view returns(uint32)
func (_ReleaseManagerStorage *ReleaseManagerStorageCaller) GetLatestUpgradeByTime(opts *bind.CallOpts, operatorSet OperatorSet) (uint32, error)
⋮----
// GetMetadataURI is a free data retrieval call binding the contract method 0xb053b56d.
⋮----
// Solidity: function getMetadataURI((address,uint32) operatorSet) view returns(string)
func (_ReleaseManagerStorage *ReleaseManagerStorageCaller) GetMetadataURI(opts *bind.CallOpts, operatorSet OperatorSet) (string, error)
⋮----
// GetRelease is a free data retrieval call binding the contract method 0x3acab5fc.
⋮----
// Solidity: function getRelease((address,uint32) operatorSet, uint256 releaseId) view returns(((bytes32,string)[],uint32))
func (_ReleaseManagerStorage *ReleaseManagerStorageCaller) GetRelease(opts *bind.CallOpts, operatorSet OperatorSet, releaseId *big.Int) (IReleaseManagerTypesRelease, error)
⋮----
// GetTotalReleases is a free data retrieval call binding the contract method 0x66f409f7.
⋮----
// Solidity: function getTotalReleases((address,uint32) operatorSet) view returns(uint256)
func (_ReleaseManagerStorage *ReleaseManagerStorageCaller) GetTotalReleases(opts *bind.CallOpts, operatorSet OperatorSet) (*big.Int, error)
⋮----
// IsValidRelease is a free data retrieval call binding the contract method 0x517e4068.
⋮----
// Solidity: function isValidRelease((address,uint32) operatorSet, uint256 releaseId) view returns(bool)
func (_ReleaseManagerStorage *ReleaseManagerStorageCaller) IsValidRelease(opts *bind.CallOpts, operatorSet OperatorSet, releaseId *big.Int) (bool, error)
⋮----
// PublishMetadataURI is a paid mutator transaction binding the contract method 0x4840a67c.
⋮----
// Solidity: function publishMetadataURI((address,uint32) operatorSet, string metadataURI) returns()
func (_ReleaseManagerStorage *ReleaseManagerStorageTransactor) PublishMetadataURI(opts *bind.TransactOpts, operatorSet OperatorSet, metadataURI string) (*types.Transaction, error)
⋮----
// PublishRelease is a paid mutator transaction binding the contract method 0x7c09ea82.
⋮----
// Solidity: function publishRelease((address,uint32) operatorSet, ((bytes32,string)[],uint32) release) returns(uint256 releaseId)
func (_ReleaseManagerStorage *ReleaseManagerStorageTransactor) PublishRelease(opts *bind.TransactOpts, operatorSet OperatorSet, release IReleaseManagerTypesRelease) (*types.Transaction, error)
⋮----
// ReleaseManagerStorageMetadataURIPublishedIterator is returned from FilterMetadataURIPublished and is used to iterate over the raw logs and unpacked data for MetadataURIPublished events raised by the ReleaseManagerStorage contract.
type ReleaseManagerStorageMetadataURIPublishedIterator struct {
	Event *ReleaseManagerStorageMetadataURIPublished // 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
}
⋮----
Event *ReleaseManagerStorageMetadataURIPublished // 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 *ReleaseManagerStorageMetadataURIPublishedIterator) Next() bool
⋮----
// If the iterator failed, stop iterating
⋮----
// If the iterator completed, deliver directly whatever's available
⋮----
// Iterator still in progress, wait for either a data or an error event
⋮----
// Error returns any retrieval or parsing error occurred during filtering.
func (it *ReleaseManagerStorageMetadataURIPublishedIterator) Error() error
⋮----
// Close terminates the iteration process, releasing any pending underlying
// resources.
func (it *ReleaseManagerStorageMetadataURIPublishedIterator) Close() error
⋮----
// ReleaseManagerStorageMetadataURIPublished represents a MetadataURIPublished event raised by the ReleaseManagerStorage contract.
type ReleaseManagerStorageMetadataURIPublished struct {
	OperatorSet OperatorSet
	MetadataURI string
	Raw         types.Log // Blockchain specific contextual infos
}
⋮----
Raw         types.Log // Blockchain specific contextual infos
⋮----
// FilterMetadataURIPublished is a free log retrieval operation binding the contract event 0x209e95fbe8dd14c5e1fbf791ee0a83234f45f20cb85504c7068d5ca0d6224588.
⋮----
// Solidity: event MetadataURIPublished((address,uint32) indexed operatorSet, string metadataURI)
func (_ReleaseManagerStorage *ReleaseManagerStorageFilterer) FilterMetadataURIPublished(opts *bind.FilterOpts, operatorSet []OperatorSet) (*ReleaseManagerStorageMetadataURIPublishedIterator, error)
⋮----
var operatorSetRule []interface{}
⋮----
// WatchMetadataURIPublished is a free log subscription operation binding the contract event 0x209e95fbe8dd14c5e1fbf791ee0a83234f45f20cb85504c7068d5ca0d6224588.
⋮----
func (_ReleaseManagerStorage *ReleaseManagerStorageFilterer) WatchMetadataURIPublished(opts *bind.WatchOpts, sink chan<- *ReleaseManagerStorageMetadataURIPublished, operatorSet []OperatorSet) (event.Subscription, error)
⋮----
// New log arrived, parse the event and forward to the user
⋮----
// ParseMetadataURIPublished is a log parse operation binding the contract event 0x209e95fbe8dd14c5e1fbf791ee0a83234f45f20cb85504c7068d5ca0d6224588.
⋮----
func (_ReleaseManagerStorage *ReleaseManagerStorageFilterer) ParseMetadataURIPublished(log types.Log) (*ReleaseManagerStorageMetadataURIPublished, error)
⋮----
// ReleaseManagerStorageReleasePublishedIterator is returned from FilterReleasePublished and is used to iterate over the raw logs and unpacked data for ReleasePublished events raised by the ReleaseManagerStorage contract.
type ReleaseManagerStorageReleasePublishedIterator struct {
	Event *ReleaseManagerStorageReleasePublished // 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
}
⋮----
Event *ReleaseManagerStorageReleasePublished // Event containing the contract specifics and raw log
⋮----
// ReleaseManagerStorageReleasePublished represents a ReleasePublished event raised by the ReleaseManagerStorage contract.
type ReleaseManagerStorageReleasePublished struct {
	OperatorSet OperatorSet
	ReleaseId   *big.Int
	Release     IReleaseManagerTypesRelease
	Raw         types.Log // Blockchain specific contextual infos
}
⋮----
// FilterReleasePublished is a free log retrieval operation binding the contract event 0x2decd15222f7c4a8c3d4d2e14dcfdc5a0b52eb2d4b81796bfd010ee5cd972fd3.
⋮----
// Solidity: event ReleasePublished((address,uint32) indexed operatorSet, uint256 indexed releaseId, ((bytes32,string)[],uint32) release)
func (_ReleaseManagerStorage *ReleaseManagerStorageFilterer) FilterReleasePublished(opts *bind.FilterOpts, operatorSet []OperatorSet, releaseId []*big.Int) (*ReleaseManagerStorageReleasePublishedIterator, error)
⋮----
var releaseIdRule []interface{}
⋮----
// WatchReleasePublished is a free log subscription operation binding the contract event 0x2decd15222f7c4a8c3d4d2e14dcfdc5a0b52eb2d4b81796bfd010ee5cd972fd3.
⋮----
func (_ReleaseManagerStorage *ReleaseManagerStorageFilterer) WatchReleasePublished(opts *bind.WatchOpts, sink chan<- *ReleaseManagerStorageReleasePublished, operatorSet []OperatorSet, releaseId []*big.Int) (event.Subscription, error)
⋮----
// ParseReleasePublished is a log parse operation binding the contract event 0x2decd15222f7c4a8c3d4d2e14dcfdc5a0b52eb2d4b81796bfd010ee5cd972fd3.
⋮----
func (_ReleaseManagerStorage *ReleaseManagerStorageFilterer) ParseReleasePublished(log types.Log) (*ReleaseManagerStorageReleasePublished, error)
````

## File: pkg/bindings/RewardsCoordinator/binding.go
````go
// Code generated - DO NOT EDIT.
// This file is a generated binding and any manual changes will be lost.
⋮----
package RewardsCoordinator
⋮----
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"
)
⋮----
"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
)
⋮----
// IRewardsCoordinatorTypesDistributionRoot is an auto generated low-level Go binding around an user-defined struct.
type IRewardsCoordinatorTypesDistributionRoot struct {
	Root                           [32]byte
	RewardsCalculationEndTimestamp uint32
	ActivatedAt                    uint32
	Disabled                       bool
}
⋮----
// IRewardsCoordinatorTypesEarnerTreeMerkleLeaf is an auto generated low-level Go binding around an user-defined struct.
type IRewardsCoordinatorTypesEarnerTreeMerkleLeaf struct {
	Earner          common.Address
	EarnerTokenRoot [32]byte
}
⋮----
// IRewardsCoordinatorTypesOperatorDirectedRewardsSubmission is an auto generated low-level Go binding around an user-defined struct.
type IRewardsCoordinatorTypesOperatorDirectedRewardsSubmission struct {
	StrategiesAndMultipliers []IRewardsCoordinatorTypesStrategyAndMultiplier
	Token                    common.Address
	OperatorRewards          []IRewardsCoordinatorTypesOperatorReward
	StartTimestamp           uint32
	Duration                 uint32
	Description              string
}
⋮----
// IRewardsCoordinatorTypesOperatorReward is an auto generated low-level Go binding around an user-defined struct.
type IRewardsCoordinatorTypesOperatorReward struct {
	Operator common.Address
	Amount   *big.Int
}
⋮----
// IRewardsCoordinatorTypesRewardsCoordinatorConstructorParams is an auto generated low-level Go binding around an user-defined struct.
type IRewardsCoordinatorTypesRewardsCoordinatorConstructorParams struct {
	DelegationManager          common.Address
	StrategyManager            common.Address
	AllocationManager          common.Address
	EmissionsController        common.Address
	PauserRegistry             common.Address
	PermissionController       common.Address
	CALCULATIONINTERVALSECONDS uint32
	MAXREWARDSDURATION         uint32
	MAXRETROACTIVELENGTH       uint32
	MAXFUTURELENGTH            uint32
	GENESISREWARDSTIMESTAMP    uint32
}
⋮----
// IRewardsCoordinatorTypesRewardsMerkleClaim is an auto generated low-level Go binding around an user-defined struct.
type IRewardsCoordinatorTypesRewardsMerkleClaim struct {
	RootIndex       uint32
	EarnerIndex     uint32
	EarnerTreeProof []byte
	EarnerLeaf      IRewardsCoordinatorTypesEarnerTreeMerkleLeaf
	TokenIndices    []uint32
	TokenTreeProofs [][]byte
	TokenLeaves     []IRewardsCoordinatorTypesTokenTreeMerkleLeaf
}
⋮----
// IRewardsCoordinatorTypesRewardsSubmission is an auto generated low-level Go binding around an user-defined struct.
type IRewardsCoordinatorTypesRewardsSubmission struct {
	StrategiesAndMultipliers []IRewardsCoordinatorTypesStrategyAndMultiplier
	Token                    common.Address
	Amount                   *big.Int
	StartTimestamp           uint32
	Duration                 uint32
}
⋮----
// IRewardsCoordinatorTypesStrategyAndMultiplier is an auto generated low-level Go binding around an user-defined struct.
type IRewardsCoordinatorTypesStrategyAndMultiplier struct {
	Strategy   common.Address
	Multiplier *big.Int
}
⋮----
// IRewardsCoordinatorTypesTokenTreeMerkleLeaf is an auto generated low-level Go binding around an user-defined struct.
type IRewardsCoordinatorTypesTokenTreeMerkleLeaf struct {
	Token              common.Address
	CumulativeEarnings *big.Int
}
⋮----
// OperatorSet is an auto generated low-level Go binding around an user-defined struct.
type OperatorSet struct {
	Avs common.Address
	Id  uint32
}
⋮----
// 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\":\"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.
// Deprecated: Use RewardsCoordinatorMetaData.ABI instead.
var RewardsCoordinatorABI = RewardsCoordinatorMetaData.ABI
⋮----
// RewardsCoordinatorBin is the compiled bytecode used for deploying new contracts.
// Deprecated: Use RewardsCoordinatorMetaData.Bin instead.
var RewardsCoordinatorBin = RewardsCoordinatorMetaData.Bin
⋮----
// DeployRewardsCoordinator deploys a new Ethereum contract, binding an instance of RewardsCoordinator to it.
func DeployRewardsCoordinator(auth *bind.TransactOpts, backend bind.ContractBackend, params IRewardsCoordinatorTypesRewardsCoordinatorConstructorParams) (common.Address, *types.Transaction, *RewardsCoordinator, error)
⋮----
// RewardsCoordinator is an auto generated Go binding around an Ethereum contract.
type RewardsCoordinator struct {
	RewardsCoordinatorCaller     // Read-only binding to the contract
	RewardsCoordinatorTransactor // Write-only binding to the contract
	RewardsCoordinatorFilterer   // Log filterer for contract events
}
⋮----
RewardsCoordinatorCaller     // Read-only binding to the contract
RewardsCoordinatorTransactor // Write-only binding to the contract
RewardsCoordinatorFilterer   // Log filterer for contract events
⋮----
// RewardsCoordinatorCaller is an auto generated read-only Go binding around an Ethereum contract.
type RewardsCoordinatorCaller struct {
	contract *bind.BoundContract // Generic contract wrapper for the low level calls
}
⋮----
contract *bind.BoundContract // Generic contract wrapper for the low level calls
⋮----
// RewardsCoordinatorTransactor is an auto generated write-only Go binding around an Ethereum contract.
type RewardsCoordinatorTransactor struct {
	contract *bind.BoundContract // Generic contract wrapper for the low level calls
}
⋮----
// RewardsCoordinatorFilterer is an auto generated log filtering Go binding around an Ethereum contract events.
type RewardsCoordinatorFilterer struct {
	contract *bind.BoundContract // Generic contract wrapper for the low level calls
}
⋮----
// RewardsCoordinatorSession is an auto generated Go binding around an Ethereum contract,
// with pre-set call and transact options.
type RewardsCoordinatorSession struct {
	Contract     *RewardsCoordinator // 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
}
⋮----
Contract     *RewardsCoordinator // 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
⋮----
// RewardsCoordinatorCallerSession is an auto generated read-only Go binding around an Ethereum contract,
// with pre-set call options.
type RewardsCoordinatorCallerSession struct {
	Contract *RewardsCoordinatorCaller // Generic contract caller binding to set the session for
	CallOpts bind.CallOpts             // Call options to use throughout this session
}
⋮----
Contract *RewardsCoordinatorCaller // Generic contract caller binding to set the session for
CallOpts bind.CallOpts             // Call options to use throughout this session
⋮----
// RewardsCoordinatorTransactorSession is an auto generated write-only Go binding around an Ethereum contract,
// with pre-set transact options.
type RewardsCoordinatorTransactorSession struct {
	Contract     *RewardsCoordinatorTransactor // Generic contract transactor binding to set the session for
	TransactOpts bind.TransactOpts             // Transaction auth options to use throughout this session
}
⋮----
Contract     *RewardsCoordinatorTransactor // Generic contract transactor binding to set the session for
TransactOpts bind.TransactOpts             // Transaction auth options to use throughout this session
⋮----
// RewardsCoordinatorRaw is an auto generated low-level Go binding around an Ethereum contract.
type RewardsCoordinatorRaw struct {
	Contract *RewardsCoordinator // Generic contract binding to access the raw methods on
}
⋮----
Contract *RewardsCoordinator // Generic contract binding to access the raw methods on
⋮----
// RewardsCoordinatorCallerRaw is an auto generated low-level read-only Go binding around an Ethereum contract.
type RewardsCoordinatorCallerRaw struct {
	Contract *RewardsCoordinatorCaller // Generic read-only contract binding to access the raw methods on
}
⋮----
Contract *RewardsCoordinatorCaller // Generic read-only contract binding to access the raw methods on
⋮----
// RewardsCoordinatorTransactorRaw is an auto generated low-level write-only Go binding around an Ethereum contract.
type RewardsCoordinatorTransactorRaw struct {
	Contract *RewardsCoordinatorTransactor // Generic write-only contract binding to access the raw methods on
}
⋮----
Contract *RewardsCoordinatorTransactor // Generic write-only contract binding to access the raw methods on
⋮----
// NewRewardsCoordinator creates a new instance of RewardsCoordinator, bound to a specific deployed contract.
func NewRewardsCoordinator(address common.Address, backend bind.ContractBackend) (*RewardsCoordinator, error)
⋮----
// NewRewardsCoordinatorCaller creates a new read-only instance of RewardsCoordinator, bound to a specific deployed contract.
func NewRewardsCoordinatorCaller(address common.Address, caller bind.ContractCaller) (*RewardsCoordinatorCaller, error)
⋮----
// NewRewardsCoordinatorTransactor creates a new write-only instance of RewardsCoordinator, bound to a specific deployed contract.
func NewRewardsCoordinatorTransactor(address common.Address, transactor bind.ContractTransactor) (*RewardsCoordinatorTransactor, error)
⋮----
// NewRewardsCoordinatorFilterer creates a new log filterer instance of RewardsCoordinator, bound to a specific deployed contract.
func NewRewardsCoordinatorFilterer(address common.Address, filterer bind.ContractFilterer) (*RewardsCoordinatorFilterer, error)
⋮----
// bindRewardsCoordinator binds a generic wrapper to an already deployed contract.
func bindRewardsCoordinator(address common.Address, caller bind.ContractCaller, transactor bind.ContractTransactor, filterer bind.ContractFilterer) (*bind.BoundContract, error)
⋮----
// 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 (_RewardsCoordinator *RewardsCoordinatorRaw) Call(opts *bind.CallOpts, result *[]interface
⋮----
// Transfer initiates a plain transaction to move funds to the contract, calling
// its default method if one is available.
func (_RewardsCoordinator *RewardsCoordinatorRaw) Transfer(opts *bind.TransactOpts) (*types.Transaction, error)
⋮----
// Transact invokes the (paid) contract method with params as input values.
func (_RewardsCoordinator *RewardsCoordinatorRaw) Transact(opts *bind.TransactOpts, method string, params ...interface
⋮----
// CALCULATIONINTERVALSECONDS is a free data retrieval call binding the contract method 0x9d45c281.
//
// Solidity: function CALCULATION_INTERVAL_SECONDS() view returns(uint32)
func (_RewardsCoordinator *RewardsCoordinatorCaller) CALCULATIONINTERVALSECONDS(opts *bind.CallOpts) (uint32, error)
⋮----
var out []interface{}
⋮----
// GENESISREWARDSTIMESTAMP is a free data retrieval call binding the contract method 0x131433b4.
⋮----
// Solidity: function GENESIS_REWARDS_TIMESTAMP() view returns(uint32)
func (_RewardsCoordinator *RewardsCoordinatorCaller) GENESISREWARDSTIMESTAMP(opts *bind.CallOpts) (uint32, error)
⋮----
// MAXFUTURELENGTH is a free data retrieval call binding the contract method 0x04a0c502.
⋮----
// Solidity: function MAX_FUTURE_LENGTH() view returns(uint32)
func (_RewardsCoordinator *RewardsCoordinatorCaller) MAXFUTURELENGTH(opts *bind.CallOpts) (uint32, error)
⋮----
// MAXRETROACTIVELENGTH is a free data retrieval call binding the contract method 0x37838ed0.
⋮----
// Solidity: function MAX_RETROACTIVE_LENGTH() view returns(uint32)
func (_RewardsCoordinator *RewardsCoordinatorCaller) MAXRETROACTIVELENGTH(opts *bind.CallOpts) (uint32, error)
⋮----
// MAXREWARDSDURATION is a free data retrieval call binding the contract method 0xbf21a8aa.
⋮----
// Solidity: function MAX_REWARDS_DURATION() view returns(uint32)
func (_RewardsCoordinator *RewardsCoordinatorCaller) MAXREWARDSDURATION(opts *bind.CallOpts) (uint32, error)
⋮----
// ActivationDelay is a free data retrieval call binding the contract method 0x3a8c0786.
⋮----
// Solidity: function activationDelay() view returns(uint32)
func (_RewardsCoordinator *RewardsCoordinatorCaller) ActivationDelay(opts *bind.CallOpts) (uint32, error)
⋮----
// AllocationManager is a free data retrieval call binding the contract method 0xca8aa7c7.
⋮----
// Solidity: function allocationManager() view returns(address)
func (_RewardsCoordinator *RewardsCoordinatorCaller) AllocationManager(opts *bind.CallOpts) (common.Address, error)
⋮----
// BeaconChainETHStrategy is a free data retrieval call binding the contract method 0x9104c319.
⋮----
// Solidity: function beaconChainETHStrategy() view returns(address)
func (_RewardsCoordinator *RewardsCoordinatorCaller) BeaconChainETHStrategy(opts *bind.CallOpts) (common.Address, error)
⋮----
// CalculateEarnerLeafHash is a free data retrieval call binding the contract method 0x149bc872.
⋮----
// Solidity: function calculateEarnerLeafHash((address,bytes32) leaf) pure returns(bytes32)
func (_RewardsCoordinator *RewardsCoordinatorCaller) CalculateEarnerLeafHash(opts *bind.CallOpts, leaf IRewardsCoordinatorTypesEarnerTreeMerkleLeaf) ([32]byte, error)
⋮----
// CalculateTokenLeafHash is a free data retrieval call binding the contract method 0xf8cd8448.
⋮----
// Solidity: function calculateTokenLeafHash((address,uint256) leaf) pure returns(bytes32)
func (_RewardsCoordinator *RewardsCoordinatorCaller) CalculateTokenLeafHash(opts *bind.CallOpts, leaf IRewardsCoordinatorTypesTokenTreeMerkleLeaf) ([32]byte, error)
⋮----
// CheckClaim is a free data retrieval call binding the contract method 0x5e9d8348.
⋮----
// Solidity: function checkClaim((uint32,uint32,bytes,(address,bytes32),uint32[],bytes[],(address,uint256)[]) claim) view returns(bool)
func (_RewardsCoordinator *RewardsCoordinatorCaller) CheckClaim(opts *bind.CallOpts, claim IRewardsCoordinatorTypesRewardsMerkleClaim) (bool, error)
⋮----
// ClaimerFor is a free data retrieval call binding the contract method 0x2b9f64a4.
⋮----
// Solidity: function claimerFor(address earner) view returns(address claimer)
func (_RewardsCoordinator *RewardsCoordinatorCaller) ClaimerFor(opts *bind.CallOpts, earner common.Address) (common.Address, error)
⋮----
// CumulativeClaimed is a free data retrieval call binding the contract method 0x865c6953.
⋮----
// Solidity: function cumulativeClaimed(address earner, address token) view returns(uint256 totalClaimed)
func (_RewardsCoordinator *RewardsCoordinatorCaller) CumulativeClaimed(opts *bind.CallOpts, earner common.Address, token common.Address) (*big.Int, error)
⋮----
// CurrRewardsCalculationEndTimestamp is a free data retrieval call binding the contract method 0x4d18cc35.
⋮----
// Solidity: function currRewardsCalculationEndTimestamp() view returns(uint32)
func (_RewardsCoordinator *RewardsCoordinatorCaller) CurrRewardsCalculationEndTimestamp(opts *bind.CallOpts) (uint32, error)
⋮----
// DefaultOperatorSplitBips is a free data retrieval call binding the contract method 0x63f6a798.
⋮----
// Solidity: function defaultOperatorSplitBips() view returns(uint16)
func (_RewardsCoordinator *RewardsCoordinatorCaller) DefaultOperatorSplitBips(opts *bind.CallOpts) (uint16, error)
⋮----
// DelegationManager is a free data retrieval call binding the contract method 0xea4d3c9b.
⋮----
// Solidity: function delegationManager() view returns(address)
func (_RewardsCoordinator *RewardsCoordinatorCaller) DelegationManager(opts *bind.CallOpts) (common.Address, error)
⋮----
// 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)
⋮----
// 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)
⋮----
// GetCurrentClaimableDistributionRoot is a free data retrieval call binding the contract method 0x0e9a53cf.
⋮----
// Solidity: function getCurrentClaimableDistributionRoot() view returns((bytes32,uint32,uint32,bool))
func (_RewardsCoordinator *RewardsCoordinatorCaller) GetCurrentClaimableDistributionRoot(opts *bind.CallOpts) (IRewardsCoordinatorTypesDistributionRoot, error)
⋮----
// GetCurrentDistributionRoot is a free data retrieval call binding the contract method 0x9be3d4e4.
⋮----
// Solidity: function getCurrentDistributionRoot() view returns((bytes32,uint32,uint32,bool))
func (_RewardsCoordinator *RewardsCoordinatorCaller) GetCurrentDistributionRoot(opts *bind.CallOpts) (IRewardsCoordinatorTypesDistributionRoot, error)
⋮----
// GetDistributionRootAtIndex is a free data retrieval call binding the contract method 0xde02e503.
⋮----
// Solidity: function getDistributionRootAtIndex(uint256 index) view returns((bytes32,uint32,uint32,bool))
func (_RewardsCoordinator *RewardsCoordinatorCaller) GetDistributionRootAtIndex(opts *bind.CallOpts, index *big.Int) (IRewardsCoordinatorTypesDistributionRoot, error)
⋮----
// GetDistributionRootsLength is a free data retrieval call binding the contract method 0x7b8f8b05.
⋮----
// Solidity: function getDistributionRootsLength() view returns(uint256)
func (_RewardsCoordinator *RewardsCoordinatorCaller) GetDistributionRootsLength(opts *bind.CallOpts) (*big.Int, error)
⋮----
// GetOperatorAVSSplit is a free data retrieval call binding the contract method 0xe063f81f.
⋮----
// Solidity: function getOperatorAVSSplit(address operator, address avs) view returns(uint16)
func (_RewardsCoordinator *RewardsCoordinatorCaller) GetOperatorAVSSplit(opts *bind.CallOpts, operator common.Address, avs common.Address) (uint16, error)
⋮----
// GetOperatorPISplit is a free data retrieval call binding the contract method 0x4b943960.
⋮----
// Solidity: function getOperatorPISplit(address operator) view returns(uint16)
func (_RewardsCoordinator *RewardsCoordinatorCaller) GetOperatorPISplit(opts *bind.CallOpts, operator common.Address) (uint16, error)
⋮----
// GetOperatorSetSplit is a free data retrieval call binding the contract method 0x9de4b35f.
⋮----
// Solidity: function getOperatorSetSplit(address operator, (address,uint32) operatorSet) view returns(uint16)
func (_RewardsCoordinator *RewardsCoordinatorCaller) GetOperatorSetSplit(opts *bind.CallOpts, operator common.Address, operatorSet OperatorSet) (uint16, error)
⋮----
// GetRootIndexFromHash is a free data retrieval call binding the contract method 0xe810ce21.
⋮----
// Solidity: function getRootIndexFromHash(bytes32 rootHash) view returns(uint32)
func (_RewardsCoordinator *RewardsCoordinatorCaller) GetRootIndexFromHash(opts *bind.CallOpts, rootHash [32]byte) (uint32, error)
⋮----
// IsAVSRewardsSubmissionHash is a free data retrieval call binding the contract method 0x6d21117e.
⋮----
// Solidity: function isAVSRewardsSubmissionHash(address avs, bytes32 hash) view returns(bool valid)
func (_RewardsCoordinator *RewardsCoordinatorCaller) IsAVSRewardsSubmissionHash(opts *bind.CallOpts, avs common.Address, hash [32]byte) (bool, error)
⋮----
// IsOperatorDirectedAVSRewardsSubmissionHash is a free data retrieval call binding the contract method 0xed71e6a2.
⋮----
// Solidity: function isOperatorDirectedAVSRewardsSubmissionHash(address avs, bytes32 hash) view returns(bool valid)
func (_RewardsCoordinator *RewardsCoordinatorCaller) IsOperatorDirectedAVSRewardsSubmissionHash(opts *bind.CallOpts, avs common.Address, hash [32]byte) (bool, error)
⋮----
// IsOperatorDirectedOperatorSetRewardsSubmissionHash is a free data retrieval call binding the contract method 0xf2f07ab4.
⋮----
// Solidity: function isOperatorDirectedOperatorSetRewardsSubmissionHash(address avs, bytes32 hash) view returns(bool valid)
func (_RewardsCoordinator *RewardsCoordinatorCaller) IsOperatorDirectedOperatorSetRewardsSubmissionHash(opts *bind.CallOpts, avs common.Address, hash [32]byte) (bool, error)
⋮----
// 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)
⋮----
// IsRewardsForAllSubmitter is a free data retrieval call binding the contract method 0x0018572c.
⋮----
// Solidity: function isRewardsForAllSubmitter(address submitter) view returns(bool valid)
func (_RewardsCoordinator *RewardsCoordinatorCaller) IsRewardsForAllSubmitter(opts *bind.CallOpts, submitter common.Address) (bool, error)
⋮----
// IsRewardsSubmissionForAllEarnersHash is a free data retrieval call binding the contract method 0xaebd8bae.
⋮----
// Solidity: function isRewardsSubmissionForAllEarnersHash(address avs, bytes32 hash) view returns(bool valid)
func (_RewardsCoordinator *RewardsCoordinatorCaller) IsRewardsSubmissionForAllEarnersHash(opts *bind.CallOpts, avs common.Address, hash [32]byte) (bool, error)
⋮----
// IsRewardsSubmissionForAllHash is a free data retrieval call binding the contract method 0xc46db606.
⋮----
// Solidity: function isRewardsSubmissionForAllHash(address avs, bytes32 hash) view returns(bool valid)
func (_RewardsCoordinator *RewardsCoordinatorCaller) IsRewardsSubmissionForAllHash(opts *bind.CallOpts, avs common.Address, hash [32]byte) (bool, error)
⋮----
// IsTotalStakeRewardsSubmissionHash is a free data retrieval call binding the contract method 0xb73c1b92.
⋮----
// Solidity: function isTotalStakeRewardsSubmissionHash(address avs, bytes32 hash) view returns(bool valid)
func (_RewardsCoordinator *RewardsCoordinatorCaller) IsTotalStakeRewardsSubmissionHash(opts *bind.CallOpts, avs common.Address, hash [32]byte) (bool, error)
⋮----
// IsUniqueStakeRewardsSubmissionHash is a free data retrieval call binding the contract method 0x2943e3ff.
⋮----
// Solidity: function isUniqueStakeRewardsSubmissionHash(address avs, bytes32 hash) view returns(bool valid)
func (_RewardsCoordinator *RewardsCoordinatorCaller) IsUniqueStakeRewardsSubmissionHash(opts *bind.CallOpts, avs common.Address, hash [32]byte) (bool, error)
⋮----
// Owner is a free data retrieval call binding the contract method 0x8da5cb5b.
⋮----
// Solidity: function owner() view returns(address)
func (_RewardsCoordinator *RewardsCoordinatorCaller) Owner(opts *bind.CallOpts) (common.Address, error)
⋮----
// Paused is a free data retrieval call binding the contract method 0x5ac86ab7.
⋮----
// Solidity: function paused(uint8 index) view returns(bool)
func (_RewardsCoordinator *RewardsCoordinatorCaller) Paused(opts *bind.CallOpts, index uint8) (bool, error)
⋮----
// Paused0 is a free data retrieval call binding the contract method 0x5c975abb.
⋮----
// Solidity: function paused() view returns(uint256)
func (_RewardsCoordinator *RewardsCoordinatorCaller) Paused0(opts *bind.CallOpts) (*big.Int, error)
⋮----
// PauserRegistry is a free data retrieval call binding the contract method 0x886f1195.
⋮----
// Solidity: function pauserRegistry() view returns(address)
func (_RewardsCoordinator *RewardsCoordinatorCaller) PauserRegistry(opts *bind.CallOpts) (common.Address, error)
⋮----
// PermissionController is a free data retrieval call binding the contract method 0x4657e26a.
⋮----
// Solidity: function permissionController() view returns(address)
func (_RewardsCoordinator *RewardsCoordinatorCaller) PermissionController(opts *bind.CallOpts) (common.Address, error)
⋮----
// RewardsUpdater is a free data retrieval call binding the contract method 0xfbf1e2c1.
⋮----
// Solidity: function rewardsUpdater() view returns(address)
func (_RewardsCoordinator *RewardsCoordinatorCaller) RewardsUpdater(opts *bind.CallOpts) (common.Address, error)
⋮----
// StrategyManager is a free data retrieval call binding the contract method 0x39b70e38.
⋮----
// Solidity: function strategyManager() view returns(address)
func (_RewardsCoordinator *RewardsCoordinatorCaller) StrategyManager(opts *bind.CallOpts) (common.Address, error)
⋮----
// SubmissionNonce is a free data retrieval call binding the contract method 0xbb7e451f.
⋮----
// Solidity: function submissionNonce(address avs) view returns(uint256 nonce)
func (_RewardsCoordinator *RewardsCoordinatorCaller) SubmissionNonce(opts *bind.CallOpts, avs common.Address) (*big.Int, error)
⋮----
// CreateAVSRewardsSubmission is a paid mutator transaction binding the contract method 0xfce36c7d.
⋮----
// Solidity: function createAVSRewardsSubmission(((address,uint96)[],address,uint256,uint32,uint32)[] rewardsSubmissions) returns()
func (_RewardsCoordinator *RewardsCoordinatorTransactor) CreateAVSRewardsSubmission(opts *bind.TransactOpts, rewardsSubmissions []IRewardsCoordinatorTypesRewardsSubmission) (*types.Transaction, error)
⋮----
// 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)
⋮----
// 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()
func (_RewardsCoordinator *RewardsCoordinatorTransactor) CreateOperatorDirectedAVSRewardsSubmission(opts *bind.TransactOpts, avs common.Address, operatorDirectedRewardsSubmissions []IRewardsCoordinatorTypesOperatorDirectedRewardsSubmission) (*types.Transaction, error)
⋮----
// CreateOperatorDirectedOperatorSetRewardsSubmission is a paid mutator transaction binding the contract method 0x0ca29899.
⋮----
// Solidity: function createOperatorDirectedOperatorSetRewardsSubmission((address,uint32) operatorSet, ((address,uint96)[],address,(address,uint256)[],uint32,uint32,string)[] operatorDirectedRewardsSubmissions) returns()
func (_RewardsCoordinator *RewardsCoordinatorTransactor) CreateOperatorDirectedOperatorSetRewardsSubmission(opts *bind.TransactOpts, operatorSet OperatorSet, operatorDirectedRewardsSubmissions []IRewardsCoordinatorTypesOperatorDirectedRewardsSubmission) (*types.Transaction, error)
⋮----
// CreateRewardsForAllEarners is a paid mutator transaction binding the contract method 0xff9f6cce.
⋮----
// Solidity: function createRewardsForAllEarners(((address,uint96)[],address,uint256,uint32,uint32)[] rewardsSubmissions) returns()
func (_RewardsCoordinator *RewardsCoordinatorTransactor) CreateRewardsForAllEarners(opts *bind.TransactOpts, rewardsSubmissions []IRewardsCoordinatorTypesRewardsSubmission) (*types.Transaction, error)
⋮----
// CreateRewardsForAllSubmission is a paid mutator transaction binding the contract method 0x36af41fa.
⋮----
// Solidity: function createRewardsForAllSubmission(((address,uint96)[],address,uint256,uint32,uint32)[] rewardsSubmissions) returns()
func (_RewardsCoordinator *RewardsCoordinatorTransactor) CreateRewardsForAllSubmission(opts *bind.TransactOpts, rewardsSubmissions []IRewardsCoordinatorTypesRewardsSubmission) (*types.Transaction, error)
⋮----
// CreateTotalStakeRewardsSubmission is a paid mutator transaction binding the contract method 0x8cb0ae1b.
⋮----
// Solidity: function createTotalStakeRewardsSubmission((address,uint32) operatorSet, ((address,uint96)[],address,uint256,uint32,uint32)[] rewardsSubmissions) returns()
func (_RewardsCoordinator *RewardsCoordinatorTransactor) CreateTotalStakeRewardsSubmission(opts *bind.TransactOpts, operatorSet OperatorSet, rewardsSubmissions []IRewardsCoordinatorTypesRewardsSubmission) (*types.Transaction, error)
⋮----
// CreateUniqueStakeRewardsSubmission is a paid mutator transaction binding the contract method 0x7ae30583.
⋮----
// Solidity: function createUniqueStakeRewardsSubmission((address,uint32) operatorSet, ((address,uint96)[],address,uint256,uint32,uint32)[] rewardsSubmissions) returns()
func (_RewardsCoordinator *RewardsCoordinatorTransactor) CreateUniqueStakeRewardsSubmission(opts *bind.TransactOpts, operatorSet OperatorSet, rewardsSubmissions []IRewardsCoordinatorTypesRewardsSubmission) (*types.Transaction, error)
⋮----
// DisableRoot is a paid mutator transaction binding the contract method 0xf96abf2e.
⋮----
// Solidity: function disableRoot(uint32 rootIndex) returns()
func (_RewardsCoordinator *RewardsCoordinatorTransactor) DisableRoot(opts *bind.TransactOpts, rootIndex uint32) (*types.Transaction, error)
⋮----
// Initialize is a paid mutator transaction binding the contract method 0xacad7299.
⋮----
// 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)
⋮----
// Pause is a paid mutator transaction binding the contract method 0x136439dd.
⋮----
// Solidity: function pause(uint256 newPausedStatus) returns()
func (_RewardsCoordinator *RewardsCoordinatorTransactor) Pause(opts *bind.TransactOpts, newPausedStatus *big.Int) (*types.Transaction, error)
⋮----
// PauseAll is a paid mutator transaction binding the contract method 0x595c6a67.
⋮----
// Solidity: function pauseAll() returns()
func (_RewardsCoordinator *RewardsCoordinatorTransactor) PauseAll(opts *bind.TransactOpts) (*types.Transaction, error)
⋮----
// ProcessClaim is a paid mutator transaction binding the contract method 0x3ccc861d.
⋮----
// Solidity: function processClaim((uint32,uint32,bytes,(address,bytes32),uint32[],bytes[],(address,uint256)[]) claim, address recipient) returns()
func (_RewardsCoordinator *RewardsCoordinatorTransactor) ProcessClaim(opts *bind.TransactOpts, claim IRewardsCoordinatorTypesRewardsMerkleClaim, recipient common.Address) (*types.Transaction, error)
⋮----
// ProcessClaims is a paid mutator transaction binding the contract method 0x4596021c.
⋮----
// Solidity: function processClaims((uint32,uint32,bytes,(address,bytes32),uint32[],bytes[],(address,uint256)[])[] claims, address recipient) returns()
func (_RewardsCoordinator *RewardsCoordinatorTransactor) ProcessClaims(opts *bind.TransactOpts, claims []IRewardsCoordinatorTypesRewardsMerkleClaim, recipient common.Address) (*types.Transaction, error)
⋮----
// RenounceOwnership is a paid mutator transaction binding the contract method 0x715018a6.
⋮----
// Solidity: function renounceOwnership() returns()
func (_RewardsCoordinator *RewardsCoordinatorTransactor) RenounceOwnership(opts *bind.TransactOpts) (*types.Transaction, error)
⋮----
// SetActivationDelay is a paid mutator transaction binding the contract method 0x58baaa3e.
⋮----
// Solidity: function setActivationDelay(uint32 _activationDelay) returns()
func (_RewardsCoordinator *RewardsCoordinatorTransactor) SetActivationDelay(opts *bind.TransactOpts, _activationDelay uint32) (*types.Transaction, error)
⋮----
// SetClaimerFor is a paid mutator transaction binding the contract method 0xa0169ddd.
⋮----
// Solidity: function setClaimerFor(address claimer) returns()
func (_RewardsCoordinator *RewardsCoordinatorTransactor) SetClaimerFor(opts *bind.TransactOpts, claimer common.Address) (*types.Transaction, error)
⋮----
// SetClaimerFor0 is a paid mutator transaction binding the contract method 0xf22cef85.
⋮----
// Solidity: function setClaimerFor(address earner, address claimer) returns()
func (_RewardsCoordinator *RewardsCoordinatorTransactor) SetClaimerFor0(opts *bind.TransactOpts, earner common.Address, claimer common.Address) (*types.Transaction, error)
⋮----
// SetDefaultOperatorSplit is a paid mutator transaction binding the contract method 0xa50a1d9c.
⋮----
// Solidity: function setDefaultOperatorSplit(uint16 split) returns()
func (_RewardsCoordinator *RewardsCoordinatorTransactor) SetDefaultOperatorSplit(opts *bind.TransactOpts, split uint16) (*types.Transaction, error)
⋮----
// 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)
⋮----
// SetOperatorAVSSplit is a paid mutator transaction binding the contract method 0xdcbb03b3.
⋮----
// Solidity: function setOperatorAVSSplit(address operator, address avs, uint16 split) returns()
func (_RewardsCoordinator *RewardsCoordinatorTransactor) SetOperatorAVSSplit(opts *bind.TransactOpts, operator common.Address, avs common.Address, split uint16) (*types.Transaction, error)
⋮----
// SetOperatorPISplit is a paid mutator transaction binding the contract method 0xb3dbb0e0.
⋮----
// Solidity: function setOperatorPISplit(address operator, uint16 split) returns()
func (_RewardsCoordinator *RewardsCoordinatorTransactor) SetOperatorPISplit(opts *bind.TransactOpts, operator common.Address, split uint16) (*types.Transaction, error)
⋮----
// SetOperatorSetSplit is a paid mutator transaction binding the contract method 0xf74e8eac.
⋮----
// Solidity: function setOperatorSetSplit(address operator, (address,uint32) operatorSet, uint16 split) returns()
func (_RewardsCoordinator *RewardsCoordinatorTransactor) SetOperatorSetSplit(opts *bind.TransactOpts, operator common.Address, operatorSet OperatorSet, split uint16) (*types.Transaction, error)
⋮----
// 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)
⋮----
// SetRewardsForAllSubmitter is a paid mutator transaction binding the contract method 0x0eb38345.
⋮----
// Solidity: function setRewardsForAllSubmitter(address _submitter, bool _newValue) returns()
func (_RewardsCoordinator *RewardsCoordinatorTransactor) SetRewardsForAllSubmitter(opts *bind.TransactOpts, _submitter common.Address, _newValue bool) (*types.Transaction, error)
⋮----
// SetRewardsUpdater is a paid mutator transaction binding the contract method 0x863cb9a9.
⋮----
// Solidity: function setRewardsUpdater(address _rewardsUpdater) returns()
func (_RewardsCoordinator *RewardsCoordinatorTransactor) SetRewardsUpdater(opts *bind.TransactOpts, _rewardsUpdater common.Address) (*types.Transaction, error)
⋮----
// SubmitRoot is a paid mutator transaction binding the contract method 0x3efe1db6.
⋮----
// Solidity: function submitRoot(bytes32 root, uint32 rewardsCalculationEndTimestamp) returns()
func (_RewardsCoordinator *RewardsCoordinatorTransactor) SubmitRoot(opts *bind.TransactOpts, root [32]byte, rewardsCalculationEndTimestamp uint32) (*types.Transaction, error)
⋮----
// TransferOwnership is a paid mutator transaction binding the contract method 0xf2fde38b.
⋮----
// Solidity: function transferOwnership(address newOwner) returns()
func (_RewardsCoordinator *RewardsCoordinatorTransactor) TransferOwnership(opts *bind.TransactOpts, newOwner common.Address) (*types.Transaction, error)
⋮----
// Unpause is a paid mutator transaction binding the contract method 0xfabc1cbc.
⋮----
// Solidity: function unpause(uint256 newPausedStatus) returns()
func (_RewardsCoordinator *RewardsCoordinatorTransactor) Unpause(opts *bind.TransactOpts, newPausedStatus *big.Int) (*types.Transaction, error)
⋮----
// RewardsCoordinatorAVSRewardsSubmissionCreatedIterator is returned from FilterAVSRewardsSubmissionCreated and is used to iterate over the raw logs and unpacked data for AVSRewardsSubmissionCreated events raised by the RewardsCoordinator contract.
type RewardsCoordinatorAVSRewardsSubmissionCreatedIterator struct {
	Event *RewardsCoordinatorAVSRewardsSubmissionCreated // 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
}
⋮----
Event *RewardsCoordinatorAVSRewardsSubmissionCreated // 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 *RewardsCoordinatorAVSRewardsSubmissionCreatedIterator) Next() bool
⋮----
// If the iterator failed, stop iterating
⋮----
// If the iterator completed, deliver directly whatever's available
⋮----
// Iterator still in progress, wait for either a data or an error event
⋮----
// Error returns any retrieval or parsing error occurred during filtering.
func (it *RewardsCoordinatorAVSRewardsSubmissionCreatedIterator) Error() error
⋮----
// Close terminates the iteration process, releasing any pending underlying
// resources.
func (it *RewardsCoordinatorAVSRewardsSubmissionCreatedIterator) Close() error
⋮----
// RewardsCoordinatorAVSRewardsSubmissionCreated represents a AVSRewardsSubmissionCreated event raised by the RewardsCoordinator contract.
type RewardsCoordinatorAVSRewardsSubmissionCreated struct {
	Avs                   common.Address
	SubmissionNonce       *big.Int
	RewardsSubmissionHash [32]byte
	RewardsSubmission     IRewardsCoordinatorTypesRewardsSubmission
	Raw                   types.Log // Blockchain specific contextual infos
}
⋮----
Raw                   types.Log // Blockchain specific contextual infos
⋮----
// FilterAVSRewardsSubmissionCreated is a free log retrieval operation binding the contract event 0x450a367a380c4e339e5ae7340c8464ef27af7781ad9945cfe8abd828f89e6281.
⋮----
// Solidity: event AVSRewardsSubmissionCreated(address indexed avs, uint256 indexed submissionNonce, bytes32 indexed rewardsSubmissionHash, ((address,uint96)[],address,uint256,uint32,uint32) rewardsSubmission)
func (_RewardsCoordinator *RewardsCoordinatorFilterer) FilterAVSRewardsSubmissionCreated(opts *bind.FilterOpts, avs []common.Address, submissionNonce []*big.Int, rewardsSubmissionHash [][32]byte) (*RewardsCoordinatorAVSRewardsSubmissionCreatedIterator, error)
⋮----
var avsRule []interface{}
⋮----
var submissionNonceRule []interface{}
⋮----
var rewardsSubmissionHashRule []interface{}
⋮----
// WatchAVSRewardsSubmissionCreated is a free log subscription operation binding the contract event 0x450a367a380c4e339e5ae7340c8464ef27af7781ad9945cfe8abd828f89e6281.
⋮----
func (_RewardsCoordinator *RewardsCoordinatorFilterer) WatchAVSRewardsSubmissionCreated(opts *bind.WatchOpts, sink chan<- *RewardsCoordinatorAVSRewardsSubmissionCreated, avs []common.Address, submissionNonce []*big.Int, rewardsSubmissionHash [][32]byte) (event.Subscription, error)
⋮----
// New log arrived, parse the event and forward to the user
⋮----
// ParseAVSRewardsSubmissionCreated is a log parse operation binding the contract event 0x450a367a380c4e339e5ae7340c8464ef27af7781ad9945cfe8abd828f89e6281.
⋮----
func (_RewardsCoordinator *RewardsCoordinatorFilterer) ParseAVSRewardsSubmissionCreated(log types.Log) (*RewardsCoordinatorAVSRewardsSubmissionCreated, error)
⋮----
// RewardsCoordinatorActivationDelaySetIterator is returned from FilterActivationDelaySet and is used to iterate over the raw logs and unpacked data for ActivationDelaySet events raised by the RewardsCoordinator contract.
type RewardsCoordinatorActivationDelaySetIterator struct {
	Event *RewardsCoordinatorActivationDelaySet // 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
}
⋮----
Event *RewardsCoordinatorActivationDelaySet // Event containing the contract specifics and raw log
⋮----
// RewardsCoordinatorActivationDelaySet represents a ActivationDelaySet event raised by the RewardsCoordinator contract.
type RewardsCoordinatorActivationDelaySet struct {
	OldActivationDelay uint32
	NewActivationDelay uint32
	Raw                types.Log // Blockchain specific contextual infos
}
⋮----
Raw                types.Log // Blockchain specific contextual infos
⋮----
// FilterActivationDelaySet is a free log retrieval operation binding the contract event 0xaf557c6c02c208794817a705609cfa935f827312a1adfdd26494b6b95dd2b4b3.
⋮----
// Solidity: event ActivationDelaySet(uint32 oldActivationDelay, uint32 newActivationDelay)
func (_RewardsCoordinator *RewardsCoordinatorFilterer) FilterActivationDelaySet(opts *bind.FilterOpts) (*RewardsCoordinatorActivationDelaySetIterator, error)
⋮----
// WatchActivationDelaySet is a free log subscription operation binding the contract event 0xaf557c6c02c208794817a705609cfa935f827312a1adfdd26494b6b95dd2b4b3.
⋮----
func (_RewardsCoordinator *RewardsCoordinatorFilterer) WatchActivationDelaySet(opts *bind.WatchOpts, sink chan<- *RewardsCoordinatorActivationDelaySet) (event.Subscription, error)
⋮----
// ParseActivationDelaySet is a log parse operation binding the contract event 0xaf557c6c02c208794817a705609cfa935f827312a1adfdd26494b6b95dd2b4b3.
⋮----
func (_RewardsCoordinator *RewardsCoordinatorFilterer) ParseActivationDelaySet(log types.Log) (*RewardsCoordinatorActivationDelaySet, error)
⋮----
// RewardsCoordinatorClaimerForSetIterator is returned from FilterClaimerForSet and is used to iterate over the raw logs and unpacked data for ClaimerForSet events raised by the RewardsCoordinator contract.
type RewardsCoordinatorClaimerForSetIterator struct {
	Event *RewardsCoordinatorClaimerForSet // 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
}
⋮----
Event *RewardsCoordinatorClaimerForSet // Event containing the contract specifics and raw log
⋮----
// RewardsCoordinatorClaimerForSet represents a ClaimerForSet event raised by the RewardsCoordinator contract.
type RewardsCoordinatorClaimerForSet struct {
	Earner     common.Address
	OldClaimer common.Address
	Claimer    common.Address
	Raw        types.Log // Blockchain specific contextual infos
}
⋮----
Raw        types.Log // Blockchain specific contextual infos
⋮----
// FilterClaimerForSet is a free log retrieval operation binding the contract event 0xbab947934d42e0ad206f25c9cab18b5bb6ae144acfb00f40b4e3aa59590ca312.
⋮----
// Solidity: event ClaimerForSet(address indexed earner, address indexed oldClaimer, address indexed claimer)
func (_RewardsCoordinator *RewardsCoordinatorFilterer) FilterClaimerForSet(opts *bind.FilterOpts, earner []common.Address, oldClaimer []common.Address, claimer []common.Address) (*RewardsCoordinatorClaimerForSetIterator, error)
⋮----
var earnerRule []interface{}
⋮----
var oldClaimerRule []interface{}
⋮----
var claimerRule []interface{}
⋮----
// WatchClaimerForSet is a free log subscription operation binding the contract event 0xbab947934d42e0ad206f25c9cab18b5bb6ae144acfb00f40b4e3aa59590ca312.
⋮----
func (_RewardsCoordinator *RewardsCoordinatorFilterer) WatchClaimerForSet(opts *bind.WatchOpts, sink chan<- *RewardsCoordinatorClaimerForSet, earner []common.Address, oldClaimer []common.Address, claimer []common.Address) (event.Subscription, error)
⋮----
// ParseClaimerForSet is a log parse operation binding the contract event 0xbab947934d42e0ad206f25c9cab18b5bb6ae144acfb00f40b4e3aa59590ca312.
⋮----
func (_RewardsCoordinator *RewardsCoordinatorFilterer) ParseClaimerForSet(log types.Log) (*RewardsCoordinatorClaimerForSet, error)
⋮----
// RewardsCoordinatorDefaultOperatorSplitBipsSetIterator is returned from FilterDefaultOperatorSplitBipsSet and is used to iterate over the raw logs and unpacked data for DefaultOperatorSplitBipsSet events raised by the RewardsCoordinator contract.
type RewardsCoordinatorDefaultOperatorSplitBipsSetIterator struct {
	Event *RewardsCoordinatorDefaultOperatorSplitBipsSet // 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
}
⋮----
Event *RewardsCoordinatorDefaultOperatorSplitBipsSet // Event containing the contract specifics and raw log
⋮----
// RewardsCoordinatorDefaultOperatorSplitBipsSet represents a DefaultOperatorSplitBipsSet event raised by the RewardsCoordinator contract.
type RewardsCoordinatorDefaultOperatorSplitBipsSet struct {
	OldDefaultOperatorSplitBips uint16
	NewDefaultOperatorSplitBips uint16
	Raw                         types.Log // Blockchain specific contextual infos
}
⋮----
Raw                         types.Log // Blockchain specific contextual infos
⋮----
// FilterDefaultOperatorSplitBipsSet is a free log retrieval operation binding the contract event 0xe6cd4edfdcc1f6d130ab35f73d72378f3a642944fb4ee5bd84b7807a81ea1c4e.
⋮----
// Solidity: event DefaultOperatorSplitBipsSet(uint16 oldDefaultOperatorSplitBips, uint16 newDefaultOperatorSplitBips)
func (_RewardsCoordinator *RewardsCoordinatorFilterer) FilterDefaultOperatorSplitBipsSet(opts *bind.FilterOpts) (*RewardsCoordinatorDefaultOperatorSplitBipsSetIterator, error)
⋮----
// WatchDefaultOperatorSplitBipsSet is a free log subscription operation binding the contract event 0xe6cd4edfdcc1f6d130ab35f73d72378f3a642944fb4ee5bd84b7807a81ea1c4e.
⋮----
func (_RewardsCoordinator *RewardsCoordinatorFilterer) WatchDefaultOperatorSplitBipsSet(opts *bind.WatchOpts, sink chan<- *RewardsCoordinatorDefaultOperatorSplitBipsSet) (event.Subscription, error)
⋮----
// ParseDefaultOperatorSplitBipsSet is a log parse operation binding the contract event 0xe6cd4edfdcc1f6d130ab35f73d72378f3a642944fb4ee5bd84b7807a81ea1c4e.
⋮----
func (_RewardsCoordinator *RewardsCoordinatorFilterer) ParseDefaultOperatorSplitBipsSet(log types.Log) (*RewardsCoordinatorDefaultOperatorSplitBipsSet, error)
⋮----
// RewardsCoordinatorDistributionRootDisabledIterator is returned from FilterDistributionRootDisabled and is used to iterate over the raw logs and unpacked data for DistributionRootDisabled events raised by the RewardsCoordinator contract.
type RewardsCoordinatorDistributionRootDisabledIterator struct {
	Event *RewardsCoordinatorDistributionRootDisabled // 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
}
⋮----
Event *RewardsCoordinatorDistributionRootDisabled // Event containing the contract specifics and raw log
⋮----
// RewardsCoordinatorDistributionRootDisabled represents a DistributionRootDisabled event raised by the RewardsCoordinator contract.
type RewardsCoordinatorDistributionRootDisabled struct {
	RootIndex uint32
	Raw       types.Log // Blockchain specific contextual infos
}
⋮----
Raw       types.Log // Blockchain specific contextual infos
⋮----
// FilterDistributionRootDisabled is a free log retrieval operation binding the contract event 0xd850e6e5dfa497b72661fa73df2923464eaed9dc2ff1d3cb82bccbfeabe5c41e.
⋮----
// Solidity: event DistributionRootDisabled(uint32 indexed rootIndex)
func (_RewardsCoordinator *RewardsCoordinatorFilterer) FilterDistributionRootDisabled(opts *bind.FilterOpts, rootIndex []uint32) (*RewardsCoordinatorDistributionRootDisabledIterator, error)
⋮----
var rootIndexRule []interface{}
⋮----
// WatchDistributionRootDisabled is a free log subscription operation binding the contract event 0xd850e6e5dfa497b72661fa73df2923464eaed9dc2ff1d3cb82bccbfeabe5c41e.
⋮----
func (_RewardsCoordinator *RewardsCoordinatorFilterer) WatchDistributionRootDisabled(opts *bind.WatchOpts, sink chan<- *RewardsCoordinatorDistributionRootDisabled, rootIndex []uint32) (event.Subscription, error)
⋮----
// ParseDistributionRootDisabled is a log parse operation binding the contract event 0xd850e6e5dfa497b72661fa73df2923464eaed9dc2ff1d3cb82bccbfeabe5c41e.
⋮----
func (_RewardsCoordinator *RewardsCoordinatorFilterer) ParseDistributionRootDisabled(log types.Log) (*RewardsCoordinatorDistributionRootDisabled, error)
⋮----
// RewardsCoordinatorDistributionRootSubmittedIterator is returned from FilterDistributionRootSubmitted and is used to iterate over the raw logs and unpacked data for DistributionRootSubmitted events raised by the RewardsCoordinator contract.
type RewardsCoordinatorDistributionRootSubmittedIterator struct {
	Event *RewardsCoordinatorDistributionRootSubmitted // 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
}
⋮----
Event *RewardsCoordinatorDistributionRootSubmitted // Event containing the contract specifics and raw log
⋮----
// RewardsCoordinatorDistributionRootSubmitted represents a DistributionRootSubmitted event raised by the RewardsCoordinator contract.
type RewardsCoordinatorDistributionRootSubmitted struct {
	RootIndex                      uint32
	Root                           [32]byte
	RewardsCalculationEndTimestamp uint32
	ActivatedAt                    uint32
	Raw                            types.Log // Blockchain specific contextual infos
}
⋮----
Raw                            types.Log // Blockchain specific contextual infos
⋮----
// FilterDistributionRootSubmitted is a free log retrieval operation binding the contract event 0xecd866c3c158fa00bf34d803d5f6023000b57080bcb48af004c2b4b46b3afd08.
⋮----
// Solidity: event DistributionRootSubmitted(uint32 indexed rootIndex, bytes32 indexed root, uint32 indexed rewardsCalculationEndTimestamp, uint32 activatedAt)
func (_RewardsCoordinator *RewardsCoordinatorFilterer) FilterDistributionRootSubmitted(opts *bind.FilterOpts, rootIndex []uint32, root [][32]byte, rewardsCalculationEndTimestamp []uint32) (*RewardsCoordinatorDistributionRootSubmittedIterator, error)
⋮----
var rootRule []interface{}
⋮----
var rewardsCalculationEndTimestampRule []interface{}
⋮----
// WatchDistributionRootSubmitted is a free log subscription operation binding the contract event 0xecd866c3c158fa00bf34d803d5f6023000b57080bcb48af004c2b4b46b3afd08.
⋮----
func (_RewardsCoordinator *RewardsCoordinatorFilterer) WatchDistributionRootSubmitted(opts *bind.WatchOpts, sink chan<- *RewardsCoordinatorDistributionRootSubmitted, rootIndex []uint32, root [][32]byte, rewardsCalculationEndTimestamp []uint32) (event.Subscription, error)
⋮----
// ParseDistributionRootSubmitted is a log parse operation binding the contract event 0xecd866c3c158fa00bf34d803d5f6023000b57080bcb48af004c2b4b46b3afd08.
⋮----
func (_RewardsCoordinator *RewardsCoordinatorFilterer) ParseDistributionRootSubmitted(log types.Log) (*RewardsCoordinatorDistributionRootSubmitted, error)
⋮----
// 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
}
⋮----
Event *RewardsCoordinatorFeeRecipientSet // Event containing the contract specifics and raw log
⋮----
// 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
}
⋮----
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{}
⋮----
var newFeeRecipientRule []interface{}
⋮----
// WatchFeeRecipientSet is a free log subscription operation binding the contract event 0x15d80a013f22151bc7246e3bc132e12828cde19de98870475e3fa70840152721.
⋮----
func (_RewardsCoordinator *RewardsCoordinatorFilterer) WatchFeeRecipientSet(opts *bind.WatchOpts, sink chan<- *RewardsCoordinatorFeeRecipientSet, oldFeeRecipient []common.Address, newFeeRecipient []common.Address) (event.Subscription, error)
⋮----
// ParseFeeRecipientSet is a log parse operation binding the contract event 0x15d80a013f22151bc7246e3bc132e12828cde19de98870475e3fa70840152721.
⋮----
func (_RewardsCoordinator *RewardsCoordinatorFilterer) ParseFeeRecipientSet(log types.Log) (*RewardsCoordinatorFeeRecipientSet, error)
⋮----
// 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

	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
}
⋮----
Event *RewardsCoordinatorInitialized // Event containing the contract specifics and raw log
⋮----
// RewardsCoordinatorInitialized represents a Initialized event raised by the RewardsCoordinator contract.
type RewardsCoordinatorInitialized struct {
	Version uint8
	Raw     types.Log // Blockchain specific contextual infos
}
⋮----
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 (_RewardsCoordinator *RewardsCoordinatorFilterer) FilterInitialized(opts *bind.FilterOpts) (*RewardsCoordinatorInitializedIterator, error)
⋮----
// WatchInitialized is a free log subscription operation binding the contract event 0x7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb3847402498.
⋮----
func (_RewardsCoordinator *RewardsCoordinatorFilterer) WatchInitialized(opts *bind.WatchOpts, sink chan<- *RewardsCoordinatorInitialized) (event.Subscription, error)
⋮----
// ParseInitialized is a log parse operation binding the contract event 0x7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb3847402498.
⋮----
func (_RewardsCoordinator *RewardsCoordinatorFilterer) ParseInitialized(log types.Log) (*RewardsCoordinatorInitialized, error)
⋮----
// RewardsCoordinatorOperatorAVSSplitBipsSetIterator is returned from FilterOperatorAVSSplitBipsSet and is used to iterate over the raw logs and unpacked data for OperatorAVSSplitBipsSet events raised by the RewardsCoordinator contract.
type RewardsCoordinatorOperatorAVSSplitBipsSetIterator struct {
	Event *RewardsCoordinatorOperatorAVSSplitBipsSet // 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
}
⋮----
Event *RewardsCoordinatorOperatorAVSSplitBipsSet // Event containing the contract specifics and raw log
⋮----
// RewardsCoordinatorOperatorAVSSplitBipsSet represents a OperatorAVSSplitBipsSet event raised by the RewardsCoordinator contract.
type RewardsCoordinatorOperatorAVSSplitBipsSet struct {
	Caller                  common.Address
	Operator                common.Address
	Avs                     common.Address
	ActivatedAt             uint32
	OldOperatorAVSSplitBips uint16
	NewOperatorAVSSplitBips uint16
	Raw                     types.Log // Blockchain specific contextual infos
}
⋮----
Raw                     types.Log // Blockchain specific contextual infos
⋮----
// FilterOperatorAVSSplitBipsSet is a free log retrieval operation binding the contract event 0x48e198b6ae357e529204ee53a8e514c470ff77d9cc8e4f7207f8b5d490ae6934.
⋮----
// Solidity: event OperatorAVSSplitBipsSet(address indexed caller, address indexed operator, address indexed avs, uint32 activatedAt, uint16 oldOperatorAVSSplitBips, uint16 newOperatorAVSSplitBips)
func (_RewardsCoordinator *RewardsCoordinatorFilterer) FilterOperatorAVSSplitBipsSet(opts *bind.FilterOpts, caller []common.Address, operator []common.Address, avs []common.Address) (*RewardsCoordinatorOperatorAVSSplitBipsSetIterator, error)
⋮----
var callerRule []interface{}
⋮----
var operatorRule []interface{}
⋮----
// WatchOperatorAVSSplitBipsSet is a free log subscription operation binding the contract event 0x48e198b6ae357e529204ee53a8e514c470ff77d9cc8e4f7207f8b5d490ae6934.
⋮----
func (_RewardsCoordinator *RewardsCoordinatorFilterer) WatchOperatorAVSSplitBipsSet(opts *bind.WatchOpts, sink chan<- *RewardsCoordinatorOperatorAVSSplitBipsSet, caller []common.Address, operator []common.Address, avs []common.Address) (event.Subscription, error)
⋮----
// ParseOperatorAVSSplitBipsSet is a log parse operation binding the contract event 0x48e198b6ae357e529204ee53a8e514c470ff77d9cc8e4f7207f8b5d490ae6934.
⋮----
func (_RewardsCoordinator *RewardsCoordinatorFilterer) ParseOperatorAVSSplitBipsSet(log types.Log) (*RewardsCoordinatorOperatorAVSSplitBipsSet, error)
⋮----
// RewardsCoordinatorOperatorDirectedAVSRewardsSubmissionCreatedIterator is returned from FilterOperatorDirectedAVSRewardsSubmissionCreated and is used to iterate over the raw logs and unpacked data for OperatorDirectedAVSRewardsSubmissionCreated events raised by the RewardsCoordinator contract.
type RewardsCoordinatorOperatorDirectedAVSRewardsSubmissionCreatedIterator struct {
	Event *RewardsCoordinatorOperatorDirectedAVSRewardsSubmissionCreated // 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
}
⋮----
Event *RewardsCoordinatorOperatorDirectedAVSRewardsSubmissionCreated // Event containing the contract specifics and raw log
⋮----
// RewardsCoordinatorOperatorDirectedAVSRewardsSubmissionCreated represents a OperatorDirectedAVSRewardsSubmissionCreated event raised by the RewardsCoordinator contract.
type RewardsCoordinatorOperatorDirectedAVSRewardsSubmissionCreated struct {
	Caller                                common.Address
	Avs                                   common.Address
	OperatorDirectedRewardsSubmissionHash [32]byte
	SubmissionNonce                       *big.Int
	OperatorDirectedRewardsSubmission     IRewardsCoordinatorTypesOperatorDirectedRewardsSubmission
	Raw                                   types.Log // Blockchain specific contextual infos
}
⋮----
Raw                                   types.Log // Blockchain specific contextual infos
⋮----
// FilterOperatorDirectedAVSRewardsSubmissionCreated is a free log retrieval operation binding the contract event 0xfc8888bffd711da60bc5092b33f677d81896fe80ecc677b84cfab8184462b6e0.
⋮----
// Solidity: event OperatorDirectedAVSRewardsSubmissionCreated(address indexed caller, address indexed avs, bytes32 indexed operatorDirectedRewardsSubmissionHash, uint256 submissionNonce, ((address,uint96)[],address,(address,uint256)[],uint32,uint32,string) operatorDirectedRewardsSubmission)
func (_RewardsCoordinator *RewardsCoordinatorFilterer) FilterOperatorDirectedAVSRewardsSubmissionCreated(opts *bind.FilterOpts, caller []common.Address, avs []common.Address, operatorDirectedRewardsSubmissionHash [][32]byte) (*RewardsCoordinatorOperatorDirectedAVSRewardsSubmissionCreatedIterator, error)
⋮----
var operatorDirectedRewardsSubmissionHashRule []interface{}
⋮----
// WatchOperatorDirectedAVSRewardsSubmissionCreated is a free log subscription operation binding the contract event 0xfc8888bffd711da60bc5092b33f677d81896fe80ecc677b84cfab8184462b6e0.
⋮----
func (_RewardsCoordinator *RewardsCoordinatorFilterer) WatchOperatorDirectedAVSRewardsSubmissionCreated(opts *bind.WatchOpts, sink chan<- *RewardsCoordinatorOperatorDirectedAVSRewardsSubmissionCreated, caller []common.Address, avs []common.Address, operatorDirectedRewardsSubmissionHash [][32]byte) (event.Subscription, error)
⋮----
// ParseOperatorDirectedAVSRewardsSubmissionCreated is a log parse operation binding the contract event 0xfc8888bffd711da60bc5092b33f677d81896fe80ecc677b84cfab8184462b6e0.
⋮----
func (_RewardsCoordinator *RewardsCoordinatorFilterer) ParseOperatorDirectedAVSRewardsSubmissionCreated(log types.Log) (*RewardsCoordinatorOperatorDirectedAVSRewardsSubmissionCreated, error)
⋮----
// RewardsCoordinatorOperatorDirectedOperatorSetRewardsSubmissionCreatedIterator is returned from FilterOperatorDirectedOperatorSetRewardsSubmissionCreated and is used to iterate over the raw logs and unpacked data for OperatorDirectedOperatorSetRewardsSubmissionCreated events raised by the RewardsCoordinator contract.
type RewardsCoordinatorOperatorDirectedOperatorSetRewardsSubmissionCreatedIterator struct {
	Event *RewardsCoordinatorOperatorDirectedOperatorSetRewardsSubmissionCreated // 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
}
⋮----
Event *RewardsCoordinatorOperatorDirectedOperatorSetRewardsSubmissionCreated // Event containing the contract specifics and raw log
⋮----
// RewardsCoordinatorOperatorDirectedOperatorSetRewardsSubmissionCreated represents a OperatorDirectedOperatorSetRewardsSubmissionCreated event raised by the RewardsCoordinator contract.
type RewardsCoordinatorOperatorDirectedOperatorSetRewardsSubmissionCreated struct {
	Caller                                common.Address
	OperatorDirectedRewardsSubmissionHash [32]byte
	OperatorSet                           OperatorSet
	SubmissionNonce                       *big.Int
	OperatorDirectedRewardsSubmission     IRewardsCoordinatorTypesOperatorDirectedRewardsSubmission
	Raw                                   types.Log // Blockchain specific contextual infos
}
⋮----
// FilterOperatorDirectedOperatorSetRewardsSubmissionCreated is a free log retrieval operation binding the contract event 0xfff0759ccb371dfb5691798724e70b4fa61cb3bfe730a33ac19fb86a48efc756.
⋮----
// Solidity: event OperatorDirectedOperatorSetRewardsSubmissionCreated(address indexed caller, bytes32 indexed operatorDirectedRewardsSubmissionHash, (address,uint32) operatorSet, uint256 submissionNonce, ((address,uint96)[],address,(address,uint256)[],uint32,uint32,string) operatorDirectedRewardsSubmission)
func (_RewardsCoordinator *RewardsCoordinatorFilterer) FilterOperatorDirectedOperatorSetRewardsSubmissionCreated(opts *bind.FilterOpts, caller []common.Address, operatorDirectedRewardsSubmissionHash [][32]byte) (*RewardsCoordinatorOperatorDirectedOperatorSetRewardsSubmissionCreatedIterator, error)
⋮----
// WatchOperatorDirectedOperatorSetRewardsSubmissionCreated is a free log subscription operation binding the contract event 0xfff0759ccb371dfb5691798724e70b4fa61cb3bfe730a33ac19fb86a48efc756.
⋮----
func (_RewardsCoordinator *RewardsCoordinatorFilterer) WatchOperatorDirectedOperatorSetRewardsSubmissionCreated(opts *bind.WatchOpts, sink chan<- *RewardsCoordinatorOperatorDirectedOperatorSetRewardsSubmissionCreated, caller []common.Address, operatorDirectedRewardsSubmissionHash [][32]byte) (event.Subscription, error)
⋮----
// ParseOperatorDirectedOperatorSetRewardsSubmissionCreated is a log parse operation binding the contract event 0xfff0759ccb371dfb5691798724e70b4fa61cb3bfe730a33ac19fb86a48efc756.
⋮----
func (_RewardsCoordinator *RewardsCoordinatorFilterer) ParseOperatorDirectedOperatorSetRewardsSubmissionCreated(log types.Log) (*RewardsCoordinatorOperatorDirectedOperatorSetRewardsSubmissionCreated, error)
⋮----
// RewardsCoordinatorOperatorPISplitBipsSetIterator is returned from FilterOperatorPISplitBipsSet and is used to iterate over the raw logs and unpacked data for OperatorPISplitBipsSet events raised by the RewardsCoordinator contract.
type RewardsCoordinatorOperatorPISplitBipsSetIterator struct {
	Event *RewardsCoordinatorOperatorPISplitBipsSet // 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
}
⋮----
Event *RewardsCoordinatorOperatorPISplitBipsSet // Event containing the contract specifics and raw log
⋮----
// RewardsCoordinatorOperatorPISplitBipsSet represents a OperatorPISplitBipsSet event raised by the RewardsCoordinator contract.
type RewardsCoordinatorOperatorPISplitBipsSet struct {
	Caller                 common.Address
	Operator               common.Address
	ActivatedAt            uint32
	OldOperatorPISplitBips uint16
	NewOperatorPISplitBips uint16
	Raw                    types.Log // Blockchain specific contextual infos
}
⋮----
Raw                    types.Log // Blockchain specific contextual infos
⋮----
// FilterOperatorPISplitBipsSet is a free log retrieval operation binding the contract event 0xd1e028bd664486a46ad26040e999cd2d22e1e9a094ee6afe19fcf64678f16f74.
⋮----
// Solidity: event OperatorPISplitBipsSet(address indexed caller, address indexed operator, uint32 activatedAt, uint16 oldOperatorPISplitBips, uint16 newOperatorPISplitBips)
func (_RewardsCoordinator *RewardsCoordinatorFilterer) FilterOperatorPISplitBipsSet(opts *bind.FilterOpts, caller []common.Address, operator []common.Address) (*RewardsCoordinatorOperatorPISplitBipsSetIterator, error)
⋮----
// WatchOperatorPISplitBipsSet is a free log subscription operation binding the contract event 0xd1e028bd664486a46ad26040e999cd2d22e1e9a094ee6afe19fcf64678f16f74.
⋮----
func (_RewardsCoordinator *RewardsCoordinatorFilterer) WatchOperatorPISplitBipsSet(opts *bind.WatchOpts, sink chan<- *RewardsCoordinatorOperatorPISplitBipsSet, caller []common.Address, operator []common.Address) (event.Subscription, error)
⋮----
// ParseOperatorPISplitBipsSet is a log parse operation binding the contract event 0xd1e028bd664486a46ad26040e999cd2d22e1e9a094ee6afe19fcf64678f16f74.
⋮----
func (_RewardsCoordinator *RewardsCoordinatorFilterer) ParseOperatorPISplitBipsSet(log types.Log) (*RewardsCoordinatorOperatorPISplitBipsSet, error)
⋮----
// RewardsCoordinatorOperatorSetSplitBipsSetIterator is returned from FilterOperatorSetSplitBipsSet and is used to iterate over the raw logs and unpacked data for OperatorSetSplitBipsSet events raised by the RewardsCoordinator contract.
type RewardsCoordinatorOperatorSetSplitBipsSetIterator struct {
	Event *RewardsCoordinatorOperatorSetSplitBipsSet // 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
}
⋮----
Event *RewardsCoordinatorOperatorSetSplitBipsSet // Event containing the contract specifics and raw log
⋮----
// RewardsCoordinatorOperatorSetSplitBipsSet represents a OperatorSetSplitBipsSet event raised by the RewardsCoordinator contract.
type RewardsCoordinatorOperatorSetSplitBipsSet struct {
	Caller                  common.Address
	Operator                common.Address
	OperatorSet             OperatorSet
	ActivatedAt             uint32
	OldOperatorSetSplitBips uint16
	NewOperatorSetSplitBips uint16
	Raw                     types.Log // Blockchain specific contextual infos
}
⋮----
// FilterOperatorSetSplitBipsSet is a free log retrieval operation binding the contract event 0x14918b3834ab6752eb2e1b489b6663a67810efb5f56f3944a97ede8ecf1fd9f1.
⋮----
// Solidity: event OperatorSetSplitBipsSet(address indexed caller, address indexed operator, (address,uint32) operatorSet, uint32 activatedAt, uint16 oldOperatorSetSplitBips, uint16 newOperatorSetSplitBips)
func (_RewardsCoordinator *RewardsCoordinatorFilterer) FilterOperatorSetSplitBipsSet(opts *bind.FilterOpts, caller []common.Address, operator []common.Address) (*RewardsCoordinatorOperatorSetSplitBipsSetIterator, error)
⋮----
// WatchOperatorSetSplitBipsSet is a free log subscription operation binding the contract event 0x14918b3834ab6752eb2e1b489b6663a67810efb5f56f3944a97ede8ecf1fd9f1.
⋮----
func (_RewardsCoordinator *RewardsCoordinatorFilterer) WatchOperatorSetSplitBipsSet(opts *bind.WatchOpts, sink chan<- *RewardsCoordinatorOperatorSetSplitBipsSet, caller []common.Address, operator []common.Address) (event.Subscription, error)
⋮----
// ParseOperatorSetSplitBipsSet is a log parse operation binding the contract event 0x14918b3834ab6752eb2e1b489b6663a67810efb5f56f3944a97ede8ecf1fd9f1.
⋮----
func (_RewardsCoordinator *RewardsCoordinatorFilterer) ParseOperatorSetSplitBipsSet(log types.Log) (*RewardsCoordinatorOperatorSetSplitBipsSet, error)
⋮----
// 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
}
⋮----
Event *RewardsCoordinatorOptInForProtocolFeeSet // Event containing the contract specifics and raw log
⋮----
// 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{}
⋮----
var oldValueRule []interface{}
⋮----
var newValueRule []interface{}
⋮----
// WatchOptInForProtocolFeeSet is a free log subscription operation binding the contract event 0xbb020e17dc9a72ff25958029a3ddf0c05cebaac105769b31b6238aaca3910cd2.
⋮----
func (_RewardsCoordinator *RewardsCoordinatorFilterer) WatchOptInForProtocolFeeSet(opts *bind.WatchOpts, sink chan<- *RewardsCoordinatorOptInForProtocolFeeSet, submitter []common.Address, oldValue []bool, newValue []bool) (event.Subscription, error)
⋮----
// ParseOptInForProtocolFeeSet is a log parse operation binding the contract event 0xbb020e17dc9a72ff25958029a3ddf0c05cebaac105769b31b6238aaca3910cd2.
⋮----
func (_RewardsCoordinator *RewardsCoordinatorFilterer) ParseOptInForProtocolFeeSet(log types.Log) (*RewardsCoordinatorOptInForProtocolFeeSet, error)
⋮----
// 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

	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
}
⋮----
Event *RewardsCoordinatorOwnershipTransferred // Event containing the contract specifics and raw log
⋮----
// RewardsCoordinatorOwnershipTransferred represents a OwnershipTransferred event raised by the RewardsCoordinator contract.
type RewardsCoordinatorOwnershipTransferred struct {
	PreviousOwner common.Address
	NewOwner      common.Address
	Raw           types.Log // Blockchain specific contextual infos
}
⋮----
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 (_RewardsCoordinator *RewardsCoordinatorFilterer) FilterOwnershipTransferred(opts *bind.FilterOpts, previousOwner []common.Address, newOwner []common.Address) (*RewardsCoordinatorOwnershipTransferredIterator, error)
⋮----
var previousOwnerRule []interface{}
⋮----
var newOwnerRule []interface{}
⋮----
// WatchOwnershipTransferred is a free log subscription operation binding the contract event 0x8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0.
⋮----
func (_RewardsCoordinator *RewardsCoordinatorFilterer) WatchOwnershipTransferred(opts *bind.WatchOpts, sink chan<- *RewardsCoordinatorOwnershipTransferred, previousOwner []common.Address, newOwner []common.Address) (event.Subscription, error)
⋮----
// ParseOwnershipTransferred is a log parse operation binding the contract event 0x8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0.
⋮----
func (_RewardsCoordinator *RewardsCoordinatorFilterer) ParseOwnershipTransferred(log types.Log) (*RewardsCoordinatorOwnershipTransferred, error)
⋮----
// RewardsCoordinatorPausedIterator is returned from FilterPaused and is used to iterate over the raw logs and unpacked data for Paused events raised by the RewardsCoordinator contract.
type RewardsCoordinatorPausedIterator struct {
	Event *RewardsCoordinatorPaused // 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
}
⋮----
Event *RewardsCoordinatorPaused // Event containing the contract specifics and raw log
⋮----
// RewardsCoordinatorPaused represents a Paused event raised by the RewardsCoordinator contract.
type RewardsCoordinatorPaused 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 (_RewardsCoordinator *RewardsCoordinatorFilterer) FilterPaused(opts *bind.FilterOpts, account []common.Address) (*RewardsCoordinatorPausedIterator, error)
⋮----
var accountRule []interface{}
⋮----
// WatchPaused is a free log subscription operation binding the contract event 0xab40a374bc51de372200a8bc981af8c9ecdc08dfdaef0bb6e09f88f3c616ef3d.
⋮----
func (_RewardsCoordinator *RewardsCoordinatorFilterer) WatchPaused(opts *bind.WatchOpts, sink chan<- *RewardsCoordinatorPaused, account []common.Address) (event.Subscription, error)
⋮----
// ParsePaused is a log parse operation binding the contract event 0xab40a374bc51de372200a8bc981af8c9ecdc08dfdaef0bb6e09f88f3c616ef3d.
⋮----
func (_RewardsCoordinator *RewardsCoordinatorFilterer) ParsePaused(log types.Log) (*RewardsCoordinatorPaused, error)
⋮----
// RewardsCoordinatorRewardsClaimedIterator is returned from FilterRewardsClaimed and is used to iterate over the raw logs and unpacked data for RewardsClaimed events raised by the RewardsCoordinator contract.
type RewardsCoordinatorRewardsClaimedIterator struct {
	Event *RewardsCoordinatorRewardsClaimed // 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
}
⋮----
Event *RewardsCoordinatorRewardsClaimed // Event containing the contract specifics and raw log
⋮----
// RewardsCoordinatorRewardsClaimed represents a RewardsClaimed event raised by the RewardsCoordinator contract.
type RewardsCoordinatorRewardsClaimed struct {
	Root          [32]byte
	Earner        common.Address
	Claimer       common.Address
	Recipient     common.Address
	Token         common.Address
	ClaimedAmount *big.Int
	Raw           types.Log // Blockchain specific contextual infos
}
⋮----
// FilterRewardsClaimed is a free log retrieval operation binding the contract event 0x9543dbd55580842586a951f0386e24d68a5df99ae29e3b216588b45fd684ce31.
⋮----
// Solidity: event RewardsClaimed(bytes32 root, address indexed earner, address indexed claimer, address indexed recipient, address token, uint256 claimedAmount)
func (_RewardsCoordinator *RewardsCoordinatorFilterer) FilterRewardsClaimed(opts *bind.FilterOpts, earner []common.Address, claimer []common.Address, recipient []common.Address) (*RewardsCoordinatorRewardsClaimedIterator, error)
⋮----
var recipientRule []interface{}
⋮----
// WatchRewardsClaimed is a free log subscription operation binding the contract event 0x9543dbd55580842586a951f0386e24d68a5df99ae29e3b216588b45fd684ce31.
⋮----
func (_RewardsCoordinator *RewardsCoordinatorFilterer) WatchRewardsClaimed(opts *bind.WatchOpts, sink chan<- *RewardsCoordinatorRewardsClaimed, earner []common.Address, claimer []common.Address, recipient []common.Address) (event.Subscription, error)
⋮----
// ParseRewardsClaimed is a log parse operation binding the contract event 0x9543dbd55580842586a951f0386e24d68a5df99ae29e3b216588b45fd684ce31.
⋮----
func (_RewardsCoordinator *RewardsCoordinatorFilterer) ParseRewardsClaimed(log types.Log) (*RewardsCoordinatorRewardsClaimed, error)
⋮----
// RewardsCoordinatorRewardsForAllSubmitterSetIterator is returned from FilterRewardsForAllSubmitterSet and is used to iterate over the raw logs and unpacked data for RewardsForAllSubmitterSet events raised by the RewardsCoordinator contract.
type RewardsCoordinatorRewardsForAllSubmitterSetIterator struct {
	Event *RewardsCoordinatorRewardsForAllSubmitterSet // 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
}
⋮----
Event *RewardsCoordinatorRewardsForAllSubmitterSet // Event containing the contract specifics and raw log
⋮----
// RewardsCoordinatorRewardsForAllSubmitterSet represents a RewardsForAllSubmitterSet event raised by the RewardsCoordinator contract.
type RewardsCoordinatorRewardsForAllSubmitterSet struct {
	RewardsForAllSubmitter common.Address
	OldValue               bool
	NewValue               bool
	Raw                    types.Log // Blockchain specific contextual infos
}
⋮----
// FilterRewardsForAllSubmitterSet is a free log retrieval operation binding the contract event 0x4de6293e668df1398422e1def12118052c1539a03cbfedc145895d48d7685f1c.
⋮----
// Solidity: event RewardsForAllSubmitterSet(address indexed rewardsForAllSubmitter, bool indexed oldValue, bool indexed newValue)
func (_RewardsCoordinator *RewardsCoordinatorFilterer) FilterRewardsForAllSubmitterSet(opts *bind.FilterOpts, rewardsForAllSubmitter []common.Address, oldValue []bool, newValue []bool) (*RewardsCoordinatorRewardsForAllSubmitterSetIterator, error)
⋮----
var rewardsForAllSubmitterRule []interface{}
⋮----
// WatchRewardsForAllSubmitterSet is a free log subscription operation binding the contract event 0x4de6293e668df1398422e1def12118052c1539a03cbfedc145895d48d7685f1c.
⋮----
func (_RewardsCoordinator *RewardsCoordinatorFilterer) WatchRewardsForAllSubmitterSet(opts *bind.WatchOpts, sink chan<- *RewardsCoordinatorRewardsForAllSubmitterSet, rewardsForAllSubmitter []common.Address, oldValue []bool, newValue []bool) (event.Subscription, error)
⋮----
// ParseRewardsForAllSubmitterSet is a log parse operation binding the contract event 0x4de6293e668df1398422e1def12118052c1539a03cbfedc145895d48d7685f1c.
⋮----
func (_RewardsCoordinator *RewardsCoordinatorFilterer) ParseRewardsForAllSubmitterSet(log types.Log) (*RewardsCoordinatorRewardsForAllSubmitterSet, error)
⋮----
// RewardsCoordinatorRewardsSubmissionForAllCreatedIterator is returned from FilterRewardsSubmissionForAllCreated and is used to iterate over the raw logs and unpacked data for RewardsSubmissionForAllCreated events raised by the RewardsCoordinator contract.
type RewardsCoordinatorRewardsSubmissionForAllCreatedIterator struct {
	Event *RewardsCoordinatorRewardsSubmissionForAllCreated // 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
}
⋮----
Event *RewardsCoordinatorRewardsSubmissionForAllCreated // Event containing the contract specifics and raw log
⋮----
// RewardsCoordinatorRewardsSubmissionForAllCreated represents a RewardsSubmissionForAllCreated event raised by the RewardsCoordinator contract.
type RewardsCoordinatorRewardsSubmissionForAllCreated struct {
	Submitter             common.Address
	SubmissionNonce       *big.Int
	RewardsSubmissionHash [32]byte
	RewardsSubmission     IRewardsCoordinatorTypesRewardsSubmission
	Raw                   types.Log // Blockchain specific contextual infos
}
⋮----
// FilterRewardsSubmissionForAllCreated is a free log retrieval operation binding the contract event 0x51088b8c89628df3a8174002c2a034d0152fce6af8415d651b2a4734bf270482.
⋮----
// Solidity: event RewardsSubmissionForAllCreated(address indexed submitter, uint256 indexed submissionNonce, bytes32 indexed rewardsSubmissionHash, ((address,uint96)[],address,uint256,uint32,uint32) rewardsSubmission)
func (_RewardsCoordinator *RewardsCoordinatorFilterer) FilterRewardsSubmissionForAllCreated(opts *bind.FilterOpts, submitter []common.Address, submissionNonce []*big.Int, rewardsSubmissionHash [][32]byte) (*RewardsCoordinatorRewardsSubmissionForAllCreatedIterator, error)
⋮----
// WatchRewardsSubmissionForAllCreated is a free log subscription operation binding the contract event 0x51088b8c89628df3a8174002c2a034d0152fce6af8415d651b2a4734bf270482.
⋮----
func (_RewardsCoordinator *RewardsCoordinatorFilterer) WatchRewardsSubmissionForAllCreated(opts *bind.WatchOpts, sink chan<- *RewardsCoordinatorRewardsSubmissionForAllCreated, submitter []common.Address, submissionNonce []*big.Int, rewardsSubmissionHash [][32]byte) (event.Subscription, error)
⋮----
// ParseRewardsSubmissionForAllCreated is a log parse operation binding the contract event 0x51088b8c89628df3a8174002c2a034d0152fce6af8415d651b2a4734bf270482.
⋮----
func (_RewardsCoordinator *RewardsCoordinatorFilterer) ParseRewardsSubmissionForAllCreated(log types.Log) (*RewardsCoordinatorRewardsSubmissionForAllCreated, error)
⋮----
// RewardsCoordinatorRewardsSubmissionForAllEarnersCreatedIterator is returned from FilterRewardsSubmissionForAllEarnersCreated and is used to iterate over the raw logs and unpacked data for RewardsSubmissionForAllEarnersCreated events raised by the RewardsCoordinator contract.
type RewardsCoordinatorRewardsSubmissionForAllEarnersCreatedIterator struct {
	Event *RewardsCoordinatorRewardsSubmissionForAllEarnersCreated // 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
}
⋮----
Event *RewardsCoordinatorRewardsSubmissionForAllEarnersCreated // Event containing the contract specifics and raw log
⋮----
// RewardsCoordinatorRewardsSubmissionForAllEarnersCreated represents a RewardsSubmissionForAllEarnersCreated event raised by the RewardsCoordinator contract.
type RewardsCoordinatorRewardsSubmissionForAllEarnersCreated struct {
	TokenHopper           common.Address
	SubmissionNonce       *big.Int
	RewardsSubmissionHash [32]byte
	RewardsSubmission     IRewardsCoordinatorTypesRewardsSubmission
	Raw                   types.Log // Blockchain specific contextual infos
}
⋮----
// FilterRewardsSubmissionForAllEarnersCreated is a free log retrieval operation binding the contract event 0x5251b6fdefcb5d81144e735f69ea4c695fd43b0289ca53dc075033f5fc80068b.
⋮----
// Solidity: event RewardsSubmissionForAllEarnersCreated(address indexed tokenHopper, uint256 indexed submissionNonce, bytes32 indexed rewardsSubmissionHash, ((address,uint96)[],address,uint256,uint32,uint32) rewardsSubmission)
func (_RewardsCoordinator *RewardsCoordinatorFilterer) FilterRewardsSubmissionForAllEarnersCreated(opts *bind.FilterOpts, tokenHopper []common.Address, submissionNonce []*big.Int, rewardsSubmissionHash [][32]byte) (*RewardsCoordinatorRewardsSubmissionForAllEarnersCreatedIterator, error)
⋮----
var tokenHopperRule []interface{}
⋮----
// WatchRewardsSubmissionForAllEarnersCreated is a free log subscription operation binding the contract event 0x5251b6fdefcb5d81144e735f69ea4c695fd43b0289ca53dc075033f5fc80068b.
⋮----
func (_RewardsCoordinator *RewardsCoordinatorFilterer) WatchRewardsSubmissionForAllEarnersCreated(opts *bind.WatchOpts, sink chan<- *RewardsCoordinatorRewardsSubmissionForAllEarnersCreated, tokenHopper []common.Address, submissionNonce []*big.Int, rewardsSubmissionHash [][32]byte) (event.Subscription, error)
⋮----
// ParseRewardsSubmissionForAllEarnersCreated is a log parse operation binding the contract event 0x5251b6fdefcb5d81144e735f69ea4c695fd43b0289ca53dc075033f5fc80068b.
⋮----
func (_RewardsCoordinator *RewardsCoordinatorFilterer) ParseRewardsSubmissionForAllEarnersCreated(log types.Log) (*RewardsCoordinatorRewardsSubmissionForAllEarnersCreated, error)
⋮----
// RewardsCoordinatorRewardsUpdaterSetIterator is returned from FilterRewardsUpdaterSet and is used to iterate over the raw logs and unpacked data for RewardsUpdaterSet events raised by the RewardsCoordinator contract.
type RewardsCoordinatorRewardsUpdaterSetIterator struct {
	Event *RewardsCoordinatorRewardsUpdaterSet // 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
}
⋮----
Event *RewardsCoordinatorRewardsUpdaterSet // Event containing the contract specifics and raw log
⋮----
// RewardsCoordinatorRewardsUpdaterSet represents a RewardsUpdaterSet event raised by the RewardsCoordinator contract.
type RewardsCoordinatorRewardsUpdaterSet struct {
	OldRewardsUpdater common.Address
	NewRewardsUpdater common.Address
	Raw               types.Log // Blockchain specific contextual infos
}
⋮----
Raw               types.Log // Blockchain specific contextual infos
⋮----
// FilterRewardsUpdaterSet is a free log retrieval operation binding the contract event 0x237b82f438d75fc568ebab484b75b01d9287b9e98b490b7c23221623b6705dbb.
⋮----
// Solidity: event RewardsUpdaterSet(address indexed oldRewardsUpdater, address indexed newRewardsUpdater)
func (_RewardsCoordinator *RewardsCoordinatorFilterer) FilterRewardsUpdaterSet(opts *bind.FilterOpts, oldRewardsUpdater []common.Address, newRewardsUpdater []common.Address) (*RewardsCoordinatorRewardsUpdaterSetIterator, error)
⋮----
var oldRewardsUpdaterRule []interface{}
⋮----
var newRewardsUpdaterRule []interface{}
⋮----
// WatchRewardsUpdaterSet is a free log subscription operation binding the contract event 0x237b82f438d75fc568ebab484b75b01d9287b9e98b490b7c23221623b6705dbb.
⋮----
func (_RewardsCoordinator *RewardsCoordinatorFilterer) WatchRewardsUpdaterSet(opts *bind.WatchOpts, sink chan<- *RewardsCoordinatorRewardsUpdaterSet, oldRewardsUpdater []common.Address, newRewardsUpdater []common.Address) (event.Subscription, error)
⋮----
// ParseRewardsUpdaterSet is a log parse operation binding the contract event 0x237b82f438d75fc568ebab484b75b01d9287b9e98b490b7c23221623b6705dbb.
⋮----
func (_RewardsCoordinator *RewardsCoordinatorFilterer) ParseRewardsUpdaterSet(log types.Log) (*RewardsCoordinatorRewardsUpdaterSet, error)
⋮----
// RewardsCoordinatorTotalStakeRewardsSubmissionCreatedIterator is returned from FilterTotalStakeRewardsSubmissionCreated and is used to iterate over the raw logs and unpacked data for TotalStakeRewardsSubmissionCreated events raised by the RewardsCoordinator contract.
type RewardsCoordinatorTotalStakeRewardsSubmissionCreatedIterator struct {
	Event *RewardsCoordinatorTotalStakeRewardsSubmissionCreated // 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
}
⋮----
Event *RewardsCoordinatorTotalStakeRewardsSubmissionCreated // Event containing the contract specifics and raw log
⋮----
// RewardsCoordinatorTotalStakeRewardsSubmissionCreated represents a TotalStakeRewardsSubmissionCreated event raised by the RewardsCoordinator contract.
type RewardsCoordinatorTotalStakeRewardsSubmissionCreated struct {
	Caller                common.Address
	RewardsSubmissionHash [32]byte
	OperatorSet           OperatorSet
	SubmissionNonce       *big.Int
	RewardsSubmission     IRewardsCoordinatorTypesRewardsSubmission
	Raw                   types.Log // Blockchain specific contextual infos
}
⋮----
// FilterTotalStakeRewardsSubmissionCreated is a free log retrieval operation binding the contract event 0x71836f06ac5c96075d4c5b5699a92b18e9c6d91579a382e9e55a1adf097f64df.
⋮----
// Solidity: event TotalStakeRewardsSubmissionCreated(address indexed caller, bytes32 indexed rewardsSubmissionHash, (address,uint32) operatorSet, uint256 submissionNonce, ((address,uint96)[],address,uint256,uint32,uint32) rewardsSubmission)
func (_RewardsCoordinator *RewardsCoordinatorFilterer) FilterTotalStakeRewardsSubmissionCreated(opts *bind.FilterOpts, caller []common.Address, rewardsSubmissionHash [][32]byte) (*RewardsCoordinatorTotalStakeRewardsSubmissionCreatedIterator, error)
⋮----
// WatchTotalStakeRewardsSubmissionCreated is a free log subscription operation binding the contract event 0x71836f06ac5c96075d4c5b5699a92b18e9c6d91579a382e9e55a1adf097f64df.
⋮----
func (_RewardsCoordinator *RewardsCoordinatorFilterer) WatchTotalStakeRewardsSubmissionCreated(opts *bind.WatchOpts, sink chan<- *RewardsCoordinatorTotalStakeRewardsSubmissionCreated, caller []common.Address, rewardsSubmissionHash [][32]byte) (event.Subscription, error)
⋮----
// ParseTotalStakeRewardsSubmissionCreated is a log parse operation binding the contract event 0x71836f06ac5c96075d4c5b5699a92b18e9c6d91579a382e9e55a1adf097f64df.
⋮----
func (_RewardsCoordinator *RewardsCoordinatorFilterer) ParseTotalStakeRewardsSubmissionCreated(log types.Log) (*RewardsCoordinatorTotalStakeRewardsSubmissionCreated, error)
⋮----
// RewardsCoordinatorUniqueStakeRewardsSubmissionCreatedIterator is returned from FilterUniqueStakeRewardsSubmissionCreated and is used to iterate over the raw logs and unpacked data for UniqueStakeRewardsSubmissionCreated events raised by the RewardsCoordinator contract.
type RewardsCoordinatorUniqueStakeRewardsSubmissionCreatedIterator struct {
	Event *RewardsCoordinatorUniqueStakeRewardsSubmissionCreated // 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
}
⋮----
Event *RewardsCoordinatorUniqueStakeRewardsSubmissionCreated // Event containing the contract specifics and raw log
⋮----
// RewardsCoordinatorUniqueStakeRewardsSubmissionCreated represents a UniqueStakeRewardsSubmissionCreated event raised by the RewardsCoordinator contract.
type RewardsCoordinatorUniqueStakeRewardsSubmissionCreated struct {
	Caller                common.Address
	RewardsSubmissionHash [32]byte
	OperatorSet           OperatorSet
	SubmissionNonce       *big.Int
	RewardsSubmission     IRewardsCoordinatorTypesRewardsSubmission
	Raw                   types.Log // Blockchain specific contextual infos
}
⋮----
// FilterUniqueStakeRewardsSubmissionCreated is a free log retrieval operation binding the contract event 0xb3337dc034abe0f5e3694e1f115f3d6ec9fcee74e7835ea68f6e2d29bbc1b0aa.
⋮----
// Solidity: event UniqueStakeRewardsSubmissionCreated(address indexed caller, bytes32 indexed rewardsSubmissionHash, (address,uint32) operatorSet, uint256 submissionNonce, ((address,uint96)[],address,uint256,uint32,uint32) rewardsSubmission)
func (_RewardsCoordinator *RewardsCoordinatorFilterer) FilterUniqueStakeRewardsSubmissionCreated(opts *bind.FilterOpts, caller []common.Address, rewardsSubmissionHash [][32]byte) (*RewardsCoordinatorUniqueStakeRewardsSubmissionCreatedIterator, error)
⋮----
// WatchUniqueStakeRewardsSubmissionCreated is a free log subscription operation binding the contract event 0xb3337dc034abe0f5e3694e1f115f3d6ec9fcee74e7835ea68f6e2d29bbc1b0aa.
⋮----
func (_RewardsCoordinator *RewardsCoordinatorFilterer) WatchUniqueStakeRewardsSubmissionCreated(opts *bind.WatchOpts, sink chan<- *RewardsCoordinatorUniqueStakeRewardsSubmissionCreated, caller []common.Address, rewardsSubmissionHash [][32]byte) (event.Subscription, error)
⋮----
// ParseUniqueStakeRewardsSubmissionCreated is a log parse operation binding the contract event 0xb3337dc034abe0f5e3694e1f115f3d6ec9fcee74e7835ea68f6e2d29bbc1b0aa.
⋮----
func (_RewardsCoordinator *RewardsCoordinatorFilterer) ParseUniqueStakeRewardsSubmissionCreated(log types.Log) (*RewardsCoordinatorUniqueStakeRewardsSubmissionCreated, error)
⋮----
// RewardsCoordinatorUnpausedIterator is returned from FilterUnpaused and is used to iterate over the raw logs and unpacked data for Unpaused events raised by the RewardsCoordinator contract.
type RewardsCoordinatorUnpausedIterator struct {
	Event *RewardsCoordinatorUnpaused // 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
}
⋮----
Event *RewardsCoordinatorUnpaused // Event containing the contract specifics and raw log
⋮----
// RewardsCoordinatorUnpaused represents a Unpaused event raised by the RewardsCoordinator contract.
type RewardsCoordinatorUnpaused 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 (_RewardsCoordinator *RewardsCoordinatorFilterer) FilterUnpaused(opts *bind.FilterOpts, account []common.Address) (*RewardsCoordinatorUnpausedIterator, error)
⋮----
// WatchUnpaused is a free log subscription operation binding the contract event 0x3582d1828e26bf56bd801502bc021ac0bc8afb57c826e4986b45593c8fad389c.
⋮----
func (_RewardsCoordinator *RewardsCoordinatorFilterer) WatchUnpaused(opts *bind.WatchOpts, sink chan<- *RewardsCoordinatorUnpaused, account []common.Address) (event.Subscription, error)
⋮----
// ParseUnpaused is a log parse operation binding the contract event 0x3582d1828e26bf56bd801502bc021ac0bc8afb57c826e4986b45593c8fad389c.
⋮----
func (_RewardsCoordinator *RewardsCoordinatorFilterer) ParseUnpaused(log types.Log) (*RewardsCoordinatorUnpaused, error)
````

## File: pkg/bindings/RewardsCoordinatorStorage/binding.go
````go
// Code generated - DO NOT EDIT.
// This file is a generated binding and any manual changes will be lost.
⋮----
package RewardsCoordinatorStorage
⋮----
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"
)
⋮----
"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
)
⋮----
// IRewardsCoordinatorTypesDistributionRoot is an auto generated low-level Go binding around an user-defined struct.
type IRewardsCoordinatorTypesDistributionRoot struct {
	Root                           [32]byte
	RewardsCalculationEndTimestamp uint32
	ActivatedAt                    uint32
	Disabled                       bool
}
⋮----
// IRewardsCoordinatorTypesEarnerTreeMerkleLeaf is an auto generated low-level Go binding around an user-defined struct.
type IRewardsCoordinatorTypesEarnerTreeMerkleLeaf struct {
	Earner          common.Address
	EarnerTokenRoot [32]byte
}
⋮----
// IRewardsCoordinatorTypesOperatorDirectedRewardsSubmission is an auto generated low-level Go binding around an user-defined struct.
type IRewardsCoordinatorTypesOperatorDirectedRewardsSubmission struct {
	StrategiesAndMultipliers []IRewardsCoordinatorTypesStrategyAndMultiplier
	Token                    common.Address
	OperatorRewards          []IRewardsCoordinatorTypesOperatorReward
	StartTimestamp           uint32
	Duration                 uint32
	Description              string
}
⋮----
// IRewardsCoordinatorTypesOperatorReward is an auto generated low-level Go binding around an user-defined struct.
type IRewardsCoordinatorTypesOperatorReward struct {
	Operator common.Address
	Amount   *big.Int
}
⋮----
// IRewardsCoordinatorTypesRewardsMerkleClaim is an auto generated low-level Go binding around an user-defined struct.
type IRewardsCoordinatorTypesRewardsMerkleClaim struct {
	RootIndex       uint32
	EarnerIndex     uint32
	EarnerTreeProof []byte
	EarnerLeaf      IRewardsCoordinatorTypesEarnerTreeMerkleLeaf
	TokenIndices    []uint32
	TokenTreeProofs [][]byte
	TokenLeaves     []IRewardsCoordinatorTypesTokenTreeMerkleLeaf
}
⋮----
// IRewardsCoordinatorTypesRewardsSubmission is an auto generated low-level Go binding around an user-defined struct.
type IRewardsCoordinatorTypesRewardsSubmission struct {
	StrategiesAndMultipliers []IRewardsCoordinatorTypesStrategyAndMultiplier
	Token                    common.Address
	Amount                   *big.Int
	StartTimestamp           uint32
	Duration                 uint32
}
⋮----
// IRewardsCoordinatorTypesStrategyAndMultiplier is an auto generated low-level Go binding around an user-defined struct.
type IRewardsCoordinatorTypesStrategyAndMultiplier struct {
	Strategy   common.Address
	Multiplier *big.Int
}
⋮----
// IRewardsCoordinatorTypesTokenTreeMerkleLeaf is an auto generated low-level Go binding around an user-defined struct.
type IRewardsCoordinatorTypesTokenTreeMerkleLeaf struct {
	Token              common.Address
	CumulativeEarnings *big.Int
}
⋮----
// OperatorSet is an auto generated low-level Go binding around an user-defined struct.
type OperatorSet struct {
	Avs common.Address
	Id  uint32
}
⋮----
// 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\":\"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.
// Deprecated: Use RewardsCoordinatorStorageMetaData.ABI instead.
var RewardsCoordinatorStorageABI = RewardsCoordinatorStorageMetaData.ABI
⋮----
// RewardsCoordinatorStorage is an auto generated Go binding around an Ethereum contract.
type RewardsCoordinatorStorage struct {
	RewardsCoordinatorStorageCaller     // Read-only binding to the contract
	RewardsCoordinatorStorageTransactor // Write-only binding to the contract
	RewardsCoordinatorStorageFilterer   // Log filterer for contract events
}
⋮----
RewardsCoordinatorStorageCaller     // Read-only binding to the contract
RewardsCoordinatorStorageTransactor // Write-only binding to the contract
RewardsCoordinatorStorageFilterer   // Log filterer for contract events
⋮----
// RewardsCoordinatorStorageCaller is an auto generated read-only Go binding around an Ethereum contract.
type RewardsCoordinatorStorageCaller struct {
	contract *bind.BoundContract // Generic contract wrapper for the low level calls
}
⋮----
contract *bind.BoundContract // Generic contract wrapper for the low level calls
⋮----
// RewardsCoordinatorStorageTransactor is an auto generated write-only Go binding around an Ethereum contract.
type RewardsCoordinatorStorageTransactor struct {
	contract *bind.BoundContract // Generic contract wrapper for the low level calls
}
⋮----
// RewardsCoordinatorStorageFilterer is an auto generated log filtering Go binding around an Ethereum contract events.
type RewardsCoordinatorStorageFilterer struct {
	contract *bind.BoundContract // Generic contract wrapper for the low level calls
}
⋮----
// RewardsCoordinatorStorageSession is an auto generated Go binding around an Ethereum contract,
// with pre-set call and transact options.
type RewardsCoordinatorStorageSession struct {
	Contract     *RewardsCoordinatorStorage // 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
}
⋮----
Contract     *RewardsCoordinatorStorage // 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
⋮----
// RewardsCoordinatorStorageCallerSession is an auto generated read-only Go binding around an Ethereum contract,
// with pre-set call options.
type RewardsCoordinatorStorageCallerSession struct {
	Contract *RewardsCoordinatorStorageCaller // Generic contract caller binding to set the session for
	CallOpts bind.CallOpts                    // Call options to use throughout this session
}
⋮----
Contract *RewardsCoordinatorStorageCaller // Generic contract caller binding to set the session for
CallOpts bind.CallOpts                    // Call options to use throughout this session
⋮----
// RewardsCoordinatorStorageTransactorSession is an auto generated write-only Go binding around an Ethereum contract,
// with pre-set transact options.
type RewardsCoordinatorStorageTransactorSession struct {
	Contract     *RewardsCoordinatorStorageTransactor // Generic contract transactor binding to set the session for
	TransactOpts bind.TransactOpts                    // Transaction auth options to use throughout this session
}
⋮----
Contract     *RewardsCoordinatorStorageTransactor // Generic contract transactor binding to set the session for
TransactOpts bind.TransactOpts                    // Transaction auth options to use throughout this session
⋮----
// RewardsCoordinatorStorageRaw is an auto generated low-level Go binding around an Ethereum contract.
type RewardsCoordinatorStorageRaw struct {
	Contract *RewardsCoordinatorStorage // Generic contract binding to access the raw methods on
}
⋮----
Contract *RewardsCoordinatorStorage // Generic contract binding to access the raw methods on
⋮----
// RewardsCoordinatorStorageCallerRaw is an auto generated low-level read-only Go binding around an Ethereum contract.
type RewardsCoordinatorStorageCallerRaw struct {
	Contract *RewardsCoordinatorStorageCaller // Generic read-only contract binding to access the raw methods on
}
⋮----
Contract *RewardsCoordinatorStorageCaller // Generic read-only contract binding to access the raw methods on
⋮----
// RewardsCoordinatorStorageTransactorRaw is an auto generated low-level write-only Go binding around an Ethereum contract.
type RewardsCoordinatorStorageTransactorRaw struct {
	Contract *RewardsCoordinatorStorageTransactor // Generic write-only contract binding to access the raw methods on
}
⋮----
Contract *RewardsCoordinatorStorageTransactor // Generic write-only contract binding to access the raw methods on
⋮----
// NewRewardsCoordinatorStorage creates a new instance of RewardsCoordinatorStorage, bound to a specific deployed contract.
func NewRewardsCoordinatorStorage(address common.Address, backend bind.ContractBackend) (*RewardsCoordinatorStorage, error)
⋮----
// NewRewardsCoordinatorStorageCaller creates a new read-only instance of RewardsCoordinatorStorage, bound to a specific deployed contract.
func NewRewardsCoordinatorStorageCaller(address common.Address, caller bind.ContractCaller) (*RewardsCoordinatorStorageCaller, error)
⋮----
// NewRewardsCoordinatorStorageTransactor creates a new write-only instance of RewardsCoordinatorStorage, bound to a specific deployed contract.
func NewRewardsCoordinatorStorageTransactor(address common.Address, transactor bind.ContractTransactor) (*RewardsCoordinatorStorageTransactor, error)
⋮----
// NewRewardsCoordinatorStorageFilterer creates a new log filterer instance of RewardsCoordinatorStorage, bound to a specific deployed contract.
func NewRewardsCoordinatorStorageFilterer(address common.Address, filterer bind.ContractFilterer) (*RewardsCoordinatorStorageFilterer, error)
⋮----
// bindRewardsCoordinatorStorage binds a generic wrapper to an already deployed contract.
func bindRewardsCoordinatorStorage(address common.Address, caller bind.ContractCaller, transactor bind.ContractTransactor, filterer bind.ContractFilterer) (*bind.BoundContract, error)
⋮----
// 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 (_RewardsCoordinatorStorage *RewardsCoordinatorStorageRaw) Call(opts *bind.CallOpts, result *[]interface
⋮----
// Transfer initiates a plain transaction to move funds to the contract, calling
// its default method if one is available.
func (_RewardsCoordinatorStorage *RewardsCoordinatorStorageRaw) Transfer(opts *bind.TransactOpts) (*types.Transaction, error)
⋮----
// Transact invokes the (paid) contract method with params as input values.
func (_RewardsCoordinatorStorage *RewardsCoordinatorStorageRaw) Transact(opts *bind.TransactOpts, method string, params ...interface
⋮----
// CALCULATIONINTERVALSECONDS is a free data retrieval call binding the contract method 0x9d45c281.
//
// Solidity: function CALCULATION_INTERVAL_SECONDS() view returns(uint32)
func (_RewardsCoordinatorStorage *RewardsCoordinatorStorageCaller) CALCULATIONINTERVALSECONDS(opts *bind.CallOpts) (uint32, error)
⋮----
var out []interface{}
⋮----
// GENESISREWARDSTIMESTAMP is a free data retrieval call binding the contract method 0x131433b4.
⋮----
// Solidity: function GENESIS_REWARDS_TIMESTAMP() view returns(uint32)
func (_RewardsCoordinatorStorage *RewardsCoordinatorStorageCaller) GENESISREWARDSTIMESTAMP(opts *bind.CallOpts) (uint32, error)
⋮----
// MAXFUTURELENGTH is a free data retrieval call binding the contract method 0x04a0c502.
⋮----
// Solidity: function MAX_FUTURE_LENGTH() view returns(uint32)
func (_RewardsCoordinatorStorage *RewardsCoordinatorStorageCaller) MAXFUTURELENGTH(opts *bind.CallOpts) (uint32, error)
⋮----
// MAXRETROACTIVELENGTH is a free data retrieval call binding the contract method 0x37838ed0.
⋮----
// Solidity: function MAX_RETROACTIVE_LENGTH() view returns(uint32)
func (_RewardsCoordinatorStorage *RewardsCoordinatorStorageCaller) MAXRETROACTIVELENGTH(opts *bind.CallOpts) (uint32, error)
⋮----
// MAXREWARDSDURATION is a free data retrieval call binding the contract method 0xbf21a8aa.
⋮----
// Solidity: function MAX_REWARDS_DURATION() view returns(uint32)
func (_RewardsCoordinatorStorage *RewardsCoordinatorStorageCaller) MAXREWARDSDURATION(opts *bind.CallOpts) (uint32, error)
⋮----
// ActivationDelay is a free data retrieval call binding the contract method 0x3a8c0786.
⋮----
// Solidity: function activationDelay() view returns(uint32)
func (_RewardsCoordinatorStorage *RewardsCoordinatorStorageCaller) ActivationDelay(opts *bind.CallOpts) (uint32, error)
⋮----
// AllocationManager is a free data retrieval call binding the contract method 0xca8aa7c7.
⋮----
// Solidity: function allocationManager() view returns(address)
func (_RewardsCoordinatorStorage *RewardsCoordinatorStorageCaller) AllocationManager(opts *bind.CallOpts) (common.Address, error)
⋮----
// BeaconChainETHStrategy is a free data retrieval call binding the contract method 0x9104c319.
⋮----
// Solidity: function beaconChainETHStrategy() view returns(address)
func (_RewardsCoordinatorStorage *RewardsCoordinatorStorageCaller) BeaconChainETHStrategy(opts *bind.CallOpts) (common.Address, error)
⋮----
// CalculateEarnerLeafHash is a free data retrieval call binding the contract method 0x149bc872.
⋮----
// Solidity: function calculateEarnerLeafHash((address,bytes32) leaf) pure returns(bytes32)
func (_RewardsCoordinatorStorage *RewardsCoordinatorStorageCaller) CalculateEarnerLeafHash(opts *bind.CallOpts, leaf IRewardsCoordinatorTypesEarnerTreeMerkleLeaf) ([32]byte, error)
⋮----
// CalculateTokenLeafHash is a free data retrieval call binding the contract method 0xf8cd8448.
⋮----
// Solidity: function calculateTokenLeafHash((address,uint256) leaf) pure returns(bytes32)
func (_RewardsCoordinatorStorage *RewardsCoordinatorStorageCaller) CalculateTokenLeafHash(opts *bind.CallOpts, leaf IRewardsCoordinatorTypesTokenTreeMerkleLeaf) ([32]byte, error)
⋮----
// CheckClaim is a free data retrieval call binding the contract method 0x5e9d8348.
⋮----
// Solidity: function checkClaim((uint32,uint32,bytes,(address,bytes32),uint32[],bytes[],(address,uint256)[]) claim) view returns(bool)
func (_RewardsCoordinatorStorage *RewardsCoordinatorStorageCaller) CheckClaim(opts *bind.CallOpts, claim IRewardsCoordinatorTypesRewardsMerkleClaim) (bool, error)
⋮----
// ClaimerFor is a free data retrieval call binding the contract method 0x2b9f64a4.
⋮----
// Solidity: function claimerFor(address earner) view returns(address claimer)
func (_RewardsCoordinatorStorage *RewardsCoordinatorStorageCaller) ClaimerFor(opts *bind.CallOpts, earner common.Address) (common.Address, error)
⋮----
// CumulativeClaimed is a free data retrieval call binding the contract method 0x865c6953.
⋮----
// Solidity: function cumulativeClaimed(address earner, address token) view returns(uint256 totalClaimed)
func (_RewardsCoordinatorStorage *RewardsCoordinatorStorageCaller) CumulativeClaimed(opts *bind.CallOpts, earner common.Address, token common.Address) (*big.Int, error)
⋮----
// CurrRewardsCalculationEndTimestamp is a free data retrieval call binding the contract method 0x4d18cc35.
⋮----
// Solidity: function currRewardsCalculationEndTimestamp() view returns(uint32)
func (_RewardsCoordinatorStorage *RewardsCoordinatorStorageCaller) CurrRewardsCalculationEndTimestamp(opts *bind.CallOpts) (uint32, error)
⋮----
// DefaultOperatorSplitBips is a free data retrieval call binding the contract method 0x63f6a798.
⋮----
// Solidity: function defaultOperatorSplitBips() view returns(uint16)
func (_RewardsCoordinatorStorage *RewardsCoordinatorStorageCaller) DefaultOperatorSplitBips(opts *bind.CallOpts) (uint16, error)
⋮----
// DelegationManager is a free data retrieval call binding the contract method 0xea4d3c9b.
⋮----
// Solidity: function delegationManager() view returns(address)
func (_RewardsCoordinatorStorage *RewardsCoordinatorStorageCaller) DelegationManager(opts *bind.CallOpts) (common.Address, error)
⋮----
// 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)
⋮----
// 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)
⋮----
// GetCurrentClaimableDistributionRoot is a free data retrieval call binding the contract method 0x0e9a53cf.
⋮----
// Solidity: function getCurrentClaimableDistributionRoot() view returns((bytes32,uint32,uint32,bool))
func (_RewardsCoordinatorStorage *RewardsCoordinatorStorageCaller) GetCurrentClaimableDistributionRoot(opts *bind.CallOpts) (IRewardsCoordinatorTypesDistributionRoot, error)
⋮----
// GetCurrentDistributionRoot is a free data retrieval call binding the contract method 0x9be3d4e4.
⋮----
// Solidity: function getCurrentDistributionRoot() view returns((bytes32,uint32,uint32,bool))
func (_RewardsCoordinatorStorage *RewardsCoordinatorStorageCaller) GetCurrentDistributionRoot(opts *bind.CallOpts) (IRewardsCoordinatorTypesDistributionRoot, error)
⋮----
// GetDistributionRootAtIndex is a free data retrieval call binding the contract method 0xde02e503.
⋮----
// Solidity: function getDistributionRootAtIndex(uint256 index) view returns((bytes32,uint32,uint32,bool))
func (_RewardsCoordinatorStorage *RewardsCoordinatorStorageCaller) GetDistributionRootAtIndex(opts *bind.CallOpts, index *big.Int) (IRewardsCoordinatorTypesDistributionRoot, error)
⋮----
// GetDistributionRootsLength is a free data retrieval call binding the contract method 0x7b8f8b05.
⋮----
// Solidity: function getDistributionRootsLength() view returns(uint256)
func (_RewardsCoordinatorStorage *RewardsCoordinatorStorageCaller) GetDistributionRootsLength(opts *bind.CallOpts) (*big.Int, error)
⋮----
// GetOperatorAVSSplit is a free data retrieval call binding the contract method 0xe063f81f.
⋮----
// Solidity: function getOperatorAVSSplit(address operator, address avs) view returns(uint16)
func (_RewardsCoordinatorStorage *RewardsCoordinatorStorageCaller) GetOperatorAVSSplit(opts *bind.CallOpts, operator common.Address, avs common.Address) (uint16, error)
⋮----
// GetOperatorPISplit is a free data retrieval call binding the contract method 0x4b943960.
⋮----
// Solidity: function getOperatorPISplit(address operator) view returns(uint16)
func (_RewardsCoordinatorStorage *RewardsCoordinatorStorageCaller) GetOperatorPISplit(opts *bind.CallOpts, operator common.Address) (uint16, error)
⋮----
// GetOperatorSetSplit is a free data retrieval call binding the contract method 0x9de4b35f.
⋮----
// Solidity: function getOperatorSetSplit(address operator, (address,uint32) operatorSet) view returns(uint16)
func (_RewardsCoordinatorStorage *RewardsCoordinatorStorageCaller) GetOperatorSetSplit(opts *bind.CallOpts, operator common.Address, operatorSet OperatorSet) (uint16, error)
⋮----
// GetRootIndexFromHash is a free data retrieval call binding the contract method 0xe810ce21.
⋮----
// Solidity: function getRootIndexFromHash(bytes32 rootHash) view returns(uint32)
func (_RewardsCoordinatorStorage *RewardsCoordinatorStorageCaller) GetRootIndexFromHash(opts *bind.CallOpts, rootHash [32]byte) (uint32, error)
⋮----
// IsAVSRewardsSubmissionHash is a free data retrieval call binding the contract method 0x6d21117e.
⋮----
// Solidity: function isAVSRewardsSubmissionHash(address avs, bytes32 hash) view returns(bool valid)
func (_RewardsCoordinatorStorage *RewardsCoordinatorStorageCaller) IsAVSRewardsSubmissionHash(opts *bind.CallOpts, avs common.Address, hash [32]byte) (bool, error)
⋮----
// IsOperatorDirectedAVSRewardsSubmissionHash is a free data retrieval call binding the contract method 0xed71e6a2.
⋮----
// Solidity: function isOperatorDirectedAVSRewardsSubmissionHash(address avs, bytes32 hash) view returns(bool valid)
func (_RewardsCoordinatorStorage *RewardsCoordinatorStorageCaller) IsOperatorDirectedAVSRewardsSubmissionHash(opts *bind.CallOpts, avs common.Address, hash [32]byte) (bool, error)
⋮----
// IsOperatorDirectedOperatorSetRewardsSubmissionHash is a free data retrieval call binding the contract method 0xf2f07ab4.
⋮----
// Solidity: function isOperatorDirectedOperatorSetRewardsSubmissionHash(address avs, bytes32 hash) view returns(bool valid)
func (_RewardsCoordinatorStorage *RewardsCoordinatorStorageCaller) IsOperatorDirectedOperatorSetRewardsSubmissionHash(opts *bind.CallOpts, avs common.Address, hash [32]byte) (bool, error)
⋮----
// 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)
⋮----
// IsRewardsForAllSubmitter is a free data retrieval call binding the contract method 0x0018572c.
⋮----
// Solidity: function isRewardsForAllSubmitter(address submitter) view returns(bool valid)
func (_RewardsCoordinatorStorage *RewardsCoordinatorStorageCaller) IsRewardsForAllSubmitter(opts *bind.CallOpts, submitter common.Address) (bool, error)
⋮----
// IsRewardsSubmissionForAllEarnersHash is a free data retrieval call binding the contract method 0xaebd8bae.
⋮----
// Solidity: function isRewardsSubmissionForAllEarnersHash(address avs, bytes32 hash) view returns(bool valid)
func (_RewardsCoordinatorStorage *RewardsCoordinatorStorageCaller) IsRewardsSubmissionForAllEarnersHash(opts *bind.CallOpts, avs common.Address, hash [32]byte) (bool, error)
⋮----
// IsRewardsSubmissionForAllHash is a free data retrieval call binding the contract method 0xc46db606.
⋮----
// Solidity: function isRewardsSubmissionForAllHash(address avs, bytes32 hash) view returns(bool valid)
func (_RewardsCoordinatorStorage *RewardsCoordinatorStorageCaller) IsRewardsSubmissionForAllHash(opts *bind.CallOpts, avs common.Address, hash [32]byte) (bool, error)
⋮----
// IsTotalStakeRewardsSubmissionHash is a free data retrieval call binding the contract method 0xb73c1b92.
⋮----
// Solidity: function isTotalStakeRewardsSubmissionHash(address avs, bytes32 hash) view returns(bool valid)
func (_RewardsCoordinatorStorage *RewardsCoordinatorStorageCaller) IsTotalStakeRewardsSubmissionHash(opts *bind.CallOpts, avs common.Address, hash [32]byte) (bool, error)
⋮----
// IsUniqueStakeRewardsSubmissionHash is a free data retrieval call binding the contract method 0x2943e3ff.
⋮----
// Solidity: function isUniqueStakeRewardsSubmissionHash(address avs, bytes32 hash) view returns(bool valid)
func (_RewardsCoordinatorStorage *RewardsCoordinatorStorageCaller) IsUniqueStakeRewardsSubmissionHash(opts *bind.CallOpts, avs common.Address, hash [32]byte) (bool, error)
⋮----
// RewardsUpdater is a free data retrieval call binding the contract method 0xfbf1e2c1.
⋮----
// Solidity: function rewardsUpdater() view returns(address)
func (_RewardsCoordinatorStorage *RewardsCoordinatorStorageCaller) RewardsUpdater(opts *bind.CallOpts) (common.Address, error)
⋮----
// StrategyManager is a free data retrieval call binding the contract method 0x39b70e38.
⋮----
// Solidity: function strategyManager() view returns(address)
func (_RewardsCoordinatorStorage *RewardsCoordinatorStorageCaller) StrategyManager(opts *bind.CallOpts) (common.Address, error)
⋮----
// SubmissionNonce is a free data retrieval call binding the contract method 0xbb7e451f.
⋮----
// Solidity: function submissionNonce(address avs) view returns(uint256 nonce)
func (_RewardsCoordinatorStorage *RewardsCoordinatorStorageCaller) SubmissionNonce(opts *bind.CallOpts, avs common.Address) (*big.Int, error)
⋮----
// CreateAVSRewardsSubmission is a paid mutator transaction binding the contract method 0xfce36c7d.
⋮----
// Solidity: function createAVSRewardsSubmission(((address,uint96)[],address,uint256,uint32,uint32)[] rewardsSubmissions) returns()
func (_RewardsCoordinatorStorage *RewardsCoordinatorStorageTransactor) CreateAVSRewardsSubmission(opts *bind.TransactOpts, rewardsSubmissions []IRewardsCoordinatorTypesRewardsSubmission) (*types.Transaction, error)
⋮----
// 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)
⋮----
// 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()
func (_RewardsCoordinatorStorage *RewardsCoordinatorStorageTransactor) CreateOperatorDirectedAVSRewardsSubmission(opts *bind.TransactOpts, avs common.Address, operatorDirectedRewardsSubmissions []IRewardsCoordinatorTypesOperatorDirectedRewardsSubmission) (*types.Transaction, error)
⋮----
// CreateOperatorDirectedOperatorSetRewardsSubmission is a paid mutator transaction binding the contract method 0x0ca29899.
⋮----
// Solidity: function createOperatorDirectedOperatorSetRewardsSubmission((address,uint32) operatorSet, ((address,uint96)[],address,(address,uint256)[],uint32,uint32,string)[] operatorDirectedRewardsSubmissions) returns()
func (_RewardsCoordinatorStorage *RewardsCoordinatorStorageTransactor) CreateOperatorDirectedOperatorSetRewardsSubmission(opts *bind.TransactOpts, operatorSet OperatorSet, operatorDirectedRewardsSubmissions []IRewardsCoordinatorTypesOperatorDirectedRewardsSubmission) (*types.Transaction, error)
⋮----
// CreateRewardsForAllEarners is a paid mutator transaction binding the contract method 0xff9f6cce.
⋮----
// Solidity: function createRewardsForAllEarners(((address,uint96)[],address,uint256,uint32,uint32)[] rewardsSubmissions) returns()
func (_RewardsCoordinatorStorage *RewardsCoordinatorStorageTransactor) CreateRewardsForAllEarners(opts *bind.TransactOpts, rewardsSubmissions []IRewardsCoordinatorTypesRewardsSubmission) (*types.Transaction, error)
⋮----
// CreateRewardsForAllSubmission is a paid mutator transaction binding the contract method 0x36af41fa.
⋮----
// Solidity: function createRewardsForAllSubmission(((address,uint96)[],address,uint256,uint32,uint32)[] rewardsSubmissions) returns()
func (_RewardsCoordinatorStorage *RewardsCoordinatorStorageTransactor) CreateRewardsForAllSubmission(opts *bind.TransactOpts, rewardsSubmissions []IRewardsCoordinatorTypesRewardsSubmission) (*types.Transaction, error)
⋮----
// CreateTotalStakeRewardsSubmission is a paid mutator transaction binding the contract method 0x8cb0ae1b.
⋮----
// Solidity: function createTotalStakeRewardsSubmission((address,uint32) operatorSet, ((address,uint96)[],address,uint256,uint32,uint32)[] rewardsSubmissions) returns()
func (_RewardsCoordinatorStorage *RewardsCoordinatorStorageTransactor) CreateTotalStakeRewardsSubmission(opts *bind.TransactOpts, operatorSet OperatorSet, rewardsSubmissions []IRewardsCoordinatorTypesRewardsSubmission) (*types.Transaction, error)
⋮----
// CreateUniqueStakeRewardsSubmission is a paid mutator transaction binding the contract method 0x7ae30583.
⋮----
// Solidity: function createUniqueStakeRewardsSubmission((address,uint32) operatorSet, ((address,uint96)[],address,uint256,uint32,uint32)[] rewardsSubmissions) returns()
func (_RewardsCoordinatorStorage *RewardsCoordinatorStorageTransactor) CreateUniqueStakeRewardsSubmission(opts *bind.TransactOpts, operatorSet OperatorSet, rewardsSubmissions []IRewardsCoordinatorTypesRewardsSubmission) (*types.Transaction, error)
⋮----
// DisableRoot is a paid mutator transaction binding the contract method 0xf96abf2e.
⋮----
// Solidity: function disableRoot(uint32 rootIndex) returns()
func (_RewardsCoordinatorStorage *RewardsCoordinatorStorageTransactor) DisableRoot(opts *bind.TransactOpts, rootIndex uint32) (*types.Transaction, error)
⋮----
// Initialize is a paid mutator transaction binding the contract method 0xacad7299.
⋮----
// 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)
⋮----
// ProcessClaim is a paid mutator transaction binding the contract method 0x3ccc861d.
⋮----
// Solidity: function processClaim((uint32,uint32,bytes,(address,bytes32),uint32[],bytes[],(address,uint256)[]) claim, address recipient) returns()
func (_RewardsCoordinatorStorage *RewardsCoordinatorStorageTransactor) ProcessClaim(opts *bind.TransactOpts, claim IRewardsCoordinatorTypesRewardsMerkleClaim, recipient common.Address) (*types.Transaction, error)
⋮----
// ProcessClaims is a paid mutator transaction binding the contract method 0x4596021c.
⋮----
// Solidity: function processClaims((uint32,uint32,bytes,(address,bytes32),uint32[],bytes[],(address,uint256)[])[] claims, address recipient) returns()
func (_RewardsCoordinatorStorage *RewardsCoordinatorStorageTransactor) ProcessClaims(opts *bind.TransactOpts, claims []IRewardsCoordinatorTypesRewardsMerkleClaim, recipient common.Address) (*types.Transaction, error)
⋮----
// SetActivationDelay is a paid mutator transaction binding the contract method 0x58baaa3e.
⋮----
// Solidity: function setActivationDelay(uint32 _activationDelay) returns()
func (_RewardsCoordinatorStorage *RewardsCoordinatorStorageTransactor) SetActivationDelay(opts *bind.TransactOpts, _activationDelay uint32) (*types.Transaction, error)
⋮----
// SetClaimerFor is a paid mutator transaction binding the contract method 0xa0169ddd.
⋮----
// Solidity: function setClaimerFor(address claimer) returns()
func (_RewardsCoordinatorStorage *RewardsCoordinatorStorageTransactor) SetClaimerFor(opts *bind.TransactOpts, claimer common.Address) (*types.Transaction, error)
⋮----
// SetClaimerFor0 is a paid mutator transaction binding the contract method 0xf22cef85.
⋮----
// Solidity: function setClaimerFor(address earner, address claimer) returns()
func (_RewardsCoordinatorStorage *RewardsCoordinatorStorageTransactor) SetClaimerFor0(opts *bind.TransactOpts, earner common.Address, claimer common.Address) (*types.Transaction, error)
⋮----
// SetDefaultOperatorSplit is a paid mutator transaction binding the contract method 0xa50a1d9c.
⋮----
// Solidity: function setDefaultOperatorSplit(uint16 split) returns()
func (_RewardsCoordinatorStorage *RewardsCoordinatorStorageTransactor) SetDefaultOperatorSplit(opts *bind.TransactOpts, split uint16) (*types.Transaction, error)
⋮----
// 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)
⋮----
// SetOperatorAVSSplit is a paid mutator transaction binding the contract method 0xdcbb03b3.
⋮----
// Solidity: function setOperatorAVSSplit(address operator, address avs, uint16 split) returns()
func (_RewardsCoordinatorStorage *RewardsCoordinatorStorageTransactor) SetOperatorAVSSplit(opts *bind.TransactOpts, operator common.Address, avs common.Address, split uint16) (*types.Transaction, error)
⋮----
// SetOperatorPISplit is a paid mutator transaction binding the contract method 0xb3dbb0e0.
⋮----
// Solidity: function setOperatorPISplit(address operator, uint16 split) returns()
func (_RewardsCoordinatorStorage *RewardsCoordinatorStorageTransactor) SetOperatorPISplit(opts *bind.TransactOpts, operator common.Address, split uint16) (*types.Transaction, error)
⋮----
// SetOperatorSetSplit is a paid mutator transaction binding the contract method 0xf74e8eac.
⋮----
// Solidity: function setOperatorSetSplit(address operator, (address,uint32) operatorSet, uint16 split) returns()
func (_RewardsCoordinatorStorage *RewardsCoordinatorStorageTransactor) SetOperatorSetSplit(opts *bind.TransactOpts, operator common.Address, operatorSet OperatorSet, split uint16) (*types.Transaction, error)
⋮----
// 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)
⋮----
// SetRewardsForAllSubmitter is a paid mutator transaction binding the contract method 0x0eb38345.
⋮----
// Solidity: function setRewardsForAllSubmitter(address _submitter, bool _newValue) returns()
func (_RewardsCoordinatorStorage *RewardsCoordinatorStorageTransactor) SetRewardsForAllSubmitter(opts *bind.TransactOpts, _submitter common.Address, _newValue bool) (*types.Transaction, error)
⋮----
// SetRewardsUpdater is a paid mutator transaction binding the contract method 0x863cb9a9.
⋮----
// Solidity: function setRewardsUpdater(address _rewardsUpdater) returns()
func (_RewardsCoordinatorStorage *RewardsCoordinatorStorageTransactor) SetRewardsUpdater(opts *bind.TransactOpts, _rewardsUpdater common.Address) (*types.Transaction, error)
⋮----
// SubmitRoot is a paid mutator transaction binding the contract method 0x3efe1db6.
⋮----
// Solidity: function submitRoot(bytes32 root, uint32 rewardsCalculationEndTimestamp) returns()
func (_RewardsCoordinatorStorage *RewardsCoordinatorStorageTransactor) SubmitRoot(opts *bind.TransactOpts, root [32]byte, rewardsCalculationEndTimestamp uint32) (*types.Transaction, error)
⋮----
// RewardsCoordinatorStorageAVSRewardsSubmissionCreatedIterator is returned from FilterAVSRewardsSubmissionCreated and is used to iterate over the raw logs and unpacked data for AVSRewardsSubmissionCreated events raised by the RewardsCoordinatorStorage contract.
type RewardsCoordinatorStorageAVSRewardsSubmissionCreatedIterator struct {
	Event *RewardsCoordinatorStorageAVSRewardsSubmissionCreated // 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
}
⋮----
Event *RewardsCoordinatorStorageAVSRewardsSubmissionCreated // 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 *RewardsCoordinatorStorageAVSRewardsSubmissionCreatedIterator) Next() bool
⋮----
// If the iterator failed, stop iterating
⋮----
// If the iterator completed, deliver directly whatever's available
⋮----
// Iterator still in progress, wait for either a data or an error event
⋮----
// Error returns any retrieval or parsing error occurred during filtering.
func (it *RewardsCoordinatorStorageAVSRewardsSubmissionCreatedIterator) Error() error
⋮----
// Close terminates the iteration process, releasing any pending underlying
// resources.
func (it *RewardsCoordinatorStorageAVSRewardsSubmissionCreatedIterator) Close() error
⋮----
// RewardsCoordinatorStorageAVSRewardsSubmissionCreated represents a AVSRewardsSubmissionCreated event raised by the RewardsCoordinatorStorage contract.
type RewardsCoordinatorStorageAVSRewardsSubmissionCreated struct {
	Avs                   common.Address
	SubmissionNonce       *big.Int
	RewardsSubmissionHash [32]byte
	RewardsSubmission     IRewardsCoordinatorTypesRewardsSubmission
	Raw                   types.Log // Blockchain specific contextual infos
}
⋮----
Raw                   types.Log // Blockchain specific contextual infos
⋮----
// FilterAVSRewardsSubmissionCreated is a free log retrieval operation binding the contract event 0x450a367a380c4e339e5ae7340c8464ef27af7781ad9945cfe8abd828f89e6281.
⋮----
// Solidity: event AVSRewardsSubmissionCreated(address indexed avs, uint256 indexed submissionNonce, bytes32 indexed rewardsSubmissionHash, ((address,uint96)[],address,uint256,uint32,uint32) rewardsSubmission)
func (_RewardsCoordinatorStorage *RewardsCoordinatorStorageFilterer) FilterAVSRewardsSubmissionCreated(opts *bind.FilterOpts, avs []common.Address, submissionNonce []*big.Int, rewardsSubmissionHash [][32]byte) (*RewardsCoordinatorStorageAVSRewardsSubmissionCreatedIterator, error)
⋮----
var avsRule []interface{}
⋮----
var submissionNonceRule []interface{}
⋮----
var rewardsSubmissionHashRule []interface{}
⋮----
// WatchAVSRewardsSubmissionCreated is a free log subscription operation binding the contract event 0x450a367a380c4e339e5ae7340c8464ef27af7781ad9945cfe8abd828f89e6281.
⋮----
func (_RewardsCoordinatorStorage *RewardsCoordinatorStorageFilterer) WatchAVSRewardsSubmissionCreated(opts *bind.WatchOpts, sink chan<- *RewardsCoordinatorStorageAVSRewardsSubmissionCreated, avs []common.Address, submissionNonce []*big.Int, rewardsSubmissionHash [][32]byte) (event.Subscription, error)
⋮----
// New log arrived, parse the event and forward to the user
⋮----
// ParseAVSRewardsSubmissionCreated is a log parse operation binding the contract event 0x450a367a380c4e339e5ae7340c8464ef27af7781ad9945cfe8abd828f89e6281.
⋮----
func (_RewardsCoordinatorStorage *RewardsCoordinatorStorageFilterer) ParseAVSRewardsSubmissionCreated(log types.Log) (*RewardsCoordinatorStorageAVSRewardsSubmissionCreated, error)
⋮----
// RewardsCoordinatorStorageActivationDelaySetIterator is returned from FilterActivationDelaySet and is used to iterate over the raw logs and unpacked data for ActivationDelaySet events raised by the RewardsCoordinatorStorage contract.
type RewardsCoordinatorStorageActivationDelaySetIterator struct {
	Event *RewardsCoordinatorStorageActivationDelaySet // 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
}
⋮----
Event *RewardsCoordinatorStorageActivationDelaySet // Event containing the contract specifics and raw log
⋮----
// RewardsCoordinatorStorageActivationDelaySet represents a ActivationDelaySet event raised by the RewardsCoordinatorStorage contract.
type RewardsCoordinatorStorageActivationDelaySet struct {
	OldActivationDelay uint32
	NewActivationDelay uint32
	Raw                types.Log // Blockchain specific contextual infos
}
⋮----
Raw                types.Log // Blockchain specific contextual infos
⋮----
// FilterActivationDelaySet is a free log retrieval operation binding the contract event 0xaf557c6c02c208794817a705609cfa935f827312a1adfdd26494b6b95dd2b4b3.
⋮----
// Solidity: event ActivationDelaySet(uint32 oldActivationDelay, uint32 newActivationDelay)
func (_RewardsCoordinatorStorage *RewardsCoordinatorStorageFilterer) FilterActivationDelaySet(opts *bind.FilterOpts) (*RewardsCoordinatorStorageActivationDelaySetIterator, error)
⋮----
// WatchActivationDelaySet is a free log subscription operation binding the contract event 0xaf557c6c02c208794817a705609cfa935f827312a1adfdd26494b6b95dd2b4b3.
⋮----
func (_RewardsCoordinatorStorage *RewardsCoordinatorStorageFilterer) WatchActivationDelaySet(opts *bind.WatchOpts, sink chan<- *RewardsCoordinatorStorageActivationDelaySet) (event.Subscription, error)
⋮----
// ParseActivationDelaySet is a log parse operation binding the contract event 0xaf557c6c02c208794817a705609cfa935f827312a1adfdd26494b6b95dd2b4b3.
⋮----
func (_RewardsCoordinatorStorage *RewardsCoordinatorStorageFilterer) ParseActivationDelaySet(log types.Log) (*RewardsCoordinatorStorageActivationDelaySet, error)
⋮----
// RewardsCoordinatorStorageClaimerForSetIterator is returned from FilterClaimerForSet and is used to iterate over the raw logs and unpacked data for ClaimerForSet events raised by the RewardsCoordinatorStorage contract.
type RewardsCoordinatorStorageClaimerForSetIterator struct {
	Event *RewardsCoordinatorStorageClaimerForSet // 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
}
⋮----
Event *RewardsCoordinatorStorageClaimerForSet // Event containing the contract specifics and raw log
⋮----
// RewardsCoordinatorStorageClaimerForSet represents a ClaimerForSet event raised by the RewardsCoordinatorStorage contract.
type RewardsCoordinatorStorageClaimerForSet struct {
	Earner     common.Address
	OldClaimer common.Address
	Claimer    common.Address
	Raw        types.Log // Blockchain specific contextual infos
}
⋮----
Raw        types.Log // Blockchain specific contextual infos
⋮----
// FilterClaimerForSet is a free log retrieval operation binding the contract event 0xbab947934d42e0ad206f25c9cab18b5bb6ae144acfb00f40b4e3aa59590ca312.
⋮----
// Solidity: event ClaimerForSet(address indexed earner, address indexed oldClaimer, address indexed claimer)
func (_RewardsCoordinatorStorage *RewardsCoordinatorStorageFilterer) FilterClaimerForSet(opts *bind.FilterOpts, earner []common.Address, oldClaimer []common.Address, claimer []common.Address) (*RewardsCoordinatorStorageClaimerForSetIterator, error)
⋮----
var earnerRule []interface{}
⋮----
var oldClaimerRule []interface{}
⋮----
var claimerRule []interface{}
⋮----
// WatchClaimerForSet is a free log subscription operation binding the contract event 0xbab947934d42e0ad206f25c9cab18b5bb6ae144acfb00f40b4e3aa59590ca312.
⋮----
func (_RewardsCoordinatorStorage *RewardsCoordinatorStorageFilterer) WatchClaimerForSet(opts *bind.WatchOpts, sink chan<- *RewardsCoordinatorStorageClaimerForSet, earner []common.Address, oldClaimer []common.Address, claimer []common.Address) (event.Subscription, error)
⋮----
// ParseClaimerForSet is a log parse operation binding the contract event 0xbab947934d42e0ad206f25c9cab18b5bb6ae144acfb00f40b4e3aa59590ca312.
⋮----
func (_RewardsCoordinatorStorage *RewardsCoordinatorStorageFilterer) ParseClaimerForSet(log types.Log) (*RewardsCoordinatorStorageClaimerForSet, error)
⋮----
// RewardsCoordinatorStorageDefaultOperatorSplitBipsSetIterator is returned from FilterDefaultOperatorSplitBipsSet and is used to iterate over the raw logs and unpacked data for DefaultOperatorSplitBipsSet events raised by the RewardsCoordinatorStorage contract.
type RewardsCoordinatorStorageDefaultOperatorSplitBipsSetIterator struct {
	Event *RewardsCoordinatorStorageDefaultOperatorSplitBipsSet // 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
}
⋮----
Event *RewardsCoordinatorStorageDefaultOperatorSplitBipsSet // Event containing the contract specifics and raw log
⋮----
// RewardsCoordinatorStorageDefaultOperatorSplitBipsSet represents a DefaultOperatorSplitBipsSet event raised by the RewardsCoordinatorStorage contract.
type RewardsCoordinatorStorageDefaultOperatorSplitBipsSet struct {
	OldDefaultOperatorSplitBips uint16
	NewDefaultOperatorSplitBips uint16
	Raw                         types.Log // Blockchain specific contextual infos
}
⋮----
Raw                         types.Log // Blockchain specific contextual infos
⋮----
// FilterDefaultOperatorSplitBipsSet is a free log retrieval operation binding the contract event 0xe6cd4edfdcc1f6d130ab35f73d72378f3a642944fb4ee5bd84b7807a81ea1c4e.
⋮----
// Solidity: event DefaultOperatorSplitBipsSet(uint16 oldDefaultOperatorSplitBips, uint16 newDefaultOperatorSplitBips)
func (_RewardsCoordinatorStorage *RewardsCoordinatorStorageFilterer) FilterDefaultOperatorSplitBipsSet(opts *bind.FilterOpts) (*RewardsCoordinatorStorageDefaultOperatorSplitBipsSetIterator, error)
⋮----
// WatchDefaultOperatorSplitBipsSet is a free log subscription operation binding the contract event 0xe6cd4edfdcc1f6d130ab35f73d72378f3a642944fb4ee5bd84b7807a81ea1c4e.
⋮----
func (_RewardsCoordinatorStorage *RewardsCoordinatorStorageFilterer) WatchDefaultOperatorSplitBipsSet(opts *bind.WatchOpts, sink chan<- *RewardsCoordinatorStorageDefaultOperatorSplitBipsSet) (event.Subscription, error)
⋮----
// ParseDefaultOperatorSplitBipsSet is a log parse operation binding the contract event 0xe6cd4edfdcc1f6d130ab35f73d72378f3a642944fb4ee5bd84b7807a81ea1c4e.
⋮----
func (_RewardsCoordinatorStorage *RewardsCoordinatorStorageFilterer) ParseDefaultOperatorSplitBipsSet(log types.Log) (*RewardsCoordinatorStorageDefaultOperatorSplitBipsSet, error)
⋮----
// RewardsCoordinatorStorageDistributionRootDisabledIterator is returned from FilterDistributionRootDisabled and is used to iterate over the raw logs and unpacked data for DistributionRootDisabled events raised by the RewardsCoordinatorStorage contract.
type RewardsCoordinatorStorageDistributionRootDisabledIterator struct {
	Event *RewardsCoordinatorStorageDistributionRootDisabled // 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
}
⋮----
Event *RewardsCoordinatorStorageDistributionRootDisabled // Event containing the contract specifics and raw log
⋮----
// RewardsCoordinatorStorageDistributionRootDisabled represents a DistributionRootDisabled event raised by the RewardsCoordinatorStorage contract.
type RewardsCoordinatorStorageDistributionRootDisabled struct {
	RootIndex uint32
	Raw       types.Log // Blockchain specific contextual infos
}
⋮----
Raw       types.Log // Blockchain specific contextual infos
⋮----
// FilterDistributionRootDisabled is a free log retrieval operation binding the contract event 0xd850e6e5dfa497b72661fa73df2923464eaed9dc2ff1d3cb82bccbfeabe5c41e.
⋮----
// Solidity: event DistributionRootDisabled(uint32 indexed rootIndex)
func (_RewardsCoordinatorStorage *RewardsCoordinatorStorageFilterer) FilterDistributionRootDisabled(opts *bind.FilterOpts, rootIndex []uint32) (*RewardsCoordinatorStorageDistributionRootDisabledIterator, error)
⋮----
var rootIndexRule []interface{}
⋮----
// WatchDistributionRootDisabled is a free log subscription operation binding the contract event 0xd850e6e5dfa497b72661fa73df2923464eaed9dc2ff1d3cb82bccbfeabe5c41e.
⋮----
func (_RewardsCoordinatorStorage *RewardsCoordinatorStorageFilterer) WatchDistributionRootDisabled(opts *bind.WatchOpts, sink chan<- *RewardsCoordinatorStorageDistributionRootDisabled, rootIndex []uint32) (event.Subscription, error)
⋮----
// ParseDistributionRootDisabled is a log parse operation binding the contract event 0xd850e6e5dfa497b72661fa73df2923464eaed9dc2ff1d3cb82bccbfeabe5c41e.
⋮----
func (_RewardsCoordinatorStorage *RewardsCoordinatorStorageFilterer) ParseDistributionRootDisabled(log types.Log) (*RewardsCoordinatorStorageDistributionRootDisabled, error)
⋮----
// RewardsCoordinatorStorageDistributionRootSubmittedIterator is returned from FilterDistributionRootSubmitted and is used to iterate over the raw logs and unpacked data for DistributionRootSubmitted events raised by the RewardsCoordinatorStorage contract.
type RewardsCoordinatorStorageDistributionRootSubmittedIterator struct {
	Event *RewardsCoordinatorStorageDistributionRootSubmitted // 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
}
⋮----
Event *RewardsCoordinatorStorageDistributionRootSubmitted // Event containing the contract specifics and raw log
⋮----
// RewardsCoordinatorStorageDistributionRootSubmitted represents a DistributionRootSubmitted event raised by the RewardsCoordinatorStorage contract.
type RewardsCoordinatorStorageDistributionRootSubmitted struct {
	RootIndex                      uint32
	Root                           [32]byte
	RewardsCalculationEndTimestamp uint32
	ActivatedAt                    uint32
	Raw                            types.Log // Blockchain specific contextual infos
}
⋮----
Raw                            types.Log // Blockchain specific contextual infos
⋮----
// FilterDistributionRootSubmitted is a free log retrieval operation binding the contract event 0xecd866c3c158fa00bf34d803d5f6023000b57080bcb48af004c2b4b46b3afd08.
⋮----
// Solidity: event DistributionRootSubmitted(uint32 indexed rootIndex, bytes32 indexed root, uint32 indexed rewardsCalculationEndTimestamp, uint32 activatedAt)
func (_RewardsCoordinatorStorage *RewardsCoordinatorStorageFilterer) FilterDistributionRootSubmitted(opts *bind.FilterOpts, rootIndex []uint32, root [][32]byte, rewardsCalculationEndTimestamp []uint32) (*RewardsCoordinatorStorageDistributionRootSubmittedIterator, error)
⋮----
var rootRule []interface{}
⋮----
var rewardsCalculationEndTimestampRule []interface{}
⋮----
// WatchDistributionRootSubmitted is a free log subscription operation binding the contract event 0xecd866c3c158fa00bf34d803d5f6023000b57080bcb48af004c2b4b46b3afd08.
⋮----
func (_RewardsCoordinatorStorage *RewardsCoordinatorStorageFilterer) WatchDistributionRootSubmitted(opts *bind.WatchOpts, sink chan<- *RewardsCoordinatorStorageDistributionRootSubmitted, rootIndex []uint32, root [][32]byte, rewardsCalculationEndTimestamp []uint32) (event.Subscription, error)
⋮----
// ParseDistributionRootSubmitted is a log parse operation binding the contract event 0xecd866c3c158fa00bf34d803d5f6023000b57080bcb48af004c2b4b46b3afd08.
⋮----
func (_RewardsCoordinatorStorage *RewardsCoordinatorStorageFilterer) ParseDistributionRootSubmitted(log types.Log) (*RewardsCoordinatorStorageDistributionRootSubmitted, error)
⋮----
// 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
}
⋮----
Event *RewardsCoordinatorStorageFeeRecipientSet // Event containing the contract specifics and raw log
⋮----
// 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
}
⋮----
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{}
⋮----
var newFeeRecipientRule []interface{}
⋮----
// WatchFeeRecipientSet is a free log subscription operation binding the contract event 0x15d80a013f22151bc7246e3bc132e12828cde19de98870475e3fa70840152721.
⋮----
func (_RewardsCoordinatorStorage *RewardsCoordinatorStorageFilterer) WatchFeeRecipientSet(opts *bind.WatchOpts, sink chan<- *RewardsCoordinatorStorageFeeRecipientSet, oldFeeRecipient []common.Address, newFeeRecipient []common.Address) (event.Subscription, error)
⋮----
// ParseFeeRecipientSet is a log parse operation binding the contract event 0x15d80a013f22151bc7246e3bc132e12828cde19de98870475e3fa70840152721.
⋮----
func (_RewardsCoordinatorStorage *RewardsCoordinatorStorageFilterer) ParseFeeRecipientSet(log types.Log) (*RewardsCoordinatorStorageFeeRecipientSet, error)
⋮----
// 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

	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
}
⋮----
Event *RewardsCoordinatorStorageOperatorAVSSplitBipsSet // Event containing the contract specifics and raw log
⋮----
// RewardsCoordinatorStorageOperatorAVSSplitBipsSet represents a OperatorAVSSplitBipsSet event raised by the RewardsCoordinatorStorage contract.
type RewardsCoordinatorStorageOperatorAVSSplitBipsSet struct {
	Caller                  common.Address
	Operator                common.Address
	Avs                     common.Address
	ActivatedAt             uint32
	OldOperatorAVSSplitBips uint16
	NewOperatorAVSSplitBips uint16
	Raw                     types.Log // Blockchain specific contextual infos
}
⋮----
Raw                     types.Log // Blockchain specific contextual infos
⋮----
// FilterOperatorAVSSplitBipsSet is a free log retrieval operation binding the contract event 0x48e198b6ae357e529204ee53a8e514c470ff77d9cc8e4f7207f8b5d490ae6934.
⋮----
// Solidity: event OperatorAVSSplitBipsSet(address indexed caller, address indexed operator, address indexed avs, uint32 activatedAt, uint16 oldOperatorAVSSplitBips, uint16 newOperatorAVSSplitBips)
func (_RewardsCoordinatorStorage *RewardsCoordinatorStorageFilterer) FilterOperatorAVSSplitBipsSet(opts *bind.FilterOpts, caller []common.Address, operator []common.Address, avs []common.Address) (*RewardsCoordinatorStorageOperatorAVSSplitBipsSetIterator, error)
⋮----
var callerRule []interface{}
⋮----
var operatorRule []interface{}
⋮----
// WatchOperatorAVSSplitBipsSet is a free log subscription operation binding the contract event 0x48e198b6ae357e529204ee53a8e514c470ff77d9cc8e4f7207f8b5d490ae6934.
⋮----
func (_RewardsCoordinatorStorage *RewardsCoordinatorStorageFilterer) WatchOperatorAVSSplitBipsSet(opts *bind.WatchOpts, sink chan<- *RewardsCoordinatorStorageOperatorAVSSplitBipsSet, caller []common.Address, operator []common.Address, avs []common.Address) (event.Subscription, error)
⋮----
// ParseOperatorAVSSplitBipsSet is a log parse operation binding the contract event 0x48e198b6ae357e529204ee53a8e514c470ff77d9cc8e4f7207f8b5d490ae6934.
⋮----
func (_RewardsCoordinatorStorage *RewardsCoordinatorStorageFilterer) ParseOperatorAVSSplitBipsSet(log types.Log) (*RewardsCoordinatorStorageOperatorAVSSplitBipsSet, error)
⋮----
// RewardsCoordinatorStorageOperatorDirectedAVSRewardsSubmissionCreatedIterator is returned from FilterOperatorDirectedAVSRewardsSubmissionCreated and is used to iterate over the raw logs and unpacked data for OperatorDirectedAVSRewardsSubmissionCreated events raised by the RewardsCoordinatorStorage contract.
type RewardsCoordinatorStorageOperatorDirectedAVSRewardsSubmissionCreatedIterator struct {
	Event *RewardsCoordinatorStorageOperatorDirectedAVSRewardsSubmissionCreated // 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
}
⋮----
Event *RewardsCoordinatorStorageOperatorDirectedAVSRewardsSubmissionCreated // Event containing the contract specifics and raw log
⋮----
// RewardsCoordinatorStorageOperatorDirectedAVSRewardsSubmissionCreated represents a OperatorDirectedAVSRewardsSubmissionCreated event raised by the RewardsCoordinatorStorage contract.
type RewardsCoordinatorStorageOperatorDirectedAVSRewardsSubmissionCreated struct {
	Caller                                common.Address
	Avs                                   common.Address
	OperatorDirectedRewardsSubmissionHash [32]byte
	SubmissionNonce                       *big.Int
	OperatorDirectedRewardsSubmission     IRewardsCoordinatorTypesOperatorDirectedRewardsSubmission
	Raw                                   types.Log // Blockchain specific contextual infos
}
⋮----
Raw                                   types.Log // Blockchain specific contextual infos
⋮----
// FilterOperatorDirectedAVSRewardsSubmissionCreated is a free log retrieval operation binding the contract event 0xfc8888bffd711da60bc5092b33f677d81896fe80ecc677b84cfab8184462b6e0.
⋮----
// Solidity: event OperatorDirectedAVSRewardsSubmissionCreated(address indexed caller, address indexed avs, bytes32 indexed operatorDirectedRewardsSubmissionHash, uint256 submissionNonce, ((address,uint96)[],address,(address,uint256)[],uint32,uint32,string) operatorDirectedRewardsSubmission)
func (_RewardsCoordinatorStorage *RewardsCoordinatorStorageFilterer) FilterOperatorDirectedAVSRewardsSubmissionCreated(opts *bind.FilterOpts, caller []common.Address, avs []common.Address, operatorDirectedRewardsSubmissionHash [][32]byte) (*RewardsCoordinatorStorageOperatorDirectedAVSRewardsSubmissionCreatedIterator, error)
⋮----
var operatorDirectedRewardsSubmissionHashRule []interface{}
⋮----
// WatchOperatorDirectedAVSRewardsSubmissionCreated is a free log subscription operation binding the contract event 0xfc8888bffd711da60bc5092b33f677d81896fe80ecc677b84cfab8184462b6e0.
⋮----
func (_RewardsCoordinatorStorage *RewardsCoordinatorStorageFilterer) WatchOperatorDirectedAVSRewardsSubmissionCreated(opts *bind.WatchOpts, sink chan<- *RewardsCoordinatorStorageOperatorDirectedAVSRewardsSubmissionCreated, caller []common.Address, avs []common.Address, operatorDirectedRewardsSubmissionHash [][32]byte) (event.Subscription, error)
⋮----
// ParseOperatorDirectedAVSRewardsSubmissionCreated is a log parse operation binding the contract event 0xfc8888bffd711da60bc5092b33f677d81896fe80ecc677b84cfab8184462b6e0.
⋮----
func (_RewardsCoordinatorStorage *RewardsCoordinatorStorageFilterer) ParseOperatorDirectedAVSRewardsSubmissionCreated(log types.Log) (*RewardsCoordinatorStorageOperatorDirectedAVSRewardsSubmissionCreated, error)
⋮----
// RewardsCoordinatorStorageOperatorDirectedOperatorSetRewardsSubmissionCreatedIterator is returned from FilterOperatorDirectedOperatorSetRewardsSubmissionCreated and is used to iterate over the raw logs and unpacked data for OperatorDirectedOperatorSetRewardsSubmissionCreated events raised by the RewardsCoordinatorStorage contract.
type RewardsCoordinatorStorageOperatorDirectedOperatorSetRewardsSubmissionCreatedIterator struct {
	Event *RewardsCoordinatorStorageOperatorDirectedOperatorSetRewardsSubmissionCreated // 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
}
⋮----
Event *RewardsCoordinatorStorageOperatorDirectedOperatorSetRewardsSubmissionCreated // Event containing the contract specifics and raw log
⋮----
// RewardsCoordinatorStorageOperatorDirectedOperatorSetRewardsSubmissionCreated represents a OperatorDirectedOperatorSetRewardsSubmissionCreated event raised by the RewardsCoordinatorStorage contract.
type RewardsCoordinatorStorageOperatorDirectedOperatorSetRewardsSubmissionCreated struct {
	Caller                                common.Address
	OperatorDirectedRewardsSubmissionHash [32]byte
	OperatorSet                           OperatorSet
	SubmissionNonce                       *big.Int
	OperatorDirectedRewardsSubmission     IRewardsCoordinatorTypesOperatorDirectedRewardsSubmission
	Raw                                   types.Log // Blockchain specific contextual infos
}
⋮----
// FilterOperatorDirectedOperatorSetRewardsSubmissionCreated is a free log retrieval operation binding the contract event 0xfff0759ccb371dfb5691798724e70b4fa61cb3bfe730a33ac19fb86a48efc756.
⋮----
// Solidity: event OperatorDirectedOperatorSetRewardsSubmissionCreated(address indexed caller, bytes32 indexed operatorDirectedRewardsSubmissionHash, (address,uint32) operatorSet, uint256 submissionNonce, ((address,uint96)[],address,(address,uint256)[],uint32,uint32,string) operatorDirectedRewardsSubmission)
func (_RewardsCoordinatorStorage *RewardsCoordinatorStorageFilterer) FilterOperatorDirectedOperatorSetRewardsSubmissionCreated(opts *bind.FilterOpts, caller []common.Address, operatorDirectedRewardsSubmissionHash [][32]byte) (*RewardsCoordinatorStorageOperatorDirectedOperatorSetRewardsSubmissionCreatedIterator, error)
⋮----
// WatchOperatorDirectedOperatorSetRewardsSubmissionCreated is a free log subscription operation binding the contract event 0xfff0759ccb371dfb5691798724e70b4fa61cb3bfe730a33ac19fb86a48efc756.
⋮----
func (_RewardsCoordinatorStorage *RewardsCoordinatorStorageFilterer) WatchOperatorDirectedOperatorSetRewardsSubmissionCreated(opts *bind.WatchOpts, sink chan<- *RewardsCoordinatorStorageOperatorDirectedOperatorSetRewardsSubmissionCreated, caller []common.Address, operatorDirectedRewardsSubmissionHash [][32]byte) (event.Subscription, error)
⋮----
// ParseOperatorDirectedOperatorSetRewardsSubmissionCreated is a log parse operation binding the contract event 0xfff0759ccb371dfb5691798724e70b4fa61cb3bfe730a33ac19fb86a48efc756.
⋮----
func (_RewardsCoordinatorStorage *RewardsCoordinatorStorageFilterer) ParseOperatorDirectedOperatorSetRewardsSubmissionCreated(log types.Log) (*RewardsCoordinatorStorageOperatorDirectedOperatorSetRewardsSubmissionCreated, error)
⋮----
// RewardsCoordinatorStorageOperatorPISplitBipsSetIterator is returned from FilterOperatorPISplitBipsSet and is used to iterate over the raw logs and unpacked data for OperatorPISplitBipsSet events raised by the RewardsCoordinatorStorage contract.
type RewardsCoordinatorStorageOperatorPISplitBipsSetIterator struct {
	Event *RewardsCoordinatorStorageOperatorPISplitBipsSet // 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
}
⋮----
Event *RewardsCoordinatorStorageOperatorPISplitBipsSet // Event containing the contract specifics and raw log
⋮----
// RewardsCoordinatorStorageOperatorPISplitBipsSet represents a OperatorPISplitBipsSet event raised by the RewardsCoordinatorStorage contract.
type RewardsCoordinatorStorageOperatorPISplitBipsSet struct {
	Caller                 common.Address
	Operator               common.Address
	ActivatedAt            uint32
	OldOperatorPISplitBips uint16
	NewOperatorPISplitBips uint16
	Raw                    types.Log // Blockchain specific contextual infos
}
⋮----
Raw                    types.Log // Blockchain specific contextual infos
⋮----
// FilterOperatorPISplitBipsSet is a free log retrieval operation binding the contract event 0xd1e028bd664486a46ad26040e999cd2d22e1e9a094ee6afe19fcf64678f16f74.
⋮----
// Solidity: event OperatorPISplitBipsSet(address indexed caller, address indexed operator, uint32 activatedAt, uint16 oldOperatorPISplitBips, uint16 newOperatorPISplitBips)
func (_RewardsCoordinatorStorage *RewardsCoordinatorStorageFilterer) FilterOperatorPISplitBipsSet(opts *bind.FilterOpts, caller []common.Address, operator []common.Address) (*RewardsCoordinatorStorageOperatorPISplitBipsSetIterator, error)
⋮----
// WatchOperatorPISplitBipsSet is a free log subscription operation binding the contract event 0xd1e028bd664486a46ad26040e999cd2d22e1e9a094ee6afe19fcf64678f16f74.
⋮----
func (_RewardsCoordinatorStorage *RewardsCoordinatorStorageFilterer) WatchOperatorPISplitBipsSet(opts *bind.WatchOpts, sink chan<- *RewardsCoordinatorStorageOperatorPISplitBipsSet, caller []common.Address, operator []common.Address) (event.Subscription, error)
⋮----
// ParseOperatorPISplitBipsSet is a log parse operation binding the contract event 0xd1e028bd664486a46ad26040e999cd2d22e1e9a094ee6afe19fcf64678f16f74.
⋮----
func (_RewardsCoordinatorStorage *RewardsCoordinatorStorageFilterer) ParseOperatorPISplitBipsSet(log types.Log) (*RewardsCoordinatorStorageOperatorPISplitBipsSet, error)
⋮----
// RewardsCoordinatorStorageOperatorSetSplitBipsSetIterator is returned from FilterOperatorSetSplitBipsSet and is used to iterate over the raw logs and unpacked data for OperatorSetSplitBipsSet events raised by the RewardsCoordinatorStorage contract.
type RewardsCoordinatorStorageOperatorSetSplitBipsSetIterator struct {
	Event *RewardsCoordinatorStorageOperatorSetSplitBipsSet // 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
}
⋮----
Event *RewardsCoordinatorStorageOperatorSetSplitBipsSet // Event containing the contract specifics and raw log
⋮----
// RewardsCoordinatorStorageOperatorSetSplitBipsSet represents a OperatorSetSplitBipsSet event raised by the RewardsCoordinatorStorage contract.
type RewardsCoordinatorStorageOperatorSetSplitBipsSet struct {
	Caller                  common.Address
	Operator                common.Address
	OperatorSet             OperatorSet
	ActivatedAt             uint32
	OldOperatorSetSplitBips uint16
	NewOperatorSetSplitBips uint16
	Raw                     types.Log // Blockchain specific contextual infos
}
⋮----
// FilterOperatorSetSplitBipsSet is a free log retrieval operation binding the contract event 0x14918b3834ab6752eb2e1b489b6663a67810efb5f56f3944a97ede8ecf1fd9f1.
⋮----
// Solidity: event OperatorSetSplitBipsSet(address indexed caller, address indexed operator, (address,uint32) operatorSet, uint32 activatedAt, uint16 oldOperatorSetSplitBips, uint16 newOperatorSetSplitBips)
func (_RewardsCoordinatorStorage *RewardsCoordinatorStorageFilterer) FilterOperatorSetSplitBipsSet(opts *bind.FilterOpts, caller []common.Address, operator []common.Address) (*RewardsCoordinatorStorageOperatorSetSplitBipsSetIterator, error)
⋮----
// WatchOperatorSetSplitBipsSet is a free log subscription operation binding the contract event 0x14918b3834ab6752eb2e1b489b6663a67810efb5f56f3944a97ede8ecf1fd9f1.
⋮----
func (_RewardsCoordinatorStorage *RewardsCoordinatorStorageFilterer) WatchOperatorSetSplitBipsSet(opts *bind.WatchOpts, sink chan<- *RewardsCoordinatorStorageOperatorSetSplitBipsSet, caller []common.Address, operator []common.Address) (event.Subscription, error)
⋮----
// ParseOperatorSetSplitBipsSet is a log parse operation binding the contract event 0x14918b3834ab6752eb2e1b489b6663a67810efb5f56f3944a97ede8ecf1fd9f1.
⋮----
func (_RewardsCoordinatorStorage *RewardsCoordinatorStorageFilterer) ParseOperatorSetSplitBipsSet(log types.Log) (*RewardsCoordinatorStorageOperatorSetSplitBipsSet, error)
⋮----
// 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
}
⋮----
Event *RewardsCoordinatorStorageOptInForProtocolFeeSet // Event containing the contract specifics and raw log
⋮----
// 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{}
⋮----
var oldValueRule []interface{}
⋮----
var newValueRule []interface{}
⋮----
// WatchOptInForProtocolFeeSet is a free log subscription operation binding the contract event 0xbb020e17dc9a72ff25958029a3ddf0c05cebaac105769b31b6238aaca3910cd2.
⋮----
func (_RewardsCoordinatorStorage *RewardsCoordinatorStorageFilterer) WatchOptInForProtocolFeeSet(opts *bind.WatchOpts, sink chan<- *RewardsCoordinatorStorageOptInForProtocolFeeSet, submitter []common.Address, oldValue []bool, newValue []bool) (event.Subscription, error)
⋮----
// ParseOptInForProtocolFeeSet is a log parse operation binding the contract event 0xbb020e17dc9a72ff25958029a3ddf0c05cebaac105769b31b6238aaca3910cd2.
⋮----
func (_RewardsCoordinatorStorage *RewardsCoordinatorStorageFilterer) ParseOptInForProtocolFeeSet(log types.Log) (*RewardsCoordinatorStorageOptInForProtocolFeeSet, error)
⋮----
// 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

	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
}
⋮----
Event *RewardsCoordinatorStorageRewardsClaimed // Event containing the contract specifics and raw log
⋮----
// RewardsCoordinatorStorageRewardsClaimed represents a RewardsClaimed event raised by the RewardsCoordinatorStorage contract.
type RewardsCoordinatorStorageRewardsClaimed struct {
	Root          [32]byte
	Earner        common.Address
	Claimer       common.Address
	Recipient     common.Address
	Token         common.Address
	ClaimedAmount *big.Int
	Raw           types.Log // Blockchain specific contextual infos
}
⋮----
Raw           types.Log // Blockchain specific contextual infos
⋮----
// FilterRewardsClaimed is a free log retrieval operation binding the contract event 0x9543dbd55580842586a951f0386e24d68a5df99ae29e3b216588b45fd684ce31.
⋮----
// Solidity: event RewardsClaimed(bytes32 root, address indexed earner, address indexed claimer, address indexed recipient, address token, uint256 claimedAmount)
func (_RewardsCoordinatorStorage *RewardsCoordinatorStorageFilterer) FilterRewardsClaimed(opts *bind.FilterOpts, earner []common.Address, claimer []common.Address, recipient []common.Address) (*RewardsCoordinatorStorageRewardsClaimedIterator, error)
⋮----
var recipientRule []interface{}
⋮----
// WatchRewardsClaimed is a free log subscription operation binding the contract event 0x9543dbd55580842586a951f0386e24d68a5df99ae29e3b216588b45fd684ce31.
⋮----
func (_RewardsCoordinatorStorage *RewardsCoordinatorStorageFilterer) WatchRewardsClaimed(opts *bind.WatchOpts, sink chan<- *RewardsCoordinatorStorageRewardsClaimed, earner []common.Address, claimer []common.Address, recipient []common.Address) (event.Subscription, error)
⋮----
// ParseRewardsClaimed is a log parse operation binding the contract event 0x9543dbd55580842586a951f0386e24d68a5df99ae29e3b216588b45fd684ce31.
⋮----
func (_RewardsCoordinatorStorage *RewardsCoordinatorStorageFilterer) ParseRewardsClaimed(log types.Log) (*RewardsCoordinatorStorageRewardsClaimed, error)
⋮----
// RewardsCoordinatorStorageRewardsForAllSubmitterSetIterator is returned from FilterRewardsForAllSubmitterSet and is used to iterate over the raw logs and unpacked data for RewardsForAllSubmitterSet events raised by the RewardsCoordinatorStorage contract.
type RewardsCoordinatorStorageRewardsForAllSubmitterSetIterator struct {
	Event *RewardsCoordinatorStorageRewardsForAllSubmitterSet // 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
}
⋮----
Event *RewardsCoordinatorStorageRewardsForAllSubmitterSet // Event containing the contract specifics and raw log
⋮----
// RewardsCoordinatorStorageRewardsForAllSubmitterSet represents a RewardsForAllSubmitterSet event raised by the RewardsCoordinatorStorage contract.
type RewardsCoordinatorStorageRewardsForAllSubmitterSet struct {
	RewardsForAllSubmitter common.Address
	OldValue               bool
	NewValue               bool
	Raw                    types.Log // Blockchain specific contextual infos
}
⋮----
// FilterRewardsForAllSubmitterSet is a free log retrieval operation binding the contract event 0x4de6293e668df1398422e1def12118052c1539a03cbfedc145895d48d7685f1c.
⋮----
// Solidity: event RewardsForAllSubmitterSet(address indexed rewardsForAllSubmitter, bool indexed oldValue, bool indexed newValue)
func (_RewardsCoordinatorStorage *RewardsCoordinatorStorageFilterer) FilterRewardsForAllSubmitterSet(opts *bind.FilterOpts, rewardsForAllSubmitter []common.Address, oldValue []bool, newValue []bool) (*RewardsCoordinatorStorageRewardsForAllSubmitterSetIterator, error)
⋮----
var rewardsForAllSubmitterRule []interface{}
⋮----
// WatchRewardsForAllSubmitterSet is a free log subscription operation binding the contract event 0x4de6293e668df1398422e1def12118052c1539a03cbfedc145895d48d7685f1c.
⋮----
func (_RewardsCoordinatorStorage *RewardsCoordinatorStorageFilterer) WatchRewardsForAllSubmitterSet(opts *bind.WatchOpts, sink chan<- *RewardsCoordinatorStorageRewardsForAllSubmitterSet, rewardsForAllSubmitter []common.Address, oldValue []bool, newValue []bool) (event.Subscription, error)
⋮----
// ParseRewardsForAllSubmitterSet is a log parse operation binding the contract event 0x4de6293e668df1398422e1def12118052c1539a03cbfedc145895d48d7685f1c.
⋮----
func (_RewardsCoordinatorStorage *RewardsCoordinatorStorageFilterer) ParseRewardsForAllSubmitterSet(log types.Log) (*RewardsCoordinatorStorageRewardsForAllSubmitterSet, error)
⋮----
// RewardsCoordinatorStorageRewardsSubmissionForAllCreatedIterator is returned from FilterRewardsSubmissionForAllCreated and is used to iterate over the raw logs and unpacked data for RewardsSubmissionForAllCreated events raised by the RewardsCoordinatorStorage contract.
type RewardsCoordinatorStorageRewardsSubmissionForAllCreatedIterator struct {
	Event *RewardsCoordinatorStorageRewardsSubmissionForAllCreated // 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
}
⋮----
Event *RewardsCoordinatorStorageRewardsSubmissionForAllCreated // Event containing the contract specifics and raw log
⋮----
// RewardsCoordinatorStorageRewardsSubmissionForAllCreated represents a RewardsSubmissionForAllCreated event raised by the RewardsCoordinatorStorage contract.
type RewardsCoordinatorStorageRewardsSubmissionForAllCreated struct {
	Submitter             common.Address
	SubmissionNonce       *big.Int
	RewardsSubmissionHash [32]byte
	RewardsSubmission     IRewardsCoordinatorTypesRewardsSubmission
	Raw                   types.Log // Blockchain specific contextual infos
}
⋮----
// FilterRewardsSubmissionForAllCreated is a free log retrieval operation binding the contract event 0x51088b8c89628df3a8174002c2a034d0152fce6af8415d651b2a4734bf270482.
⋮----
// Solidity: event RewardsSubmissionForAllCreated(address indexed submitter, uint256 indexed submissionNonce, bytes32 indexed rewardsSubmissionHash, ((address,uint96)[],address,uint256,uint32,uint32) rewardsSubmission)
func (_RewardsCoordinatorStorage *RewardsCoordinatorStorageFilterer) FilterRewardsSubmissionForAllCreated(opts *bind.FilterOpts, submitter []common.Address, submissionNonce []*big.Int, rewardsSubmissionHash [][32]byte) (*RewardsCoordinatorStorageRewardsSubmissionForAllCreatedIterator, error)
⋮----
// WatchRewardsSubmissionForAllCreated is a free log subscription operation binding the contract event 0x51088b8c89628df3a8174002c2a034d0152fce6af8415d651b2a4734bf270482.
⋮----
func (_RewardsCoordinatorStorage *RewardsCoordinatorStorageFilterer) WatchRewardsSubmissionForAllCreated(opts *bind.WatchOpts, sink chan<- *RewardsCoordinatorStorageRewardsSubmissionForAllCreated, submitter []common.Address, submissionNonce []*big.Int, rewardsSubmissionHash [][32]byte) (event.Subscription, error)
⋮----
// ParseRewardsSubmissionForAllCreated is a log parse operation binding the contract event 0x51088b8c89628df3a8174002c2a034d0152fce6af8415d651b2a4734bf270482.
⋮----
func (_RewardsCoordinatorStorage *RewardsCoordinatorStorageFilterer) ParseRewardsSubmissionForAllCreated(log types.Log) (*RewardsCoordinatorStorageRewardsSubmissionForAllCreated, error)
⋮----
// RewardsCoordinatorStorageRewardsSubmissionForAllEarnersCreatedIterator is returned from FilterRewardsSubmissionForAllEarnersCreated and is used to iterate over the raw logs and unpacked data for RewardsSubmissionForAllEarnersCreated events raised by the RewardsCoordinatorStorage contract.
type RewardsCoordinatorStorageRewardsSubmissionForAllEarnersCreatedIterator struct {
	Event *RewardsCoordinatorStorageRewardsSubmissionForAllEarnersCreated // 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
}
⋮----
Event *RewardsCoordinatorStorageRewardsSubmissionForAllEarnersCreated // Event containing the contract specifics and raw log
⋮----
// RewardsCoordinatorStorageRewardsSubmissionForAllEarnersCreated represents a RewardsSubmissionForAllEarnersCreated event raised by the RewardsCoordinatorStorage contract.
type RewardsCoordinatorStorageRewardsSubmissionForAllEarnersCreated struct {
	TokenHopper           common.Address
	SubmissionNonce       *big.Int
	RewardsSubmissionHash [32]byte
	RewardsSubmission     IRewardsCoordinatorTypesRewardsSubmission
	Raw                   types.Log // Blockchain specific contextual infos
}
⋮----
// FilterRewardsSubmissionForAllEarnersCreated is a free log retrieval operation binding the contract event 0x5251b6fdefcb5d81144e735f69ea4c695fd43b0289ca53dc075033f5fc80068b.
⋮----
// Solidity: event RewardsSubmissionForAllEarnersCreated(address indexed tokenHopper, uint256 indexed submissionNonce, bytes32 indexed rewardsSubmissionHash, ((address,uint96)[],address,uint256,uint32,uint32) rewardsSubmission)
func (_RewardsCoordinatorStorage *RewardsCoordinatorStorageFilterer) FilterRewardsSubmissionForAllEarnersCreated(opts *bind.FilterOpts, tokenHopper []common.Address, submissionNonce []*big.Int, rewardsSubmissionHash [][32]byte) (*RewardsCoordinatorStorageRewardsSubmissionForAllEarnersCreatedIterator, error)
⋮----
var tokenHopperRule []interface{}
⋮----
// WatchRewardsSubmissionForAllEarnersCreated is a free log subscription operation binding the contract event 0x5251b6fdefcb5d81144e735f69ea4c695fd43b0289ca53dc075033f5fc80068b.
⋮----
func (_RewardsCoordinatorStorage *RewardsCoordinatorStorageFilterer) WatchRewardsSubmissionForAllEarnersCreated(opts *bind.WatchOpts, sink chan<- *RewardsCoordinatorStorageRewardsSubmissionForAllEarnersCreated, tokenHopper []common.Address, submissionNonce []*big.Int, rewardsSubmissionHash [][32]byte) (event.Subscription, error)
⋮----
// ParseRewardsSubmissionForAllEarnersCreated is a log parse operation binding the contract event 0x5251b6fdefcb5d81144e735f69ea4c695fd43b0289ca53dc075033f5fc80068b.
⋮----
func (_RewardsCoordinatorStorage *RewardsCoordinatorStorageFilterer) ParseRewardsSubmissionForAllEarnersCreated(log types.Log) (*RewardsCoordinatorStorageRewardsSubmissionForAllEarnersCreated, error)
⋮----
// RewardsCoordinatorStorageRewardsUpdaterSetIterator is returned from FilterRewardsUpdaterSet and is used to iterate over the raw logs and unpacked data for RewardsUpdaterSet events raised by the RewardsCoordinatorStorage contract.
type RewardsCoordinatorStorageRewardsUpdaterSetIterator struct {
	Event *RewardsCoordinatorStorageRewardsUpdaterSet // 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
}
⋮----
Event *RewardsCoordinatorStorageRewardsUpdaterSet // Event containing the contract specifics and raw log
⋮----
// RewardsCoordinatorStorageRewardsUpdaterSet represents a RewardsUpdaterSet event raised by the RewardsCoordinatorStorage contract.
type RewardsCoordinatorStorageRewardsUpdaterSet struct {
	OldRewardsUpdater common.Address
	NewRewardsUpdater common.Address
	Raw               types.Log // Blockchain specific contextual infos
}
⋮----
Raw               types.Log // Blockchain specific contextual infos
⋮----
// FilterRewardsUpdaterSet is a free log retrieval operation binding the contract event 0x237b82f438d75fc568ebab484b75b01d9287b9e98b490b7c23221623b6705dbb.
⋮----
// Solidity: event RewardsUpdaterSet(address indexed oldRewardsUpdater, address indexed newRewardsUpdater)
func (_RewardsCoordinatorStorage *RewardsCoordinatorStorageFilterer) FilterRewardsUpdaterSet(opts *bind.FilterOpts, oldRewardsUpdater []common.Address, newRewardsUpdater []common.Address) (*RewardsCoordinatorStorageRewardsUpdaterSetIterator, error)
⋮----
var oldRewardsUpdaterRule []interface{}
⋮----
var newRewardsUpdaterRule []interface{}
⋮----
// WatchRewardsUpdaterSet is a free log subscription operation binding the contract event 0x237b82f438d75fc568ebab484b75b01d9287b9e98b490b7c23221623b6705dbb.
⋮----
func (_RewardsCoordinatorStorage *RewardsCoordinatorStorageFilterer) WatchRewardsUpdaterSet(opts *bind.WatchOpts, sink chan<- *RewardsCoordinatorStorageRewardsUpdaterSet, oldRewardsUpdater []common.Address, newRewardsUpdater []common.Address) (event.Subscription, error)
⋮----
// ParseRewardsUpdaterSet is a log parse operation binding the contract event 0x237b82f438d75fc568ebab484b75b01d9287b9e98b490b7c23221623b6705dbb.
⋮----
func (_RewardsCoordinatorStorage *RewardsCoordinatorStorageFilterer) ParseRewardsUpdaterSet(log types.Log) (*RewardsCoordinatorStorageRewardsUpdaterSet, error)
⋮----
// RewardsCoordinatorStorageTotalStakeRewardsSubmissionCreatedIterator is returned from FilterTotalStakeRewardsSubmissionCreated and is used to iterate over the raw logs and unpacked data for TotalStakeRewardsSubmissionCreated events raised by the RewardsCoordinatorStorage contract.
type RewardsCoordinatorStorageTotalStakeRewardsSubmissionCreatedIterator struct {
	Event *RewardsCoordinatorStorageTotalStakeRewardsSubmissionCreated // 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
}
⋮----
Event *RewardsCoordinatorStorageTotalStakeRewardsSubmissionCreated // Event containing the contract specifics and raw log
⋮----
// RewardsCoordinatorStorageTotalStakeRewardsSubmissionCreated represents a TotalStakeRewardsSubmissionCreated event raised by the RewardsCoordinatorStorage contract.
type RewardsCoordinatorStorageTotalStakeRewardsSubmissionCreated struct {
	Caller                common.Address
	RewardsSubmissionHash [32]byte
	OperatorSet           OperatorSet
	SubmissionNonce       *big.Int
	RewardsSubmission     IRewardsCoordinatorTypesRewardsSubmission
	Raw                   types.Log // Blockchain specific contextual infos
}
⋮----
// FilterTotalStakeRewardsSubmissionCreated is a free log retrieval operation binding the contract event 0x71836f06ac5c96075d4c5b5699a92b18e9c6d91579a382e9e55a1adf097f64df.
⋮----
// Solidity: event TotalStakeRewardsSubmissionCreated(address indexed caller, bytes32 indexed rewardsSubmissionHash, (address,uint32) operatorSet, uint256 submissionNonce, ((address,uint96)[],address,uint256,uint32,uint32) rewardsSubmission)
func (_RewardsCoordinatorStorage *RewardsCoordinatorStorageFilterer) FilterTotalStakeRewardsSubmissionCreated(opts *bind.FilterOpts, caller []common.Address, rewardsSubmissionHash [][32]byte) (*RewardsCoordinatorStorageTotalStakeRewardsSubmissionCreatedIterator, error)
⋮----
// WatchTotalStakeRewardsSubmissionCreated is a free log subscription operation binding the contract event 0x71836f06ac5c96075d4c5b5699a92b18e9c6d91579a382e9e55a1adf097f64df.
⋮----
func (_RewardsCoordinatorStorage *RewardsCoordinatorStorageFilterer) WatchTotalStakeRewardsSubmissionCreated(opts *bind.WatchOpts, sink chan<- *RewardsCoordinatorStorageTotalStakeRewardsSubmissionCreated, caller []common.Address, rewardsSubmissionHash [][32]byte) (event.Subscription, error)
⋮----
// ParseTotalStakeRewardsSubmissionCreated is a log parse operation binding the contract event 0x71836f06ac5c96075d4c5b5699a92b18e9c6d91579a382e9e55a1adf097f64df.
⋮----
func (_RewardsCoordinatorStorage *RewardsCoordinatorStorageFilterer) ParseTotalStakeRewardsSubmissionCreated(log types.Log) (*RewardsCoordinatorStorageTotalStakeRewardsSubmissionCreated, error)
⋮----
// RewardsCoordinatorStorageUniqueStakeRewardsSubmissionCreatedIterator is returned from FilterUniqueStakeRewardsSubmissionCreated and is used to iterate over the raw logs and unpacked data for UniqueStakeRewardsSubmissionCreated events raised by the RewardsCoordinatorStorage contract.
type RewardsCoordinatorStorageUniqueStakeRewardsSubmissionCreatedIterator struct {
	Event *RewardsCoordinatorStorageUniqueStakeRewardsSubmissionCreated // 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
}
⋮----
Event *RewardsCoordinatorStorageUniqueStakeRewardsSubmissionCreated // Event containing the contract specifics and raw log
⋮----
// RewardsCoordinatorStorageUniqueStakeRewardsSubmissionCreated represents a UniqueStakeRewardsSubmissionCreated event raised by the RewardsCoordinatorStorage contract.
type RewardsCoordinatorStorageUniqueStakeRewardsSubmissionCreated struct {
	Caller                common.Address
	RewardsSubmissionHash [32]byte
	OperatorSet           OperatorSet
	SubmissionNonce       *big.Int
	RewardsSubmission     IRewardsCoordinatorTypesRewardsSubmission
	Raw                   types.Log // Blockchain specific contextual infos
}
⋮----
// FilterUniqueStakeRewardsSubmissionCreated is a free log retrieval operation binding the contract event 0xb3337dc034abe0f5e3694e1f115f3d6ec9fcee74e7835ea68f6e2d29bbc1b0aa.
⋮----
// Solidity: event UniqueStakeRewardsSubmissionCreated(address indexed caller, bytes32 indexed rewardsSubmissionHash, (address,uint32) operatorSet, uint256 submissionNonce, ((address,uint96)[],address,uint256,uint32,uint32) rewardsSubmission)
func (_RewardsCoordinatorStorage *RewardsCoordinatorStorageFilterer) FilterUniqueStakeRewardsSubmissionCreated(opts *bind.FilterOpts, caller []common.Address, rewardsSubmissionHash [][32]byte) (*RewardsCoordinatorStorageUniqueStakeRewardsSubmissionCreatedIterator, error)
⋮----
// WatchUniqueStakeRewardsSubmissionCreated is a free log subscription operation binding the contract event 0xb3337dc034abe0f5e3694e1f115f3d6ec9fcee74e7835ea68f6e2d29bbc1b0aa.
⋮----
func (_RewardsCoordinatorStorage *RewardsCoordinatorStorageFilterer) WatchUniqueStakeRewardsSubmissionCreated(opts *bind.WatchOpts, sink chan<- *RewardsCoordinatorStorageUniqueStakeRewardsSubmissionCreated, caller []common.Address, rewardsSubmissionHash [][32]byte) (event.Subscription, error)
⋮----
// ParseUniqueStakeRewardsSubmissionCreated is a log parse operation binding the contract event 0xb3337dc034abe0f5e3694e1f115f3d6ec9fcee74e7835ea68f6e2d29bbc1b0aa.
⋮----
func (_RewardsCoordinatorStorage *RewardsCoordinatorStorageFilterer) ParseUniqueStakeRewardsSubmissionCreated(log types.Log) (*RewardsCoordinatorStorageUniqueStakeRewardsSubmissionCreated, error)
````

## File: pkg/bindings/SemVerMixin/binding.go
````go
// Code generated - DO NOT EDIT.
// This file is a generated binding and any manual changes will be lost.
⋮----
package SemVerMixin
⋮----
import (
	"errors"
	"math/big"
	"strings"

	ethereum "github.com/ethereum/go-ethereum"
	"github.com/ethereum/go-ethereum/accounts/abi"
	"github.com/ethereum/go-ethereum/accounts/abi/bind"
	"github.com/ethereum/go-ethereum/common"
	"github.com/ethereum/go-ethereum/core/types"
	"github.com/ethereum/go-ethereum/event"
)
⋮----
"errors"
"math/big"
"strings"
⋮----
ethereum "github.com/ethereum/go-ethereum"
"github.com/ethereum/go-ethereum/accounts/abi"
"github.com/ethereum/go-ethereum/accounts/abi/bind"
"github.com/ethereum/go-ethereum/common"
"github.com/ethereum/go-ethereum/core/types"
"github.com/ethereum/go-ethereum/event"
⋮----
// Reference imports to suppress errors if they are not otherwise used.
var (
	_ = errors.New
	_ = big.NewInt
	_ = strings.NewReader
	_ = ethereum.NotFound
	_ = bind.Bind
	_ = common.Big1
	_ = types.BloomLookup
	_ = event.NewSubscription
	_ = abi.ConvertType
)
⋮----
// SemVerMixinMetaData contains all meta data concerning the SemVerMixin contract.
var SemVerMixinMetaData = &bind.MetaData{
	ABI: "[{\"type\":\"function\",\"name\":\"version\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"string\",\"internalType\":\"string\"}],\"stateMutability\":\"view\"},{\"type\":\"error\",\"name\":\"InvalidShortString\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"StringTooLong\",\"inputs\":[{\"name\":\"str\",\"type\":\"string\",\"internalType\":\"string\"}]}]",
}
⋮----
// SemVerMixinABI is the input ABI used to generate the binding from.
// Deprecated: Use SemVerMixinMetaData.ABI instead.
var SemVerMixinABI = SemVerMixinMetaData.ABI
⋮----
// SemVerMixin is an auto generated Go binding around an Ethereum contract.
type SemVerMixin struct {
	SemVerMixinCaller     // Read-only binding to the contract
	SemVerMixinTransactor // Write-only binding to the contract
	SemVerMixinFilterer   // Log filterer for contract events
}
⋮----
SemVerMixinCaller     // Read-only binding to the contract
SemVerMixinTransactor // Write-only binding to the contract
SemVerMixinFilterer   // Log filterer for contract events
⋮----
// SemVerMixinCaller is an auto generated read-only Go binding around an Ethereum contract.
type SemVerMixinCaller struct {
	contract *bind.BoundContract // Generic contract wrapper for the low level calls
}
⋮----
contract *bind.BoundContract // Generic contract wrapper for the low level calls
⋮----
// SemVerMixinTransactor is an auto generated write-only Go binding around an Ethereum contract.
type SemVerMixinTransactor struct {
	contract *bind.BoundContract // Generic contract wrapper for the low level calls
}
⋮----
// SemVerMixinFilterer is an auto generated log filtering Go binding around an Ethereum contract events.
type SemVerMixinFilterer struct {
	contract *bind.BoundContract // Generic contract wrapper for the low level calls
}
⋮----
// SemVerMixinSession is an auto generated Go binding around an Ethereum contract,
// with pre-set call and transact options.
type SemVerMixinSession struct {
	Contract     *SemVerMixin      // Generic contract binding to set the session for
	CallOpts     bind.CallOpts     // Call options to use throughout this session
	TransactOpts bind.TransactOpts // Transaction auth options to use throughout this session
}
⋮----
Contract     *SemVerMixin      // Generic contract binding to set the session for
CallOpts     bind.CallOpts     // Call options to use throughout this session
TransactOpts bind.TransactOpts // Transaction auth options to use throughout this session
⋮----
// SemVerMixinCallerSession is an auto generated read-only Go binding around an Ethereum contract,
// with pre-set call options.
type SemVerMixinCallerSession struct {
	Contract *SemVerMixinCaller // Generic contract caller binding to set the session for
	CallOpts bind.CallOpts      // Call options to use throughout this session
}
⋮----
Contract *SemVerMixinCaller // Generic contract caller binding to set the session for
CallOpts bind.CallOpts      // Call options to use throughout this session
⋮----
// SemVerMixinTransactorSession is an auto generated write-only Go binding around an Ethereum contract,
// with pre-set transact options.
type SemVerMixinTransactorSession struct {
	Contract     *SemVerMixinTransactor // Generic contract transactor binding to set the session for
	TransactOpts bind.TransactOpts      // Transaction auth options to use throughout this session
}
⋮----
Contract     *SemVerMixinTransactor // Generic contract transactor binding to set the session for
TransactOpts bind.TransactOpts      // Transaction auth options to use throughout this session
⋮----
// SemVerMixinRaw is an auto generated low-level Go binding around an Ethereum contract.
type SemVerMixinRaw struct {
	Contract *SemVerMixin // Generic contract binding to access the raw methods on
}
⋮----
Contract *SemVerMixin // Generic contract binding to access the raw methods on
⋮----
// SemVerMixinCallerRaw is an auto generated low-level read-only Go binding around an Ethereum contract.
type SemVerMixinCallerRaw struct {
	Contract *SemVerMixinCaller // Generic read-only contract binding to access the raw methods on
}
⋮----
Contract *SemVerMixinCaller // Generic read-only contract binding to access the raw methods on
⋮----
// SemVerMixinTransactorRaw is an auto generated low-level write-only Go binding around an Ethereum contract.
type SemVerMixinTransactorRaw struct {
	Contract *SemVerMixinTransactor // Generic write-only contract binding to access the raw methods on
}
⋮----
Contract *SemVerMixinTransactor // Generic write-only contract binding to access the raw methods on
⋮----
// NewSemVerMixin creates a new instance of SemVerMixin, bound to a specific deployed contract.
func NewSemVerMixin(address common.Address, backend bind.ContractBackend) (*SemVerMixin, error)
⋮----
// NewSemVerMixinCaller creates a new read-only instance of SemVerMixin, bound to a specific deployed contract.
func NewSemVerMixinCaller(address common.Address, caller bind.ContractCaller) (*SemVerMixinCaller, error)
⋮----
// NewSemVerMixinTransactor creates a new write-only instance of SemVerMixin, bound to a specific deployed contract.
func NewSemVerMixinTransactor(address common.Address, transactor bind.ContractTransactor) (*SemVerMixinTransactor, error)
⋮----
// NewSemVerMixinFilterer creates a new log filterer instance of SemVerMixin, bound to a specific deployed contract.
func NewSemVerMixinFilterer(address common.Address, filterer bind.ContractFilterer) (*SemVerMixinFilterer, error)
⋮----
// bindSemVerMixin binds a generic wrapper to an already deployed contract.
func bindSemVerMixin(address common.Address, caller bind.ContractCaller, transactor bind.ContractTransactor, filterer bind.ContractFilterer) (*bind.BoundContract, error)
⋮----
// Call invokes the (constant) contract method with params as input values and
// sets the output to result. The result type might be a single field for simple
// returns, a slice of interfaces for anonymous returns and a struct for named
// returns.
func (_SemVerMixin *SemVerMixinRaw) Call(opts *bind.CallOpts, result *[]interface
⋮----
// Transfer initiates a plain transaction to move funds to the contract, calling
// its default method if one is available.
func (_SemVerMixin *SemVerMixinRaw) Transfer(opts *bind.TransactOpts) (*types.Transaction, error)
⋮----
// Transact invokes the (paid) contract method with params as input values.
func (_SemVerMixin *SemVerMixinRaw) Transact(opts *bind.TransactOpts, method string, params ...interface
⋮----
// Version is a free data retrieval call binding the contract method 0x54fd4d50.
//
// Solidity: function version() view returns(string)
func (_SemVerMixin *SemVerMixinCaller) Version(opts *bind.CallOpts) (string, error)
⋮----
var out []interface{}
````

## File: pkg/bindings/SignatureUtils/binding.go
````go
// Code generated - DO NOT EDIT.
// This file is a generated binding and any manual changes will be lost.
⋮----
package SignatureUtils
⋮----
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"
)
⋮----
"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
)
⋮----
// SignatureUtilsMetaData contains all meta data concerning the SignatureUtils contract.
var SignatureUtilsMetaData = &bind.MetaData{
	ABI: "[{\"type\":\"function\",\"name\":\"domainSeparator\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"error\",\"name\":\"InvalidSignature\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"SignatureExpired\",\"inputs\":[]}]",
}
⋮----
// SignatureUtilsABI is the input ABI used to generate the binding from.
// Deprecated: Use SignatureUtilsMetaData.ABI instead.
var SignatureUtilsABI = SignatureUtilsMetaData.ABI
⋮----
// SignatureUtils is an auto generated Go binding around an Ethereum contract.
type SignatureUtils struct {
	SignatureUtilsCaller     // Read-only binding to the contract
	SignatureUtilsTransactor // Write-only binding to the contract
	SignatureUtilsFilterer   // Log filterer for contract events
}
⋮----
SignatureUtilsCaller     // Read-only binding to the contract
SignatureUtilsTransactor // Write-only binding to the contract
SignatureUtilsFilterer   // Log filterer for contract events
⋮----
// SignatureUtilsCaller is an auto generated read-only Go binding around an Ethereum contract.
type SignatureUtilsCaller struct {
	contract *bind.BoundContract // Generic contract wrapper for the low level calls
}
⋮----
contract *bind.BoundContract // Generic contract wrapper for the low level calls
⋮----
// SignatureUtilsTransactor is an auto generated write-only Go binding around an Ethereum contract.
type SignatureUtilsTransactor struct {
	contract *bind.BoundContract // Generic contract wrapper for the low level calls
}
⋮----
// SignatureUtilsFilterer is an auto generated log filtering Go binding around an Ethereum contract events.
type SignatureUtilsFilterer struct {
	contract *bind.BoundContract // Generic contract wrapper for the low level calls
}
⋮----
// SignatureUtilsSession is an auto generated Go binding around an Ethereum contract,
// with pre-set call and transact options.
type SignatureUtilsSession struct {
	Contract     *SignatureUtils   // 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
}
⋮----
Contract     *SignatureUtils   // 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
⋮----
// SignatureUtilsCallerSession is an auto generated read-only Go binding around an Ethereum contract,
// with pre-set call options.
type SignatureUtilsCallerSession struct {
	Contract *SignatureUtilsCaller // Generic contract caller binding to set the session for
	CallOpts bind.CallOpts         // Call options to use throughout this session
}
⋮----
Contract *SignatureUtilsCaller // Generic contract caller binding to set the session for
CallOpts bind.CallOpts         // Call options to use throughout this session
⋮----
// SignatureUtilsTransactorSession is an auto generated write-only Go binding around an Ethereum contract,
// with pre-set transact options.
type SignatureUtilsTransactorSession struct {
	Contract     *SignatureUtilsTransactor // Generic contract transactor binding to set the session for
	TransactOpts bind.TransactOpts         // Transaction auth options to use throughout this session
}
⋮----
Contract     *SignatureUtilsTransactor // Generic contract transactor binding to set the session for
TransactOpts bind.TransactOpts         // Transaction auth options to use throughout this session
⋮----
// SignatureUtilsRaw is an auto generated low-level Go binding around an Ethereum contract.
type SignatureUtilsRaw struct {
	Contract *SignatureUtils // Generic contract binding to access the raw methods on
}
⋮----
Contract *SignatureUtils // Generic contract binding to access the raw methods on
⋮----
// SignatureUtilsCallerRaw is an auto generated low-level read-only Go binding around an Ethereum contract.
type SignatureUtilsCallerRaw struct {
	Contract *SignatureUtilsCaller // Generic read-only contract binding to access the raw methods on
}
⋮----
Contract *SignatureUtilsCaller // Generic read-only contract binding to access the raw methods on
⋮----
// SignatureUtilsTransactorRaw is an auto generated low-level write-only Go binding around an Ethereum contract.
type SignatureUtilsTransactorRaw struct {
	Contract *SignatureUtilsTransactor // Generic write-only contract binding to access the raw methods on
}
⋮----
Contract *SignatureUtilsTransactor // Generic write-only contract binding to access the raw methods on
⋮----
// NewSignatureUtils creates a new instance of SignatureUtils, bound to a specific deployed contract.
func NewSignatureUtils(address common.Address, backend bind.ContractBackend) (*SignatureUtils, error)
⋮----
// NewSignatureUtilsCaller creates a new read-only instance of SignatureUtils, bound to a specific deployed contract.
func NewSignatureUtilsCaller(address common.Address, caller bind.ContractCaller) (*SignatureUtilsCaller, error)
⋮----
// NewSignatureUtilsTransactor creates a new write-only instance of SignatureUtils, bound to a specific deployed contract.
func NewSignatureUtilsTransactor(address common.Address, transactor bind.ContractTransactor) (*SignatureUtilsTransactor, error)
⋮----
// NewSignatureUtilsFilterer creates a new log filterer instance of SignatureUtils, bound to a specific deployed contract.
func NewSignatureUtilsFilterer(address common.Address, filterer bind.ContractFilterer) (*SignatureUtilsFilterer, error)
⋮----
// bindSignatureUtils binds a generic wrapper to an already deployed contract.
func bindSignatureUtils(address common.Address, caller bind.ContractCaller, transactor bind.ContractTransactor, filterer bind.ContractFilterer) (*bind.BoundContract, error)
⋮----
// 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 (_SignatureUtils *SignatureUtilsRaw) Call(opts *bind.CallOpts, result *[]interface
⋮----
// Transfer initiates a plain transaction to move funds to the contract, calling
// its default method if one is available.
func (_SignatureUtils *SignatureUtilsRaw) Transfer(opts *bind.TransactOpts) (*types.Transaction, error)
⋮----
// Transact invokes the (paid) contract method with params as input values.
func (_SignatureUtils *SignatureUtilsRaw) Transact(opts *bind.TransactOpts, method string, params ...interface
⋮----
// DomainSeparator is a free data retrieval call binding the contract method 0xf698da25.
//
// Solidity: function domainSeparator() view returns(bytes32)
func (_SignatureUtils *SignatureUtilsCaller) DomainSeparator(opts *bind.CallOpts) ([32]byte, error)
⋮----
var out []interface{}
````

## File: pkg/bindings/SignatureUtilsMixin/binding.go
````go
// Code generated - DO NOT EDIT.
// This file is a generated binding and any manual changes will be lost.
⋮----
package SignatureUtilsMixin
⋮----
import (
	"errors"
	"math/big"
	"strings"

	ethereum "github.com/ethereum/go-ethereum"
	"github.com/ethereum/go-ethereum/accounts/abi"
	"github.com/ethereum/go-ethereum/accounts/abi/bind"
	"github.com/ethereum/go-ethereum/common"
	"github.com/ethereum/go-ethereum/core/types"
	"github.com/ethereum/go-ethereum/event"
)
⋮----
"errors"
"math/big"
"strings"
⋮----
ethereum "github.com/ethereum/go-ethereum"
"github.com/ethereum/go-ethereum/accounts/abi"
"github.com/ethereum/go-ethereum/accounts/abi/bind"
"github.com/ethereum/go-ethereum/common"
"github.com/ethereum/go-ethereum/core/types"
"github.com/ethereum/go-ethereum/event"
⋮----
// Reference imports to suppress errors if they are not otherwise used.
var (
	_ = errors.New
	_ = big.NewInt
	_ = strings.NewReader
	_ = ethereum.NotFound
	_ = bind.Bind
	_ = common.Big1
	_ = types.BloomLookup
	_ = event.NewSubscription
	_ = abi.ConvertType
)
⋮----
// SignatureUtilsMixinMetaData contains all meta data concerning the SignatureUtilsMixin contract.
var SignatureUtilsMixinMetaData = &bind.MetaData{
	ABI: "[{\"type\":\"function\",\"name\":\"domainSeparator\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"version\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"string\",\"internalType\":\"string\"}],\"stateMutability\":\"view\"},{\"type\":\"error\",\"name\":\"InvalidShortString\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidSignature\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"SignatureExpired\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"StringTooLong\",\"inputs\":[{\"name\":\"str\",\"type\":\"string\",\"internalType\":\"string\"}]}]",
}
⋮----
// SignatureUtilsMixinABI is the input ABI used to generate the binding from.
// Deprecated: Use SignatureUtilsMixinMetaData.ABI instead.
var SignatureUtilsMixinABI = SignatureUtilsMixinMetaData.ABI
⋮----
// SignatureUtilsMixin is an auto generated Go binding around an Ethereum contract.
type SignatureUtilsMixin struct {
	SignatureUtilsMixinCaller     // Read-only binding to the contract
	SignatureUtilsMixinTransactor // Write-only binding to the contract
	SignatureUtilsMixinFilterer   // Log filterer for contract events
}
⋮----
SignatureUtilsMixinCaller     // Read-only binding to the contract
SignatureUtilsMixinTransactor // Write-only binding to the contract
SignatureUtilsMixinFilterer   // Log filterer for contract events
⋮----
// SignatureUtilsMixinCaller is an auto generated read-only Go binding around an Ethereum contract.
type SignatureUtilsMixinCaller struct {
	contract *bind.BoundContract // Generic contract wrapper for the low level calls
}
⋮----
contract *bind.BoundContract // Generic contract wrapper for the low level calls
⋮----
// SignatureUtilsMixinTransactor is an auto generated write-only Go binding around an Ethereum contract.
type SignatureUtilsMixinTransactor struct {
	contract *bind.BoundContract // Generic contract wrapper for the low level calls
}
⋮----
// SignatureUtilsMixinFilterer is an auto generated log filtering Go binding around an Ethereum contract events.
type SignatureUtilsMixinFilterer struct {
	contract *bind.BoundContract // Generic contract wrapper for the low level calls
}
⋮----
// SignatureUtilsMixinSession is an auto generated Go binding around an Ethereum contract,
// with pre-set call and transact options.
type SignatureUtilsMixinSession struct {
	Contract     *SignatureUtilsMixin // Generic contract binding to set the session for
	CallOpts     bind.CallOpts        // Call options to use throughout this session
	TransactOpts bind.TransactOpts    // Transaction auth options to use throughout this session
}
⋮----
Contract     *SignatureUtilsMixin // Generic contract binding to set the session for
CallOpts     bind.CallOpts        // Call options to use throughout this session
TransactOpts bind.TransactOpts    // Transaction auth options to use throughout this session
⋮----
// SignatureUtilsMixinCallerSession is an auto generated read-only Go binding around an Ethereum contract,
// with pre-set call options.
type SignatureUtilsMixinCallerSession struct {
	Contract *SignatureUtilsMixinCaller // Generic contract caller binding to set the session for
	CallOpts bind.CallOpts              // Call options to use throughout this session
}
⋮----
Contract *SignatureUtilsMixinCaller // Generic contract caller binding to set the session for
CallOpts bind.CallOpts              // Call options to use throughout this session
⋮----
// SignatureUtilsMixinTransactorSession is an auto generated write-only Go binding around an Ethereum contract,
// with pre-set transact options.
type SignatureUtilsMixinTransactorSession struct {
	Contract     *SignatureUtilsMixinTransactor // Generic contract transactor binding to set the session for
	TransactOpts bind.TransactOpts              // Transaction auth options to use throughout this session
}
⋮----
Contract     *SignatureUtilsMixinTransactor // Generic contract transactor binding to set the session for
TransactOpts bind.TransactOpts              // Transaction auth options to use throughout this session
⋮----
// SignatureUtilsMixinRaw is an auto generated low-level Go binding around an Ethereum contract.
type SignatureUtilsMixinRaw struct {
	Contract *SignatureUtilsMixin // Generic contract binding to access the raw methods on
}
⋮----
Contract *SignatureUtilsMixin // Generic contract binding to access the raw methods on
⋮----
// SignatureUtilsMixinCallerRaw is an auto generated low-level read-only Go binding around an Ethereum contract.
type SignatureUtilsMixinCallerRaw struct {
	Contract *SignatureUtilsMixinCaller // Generic read-only contract binding to access the raw methods on
}
⋮----
Contract *SignatureUtilsMixinCaller // Generic read-only contract binding to access the raw methods on
⋮----
// SignatureUtilsMixinTransactorRaw is an auto generated low-level write-only Go binding around an Ethereum contract.
type SignatureUtilsMixinTransactorRaw struct {
	Contract *SignatureUtilsMixinTransactor // Generic write-only contract binding to access the raw methods on
}
⋮----
Contract *SignatureUtilsMixinTransactor // Generic write-only contract binding to access the raw methods on
⋮----
// NewSignatureUtilsMixin creates a new instance of SignatureUtilsMixin, bound to a specific deployed contract.
func NewSignatureUtilsMixin(address common.Address, backend bind.ContractBackend) (*SignatureUtilsMixin, error)
⋮----
// NewSignatureUtilsMixinCaller creates a new read-only instance of SignatureUtilsMixin, bound to a specific deployed contract.
func NewSignatureUtilsMixinCaller(address common.Address, caller bind.ContractCaller) (*SignatureUtilsMixinCaller, error)
⋮----
// NewSignatureUtilsMixinTransactor creates a new write-only instance of SignatureUtilsMixin, bound to a specific deployed contract.
func NewSignatureUtilsMixinTransactor(address common.Address, transactor bind.ContractTransactor) (*SignatureUtilsMixinTransactor, error)
⋮----
// NewSignatureUtilsMixinFilterer creates a new log filterer instance of SignatureUtilsMixin, bound to a specific deployed contract.
func NewSignatureUtilsMixinFilterer(address common.Address, filterer bind.ContractFilterer) (*SignatureUtilsMixinFilterer, error)
⋮----
// bindSignatureUtilsMixin binds a generic wrapper to an already deployed contract.
func bindSignatureUtilsMixin(address common.Address, caller bind.ContractCaller, transactor bind.ContractTransactor, filterer bind.ContractFilterer) (*bind.BoundContract, error)
⋮----
// Call invokes the (constant) contract method with params as input values and
// sets the output to result. The result type might be a single field for simple
// returns, a slice of interfaces for anonymous returns and a struct for named
// returns.
func (_SignatureUtilsMixin *SignatureUtilsMixinRaw) Call(opts *bind.CallOpts, result *[]interface
⋮----
// Transfer initiates a plain transaction to move funds to the contract, calling
// its default method if one is available.
func (_SignatureUtilsMixin *SignatureUtilsMixinRaw) Transfer(opts *bind.TransactOpts) (*types.Transaction, error)
⋮----
// Transact invokes the (paid) contract method with params as input values.
func (_SignatureUtilsMixin *SignatureUtilsMixinRaw) Transact(opts *bind.TransactOpts, method string, params ...interface
⋮----
// DomainSeparator is a free data retrieval call binding the contract method 0xf698da25.
//
// Solidity: function domainSeparator() view returns(bytes32)
func (_SignatureUtilsMixin *SignatureUtilsMixinCaller) DomainSeparator(opts *bind.CallOpts) ([32]byte, error)
⋮----
var out []interface{}
⋮----
// Version is a free data retrieval call binding the contract method 0x54fd4d50.
⋮----
// Solidity: function version() view returns(string)
func (_SignatureUtilsMixin *SignatureUtilsMixinCaller) Version(opts *bind.CallOpts) (string, error)
````

## File: pkg/bindings/SlashEscrow/binding.go
````go
// Code generated - DO NOT EDIT.
// This file is a generated binding and any manual changes will be lost.
⋮----
package SlashEscrow
⋮----
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"
)
⋮----
"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
)
⋮----
// OperatorSet is an auto generated low-level Go binding around an user-defined struct.
type OperatorSet struct {
	Avs common.Address
	Id  uint32
}
⋮----
// SlashEscrowMetaData contains all meta data concerning the SlashEscrow contract.
var SlashEscrowMetaData = &bind.MetaData{
	ABI: "[{\"type\":\"function\",\"name\":\"releaseTokens\",\"inputs\":[{\"name\":\"slashEscrowFactory\",\"type\":\"address\",\"internalType\":\"contractISlashEscrowFactory\"},{\"name\":\"slashEscrowImplementation\",\"type\":\"address\",\"internalType\":\"contractISlashEscrow\"},{\"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\":\"recipient\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"strategy\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"verifyDeploymentParameters\",\"inputs\":[{\"name\":\"slashEscrowFactory\",\"type\":\"address\",\"internalType\":\"contractISlashEscrowFactory\"},{\"name\":\"slashEscrowImplementation\",\"type\":\"address\",\"internalType\":\"contractISlashEscrow\"},{\"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\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"error\",\"name\":\"InvalidDeploymentParameters\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"OnlySlashEscrowFactory\",\"inputs\":[]}]",
	Bin: "0x6080604052348015600e575f5ffd5b5061077b8061001c5f395ff3fe608060405234801561000f575f5ffd5b5060043610610034575f3560e01c80630d9e4ef114610038578063ff491e651461005f575b5f5ffd5b61004b61004636600461054b565b610074565b604051901515815260200160405180910390f35b61007261006d366004610598565b61012d565b005b5f306101188561009161008c3688900388018861060c565b610269565b6040805160208101929092528101869052606001604051602081830303815290604052805190602001208860405160388101919091526f5af43d82803e903d91602b57fd5bf3ff60248201526014810192909252733d602d80600a3d3981f3363d3d373d3d3d363d73825260588201526037600c8201206078820152605560439091012090565b6001600160a01b03161490505b949350505050565b61013986868686610074565b610156576040516308429e4760e31b815260040160405180910390fd5b336001600160a01b0387161461017f57604051637dbfb55b60e11b815260040160405180910390fd5b5f816001600160a01b0316632495a5996040518163ffffffff1660e01b8152600401602060405180830381865afa1580156101bc573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906101e0919061067f565b6040516370a0823160e01b81523060048201529091506102609084906001600160a01b038416906370a0823190602401602060405180830381865afa15801561022b573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061024f91906106a1565b6001600160a01b03841691906102d2565b50505050505050565b5f815f0151826020015163ffffffff166040516020016102b492919060609290921b6bffffffffffffffffffffffff1916825260a01b6001600160a01b031916601482015260200190565b6040516020818303038152906040526102cc906106b8565b92915050565b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b031663a9059cbb60e01b179052610324908490610329565b505050565b5f61037d826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b03166104019092919063ffffffff16565b905080515f148061039d57508080602001905181019061039d91906106db565b6103245760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b60648201526084015b60405180910390fd5b606061012584845f85855f5f866001600160a01b0316858760405161042691906106fa565b5f6040518083038185875af1925050503d805f8114610460576040519150601f19603f3d011682016040523d82523d5f602084013e610465565b606091505b509150915061047687838387610481565b979650505050505050565b606083156104ef5782515f036104e8576001600160a01b0385163b6104e85760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e747261637400000060448201526064016103f8565b5081610125565b61012583838151156105045781518083602001fd5b8060405162461bcd60e51b81526004016103f89190610710565b6001600160a01b0381168114610532575f5ffd5b50565b5f60408284031215610545575f5ffd5b50919050565b5f5f5f5f60a0858703121561055e575f5ffd5b84356105698161051e565b935060208501356105798161051e565b92506105888660408701610535565b9396929550929360800135925050565b5f5f5f5f5f5f60e087890312156105ad575f5ffd5b86356105b88161051e565b955060208701356105c88161051e565b94506105d78860408901610535565b93506080870135925060a08701356105ee8161051e565b915060c08701356105fe8161051e565b809150509295509295509295565b5f604082840312801561061d575f5ffd5b506040805190810167ffffffffffffffff8111828210171561064d57634e487b7160e01b5f52604160045260245ffd5b604052823561065b8161051e565b8152602083013563ffffffff81168114610673575f5ffd5b60208201529392505050565b5f6020828403121561068f575f5ffd5b815161069a8161051e565b9392505050565b5f602082840312156106b1575f5ffd5b5051919050565b80516020808301519190811015610545575f1960209190910360031b1b16919050565b5f602082840312156106eb575f5ffd5b8151801515811461069a575f5ffd5b5f82518060208501845e5f920191825250919050565b602081525f82518060208401528060208501604085015e5f604082850101526040601f19601f8301168401019150509291505056fea26469706673582212205d2269668ed91fcb8ef86a7c07c9513e5dadc6b928f43dc2374c6b4ae1f09f9f64736f6c634300081b0033",
}
⋮----
// SlashEscrowABI is the input ABI used to generate the binding from.
// Deprecated: Use SlashEscrowMetaData.ABI instead.
var SlashEscrowABI = SlashEscrowMetaData.ABI
⋮----
// SlashEscrowBin is the compiled bytecode used for deploying new contracts.
// Deprecated: Use SlashEscrowMetaData.Bin instead.
var SlashEscrowBin = SlashEscrowMetaData.Bin
⋮----
// DeploySlashEscrow deploys a new Ethereum contract, binding an instance of SlashEscrow to it.
func DeploySlashEscrow(auth *bind.TransactOpts, backend bind.ContractBackend) (common.Address, *types.Transaction, *SlashEscrow, error)
⋮----
// SlashEscrow is an auto generated Go binding around an Ethereum contract.
type SlashEscrow struct {
	SlashEscrowCaller     // Read-only binding to the contract
	SlashEscrowTransactor // Write-only binding to the contract
	SlashEscrowFilterer   // Log filterer for contract events
}
⋮----
SlashEscrowCaller     // Read-only binding to the contract
SlashEscrowTransactor // Write-only binding to the contract
SlashEscrowFilterer   // Log filterer for contract events
⋮----
// SlashEscrowCaller is an auto generated read-only Go binding around an Ethereum contract.
type SlashEscrowCaller struct {
	contract *bind.BoundContract // Generic contract wrapper for the low level calls
}
⋮----
contract *bind.BoundContract // Generic contract wrapper for the low level calls
⋮----
// SlashEscrowTransactor is an auto generated write-only Go binding around an Ethereum contract.
type SlashEscrowTransactor struct {
	contract *bind.BoundContract // Generic contract wrapper for the low level calls
}
⋮----
// SlashEscrowFilterer is an auto generated log filtering Go binding around an Ethereum contract events.
type SlashEscrowFilterer struct {
	contract *bind.BoundContract // Generic contract wrapper for the low level calls
}
⋮----
// SlashEscrowSession is an auto generated Go binding around an Ethereum contract,
// with pre-set call and transact options.
type SlashEscrowSession struct {
	Contract     *SlashEscrow      // 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
}
⋮----
Contract     *SlashEscrow      // 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
⋮----
// SlashEscrowCallerSession is an auto generated read-only Go binding around an Ethereum contract,
// with pre-set call options.
type SlashEscrowCallerSession struct {
	Contract *SlashEscrowCaller // Generic contract caller binding to set the session for
	CallOpts bind.CallOpts      // Call options to use throughout this session
}
⋮----
Contract *SlashEscrowCaller // Generic contract caller binding to set the session for
CallOpts bind.CallOpts      // Call options to use throughout this session
⋮----
// SlashEscrowTransactorSession is an auto generated write-only Go binding around an Ethereum contract,
// with pre-set transact options.
type SlashEscrowTransactorSession struct {
	Contract     *SlashEscrowTransactor // Generic contract transactor binding to set the session for
	TransactOpts bind.TransactOpts      // Transaction auth options to use throughout this session
}
⋮----
Contract     *SlashEscrowTransactor // Generic contract transactor binding to set the session for
TransactOpts bind.TransactOpts      // Transaction auth options to use throughout this session
⋮----
// SlashEscrowRaw is an auto generated low-level Go binding around an Ethereum contract.
type SlashEscrowRaw struct {
	Contract *SlashEscrow // Generic contract binding to access the raw methods on
}
⋮----
Contract *SlashEscrow // Generic contract binding to access the raw methods on
⋮----
// SlashEscrowCallerRaw is an auto generated low-level read-only Go binding around an Ethereum contract.
type SlashEscrowCallerRaw struct {
	Contract *SlashEscrowCaller // Generic read-only contract binding to access the raw methods on
}
⋮----
Contract *SlashEscrowCaller // Generic read-only contract binding to access the raw methods on
⋮----
// SlashEscrowTransactorRaw is an auto generated low-level write-only Go binding around an Ethereum contract.
type SlashEscrowTransactorRaw struct {
	Contract *SlashEscrowTransactor // Generic write-only contract binding to access the raw methods on
}
⋮----
Contract *SlashEscrowTransactor // Generic write-only contract binding to access the raw methods on
⋮----
// NewSlashEscrow creates a new instance of SlashEscrow, bound to a specific deployed contract.
func NewSlashEscrow(address common.Address, backend bind.ContractBackend) (*SlashEscrow, error)
⋮----
// NewSlashEscrowCaller creates a new read-only instance of SlashEscrow, bound to a specific deployed contract.
func NewSlashEscrowCaller(address common.Address, caller bind.ContractCaller) (*SlashEscrowCaller, error)
⋮----
// NewSlashEscrowTransactor creates a new write-only instance of SlashEscrow, bound to a specific deployed contract.
func NewSlashEscrowTransactor(address common.Address, transactor bind.ContractTransactor) (*SlashEscrowTransactor, error)
⋮----
// NewSlashEscrowFilterer creates a new log filterer instance of SlashEscrow, bound to a specific deployed contract.
func NewSlashEscrowFilterer(address common.Address, filterer bind.ContractFilterer) (*SlashEscrowFilterer, error)
⋮----
// bindSlashEscrow binds a generic wrapper to an already deployed contract.
func bindSlashEscrow(address common.Address, caller bind.ContractCaller, transactor bind.ContractTransactor, filterer bind.ContractFilterer) (*bind.BoundContract, error)
⋮----
// 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 (_SlashEscrow *SlashEscrowRaw) Call(opts *bind.CallOpts, result *[]interface
⋮----
// Transfer initiates a plain transaction to move funds to the contract, calling
// its default method if one is available.
func (_SlashEscrow *SlashEscrowRaw) Transfer(opts *bind.TransactOpts) (*types.Transaction, error)
⋮----
// Transact invokes the (paid) contract method with params as input values.
func (_SlashEscrow *SlashEscrowRaw) Transact(opts *bind.TransactOpts, method string, params ...interface
⋮----
// VerifyDeploymentParameters is a free data retrieval call binding the contract method 0x0d9e4ef1.
//
// Solidity: function verifyDeploymentParameters(address slashEscrowFactory, address slashEscrowImplementation, (address,uint32) operatorSet, uint256 slashId) view returns(bool)
func (_SlashEscrow *SlashEscrowCaller) VerifyDeploymentParameters(opts *bind.CallOpts, slashEscrowFactory common.Address, slashEscrowImplementation common.Address, operatorSet OperatorSet, slashId *big.Int) (bool, error)
⋮----
var out []interface{}
⋮----
// ReleaseTokens is a paid mutator transaction binding the contract method 0xff491e65.
⋮----
// Solidity: function releaseTokens(address slashEscrowFactory, address slashEscrowImplementation, (address,uint32) operatorSet, uint256 slashId, address recipient, address strategy) returns()
func (_SlashEscrow *SlashEscrowTransactor) ReleaseTokens(opts *bind.TransactOpts, slashEscrowFactory common.Address, slashEscrowImplementation common.Address, operatorSet OperatorSet, slashId *big.Int, recipient common.Address, strategy common.Address) (*types.Transaction, error)
````

## File: pkg/bindings/SlashEscrowFactory/binding.go
````go
// Code generated - DO NOT EDIT.
// This file is a generated binding and any manual changes will be lost.
⋮----
package SlashEscrowFactory
⋮----
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"
)
⋮----
"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
)
⋮----
// OperatorSet is an auto generated low-level Go binding around an user-defined struct.
type OperatorSet struct {
	Avs common.Address
	Id  uint32
}
⋮----
// SlashEscrowFactoryMetaData contains all meta data concerning the SlashEscrowFactory contract.
var SlashEscrowFactoryMetaData = &bind.MetaData{
	ABI: "[{\"type\":\"constructor\",\"inputs\":[{\"name\":\"_allocationManager\",\"type\":\"address\",\"internalType\":\"contractIAllocationManager\"},{\"name\":\"_strategyManager\",\"type\":\"address\",\"internalType\":\"contractIStrategyManager\"},{\"name\":\"_pauserRegistry\",\"type\":\"address\",\"internalType\":\"contractIPauserRegistry\"},{\"name\":\"_slashEscrowImplementation\",\"type\":\"address\",\"internalType\":\"contractISlashEscrow\"},{\"name\":\"_version\",\"type\":\"string\",\"internalType\":\"string\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"allocationManager\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIAllocationManager\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"computeSlashEscrowSalt\",\"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\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"pure\"},{\"type\":\"function\",\"name\":\"getEscrowCompleteBlock\",\"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\":\"uint32\",\"internalType\":\"uint32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getEscrowStartBlock\",\"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\":\"getGlobalEscrowDelay\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getPendingEscrows\",\"inputs\":[],\"outputs\":[{\"name\":\"operatorSets\",\"type\":\"tuple[]\",\"internalType\":\"structOperatorSet[]\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]},{\"name\":\"isRedistributing\",\"type\":\"bool[]\",\"internalType\":\"bool[]\"},{\"name\":\"slashIds\",\"type\":\"uint256[][]\",\"internalType\":\"uint256[][]\"},{\"name\":\"completeBlocks\",\"type\":\"uint32[][]\",\"internalType\":\"uint32[][]\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getPendingOperatorSets\",\"inputs\":[],\"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\":\"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\":\"getPendingStrategiesForSlashId\",\"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\":\"strategies\",\"type\":\"address[]\",\"internalType\":\"contractIStrategy[]\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getPendingStrategiesForSlashIds\",\"inputs\":[{\"name\":\"operatorSet\",\"type\":\"tuple\",\"internalType\":\"structOperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]}],\"outputs\":[{\"name\":\"strategies\",\"type\":\"address[][]\",\"internalType\":\"contractIStrategy[][]\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getPendingUnderlyingAmountForStrategy\",\"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\":\"getSlashEscrow\",\"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\":\"contractISlashEscrow\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getStrategyEscrowDelay\",\"inputs\":[{\"name\":\"strategy\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getTotalPendingOperatorSets\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getTotalPendingSlashIds\",\"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\":\"getTotalPendingStrategiesForSlashId\",\"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\":\"initialize\",\"inputs\":[{\"name\":\"initialOwner\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"initialPausedStatus\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"initialGlobalDelayBlocks\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"initiateSlashEscrow\",\"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\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"isDeployedSlashEscrow\",\"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\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"isDeployedSlashEscrow\",\"inputs\":[{\"name\":\"slashEscrow\",\"type\":\"address\",\"internalType\":\"contractISlashEscrow\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"isEscrowPaused\",\"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\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"isPendingOperatorSet\",\"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\":\"isPendingSlashId\",\"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\":\"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\":\"pauseEscrow\",\"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\":[],\"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\":\"releaseSlashEscrow\",\"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\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"releaseSlashEscrowByStrategy\",\"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\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"renounceOwnership\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"setGlobalEscrowDelay\",\"inputs\":[{\"name\":\"delay\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"setStrategyEscrowDelay\",\"inputs\":[{\"name\":\"strategy\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"},{\"name\":\"delay\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"slashEscrowImplementation\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractISlashEscrow\"}],\"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\":\"unpauseEscrow\",\"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\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"version\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"string\",\"internalType\":\"string\"}],\"stateMutability\":\"view\"},{\"type\":\"event\",\"name\":\"EscrowComplete\",\"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\":\"recipient\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"EscrowPaused\",\"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\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"EscrowUnpaused\",\"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\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"GlobalEscrowDelaySet\",\"inputs\":[{\"name\":\"delay\",\"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\":\"StartEscrow\",\"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\":\"startBlock\",\"type\":\"uint32\",\"indexed\":false,\"internalType\":\"uint32\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"StrategyEscrowDelaySet\",\"inputs\":[{\"name\":\"strategy\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"contractIStrategy\"},{\"name\":\"delay\",\"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\":\"CurrentlyPaused\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"EscrowDelayNotElapsed\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"EscrowNotMature\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InputAddressZero\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidNewPausedStatus\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidShortString\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"OnlyPauser\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"OnlyRedistributionRecipient\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"OnlyStrategyManager\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"OnlyUnpauser\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"StringTooLong\",\"inputs\":[{\"name\":\"str\",\"type\":\"string\",\"internalType\":\"string\"}]}]",
	Bin: "0x610120604052348015610010575f5ffd5b50604051612e89380380612e8983398101604081905261002f916101c1565b6001600160a01b0380861660805280851660a05280831660c05281908490811661006c576040516339b190bb60e11b815260040160405180910390fd5b6001600160a01b031660e05261008181610098565b610100525061008e6100de565b5050505050610319565b5f5f829050601f815111156100cb578260405163305a27a960e01b81526004016100c291906102be565b60405180910390fd5b80516100d6826102f3565b179392505050565b5f54610100900460ff16156101455760405162461bcd60e51b815260206004820152602760248201527f496e697469616c697a61626c653a20636f6e747261637420697320696e697469604482015266616c697a696e6760c81b60648201526084016100c2565b5f5460ff90811614610194575f805460ff191660ff9081179091556040519081527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b565b6001600160a01b03811681146101aa575f5ffd5b50565b634e487b7160e01b5f52604160045260245ffd5b5f5f5f5f5f60a086880312156101d5575f5ffd5b85516101e081610196565b60208701519095506101f181610196565b604087015190945061020281610196565b606087015190935061021381610196565b60808701519092506001600160401b0381111561022e575f5ffd5b8601601f8101881361023e575f5ffd5b80516001600160401b03811115610257576102576101ad565b604051601f8201601f19908116603f011681016001600160401b0381118282101715610285576102856101ad565b6040528181528282016020018a101561029c575f5ffd5b8160208401602083015e5f602083830101528093505050509295509295909350565b602081525f82518060208401528060208501604085015e5f604082850101526040601f19601f83011684010191505092915050565b80516020808301519190811015610313575f198160200360031b1b821691505b50919050565b60805160a05160c05160e05161010051612ae66103a35f395f610a5601525f818161049601528181611c980152611f2e01525f8181610515015281816108f501528181611ad30152611ee701525f818161032a0152818161079701528181610b620152610f1701525f81816105b7015281816106ff01528181610aca01526115500152612ae65ff3fe608060405234801561000f575f5ffd5b506004361061024a575f3560e01c806378748459116101405780639b122356116100bf578063c50f4e4811610084578063c50f4e481461057d578063c8b5330c14610595578063ca8aa7c7146105b2578063e7ed076b146105d9578063f2fde38b146105ec578063fabc1cbc146105ff575f5ffd5b80639b122356146104fd578063a3c6564114610510578063a56b21e414610537578063b23ff83b14610557578063c2de70961461056a575f5ffd5b8063886f119511610105578063886f1195146104915780638a65d2d2146104b85780638d5d4036146104c65780638da5cb5b146104d95780638fc46be5146104ea575f5ffd5b8063787484591461043057806378cb9600146104435780637a9676111461044b5780637def15641461045e57806387420b071461047e575f5ffd5b8063595c6a67116101cc5780636729b5db116101915780636729b5db146103cf5780636c5ac81e146103e25780637130c423146103f5578063715018a61461041557806371e166e71461041d575f5ffd5b8063595c6a67146103765780635ac86ab71461037e5780635c975abb146103a15780635e0a64c5146103a95780635ffa5a81146103bc575f5ffd5b8063277a9f0e11610212578063277a9f0e146102e75780633453b234146102fa57806339b70e38146103255780633f292b081461034c57806354fd4d5014610361575f5ffd5b80630310f3e61461024e57806305a4dfbb1461027b5780630e475b171461029c578063136439dd146102b157806319f3db26146102c4575b5f5ffd5b61026161025c36600461233a565b610612565b60405163ffffffff90911681526020015b60405180910390f35b61028e61028936600461233a565b6106a4565b604051908152602001610272565b6102af6102aa366004612379565b6106dc565b005b6102af6102bf3660046123b7565b610838565b6102d76102d23660046123ce565b610872565b6040519015158152602001610272565b61028e6102f53660046123ce565b610887565b61030d6103083660046123ce565b6108c6565b6040516001600160a01b039091168152602001610272565b61030d7f000000000000000000000000000000000000000000000000000000000000000081565b610354610958565b6040516102729190612447565b610369610a4f565b6040516102729190612459565b6102af610a7f565b6102d761038c36600461248e565b609854600160ff9092169190911b9081161490565b60985461028e565b6102af6103b73660046124ae565b610a93565b6102af6103ca3660046123ce565b610aa7565b61028e6103dd3660046124c7565b610c65565b6102af6103f03660046124e1565b610c90565b61040861040336600461233a565b610db6565b6040516102729190612555565b6102af610e88565b6102d761042b3660046124c7565b610e99565b6102d761043e3660046123ce565b610eb7565b61028e610f01565b6102af610459366004612379565b610f0c565b61047161046c366004612567565b611090565b60405161027291906125b1565b6102d761048c3660046123ce565b6110b3565b61030d7f000000000000000000000000000000000000000000000000000000000000000081565b60075463ffffffff16610261565b6102616104d43660046125c3565b6110e8565b6065546001600160a01b031661030d565b6102af6104f83660046125de565b611126565b6102af61050b3660046123ce565b611198565b61030d7f000000000000000000000000000000000000000000000000000000000000000081565b61054a610545366004612567565b61126b565b6040516102729190612611565b61028e610565366004612379565b611329565b61028e6105783660046123ce565b611408565b61058561144d565b60405161027294939291906126fc565b6102d76105a33660046125c3565b6001600160a01b03163b151590565b61030d7f000000000000000000000000000000000000000000000000000000000000000081565b6102af6105e73660046123ce565b6117a0565b6102af6105fa3660046125c3565b611875565b6102af61060d3660046123b7565b6118eb565b5f5f61061e8484610db6565b90505f805b8251811015610672575f61064f848381518110610642576106426127ca565b60200260200101516110e8565b90508263ffffffff168163ffffffff161115610669578092505b50600101610623565b508063ffffffff1661068486866106a4565b61068e91906127f2565b6106999060016127f2565b925050505b92915050565b5f60055f6106b185611958565b815260208082019290925260409081015f90812085825290925290205463ffffffff16905092915050565b5f6106e6816119bb565b60405163079efa8760e11b81525f906001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001690630f3df50e90610734908890600401612836565b602060405180830381865afa15801561074f573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906107739190612844565b90506107808585836119e6565b6040516316a26f7b60e11b81526001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001690632d44def6906107d09088908890889060040161285f565b6020604051808303815f875af11580156107ec573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610810919061288c565b50610827858561082088886108c6565b8487611a8d565b6108318585611b9d565b5050505050565b610840611c83565b60985481811681146108655760405163c61dca5d60e01b815260040160405180910390fd5b61086e82611d26565b5050565b5f6108806105a384846108c6565b9392505050565b5f6108806004826108a56108a036889003880188612567565b611958565b81526020019081526020015f205f8481526020019081526020015f20611d63565b5f6108806108d48484611408565b6040513060388201526f5af43d82803e903d91602b57fd5bf3ff60248201527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166014820152733d602d80600a3d3981f3363d3d373d3d3d363d73815260588101919091526037600c8201206078820152605560439091012090565b60605f6109656001611d6c565b9050805167ffffffffffffffff8111156109815761098161226b565b6040519080825280602002602001820160405280156109c557816020015b604080518082019091525f808252602082015281526020019060019003908161099f5790505b5091505f5b8151811015610a4a57610a258282815181106109e8576109e86127ca565b6020026020010151604080518082019091525f80825260208201525060408051808201909152606082901c815263ffffffff909116602082015290565b838281518110610a3757610a376127ca565b60209081029190910101526001016109ca565b505090565b6060610a7a7f0000000000000000000000000000000000000000000000000000000000000000611d78565b905090565b610a87611c83565b610a915f19611d26565b565b610a9b611db5565b610aa481611e0f565b50565b5f610ab1816119bb565b60405163079efa8760e11b81525f906001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001690630f3df50e90610aff908790600401612836565b602060405180830381865afa158015610b1a573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610b3e9190612844565b9050610b4b8484836119e6565b6040516388c1029960e01b81526001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016906388c1029990610b9990879087906004016128a3565b5f604051808303815f875af1158015610bb4573d5f5f3e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052610bdb91908101906128be565b505f610c16600482610bf56108a0368a90038a018a612567565b81526020019081526020015f205f8681526020019081526020015f20611d6c565b90505f5b8151811015610c5a57610c528686610c3289896108c6565b86868681518110610c4557610c456127ca565b6020026020010151611a8d565b600101610c1a565b506108318585611b9d565b5f61069e600382610c7e6108a036879003870187612567565b81526020019081526020015f20611d63565b5f54610100900460ff1615808015610cae57505f54600160ff909116105b80610cc75750303b158015610cc757505f5460ff166001145b610d2f5760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b60648201526084015b60405180910390fd5b5f805460ff191660011790558015610d50575f805461ff0019166101001790555b610d5984611e5d565b610d6283611d26565b610d6b82611e0f565b8015610db0575f805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b50505050565b60605f60045f610dc586611958565b81526020019081526020015f205f8481526020019081526020015f2090505f610ded82611d63565b90508067ffffffffffffffff811115610e0857610e0861226b565b604051908082528060200260200182016040528015610e31578160200160208202803683370190505b5092505f5b81811015610e7f575f610e498483611eae565b905080858381518110610e5e57610e5e6127ca565b6001600160a01b039092166020928302919091019091015250600101610e36565b50505092915050565b610e90611db5565b610a915f611e5d565b5f61069e610eaf6108a036859003850185612567565b600190611eb9565b5f600681610ecd6108a036879003870187612567565b815260208082019290925260409081015f90812085825290925290205460ff16806108805750609854600190811614610880565b5f610a7a6001611d63565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614610f55576040516348da714f60e01b815260040160405180910390fd5b5f600381610f6b6108a036889003880188612567565b81526020019081526020015f2090505f60045f610f92878036038101906108a09190612567565b81526020019081526020015f205f8581526020019081526020015f209050610fba8585610872565b61104157610fc88585611ed0565b610fe5610fdd6108a036889003880188612567565b600190611f0d565b50610ff08285611f0d565b504360055f6110076108a0368a90038a018a612567565b81526020019081526020015f205f8681526020019081526020015f205f6101000a81548163ffffffff021916908363ffffffff1602179055505b61104b8184611f18565b507f3afae24c1d3dd2ce3649054ad82458a8c9967ebd9ce10a9a5a3d059f55bfaedb85858543604051611081949392919061296a565b60405180910390a15050505050565b606061069e60035f6110a185611958565b81526020019081526020015f20611d6c565b5f610880826003836110cd6108a036899003890189612567565b81526020019081526020015f20611eb990919063ffffffff16565b6007546001600160a01b0382165f90815260086020526040812054909163ffffffff908116911681811161111c578161111e565b805b949350505050565b61112e611db5565b6001600160a01b0382165f81815260086020908152604091829020805463ffffffff191663ffffffff86169081179091558251938452908301527f5d2b33f07ae22a809e79005f96ffac70c3715df85a3b011b025e0a86a23a007b91015b60405180910390a15050565b6111a0611f2c565b60065f6111b56108a036869003860186612567565b815260208082019290925260409081015f90812084825290925290205460ff166111f25760405163c61dca5d60e01b815260040160405180910390fd5b5f6006816112086108a036879003870187612567565b81526020019081526020015f205f8381526020019081526020015f205f6101000a81548160ff0219169083151502179055507fb8877c6bf02d5f6603188eb653c9269271836b75b2012a5d7f5f233e7cf2f241828260405161118c9291906128a3565b60605f60035f61127a85611958565b81526020019081526020015f2090505f61129382611d63565b90508067ffffffffffffffff8111156112ae576112ae61226b565b6040519080825280602002602001820160405280156112e157816020015b60608152602001906001900390816112cc5790505b5092505f5b81811015611321576112fc856104038584611eae565b84828151811061130e5761130e6127ca565b60209081029190910101526001016112e6565b505050919050565b5f816001600160a01b0316632495a5996040518163ffffffff1660e01b8152600401602060405180830381865afa158015611366573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061138a9190612844565b6001600160a01b03166370a082316113a286866108c6565b6040516001600160e01b031960e084901b1681526001600160a01b039091166004820152602401602060405180830381865afa1580156113e4573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061111e919061288c565b5f61141b6108a036859003850185612567565b604080516020810192909252810183905260600160405160208183030381529060405280519060200120905092915050565b60608060608061145b610958565b9350835167ffffffffffffffff8111156114775761147761226b565b6040519080825280602002602001820160405280156114a0578160200160208202803683370190505b509250835167ffffffffffffffff8111156114bd576114bd61226b565b6040519080825280602002602001820160405280156114f057816020015b60608152602001906001900390816114db5790505b509150835167ffffffffffffffff81111561150d5761150d61226b565b60405190808252806020026020018201604052801561154057816020015b606081526020019060019003908161152b5790505b5090505f5b8451811015611799577f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663f231bd0886838151811061158f5761158f6127ca565b60200260200101516040518263ffffffff1660e01b81526004016115b391906129a2565b602060405180830381865afa1580156115ce573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906115f291906129c8565b848281518110611604576116046127ca565b60200260200101901515908115158152505061163885828151811061162b5761162b6127ca565b6020026020010151611090565b83828151811061164a5761164a6127ca565b6020026020010181905250828181518110611667576116676127ca565b60200260200101515167ffffffffffffffff8111156116885761168861226b565b6040519080825280602002602001820160405280156116b1578160200160208202803683370190505b508282815181106116c4576116c46127ca565b60209081029190910101525f5b8382815181106116e3576116e36127ca565b60200260200101515181101561179057611748868381518110611708576117086127ca565b6020026020010151858481518110611722576117226127ca565b6020026020010151838151811061173b5761173b6127ca565b6020026020010151610612565b83838151811061175a5761175a6127ca565b60200260200101518281518110611773576117736127ca565b63ffffffff909216602092830291909101909101526001016116d1565b50600101611545565b5090919293565b6117a8611c83565b60065f6117bd6108a036869003860186612567565b815260208082019290925260409081015f90812084825290925290205460ff16156117fb5760405163c61dca5d60e01b815260040160405180910390fd5b600160065f6118126108a036879003870187612567565b81526020019081526020015f205f8381526020019081526020015f205f6101000a81548160ff0219169083151502179055507f050add19b1a78a4240cdebc8747899275f2dd070c88e83904a37ff7d1a539744828260405161118c9291906128a3565b61187d611db5565b6001600160a01b0381166118e25760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610d26565b610aa481611e5d565b6118f3611f2c565b6098548019821981161461191a5760405163c61dca5d60e01b815260040160405180910390fd5b609882905560405182815233907f3582d1828e26bf56bd801502bc021ac0bc8afb57c826e4986b45593c8fad389c9060200160405180910390a25050565b5f815f0151826020015163ffffffff166040516020016119a392919060609290921b6bffffffffffffffffffffffff1916825260a01b6001600160a01b031916601482015260200190565b60405160208183030381529060405261069e906129e7565b609854600160ff83161b90811603610aa45760405163840a48d560e01b815260040160405180910390fd5b6001600160a01b038116620e16e414611a2257336001600160a01b03821614611a225760405163720116ad60e11b815260040160405180910390fd5b611a2c8383610eb7565b15611a4a5760405163840a48d560e01b815260040160405180910390fd5b611a62611a5c36859003850185612567565b83610612565b63ffffffff16431015611a88576040516331caa72160e01b815260040160405180910390fd5b505050565b5f600481611aa36108a0368a90038a018a612567565b81526020019081526020015f205f8681526020019081526020015f209050836001600160a01b031663ff491e65307f0000000000000000000000000000000000000000000000000000000000000000898988886040518763ffffffff1660e01b8152600401611b1796959493929190612a0a565b5f604051808303815f87803b158015611b2e575f5ffd5b505af1158015611b40573d5f5f3e3d5ffd5b50505050611b578282611fdd90919063ffffffff16565b507f32be306ad5a833e756b7cb9724d5312afe0feda6163bfc2dd98ee713346a9abc86868486604051611b8d9493929190612a56565b60405180910390a1505050505050565b60015f600381611bb56108a036889003880188612567565b81526020019081526020015f2090505f611c0060045f611bdf888036038101906108a09190612567565b81526020019081526020015f205f8681526020019081526020015f20611d63565b9050805f0361083157611c138285611ff1565b5060055f611c296108a036899003890189612567565b815260208082019290925260409081015f9081208782529092529020805463ffffffff19169055611c5982611d63565b5f0361083157611c7b611c746108a036889003880188612567565b8490611ff1565b505050505050565b60405163237dfb4760e11b81523360048201527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906346fbf68e90602401602060405180830381865afa158015611ce5573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611d0991906129c8565b610a9157604051631d77d47760e21b815260040160405180910390fd5b609881905560405181815233907fab40a374bc51de372200a8bc981af8c9ecdc08dfdaef0bb6e09f88f3c616ef3d9060200160405180910390a250565b5f61069e825490565b60605f61088083611ffc565b60605f611d8483612055565b6040805160208082528183019092529192505f91906020820181803683375050509182525060208101929092525090565b6065546001600160a01b03163314610a915760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610d26565b6007805463ffffffff191663ffffffff83169081179091556040519081527f67d0077d22e4e06f761dd87f6c9f2310ac879c9ce17de50d381e05b72f45fbf69060200160405180910390a150565b606580546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a35050565b5f610880838361207c565b5f8181526001830160205260408120541515610880565b611a88611edd8383611408565b6001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016906120a2565b5f610880838361213c565b5f610880836001600160a01b03841661213c565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663eab66d7a6040518163ffffffff1660e01b8152600401602060405180830381865afa158015611f88573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611fac9190612844565b6001600160a01b0316336001600160a01b031614610a915760405163794821ff60e01b815260040160405180910390fd5b5f610880836001600160a01b038416612188565b5f6108808383612188565b6060815f0180548060200260200160405190810160405280929190818152602001828054801561204957602002820191905f5260205f20905b815481526020019060010190808311612035575b50505050509050919050565b5f60ff8216601f81111561069e57604051632cd44ac360e21b815260040160405180910390fd5b5f825f018281548110612091576120916127ca565b905f5260205f200154905092915050565b5f763d602d80600a3d3981f3363d3d373d3d3d363d730000008360601b60e81c175f526e5af43d82803e903d91602b57fd5bf38360781b1760205281603760095ff590506001600160a01b03811661069e5760405162461bcd60e51b815260206004820152601760248201527f455243313136373a2063726561746532206661696c65640000000000000000006044820152606401610d26565b5f81815260018301602052604081205461218157508154600181810184555f84815260208082209093018490558454848252828601909352604090209190915561069e565b505f61069e565b5f8181526001830160205260408120548015612262575f6121aa600183612a89565b85549091505f906121bd90600190612a89565b905081811461221c575f865f0182815481106121db576121db6127ca565b905f5260205f200154905080875f0184815481106121fb576121fb6127ca565b5f918252602080832090910192909255918252600188019052604090208390555b855486908061222d5761222d612a9c565b600190038181905f5260205f20015f90559055856001015f8681526020019081526020015f205f90556001935050505061069e565b5f91505061069e565b634e487b7160e01b5f52604160045260245ffd5b604051601f8201601f1916810167ffffffffffffffff811182821017156122a8576122a861226b565b604052919050565b6001600160a01b0381168114610aa4575f5ffd5b803563ffffffff811681146122d7575f5ffd5b919050565b5f604082840312156122ec575f5ffd5b6040805190810167ffffffffffffffff8111828210171561230f5761230f61226b565b6040529050808235612320816122b0565b815261232e602084016122c4565b60208201525092915050565b5f5f6060838503121561234b575f5ffd5b61235584846122dc565b946040939093013593505050565b5f60408284031215612373575f5ffd5b50919050565b5f5f5f6080848603121561238b575f5ffd5b6123958585612363565b92506040840135915060608401356123ac816122b0565b809150509250925092565b5f602082840312156123c7575f5ffd5b5035919050565b5f5f606083850312156123df575f5ffd5b6123558484612363565b5f8151808452602084019350602083015f5b8281101561243d5761242786835180516001600160a01b0316825260209081015163ffffffff16910152565b60409590950194602091909101906001016123fb565b5093949350505050565b602081525f61088060208301846123e9565b602081525f82518060208401528060208501604085015e5f604082850101526040601f19601f83011684010191505092915050565b5f6020828403121561249e575f5ffd5b813560ff81168114610880575f5ffd5b5f602082840312156124be575f5ffd5b610880826122c4565b5f604082840312156124d7575f5ffd5b6108808383612363565b5f5f5f606084860312156124f3575f5ffd5b83356124fe816122b0565b925060208401359150612513604085016122c4565b90509250925092565b5f8151808452602084019350602083015f5b8281101561243d5781516001600160a01b031686526020958601959091019060010161252e565b602081525f610880602083018461251c565b5f60408284031215612577575f5ffd5b61088083836122dc565b5f8151808452602084019350602083015f5b8281101561243d578151865260209586019590910190600101612593565b602081525f6108806020830184612581565b5f602082840312156125d3575f5ffd5b8135610880816122b0565b5f5f604083850312156125ef575f5ffd5b82356125fa816122b0565b9150612608602084016122c4565b90509250929050565b5f602082016020835280845180835260408501915060408160051b8601019250602086015f5b8281101561266857603f1987860301845261265385835161251c565b94506020938401939190910190600101612637565b50929695505050505050565b5f82825180855260208501945060208160051b830101602085015f5b838110156126f057848303601f19018852815180518085526020918201918501905f5b818110156126d757835163ffffffff168352602093840193909201916001016126b3565b50506020998a0199909450929092019150600101612690565b50909695505050505050565b608081525f61270e60808301876123e9565b82810360208401528086518083526020830191506020880192505f5b8181101561274a578351151583526020938401939092019160010161272a565b505083810360408501528091505f865180835260208301935060208160051b840101602089015f5b838110156127a457601f1986840301875261278e838351612581565b6020978801979093509190910190600101612772565b505080925086810360608801526127bb8189612674565b9b9a5050505050505050505050565b634e487b7160e01b5f52603260045260245ffd5b634e487b7160e01b5f52601160045260245ffd5b8082018082111561069e5761069e6127de565b8035612810816122b0565b6001600160a01b0316825263ffffffff61282c602083016122c4565b1660208301525050565b6040810161069e8284612805565b5f60208284031215612854575f5ffd5b8151610880816122b0565b6080810161286d8286612805565b60408201939093526001600160a01b0391909116606090910152919050565b5f6020828403121561289c575f5ffd5b5051919050565b606081016128b18285612805565b8260408301529392505050565b5f602082840312156128ce575f5ffd5b815167ffffffffffffffff8111156128e4575f5ffd5b8201601f810184136128f4575f5ffd5b805167ffffffffffffffff81111561290e5761290e61226b565b8060051b61291e6020820161227f565b91825260208184018101929081019087841115612939575f5ffd5b6020850194505b8385101561295f57845180835260209586019590935090910190612940565b979650505050505050565b60a081016129788287612805565b60408201949094526001600160a01b0392909216606083015263ffffffff16608090910152919050565b81516001600160a01b0316815260208083015163ffffffff16908201526040810161069e565b5f602082840312156129d8575f5ffd5b81518015158114610880575f5ffd5b80516020808301519190811015612373575f1960209190910360031b1b16919050565b6001600160a01b0387811682528616602082015260e08101612a2f6040830187612805565b60808201949094526001600160a01b0392831660a0820152911660c0909101529392505050565b60a08101612a648287612805565b60408201949094526001600160a01b0392831660608201529116608090910152919050565b8181038181111561069e5761069e6127de565b634e487b7160e01b5f52603160045260245ffdfea2646970667358221220391a750cc42320689a98396492eb75d761266158a9b51632078943c10c272a5864736f6c634300081b0033",
}
⋮----
// SlashEscrowFactoryABI is the input ABI used to generate the binding from.
// Deprecated: Use SlashEscrowFactoryMetaData.ABI instead.
var SlashEscrowFactoryABI = SlashEscrowFactoryMetaData.ABI
⋮----
// SlashEscrowFactoryBin is the compiled bytecode used for deploying new contracts.
// Deprecated: Use SlashEscrowFactoryMetaData.Bin instead.
var SlashEscrowFactoryBin = SlashEscrowFactoryMetaData.Bin
⋮----
// DeploySlashEscrowFactory deploys a new Ethereum contract, binding an instance of SlashEscrowFactory to it.
func DeploySlashEscrowFactory(auth *bind.TransactOpts, backend bind.ContractBackend, _allocationManager common.Address, _strategyManager common.Address, _pauserRegistry common.Address, _slashEscrowImplementation common.Address, _version string) (common.Address, *types.Transaction, *SlashEscrowFactory, error)
⋮----
// SlashEscrowFactory is an auto generated Go binding around an Ethereum contract.
type SlashEscrowFactory struct {
	SlashEscrowFactoryCaller     // Read-only binding to the contract
	SlashEscrowFactoryTransactor // Write-only binding to the contract
	SlashEscrowFactoryFilterer   // Log filterer for contract events
}
⋮----
SlashEscrowFactoryCaller     // Read-only binding to the contract
SlashEscrowFactoryTransactor // Write-only binding to the contract
SlashEscrowFactoryFilterer   // Log filterer for contract events
⋮----
// SlashEscrowFactoryCaller is an auto generated read-only Go binding around an Ethereum contract.
type SlashEscrowFactoryCaller struct {
	contract *bind.BoundContract // Generic contract wrapper for the low level calls
}
⋮----
contract *bind.BoundContract // Generic contract wrapper for the low level calls
⋮----
// SlashEscrowFactoryTransactor is an auto generated write-only Go binding around an Ethereum contract.
type SlashEscrowFactoryTransactor struct {
	contract *bind.BoundContract // Generic contract wrapper for the low level calls
}
⋮----
// SlashEscrowFactoryFilterer is an auto generated log filtering Go binding around an Ethereum contract events.
type SlashEscrowFactoryFilterer struct {
	contract *bind.BoundContract // Generic contract wrapper for the low level calls
}
⋮----
// SlashEscrowFactorySession is an auto generated Go binding around an Ethereum contract,
// with pre-set call and transact options.
type SlashEscrowFactorySession struct {
	Contract     *SlashEscrowFactory // 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
}
⋮----
Contract     *SlashEscrowFactory // 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
⋮----
// SlashEscrowFactoryCallerSession is an auto generated read-only Go binding around an Ethereum contract,
// with pre-set call options.
type SlashEscrowFactoryCallerSession struct {
	Contract *SlashEscrowFactoryCaller // Generic contract caller binding to set the session for
	CallOpts bind.CallOpts             // Call options to use throughout this session
}
⋮----
Contract *SlashEscrowFactoryCaller // Generic contract caller binding to set the session for
CallOpts bind.CallOpts             // Call options to use throughout this session
⋮----
// SlashEscrowFactoryTransactorSession is an auto generated write-only Go binding around an Ethereum contract,
// with pre-set transact options.
type SlashEscrowFactoryTransactorSession struct {
	Contract     *SlashEscrowFactoryTransactor // Generic contract transactor binding to set the session for
	TransactOpts bind.TransactOpts             // Transaction auth options to use throughout this session
}
⋮----
Contract     *SlashEscrowFactoryTransactor // Generic contract transactor binding to set the session for
TransactOpts bind.TransactOpts             // Transaction auth options to use throughout this session
⋮----
// SlashEscrowFactoryRaw is an auto generated low-level Go binding around an Ethereum contract.
type SlashEscrowFactoryRaw struct {
	Contract *SlashEscrowFactory // Generic contract binding to access the raw methods on
}
⋮----
Contract *SlashEscrowFactory // Generic contract binding to access the raw methods on
⋮----
// SlashEscrowFactoryCallerRaw is an auto generated low-level read-only Go binding around an Ethereum contract.
type SlashEscrowFactoryCallerRaw struct {
	Contract *SlashEscrowFactoryCaller // Generic read-only contract binding to access the raw methods on
}
⋮----
Contract *SlashEscrowFactoryCaller // Generic read-only contract binding to access the raw methods on
⋮----
// SlashEscrowFactoryTransactorRaw is an auto generated low-level write-only Go binding around an Ethereum contract.
type SlashEscrowFactoryTransactorRaw struct {
	Contract *SlashEscrowFactoryTransactor // Generic write-only contract binding to access the raw methods on
}
⋮----
Contract *SlashEscrowFactoryTransactor // Generic write-only contract binding to access the raw methods on
⋮----
// NewSlashEscrowFactory creates a new instance of SlashEscrowFactory, bound to a specific deployed contract.
func NewSlashEscrowFactory(address common.Address, backend bind.ContractBackend) (*SlashEscrowFactory, error)
⋮----
// NewSlashEscrowFactoryCaller creates a new read-only instance of SlashEscrowFactory, bound to a specific deployed contract.
func NewSlashEscrowFactoryCaller(address common.Address, caller bind.ContractCaller) (*SlashEscrowFactoryCaller, error)
⋮----
// NewSlashEscrowFactoryTransactor creates a new write-only instance of SlashEscrowFactory, bound to a specific deployed contract.
func NewSlashEscrowFactoryTransactor(address common.Address, transactor bind.ContractTransactor) (*SlashEscrowFactoryTransactor, error)
⋮----
// NewSlashEscrowFactoryFilterer creates a new log filterer instance of SlashEscrowFactory, bound to a specific deployed contract.
func NewSlashEscrowFactoryFilterer(address common.Address, filterer bind.ContractFilterer) (*SlashEscrowFactoryFilterer, error)
⋮----
// bindSlashEscrowFactory binds a generic wrapper to an already deployed contract.
func bindSlashEscrowFactory(address common.Address, caller bind.ContractCaller, transactor bind.ContractTransactor, filterer bind.ContractFilterer) (*bind.BoundContract, error)
⋮----
// 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 (_SlashEscrowFactory *SlashEscrowFactoryRaw) Call(opts *bind.CallOpts, result *[]interface
⋮----
// Transfer initiates a plain transaction to move funds to the contract, calling
// its default method if one is available.
func (_SlashEscrowFactory *SlashEscrowFactoryRaw) Transfer(opts *bind.TransactOpts) (*types.Transaction, error)
⋮----
// Transact invokes the (paid) contract method with params as input values.
func (_SlashEscrowFactory *SlashEscrowFactoryRaw) Transact(opts *bind.TransactOpts, method string, params ...interface
⋮----
// AllocationManager is a free data retrieval call binding the contract method 0xca8aa7c7.
//
// Solidity: function allocationManager() view returns(address)
func (_SlashEscrowFactory *SlashEscrowFactoryCaller) AllocationManager(opts *bind.CallOpts) (common.Address, error)
⋮----
var out []interface{}
⋮----
// ComputeSlashEscrowSalt is a free data retrieval call binding the contract method 0xc2de7096.
⋮----
// Solidity: function computeSlashEscrowSalt((address,uint32) operatorSet, uint256 slashId) pure returns(bytes32)
func (_SlashEscrowFactory *SlashEscrowFactoryCaller) ComputeSlashEscrowSalt(opts *bind.CallOpts, operatorSet OperatorSet, slashId *big.Int) ([32]byte, error)
⋮----
// GetEscrowCompleteBlock is a free data retrieval call binding the contract method 0x0310f3e6.
⋮----
// Solidity: function getEscrowCompleteBlock((address,uint32) operatorSet, uint256 slashId) view returns(uint32)
func (_SlashEscrowFactory *SlashEscrowFactoryCaller) GetEscrowCompleteBlock(opts *bind.CallOpts, operatorSet OperatorSet, slashId *big.Int) (uint32, error)
⋮----
// GetEscrowStartBlock is a free data retrieval call binding the contract method 0x05a4dfbb.
⋮----
// Solidity: function getEscrowStartBlock((address,uint32) operatorSet, uint256 slashId) view returns(uint256)
func (_SlashEscrowFactory *SlashEscrowFactoryCaller) GetEscrowStartBlock(opts *bind.CallOpts, operatorSet OperatorSet, slashId *big.Int) (*big.Int, error)
⋮----
// GetGlobalEscrowDelay is a free data retrieval call binding the contract method 0x8a65d2d2.
⋮----
// Solidity: function getGlobalEscrowDelay() view returns(uint32)
func (_SlashEscrowFactory *SlashEscrowFactoryCaller) GetGlobalEscrowDelay(opts *bind.CallOpts) (uint32, error)
⋮----
// GetPendingEscrows is a free data retrieval call binding the contract method 0xc50f4e48.
⋮----
// Solidity: function getPendingEscrows() view returns((address,uint32)[] operatorSets, bool[] isRedistributing, uint256[][] slashIds, uint32[][] completeBlocks)
func (_SlashEscrowFactory *SlashEscrowFactoryCaller) GetPendingEscrows(opts *bind.CallOpts) (struct
⋮----
// GetPendingOperatorSets is a free data retrieval call binding the contract method 0x3f292b08.
⋮----
// Solidity: function getPendingOperatorSets() view returns((address,uint32)[] operatorSets)
func (_SlashEscrowFactory *SlashEscrowFactoryCaller) GetPendingOperatorSets(opts *bind.CallOpts) ([]OperatorSet, error)
⋮----
// GetPendingSlashIds is a free data retrieval call binding the contract method 0x7def1564.
⋮----
// Solidity: function getPendingSlashIds((address,uint32) operatorSet) view returns(uint256[])
func (_SlashEscrowFactory *SlashEscrowFactoryCaller) GetPendingSlashIds(opts *bind.CallOpts, operatorSet OperatorSet) ([]*big.Int, error)
⋮----
// GetPendingStrategiesForSlashId is a free data retrieval call binding the contract method 0x7130c423.
⋮----
// Solidity: function getPendingStrategiesForSlashId((address,uint32) operatorSet, uint256 slashId) view returns(address[] strategies)
func (_SlashEscrowFactory *SlashEscrowFactoryCaller) GetPendingStrategiesForSlashId(opts *bind.CallOpts, operatorSet OperatorSet, slashId *big.Int) ([]common.Address, error)
⋮----
// GetPendingStrategiesForSlashIds is a free data retrieval call binding the contract method 0xa56b21e4.
⋮----
// Solidity: function getPendingStrategiesForSlashIds((address,uint32) operatorSet) view returns(address[][] strategies)
func (_SlashEscrowFactory *SlashEscrowFactoryCaller) GetPendingStrategiesForSlashIds(opts *bind.CallOpts, operatorSet OperatorSet) ([][]common.Address, error)
⋮----
// GetPendingUnderlyingAmountForStrategy is a free data retrieval call binding the contract method 0xb23ff83b.
⋮----
// Solidity: function getPendingUnderlyingAmountForStrategy((address,uint32) operatorSet, uint256 slashId, address strategy) view returns(uint256)
func (_SlashEscrowFactory *SlashEscrowFactoryCaller) GetPendingUnderlyingAmountForStrategy(opts *bind.CallOpts, operatorSet OperatorSet, slashId *big.Int, strategy common.Address) (*big.Int, error)
⋮----
// GetSlashEscrow is a free data retrieval call binding the contract method 0x3453b234.
⋮----
// Solidity: function getSlashEscrow((address,uint32) operatorSet, uint256 slashId) view returns(address)
func (_SlashEscrowFactory *SlashEscrowFactoryCaller) GetSlashEscrow(opts *bind.CallOpts, operatorSet OperatorSet, slashId *big.Int) (common.Address, error)
⋮----
// GetStrategyEscrowDelay is a free data retrieval call binding the contract method 0x8d5d4036.
⋮----
// Solidity: function getStrategyEscrowDelay(address strategy) view returns(uint32)
func (_SlashEscrowFactory *SlashEscrowFactoryCaller) GetStrategyEscrowDelay(opts *bind.CallOpts, strategy common.Address) (uint32, error)
⋮----
// GetTotalPendingOperatorSets is a free data retrieval call binding the contract method 0x78cb9600.
⋮----
// Solidity: function getTotalPendingOperatorSets() view returns(uint256)
func (_SlashEscrowFactory *SlashEscrowFactoryCaller) GetTotalPendingOperatorSets(opts *bind.CallOpts) (*big.Int, error)
⋮----
// GetTotalPendingSlashIds is a free data retrieval call binding the contract method 0x6729b5db.
⋮----
// Solidity: function getTotalPendingSlashIds((address,uint32) operatorSet) view returns(uint256)
func (_SlashEscrowFactory *SlashEscrowFactoryCaller) GetTotalPendingSlashIds(opts *bind.CallOpts, operatorSet OperatorSet) (*big.Int, error)
⋮----
// GetTotalPendingStrategiesForSlashId is a free data retrieval call binding the contract method 0x277a9f0e.
⋮----
// Solidity: function getTotalPendingStrategiesForSlashId((address,uint32) operatorSet, uint256 slashId) view returns(uint256)
func (_SlashEscrowFactory *SlashEscrowFactoryCaller) GetTotalPendingStrategiesForSlashId(opts *bind.CallOpts, operatorSet OperatorSet, slashId *big.Int) (*big.Int, error)
⋮----
// IsDeployedSlashEscrow is a free data retrieval call binding the contract method 0x19f3db26.
⋮----
// Solidity: function isDeployedSlashEscrow((address,uint32) operatorSet, uint256 slashId) view returns(bool)
func (_SlashEscrowFactory *SlashEscrowFactoryCaller) IsDeployedSlashEscrow(opts *bind.CallOpts, operatorSet OperatorSet, slashId *big.Int) (bool, error)
⋮----
// IsDeployedSlashEscrow0 is a free data retrieval call binding the contract method 0xc8b5330c.
⋮----
// Solidity: function isDeployedSlashEscrow(address slashEscrow) view returns(bool)
func (_SlashEscrowFactory *SlashEscrowFactoryCaller) IsDeployedSlashEscrow0(opts *bind.CallOpts, slashEscrow common.Address) (bool, error)
⋮----
// IsEscrowPaused is a free data retrieval call binding the contract method 0x78748459.
⋮----
// Solidity: function isEscrowPaused((address,uint32) operatorSet, uint256 slashId) view returns(bool)
func (_SlashEscrowFactory *SlashEscrowFactoryCaller) IsEscrowPaused(opts *bind.CallOpts, operatorSet OperatorSet, slashId *big.Int) (bool, error)
⋮----
// IsPendingOperatorSet is a free data retrieval call binding the contract method 0x71e166e7.
⋮----
// Solidity: function isPendingOperatorSet((address,uint32) operatorSet) view returns(bool)
func (_SlashEscrowFactory *SlashEscrowFactoryCaller) IsPendingOperatorSet(opts *bind.CallOpts, operatorSet OperatorSet) (bool, error)
⋮----
// IsPendingSlashId is a free data retrieval call binding the contract method 0x87420b07.
⋮----
// Solidity: function isPendingSlashId((address,uint32) operatorSet, uint256 slashId) view returns(bool)
func (_SlashEscrowFactory *SlashEscrowFactoryCaller) IsPendingSlashId(opts *bind.CallOpts, operatorSet OperatorSet, slashId *big.Int) (bool, error)
⋮----
// Owner is a free data retrieval call binding the contract method 0x8da5cb5b.
⋮----
// Solidity: function owner() view returns(address)
func (_SlashEscrowFactory *SlashEscrowFactoryCaller) Owner(opts *bind.CallOpts) (common.Address, error)
⋮----
// Paused is a free data retrieval call binding the contract method 0x5ac86ab7.
⋮----
// Solidity: function paused(uint8 index) view returns(bool)
func (_SlashEscrowFactory *SlashEscrowFactoryCaller) Paused(opts *bind.CallOpts, index uint8) (bool, error)
⋮----
// Paused0 is a free data retrieval call binding the contract method 0x5c975abb.
⋮----
// Solidity: function paused() view returns(uint256)
func (_SlashEscrowFactory *SlashEscrowFactoryCaller) Paused0(opts *bind.CallOpts) (*big.Int, error)
⋮----
// PauserRegistry is a free data retrieval call binding the contract method 0x886f1195.
⋮----
// Solidity: function pauserRegistry() view returns(address)
func (_SlashEscrowFactory *SlashEscrowFactoryCaller) PauserRegistry(opts *bind.CallOpts) (common.Address, error)
⋮----
// SlashEscrowImplementation is a free data retrieval call binding the contract method 0xa3c65641.
⋮----
// Solidity: function slashEscrowImplementation() view returns(address)
func (_SlashEscrowFactory *SlashEscrowFactoryCaller) SlashEscrowImplementation(opts *bind.CallOpts) (common.Address, error)
⋮----
// StrategyManager is a free data retrieval call binding the contract method 0x39b70e38.
⋮----
// Solidity: function strategyManager() view returns(address)
func (_SlashEscrowFactory *SlashEscrowFactoryCaller) StrategyManager(opts *bind.CallOpts) (common.Address, error)
⋮----
// Version is a free data retrieval call binding the contract method 0x54fd4d50.
⋮----
// Solidity: function version() view returns(string)
func (_SlashEscrowFactory *SlashEscrowFactoryCaller) Version(opts *bind.CallOpts) (string, error)
⋮----
// Initialize is a paid mutator transaction binding the contract method 0x6c5ac81e.
⋮----
// Solidity: function initialize(address initialOwner, uint256 initialPausedStatus, uint32 initialGlobalDelayBlocks) returns()
func (_SlashEscrowFactory *SlashEscrowFactoryTransactor) Initialize(opts *bind.TransactOpts, initialOwner common.Address, initialPausedStatus *big.Int, initialGlobalDelayBlocks uint32) (*types.Transaction, error)
⋮----
// InitiateSlashEscrow is a paid mutator transaction binding the contract method 0x7a967611.
⋮----
// Solidity: function initiateSlashEscrow((address,uint32) operatorSet, uint256 slashId, address strategy) returns()
func (_SlashEscrowFactory *SlashEscrowFactoryTransactor) InitiateSlashEscrow(opts *bind.TransactOpts, operatorSet OperatorSet, slashId *big.Int, strategy common.Address) (*types.Transaction, error)
⋮----
// Pause is a paid mutator transaction binding the contract method 0x136439dd.
⋮----
// Solidity: function pause(uint256 newPausedStatus) returns()
func (_SlashEscrowFactory *SlashEscrowFactoryTransactor) Pause(opts *bind.TransactOpts, newPausedStatus *big.Int) (*types.Transaction, error)
⋮----
// PauseAll is a paid mutator transaction binding the contract method 0x595c6a67.
⋮----
// Solidity: function pauseAll() returns()
func (_SlashEscrowFactory *SlashEscrowFactoryTransactor) PauseAll(opts *bind.TransactOpts) (*types.Transaction, error)
⋮----
// PauseEscrow is a paid mutator transaction binding the contract method 0xe7ed076b.
⋮----
// Solidity: function pauseEscrow((address,uint32) operatorSet, uint256 slashId) returns()
func (_SlashEscrowFactory *SlashEscrowFactoryTransactor) PauseEscrow(opts *bind.TransactOpts, operatorSet OperatorSet, slashId *big.Int) (*types.Transaction, error)
⋮----
// ReleaseSlashEscrow is a paid mutator transaction binding the contract method 0x5ffa5a81.
⋮----
// Solidity: function releaseSlashEscrow((address,uint32) operatorSet, uint256 slashId) returns()
func (_SlashEscrowFactory *SlashEscrowFactoryTransactor) ReleaseSlashEscrow(opts *bind.TransactOpts, operatorSet OperatorSet, slashId *big.Int) (*types.Transaction, error)
⋮----
// ReleaseSlashEscrowByStrategy is a paid mutator transaction binding the contract method 0x0e475b17.
⋮----
// Solidity: function releaseSlashEscrowByStrategy((address,uint32) operatorSet, uint256 slashId, address strategy) returns()
func (_SlashEscrowFactory *SlashEscrowFactoryTransactor) ReleaseSlashEscrowByStrategy(opts *bind.TransactOpts, operatorSet OperatorSet, slashId *big.Int, strategy common.Address) (*types.Transaction, error)
⋮----
// RenounceOwnership is a paid mutator transaction binding the contract method 0x715018a6.
⋮----
// Solidity: function renounceOwnership() returns()
func (_SlashEscrowFactory *SlashEscrowFactoryTransactor) RenounceOwnership(opts *bind.TransactOpts) (*types.Transaction, error)
⋮----
// SetGlobalEscrowDelay is a paid mutator transaction binding the contract method 0x5e0a64c5.
⋮----
// Solidity: function setGlobalEscrowDelay(uint32 delay) returns()
func (_SlashEscrowFactory *SlashEscrowFactoryTransactor) SetGlobalEscrowDelay(opts *bind.TransactOpts, delay uint32) (*types.Transaction, error)
⋮----
// SetStrategyEscrowDelay is a paid mutator transaction binding the contract method 0x8fc46be5.
⋮----
// Solidity: function setStrategyEscrowDelay(address strategy, uint32 delay) returns()
func (_SlashEscrowFactory *SlashEscrowFactoryTransactor) SetStrategyEscrowDelay(opts *bind.TransactOpts, strategy common.Address, delay uint32) (*types.Transaction, error)
⋮----
// TransferOwnership is a paid mutator transaction binding the contract method 0xf2fde38b.
⋮----
// Solidity: function transferOwnership(address newOwner) returns()
func (_SlashEscrowFactory *SlashEscrowFactoryTransactor) TransferOwnership(opts *bind.TransactOpts, newOwner common.Address) (*types.Transaction, error)
⋮----
// Unpause is a paid mutator transaction binding the contract method 0xfabc1cbc.
⋮----
// Solidity: function unpause(uint256 newPausedStatus) returns()
func (_SlashEscrowFactory *SlashEscrowFactoryTransactor) Unpause(opts *bind.TransactOpts, newPausedStatus *big.Int) (*types.Transaction, error)
⋮----
// UnpauseEscrow is a paid mutator transaction binding the contract method 0x9b122356.
⋮----
// Solidity: function unpauseEscrow((address,uint32) operatorSet, uint256 slashId) returns()
func (_SlashEscrowFactory *SlashEscrowFactoryTransactor) UnpauseEscrow(opts *bind.TransactOpts, operatorSet OperatorSet, slashId *big.Int) (*types.Transaction, error)
⋮----
// SlashEscrowFactoryEscrowCompleteIterator is returned from FilterEscrowComplete and is used to iterate over the raw logs and unpacked data for EscrowComplete events raised by the SlashEscrowFactory contract.
type SlashEscrowFactoryEscrowCompleteIterator struct {
	Event *SlashEscrowFactoryEscrowComplete // 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
}
⋮----
Event *SlashEscrowFactoryEscrowComplete // 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 *SlashEscrowFactoryEscrowCompleteIterator) Next() bool
⋮----
// If the iterator failed, stop iterating
⋮----
// If the iterator completed, deliver directly whatever's available
⋮----
// Iterator still in progress, wait for either a data or an error event
⋮----
// Error returns any retrieval or parsing error occurred during filtering.
func (it *SlashEscrowFactoryEscrowCompleteIterator) Error() error
⋮----
// Close terminates the iteration process, releasing any pending underlying
// resources.
func (it *SlashEscrowFactoryEscrowCompleteIterator) Close() error
⋮----
// SlashEscrowFactoryEscrowComplete represents a EscrowComplete event raised by the SlashEscrowFactory contract.
type SlashEscrowFactoryEscrowComplete struct {
	OperatorSet OperatorSet
	SlashId     *big.Int
	Strategy    common.Address
	Recipient   common.Address
	Raw         types.Log // Blockchain specific contextual infos
}
⋮----
Raw         types.Log // Blockchain specific contextual infos
⋮----
// FilterEscrowComplete is a free log retrieval operation binding the contract event 0x32be306ad5a833e756b7cb9724d5312afe0feda6163bfc2dd98ee713346a9abc.
⋮----
// Solidity: event EscrowComplete((address,uint32) operatorSet, uint256 slashId, address strategy, address recipient)
func (_SlashEscrowFactory *SlashEscrowFactoryFilterer) FilterEscrowComplete(opts *bind.FilterOpts) (*SlashEscrowFactoryEscrowCompleteIterator, error)
⋮----
// WatchEscrowComplete is a free log subscription operation binding the contract event 0x32be306ad5a833e756b7cb9724d5312afe0feda6163bfc2dd98ee713346a9abc.
⋮----
func (_SlashEscrowFactory *SlashEscrowFactoryFilterer) WatchEscrowComplete(opts *bind.WatchOpts, sink chan<- *SlashEscrowFactoryEscrowComplete) (event.Subscription, error)
⋮----
// New log arrived, parse the event and forward to the user
⋮----
// ParseEscrowComplete is a log parse operation binding the contract event 0x32be306ad5a833e756b7cb9724d5312afe0feda6163bfc2dd98ee713346a9abc.
⋮----
func (_SlashEscrowFactory *SlashEscrowFactoryFilterer) ParseEscrowComplete(log types.Log) (*SlashEscrowFactoryEscrowComplete, error)
⋮----
// SlashEscrowFactoryEscrowPausedIterator is returned from FilterEscrowPaused and is used to iterate over the raw logs and unpacked data for EscrowPaused events raised by the SlashEscrowFactory contract.
type SlashEscrowFactoryEscrowPausedIterator struct {
	Event *SlashEscrowFactoryEscrowPaused // 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
}
⋮----
Event *SlashEscrowFactoryEscrowPaused // Event containing the contract specifics and raw log
⋮----
// SlashEscrowFactoryEscrowPaused represents a EscrowPaused event raised by the SlashEscrowFactory contract.
type SlashEscrowFactoryEscrowPaused struct {
	OperatorSet OperatorSet
	SlashId     *big.Int
	Raw         types.Log // Blockchain specific contextual infos
}
⋮----
// FilterEscrowPaused is a free log retrieval operation binding the contract event 0x050add19b1a78a4240cdebc8747899275f2dd070c88e83904a37ff7d1a539744.
⋮----
// Solidity: event EscrowPaused((address,uint32) operatorSet, uint256 slashId)
func (_SlashEscrowFactory *SlashEscrowFactoryFilterer) FilterEscrowPaused(opts *bind.FilterOpts) (*SlashEscrowFactoryEscrowPausedIterator, error)
⋮----
// WatchEscrowPaused is a free log subscription operation binding the contract event 0x050add19b1a78a4240cdebc8747899275f2dd070c88e83904a37ff7d1a539744.
⋮----
func (_SlashEscrowFactory *SlashEscrowFactoryFilterer) WatchEscrowPaused(opts *bind.WatchOpts, sink chan<- *SlashEscrowFactoryEscrowPaused) (event.Subscription, error)
⋮----
// ParseEscrowPaused is a log parse operation binding the contract event 0x050add19b1a78a4240cdebc8747899275f2dd070c88e83904a37ff7d1a539744.
⋮----
func (_SlashEscrowFactory *SlashEscrowFactoryFilterer) ParseEscrowPaused(log types.Log) (*SlashEscrowFactoryEscrowPaused, error)
⋮----
// SlashEscrowFactoryEscrowUnpausedIterator is returned from FilterEscrowUnpaused and is used to iterate over the raw logs and unpacked data for EscrowUnpaused events raised by the SlashEscrowFactory contract.
type SlashEscrowFactoryEscrowUnpausedIterator struct {
	Event *SlashEscrowFactoryEscrowUnpaused // 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
}
⋮----
Event *SlashEscrowFactoryEscrowUnpaused // Event containing the contract specifics and raw log
⋮----
// SlashEscrowFactoryEscrowUnpaused represents a EscrowUnpaused event raised by the SlashEscrowFactory contract.
type SlashEscrowFactoryEscrowUnpaused struct {
	OperatorSet OperatorSet
	SlashId     *big.Int
	Raw         types.Log // Blockchain specific contextual infos
}
⋮----
// FilterEscrowUnpaused is a free log retrieval operation binding the contract event 0xb8877c6bf02d5f6603188eb653c9269271836b75b2012a5d7f5f233e7cf2f241.
⋮----
// Solidity: event EscrowUnpaused((address,uint32) operatorSet, uint256 slashId)
func (_SlashEscrowFactory *SlashEscrowFactoryFilterer) FilterEscrowUnpaused(opts *bind.FilterOpts) (*SlashEscrowFactoryEscrowUnpausedIterator, error)
⋮----
// WatchEscrowUnpaused is a free log subscription operation binding the contract event 0xb8877c6bf02d5f6603188eb653c9269271836b75b2012a5d7f5f233e7cf2f241.
⋮----
func (_SlashEscrowFactory *SlashEscrowFactoryFilterer) WatchEscrowUnpaused(opts *bind.WatchOpts, sink chan<- *SlashEscrowFactoryEscrowUnpaused) (event.Subscription, error)
⋮----
// ParseEscrowUnpaused is a log parse operation binding the contract event 0xb8877c6bf02d5f6603188eb653c9269271836b75b2012a5d7f5f233e7cf2f241.
⋮----
func (_SlashEscrowFactory *SlashEscrowFactoryFilterer) ParseEscrowUnpaused(log types.Log) (*SlashEscrowFactoryEscrowUnpaused, error)
⋮----
// SlashEscrowFactoryGlobalEscrowDelaySetIterator is returned from FilterGlobalEscrowDelaySet and is used to iterate over the raw logs and unpacked data for GlobalEscrowDelaySet events raised by the SlashEscrowFactory contract.
type SlashEscrowFactoryGlobalEscrowDelaySetIterator struct {
	Event *SlashEscrowFactoryGlobalEscrowDelaySet // 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
}
⋮----
Event *SlashEscrowFactoryGlobalEscrowDelaySet // Event containing the contract specifics and raw log
⋮----
// SlashEscrowFactoryGlobalEscrowDelaySet represents a GlobalEscrowDelaySet event raised by the SlashEscrowFactory contract.
type SlashEscrowFactoryGlobalEscrowDelaySet struct {
	Delay uint32
	Raw   types.Log // Blockchain specific contextual infos
}
⋮----
Raw   types.Log // Blockchain specific contextual infos
⋮----
// FilterGlobalEscrowDelaySet is a free log retrieval operation binding the contract event 0x67d0077d22e4e06f761dd87f6c9f2310ac879c9ce17de50d381e05b72f45fbf6.
⋮----
// Solidity: event GlobalEscrowDelaySet(uint32 delay)
func (_SlashEscrowFactory *SlashEscrowFactoryFilterer) FilterGlobalEscrowDelaySet(opts *bind.FilterOpts) (*SlashEscrowFactoryGlobalEscrowDelaySetIterator, error)
⋮----
// WatchGlobalEscrowDelaySet is a free log subscription operation binding the contract event 0x67d0077d22e4e06f761dd87f6c9f2310ac879c9ce17de50d381e05b72f45fbf6.
⋮----
func (_SlashEscrowFactory *SlashEscrowFactoryFilterer) WatchGlobalEscrowDelaySet(opts *bind.WatchOpts, sink chan<- *SlashEscrowFactoryGlobalEscrowDelaySet) (event.Subscription, error)
⋮----
// ParseGlobalEscrowDelaySet is a log parse operation binding the contract event 0x67d0077d22e4e06f761dd87f6c9f2310ac879c9ce17de50d381e05b72f45fbf6.
⋮----
func (_SlashEscrowFactory *SlashEscrowFactoryFilterer) ParseGlobalEscrowDelaySet(log types.Log) (*SlashEscrowFactoryGlobalEscrowDelaySet, error)
⋮----
// SlashEscrowFactoryInitializedIterator is returned from FilterInitialized and is used to iterate over the raw logs and unpacked data for Initialized events raised by the SlashEscrowFactory contract.
type SlashEscrowFactoryInitializedIterator struct {
	Event *SlashEscrowFactoryInitialized // 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
}
⋮----
Event *SlashEscrowFactoryInitialized // Event containing the contract specifics and raw log
⋮----
// SlashEscrowFactoryInitialized represents a Initialized event raised by the SlashEscrowFactory contract.
type SlashEscrowFactoryInitialized struct {
	Version uint8
	Raw     types.Log // Blockchain specific contextual infos
}
⋮----
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 (_SlashEscrowFactory *SlashEscrowFactoryFilterer) FilterInitialized(opts *bind.FilterOpts) (*SlashEscrowFactoryInitializedIterator, error)
⋮----
// WatchInitialized is a free log subscription operation binding the contract event 0x7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb3847402498.
⋮----
func (_SlashEscrowFactory *SlashEscrowFactoryFilterer) WatchInitialized(opts *bind.WatchOpts, sink chan<- *SlashEscrowFactoryInitialized) (event.Subscription, error)
⋮----
// ParseInitialized is a log parse operation binding the contract event 0x7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb3847402498.
⋮----
func (_SlashEscrowFactory *SlashEscrowFactoryFilterer) ParseInitialized(log types.Log) (*SlashEscrowFactoryInitialized, error)
⋮----
// SlashEscrowFactoryOwnershipTransferredIterator is returned from FilterOwnershipTransferred and is used to iterate over the raw logs and unpacked data for OwnershipTransferred events raised by the SlashEscrowFactory contract.
type SlashEscrowFactoryOwnershipTransferredIterator struct {
	Event *SlashEscrowFactoryOwnershipTransferred // 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
}
⋮----
Event *SlashEscrowFactoryOwnershipTransferred // Event containing the contract specifics and raw log
⋮----
// SlashEscrowFactoryOwnershipTransferred represents a OwnershipTransferred event raised by the SlashEscrowFactory contract.
type SlashEscrowFactoryOwnershipTransferred struct {
	PreviousOwner common.Address
	NewOwner      common.Address
	Raw           types.Log // Blockchain specific contextual infos
}
⋮----
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 (_SlashEscrowFactory *SlashEscrowFactoryFilterer) FilterOwnershipTransferred(opts *bind.FilterOpts, previousOwner []common.Address, newOwner []common.Address) (*SlashEscrowFactoryOwnershipTransferredIterator, error)
⋮----
var previousOwnerRule []interface{}
⋮----
var newOwnerRule []interface{}
⋮----
// WatchOwnershipTransferred is a free log subscription operation binding the contract event 0x8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0.
⋮----
func (_SlashEscrowFactory *SlashEscrowFactoryFilterer) WatchOwnershipTransferred(opts *bind.WatchOpts, sink chan<- *SlashEscrowFactoryOwnershipTransferred, previousOwner []common.Address, newOwner []common.Address) (event.Subscription, error)
⋮----
// ParseOwnershipTransferred is a log parse operation binding the contract event 0x8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0.
⋮----
func (_SlashEscrowFactory *SlashEscrowFactoryFilterer) ParseOwnershipTransferred(log types.Log) (*SlashEscrowFactoryOwnershipTransferred, error)
⋮----
// SlashEscrowFactoryPausedIterator is returned from FilterPaused and is used to iterate over the raw logs and unpacked data for Paused events raised by the SlashEscrowFactory contract.
type SlashEscrowFactoryPausedIterator struct {
	Event *SlashEscrowFactoryPaused // 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
}
⋮----
Event *SlashEscrowFactoryPaused // Event containing the contract specifics and raw log
⋮----
// SlashEscrowFactoryPaused represents a Paused event raised by the SlashEscrowFactory contract.
type SlashEscrowFactoryPaused struct {
	Account         common.Address
	NewPausedStatus *big.Int
	Raw             types.Log // Blockchain specific contextual infos
}
⋮----
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 (_SlashEscrowFactory *SlashEscrowFactoryFilterer) FilterPaused(opts *bind.FilterOpts, account []common.Address) (*SlashEscrowFactoryPausedIterator, error)
⋮----
var accountRule []interface{}
⋮----
// WatchPaused is a free log subscription operation binding the contract event 0xab40a374bc51de372200a8bc981af8c9ecdc08dfdaef0bb6e09f88f3c616ef3d.
⋮----
func (_SlashEscrowFactory *SlashEscrowFactoryFilterer) WatchPaused(opts *bind.WatchOpts, sink chan<- *SlashEscrowFactoryPaused, account []common.Address) (event.Subscription, error)
⋮----
// ParsePaused is a log parse operation binding the contract event 0xab40a374bc51de372200a8bc981af8c9ecdc08dfdaef0bb6e09f88f3c616ef3d.
⋮----
func (_SlashEscrowFactory *SlashEscrowFactoryFilterer) ParsePaused(log types.Log) (*SlashEscrowFactoryPaused, error)
⋮----
// SlashEscrowFactoryStartEscrowIterator is returned from FilterStartEscrow and is used to iterate over the raw logs and unpacked data for StartEscrow events raised by the SlashEscrowFactory contract.
type SlashEscrowFactoryStartEscrowIterator struct {
	Event *SlashEscrowFactoryStartEscrow // 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
}
⋮----
Event *SlashEscrowFactoryStartEscrow // Event containing the contract specifics and raw log
⋮----
// SlashEscrowFactoryStartEscrow represents a StartEscrow event raised by the SlashEscrowFactory contract.
type SlashEscrowFactoryStartEscrow struct {
	OperatorSet OperatorSet
	SlashId     *big.Int
	Strategy    common.Address
	StartBlock  uint32
	Raw         types.Log // Blockchain specific contextual infos
}
⋮----
// FilterStartEscrow is a free log retrieval operation binding the contract event 0x3afae24c1d3dd2ce3649054ad82458a8c9967ebd9ce10a9a5a3d059f55bfaedb.
⋮----
// Solidity: event StartEscrow((address,uint32) operatorSet, uint256 slashId, address strategy, uint32 startBlock)
func (_SlashEscrowFactory *SlashEscrowFactoryFilterer) FilterStartEscrow(opts *bind.FilterOpts) (*SlashEscrowFactoryStartEscrowIterator, error)
⋮----
// WatchStartEscrow is a free log subscription operation binding the contract event 0x3afae24c1d3dd2ce3649054ad82458a8c9967ebd9ce10a9a5a3d059f55bfaedb.
⋮----
func (_SlashEscrowFactory *SlashEscrowFactoryFilterer) WatchStartEscrow(opts *bind.WatchOpts, sink chan<- *SlashEscrowFactoryStartEscrow) (event.Subscription, error)
⋮----
// ParseStartEscrow is a log parse operation binding the contract event 0x3afae24c1d3dd2ce3649054ad82458a8c9967ebd9ce10a9a5a3d059f55bfaedb.
⋮----
func (_SlashEscrowFactory *SlashEscrowFactoryFilterer) ParseStartEscrow(log types.Log) (*SlashEscrowFactoryStartEscrow, error)
⋮----
// SlashEscrowFactoryStrategyEscrowDelaySetIterator is returned from FilterStrategyEscrowDelaySet and is used to iterate over the raw logs and unpacked data for StrategyEscrowDelaySet events raised by the SlashEscrowFactory contract.
type SlashEscrowFactoryStrategyEscrowDelaySetIterator struct {
	Event *SlashEscrowFactoryStrategyEscrowDelaySet // 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
}
⋮----
Event *SlashEscrowFactoryStrategyEscrowDelaySet // Event containing the contract specifics and raw log
⋮----
// SlashEscrowFactoryStrategyEscrowDelaySet represents a StrategyEscrowDelaySet event raised by the SlashEscrowFactory contract.
type SlashEscrowFactoryStrategyEscrowDelaySet struct {
	Strategy common.Address
	Delay    uint32
	Raw      types.Log // Blockchain specific contextual infos
}
⋮----
Raw      types.Log // Blockchain specific contextual infos
⋮----
// FilterStrategyEscrowDelaySet is a free log retrieval operation binding the contract event 0x5d2b33f07ae22a809e79005f96ffac70c3715df85a3b011b025e0a86a23a007b.
⋮----
// Solidity: event StrategyEscrowDelaySet(address strategy, uint32 delay)
func (_SlashEscrowFactory *SlashEscrowFactoryFilterer) FilterStrategyEscrowDelaySet(opts *bind.FilterOpts) (*SlashEscrowFactoryStrategyEscrowDelaySetIterator, error)
⋮----
// WatchStrategyEscrowDelaySet is a free log subscription operation binding the contract event 0x5d2b33f07ae22a809e79005f96ffac70c3715df85a3b011b025e0a86a23a007b.
⋮----
func (_SlashEscrowFactory *SlashEscrowFactoryFilterer) WatchStrategyEscrowDelaySet(opts *bind.WatchOpts, sink chan<- *SlashEscrowFactoryStrategyEscrowDelaySet) (event.Subscription, error)
⋮----
// ParseStrategyEscrowDelaySet is a log parse operation binding the contract event 0x5d2b33f07ae22a809e79005f96ffac70c3715df85a3b011b025e0a86a23a007b.
⋮----
func (_SlashEscrowFactory *SlashEscrowFactoryFilterer) ParseStrategyEscrowDelaySet(log types.Log) (*SlashEscrowFactoryStrategyEscrowDelaySet, error)
⋮----
// SlashEscrowFactoryUnpausedIterator is returned from FilterUnpaused and is used to iterate over the raw logs and unpacked data for Unpaused events raised by the SlashEscrowFactory contract.
type SlashEscrowFactoryUnpausedIterator struct {
	Event *SlashEscrowFactoryUnpaused // 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
}
⋮----
Event *SlashEscrowFactoryUnpaused // Event containing the contract specifics and raw log
⋮----
// SlashEscrowFactoryUnpaused represents a Unpaused event raised by the SlashEscrowFactory contract.
type SlashEscrowFactoryUnpaused 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 (_SlashEscrowFactory *SlashEscrowFactoryFilterer) FilterUnpaused(opts *bind.FilterOpts, account []common.Address) (*SlashEscrowFactoryUnpausedIterator, error)
⋮----
// WatchUnpaused is a free log subscription operation binding the contract event 0x3582d1828e26bf56bd801502bc021ac0bc8afb57c826e4986b45593c8fad389c.
⋮----
func (_SlashEscrowFactory *SlashEscrowFactoryFilterer) WatchUnpaused(opts *bind.WatchOpts, sink chan<- *SlashEscrowFactoryUnpaused, account []common.Address) (event.Subscription, error)
⋮----
// ParseUnpaused is a log parse operation binding the contract event 0x3582d1828e26bf56bd801502bc021ac0bc8afb57c826e4986b45593c8fad389c.
⋮----
func (_SlashEscrowFactory *SlashEscrowFactoryFilterer) ParseUnpaused(log types.Log) (*SlashEscrowFactoryUnpaused, error)
````

## File: pkg/bindings/SlashEscrowFactoryStorage/binding.go
````go
// Code generated - DO NOT EDIT.
// This file is a generated binding and any manual changes will be lost.
⋮----
package SlashEscrowFactoryStorage
⋮----
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"
)
⋮----
"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
)
⋮----
// OperatorSet is an auto generated low-level Go binding around an user-defined struct.
type OperatorSet struct {
	Avs common.Address
	Id  uint32
}
⋮----
// SlashEscrowFactoryStorageMetaData contains all meta data concerning the SlashEscrowFactoryStorage contract.
var SlashEscrowFactoryStorageMetaData = &bind.MetaData{
	ABI: "[{\"type\":\"function\",\"name\":\"allocationManager\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIAllocationManager\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"computeSlashEscrowSalt\",\"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\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"pure\"},{\"type\":\"function\",\"name\":\"getEscrowCompleteBlock\",\"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\":\"uint32\",\"internalType\":\"uint32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getEscrowStartBlock\",\"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\":\"getGlobalEscrowDelay\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getPendingEscrows\",\"inputs\":[],\"outputs\":[{\"name\":\"operatorSets\",\"type\":\"tuple[]\",\"internalType\":\"structOperatorSet[]\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]},{\"name\":\"isRedistributing\",\"type\":\"bool[]\",\"internalType\":\"bool[]\"},{\"name\":\"slashIds\",\"type\":\"uint256[][]\",\"internalType\":\"uint256[][]\"},{\"name\":\"completeBlocks\",\"type\":\"uint32[][]\",\"internalType\":\"uint32[][]\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getPendingOperatorSets\",\"inputs\":[],\"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\":\"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\":\"getPendingStrategiesForSlashId\",\"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\":\"strategies\",\"type\":\"address[]\",\"internalType\":\"contractIStrategy[]\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getPendingStrategiesForSlashIds\",\"inputs\":[{\"name\":\"operatorSet\",\"type\":\"tuple\",\"internalType\":\"structOperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]}],\"outputs\":[{\"name\":\"strategies\",\"type\":\"address[][]\",\"internalType\":\"contractIStrategy[][]\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getPendingUnderlyingAmountForStrategy\",\"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\":\"getSlashEscrow\",\"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\":\"contractISlashEscrow\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getStrategyEscrowDelay\",\"inputs\":[{\"name\":\"strategy\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getTotalPendingOperatorSets\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getTotalPendingSlashIds\",\"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\":\"getTotalPendingStrategiesForSlashId\",\"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\":\"initialize\",\"inputs\":[{\"name\":\"initialOwner\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"initialPausedStatus\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"initialGlobalDelayBlocks\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"initiateSlashEscrow\",\"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\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"isDeployedSlashEscrow\",\"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\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"isDeployedSlashEscrow\",\"inputs\":[{\"name\":\"slashEscrow\",\"type\":\"address\",\"internalType\":\"contractISlashEscrow\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"isEscrowPaused\",\"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\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"isPendingOperatorSet\",\"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\":\"isPendingSlashId\",\"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\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"pauseEscrow\",\"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\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"releaseSlashEscrow\",\"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\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"releaseSlashEscrowByStrategy\",\"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\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"setGlobalEscrowDelay\",\"inputs\":[{\"name\":\"delay\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"setStrategyEscrowDelay\",\"inputs\":[{\"name\":\"strategy\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"},{\"name\":\"delay\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"slashEscrowImplementation\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractISlashEscrow\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"strategyManager\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIStrategyManager\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"unpauseEscrow\",\"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\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"event\",\"name\":\"EscrowComplete\",\"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\":\"recipient\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"EscrowPaused\",\"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\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"EscrowUnpaused\",\"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\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"GlobalEscrowDelaySet\",\"inputs\":[{\"name\":\"delay\",\"type\":\"uint32\",\"indexed\":false,\"internalType\":\"uint32\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"StartEscrow\",\"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\":\"startBlock\",\"type\":\"uint32\",\"indexed\":false,\"internalType\":\"uint32\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"StrategyEscrowDelaySet\",\"inputs\":[{\"name\":\"strategy\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"contractIStrategy\"},{\"name\":\"delay\",\"type\":\"uint32\",\"indexed\":false,\"internalType\":\"uint32\"}],\"anonymous\":false},{\"type\":\"error\",\"name\":\"EscrowDelayNotElapsed\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"EscrowNotMature\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"OnlyRedistributionRecipient\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"OnlyStrategyManager\",\"inputs\":[]}]",
}
⋮----
// SlashEscrowFactoryStorageABI is the input ABI used to generate the binding from.
// Deprecated: Use SlashEscrowFactoryStorageMetaData.ABI instead.
var SlashEscrowFactoryStorageABI = SlashEscrowFactoryStorageMetaData.ABI
⋮----
// SlashEscrowFactoryStorage is an auto generated Go binding around an Ethereum contract.
type SlashEscrowFactoryStorage struct {
	SlashEscrowFactoryStorageCaller     // Read-only binding to the contract
	SlashEscrowFactoryStorageTransactor // Write-only binding to the contract
	SlashEscrowFactoryStorageFilterer   // Log filterer for contract events
}
⋮----
SlashEscrowFactoryStorageCaller     // Read-only binding to the contract
SlashEscrowFactoryStorageTransactor // Write-only binding to the contract
SlashEscrowFactoryStorageFilterer   // Log filterer for contract events
⋮----
// SlashEscrowFactoryStorageCaller is an auto generated read-only Go binding around an Ethereum contract.
type SlashEscrowFactoryStorageCaller struct {
	contract *bind.BoundContract // Generic contract wrapper for the low level calls
}
⋮----
contract *bind.BoundContract // Generic contract wrapper for the low level calls
⋮----
// SlashEscrowFactoryStorageTransactor is an auto generated write-only Go binding around an Ethereum contract.
type SlashEscrowFactoryStorageTransactor struct {
	contract *bind.BoundContract // Generic contract wrapper for the low level calls
}
⋮----
// SlashEscrowFactoryStorageFilterer is an auto generated log filtering Go binding around an Ethereum contract events.
type SlashEscrowFactoryStorageFilterer struct {
	contract *bind.BoundContract // Generic contract wrapper for the low level calls
}
⋮----
// SlashEscrowFactoryStorageSession is an auto generated Go binding around an Ethereum contract,
// with pre-set call and transact options.
type SlashEscrowFactoryStorageSession struct {
	Contract     *SlashEscrowFactoryStorage // 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
}
⋮----
Contract     *SlashEscrowFactoryStorage // 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
⋮----
// SlashEscrowFactoryStorageCallerSession is an auto generated read-only Go binding around an Ethereum contract,
// with pre-set call options.
type SlashEscrowFactoryStorageCallerSession struct {
	Contract *SlashEscrowFactoryStorageCaller // Generic contract caller binding to set the session for
	CallOpts bind.CallOpts                    // Call options to use throughout this session
}
⋮----
Contract *SlashEscrowFactoryStorageCaller // Generic contract caller binding to set the session for
CallOpts bind.CallOpts                    // Call options to use throughout this session
⋮----
// SlashEscrowFactoryStorageTransactorSession is an auto generated write-only Go binding around an Ethereum contract,
// with pre-set transact options.
type SlashEscrowFactoryStorageTransactorSession struct {
	Contract     *SlashEscrowFactoryStorageTransactor // Generic contract transactor binding to set the session for
	TransactOpts bind.TransactOpts                    // Transaction auth options to use throughout this session
}
⋮----
Contract     *SlashEscrowFactoryStorageTransactor // Generic contract transactor binding to set the session for
TransactOpts bind.TransactOpts                    // Transaction auth options to use throughout this session
⋮----
// SlashEscrowFactoryStorageRaw is an auto generated low-level Go binding around an Ethereum contract.
type SlashEscrowFactoryStorageRaw struct {
	Contract *SlashEscrowFactoryStorage // Generic contract binding to access the raw methods on
}
⋮----
Contract *SlashEscrowFactoryStorage // Generic contract binding to access the raw methods on
⋮----
// SlashEscrowFactoryStorageCallerRaw is an auto generated low-level read-only Go binding around an Ethereum contract.
type SlashEscrowFactoryStorageCallerRaw struct {
	Contract *SlashEscrowFactoryStorageCaller // Generic read-only contract binding to access the raw methods on
}
⋮----
Contract *SlashEscrowFactoryStorageCaller // Generic read-only contract binding to access the raw methods on
⋮----
// SlashEscrowFactoryStorageTransactorRaw is an auto generated low-level write-only Go binding around an Ethereum contract.
type SlashEscrowFactoryStorageTransactorRaw struct {
	Contract *SlashEscrowFactoryStorageTransactor // Generic write-only contract binding to access the raw methods on
}
⋮----
Contract *SlashEscrowFactoryStorageTransactor // Generic write-only contract binding to access the raw methods on
⋮----
// NewSlashEscrowFactoryStorage creates a new instance of SlashEscrowFactoryStorage, bound to a specific deployed contract.
func NewSlashEscrowFactoryStorage(address common.Address, backend bind.ContractBackend) (*SlashEscrowFactoryStorage, error)
⋮----
// NewSlashEscrowFactoryStorageCaller creates a new read-only instance of SlashEscrowFactoryStorage, bound to a specific deployed contract.
func NewSlashEscrowFactoryStorageCaller(address common.Address, caller bind.ContractCaller) (*SlashEscrowFactoryStorageCaller, error)
⋮----
// NewSlashEscrowFactoryStorageTransactor creates a new write-only instance of SlashEscrowFactoryStorage, bound to a specific deployed contract.
func NewSlashEscrowFactoryStorageTransactor(address common.Address, transactor bind.ContractTransactor) (*SlashEscrowFactoryStorageTransactor, error)
⋮----
// NewSlashEscrowFactoryStorageFilterer creates a new log filterer instance of SlashEscrowFactoryStorage, bound to a specific deployed contract.
func NewSlashEscrowFactoryStorageFilterer(address common.Address, filterer bind.ContractFilterer) (*SlashEscrowFactoryStorageFilterer, error)
⋮----
// bindSlashEscrowFactoryStorage binds a generic wrapper to an already deployed contract.
func bindSlashEscrowFactoryStorage(address common.Address, caller bind.ContractCaller, transactor bind.ContractTransactor, filterer bind.ContractFilterer) (*bind.BoundContract, error)
⋮----
// 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 (_SlashEscrowFactoryStorage *SlashEscrowFactoryStorageRaw) Call(opts *bind.CallOpts, result *[]interface
⋮----
// Transfer initiates a plain transaction to move funds to the contract, calling
// its default method if one is available.
func (_SlashEscrowFactoryStorage *SlashEscrowFactoryStorageRaw) Transfer(opts *bind.TransactOpts) (*types.Transaction, error)
⋮----
// Transact invokes the (paid) contract method with params as input values.
func (_SlashEscrowFactoryStorage *SlashEscrowFactoryStorageRaw) Transact(opts *bind.TransactOpts, method string, params ...interface
⋮----
// AllocationManager is a free data retrieval call binding the contract method 0xca8aa7c7.
//
// Solidity: function allocationManager() view returns(address)
func (_SlashEscrowFactoryStorage *SlashEscrowFactoryStorageCaller) AllocationManager(opts *bind.CallOpts) (common.Address, error)
⋮----
var out []interface{}
⋮----
// ComputeSlashEscrowSalt is a free data retrieval call binding the contract method 0xc2de7096.
⋮----
// Solidity: function computeSlashEscrowSalt((address,uint32) operatorSet, uint256 slashId) pure returns(bytes32)
func (_SlashEscrowFactoryStorage *SlashEscrowFactoryStorageCaller) ComputeSlashEscrowSalt(opts *bind.CallOpts, operatorSet OperatorSet, slashId *big.Int) ([32]byte, error)
⋮----
// GetEscrowCompleteBlock is a free data retrieval call binding the contract method 0x0310f3e6.
⋮----
// Solidity: function getEscrowCompleteBlock((address,uint32) operatorSet, uint256 slashId) view returns(uint32)
func (_SlashEscrowFactoryStorage *SlashEscrowFactoryStorageCaller) GetEscrowCompleteBlock(opts *bind.CallOpts, operatorSet OperatorSet, slashId *big.Int) (uint32, error)
⋮----
// GetEscrowStartBlock is a free data retrieval call binding the contract method 0x05a4dfbb.
⋮----
// Solidity: function getEscrowStartBlock((address,uint32) operatorSet, uint256 slashId) view returns(uint256)
func (_SlashEscrowFactoryStorage *SlashEscrowFactoryStorageCaller) GetEscrowStartBlock(opts *bind.CallOpts, operatorSet OperatorSet, slashId *big.Int) (*big.Int, error)
⋮----
// GetGlobalEscrowDelay is a free data retrieval call binding the contract method 0x8a65d2d2.
⋮----
// Solidity: function getGlobalEscrowDelay() view returns(uint32)
func (_SlashEscrowFactoryStorage *SlashEscrowFactoryStorageCaller) GetGlobalEscrowDelay(opts *bind.CallOpts) (uint32, error)
⋮----
// GetPendingEscrows is a free data retrieval call binding the contract method 0xc50f4e48.
⋮----
// Solidity: function getPendingEscrows() view returns((address,uint32)[] operatorSets, bool[] isRedistributing, uint256[][] slashIds, uint32[][] completeBlocks)
func (_SlashEscrowFactoryStorage *SlashEscrowFactoryStorageCaller) GetPendingEscrows(opts *bind.CallOpts) (struct
⋮----
// GetPendingOperatorSets is a free data retrieval call binding the contract method 0x3f292b08.
⋮----
// Solidity: function getPendingOperatorSets() view returns((address,uint32)[] operatorSets)
func (_SlashEscrowFactoryStorage *SlashEscrowFactoryStorageCaller) GetPendingOperatorSets(opts *bind.CallOpts) ([]OperatorSet, error)
⋮----
// GetPendingSlashIds is a free data retrieval call binding the contract method 0x7def1564.
⋮----
// Solidity: function getPendingSlashIds((address,uint32) operatorSet) view returns(uint256[])
func (_SlashEscrowFactoryStorage *SlashEscrowFactoryStorageCaller) GetPendingSlashIds(opts *bind.CallOpts, operatorSet OperatorSet) ([]*big.Int, error)
⋮----
// GetPendingStrategiesForSlashId is a free data retrieval call binding the contract method 0x7130c423.
⋮----
// Solidity: function getPendingStrategiesForSlashId((address,uint32) operatorSet, uint256 slashId) view returns(address[] strategies)
func (_SlashEscrowFactoryStorage *SlashEscrowFactoryStorageCaller) GetPendingStrategiesForSlashId(opts *bind.CallOpts, operatorSet OperatorSet, slashId *big.Int) ([]common.Address, error)
⋮----
// GetPendingStrategiesForSlashIds is a free data retrieval call binding the contract method 0xa56b21e4.
⋮----
// Solidity: function getPendingStrategiesForSlashIds((address,uint32) operatorSet) view returns(address[][] strategies)
func (_SlashEscrowFactoryStorage *SlashEscrowFactoryStorageCaller) GetPendingStrategiesForSlashIds(opts *bind.CallOpts, operatorSet OperatorSet) ([][]common.Address, error)
⋮----
// GetPendingUnderlyingAmountForStrategy is a free data retrieval call binding the contract method 0xb23ff83b.
⋮----
// Solidity: function getPendingUnderlyingAmountForStrategy((address,uint32) operatorSet, uint256 slashId, address strategy) view returns(uint256)
func (_SlashEscrowFactoryStorage *SlashEscrowFactoryStorageCaller) GetPendingUnderlyingAmountForStrategy(opts *bind.CallOpts, operatorSet OperatorSet, slashId *big.Int, strategy common.Address) (*big.Int, error)
⋮----
// GetSlashEscrow is a free data retrieval call binding the contract method 0x3453b234.
⋮----
// Solidity: function getSlashEscrow((address,uint32) operatorSet, uint256 slashId) view returns(address)
func (_SlashEscrowFactoryStorage *SlashEscrowFactoryStorageCaller) GetSlashEscrow(opts *bind.CallOpts, operatorSet OperatorSet, slashId *big.Int) (common.Address, error)
⋮----
// GetStrategyEscrowDelay is a free data retrieval call binding the contract method 0x8d5d4036.
⋮----
// Solidity: function getStrategyEscrowDelay(address strategy) view returns(uint32)
func (_SlashEscrowFactoryStorage *SlashEscrowFactoryStorageCaller) GetStrategyEscrowDelay(opts *bind.CallOpts, strategy common.Address) (uint32, error)
⋮----
// GetTotalPendingOperatorSets is a free data retrieval call binding the contract method 0x78cb9600.
⋮----
// Solidity: function getTotalPendingOperatorSets() view returns(uint256)
func (_SlashEscrowFactoryStorage *SlashEscrowFactoryStorageCaller) GetTotalPendingOperatorSets(opts *bind.CallOpts) (*big.Int, error)
⋮----
// GetTotalPendingSlashIds is a free data retrieval call binding the contract method 0x6729b5db.
⋮----
// Solidity: function getTotalPendingSlashIds((address,uint32) operatorSet) view returns(uint256)
func (_SlashEscrowFactoryStorage *SlashEscrowFactoryStorageCaller) GetTotalPendingSlashIds(opts *bind.CallOpts, operatorSet OperatorSet) (*big.Int, error)
⋮----
// GetTotalPendingStrategiesForSlashId is a free data retrieval call binding the contract method 0x277a9f0e.
⋮----
// Solidity: function getTotalPendingStrategiesForSlashId((address,uint32) operatorSet, uint256 slashId) view returns(uint256)
func (_SlashEscrowFactoryStorage *SlashEscrowFactoryStorageCaller) GetTotalPendingStrategiesForSlashId(opts *bind.CallOpts, operatorSet OperatorSet, slashId *big.Int) (*big.Int, error)
⋮----
// IsDeployedSlashEscrow is a free data retrieval call binding the contract method 0x19f3db26.
⋮----
// Solidity: function isDeployedSlashEscrow((address,uint32) operatorSet, uint256 slashId) view returns(bool)
func (_SlashEscrowFactoryStorage *SlashEscrowFactoryStorageCaller) IsDeployedSlashEscrow(opts *bind.CallOpts, operatorSet OperatorSet, slashId *big.Int) (bool, error)
⋮----
// IsDeployedSlashEscrow0 is a free data retrieval call binding the contract method 0xc8b5330c.
⋮----
// Solidity: function isDeployedSlashEscrow(address slashEscrow) view returns(bool)
func (_SlashEscrowFactoryStorage *SlashEscrowFactoryStorageCaller) IsDeployedSlashEscrow0(opts *bind.CallOpts, slashEscrow common.Address) (bool, error)
⋮----
// IsEscrowPaused is a free data retrieval call binding the contract method 0x78748459.
⋮----
// Solidity: function isEscrowPaused((address,uint32) operatorSet, uint256 slashId) view returns(bool)
func (_SlashEscrowFactoryStorage *SlashEscrowFactoryStorageCaller) IsEscrowPaused(opts *bind.CallOpts, operatorSet OperatorSet, slashId *big.Int) (bool, error)
⋮----
// IsPendingOperatorSet is a free data retrieval call binding the contract method 0x71e166e7.
⋮----
// Solidity: function isPendingOperatorSet((address,uint32) operatorSet) view returns(bool)
func (_SlashEscrowFactoryStorage *SlashEscrowFactoryStorageCaller) IsPendingOperatorSet(opts *bind.CallOpts, operatorSet OperatorSet) (bool, error)
⋮----
// IsPendingSlashId is a free data retrieval call binding the contract method 0x87420b07.
⋮----
// Solidity: function isPendingSlashId((address,uint32) operatorSet, uint256 slashId) view returns(bool)
func (_SlashEscrowFactoryStorage *SlashEscrowFactoryStorageCaller) IsPendingSlashId(opts *bind.CallOpts, operatorSet OperatorSet, slashId *big.Int) (bool, error)
⋮----
// SlashEscrowImplementation is a free data retrieval call binding the contract method 0xa3c65641.
⋮----
// Solidity: function slashEscrowImplementation() view returns(address)
func (_SlashEscrowFactoryStorage *SlashEscrowFactoryStorageCaller) SlashEscrowImplementation(opts *bind.CallOpts) (common.Address, error)
⋮----
// StrategyManager is a free data retrieval call binding the contract method 0x39b70e38.
⋮----
// Solidity: function strategyManager() view returns(address)
func (_SlashEscrowFactoryStorage *SlashEscrowFactoryStorageCaller) StrategyManager(opts *bind.CallOpts) (common.Address, error)
⋮----
// Initialize is a paid mutator transaction binding the contract method 0x6c5ac81e.
⋮----
// Solidity: function initialize(address initialOwner, uint256 initialPausedStatus, uint32 initialGlobalDelayBlocks) returns()
func (_SlashEscrowFactoryStorage *SlashEscrowFactoryStorageTransactor) Initialize(opts *bind.TransactOpts, initialOwner common.Address, initialPausedStatus *big.Int, initialGlobalDelayBlocks uint32) (*types.Transaction, error)
⋮----
// InitiateSlashEscrow is a paid mutator transaction binding the contract method 0x7a967611.
⋮----
// Solidity: function initiateSlashEscrow((address,uint32) operatorSet, uint256 slashId, address strategy) returns()
func (_SlashEscrowFactoryStorage *SlashEscrowFactoryStorageTransactor) InitiateSlashEscrow(opts *bind.TransactOpts, operatorSet OperatorSet, slashId *big.Int, strategy common.Address) (*types.Transaction, error)
⋮----
// PauseEscrow is a paid mutator transaction binding the contract method 0xe7ed076b.
⋮----
// Solidity: function pauseEscrow((address,uint32) operatorSet, uint256 slashId) returns()
func (_SlashEscrowFactoryStorage *SlashEscrowFactoryStorageTransactor) PauseEscrow(opts *bind.TransactOpts, operatorSet OperatorSet, slashId *big.Int) (*types.Transaction, error)
⋮----
// ReleaseSlashEscrow is a paid mutator transaction binding the contract method 0x5ffa5a81.
⋮----
// Solidity: function releaseSlashEscrow((address,uint32) operatorSet, uint256 slashId) returns()
func (_SlashEscrowFactoryStorage *SlashEscrowFactoryStorageTransactor) ReleaseSlashEscrow(opts *bind.TransactOpts, operatorSet OperatorSet, slashId *big.Int) (*types.Transaction, error)
⋮----
// ReleaseSlashEscrowByStrategy is a paid mutator transaction binding the contract method 0x0e475b17.
⋮----
// Solidity: function releaseSlashEscrowByStrategy((address,uint32) operatorSet, uint256 slashId, address strategy) returns()
func (_SlashEscrowFactoryStorage *SlashEscrowFactoryStorageTransactor) ReleaseSlashEscrowByStrategy(opts *bind.TransactOpts, operatorSet OperatorSet, slashId *big.Int, strategy common.Address) (*types.Transaction, error)
⋮----
// SetGlobalEscrowDelay is a paid mutator transaction binding the contract method 0x5e0a64c5.
⋮----
// Solidity: function setGlobalEscrowDelay(uint32 delay) returns()
func (_SlashEscrowFactoryStorage *SlashEscrowFactoryStorageTransactor) SetGlobalEscrowDelay(opts *bind.TransactOpts, delay uint32) (*types.Transaction, error)
⋮----
// SetStrategyEscrowDelay is a paid mutator transaction binding the contract method 0x8fc46be5.
⋮----
// Solidity: function setStrategyEscrowDelay(address strategy, uint32 delay) returns()
func (_SlashEscrowFactoryStorage *SlashEscrowFactoryStorageTransactor) SetStrategyEscrowDelay(opts *bind.TransactOpts, strategy common.Address, delay uint32) (*types.Transaction, error)
⋮----
// UnpauseEscrow is a paid mutator transaction binding the contract method 0x9b122356.
⋮----
// Solidity: function unpauseEscrow((address,uint32) operatorSet, uint256 slashId) returns()
func (_SlashEscrowFactoryStorage *SlashEscrowFactoryStorageTransactor) UnpauseEscrow(opts *bind.TransactOpts, operatorSet OperatorSet, slashId *big.Int) (*types.Transaction, error)
⋮----
// SlashEscrowFactoryStorageEscrowCompleteIterator is returned from FilterEscrowComplete and is used to iterate over the raw logs and unpacked data for EscrowComplete events raised by the SlashEscrowFactoryStorage contract.
type SlashEscrowFactoryStorageEscrowCompleteIterator struct {
	Event *SlashEscrowFactoryStorageEscrowComplete // 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
}
⋮----
Event *SlashEscrowFactoryStorageEscrowComplete // 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 *SlashEscrowFactoryStorageEscrowCompleteIterator) Next() bool
⋮----
// If the iterator failed, stop iterating
⋮----
// If the iterator completed, deliver directly whatever's available
⋮----
// Iterator still in progress, wait for either a data or an error event
⋮----
// Error returns any retrieval or parsing error occurred during filtering.
func (it *SlashEscrowFactoryStorageEscrowCompleteIterator) Error() error
⋮----
// Close terminates the iteration process, releasing any pending underlying
// resources.
func (it *SlashEscrowFactoryStorageEscrowCompleteIterator) Close() error
⋮----
// SlashEscrowFactoryStorageEscrowComplete represents a EscrowComplete event raised by the SlashEscrowFactoryStorage contract.
type SlashEscrowFactoryStorageEscrowComplete struct {
	OperatorSet OperatorSet
	SlashId     *big.Int
	Strategy    common.Address
	Recipient   common.Address
	Raw         types.Log // Blockchain specific contextual infos
}
⋮----
Raw         types.Log // Blockchain specific contextual infos
⋮----
// FilterEscrowComplete is a free log retrieval operation binding the contract event 0x32be306ad5a833e756b7cb9724d5312afe0feda6163bfc2dd98ee713346a9abc.
⋮----
// Solidity: event EscrowComplete((address,uint32) operatorSet, uint256 slashId, address strategy, address recipient)
func (_SlashEscrowFactoryStorage *SlashEscrowFactoryStorageFilterer) FilterEscrowComplete(opts *bind.FilterOpts) (*SlashEscrowFactoryStorageEscrowCompleteIterator, error)
⋮----
// WatchEscrowComplete is a free log subscription operation binding the contract event 0x32be306ad5a833e756b7cb9724d5312afe0feda6163bfc2dd98ee713346a9abc.
⋮----
func (_SlashEscrowFactoryStorage *SlashEscrowFactoryStorageFilterer) WatchEscrowComplete(opts *bind.WatchOpts, sink chan<- *SlashEscrowFactoryStorageEscrowComplete) (event.Subscription, error)
⋮----
// New log arrived, parse the event and forward to the user
⋮----
// ParseEscrowComplete is a log parse operation binding the contract event 0x32be306ad5a833e756b7cb9724d5312afe0feda6163bfc2dd98ee713346a9abc.
⋮----
func (_SlashEscrowFactoryStorage *SlashEscrowFactoryStorageFilterer) ParseEscrowComplete(log types.Log) (*SlashEscrowFactoryStorageEscrowComplete, error)
⋮----
// SlashEscrowFactoryStorageEscrowPausedIterator is returned from FilterEscrowPaused and is used to iterate over the raw logs and unpacked data for EscrowPaused events raised by the SlashEscrowFactoryStorage contract.
type SlashEscrowFactoryStorageEscrowPausedIterator struct {
	Event *SlashEscrowFactoryStorageEscrowPaused // 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
}
⋮----
Event *SlashEscrowFactoryStorageEscrowPaused // Event containing the contract specifics and raw log
⋮----
// SlashEscrowFactoryStorageEscrowPaused represents a EscrowPaused event raised by the SlashEscrowFactoryStorage contract.
type SlashEscrowFactoryStorageEscrowPaused struct {
	OperatorSet OperatorSet
	SlashId     *big.Int
	Raw         types.Log // Blockchain specific contextual infos
}
⋮----
// FilterEscrowPaused is a free log retrieval operation binding the contract event 0x050add19b1a78a4240cdebc8747899275f2dd070c88e83904a37ff7d1a539744.
⋮----
// Solidity: event EscrowPaused((address,uint32) operatorSet, uint256 slashId)
func (_SlashEscrowFactoryStorage *SlashEscrowFactoryStorageFilterer) FilterEscrowPaused(opts *bind.FilterOpts) (*SlashEscrowFactoryStorageEscrowPausedIterator, error)
⋮----
// WatchEscrowPaused is a free log subscription operation binding the contract event 0x050add19b1a78a4240cdebc8747899275f2dd070c88e83904a37ff7d1a539744.
⋮----
func (_SlashEscrowFactoryStorage *SlashEscrowFactoryStorageFilterer) WatchEscrowPaused(opts *bind.WatchOpts, sink chan<- *SlashEscrowFactoryStorageEscrowPaused) (event.Subscription, error)
⋮----
// ParseEscrowPaused is a log parse operation binding the contract event 0x050add19b1a78a4240cdebc8747899275f2dd070c88e83904a37ff7d1a539744.
⋮----
func (_SlashEscrowFactoryStorage *SlashEscrowFactoryStorageFilterer) ParseEscrowPaused(log types.Log) (*SlashEscrowFactoryStorageEscrowPaused, error)
⋮----
// SlashEscrowFactoryStorageEscrowUnpausedIterator is returned from FilterEscrowUnpaused and is used to iterate over the raw logs and unpacked data for EscrowUnpaused events raised by the SlashEscrowFactoryStorage contract.
type SlashEscrowFactoryStorageEscrowUnpausedIterator struct {
	Event *SlashEscrowFactoryStorageEscrowUnpaused // 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
}
⋮----
Event *SlashEscrowFactoryStorageEscrowUnpaused // Event containing the contract specifics and raw log
⋮----
// SlashEscrowFactoryStorageEscrowUnpaused represents a EscrowUnpaused event raised by the SlashEscrowFactoryStorage contract.
type SlashEscrowFactoryStorageEscrowUnpaused struct {
	OperatorSet OperatorSet
	SlashId     *big.Int
	Raw         types.Log // Blockchain specific contextual infos
}
⋮----
// FilterEscrowUnpaused is a free log retrieval operation binding the contract event 0xb8877c6bf02d5f6603188eb653c9269271836b75b2012a5d7f5f233e7cf2f241.
⋮----
// Solidity: event EscrowUnpaused((address,uint32) operatorSet, uint256 slashId)
func (_SlashEscrowFactoryStorage *SlashEscrowFactoryStorageFilterer) FilterEscrowUnpaused(opts *bind.FilterOpts) (*SlashEscrowFactoryStorageEscrowUnpausedIterator, error)
⋮----
// WatchEscrowUnpaused is a free log subscription operation binding the contract event 0xb8877c6bf02d5f6603188eb653c9269271836b75b2012a5d7f5f233e7cf2f241.
⋮----
func (_SlashEscrowFactoryStorage *SlashEscrowFactoryStorageFilterer) WatchEscrowUnpaused(opts *bind.WatchOpts, sink chan<- *SlashEscrowFactoryStorageEscrowUnpaused) (event.Subscription, error)
⋮----
// ParseEscrowUnpaused is a log parse operation binding the contract event 0xb8877c6bf02d5f6603188eb653c9269271836b75b2012a5d7f5f233e7cf2f241.
⋮----
func (_SlashEscrowFactoryStorage *SlashEscrowFactoryStorageFilterer) ParseEscrowUnpaused(log types.Log) (*SlashEscrowFactoryStorageEscrowUnpaused, error)
⋮----
// SlashEscrowFactoryStorageGlobalEscrowDelaySetIterator is returned from FilterGlobalEscrowDelaySet and is used to iterate over the raw logs and unpacked data for GlobalEscrowDelaySet events raised by the SlashEscrowFactoryStorage contract.
type SlashEscrowFactoryStorageGlobalEscrowDelaySetIterator struct {
	Event *SlashEscrowFactoryStorageGlobalEscrowDelaySet // 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
}
⋮----
Event *SlashEscrowFactoryStorageGlobalEscrowDelaySet // Event containing the contract specifics and raw log
⋮----
// SlashEscrowFactoryStorageGlobalEscrowDelaySet represents a GlobalEscrowDelaySet event raised by the SlashEscrowFactoryStorage contract.
type SlashEscrowFactoryStorageGlobalEscrowDelaySet struct {
	Delay uint32
	Raw   types.Log // Blockchain specific contextual infos
}
⋮----
Raw   types.Log // Blockchain specific contextual infos
⋮----
// FilterGlobalEscrowDelaySet is a free log retrieval operation binding the contract event 0x67d0077d22e4e06f761dd87f6c9f2310ac879c9ce17de50d381e05b72f45fbf6.
⋮----
// Solidity: event GlobalEscrowDelaySet(uint32 delay)
func (_SlashEscrowFactoryStorage *SlashEscrowFactoryStorageFilterer) FilterGlobalEscrowDelaySet(opts *bind.FilterOpts) (*SlashEscrowFactoryStorageGlobalEscrowDelaySetIterator, error)
⋮----
// WatchGlobalEscrowDelaySet is a free log subscription operation binding the contract event 0x67d0077d22e4e06f761dd87f6c9f2310ac879c9ce17de50d381e05b72f45fbf6.
⋮----
func (_SlashEscrowFactoryStorage *SlashEscrowFactoryStorageFilterer) WatchGlobalEscrowDelaySet(opts *bind.WatchOpts, sink chan<- *SlashEscrowFactoryStorageGlobalEscrowDelaySet) (event.Subscription, error)
⋮----
// ParseGlobalEscrowDelaySet is a log parse operation binding the contract event 0x67d0077d22e4e06f761dd87f6c9f2310ac879c9ce17de50d381e05b72f45fbf6.
⋮----
func (_SlashEscrowFactoryStorage *SlashEscrowFactoryStorageFilterer) ParseGlobalEscrowDelaySet(log types.Log) (*SlashEscrowFactoryStorageGlobalEscrowDelaySet, error)
⋮----
// SlashEscrowFactoryStorageStartEscrowIterator is returned from FilterStartEscrow and is used to iterate over the raw logs and unpacked data for StartEscrow events raised by the SlashEscrowFactoryStorage contract.
type SlashEscrowFactoryStorageStartEscrowIterator struct {
	Event *SlashEscrowFactoryStorageStartEscrow // 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
}
⋮----
Event *SlashEscrowFactoryStorageStartEscrow // Event containing the contract specifics and raw log
⋮----
// SlashEscrowFactoryStorageStartEscrow represents a StartEscrow event raised by the SlashEscrowFactoryStorage contract.
type SlashEscrowFactoryStorageStartEscrow struct {
	OperatorSet OperatorSet
	SlashId     *big.Int
	Strategy    common.Address
	StartBlock  uint32
	Raw         types.Log // Blockchain specific contextual infos
}
⋮----
// FilterStartEscrow is a free log retrieval operation binding the contract event 0x3afae24c1d3dd2ce3649054ad82458a8c9967ebd9ce10a9a5a3d059f55bfaedb.
⋮----
// Solidity: event StartEscrow((address,uint32) operatorSet, uint256 slashId, address strategy, uint32 startBlock)
func (_SlashEscrowFactoryStorage *SlashEscrowFactoryStorageFilterer) FilterStartEscrow(opts *bind.FilterOpts) (*SlashEscrowFactoryStorageStartEscrowIterator, error)
⋮----
// WatchStartEscrow is a free log subscription operation binding the contract event 0x3afae24c1d3dd2ce3649054ad82458a8c9967ebd9ce10a9a5a3d059f55bfaedb.
⋮----
func (_SlashEscrowFactoryStorage *SlashEscrowFactoryStorageFilterer) WatchStartEscrow(opts *bind.WatchOpts, sink chan<- *SlashEscrowFactoryStorageStartEscrow) (event.Subscription, error)
⋮----
// ParseStartEscrow is a log parse operation binding the contract event 0x3afae24c1d3dd2ce3649054ad82458a8c9967ebd9ce10a9a5a3d059f55bfaedb.
⋮----
func (_SlashEscrowFactoryStorage *SlashEscrowFactoryStorageFilterer) ParseStartEscrow(log types.Log) (*SlashEscrowFactoryStorageStartEscrow, error)
⋮----
// SlashEscrowFactoryStorageStrategyEscrowDelaySetIterator is returned from FilterStrategyEscrowDelaySet and is used to iterate over the raw logs and unpacked data for StrategyEscrowDelaySet events raised by the SlashEscrowFactoryStorage contract.
type SlashEscrowFactoryStorageStrategyEscrowDelaySetIterator struct {
	Event *SlashEscrowFactoryStorageStrategyEscrowDelaySet // 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
}
⋮----
Event *SlashEscrowFactoryStorageStrategyEscrowDelaySet // Event containing the contract specifics and raw log
⋮----
// SlashEscrowFactoryStorageStrategyEscrowDelaySet represents a StrategyEscrowDelaySet event raised by the SlashEscrowFactoryStorage contract.
type SlashEscrowFactoryStorageStrategyEscrowDelaySet struct {
	Strategy common.Address
	Delay    uint32
	Raw      types.Log // Blockchain specific contextual infos
}
⋮----
Raw      types.Log // Blockchain specific contextual infos
⋮----
// FilterStrategyEscrowDelaySet is a free log retrieval operation binding the contract event 0x5d2b33f07ae22a809e79005f96ffac70c3715df85a3b011b025e0a86a23a007b.
⋮----
// Solidity: event StrategyEscrowDelaySet(address strategy, uint32 delay)
func (_SlashEscrowFactoryStorage *SlashEscrowFactoryStorageFilterer) FilterStrategyEscrowDelaySet(opts *bind.FilterOpts) (*SlashEscrowFactoryStorageStrategyEscrowDelaySetIterator, error)
⋮----
// WatchStrategyEscrowDelaySet is a free log subscription operation binding the contract event 0x5d2b33f07ae22a809e79005f96ffac70c3715df85a3b011b025e0a86a23a007b.
⋮----
func (_SlashEscrowFactoryStorage *SlashEscrowFactoryStorageFilterer) WatchStrategyEscrowDelaySet(opts *bind.WatchOpts, sink chan<- *SlashEscrowFactoryStorageStrategyEscrowDelaySet) (event.Subscription, error)
⋮----
// ParseStrategyEscrowDelaySet is a log parse operation binding the contract event 0x5d2b33f07ae22a809e79005f96ffac70c3715df85a3b011b025e0a86a23a007b.
⋮----
func (_SlashEscrowFactoryStorage *SlashEscrowFactoryStorageFilterer) ParseStrategyEscrowDelaySet(log types.Log) (*SlashEscrowFactoryStorageStrategyEscrowDelaySet, error)
````

## File: pkg/bindings/SlashingLib/binding.go
````go
// Code generated - DO NOT EDIT.
// This file is a generated binding and any manual changes will be lost.
⋮----
package SlashingLib
⋮----
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"
)
⋮----
"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
)
⋮----
// SlashingLibMetaData contains all meta data concerning the SlashingLib contract.
var SlashingLibMetaData = &bind.MetaData{
	ABI: "[{\"type\":\"error\",\"name\":\"InvalidDepositScalingFactor\",\"inputs\":[]}]",
	Bin: "0x60556032600b8282823980515f1a607314602657634e487b7160e01b5f525f60045260245ffd5b305f52607381538281f3fe730000000000000000000000000000000000000000301460806040525f5ffdfea2646970667358221220fd91b2132d25363c07e3138f9c6387e1144a28227e0643785efd62afc97a3bbf64736f6c634300081e0033",
}
⋮----
// SlashingLibABI is the input ABI used to generate the binding from.
// Deprecated: Use SlashingLibMetaData.ABI instead.
var SlashingLibABI = SlashingLibMetaData.ABI
⋮----
// SlashingLibBin is the compiled bytecode used for deploying new contracts.
// Deprecated: Use SlashingLibMetaData.Bin instead.
var SlashingLibBin = SlashingLibMetaData.Bin
⋮----
// DeploySlashingLib deploys a new Ethereum contract, binding an instance of SlashingLib to it.
func DeploySlashingLib(auth *bind.TransactOpts, backend bind.ContractBackend) (common.Address, *types.Transaction, *SlashingLib, error)
⋮----
// SlashingLib is an auto generated Go binding around an Ethereum contract.
type SlashingLib struct {
	SlashingLibCaller     // Read-only binding to the contract
	SlashingLibTransactor // Write-only binding to the contract
	SlashingLibFilterer   // Log filterer for contract events
}
⋮----
SlashingLibCaller     // Read-only binding to the contract
SlashingLibTransactor // Write-only binding to the contract
SlashingLibFilterer   // Log filterer for contract events
⋮----
// SlashingLibCaller is an auto generated read-only Go binding around an Ethereum contract.
type SlashingLibCaller struct {
	contract *bind.BoundContract // Generic contract wrapper for the low level calls
}
⋮----
contract *bind.BoundContract // Generic contract wrapper for the low level calls
⋮----
// SlashingLibTransactor is an auto generated write-only Go binding around an Ethereum contract.
type SlashingLibTransactor struct {
	contract *bind.BoundContract // Generic contract wrapper for the low level calls
}
⋮----
// SlashingLibFilterer is an auto generated log filtering Go binding around an Ethereum contract events.
type SlashingLibFilterer struct {
	contract *bind.BoundContract // Generic contract wrapper for the low level calls
}
⋮----
// SlashingLibSession is an auto generated Go binding around an Ethereum contract,
// with pre-set call and transact options.
type SlashingLibSession struct {
	Contract     *SlashingLib      // 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
}
⋮----
Contract     *SlashingLib      // 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
⋮----
// SlashingLibCallerSession is an auto generated read-only Go binding around an Ethereum contract,
// with pre-set call options.
type SlashingLibCallerSession struct {
	Contract *SlashingLibCaller // Generic contract caller binding to set the session for
	CallOpts bind.CallOpts      // Call options to use throughout this session
}
⋮----
Contract *SlashingLibCaller // Generic contract caller binding to set the session for
CallOpts bind.CallOpts      // Call options to use throughout this session
⋮----
// SlashingLibTransactorSession is an auto generated write-only Go binding around an Ethereum contract,
// with pre-set transact options.
type SlashingLibTransactorSession struct {
	Contract     *SlashingLibTransactor // Generic contract transactor binding to set the session for
	TransactOpts bind.TransactOpts      // Transaction auth options to use throughout this session
}
⋮----
Contract     *SlashingLibTransactor // Generic contract transactor binding to set the session for
TransactOpts bind.TransactOpts      // Transaction auth options to use throughout this session
⋮----
// SlashingLibRaw is an auto generated low-level Go binding around an Ethereum contract.
type SlashingLibRaw struct {
	Contract *SlashingLib // Generic contract binding to access the raw methods on
}
⋮----
Contract *SlashingLib // Generic contract binding to access the raw methods on
⋮----
// SlashingLibCallerRaw is an auto generated low-level read-only Go binding around an Ethereum contract.
type SlashingLibCallerRaw struct {
	Contract *SlashingLibCaller // Generic read-only contract binding to access the raw methods on
}
⋮----
Contract *SlashingLibCaller // Generic read-only contract binding to access the raw methods on
⋮----
// SlashingLibTransactorRaw is an auto generated low-level write-only Go binding around an Ethereum contract.
type SlashingLibTransactorRaw struct {
	Contract *SlashingLibTransactor // Generic write-only contract binding to access the raw methods on
}
⋮----
Contract *SlashingLibTransactor // Generic write-only contract binding to access the raw methods on
⋮----
// NewSlashingLib creates a new instance of SlashingLib, bound to a specific deployed contract.
func NewSlashingLib(address common.Address, backend bind.ContractBackend) (*SlashingLib, error)
⋮----
// NewSlashingLibCaller creates a new read-only instance of SlashingLib, bound to a specific deployed contract.
func NewSlashingLibCaller(address common.Address, caller bind.ContractCaller) (*SlashingLibCaller, error)
⋮----
// NewSlashingLibTransactor creates a new write-only instance of SlashingLib, bound to a specific deployed contract.
func NewSlashingLibTransactor(address common.Address, transactor bind.ContractTransactor) (*SlashingLibTransactor, error)
⋮----
// NewSlashingLibFilterer creates a new log filterer instance of SlashingLib, bound to a specific deployed contract.
func NewSlashingLibFilterer(address common.Address, filterer bind.ContractFilterer) (*SlashingLibFilterer, error)
⋮----
// bindSlashingLib binds a generic wrapper to an already deployed contract.
func bindSlashingLib(address common.Address, caller bind.ContractCaller, transactor bind.ContractTransactor, filterer bind.ContractFilterer) (*bind.BoundContract, error)
⋮----
// 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 (_SlashingLib *SlashingLibRaw) Call(opts *bind.CallOpts, result *[]interface
⋮----
// Transfer initiates a plain transaction to move funds to the contract, calling
// its default method if one is available.
func (_SlashingLib *SlashingLibRaw) Transfer(opts *bind.TransactOpts) (*types.Transaction, error)
⋮----
// Transact invokes the (paid) contract method with params as input values.
func (_SlashingLib *SlashingLibRaw) Transact(opts *bind.TransactOpts, method string, params ...interface
````

## File: pkg/bindings/SplitContractMixin/binding.go
````go
// Code generated - DO NOT EDIT.
// This file is a generated binding and any manual changes will be lost.
⋮----
package SplitContractMixin
⋮----
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"
)
⋮----
"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
)
⋮----
// SplitContractMixinMetaData contains all meta data concerning the SplitContractMixin contract.
var SplitContractMixinMetaData = &bind.MetaData{
	ABI: "[{\"type\":\"function\",\"name\":\"viewImplementation\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"}]",
}
⋮----
// SplitContractMixinABI is the input ABI used to generate the binding from.
// Deprecated: Use SplitContractMixinMetaData.ABI instead.
var SplitContractMixinABI = SplitContractMixinMetaData.ABI
⋮----
// SplitContractMixin is an auto generated Go binding around an Ethereum contract.
type SplitContractMixin struct {
	SplitContractMixinCaller     // Read-only binding to the contract
	SplitContractMixinTransactor // Write-only binding to the contract
	SplitContractMixinFilterer   // Log filterer for contract events
}
⋮----
SplitContractMixinCaller     // Read-only binding to the contract
SplitContractMixinTransactor // Write-only binding to the contract
SplitContractMixinFilterer   // Log filterer for contract events
⋮----
// SplitContractMixinCaller is an auto generated read-only Go binding around an Ethereum contract.
type SplitContractMixinCaller struct {
	contract *bind.BoundContract // Generic contract wrapper for the low level calls
}
⋮----
contract *bind.BoundContract // Generic contract wrapper for the low level calls
⋮----
// SplitContractMixinTransactor is an auto generated write-only Go binding around an Ethereum contract.
type SplitContractMixinTransactor struct {
	contract *bind.BoundContract // Generic contract wrapper for the low level calls
}
⋮----
// SplitContractMixinFilterer is an auto generated log filtering Go binding around an Ethereum contract events.
type SplitContractMixinFilterer struct {
	contract *bind.BoundContract // Generic contract wrapper for the low level calls
}
⋮----
// SplitContractMixinSession is an auto generated Go binding around an Ethereum contract,
// with pre-set call and transact options.
type SplitContractMixinSession struct {
	Contract     *SplitContractMixin // 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
}
⋮----
Contract     *SplitContractMixin // 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
⋮----
// SplitContractMixinCallerSession is an auto generated read-only Go binding around an Ethereum contract,
// with pre-set call options.
type SplitContractMixinCallerSession struct {
	Contract *SplitContractMixinCaller // Generic contract caller binding to set the session for
	CallOpts bind.CallOpts             // Call options to use throughout this session
}
⋮----
Contract *SplitContractMixinCaller // Generic contract caller binding to set the session for
CallOpts bind.CallOpts             // Call options to use throughout this session
⋮----
// SplitContractMixinTransactorSession is an auto generated write-only Go binding around an Ethereum contract,
// with pre-set transact options.
type SplitContractMixinTransactorSession struct {
	Contract     *SplitContractMixinTransactor // Generic contract transactor binding to set the session for
	TransactOpts bind.TransactOpts             // Transaction auth options to use throughout this session
}
⋮----
Contract     *SplitContractMixinTransactor // Generic contract transactor binding to set the session for
TransactOpts bind.TransactOpts             // Transaction auth options to use throughout this session
⋮----
// SplitContractMixinRaw is an auto generated low-level Go binding around an Ethereum contract.
type SplitContractMixinRaw struct {
	Contract *SplitContractMixin // Generic contract binding to access the raw methods on
}
⋮----
Contract *SplitContractMixin // Generic contract binding to access the raw methods on
⋮----
// SplitContractMixinCallerRaw is an auto generated low-level read-only Go binding around an Ethereum contract.
type SplitContractMixinCallerRaw struct {
	Contract *SplitContractMixinCaller // Generic read-only contract binding to access the raw methods on
}
⋮----
Contract *SplitContractMixinCaller // Generic read-only contract binding to access the raw methods on
⋮----
// SplitContractMixinTransactorRaw is an auto generated low-level write-only Go binding around an Ethereum contract.
type SplitContractMixinTransactorRaw struct {
	Contract *SplitContractMixinTransactor // Generic write-only contract binding to access the raw methods on
}
⋮----
Contract *SplitContractMixinTransactor // Generic write-only contract binding to access the raw methods on
⋮----
// NewSplitContractMixin creates a new instance of SplitContractMixin, bound to a specific deployed contract.
func NewSplitContractMixin(address common.Address, backend bind.ContractBackend) (*SplitContractMixin, error)
⋮----
// NewSplitContractMixinCaller creates a new read-only instance of SplitContractMixin, bound to a specific deployed contract.
func NewSplitContractMixinCaller(address common.Address, caller bind.ContractCaller) (*SplitContractMixinCaller, error)
⋮----
// NewSplitContractMixinTransactor creates a new write-only instance of SplitContractMixin, bound to a specific deployed contract.
func NewSplitContractMixinTransactor(address common.Address, transactor bind.ContractTransactor) (*SplitContractMixinTransactor, error)
⋮----
// NewSplitContractMixinFilterer creates a new log filterer instance of SplitContractMixin, bound to a specific deployed contract.
func NewSplitContractMixinFilterer(address common.Address, filterer bind.ContractFilterer) (*SplitContractMixinFilterer, error)
⋮----
// bindSplitContractMixin binds a generic wrapper to an already deployed contract.
func bindSplitContractMixin(address common.Address, caller bind.ContractCaller, transactor bind.ContractTransactor, filterer bind.ContractFilterer) (*bind.BoundContract, error)
⋮----
// 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 (_SplitContractMixin *SplitContractMixinRaw) Call(opts *bind.CallOpts, result *[]interface
⋮----
// Transfer initiates a plain transaction to move funds to the contract, calling
// its default method if one is available.
func (_SplitContractMixin *SplitContractMixinRaw) Transfer(opts *bind.TransactOpts) (*types.Transaction, error)
⋮----
// Transact invokes the (paid) contract method with params as input values.
func (_SplitContractMixin *SplitContractMixinRaw) Transact(opts *bind.TransactOpts, method string, params ...interface
⋮----
// ViewImplementation is a free data retrieval call binding the contract method 0x0b156bb6.
//
// Solidity: function viewImplementation() view returns(address)
func (_SplitContractMixin *SplitContractMixinCaller) ViewImplementation(opts *bind.CallOpts) (common.Address, error)
⋮----
var out []interface{}
````

## File: pkg/bindings/StrategyBase/binding.go
````go
// Code generated - DO NOT EDIT.
// This file is a generated binding and any manual changes will be lost.
⋮----
package StrategyBase
⋮----
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"
)
⋮----
"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
)
⋮----
// 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\":\"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.
// Deprecated: Use StrategyBaseMetaData.ABI instead.
var StrategyBaseABI = StrategyBaseMetaData.ABI
⋮----
// StrategyBaseBin is the compiled bytecode used for deploying new contracts.
// Deprecated: Use StrategyBaseMetaData.Bin instead.
var StrategyBaseBin = StrategyBaseMetaData.Bin
⋮----
// DeployStrategyBase deploys a new Ethereum contract, binding an instance of StrategyBase to it.
func DeployStrategyBase(auth *bind.TransactOpts, backend bind.ContractBackend, _strategyManager common.Address, _pauserRegistry common.Address) (common.Address, *types.Transaction, *StrategyBase, error)
⋮----
// StrategyBase is an auto generated Go binding around an Ethereum contract.
type StrategyBase struct {
	StrategyBaseCaller     // Read-only binding to the contract
	StrategyBaseTransactor // Write-only binding to the contract
	StrategyBaseFilterer   // Log filterer for contract events
}
⋮----
StrategyBaseCaller     // Read-only binding to the contract
StrategyBaseTransactor // Write-only binding to the contract
StrategyBaseFilterer   // Log filterer for contract events
⋮----
// StrategyBaseCaller is an auto generated read-only Go binding around an Ethereum contract.
type StrategyBaseCaller struct {
	contract *bind.BoundContract // Generic contract wrapper for the low level calls
}
⋮----
contract *bind.BoundContract // Generic contract wrapper for the low level calls
⋮----
// StrategyBaseTransactor is an auto generated write-only Go binding around an Ethereum contract.
type StrategyBaseTransactor struct {
	contract *bind.BoundContract // Generic contract wrapper for the low level calls
}
⋮----
// StrategyBaseFilterer is an auto generated log filtering Go binding around an Ethereum contract events.
type StrategyBaseFilterer struct {
	contract *bind.BoundContract // Generic contract wrapper for the low level calls
}
⋮----
// StrategyBaseSession is an auto generated Go binding around an Ethereum contract,
// with pre-set call and transact options.
type StrategyBaseSession struct {
	Contract     *StrategyBase     // 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
}
⋮----
Contract     *StrategyBase     // 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
⋮----
// StrategyBaseCallerSession is an auto generated read-only Go binding around an Ethereum contract,
// with pre-set call options.
type StrategyBaseCallerSession struct {
	Contract *StrategyBaseCaller // Generic contract caller binding to set the session for
	CallOpts bind.CallOpts       // Call options to use throughout this session
}
⋮----
Contract *StrategyBaseCaller // Generic contract caller binding to set the session for
CallOpts bind.CallOpts       // Call options to use throughout this session
⋮----
// StrategyBaseTransactorSession is an auto generated write-only Go binding around an Ethereum contract,
// with pre-set transact options.
type StrategyBaseTransactorSession struct {
	Contract     *StrategyBaseTransactor // Generic contract transactor binding to set the session for
	TransactOpts bind.TransactOpts       // Transaction auth options to use throughout this session
}
⋮----
Contract     *StrategyBaseTransactor // Generic contract transactor binding to set the session for
TransactOpts bind.TransactOpts       // Transaction auth options to use throughout this session
⋮----
// StrategyBaseRaw is an auto generated low-level Go binding around an Ethereum contract.
type StrategyBaseRaw struct {
	Contract *StrategyBase // Generic contract binding to access the raw methods on
}
⋮----
Contract *StrategyBase // Generic contract binding to access the raw methods on
⋮----
// StrategyBaseCallerRaw is an auto generated low-level read-only Go binding around an Ethereum contract.
type StrategyBaseCallerRaw struct {
	Contract *StrategyBaseCaller // Generic read-only contract binding to access the raw methods on
}
⋮----
Contract *StrategyBaseCaller // Generic read-only contract binding to access the raw methods on
⋮----
// StrategyBaseTransactorRaw is an auto generated low-level write-only Go binding around an Ethereum contract.
type StrategyBaseTransactorRaw struct {
	Contract *StrategyBaseTransactor // Generic write-only contract binding to access the raw methods on
}
⋮----
Contract *StrategyBaseTransactor // Generic write-only contract binding to access the raw methods on
⋮----
// NewStrategyBase creates a new instance of StrategyBase, bound to a specific deployed contract.
func NewStrategyBase(address common.Address, backend bind.ContractBackend) (*StrategyBase, error)
⋮----
// NewStrategyBaseCaller creates a new read-only instance of StrategyBase, bound to a specific deployed contract.
func NewStrategyBaseCaller(address common.Address, caller bind.ContractCaller) (*StrategyBaseCaller, error)
⋮----
// NewStrategyBaseTransactor creates a new write-only instance of StrategyBase, bound to a specific deployed contract.
func NewStrategyBaseTransactor(address common.Address, transactor bind.ContractTransactor) (*StrategyBaseTransactor, error)
⋮----
// NewStrategyBaseFilterer creates a new log filterer instance of StrategyBase, bound to a specific deployed contract.
func NewStrategyBaseFilterer(address common.Address, filterer bind.ContractFilterer) (*StrategyBaseFilterer, error)
⋮----
// bindStrategyBase binds a generic wrapper to an already deployed contract.
func bindStrategyBase(address common.Address, caller bind.ContractCaller, transactor bind.ContractTransactor, filterer bind.ContractFilterer) (*bind.BoundContract, error)
⋮----
// 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 (_StrategyBase *StrategyBaseRaw) Call(opts *bind.CallOpts, result *[]interface
⋮----
// Transfer initiates a plain transaction to move funds to the contract, calling
// its default method if one is available.
func (_StrategyBase *StrategyBaseRaw) Transfer(opts *bind.TransactOpts) (*types.Transaction, error)
⋮----
// Transact invokes the (paid) contract method with params as input values.
func (_StrategyBase *StrategyBaseRaw) Transact(opts *bind.TransactOpts, method string, params ...interface
⋮----
// Explanation is a free data retrieval call binding the contract method 0xab5921e1.
//
// Solidity: function explanation() pure returns(string)
func (_StrategyBase *StrategyBaseCaller) Explanation(opts *bind.CallOpts) (string, error)
⋮----
var out []interface{}
⋮----
// Paused is a free data retrieval call binding the contract method 0x5ac86ab7.
⋮----
// Solidity: function paused(uint8 index) view returns(bool)
func (_StrategyBase *StrategyBaseCaller) Paused(opts *bind.CallOpts, index uint8) (bool, error)
⋮----
// Paused0 is a free data retrieval call binding the contract method 0x5c975abb.
⋮----
// Solidity: function paused() view returns(uint256)
func (_StrategyBase *StrategyBaseCaller) Paused0(opts *bind.CallOpts) (*big.Int, error)
⋮----
// PauserRegistry is a free data retrieval call binding the contract method 0x886f1195.
⋮----
// Solidity: function pauserRegistry() view returns(address)
func (_StrategyBase *StrategyBaseCaller) PauserRegistry(opts *bind.CallOpts) (common.Address, error)
⋮----
// Shares is a free data retrieval call binding the contract method 0xce7c2ac2.
⋮----
// Solidity: function shares(address user) view returns(uint256)
func (_StrategyBase *StrategyBaseCaller) Shares(opts *bind.CallOpts, user common.Address) (*big.Int, error)
⋮----
// SharesToUnderlying is a free data retrieval call binding the contract method 0xf3e73875.
⋮----
// Solidity: function sharesToUnderlying(uint256 amountShares) view returns(uint256)
func (_StrategyBase *StrategyBaseCaller) SharesToUnderlying(opts *bind.CallOpts, amountShares *big.Int) (*big.Int, error)
⋮----
// SharesToUnderlyingView is a free data retrieval call binding the contract method 0x7a8b2637.
⋮----
// Solidity: function sharesToUnderlyingView(uint256 amountShares) view returns(uint256)
func (_StrategyBase *StrategyBaseCaller) SharesToUnderlyingView(opts *bind.CallOpts, amountShares *big.Int) (*big.Int, error)
⋮----
// StrategyManager is a free data retrieval call binding the contract method 0x39b70e38.
⋮----
// Solidity: function strategyManager() view returns(address)
func (_StrategyBase *StrategyBaseCaller) StrategyManager(opts *bind.CallOpts) (common.Address, error)
⋮----
// TotalShares is a free data retrieval call binding the contract method 0x3a98ef39.
⋮----
// Solidity: function totalShares() view returns(uint256)
func (_StrategyBase *StrategyBaseCaller) TotalShares(opts *bind.CallOpts) (*big.Int, error)
⋮----
// UnderlyingToShares is a free data retrieval call binding the contract method 0x8c871019.
⋮----
// Solidity: function underlyingToShares(uint256 amountUnderlying) view returns(uint256)
func (_StrategyBase *StrategyBaseCaller) UnderlyingToShares(opts *bind.CallOpts, amountUnderlying *big.Int) (*big.Int, error)
⋮----
// UnderlyingToSharesView is a free data retrieval call binding the contract method 0xe3dae51c.
⋮----
// Solidity: function underlyingToSharesView(uint256 amountUnderlying) view returns(uint256)
func (_StrategyBase *StrategyBaseCaller) UnderlyingToSharesView(opts *bind.CallOpts, amountUnderlying *big.Int) (*big.Int, error)
⋮----
// UnderlyingToken is a free data retrieval call binding the contract method 0x2495a599.
⋮----
// Solidity: function underlyingToken() view returns(address)
func (_StrategyBase *StrategyBaseCaller) UnderlyingToken(opts *bind.CallOpts) (common.Address, error)
⋮----
// UserUnderlyingView is a free data retrieval call binding the contract method 0x553ca5f8.
⋮----
// Solidity: function userUnderlyingView(address user) view returns(uint256)
func (_StrategyBase *StrategyBaseCaller) UserUnderlyingView(opts *bind.CallOpts, user common.Address) (*big.Int, error)
⋮----
// 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)
⋮----
// 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)
⋮----
// Deposit is a paid mutator transaction binding the contract method 0x47e7ef24.
⋮----
// Solidity: function deposit(address token, uint256 amount) returns(uint256 newShares)
func (_StrategyBase *StrategyBaseTransactor) Deposit(opts *bind.TransactOpts, token common.Address, amount *big.Int) (*types.Transaction, error)
⋮----
// Initialize is a paid mutator transaction binding the contract method 0xc4d66de8.
⋮----
// Solidity: function initialize(address _underlyingToken) returns()
func (_StrategyBase *StrategyBaseTransactor) Initialize(opts *bind.TransactOpts, _underlyingToken common.Address) (*types.Transaction, error)
⋮----
// Pause is a paid mutator transaction binding the contract method 0x136439dd.
⋮----
// Solidity: function pause(uint256 newPausedStatus) returns()
func (_StrategyBase *StrategyBaseTransactor) Pause(opts *bind.TransactOpts, newPausedStatus *big.Int) (*types.Transaction, error)
⋮----
// PauseAll is a paid mutator transaction binding the contract method 0x595c6a67.
⋮----
// Solidity: function pauseAll() returns()
func (_StrategyBase *StrategyBaseTransactor) PauseAll(opts *bind.TransactOpts) (*types.Transaction, error)
⋮----
// Unpause is a paid mutator transaction binding the contract method 0xfabc1cbc.
⋮----
// Solidity: function unpause(uint256 newPausedStatus) returns()
func (_StrategyBase *StrategyBaseTransactor) Unpause(opts *bind.TransactOpts, newPausedStatus *big.Int) (*types.Transaction, error)
⋮----
// UserUnderlying is a paid mutator transaction binding the contract method 0x8f6a6240.
⋮----
// Solidity: function userUnderlying(address user) returns(uint256)
func (_StrategyBase *StrategyBaseTransactor) UserUnderlying(opts *bind.TransactOpts, user common.Address) (*types.Transaction, error)
⋮----
// Withdraw is a paid mutator transaction binding the contract method 0xd9caed12.
⋮----
// Solidity: function withdraw(address recipient, address token, uint256 amountShares) returns(uint256 amountOut)
func (_StrategyBase *StrategyBaseTransactor) Withdraw(opts *bind.TransactOpts, recipient common.Address, token common.Address, amountShares *big.Int) (*types.Transaction, error)
⋮----
// StrategyBaseExchangeRateEmittedIterator is returned from FilterExchangeRateEmitted and is used to iterate over the raw logs and unpacked data for ExchangeRateEmitted events raised by the StrategyBase contract.
type StrategyBaseExchangeRateEmittedIterator struct {
	Event *StrategyBaseExchangeRateEmitted // 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
}
⋮----
Event *StrategyBaseExchangeRateEmitted // 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 *StrategyBaseExchangeRateEmittedIterator) Next() bool
⋮----
// If the iterator failed, stop iterating
⋮----
// If the iterator completed, deliver directly whatever's available
⋮----
// Iterator still in progress, wait for either a data or an error event
⋮----
// Error returns any retrieval or parsing error occurred during filtering.
func (it *StrategyBaseExchangeRateEmittedIterator) Error() error
⋮----
// Close terminates the iteration process, releasing any pending underlying
// resources.
func (it *StrategyBaseExchangeRateEmittedIterator) Close() error
⋮----
// StrategyBaseExchangeRateEmitted represents a ExchangeRateEmitted event raised by the StrategyBase contract.
type StrategyBaseExchangeRateEmitted struct {
	Rate *big.Int
	Raw  types.Log // Blockchain specific contextual infos
}
⋮----
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 (_StrategyBase *StrategyBaseFilterer) FilterExchangeRateEmitted(opts *bind.FilterOpts) (*StrategyBaseExchangeRateEmittedIterator, error)
⋮----
// WatchExchangeRateEmitted is a free log subscription operation binding the contract event 0xd2494f3479e5da49d386657c292c610b5b01df313d07c62eb0cfa49924a31be8.
⋮----
func (_StrategyBase *StrategyBaseFilterer) WatchExchangeRateEmitted(opts *bind.WatchOpts, sink chan<- *StrategyBaseExchangeRateEmitted) (event.Subscription, error)
⋮----
// New log arrived, parse the event and forward to the user
⋮----
// ParseExchangeRateEmitted is a log parse operation binding the contract event 0xd2494f3479e5da49d386657c292c610b5b01df313d07c62eb0cfa49924a31be8.
⋮----
func (_StrategyBase *StrategyBaseFilterer) ParseExchangeRateEmitted(log types.Log) (*StrategyBaseExchangeRateEmitted, error)
⋮----
// StrategyBaseInitializedIterator is returned from FilterInitialized and is used to iterate over the raw logs and unpacked data for Initialized events raised by the StrategyBase contract.
type StrategyBaseInitializedIterator struct {
	Event *StrategyBaseInitialized // 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
}
⋮----
Event *StrategyBaseInitialized // Event containing the contract specifics and raw log
⋮----
// StrategyBaseInitialized represents a Initialized event raised by the StrategyBase contract.
type StrategyBaseInitialized struct {
	Version uint8
	Raw     types.Log // Blockchain specific contextual infos
}
⋮----
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 (_StrategyBase *StrategyBaseFilterer) FilterInitialized(opts *bind.FilterOpts) (*StrategyBaseInitializedIterator, error)
⋮----
// WatchInitialized is a free log subscription operation binding the contract event 0x7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb3847402498.
⋮----
func (_StrategyBase *StrategyBaseFilterer) WatchInitialized(opts *bind.WatchOpts, sink chan<- *StrategyBaseInitialized) (event.Subscription, error)
⋮----
// ParseInitialized is a log parse operation binding the contract event 0x7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb3847402498.
⋮----
func (_StrategyBase *StrategyBaseFilterer) ParseInitialized(log types.Log) (*StrategyBaseInitialized, error)
⋮----
// StrategyBasePausedIterator is returned from FilterPaused and is used to iterate over the raw logs and unpacked data for Paused events raised by the StrategyBase contract.
type StrategyBasePausedIterator struct {
	Event *StrategyBasePaused // 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
}
⋮----
Event *StrategyBasePaused // Event containing the contract specifics and raw log
⋮----
// StrategyBasePaused represents a Paused event raised by the StrategyBase contract.
type StrategyBasePaused struct {
	Account         common.Address
	NewPausedStatus *big.Int
	Raw             types.Log // Blockchain specific contextual infos
}
⋮----
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 (_StrategyBase *StrategyBaseFilterer) FilterPaused(opts *bind.FilterOpts, account []common.Address) (*StrategyBasePausedIterator, error)
⋮----
var accountRule []interface{}
⋮----
// WatchPaused is a free log subscription operation binding the contract event 0xab40a374bc51de372200a8bc981af8c9ecdc08dfdaef0bb6e09f88f3c616ef3d.
⋮----
func (_StrategyBase *StrategyBaseFilterer) WatchPaused(opts *bind.WatchOpts, sink chan<- *StrategyBasePaused, account []common.Address) (event.Subscription, error)
⋮----
// ParsePaused is a log parse operation binding the contract event 0xab40a374bc51de372200a8bc981af8c9ecdc08dfdaef0bb6e09f88f3c616ef3d.
⋮----
func (_StrategyBase *StrategyBaseFilterer) ParsePaused(log types.Log) (*StrategyBasePaused, error)
⋮----
// StrategyBaseStrategyTokenSetIterator is returned from FilterStrategyTokenSet and is used to iterate over the raw logs and unpacked data for StrategyTokenSet events raised by the StrategyBase contract.
type StrategyBaseStrategyTokenSetIterator struct {
	Event *StrategyBaseStrategyTokenSet // 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
}
⋮----
Event *StrategyBaseStrategyTokenSet // Event containing the contract specifics and raw log
⋮----
// StrategyBaseStrategyTokenSet represents a StrategyTokenSet event raised by the StrategyBase contract.
type StrategyBaseStrategyTokenSet struct {
	Token    common.Address
	Decimals uint8
	Raw      types.Log // Blockchain specific contextual infos
}
⋮----
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 (_StrategyBase *StrategyBaseFilterer) FilterStrategyTokenSet(opts *bind.FilterOpts) (*StrategyBaseStrategyTokenSetIterator, error)
⋮----
// WatchStrategyTokenSet is a free log subscription operation binding the contract event 0x1c540707b00eb5427b6b774fc799d756516a54aee108b64b327acc55af557507.
⋮----
func (_StrategyBase *StrategyBaseFilterer) WatchStrategyTokenSet(opts *bind.WatchOpts, sink chan<- *StrategyBaseStrategyTokenSet) (event.Subscription, error)
⋮----
// ParseStrategyTokenSet is a log parse operation binding the contract event 0x1c540707b00eb5427b6b774fc799d756516a54aee108b64b327acc55af557507.
⋮----
func (_StrategyBase *StrategyBaseFilterer) ParseStrategyTokenSet(log types.Log) (*StrategyBaseStrategyTokenSet, error)
⋮----
// StrategyBaseUnpausedIterator is returned from FilterUnpaused and is used to iterate over the raw logs and unpacked data for Unpaused events raised by the StrategyBase contract.
type StrategyBaseUnpausedIterator struct {
	Event *StrategyBaseUnpaused // 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
}
⋮----
Event *StrategyBaseUnpaused // Event containing the contract specifics and raw log
⋮----
// StrategyBaseUnpaused represents a Unpaused event raised by the StrategyBase contract.
type StrategyBaseUnpaused 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 (_StrategyBase *StrategyBaseFilterer) FilterUnpaused(opts *bind.FilterOpts, account []common.Address) (*StrategyBaseUnpausedIterator, error)
⋮----
// WatchUnpaused is a free log subscription operation binding the contract event 0x3582d1828e26bf56bd801502bc021ac0bc8afb57c826e4986b45593c8fad389c.
⋮----
func (_StrategyBase *StrategyBaseFilterer) WatchUnpaused(opts *bind.WatchOpts, sink chan<- *StrategyBaseUnpaused, account []common.Address) (event.Subscription, error)
⋮----
// ParseUnpaused is a log parse operation binding the contract event 0x3582d1828e26bf56bd801502bc021ac0bc8afb57c826e4986b45593c8fad389c.
⋮----
func (_StrategyBase *StrategyBaseFilterer) ParseUnpaused(log types.Log) (*StrategyBaseUnpaused, error)
````

## File: pkg/bindings/StrategyBaseTVLLimits/binding.go
````go
// Code generated - DO NOT EDIT.
// This file is a generated binding and any manual changes will be lost.
⋮----
package StrategyBaseTVLLimits
⋮----
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"
)
⋮----
"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
)
⋮----
// 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\":\"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.
// Deprecated: Use StrategyBaseTVLLimitsMetaData.ABI instead.
var StrategyBaseTVLLimitsABI = StrategyBaseTVLLimitsMetaData.ABI
⋮----
// StrategyBaseTVLLimitsBin is the compiled bytecode used for deploying new contracts.
// Deprecated: Use StrategyBaseTVLLimitsMetaData.Bin instead.
var StrategyBaseTVLLimitsBin = StrategyBaseTVLLimitsMetaData.Bin
⋮----
// DeployStrategyBaseTVLLimits deploys a new Ethereum contract, binding an instance of StrategyBaseTVLLimits to it.
func DeployStrategyBaseTVLLimits(auth *bind.TransactOpts, backend bind.ContractBackend, _strategyManager common.Address, _pauserRegistry common.Address) (common.Address, *types.Transaction, *StrategyBaseTVLLimits, error)
⋮----
// StrategyBaseTVLLimits is an auto generated Go binding around an Ethereum contract.
type StrategyBaseTVLLimits struct {
	StrategyBaseTVLLimitsCaller     // Read-only binding to the contract
	StrategyBaseTVLLimitsTransactor // Write-only binding to the contract
	StrategyBaseTVLLimitsFilterer   // Log filterer for contract events
}
⋮----
StrategyBaseTVLLimitsCaller     // Read-only binding to the contract
StrategyBaseTVLLimitsTransactor // Write-only binding to the contract
StrategyBaseTVLLimitsFilterer   // Log filterer for contract events
⋮----
// StrategyBaseTVLLimitsCaller is an auto generated read-only Go binding around an Ethereum contract.
type StrategyBaseTVLLimitsCaller struct {
	contract *bind.BoundContract // Generic contract wrapper for the low level calls
}
⋮----
contract *bind.BoundContract // Generic contract wrapper for the low level calls
⋮----
// StrategyBaseTVLLimitsTransactor is an auto generated write-only Go binding around an Ethereum contract.
type StrategyBaseTVLLimitsTransactor struct {
	contract *bind.BoundContract // Generic contract wrapper for the low level calls
}
⋮----
// StrategyBaseTVLLimitsFilterer is an auto generated log filtering Go binding around an Ethereum contract events.
type StrategyBaseTVLLimitsFilterer struct {
	contract *bind.BoundContract // Generic contract wrapper for the low level calls
}
⋮----
// StrategyBaseTVLLimitsSession is an auto generated Go binding around an Ethereum contract,
// with pre-set call and transact options.
type StrategyBaseTVLLimitsSession struct {
	Contract     *StrategyBaseTVLLimits // 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
}
⋮----
Contract     *StrategyBaseTVLLimits // 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
⋮----
// StrategyBaseTVLLimitsCallerSession is an auto generated read-only Go binding around an Ethereum contract,
// with pre-set call options.
type StrategyBaseTVLLimitsCallerSession struct {
	Contract *StrategyBaseTVLLimitsCaller // Generic contract caller binding to set the session for
	CallOpts bind.CallOpts                // Call options to use throughout this session
}
⋮----
Contract *StrategyBaseTVLLimitsCaller // Generic contract caller binding to set the session for
CallOpts bind.CallOpts                // Call options to use throughout this session
⋮----
// StrategyBaseTVLLimitsTransactorSession is an auto generated write-only Go binding around an Ethereum contract,
// with pre-set transact options.
type StrategyBaseTVLLimitsTransactorSession struct {
	Contract     *StrategyBaseTVLLimitsTransactor // Generic contract transactor binding to set the session for
	TransactOpts bind.TransactOpts                // Transaction auth options to use throughout this session
}
⋮----
Contract     *StrategyBaseTVLLimitsTransactor // Generic contract transactor binding to set the session for
TransactOpts bind.TransactOpts                // Transaction auth options to use throughout this session
⋮----
// StrategyBaseTVLLimitsRaw is an auto generated low-level Go binding around an Ethereum contract.
type StrategyBaseTVLLimitsRaw struct {
	Contract *StrategyBaseTVLLimits // Generic contract binding to access the raw methods on
}
⋮----
Contract *StrategyBaseTVLLimits // Generic contract binding to access the raw methods on
⋮----
// StrategyBaseTVLLimitsCallerRaw is an auto generated low-level read-only Go binding around an Ethereum contract.
type StrategyBaseTVLLimitsCallerRaw struct {
	Contract *StrategyBaseTVLLimitsCaller // Generic read-only contract binding to access the raw methods on
}
⋮----
Contract *StrategyBaseTVLLimitsCaller // Generic read-only contract binding to access the raw methods on
⋮----
// StrategyBaseTVLLimitsTransactorRaw is an auto generated low-level write-only Go binding around an Ethereum contract.
type StrategyBaseTVLLimitsTransactorRaw struct {
	Contract *StrategyBaseTVLLimitsTransactor // Generic write-only contract binding to access the raw methods on
}
⋮----
Contract *StrategyBaseTVLLimitsTransactor // Generic write-only contract binding to access the raw methods on
⋮----
// NewStrategyBaseTVLLimits creates a new instance of StrategyBaseTVLLimits, bound to a specific deployed contract.
func NewStrategyBaseTVLLimits(address common.Address, backend bind.ContractBackend) (*StrategyBaseTVLLimits, error)
⋮----
// NewStrategyBaseTVLLimitsCaller creates a new read-only instance of StrategyBaseTVLLimits, bound to a specific deployed contract.
func NewStrategyBaseTVLLimitsCaller(address common.Address, caller bind.ContractCaller) (*StrategyBaseTVLLimitsCaller, error)
⋮----
// NewStrategyBaseTVLLimitsTransactor creates a new write-only instance of StrategyBaseTVLLimits, bound to a specific deployed contract.
func NewStrategyBaseTVLLimitsTransactor(address common.Address, transactor bind.ContractTransactor) (*StrategyBaseTVLLimitsTransactor, error)
⋮----
// NewStrategyBaseTVLLimitsFilterer creates a new log filterer instance of StrategyBaseTVLLimits, bound to a specific deployed contract.
func NewStrategyBaseTVLLimitsFilterer(address common.Address, filterer bind.ContractFilterer) (*StrategyBaseTVLLimitsFilterer, error)
⋮----
// bindStrategyBaseTVLLimits binds a generic wrapper to an already deployed contract.
func bindStrategyBaseTVLLimits(address common.Address, caller bind.ContractCaller, transactor bind.ContractTransactor, filterer bind.ContractFilterer) (*bind.BoundContract, error)
⋮----
// 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 (_StrategyBaseTVLLimits *StrategyBaseTVLLimitsRaw) Call(opts *bind.CallOpts, result *[]interface
⋮----
// Transfer initiates a plain transaction to move funds to the contract, calling
// its default method if one is available.
func (_StrategyBaseTVLLimits *StrategyBaseTVLLimitsRaw) Transfer(opts *bind.TransactOpts) (*types.Transaction, error)
⋮----
// Transact invokes the (paid) contract method with params as input values.
func (_StrategyBaseTVLLimits *StrategyBaseTVLLimitsRaw) Transact(opts *bind.TransactOpts, method string, params ...interface
⋮----
// Explanation is a free data retrieval call binding the contract method 0xab5921e1.
//
// Solidity: function explanation() pure returns(string)
func (_StrategyBaseTVLLimits *StrategyBaseTVLLimitsCaller) Explanation(opts *bind.CallOpts) (string, error)
⋮----
var out []interface{}
⋮----
// GetTVLLimits is a free data retrieval call binding the contract method 0xdf6fadc1.
⋮----
// Solidity: function getTVLLimits() view returns(uint256, uint256)
func (_StrategyBaseTVLLimits *StrategyBaseTVLLimitsCaller) GetTVLLimits(opts *bind.CallOpts) (*big.Int, *big.Int, error)
⋮----
// MaxPerDeposit is a free data retrieval call binding the contract method 0x43fe08b0.
⋮----
// Solidity: function maxPerDeposit() view returns(uint256)
func (_StrategyBaseTVLLimits *StrategyBaseTVLLimitsCaller) MaxPerDeposit(opts *bind.CallOpts) (*big.Int, error)
⋮----
// MaxTotalDeposits is a free data retrieval call binding the contract method 0x61b01b5d.
⋮----
// Solidity: function maxTotalDeposits() view returns(uint256)
func (_StrategyBaseTVLLimits *StrategyBaseTVLLimitsCaller) MaxTotalDeposits(opts *bind.CallOpts) (*big.Int, error)
⋮----
// Paused is a free data retrieval call binding the contract method 0x5ac86ab7.
⋮----
// Solidity: function paused(uint8 index) view returns(bool)
func (_StrategyBaseTVLLimits *StrategyBaseTVLLimitsCaller) Paused(opts *bind.CallOpts, index uint8) (bool, error)
⋮----
// Paused0 is a free data retrieval call binding the contract method 0x5c975abb.
⋮----
// Solidity: function paused() view returns(uint256)
func (_StrategyBaseTVLLimits *StrategyBaseTVLLimitsCaller) Paused0(opts *bind.CallOpts) (*big.Int, error)
⋮----
// PauserRegistry is a free data retrieval call binding the contract method 0x886f1195.
⋮----
// Solidity: function pauserRegistry() view returns(address)
func (_StrategyBaseTVLLimits *StrategyBaseTVLLimitsCaller) PauserRegistry(opts *bind.CallOpts) (common.Address, error)
⋮----
// Shares is a free data retrieval call binding the contract method 0xce7c2ac2.
⋮----
// Solidity: function shares(address user) view returns(uint256)
func (_StrategyBaseTVLLimits *StrategyBaseTVLLimitsCaller) Shares(opts *bind.CallOpts, user common.Address) (*big.Int, error)
⋮----
// SharesToUnderlying is a free data retrieval call binding the contract method 0xf3e73875.
⋮----
// Solidity: function sharesToUnderlying(uint256 amountShares) view returns(uint256)
func (_StrategyBaseTVLLimits *StrategyBaseTVLLimitsCaller) SharesToUnderlying(opts *bind.CallOpts, amountShares *big.Int) (*big.Int, error)
⋮----
// SharesToUnderlyingView is a free data retrieval call binding the contract method 0x7a8b2637.
⋮----
// Solidity: function sharesToUnderlyingView(uint256 amountShares) view returns(uint256)
func (_StrategyBaseTVLLimits *StrategyBaseTVLLimitsCaller) SharesToUnderlyingView(opts *bind.CallOpts, amountShares *big.Int) (*big.Int, error)
⋮----
// StrategyManager is a free data retrieval call binding the contract method 0x39b70e38.
⋮----
// Solidity: function strategyManager() view returns(address)
func (_StrategyBaseTVLLimits *StrategyBaseTVLLimitsCaller) StrategyManager(opts *bind.CallOpts) (common.Address, error)
⋮----
// TotalShares is a free data retrieval call binding the contract method 0x3a98ef39.
⋮----
// Solidity: function totalShares() view returns(uint256)
func (_StrategyBaseTVLLimits *StrategyBaseTVLLimitsCaller) TotalShares(opts *bind.CallOpts) (*big.Int, error)
⋮----
// UnderlyingToShares is a free data retrieval call binding the contract method 0x8c871019.
⋮----
// Solidity: function underlyingToShares(uint256 amountUnderlying) view returns(uint256)
func (_StrategyBaseTVLLimits *StrategyBaseTVLLimitsCaller) UnderlyingToShares(opts *bind.CallOpts, amountUnderlying *big.Int) (*big.Int, error)
⋮----
// UnderlyingToSharesView is a free data retrieval call binding the contract method 0xe3dae51c.
⋮----
// Solidity: function underlyingToSharesView(uint256 amountUnderlying) view returns(uint256)
func (_StrategyBaseTVLLimits *StrategyBaseTVLLimitsCaller) UnderlyingToSharesView(opts *bind.CallOpts, amountUnderlying *big.Int) (*big.Int, error)
⋮----
// UnderlyingToken is a free data retrieval call binding the contract method 0x2495a599.
⋮----
// Solidity: function underlyingToken() view returns(address)
func (_StrategyBaseTVLLimits *StrategyBaseTVLLimitsCaller) UnderlyingToken(opts *bind.CallOpts) (common.Address, error)
⋮----
// UserUnderlyingView is a free data retrieval call binding the contract method 0x553ca5f8.
⋮----
// Solidity: function userUnderlyingView(address user) view returns(uint256)
func (_StrategyBaseTVLLimits *StrategyBaseTVLLimitsCaller) UserUnderlyingView(opts *bind.CallOpts, user common.Address) (*big.Int, error)
⋮----
// 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)
⋮----
// 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)
⋮----
// Deposit is a paid mutator transaction binding the contract method 0x47e7ef24.
⋮----
// Solidity: function deposit(address token, uint256 amount) returns(uint256 newShares)
func (_StrategyBaseTVLLimits *StrategyBaseTVLLimitsTransactor) Deposit(opts *bind.TransactOpts, token common.Address, amount *big.Int) (*types.Transaction, error)
⋮----
// Initialize is a paid mutator transaction binding the contract method 0xa6ab36f2.
⋮----
// Solidity: function initialize(uint256 _maxPerDeposit, uint256 _maxTotalDeposits, address _underlyingToken) returns()
func (_StrategyBaseTVLLimits *StrategyBaseTVLLimitsTransactor) Initialize(opts *bind.TransactOpts, _maxPerDeposit *big.Int, _maxTotalDeposits *big.Int, _underlyingToken common.Address) (*types.Transaction, error)
⋮----
// Initialize0 is a paid mutator transaction binding the contract method 0xc4d66de8.
⋮----
// Solidity: function initialize(address _underlyingToken) returns()
func (_StrategyBaseTVLLimits *StrategyBaseTVLLimitsTransactor) Initialize0(opts *bind.TransactOpts, _underlyingToken common.Address) (*types.Transaction, error)
⋮----
// Pause is a paid mutator transaction binding the contract method 0x136439dd.
⋮----
// Solidity: function pause(uint256 newPausedStatus) returns()
func (_StrategyBaseTVLLimits *StrategyBaseTVLLimitsTransactor) Pause(opts *bind.TransactOpts, newPausedStatus *big.Int) (*types.Transaction, error)
⋮----
// PauseAll is a paid mutator transaction binding the contract method 0x595c6a67.
⋮----
// Solidity: function pauseAll() returns()
func (_StrategyBaseTVLLimits *StrategyBaseTVLLimitsTransactor) PauseAll(opts *bind.TransactOpts) (*types.Transaction, error)
⋮----
// SetTVLLimits is a paid mutator transaction binding the contract method 0x11c70c9d.
⋮----
// Solidity: function setTVLLimits(uint256 newMaxPerDeposit, uint256 newMaxTotalDeposits) returns()
func (_StrategyBaseTVLLimits *StrategyBaseTVLLimitsTransactor) SetTVLLimits(opts *bind.TransactOpts, newMaxPerDeposit *big.Int, newMaxTotalDeposits *big.Int) (*types.Transaction, error)
⋮----
// Unpause is a paid mutator transaction binding the contract method 0xfabc1cbc.
⋮----
// Solidity: function unpause(uint256 newPausedStatus) returns()
func (_StrategyBaseTVLLimits *StrategyBaseTVLLimitsTransactor) Unpause(opts *bind.TransactOpts, newPausedStatus *big.Int) (*types.Transaction, error)
⋮----
// UserUnderlying is a paid mutator transaction binding the contract method 0x8f6a6240.
⋮----
// Solidity: function userUnderlying(address user) returns(uint256)
func (_StrategyBaseTVLLimits *StrategyBaseTVLLimitsTransactor) UserUnderlying(opts *bind.TransactOpts, user common.Address) (*types.Transaction, error)
⋮----
// Withdraw is a paid mutator transaction binding the contract method 0xd9caed12.
⋮----
// Solidity: function withdraw(address recipient, address token, uint256 amountShares) returns(uint256 amountOut)
func (_StrategyBaseTVLLimits *StrategyBaseTVLLimitsTransactor) Withdraw(opts *bind.TransactOpts, recipient common.Address, token common.Address, amountShares *big.Int) (*types.Transaction, error)
⋮----
// StrategyBaseTVLLimitsExchangeRateEmittedIterator is returned from FilterExchangeRateEmitted and is used to iterate over the raw logs and unpacked data for ExchangeRateEmitted events raised by the StrategyBaseTVLLimits contract.
type StrategyBaseTVLLimitsExchangeRateEmittedIterator struct {
	Event *StrategyBaseTVLLimitsExchangeRateEmitted // 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
}
⋮----
Event *StrategyBaseTVLLimitsExchangeRateEmitted // 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 *StrategyBaseTVLLimitsExchangeRateEmittedIterator) Next() bool
⋮----
// If the iterator failed, stop iterating
⋮----
// If the iterator completed, deliver directly whatever's available
⋮----
// Iterator still in progress, wait for either a data or an error event
⋮----
// Error returns any retrieval or parsing error occurred during filtering.
func (it *StrategyBaseTVLLimitsExchangeRateEmittedIterator) Error() error
⋮----
// Close terminates the iteration process, releasing any pending underlying
// resources.
func (it *StrategyBaseTVLLimitsExchangeRateEmittedIterator) Close() error
⋮----
// StrategyBaseTVLLimitsExchangeRateEmitted represents a ExchangeRateEmitted event raised by the StrategyBaseTVLLimits contract.
type StrategyBaseTVLLimitsExchangeRateEmitted struct {
	Rate *big.Int
	Raw  types.Log // Blockchain specific contextual infos
}
⋮----
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 (_StrategyBaseTVLLimits *StrategyBaseTVLLimitsFilterer) FilterExchangeRateEmitted(opts *bind.FilterOpts) (*StrategyBaseTVLLimitsExchangeRateEmittedIterator, error)
⋮----
// WatchExchangeRateEmitted is a free log subscription operation binding the contract event 0xd2494f3479e5da49d386657c292c610b5b01df313d07c62eb0cfa49924a31be8.
⋮----
func (_StrategyBaseTVLLimits *StrategyBaseTVLLimitsFilterer) WatchExchangeRateEmitted(opts *bind.WatchOpts, sink chan<- *StrategyBaseTVLLimitsExchangeRateEmitted) (event.Subscription, error)
⋮----
// New log arrived, parse the event and forward to the user
⋮----
// ParseExchangeRateEmitted is a log parse operation binding the contract event 0xd2494f3479e5da49d386657c292c610b5b01df313d07c62eb0cfa49924a31be8.
⋮----
func (_StrategyBaseTVLLimits *StrategyBaseTVLLimitsFilterer) ParseExchangeRateEmitted(log types.Log) (*StrategyBaseTVLLimitsExchangeRateEmitted, error)
⋮----
// StrategyBaseTVLLimitsInitializedIterator is returned from FilterInitialized and is used to iterate over the raw logs and unpacked data for Initialized events raised by the StrategyBaseTVLLimits contract.
type StrategyBaseTVLLimitsInitializedIterator struct {
	Event *StrategyBaseTVLLimitsInitialized // 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
}
⋮----
Event *StrategyBaseTVLLimitsInitialized // Event containing the contract specifics and raw log
⋮----
// StrategyBaseTVLLimitsInitialized represents a Initialized event raised by the StrategyBaseTVLLimits contract.
type StrategyBaseTVLLimitsInitialized struct {
	Version uint8
	Raw     types.Log // Blockchain specific contextual infos
}
⋮----
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 (_StrategyBaseTVLLimits *StrategyBaseTVLLimitsFilterer) FilterInitialized(opts *bind.FilterOpts) (*StrategyBaseTVLLimitsInitializedIterator, error)
⋮----
// WatchInitialized is a free log subscription operation binding the contract event 0x7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb3847402498.
⋮----
func (_StrategyBaseTVLLimits *StrategyBaseTVLLimitsFilterer) WatchInitialized(opts *bind.WatchOpts, sink chan<- *StrategyBaseTVLLimitsInitialized) (event.Subscription, error)
⋮----
// ParseInitialized is a log parse operation binding the contract event 0x7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb3847402498.
⋮----
func (_StrategyBaseTVLLimits *StrategyBaseTVLLimitsFilterer) ParseInitialized(log types.Log) (*StrategyBaseTVLLimitsInitialized, error)
⋮----
// StrategyBaseTVLLimitsMaxPerDepositUpdatedIterator is returned from FilterMaxPerDepositUpdated and is used to iterate over the raw logs and unpacked data for MaxPerDepositUpdated events raised by the StrategyBaseTVLLimits contract.
type StrategyBaseTVLLimitsMaxPerDepositUpdatedIterator struct {
	Event *StrategyBaseTVLLimitsMaxPerDepositUpdated // 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
}
⋮----
Event *StrategyBaseTVLLimitsMaxPerDepositUpdated // Event containing the contract specifics and raw log
⋮----
// StrategyBaseTVLLimitsMaxPerDepositUpdated represents a MaxPerDepositUpdated event raised by the StrategyBaseTVLLimits contract.
type StrategyBaseTVLLimitsMaxPerDepositUpdated struct {
	PreviousValue *big.Int
	NewValue      *big.Int
	Raw           types.Log // Blockchain specific contextual infos
}
⋮----
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 (_StrategyBaseTVLLimits *StrategyBaseTVLLimitsFilterer) FilterMaxPerDepositUpdated(opts *bind.FilterOpts) (*StrategyBaseTVLLimitsMaxPerDepositUpdatedIterator, error)
⋮----
// WatchMaxPerDepositUpdated is a free log subscription operation binding the contract event 0xf97ed4e083acac67830025ecbc756d8fe847cdbdca4cee3fe1e128e98b54ecb5.
⋮----
func (_StrategyBaseTVLLimits *StrategyBaseTVLLimitsFilterer) WatchMaxPerDepositUpdated(opts *bind.WatchOpts, sink chan<- *StrategyBaseTVLLimitsMaxPerDepositUpdated) (event.Subscription, error)
⋮----
// ParseMaxPerDepositUpdated is a log parse operation binding the contract event 0xf97ed4e083acac67830025ecbc756d8fe847cdbdca4cee3fe1e128e98b54ecb5.
⋮----
func (_StrategyBaseTVLLimits *StrategyBaseTVLLimitsFilterer) ParseMaxPerDepositUpdated(log types.Log) (*StrategyBaseTVLLimitsMaxPerDepositUpdated, error)
⋮----
// StrategyBaseTVLLimitsMaxTotalDepositsUpdatedIterator is returned from FilterMaxTotalDepositsUpdated and is used to iterate over the raw logs and unpacked data for MaxTotalDepositsUpdated events raised by the StrategyBaseTVLLimits contract.
type StrategyBaseTVLLimitsMaxTotalDepositsUpdatedIterator struct {
	Event *StrategyBaseTVLLimitsMaxTotalDepositsUpdated // 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
}
⋮----
Event *StrategyBaseTVLLimitsMaxTotalDepositsUpdated // Event containing the contract specifics and raw log
⋮----
// StrategyBaseTVLLimitsMaxTotalDepositsUpdated represents a MaxTotalDepositsUpdated event raised by the StrategyBaseTVLLimits contract.
type StrategyBaseTVLLimitsMaxTotalDepositsUpdated 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 (_StrategyBaseTVLLimits *StrategyBaseTVLLimitsFilterer) FilterMaxTotalDepositsUpdated(opts *bind.FilterOpts) (*StrategyBaseTVLLimitsMaxTotalDepositsUpdatedIterator, error)
⋮----
// WatchMaxTotalDepositsUpdated is a free log subscription operation binding the contract event 0x6ab181e0440bfbf4bacdf2e99674735ce6638005490688c5f994f5399353e452.
⋮----
func (_StrategyBaseTVLLimits *StrategyBaseTVLLimitsFilterer) WatchMaxTotalDepositsUpdated(opts *bind.WatchOpts, sink chan<- *StrategyBaseTVLLimitsMaxTotalDepositsUpdated) (event.Subscription, error)
⋮----
// ParseMaxTotalDepositsUpdated is a log parse operation binding the contract event 0x6ab181e0440bfbf4bacdf2e99674735ce6638005490688c5f994f5399353e452.
⋮----
func (_StrategyBaseTVLLimits *StrategyBaseTVLLimitsFilterer) ParseMaxTotalDepositsUpdated(log types.Log) (*StrategyBaseTVLLimitsMaxTotalDepositsUpdated, error)
⋮----
// StrategyBaseTVLLimitsPausedIterator is returned from FilterPaused and is used to iterate over the raw logs and unpacked data for Paused events raised by the StrategyBaseTVLLimits contract.
type StrategyBaseTVLLimitsPausedIterator struct {
	Event *StrategyBaseTVLLimitsPaused // 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
}
⋮----
Event *StrategyBaseTVLLimitsPaused // Event containing the contract specifics and raw log
⋮----
// StrategyBaseTVLLimitsPaused represents a Paused event raised by the StrategyBaseTVLLimits contract.
type StrategyBaseTVLLimitsPaused struct {
	Account         common.Address
	NewPausedStatus *big.Int
	Raw             types.Log // Blockchain specific contextual infos
}
⋮----
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 (_StrategyBaseTVLLimits *StrategyBaseTVLLimitsFilterer) FilterPaused(opts *bind.FilterOpts, account []common.Address) (*StrategyBaseTVLLimitsPausedIterator, error)
⋮----
var accountRule []interface{}
⋮----
// WatchPaused is a free log subscription operation binding the contract event 0xab40a374bc51de372200a8bc981af8c9ecdc08dfdaef0bb6e09f88f3c616ef3d.
⋮----
func (_StrategyBaseTVLLimits *StrategyBaseTVLLimitsFilterer) WatchPaused(opts *bind.WatchOpts, sink chan<- *StrategyBaseTVLLimitsPaused, account []common.Address) (event.Subscription, error)
⋮----
// ParsePaused is a log parse operation binding the contract event 0xab40a374bc51de372200a8bc981af8c9ecdc08dfdaef0bb6e09f88f3c616ef3d.
⋮----
func (_StrategyBaseTVLLimits *StrategyBaseTVLLimitsFilterer) ParsePaused(log types.Log) (*StrategyBaseTVLLimitsPaused, error)
⋮----
// StrategyBaseTVLLimitsStrategyTokenSetIterator is returned from FilterStrategyTokenSet and is used to iterate over the raw logs and unpacked data for StrategyTokenSet events raised by the StrategyBaseTVLLimits contract.
type StrategyBaseTVLLimitsStrategyTokenSetIterator struct {
	Event *StrategyBaseTVLLimitsStrategyTokenSet // 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
}
⋮----
Event *StrategyBaseTVLLimitsStrategyTokenSet // Event containing the contract specifics and raw log
⋮----
// StrategyBaseTVLLimitsStrategyTokenSet represents a StrategyTokenSet event raised by the StrategyBaseTVLLimits contract.
type StrategyBaseTVLLimitsStrategyTokenSet struct {
	Token    common.Address
	Decimals uint8
	Raw      types.Log // Blockchain specific contextual infos
}
⋮----
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 (_StrategyBaseTVLLimits *StrategyBaseTVLLimitsFilterer) FilterStrategyTokenSet(opts *bind.FilterOpts) (*StrategyBaseTVLLimitsStrategyTokenSetIterator, error)
⋮----
// WatchStrategyTokenSet is a free log subscription operation binding the contract event 0x1c540707b00eb5427b6b774fc799d756516a54aee108b64b327acc55af557507.
⋮----
func (_StrategyBaseTVLLimits *StrategyBaseTVLLimitsFilterer) WatchStrategyTokenSet(opts *bind.WatchOpts, sink chan<- *StrategyBaseTVLLimitsStrategyTokenSet) (event.Subscription, error)
⋮----
// ParseStrategyTokenSet is a log parse operation binding the contract event 0x1c540707b00eb5427b6b774fc799d756516a54aee108b64b327acc55af557507.
⋮----
func (_StrategyBaseTVLLimits *StrategyBaseTVLLimitsFilterer) ParseStrategyTokenSet(log types.Log) (*StrategyBaseTVLLimitsStrategyTokenSet, error)
⋮----
// StrategyBaseTVLLimitsUnpausedIterator is returned from FilterUnpaused and is used to iterate over the raw logs and unpacked data for Unpaused events raised by the StrategyBaseTVLLimits contract.
type StrategyBaseTVLLimitsUnpausedIterator struct {
	Event *StrategyBaseTVLLimitsUnpaused // 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
}
⋮----
Event *StrategyBaseTVLLimitsUnpaused // Event containing the contract specifics and raw log
⋮----
// StrategyBaseTVLLimitsUnpaused represents a Unpaused event raised by the StrategyBaseTVLLimits contract.
type StrategyBaseTVLLimitsUnpaused 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 (_StrategyBaseTVLLimits *StrategyBaseTVLLimitsFilterer) FilterUnpaused(opts *bind.FilterOpts, account []common.Address) (*StrategyBaseTVLLimitsUnpausedIterator, error)
⋮----
// WatchUnpaused is a free log subscription operation binding the contract event 0x3582d1828e26bf56bd801502bc021ac0bc8afb57c826e4986b45593c8fad389c.
⋮----
func (_StrategyBaseTVLLimits *StrategyBaseTVLLimitsFilterer) WatchUnpaused(opts *bind.WatchOpts, sink chan<- *StrategyBaseTVLLimitsUnpaused, account []common.Address) (event.Subscription, error)
⋮----
// ParseUnpaused is a log parse operation binding the contract event 0x3582d1828e26bf56bd801502bc021ac0bc8afb57c826e4986b45593c8fad389c.
⋮----
func (_StrategyBaseTVLLimits *StrategyBaseTVLLimitsFilterer) ParseUnpaused(log types.Log) (*StrategyBaseTVLLimitsUnpaused, error)
````

## File: pkg/bindings/StrategyFactory/binding.go
````go
// Code generated - DO NOT EDIT.
// This file is a generated binding and any manual changes will be lost.
⋮----
package StrategyFactory
⋮----
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"
)
⋮----
"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
}
⋮----
// 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\"},{\"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.
// Deprecated: Use StrategyFactoryMetaData.ABI instead.
var StrategyFactoryABI = StrategyFactoryMetaData.ABI
⋮----
// StrategyFactoryBin is the compiled bytecode used for deploying new contracts.
// Deprecated: Use StrategyFactoryMetaData.Bin instead.
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, _strategyBeacon common.Address, _durationVaultBeacon common.Address) (common.Address, *types.Transaction, *StrategyFactory, error)
⋮----
// StrategyFactory is an auto generated Go binding around an Ethereum contract.
type StrategyFactory struct {
	StrategyFactoryCaller     // Read-only binding to the contract
	StrategyFactoryTransactor // Write-only binding to the contract
	StrategyFactoryFilterer   // Log filterer for contract events
}
⋮----
StrategyFactoryCaller     // Read-only binding to the contract
StrategyFactoryTransactor // Write-only binding to the contract
StrategyFactoryFilterer   // Log filterer for contract events
⋮----
// StrategyFactoryCaller is an auto generated read-only Go binding around an Ethereum contract.
type StrategyFactoryCaller struct {
	contract *bind.BoundContract // Generic contract wrapper for the low level calls
}
⋮----
contract *bind.BoundContract // Generic contract wrapper for the low level calls
⋮----
// StrategyFactoryTransactor is an auto generated write-only Go binding around an Ethereum contract.
type StrategyFactoryTransactor struct {
	contract *bind.BoundContract // Generic contract wrapper for the low level calls
}
⋮----
// StrategyFactoryFilterer is an auto generated log filtering Go binding around an Ethereum contract events.
type StrategyFactoryFilterer struct {
	contract *bind.BoundContract // Generic contract wrapper for the low level calls
}
⋮----
// StrategyFactorySession is an auto generated Go binding around an Ethereum contract,
// with pre-set call and transact options.
type StrategyFactorySession struct {
	Contract     *StrategyFactory  // 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
}
⋮----
Contract     *StrategyFactory  // 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
⋮----
// StrategyFactoryCallerSession is an auto generated read-only Go binding around an Ethereum contract,
// with pre-set call options.
type StrategyFactoryCallerSession struct {
	Contract *StrategyFactoryCaller // Generic contract caller binding to set the session for
	CallOpts bind.CallOpts          // Call options to use throughout this session
}
⋮----
Contract *StrategyFactoryCaller // Generic contract caller binding to set the session for
CallOpts bind.CallOpts          // Call options to use throughout this session
⋮----
// StrategyFactoryTransactorSession is an auto generated write-only Go binding around an Ethereum contract,
// with pre-set transact options.
type StrategyFactoryTransactorSession struct {
	Contract     *StrategyFactoryTransactor // Generic contract transactor binding to set the session for
	TransactOpts bind.TransactOpts          // Transaction auth options to use throughout this session
}
⋮----
Contract     *StrategyFactoryTransactor // Generic contract transactor binding to set the session for
TransactOpts bind.TransactOpts          // Transaction auth options to use throughout this session
⋮----
// StrategyFactoryRaw is an auto generated low-level Go binding around an Ethereum contract.
type StrategyFactoryRaw struct {
	Contract *StrategyFactory // Generic contract binding to access the raw methods on
}
⋮----
Contract *StrategyFactory // Generic contract binding to access the raw methods on
⋮----
// StrategyFactoryCallerRaw is an auto generated low-level read-only Go binding around an Ethereum contract.
type StrategyFactoryCallerRaw struct {
	Contract *StrategyFactoryCaller // Generic read-only contract binding to access the raw methods on
}
⋮----
Contract *StrategyFactoryCaller // Generic read-only contract binding to access the raw methods on
⋮----
// StrategyFactoryTransactorRaw is an auto generated low-level write-only Go binding around an Ethereum contract.
type StrategyFactoryTransactorRaw struct {
	Contract *StrategyFactoryTransactor // Generic write-only contract binding to access the raw methods on
}
⋮----
Contract *StrategyFactoryTransactor // Generic write-only contract binding to access the raw methods on
⋮----
// NewStrategyFactory creates a new instance of StrategyFactory, bound to a specific deployed contract.
func NewStrategyFactory(address common.Address, backend bind.ContractBackend) (*StrategyFactory, error)
⋮----
// NewStrategyFactoryCaller creates a new read-only instance of StrategyFactory, bound to a specific deployed contract.
func NewStrategyFactoryCaller(address common.Address, caller bind.ContractCaller) (*StrategyFactoryCaller, error)
⋮----
// NewStrategyFactoryTransactor creates a new write-only instance of StrategyFactory, bound to a specific deployed contract.
func NewStrategyFactoryTransactor(address common.Address, transactor bind.ContractTransactor) (*StrategyFactoryTransactor, error)
⋮----
// NewStrategyFactoryFilterer creates a new log filterer instance of StrategyFactory, bound to a specific deployed contract.
func NewStrategyFactoryFilterer(address common.Address, filterer bind.ContractFilterer) (*StrategyFactoryFilterer, error)
⋮----
// bindStrategyFactory binds a generic wrapper to an already deployed contract.
func bindStrategyFactory(address common.Address, caller bind.ContractCaller, transactor bind.ContractTransactor, filterer bind.ContractFilterer) (*bind.BoundContract, error)
⋮----
// 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 (_StrategyFactory *StrategyFactoryRaw) Call(opts *bind.CallOpts, result *[]interface
⋮----
// Transfer initiates a plain transaction to move funds to the contract, calling
// its default method if one is available.
func (_StrategyFactory *StrategyFactoryRaw) Transfer(opts *bind.TransactOpts) (*types.Transaction, error)
⋮----
// Transact invokes the (paid) contract method with params as input values.
func (_StrategyFactory *StrategyFactoryRaw) Transact(opts *bind.TransactOpts, method string, params ...interface
⋮----
// DeployedStrategies is a free data retrieval call binding the contract method 0x581dfd65.
//
// Solidity: function deployedStrategies(address ) view returns(address)
func (_StrategyFactory *StrategyFactoryCaller) DeployedStrategies(opts *bind.CallOpts, arg0 common.Address) (common.Address, error)
⋮----
var out []interface{}
⋮----
// 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)
⋮----
// 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)
⋮----
// 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)
⋮----
// IsBlacklisted is a free data retrieval call binding the contract method 0xfe575a87.
⋮----
// Solidity: function isBlacklisted(address ) view returns(bool)
func (_StrategyFactory *StrategyFactoryCaller) IsBlacklisted(opts *bind.CallOpts, arg0 common.Address) (bool, error)
⋮----
// Owner is a free data retrieval call binding the contract method 0x8da5cb5b.
⋮----
// Solidity: function owner() view returns(address)
func (_StrategyFactory *StrategyFactoryCaller) Owner(opts *bind.CallOpts) (common.Address, error)
⋮----
// Paused is a free data retrieval call binding the contract method 0x5ac86ab7.
⋮----
// Solidity: function paused(uint8 index) view returns(bool)
func (_StrategyFactory *StrategyFactoryCaller) Paused(opts *bind.CallOpts, index uint8) (bool, error)
⋮----
// Paused0 is a free data retrieval call binding the contract method 0x5c975abb.
⋮----
// Solidity: function paused() view returns(uint256)
func (_StrategyFactory *StrategyFactoryCaller) Paused0(opts *bind.CallOpts) (*big.Int, error)
⋮----
// PauserRegistry is a free data retrieval call binding the contract method 0x886f1195.
⋮----
// Solidity: function pauserRegistry() view returns(address)
func (_StrategyFactory *StrategyFactoryCaller) PauserRegistry(opts *bind.CallOpts) (common.Address, error)
⋮----
// StrategyBeacon is a free data retrieval call binding the contract method 0xf0062d9a.
⋮----
// Solidity: function strategyBeacon() view returns(address)
func (_StrategyFactory *StrategyFactoryCaller) StrategyBeacon(opts *bind.CallOpts) (common.Address, error)
⋮----
// StrategyManager is a free data retrieval call binding the contract method 0x39b70e38.
⋮----
// Solidity: function strategyManager() view returns(address)
func (_StrategyFactory *StrategyFactoryCaller) StrategyManager(opts *bind.CallOpts) (common.Address, error)
⋮----
// BlacklistTokens is a paid mutator transaction binding the contract method 0x23103c41.
⋮----
// Solidity: function blacklistTokens(address[] tokens) returns()
func (_StrategyFactory *StrategyFactoryTransactor) BlacklistTokens(opts *bind.TransactOpts, tokens []common.Address) (*types.Transaction, error)
⋮----
// 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)
⋮----
// DeployNewStrategy is a paid mutator transaction binding the contract method 0x6b9b6229.
⋮----
// Solidity: function deployNewStrategy(address token) returns(address newStrategy)
func (_StrategyFactory *StrategyFactoryTransactor) DeployNewStrategy(opts *bind.TransactOpts, token common.Address) (*types.Transaction, error)
⋮----
// Initialize is a paid mutator transaction binding the contract method 0xcd6dc687.
⋮----
// Solidity: function initialize(address _initialOwner, uint256 _initialPausedStatus) returns()
func (_StrategyFactory *StrategyFactoryTransactor) Initialize(opts *bind.TransactOpts, _initialOwner common.Address, _initialPausedStatus *big.Int) (*types.Transaction, error)
⋮----
// Pause is a paid mutator transaction binding the contract method 0x136439dd.
⋮----
// Solidity: function pause(uint256 newPausedStatus) returns()
func (_StrategyFactory *StrategyFactoryTransactor) Pause(opts *bind.TransactOpts, newPausedStatus *big.Int) (*types.Transaction, error)
⋮----
// PauseAll is a paid mutator transaction binding the contract method 0x595c6a67.
⋮----
// Solidity: function pauseAll() returns()
func (_StrategyFactory *StrategyFactoryTransactor) PauseAll(opts *bind.TransactOpts) (*types.Transaction, error)
⋮----
// RemoveStrategiesFromWhitelist is a paid mutator transaction binding the contract method 0xfe38b32d.
⋮----
// Solidity: function removeStrategiesFromWhitelist(address[] strategiesToRemoveFromWhitelist) returns()
func (_StrategyFactory *StrategyFactoryTransactor) RemoveStrategiesFromWhitelist(opts *bind.TransactOpts, strategiesToRemoveFromWhitelist []common.Address) (*types.Transaction, error)
⋮----
// RenounceOwnership is a paid mutator transaction binding the contract method 0x715018a6.
⋮----
// Solidity: function renounceOwnership() returns()
func (_StrategyFactory *StrategyFactoryTransactor) RenounceOwnership(opts *bind.TransactOpts) (*types.Transaction, error)
⋮----
// TransferOwnership is a paid mutator transaction binding the contract method 0xf2fde38b.
⋮----
// Solidity: function transferOwnership(address newOwner) returns()
func (_StrategyFactory *StrategyFactoryTransactor) TransferOwnership(opts *bind.TransactOpts, newOwner common.Address) (*types.Transaction, error)
⋮----
// Unpause is a paid mutator transaction binding the contract method 0xfabc1cbc.
⋮----
// Solidity: function unpause(uint256 newPausedStatus) returns()
func (_StrategyFactory *StrategyFactoryTransactor) Unpause(opts *bind.TransactOpts, newPausedStatus *big.Int) (*types.Transaction, error)
⋮----
// WhitelistStrategies is a paid mutator transaction binding the contract method 0xb768ebc9.
⋮----
// Solidity: function whitelistStrategies(address[] strategiesToWhitelist) returns()
func (_StrategyFactory *StrategyFactoryTransactor) WhitelistStrategies(opts *bind.TransactOpts, strategiesToWhitelist []common.Address) (*types.Transaction, error)
⋮----
// 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
}
⋮----
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 the iterator completed, deliver directly whatever's available
⋮----
// Iterator still in progress, wait for either a data or an error event
⋮----
// Error returns any retrieval or parsing error occurred during filtering.
func (it *StrategyFactoryDurationVaultDeployedIterator) Error() error
⋮----
// Close terminates the iteration process, releasing any pending underlying
// resources.
func (it *StrategyFactoryDurationVaultDeployedIterator) Close() error
⋮----
// 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
}
⋮----
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{}
⋮----
var underlyingTokenRule []interface{}
⋮----
var vaultAdminRule []interface{}
⋮----
// WatchDurationVaultDeployed is a free log subscription operation binding the contract event 0x6c9e2cbc6fcd0f5b21ee2edb38f3421d7538cd98b8ff00803f81879345568504.
⋮----
func (_StrategyFactory *StrategyFactoryFilterer) WatchDurationVaultDeployed(opts *bind.WatchOpts, sink chan<- *StrategyFactoryDurationVaultDeployed, vault []common.Address, underlyingToken []common.Address, vaultAdmin []common.Address) (event.Subscription, error)
⋮----
// New log arrived, parse the event and forward to the user
⋮----
// ParseDurationVaultDeployed is a log parse operation binding the contract event 0x6c9e2cbc6fcd0f5b21ee2edb38f3421d7538cd98b8ff00803f81879345568504.
⋮----
func (_StrategyFactory *StrategyFactoryFilterer) ParseDurationVaultDeployed(log types.Log) (*StrategyFactoryDurationVaultDeployed, error)
⋮----
// 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

	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
}
⋮----
Event *StrategyFactoryInitialized // Event containing the contract specifics and raw log
⋮----
// StrategyFactoryInitialized represents a Initialized event raised by the StrategyFactory contract.
type StrategyFactoryInitialized struct {
	Version uint8
	Raw     types.Log // Blockchain specific contextual infos
}
⋮----
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 (_StrategyFactory *StrategyFactoryFilterer) FilterInitialized(opts *bind.FilterOpts) (*StrategyFactoryInitializedIterator, error)
⋮----
// WatchInitialized is a free log subscription operation binding the contract event 0x7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb3847402498.
⋮----
func (_StrategyFactory *StrategyFactoryFilterer) WatchInitialized(opts *bind.WatchOpts, sink chan<- *StrategyFactoryInitialized) (event.Subscription, error)
⋮----
// ParseInitialized is a log parse operation binding the contract event 0x7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb3847402498.
⋮----
func (_StrategyFactory *StrategyFactoryFilterer) ParseInitialized(log types.Log) (*StrategyFactoryInitialized, error)
⋮----
// StrategyFactoryOwnershipTransferredIterator is returned from FilterOwnershipTransferred and is used to iterate over the raw logs and unpacked data for OwnershipTransferred events raised by the StrategyFactory contract.
type StrategyFactoryOwnershipTransferredIterator struct {
	Event *StrategyFactoryOwnershipTransferred // 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
}
⋮----
Event *StrategyFactoryOwnershipTransferred // Event containing the contract specifics and raw log
⋮----
// StrategyFactoryOwnershipTransferred represents a OwnershipTransferred event raised by the StrategyFactory contract.
type StrategyFactoryOwnershipTransferred struct {
	PreviousOwner common.Address
	NewOwner      common.Address
	Raw           types.Log // Blockchain specific contextual infos
}
⋮----
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 (_StrategyFactory *StrategyFactoryFilterer) FilterOwnershipTransferred(opts *bind.FilterOpts, previousOwner []common.Address, newOwner []common.Address) (*StrategyFactoryOwnershipTransferredIterator, error)
⋮----
var previousOwnerRule []interface{}
⋮----
var newOwnerRule []interface{}
⋮----
// WatchOwnershipTransferred is a free log subscription operation binding the contract event 0x8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0.
⋮----
func (_StrategyFactory *StrategyFactoryFilterer) WatchOwnershipTransferred(opts *bind.WatchOpts, sink chan<- *StrategyFactoryOwnershipTransferred, previousOwner []common.Address, newOwner []common.Address) (event.Subscription, error)
⋮----
// ParseOwnershipTransferred is a log parse operation binding the contract event 0x8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0.
⋮----
func (_StrategyFactory *StrategyFactoryFilterer) ParseOwnershipTransferred(log types.Log) (*StrategyFactoryOwnershipTransferred, error)
⋮----
// StrategyFactoryPausedIterator is returned from FilterPaused and is used to iterate over the raw logs and unpacked data for Paused events raised by the StrategyFactory contract.
type StrategyFactoryPausedIterator struct {
	Event *StrategyFactoryPaused // 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
}
⋮----
Event *StrategyFactoryPaused // Event containing the contract specifics and raw log
⋮----
// StrategyFactoryPaused represents a Paused event raised by the StrategyFactory contract.
type StrategyFactoryPaused 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 (_StrategyFactory *StrategyFactoryFilterer) FilterPaused(opts *bind.FilterOpts, account []common.Address) (*StrategyFactoryPausedIterator, error)
⋮----
var accountRule []interface{}
⋮----
// WatchPaused is a free log subscription operation binding the contract event 0xab40a374bc51de372200a8bc981af8c9ecdc08dfdaef0bb6e09f88f3c616ef3d.
⋮----
func (_StrategyFactory *StrategyFactoryFilterer) WatchPaused(opts *bind.WatchOpts, sink chan<- *StrategyFactoryPaused, account []common.Address) (event.Subscription, error)
⋮----
// ParsePaused is a log parse operation binding the contract event 0xab40a374bc51de372200a8bc981af8c9ecdc08dfdaef0bb6e09f88f3c616ef3d.
⋮----
func (_StrategyFactory *StrategyFactoryFilterer) ParsePaused(log types.Log) (*StrategyFactoryPaused, error)
⋮----
// 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

	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
}
⋮----
Event *StrategyFactoryStrategySetForToken // Event containing the contract specifics and raw log
⋮----
// StrategyFactoryStrategySetForToken represents a StrategySetForToken event raised by the StrategyFactory contract.
type StrategyFactoryStrategySetForToken struct {
	Token    common.Address
	Strategy common.Address
	Raw      types.Log // Blockchain specific contextual infos
}
⋮----
Raw      types.Log // Blockchain specific contextual infos
⋮----
// FilterStrategySetForToken is a free log retrieval operation binding the contract event 0x6852a55230ef089d785bce7ffbf757985de34026df90a87d7b4a6e56f95d251f.
⋮----
// Solidity: event StrategySetForToken(address token, address strategy)
func (_StrategyFactory *StrategyFactoryFilterer) FilterStrategySetForToken(opts *bind.FilterOpts) (*StrategyFactoryStrategySetForTokenIterator, error)
⋮----
// WatchStrategySetForToken is a free log subscription operation binding the contract event 0x6852a55230ef089d785bce7ffbf757985de34026df90a87d7b4a6e56f95d251f.
⋮----
func (_StrategyFactory *StrategyFactoryFilterer) WatchStrategySetForToken(opts *bind.WatchOpts, sink chan<- *StrategyFactoryStrategySetForToken) (event.Subscription, error)
⋮----
// ParseStrategySetForToken is a log parse operation binding the contract event 0x6852a55230ef089d785bce7ffbf757985de34026df90a87d7b4a6e56f95d251f.
⋮----
func (_StrategyFactory *StrategyFactoryFilterer) ParseStrategySetForToken(log types.Log) (*StrategyFactoryStrategySetForToken, error)
⋮----
// StrategyFactoryTokenBlacklistedIterator is returned from FilterTokenBlacklisted and is used to iterate over the raw logs and unpacked data for TokenBlacklisted events raised by the StrategyFactory contract.
type StrategyFactoryTokenBlacklistedIterator struct {
	Event *StrategyFactoryTokenBlacklisted // 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
}
⋮----
Event *StrategyFactoryTokenBlacklisted // Event containing the contract specifics and raw log
⋮----
// StrategyFactoryTokenBlacklisted represents a TokenBlacklisted event raised by the StrategyFactory contract.
type StrategyFactoryTokenBlacklisted struct {
	Token common.Address
	Raw   types.Log // Blockchain specific contextual infos
}
⋮----
Raw   types.Log // Blockchain specific contextual infos
⋮----
// FilterTokenBlacklisted is a free log retrieval operation binding the contract event 0x75519c51f39873ec0e27dd3bbc09549e4865a113f505393fb9eab5898f6418b3.
⋮----
// Solidity: event TokenBlacklisted(address token)
func (_StrategyFactory *StrategyFactoryFilterer) FilterTokenBlacklisted(opts *bind.FilterOpts) (*StrategyFactoryTokenBlacklistedIterator, error)
⋮----
// WatchTokenBlacklisted is a free log subscription operation binding the contract event 0x75519c51f39873ec0e27dd3bbc09549e4865a113f505393fb9eab5898f6418b3.
⋮----
func (_StrategyFactory *StrategyFactoryFilterer) WatchTokenBlacklisted(opts *bind.WatchOpts, sink chan<- *StrategyFactoryTokenBlacklisted) (event.Subscription, error)
⋮----
// ParseTokenBlacklisted is a log parse operation binding the contract event 0x75519c51f39873ec0e27dd3bbc09549e4865a113f505393fb9eab5898f6418b3.
⋮----
func (_StrategyFactory *StrategyFactoryFilterer) ParseTokenBlacklisted(log types.Log) (*StrategyFactoryTokenBlacklisted, error)
⋮----
// StrategyFactoryUnpausedIterator is returned from FilterUnpaused and is used to iterate over the raw logs and unpacked data for Unpaused events raised by the StrategyFactory contract.
type StrategyFactoryUnpausedIterator struct {
	Event *StrategyFactoryUnpaused // 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
}
⋮----
Event *StrategyFactoryUnpaused // Event containing the contract specifics and raw log
⋮----
// StrategyFactoryUnpaused represents a Unpaused event raised by the StrategyFactory contract.
type StrategyFactoryUnpaused 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 (_StrategyFactory *StrategyFactoryFilterer) FilterUnpaused(opts *bind.FilterOpts, account []common.Address) (*StrategyFactoryUnpausedIterator, error)
⋮----
// WatchUnpaused is a free log subscription operation binding the contract event 0x3582d1828e26bf56bd801502bc021ac0bc8afb57c826e4986b45593c8fad389c.
⋮----
func (_StrategyFactory *StrategyFactoryFilterer) WatchUnpaused(opts *bind.WatchOpts, sink chan<- *StrategyFactoryUnpaused, account []common.Address) (event.Subscription, error)
⋮----
// ParseUnpaused is a log parse operation binding the contract event 0x3582d1828e26bf56bd801502bc021ac0bc8afb57c826e4986b45593c8fad389c.
⋮----
func (_StrategyFactory *StrategyFactoryFilterer) ParseUnpaused(log types.Log) (*StrategyFactoryUnpaused, error)
````

## File: pkg/bindings/StrategyFactoryStorage/binding.go
````go
// Code generated - DO NOT EDIT.
// This file is a generated binding and any manual changes will be lost.
⋮----
package StrategyFactoryStorage
⋮----
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"
)
⋮----
"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
}
⋮----
// StrategyFactoryStorageMetaData contains all meta data concerning the StrategyFactoryStorage contract.
var StrategyFactoryStorageMetaData = &bind.MetaData{
	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.
// Deprecated: Use StrategyFactoryStorageMetaData.ABI instead.
var StrategyFactoryStorageABI = StrategyFactoryStorageMetaData.ABI
⋮----
// StrategyFactoryStorage is an auto generated Go binding around an Ethereum contract.
type StrategyFactoryStorage struct {
	StrategyFactoryStorageCaller     // Read-only binding to the contract
	StrategyFactoryStorageTransactor // Write-only binding to the contract
	StrategyFactoryStorageFilterer   // Log filterer for contract events
}
⋮----
StrategyFactoryStorageCaller     // Read-only binding to the contract
StrategyFactoryStorageTransactor // Write-only binding to the contract
StrategyFactoryStorageFilterer   // Log filterer for contract events
⋮----
// StrategyFactoryStorageCaller is an auto generated read-only Go binding around an Ethereum contract.
type StrategyFactoryStorageCaller struct {
	contract *bind.BoundContract // Generic contract wrapper for the low level calls
}
⋮----
contract *bind.BoundContract // Generic contract wrapper for the low level calls
⋮----
// StrategyFactoryStorageTransactor is an auto generated write-only Go binding around an Ethereum contract.
type StrategyFactoryStorageTransactor struct {
	contract *bind.BoundContract // Generic contract wrapper for the low level calls
}
⋮----
// StrategyFactoryStorageFilterer is an auto generated log filtering Go binding around an Ethereum contract events.
type StrategyFactoryStorageFilterer struct {
	contract *bind.BoundContract // Generic contract wrapper for the low level calls
}
⋮----
// StrategyFactoryStorageSession is an auto generated Go binding around an Ethereum contract,
// with pre-set call and transact options.
type StrategyFactoryStorageSession struct {
	Contract     *StrategyFactoryStorage // 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
}
⋮----
Contract     *StrategyFactoryStorage // 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
⋮----
// StrategyFactoryStorageCallerSession is an auto generated read-only Go binding around an Ethereum contract,
// with pre-set call options.
type StrategyFactoryStorageCallerSession struct {
	Contract *StrategyFactoryStorageCaller // Generic contract caller binding to set the session for
	CallOpts bind.CallOpts                 // Call options to use throughout this session
}
⋮----
Contract *StrategyFactoryStorageCaller // Generic contract caller binding to set the session for
CallOpts bind.CallOpts                 // Call options to use throughout this session
⋮----
// StrategyFactoryStorageTransactorSession is an auto generated write-only Go binding around an Ethereum contract,
// with pre-set transact options.
type StrategyFactoryStorageTransactorSession struct {
	Contract     *StrategyFactoryStorageTransactor // Generic contract transactor binding to set the session for
	TransactOpts bind.TransactOpts                 // Transaction auth options to use throughout this session
}
⋮----
Contract     *StrategyFactoryStorageTransactor // Generic contract transactor binding to set the session for
TransactOpts bind.TransactOpts                 // Transaction auth options to use throughout this session
⋮----
// StrategyFactoryStorageRaw is an auto generated low-level Go binding around an Ethereum contract.
type StrategyFactoryStorageRaw struct {
	Contract *StrategyFactoryStorage // Generic contract binding to access the raw methods on
}
⋮----
Contract *StrategyFactoryStorage // Generic contract binding to access the raw methods on
⋮----
// StrategyFactoryStorageCallerRaw is an auto generated low-level read-only Go binding around an Ethereum contract.
type StrategyFactoryStorageCallerRaw struct {
	Contract *StrategyFactoryStorageCaller // Generic read-only contract binding to access the raw methods on
}
⋮----
Contract *StrategyFactoryStorageCaller // Generic read-only contract binding to access the raw methods on
⋮----
// StrategyFactoryStorageTransactorRaw is an auto generated low-level write-only Go binding around an Ethereum contract.
type StrategyFactoryStorageTransactorRaw struct {
	Contract *StrategyFactoryStorageTransactor // Generic write-only contract binding to access the raw methods on
}
⋮----
Contract *StrategyFactoryStorageTransactor // Generic write-only contract binding to access the raw methods on
⋮----
// NewStrategyFactoryStorage creates a new instance of StrategyFactoryStorage, bound to a specific deployed contract.
func NewStrategyFactoryStorage(address common.Address, backend bind.ContractBackend) (*StrategyFactoryStorage, error)
⋮----
// NewStrategyFactoryStorageCaller creates a new read-only instance of StrategyFactoryStorage, bound to a specific deployed contract.
func NewStrategyFactoryStorageCaller(address common.Address, caller bind.ContractCaller) (*StrategyFactoryStorageCaller, error)
⋮----
// NewStrategyFactoryStorageTransactor creates a new write-only instance of StrategyFactoryStorage, bound to a specific deployed contract.
func NewStrategyFactoryStorageTransactor(address common.Address, transactor bind.ContractTransactor) (*StrategyFactoryStorageTransactor, error)
⋮----
// NewStrategyFactoryStorageFilterer creates a new log filterer instance of StrategyFactoryStorage, bound to a specific deployed contract.
func NewStrategyFactoryStorageFilterer(address common.Address, filterer bind.ContractFilterer) (*StrategyFactoryStorageFilterer, error)
⋮----
// bindStrategyFactoryStorage binds a generic wrapper to an already deployed contract.
func bindStrategyFactoryStorage(address common.Address, caller bind.ContractCaller, transactor bind.ContractTransactor, filterer bind.ContractFilterer) (*bind.BoundContract, error)
⋮----
// 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 (_StrategyFactoryStorage *StrategyFactoryStorageRaw) Call(opts *bind.CallOpts, result *[]interface
⋮----
// Transfer initiates a plain transaction to move funds to the contract, calling
// its default method if one is available.
func (_StrategyFactoryStorage *StrategyFactoryStorageRaw) Transfer(opts *bind.TransactOpts) (*types.Transaction, error)
⋮----
// Transact invokes the (paid) contract method with params as input values.
func (_StrategyFactoryStorage *StrategyFactoryStorageRaw) Transact(opts *bind.TransactOpts, method string, params ...interface
⋮----
// DeployedStrategies is a free data retrieval call binding the contract method 0x581dfd65.
//
// Solidity: function deployedStrategies(address ) view returns(address)
func (_StrategyFactoryStorage *StrategyFactoryStorageCaller) DeployedStrategies(opts *bind.CallOpts, arg0 common.Address) (common.Address, error)
⋮----
var out []interface{}
⋮----
// 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)
⋮----
// 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)
⋮----
// 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)
⋮----
// IsBlacklisted is a free data retrieval call binding the contract method 0xfe575a87.
⋮----
// Solidity: function isBlacklisted(address ) view returns(bool)
func (_StrategyFactoryStorage *StrategyFactoryStorageCaller) IsBlacklisted(opts *bind.CallOpts, arg0 common.Address) (bool, error)
⋮----
// StrategyBeacon is a free data retrieval call binding the contract method 0xf0062d9a.
⋮----
// Solidity: function strategyBeacon() view returns(address)
func (_StrategyFactoryStorage *StrategyFactoryStorageCaller) StrategyBeacon(opts *bind.CallOpts) (common.Address, error)
⋮----
// 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)
⋮----
// DeployNewStrategy is a paid mutator transaction binding the contract method 0x6b9b6229.
⋮----
// Solidity: function deployNewStrategy(address token) returns(address newStrategy)
func (_StrategyFactoryStorage *StrategyFactoryStorageTransactor) DeployNewStrategy(opts *bind.TransactOpts, token common.Address) (*types.Transaction, error)
⋮----
// RemoveStrategiesFromWhitelist is a paid mutator transaction binding the contract method 0xfe38b32d.
⋮----
// Solidity: function removeStrategiesFromWhitelist(address[] strategiesToRemoveFromWhitelist) returns()
func (_StrategyFactoryStorage *StrategyFactoryStorageTransactor) RemoveStrategiesFromWhitelist(opts *bind.TransactOpts, strategiesToRemoveFromWhitelist []common.Address) (*types.Transaction, error)
⋮----
// WhitelistStrategies is a paid mutator transaction binding the contract method 0xb768ebc9.
⋮----
// Solidity: function whitelistStrategies(address[] strategiesToWhitelist) returns()
func (_StrategyFactoryStorage *StrategyFactoryStorageTransactor) WhitelistStrategies(opts *bind.TransactOpts, strategiesToWhitelist []common.Address) (*types.Transaction, error)
⋮----
// 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

	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
}
⋮----
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
⋮----
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 *StrategyFactoryStorageDurationVaultDeployedIterator) Next() bool
⋮----
// If the iterator failed, stop iterating
⋮----
// If the iterator completed, deliver directly whatever's available
⋮----
// Iterator still in progress, wait for either a data or an error event
⋮----
// Error returns any retrieval or parsing error occurred during filtering.
func (it *StrategyFactoryStorageDurationVaultDeployedIterator) Error() error
⋮----
// Close terminates the iteration process, releasing any pending underlying
// resources.
func (it *StrategyFactoryStorageDurationVaultDeployedIterator) Close() error
⋮----
// 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
}
⋮----
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 (_StrategyFactoryStorage *StrategyFactoryStorageFilterer) FilterDurationVaultDeployed(opts *bind.FilterOpts, vault []common.Address, underlyingToken []common.Address, vaultAdmin []common.Address) (*StrategyFactoryStorageDurationVaultDeployedIterator, error)
⋮----
var vaultRule []interface{}
⋮----
var underlyingTokenRule []interface{}
⋮----
var vaultAdminRule []interface{}
⋮----
// WatchDurationVaultDeployed is a free log subscription operation binding the contract event 0x6c9e2cbc6fcd0f5b21ee2edb38f3421d7538cd98b8ff00803f81879345568504.
⋮----
func (_StrategyFactoryStorage *StrategyFactoryStorageFilterer) WatchDurationVaultDeployed(opts *bind.WatchOpts, sink chan<- *StrategyFactoryStorageDurationVaultDeployed, vault []common.Address, underlyingToken []common.Address, vaultAdmin []common.Address) (event.Subscription, error)
⋮----
// New log arrived, parse the event and forward to the user
⋮----
// ParseDurationVaultDeployed is a log parse operation binding the contract event 0x6c9e2cbc6fcd0f5b21ee2edb38f3421d7538cd98b8ff00803f81879345568504.
⋮----
func (_StrategyFactoryStorage *StrategyFactoryStorageFilterer) ParseDurationVaultDeployed(log types.Log) (*StrategyFactoryStorageDurationVaultDeployed, error)
⋮----
// StrategyFactoryStorageStrategySetForTokenIterator is returned from FilterStrategySetForToken and is used to iterate over the raw logs and unpacked data for StrategySetForToken events raised by the StrategyFactoryStorage contract.
type StrategyFactoryStorageStrategySetForTokenIterator struct {
	Event *StrategyFactoryStorageStrategySetForToken // 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
}
⋮----
Event *StrategyFactoryStorageStrategySetForToken // Event containing the contract specifics and raw log
⋮----
// StrategyFactoryStorageStrategySetForToken represents a StrategySetForToken event raised by the StrategyFactoryStorage contract.
type StrategyFactoryStorageStrategySetForToken struct {
	Token    common.Address
	Strategy common.Address
	Raw      types.Log // Blockchain specific contextual infos
}
⋮----
Raw      types.Log // Blockchain specific contextual infos
⋮----
// FilterStrategySetForToken is a free log retrieval operation binding the contract event 0x6852a55230ef089d785bce7ffbf757985de34026df90a87d7b4a6e56f95d251f.
⋮----
// Solidity: event StrategySetForToken(address token, address strategy)
func (_StrategyFactoryStorage *StrategyFactoryStorageFilterer) FilterStrategySetForToken(opts *bind.FilterOpts) (*StrategyFactoryStorageStrategySetForTokenIterator, error)
⋮----
// WatchStrategySetForToken is a free log subscription operation binding the contract event 0x6852a55230ef089d785bce7ffbf757985de34026df90a87d7b4a6e56f95d251f.
⋮----
func (_StrategyFactoryStorage *StrategyFactoryStorageFilterer) WatchStrategySetForToken(opts *bind.WatchOpts, sink chan<- *StrategyFactoryStorageStrategySetForToken) (event.Subscription, error)
⋮----
// ParseStrategySetForToken is a log parse operation binding the contract event 0x6852a55230ef089d785bce7ffbf757985de34026df90a87d7b4a6e56f95d251f.
⋮----
func (_StrategyFactoryStorage *StrategyFactoryStorageFilterer) ParseStrategySetForToken(log types.Log) (*StrategyFactoryStorageStrategySetForToken, error)
⋮----
// StrategyFactoryStorageTokenBlacklistedIterator is returned from FilterTokenBlacklisted and is used to iterate over the raw logs and unpacked data for TokenBlacklisted events raised by the StrategyFactoryStorage contract.
type StrategyFactoryStorageTokenBlacklistedIterator struct {
	Event *StrategyFactoryStorageTokenBlacklisted // 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
}
⋮----
Event *StrategyFactoryStorageTokenBlacklisted // Event containing the contract specifics and raw log
⋮----
// StrategyFactoryStorageTokenBlacklisted represents a TokenBlacklisted event raised by the StrategyFactoryStorage contract.
type StrategyFactoryStorageTokenBlacklisted struct {
	Token common.Address
	Raw   types.Log // Blockchain specific contextual infos
}
⋮----
Raw   types.Log // Blockchain specific contextual infos
⋮----
// FilterTokenBlacklisted is a free log retrieval operation binding the contract event 0x75519c51f39873ec0e27dd3bbc09549e4865a113f505393fb9eab5898f6418b3.
⋮----
// Solidity: event TokenBlacklisted(address token)
func (_StrategyFactoryStorage *StrategyFactoryStorageFilterer) FilterTokenBlacklisted(opts *bind.FilterOpts) (*StrategyFactoryStorageTokenBlacklistedIterator, error)
⋮----
// WatchTokenBlacklisted is a free log subscription operation binding the contract event 0x75519c51f39873ec0e27dd3bbc09549e4865a113f505393fb9eab5898f6418b3.
⋮----
func (_StrategyFactoryStorage *StrategyFactoryStorageFilterer) WatchTokenBlacklisted(opts *bind.WatchOpts, sink chan<- *StrategyFactoryStorageTokenBlacklisted) (event.Subscription, error)
⋮----
// ParseTokenBlacklisted is a log parse operation binding the contract event 0x75519c51f39873ec0e27dd3bbc09549e4865a113f505393fb9eab5898f6418b3.
⋮----
func (_StrategyFactoryStorage *StrategyFactoryStorageFilterer) ParseTokenBlacklisted(log types.Log) (*StrategyFactoryStorageTokenBlacklisted, error)
````

## File: pkg/bindings/StrategyManager/binding.go
````go
// Code generated - DO NOT EDIT.
// This file is a generated binding and any manual changes will be lost.
⋮----
package StrategyManager
⋮----
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"
)
⋮----
"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
)
⋮----
// OperatorSet is an auto generated low-level Go binding around an user-defined struct.
type OperatorSet struct {
	Avs common.Address
	Id  uint32
}
⋮----
// 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: "0x610100604052348015610010575f5ffd5b50604051613a92380380613a9283398101604081905261002f916101bc565b80808585856001600160a01b03811661005b576040516339b190bb60e11b815260040160405180910390fd5b6001600160a01b0390811660805291821660a0521660c05261007c81610093565b60e0525061008a90506100d9565b50505050610301565b5f5f829050601f815111156100c6578260405163305a27a960e01b81526004016100bd91906102a6565b60405180910390fd5b80516100d1826102db565b179392505050565b5f54610100900460ff16156101405760405162461bcd60e51b815260206004820152602760248201527f496e697469616c697a61626c653a20636f6e747261637420697320696e697469604482015266616c697a696e6760c81b60648201526084016100bd565b5f5460ff9081161461018f575f805460ff191660ff9081179091556040519081527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b565b6001600160a01b03811681146101a5575f5ffd5b50565b634e487b7160e01b5f52604160045260245ffd5b5f5f5f5f608085870312156101cf575f5ffd5b84516101da81610191565b60208601519094506101eb81610191565b60408601519093506101fc81610191565b60608601519092506001600160401b03811115610217575f5ffd5b8501601f81018713610227575f5ffd5b80516001600160401b03811115610240576102406101a8565b604051601f8201601f19908116603f011681016001600160401b038111828210171561026e5761026e6101a8565b604052818152828201602001891015610285575f5ffd5b8160208401602083015e5f6020838301015280935050505092959194509250565b602081525f82518060208401528060208501604085015e5f604082850101526040601f19601f83011684010191505092915050565b805160208083015191908110156102fb575f198160200360031b1b821691505b50919050565b60805160a05160c05160e05161371861037a5f395f81816110a8015261252f01525f81816105fa015281816108c101528181610da30152818161103a0152818161125501526120a901525f81816105a001528181610815015261141a01525f81816104b601528181611aaa015261259e01526137185ff3fe608060405234801561000f575f5ffd5b506004361061026b575f3560e01c80637ecebe001161014b578063ca8aa7c7116100bf578063f2fde38b11610084578063f2fde38b1461062f578063f3b4a00014610642578063f698da251461064c578063fabc1cbc14610654578063fd98042314610667578063fe243a171461067a575f5ffd5b8063ca8aa7c71461059b578063cbc2bd62146105c2578063de44acb6146105d5578063df5cf723146105f5578063e7a050aa1461061c575f5ffd5b80638da5cb5b116101105780638da5cb5b1461052b57806394f649dd1461053c578063967fc0d21461054f5780639ac01d6114610562578063b5d8b5b814610575578063c665670214610588575f5ffd5b80637ecebe001461047f578063829fca731461049e578063886f1195146104b157806388c10299146104f05780638b8aac3c14610503575f5ffd5b806350ff7225116101e25780635de08ff2116101a75780635de08ff2146103fc578063663c1de41461040f578063715018a614610431578063724af4231461043957806376fb162b1461044c5780637def15641461045f575f5ffd5b806350ff72251461037c57806354fd4d50146103a4578063595c6a67146103b95780635ac86ab7146103c15780635c975abb146103f4575f5ffd5b806332e89ace1161023357806332e89ace146102f157806336a8c500146103045780633f292b081461031a5780633fb99ca51461032f57806348825e94146103425780634b6d5d6e14610369575f5ffd5b8063136439dd1461026f5780631794bb3c146102845780632d44def6146102975780632eae418c146102bd57806331f8fb4c146102d0575b5f5ffd5b61028261027d366004612eee565b6106a4565b005b610282610292366004612f19565b6106de565b6102aa6102a5366004612f6d565b610804565b6040519081526020015b60405180910390f35b6102826102cb366004612fab565b6108b6565b6102e36102de366004612ff9565b610982565b6040516102b4929190613095565b6102aa6102ff366004613106565b610b10565b61030c610b95565b6040516102b49291906131e0565b610322610cb0565b6040516102b49190613236565b61028261033d366004613293565b610d98565b6102aa7f4337f82d142e41f2a8c10547cd8c859bddb92262a61058e77842e24d9dea922481565b6102826103773660046132d7565b610ee0565b61038f61038a366004612f19565b61102d565b604080519283526020830191909152016102b4565b6103ac6110a1565b6040516102b49190613320565b6102826110d1565b6103e46103cf366004613332565b609854600160ff9092169190911b9081161490565b60405190151581526020016102b4565b6098546102aa565b61028261040a366004613352565b6110e5565b6103e461041d3660046132d7565b60d16020525f908152604090205460ff1681565b610282611238565b6102aa610447366004612f19565b611249565b6102aa61045a366004612f6d565b6112a6565b61047261046d3660046133c1565b6112f5565b6040516102b491906133db565b6102aa61048d3660046132d7565b60ca6020525f908152604090205481565b6102aa6104ac366004612ff9565b611327565b6104d87f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b0390911681526020016102b4565b6104726104fe366004612ff9565b611361565b6102aa6105113660046132d7565b6001600160a01b03165f90815260ce602052604090205490565b6033546001600160a01b03166104d8565b6102e361054a3660046132d7565b611498565b60cb546104d8906001600160a01b031681565b6102aa6105703660046133ed565b61160f565b610282610583366004613352565b6116a0565b6102826105963660046132d7565b6117e7565b6104d87f000000000000000000000000000000000000000000000000000000000000000081565b6104d86105d036600461344e565b61180a565b6105e86105e33660046132d7565b61183e565b6040516102b49190613478565b6104d87f000000000000000000000000000000000000000000000000000000000000000081565b6102aa61062a366004612f19565b6118b1565b61028261063d3660046132d7565b6118e4565b6104d8620e16e481565b6102aa61195a565b610282610662366004612eee565b611a13565b6102aa6106753660046132d7565b611a80565b6102aa61068836600461348a565b60cd60209081525f928352604080842090915290825290205481565b6106ac611a95565b60985481811681146106d15760405163c61dca5d60e01b815260040160405180910390fd5b6106da82611b38565b5050565b5f54610100900460ff16158080156106fc57505f54600160ff909116105b806107155750303b15801561071557505f5460ff166001145b61077d5760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b60648201526084015b60405180910390fd5b5f805460ff19166001179055801561079e575f805461ff0019166101001790555b6107a782611b38565b6107b084611b75565b6107b983611bc6565b80156107fe575f805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b50505050565b5f61080d611c2f565b6108a38484847f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316630f3df50e896040518263ffffffff1660e01b815260040161085f919061350a565b602060405180830381865afa15801561087a573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061089e9190613518565b611c88565b90506108af6001606555565b9392505050565b336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146108ff5760405163f739589b60e01b815260040160405180910390fd5b610907611c2f565b604051636ce5768960e11b81526001600160a01b0384169063d9caed129061093790879086908690600401613533565b6020604051808303815f875af1158015610953573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906109779190613557565b506107fe6001606555565b6060805f60d7816109a061099b3689900389018961356e565b611e90565b81526020019081526020015f205f8581526020019081526020015f2090505f6109c882611ef3565b90505f81516001600160401b038111156109e4576109e46130c2565b604051908082528060200260200182016040528015610a0d578160200160208202803683370190505b5090505f82516001600160401b03811115610a2a57610a2a6130c2565b604051908082528060200260200182016040528015610a53578160200160208202803683370190505b5090505f5b8351811015610b0057838181518110610a7357610a736135ca565b6020026020010151838281518110610a8d57610a8d6135ca565b60200260200101906001600160a01b031690816001600160a01b031681525050610ad9848281518110610ac257610ac26135ca565b602002602001015186611eff90919063ffffffff16565b9050828281518110610aed57610aed6135ca565b6020908102919091010152600101610a58565b50909450925050505b9250929050565b5f5f610b1b81611f23565b610b23611c2f565b6001600160a01b0385165f90815260ca6020526040902054610b5486610b4d818c8c8c878c61160f565b8688611f4e565b6001600160a01b0386165f90815260ca60205260409020600182019055610b7d868a8a8a611fa0565b925050610b8a6001606555565b509695505050505050565b6060805f610ba360d461210d565b90505f816001600160401b03811115610bbe57610bbe6130c2565b604051908082528060200260200182016040528015610be7578160200160208202803683370190505b5090505f826001600160401b03811115610c0357610c036130c2565b604051908082528060200260200182016040528015610c2c578160200160208202803683370190505b5090505f5b83811015610ca5575f5f610c4660d484612117565b9150915081858481518110610c5d57610c5d6135ca565b60200260200101906001600160a01b031690816001600160a01b03168152505080848481518110610c9057610c906135ca565b60209081029190910101525050600101610c31565b509094909350915050565b60605f610cbd60d8612125565b90505f816001600160401b03811115610cd857610cd86130c2565b604051908082528060200260200182016040528015610d1c57816020015b604080518082019091525f8082526020820152815260200190600190039081610cf65790505b5090505f5b82811015610d9157610d6c610d3760d88361212e565b604080518082019091525f80825260208201525060408051808201909152606082901c815263ffffffff909116602082015290565b828281518110610d7e57610d7e6135ca565b6020908102919091010152600101610d21565b5092915050565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614610de15760405163f739589b60e01b815260040160405180910390fd5b610de9611c2f565b5f60d781610dff61099b3689900389018961356e565b815260208082019290925260409081015f90812087825290925290209050610e28818484612139565b610e455760405163ca354fa360e01b815260040160405180910390fd5b610e62610e5a61099b3688900388018861356e565b60d89061214e565b50610e978460da5f610e7c61099b368b90038b018b61356e565b81526020019081526020015f2061214e90919063ffffffff16565b507f5f5209798bbac45a16d2dc3bc67319fab26ee00153916d6f07b69f8a134a1e8b85858585604051610ecd94939291906135de565b60405180910390a1506107fe6001606555565b610ee8611c2f565b5f610ef460d483611eff565b915050610f0260d483612159565b50604080516001600160a01b0384168152602081018390527fd9d082c3ec4f3a3ffa55c324939a06407f5fbcb87d5e0ce3b9508c92c84ed839910160405180910390a1801561101f57816001600160a01b031663d9caed12620e16e4846001600160a01b0316632495a5996040518163ffffffff1660e01b8152600401602060405180830381865afa158015610f9a573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610fbe9190613518565b846040518463ffffffff1660e01b8152600401610fdd93929190613533565b6020604051808303815f875af1158015610ff9573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061101d9190613557565b505b5061102a6001606555565b50565b5f80336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146110785760405163f739589b60e01b815260040160405180910390fd5b611080611c2f565b61108b85858561216d565b915091506110996001606555565b935093915050565b60606110cc7f0000000000000000000000000000000000000000000000000000000000000000612331565b905090565b6110d9611a95565b6110e35f19611b38565b565b60cb546001600160a01b03163314611110576040516320ba3ff960e21b815260040160405180910390fd5b611118611c2f565b805f5b8181101561122c5760d15f858584818110611138576111386135ca565b905060200201602081019061114d91906132d7565b6001600160a01b0316815260208101919091526040015f205460ff1661122457600160d15f868685818110611184576111846135ca565b905060200201602081019061119991906132d7565b6001600160a01b0316815260208101919091526040015f20805460ff19169115159190911790557f0c35b17d91c96eb2751cd456e1252f42a386e524ef9ff26ecc9950859fdc04fe8484838181106111f3576111f36135ca565b905060200201602081019061120891906132d7565b6040516001600160a01b03909116815260200160405180910390a15b60010161111b565b50506106da6001606555565b61124061236e565b6110e35f611b75565b5f336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146112935760405163f739589b60e01b815260040160405180910390fd5b61129b611c2f565b6108a38484846123c8565b5f806112eb8360d7836112c161099b368b90038b018b61356e565b81526020019081526020015f205f8781526020019081526020015f20611eff90919063ffffffff16565b9695505050505050565b606061132160da5f61130f61099b3687900387018761356e565b81526020019081526020015f206124d5565b92915050565b5f6108af60d78261134061099b3688900388018861356e565b81526020019081526020015f205f8481526020019081526020015f2061210d565b606061136b611c2f565b5f6113a560d78261138461099b3689900389018961356e565b81526020019081526020015f205f8581526020019081526020015f20611ef3565b80519091505f816001600160401b038111156113c3576113c36130c2565b6040519080825280602002602001820160405280156113ec578160200160208202803683370190505b5090505f5b82811015611489576114648787868481518110611410576114106135ca565b60200260200101517f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316630f3df50e8c6040518263ffffffff1660e01b815260040161085f919061350a565b828281518110611476576114766135ca565b60209081029190910101526001016113f1565b50925050506113216001606555565b6001600160a01b0381165f90815260ce6020526040812054606091829190816001600160401b038111156114ce576114ce6130c2565b6040519080825280602002602001820160405280156114f7578160200160208202803683370190505b5090505f5b82811015611585576001600160a01b0386165f90815260cd6020908152604080832060ce909252822080549192918490811061153a5761153a6135ca565b5f9182526020808320909101546001600160a01b031683528201929092526040019020548251839083908110611572576115726135ca565b60209081029190910101526001016114fc565b5060ce5f866001600160a01b03166001600160a01b031681526020019081526020015f2081818054806020026020016040519081016040528092919081815260200182805480156115fd57602002820191905f5260205f20905b81546001600160a01b031681526001909101906020018083116115df575b50505050509150935093505050915091565b604080517f4337f82d142e41f2a8c10547cd8c859bddb92262a61058e77842e24d9dea922460208201526001600160a01b03808916928201929092528187166060820152908516608082015260a0810184905260c0810183905260e081018290525f906116959061010001604051602081830303815290604052805190602001206124e1565b979650505050505050565b60cb546001600160a01b031633146116cb576040516320ba3ff960e21b815260040160405180910390fd5b6116d3611c2f565b805f5b8181101561122c5760d15f8585848181106116f3576116f36135ca565b905060200201602081019061170891906132d7565b6001600160a01b0316815260208101919091526040015f205460ff16156117df575f60d15f86868581811061173f5761173f6135ca565b905060200201602081019061175491906132d7565b6001600160a01b0316815260208101919091526040015f20805460ff19169115159190911790557f4074413b4b443e4e58019f2855a8765113358c7c72e39509c6af45fc0f5ba0308484838181106117ae576117ae6135ca565b90506020020160208101906117c391906132d7565b6040516001600160a01b03909116815260200160405180910390a15b6001016116d6565b6117ef61236e565b6117f7611c2f565b61180081611bc6565b61102a6001606555565b60ce602052815f5260405f208181548110611823575f80fd5b5f918252602090912001546001600160a01b03169150829050565b6001600160a01b0381165f90815260ce60209081526040918290208054835181840281018401909452808452606093928301828280156118a557602002820191905f5260205f20905b81546001600160a01b03168152600190910190602001808311611887575b50505050509050919050565b5f5f6118bc81611f23565b6118c4611c2f565b6118d033868686611fa0565b91506118dc6001606555565b509392505050565b6118ec61236e565b6001600160a01b0381166119515760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610774565b61102a81611b75565b60408051808201909152600a81526922b4b3b2b72630bcb2b960b11b6020909101525f7f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f7f71b625cfad44bac63b13dba07f2e1d6084ee04b6f8752101ece6126d584ee6ea6119c7612527565b805160209182012060408051928301949094529281019190915260608101919091524660808201523060a082015260c00160405160208183030381529060405280519060200120905090565b611a1b61259c565b60985480198219811614611a425760405163c61dca5d60e01b815260040160405180910390fd5b609882905560405182815233907f3582d1828e26bf56bd801502bc021ac0bc8afb57c826e4986b45593c8fad389c9060200160405180910390a25050565b5f5f611a8d60d484611eff565b949350505050565b60405163237dfb4760e11b81523360048201527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906346fbf68e90602401602060405180830381865afa158015611af7573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611b1b9190613610565b6110e357604051631d77d47760e21b815260040160405180910390fd5b609881905560405181815233907fab40a374bc51de372200a8bc981af8c9ecdc08dfdaef0bb6e09f88f3c616ef3d9060200160405180910390a250565b603380546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a35050565b60cb54604080516001600160a01b03928316815291831660208301527f4264275e593955ff9d6146a51a4525f6ddace2e81db9391abcc9d1ca48047d29910160405180910390a160cb80546001600160a01b0319166001600160a01b0392909216919091179055565b600260655403611c815760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401610774565b6002606555565b5f8060d781611c9f61099b368a90038a018a61356e565b815260208082019290925260409081015f90812088825290925281209150611cc78286611eff565b9150611cd590508286612159565b505f8115611dec57856001600160a01b031663d9caed1286886001600160a01b0316632495a5996040518163ffffffff1660e01b8152600401602060405180830381865afa158015611d29573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611d4d9190613518565b856040518463ffffffff1660e01b8152600401611d6c93929190613533565b6020604051808303815f875af1158015611d88573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611dac9190613557565b90507fe6413aa0c789e437b0a06bf64b20926584f066c79a2d8b80a759c85472f7b0af88888885604051611de394939291906135de565b60405180910390a15b5f611df684611ef3565b519050805f03611e8457611e348860da5f611e1961099b368f90038f018f61356e565b81526020019081526020015f2061264d90919063ffffffff16565b50611e5f60da5f611e4d61099b368e90038e018e61356e565b81526020019081526020015f20612125565b5f03611e8457611e82611e7a61099b368c90038c018c61356e565b60d89061264d565b505b50979650505050505050565b5f815f0151826020015163ffffffff16604051602001611edb92919060609290921b6bffffffffffffffffffffffff1916825260a01b6001600160a01b031916601482015260200190565b6040516020818303038152906040526113219061362f565b60605f6108af83612658565b5f808080611f16866001600160a01b038716612663565b9097909650945050505050565b609854600160ff83161b9081160361102a5760405163840a48d560e01b815260040160405180910390fd5b42811015611f6f57604051630819bdcd60e01b815260040160405180910390fd5b611f836001600160a01b038516848461269b565b6107fe57604051638baa579f60e01b815260040160405180910390fd5b6001600160a01b0383165f90815260d16020526040812054849060ff16611fda57604051632efd965160e11b815260040160405180910390fd5b611fef6001600160a01b0385163387866126ef565b6040516311f9fbc960e21b81526001600160a01b038581166004830152602482018590528616906347e7ef24906044016020604051808303815f875af115801561203b573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061205f9190613557565b91505f5f61206e88888661216d565b604051631e328e7960e11b81526001600160a01b038b811660048301528a8116602483015260448201849052606482018390529294509092507f000000000000000000000000000000000000000000000000000000000000000090911690633c651cf2906084015f604051808303815f87803b1580156120ec575f5ffd5b505af11580156120fe573d5f5f3e3d5ffd5b50505050505050949350505050565b5f61132182612747565b5f808080611f168686612751565b5f611321825490565b5f6108af838361277a565b5f611a8d846001600160a01b038516846127a0565b5f6108af83836127bc565b5f6108af836001600160a01b038416612808565b5f806001600160a01b038516612196576040516316f2ccc960e01b815260040160405180910390fd5b825f036121b6576040516342061b2560e11b815260040160405180910390fd5b60405162e7c78560e71b81526001600160a01b038681166004830152602482018590528516906373e3c280906044015f604051808303815f87803b1580156121fc575f5ffd5b505af115801561220e573d5f5f3e3d5ffd5b5050506001600160a01b038087165f90815260cd6020908152604080832093891683529290529081205491508190036122b8576001600160a01b0386165f90815260ce60209081526040909120541061227a576040516301a1443960e31b815260040160405180910390fd5b6001600160a01b038681165f90815260ce602090815260408220805460018101825590835291200180546001600160a01b0319169187169190911790555b6122c28482613666565b6001600160a01b038088165f90815260cd60209081526040808320938a16835292905281902091909155517f5548c837ab068cf56a2c2479df0882a4922fd203edb7517321831d95078c5f629061231e90889088908890613533565b60405180910390a1959294509192505050565b60605f61233d83612824565b6040805160208082528183019092529192505f91906020820181803683375050509182525060208101929092525090565b6033546001600160a01b031633146110e35760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610774565b5f815f036123e9576040516342061b2560e11b815260040160405180910390fd5b6001600160a01b038085165f90815260cd60209081526040808320938716835292905220548083111561242f57604051634b18b19360e01b815260040160405180910390fd5b6040516303e3e6eb60e01b81526001600160a01b038681166004830152602482018590528516906303e3e6eb906044015f604051808303815f87803b158015612476575f5ffd5b505af1158015612488573d5f5f3e3d5ffd5b5050505082816124989190613679565b6001600160a01b038087165f90815260cd602090815260408083209389168352929052908120829055909150819003611a8d57611a8d858561284b565b60605f6108af836129c9565b5f6124ea61195a565b60405161190160f01b6020820152602281019190915260428101839052606201604051602081830303815290604052805190602001209050919050565b60605f6125537f0000000000000000000000000000000000000000000000000000000000000000612331565b9050805f81518110612567576125676135ca565b016020908101516040516001600160f81b03199091169181019190915260210160405160208183030381529060405291505090565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663eab66d7a6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156125f8573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061261c9190613518565b6001600160a01b0316336001600160a01b0316146110e35760405163794821ff60e01b815260040160405180910390fd5b5f6108af8383612a21565b6060611321826124d5565b5f818152600283016020526040812054819080612690576126848585612b04565b92505f9150610b099050565b600192509050610b09565b5f5f5f6126a88585612b0f565b90925090505f8160048111156126c0576126c061368c565b1480156126de5750856001600160a01b0316826001600160a01b0316145b806112eb57506112eb868686612b4e565b6107fe846323b872dd60e01b85858560405160240161271093929190613533565b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b031990931692909217909152612c35565b5f61132182612125565b5f808061275e858561212e565b5f81815260029690960160205260409095205494959350505050565b5f825f01828154811061278f5761278f6135ca565b905f5260205f200154905092915050565b5f8281526002840160205260408120829055611a8d848461214e565b5f81815260018301602052604081205461280157508154600181810184555f848152602080822090930184905584548482528286019093526040902091909155611321565b505f611321565b5f81815260028301602052604081208190556108af838361264d565b5f60ff8216601f81111561132157604051632cd44ac360e21b815260040160405180910390fd5b6001600160a01b0382165f90815260ce6020526040812054905b8181101561295d576001600160a01b038481165f90815260ce602052604090208054918516918390811061289b5761289b6135ca565b5f918252602090912001546001600160a01b031603612955576001600160a01b0384165f90815260ce6020526040902080546128d990600190613679565b815481106128e9576128e96135ca565b5f9182526020808320909101546001600160a01b03878116845260ce9092526040909220805491909216919083908110612925576129256135ca565b905f5260205f20015f6101000a8154816001600160a01b0302191690836001600160a01b0316021790555061295d565b600101612865565b81810361297d57604051632df15a4160e11b815260040160405180910390fd5b6001600160a01b0384165f90815260ce602052604090208054806129a3576129a36136a0565b5f8281526020902081015f1990810180546001600160a01b031916905501905550505050565b6060815f018054806020026020016040519081016040528092919081815260200182805480156118a557602002820191905f5260205f20905b815481526020019060010190808311612a025750505050509050919050565b5f8181526001830160205260408120548015612afb575f612a43600183613679565b85549091505f90612a5690600190613679565b9050818114612ab5575f865f018281548110612a7457612a746135ca565b905f5260205f200154905080875f018481548110612a9457612a946135ca565b5f918252602080832090910192909255918252600188019052604090208390555b8554869080612ac657612ac66136a0565b600190038181905f5260205f20015f90559055856001015f8681526020019081526020015f205f905560019350505050611321565b5f915050611321565b5f6108af8383612d0d565b5f5f8251604103612b43576020830151604084015160608501515f1a612b3787828585612d24565b94509450505050610b09565b505f90506002610b09565b5f5f5f856001600160a01b0316631626ba7e60e01b8686604051602401612b769291906136b4565b60408051601f198184030181529181526020820180516001600160e01b03166001600160e01b0319909416939093179092529051612bb491906136cc565b5f60405180830381855afa9150503d805f8114612bec576040519150601f19603f3d011682016040523d82523d5f602084013e612bf1565b606091505b5091509150818015612c0557506020815110155b80156112eb57508051630b135d3f60e11b90612c2a9083016020908101908401613557565b149695505050505050565b5f612c89826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b0316612de19092919063ffffffff16565b905080515f1480612ca9575080806020019051810190612ca99190613610565b612d085760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b6064820152608401610774565b505050565b5f81815260018301602052604081205415156108af565b5f807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a0831115612d5957505f90506003612dd8565b604080515f8082526020820180845289905260ff881692820192909252606081018690526080810185905260019060a0016020604051602081039080840390855afa158015612daa573d5f5f3e3d5ffd5b5050604051601f1901519150506001600160a01b038116612dd2575f60019250925050612dd8565b91505f90505b94509492505050565b6060611a8d84845f85855f5f866001600160a01b03168587604051612e0691906136cc565b5f6040518083038185875af1925050503d805f8114612e40576040519150601f19603f3d011682016040523d82523d5f602084013e612e45565b606091505b50915091506116958783838760608315612ebf5782515f03612eb8576001600160a01b0385163b612eb85760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610774565b5081611a8d565b611a8d8383815115612ed45781518083602001fd5b8060405162461bcd60e51b81526004016107749190613320565b5f60208284031215612efe575f5ffd5b5035919050565b6001600160a01b038116811461102a575f5ffd5b5f5f5f60608486031215612f2b575f5ffd5b8335612f3681612f05565b92506020840135612f4681612f05565b929592945050506040919091013590565b5f60408284031215612f67575f5ffd5b50919050565b5f5f5f60808486031215612f7f575f5ffd5b612f898585612f57565b9250604084013591506060840135612fa081612f05565b809150509250925092565b5f5f5f5f60808587031215612fbe575f5ffd5b8435612fc981612f05565b93506020850135612fd981612f05565b92506040850135612fe981612f05565b9396929550929360600135925050565b5f5f6060838503121561300a575f5ffd5b6130148484612f57565b946040939093013593505050565b5f8151808452602084019350602083015f5b8281101561305b5781516001600160a01b0316865260209586019590910190600101613034565b5093949350505050565b5f8151808452602084019350602083015f5b8281101561305b578151865260209586019590910190600101613077565b604081525f6130a76040830185613022565b82810360208401526130b98185613065565b95945050505050565b634e487b7160e01b5f52604160045260245ffd5b604051601f8201601f191681016001600160401b03811182821017156130fe576130fe6130c2565b604052919050565b5f5f5f5f5f5f60c0878903121561311b575f5ffd5b863561312681612f05565b9550602087013561313681612f05565b945060408701359350606087013561314d81612f05565b92506080870135915060a08701356001600160401b0381111561316e575f5ffd5b8701601f8101891361317e575f5ffd5b80356001600160401b03811115613197576131976130c2565b6131aa601f8201601f19166020016130d6565b8181528a60208385010111156131be575f5ffd5b816020840160208301375f602083830101528093505050509295509295509295565b604080825283519082018190525f9060208501906060840190835b818110156132225783516001600160a01b03168352602093840193909201916001016131fb565b505083810360208501526112eb8186613065565b602080825282518282018190525f918401906040840190835b8181101561328857835180516001600160a01b0316845260209081015163ffffffff16818501529093019260409092019160010161324f565b509095945050505050565b5f5f5f5f60a085870312156132a6575f5ffd5b6132b08686612f57565b93506040850135925060608501356132c781612f05565b9396929550929360800135925050565b5f602082840312156132e7575f5ffd5b81356108af81612f05565b5f81518084528060208401602086015e5f602082860101526020601f19601f83011685010191505092915050565b602081525f6108af60208301846132f2565b5f60208284031215613342575f5ffd5b813560ff811681146108af575f5ffd5b5f5f60208385031215613363575f5ffd5b82356001600160401b03811115613378575f5ffd5b8301601f81018513613388575f5ffd5b80356001600160401b0381111561339d575f5ffd5b8560208260051b84010111156133b1575f5ffd5b6020919091019590945092505050565b5f604082840312156133d1575f5ffd5b6108af8383612f57565b602081525f6108af6020830184613065565b5f5f5f5f5f5f60c08789031215613402575f5ffd5b863561340d81612f05565b9550602087013561341d81612f05565b9450604087013561342d81612f05565b959894975094956060810135955060808101359460a0909101359350915050565b5f5f6040838503121561345f575f5ffd5b823561346a81612f05565b946020939093013593505050565b602081525f6108af6020830184613022565b5f5f6040838503121561349b575f5ffd5b82356134a681612f05565b915060208301356134b681612f05565b809150509250929050565b803563ffffffff811681146134d4575f5ffd5b919050565b80356134e481612f05565b6001600160a01b0316825263ffffffff613500602083016134c1565b1660208301525050565b6040810161132182846134d9565b5f60208284031215613528575f5ffd5b81516108af81612f05565b6001600160a01b039384168152919092166020820152604081019190915260600190565b5f60208284031215613567575f5ffd5b5051919050565b5f604082840312801561357f575f5ffd5b50604080519081016001600160401b03811182821017156135a2576135a26130c2565b60405282356135b081612f05565b81526135be602084016134c1565b60208201529392505050565b634e487b7160e01b5f52603260045260245ffd5b60a081016135ec82876134d9565b60408201949094526001600160a01b03929092166060830152608090910152919050565b5f60208284031215613620575f5ffd5b815180151581146108af575f5ffd5b80516020808301519190811015612f67575f1960209190910360031b1b16919050565b634e487b7160e01b5f52601160045260245ffd5b8082018082111561132157611321613652565b8181038181111561132157611321613652565b634e487b7160e01b5f52602160045260245ffd5b634e487b7160e01b5f52603160045260245ffd5b828152604060208201525f611a8d60408301846132f2565b5f82518060208501845e5f92019182525091905056fea2646970667358221220134e029ec88d5f404017f834ec41b61634d04ea93225d88bbce45d6d5a7b89d064736f6c634300081e0033",
}
⋮----
// StrategyManagerABI is the input ABI used to generate the binding from.
// Deprecated: Use StrategyManagerMetaData.ABI instead.
var StrategyManagerABI = StrategyManagerMetaData.ABI
⋮----
// StrategyManagerBin is the compiled bytecode used for deploying new contracts.
// Deprecated: Use StrategyManagerMetaData.Bin instead.
var StrategyManagerBin = StrategyManagerMetaData.Bin
⋮----
// DeployStrategyManager deploys a new Ethereum contract, binding an instance of StrategyManager to it.
func DeployStrategyManager(auth *bind.TransactOpts, backend bind.ContractBackend, _allocationManager common.Address, _delegation common.Address, _pauserRegistry common.Address, _version string) (common.Address, *types.Transaction, *StrategyManager, error)
⋮----
// StrategyManager is an auto generated Go binding around an Ethereum contract.
type StrategyManager struct {
	StrategyManagerCaller     // Read-only binding to the contract
	StrategyManagerTransactor // Write-only binding to the contract
	StrategyManagerFilterer   // Log filterer for contract events
}
⋮----
StrategyManagerCaller     // Read-only binding to the contract
StrategyManagerTransactor // Write-only binding to the contract
StrategyManagerFilterer   // Log filterer for contract events
⋮----
// StrategyManagerCaller is an auto generated read-only Go binding around an Ethereum contract.
type StrategyManagerCaller struct {
	contract *bind.BoundContract // Generic contract wrapper for the low level calls
}
⋮----
contract *bind.BoundContract // Generic contract wrapper for the low level calls
⋮----
// StrategyManagerTransactor is an auto generated write-only Go binding around an Ethereum contract.
type StrategyManagerTransactor struct {
	contract *bind.BoundContract // Generic contract wrapper for the low level calls
}
⋮----
// StrategyManagerFilterer is an auto generated log filtering Go binding around an Ethereum contract events.
type StrategyManagerFilterer struct {
	contract *bind.BoundContract // Generic contract wrapper for the low level calls
}
⋮----
// StrategyManagerSession is an auto generated Go binding around an Ethereum contract,
// with pre-set call and transact options.
type StrategyManagerSession struct {
	Contract     *StrategyManager  // 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
}
⋮----
Contract     *StrategyManager  // 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
⋮----
// StrategyManagerCallerSession is an auto generated read-only Go binding around an Ethereum contract,
// with pre-set call options.
type StrategyManagerCallerSession struct {
	Contract *StrategyManagerCaller // Generic contract caller binding to set the session for
	CallOpts bind.CallOpts          // Call options to use throughout this session
}
⋮----
Contract *StrategyManagerCaller // Generic contract caller binding to set the session for
CallOpts bind.CallOpts          // Call options to use throughout this session
⋮----
// StrategyManagerTransactorSession is an auto generated write-only Go binding around an Ethereum contract,
// with pre-set transact options.
type StrategyManagerTransactorSession struct {
	Contract     *StrategyManagerTransactor // Generic contract transactor binding to set the session for
	TransactOpts bind.TransactOpts          // Transaction auth options to use throughout this session
}
⋮----
Contract     *StrategyManagerTransactor // Generic contract transactor binding to set the session for
TransactOpts bind.TransactOpts          // Transaction auth options to use throughout this session
⋮----
// StrategyManagerRaw is an auto generated low-level Go binding around an Ethereum contract.
type StrategyManagerRaw struct {
	Contract *StrategyManager // Generic contract binding to access the raw methods on
}
⋮----
Contract *StrategyManager // Generic contract binding to access the raw methods on
⋮----
// StrategyManagerCallerRaw is an auto generated low-level read-only Go binding around an Ethereum contract.
type StrategyManagerCallerRaw struct {
	Contract *StrategyManagerCaller // Generic read-only contract binding to access the raw methods on
}
⋮----
Contract *StrategyManagerCaller // Generic read-only contract binding to access the raw methods on
⋮----
// StrategyManagerTransactorRaw is an auto generated low-level write-only Go binding around an Ethereum contract.
type StrategyManagerTransactorRaw struct {
	Contract *StrategyManagerTransactor // Generic write-only contract binding to access the raw methods on
}
⋮----
Contract *StrategyManagerTransactor // Generic write-only contract binding to access the raw methods on
⋮----
// NewStrategyManager creates a new instance of StrategyManager, bound to a specific deployed contract.
func NewStrategyManager(address common.Address, backend bind.ContractBackend) (*StrategyManager, error)
⋮----
// NewStrategyManagerCaller creates a new read-only instance of StrategyManager, bound to a specific deployed contract.
func NewStrategyManagerCaller(address common.Address, caller bind.ContractCaller) (*StrategyManagerCaller, error)
⋮----
// NewStrategyManagerTransactor creates a new write-only instance of StrategyManager, bound to a specific deployed contract.
func NewStrategyManagerTransactor(address common.Address, transactor bind.ContractTransactor) (*StrategyManagerTransactor, error)
⋮----
// NewStrategyManagerFilterer creates a new log filterer instance of StrategyManager, bound to a specific deployed contract.
func NewStrategyManagerFilterer(address common.Address, filterer bind.ContractFilterer) (*StrategyManagerFilterer, error)
⋮----
// bindStrategyManager binds a generic wrapper to an already deployed contract.
func bindStrategyManager(address common.Address, caller bind.ContractCaller, transactor bind.ContractTransactor, filterer bind.ContractFilterer) (*bind.BoundContract, error)
⋮----
// 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 (_StrategyManager *StrategyManagerRaw) Call(opts *bind.CallOpts, result *[]interface
⋮----
// Transfer initiates a plain transaction to move funds to the contract, calling
// its default method if one is available.
func (_StrategyManager *StrategyManagerRaw) Transfer(opts *bind.TransactOpts) (*types.Transaction, error)
⋮----
// Transact invokes the (paid) contract method with params as input values.
func (_StrategyManager *StrategyManagerRaw) Transact(opts *bind.TransactOpts, method string, params ...interface
⋮----
// DEFAULTBURNADDRESS is a free data retrieval call binding the contract method 0xf3b4a000.
//
// Solidity: function DEFAULT_BURN_ADDRESS() view returns(address)
func (_StrategyManager *StrategyManagerCaller) DEFAULTBURNADDRESS(opts *bind.CallOpts) (common.Address, error)
⋮----
var out []interface{}
⋮----
// DEPOSITTYPEHASH is a free data retrieval call binding the contract method 0x48825e94.
⋮----
// Solidity: function DEPOSIT_TYPEHASH() view returns(bytes32)
func (_StrategyManager *StrategyManagerCaller) DEPOSITTYPEHASH(opts *bind.CallOpts) ([32]byte, error)
⋮----
// AllocationManager is a free data retrieval call binding the contract method 0xca8aa7c7.
⋮----
// Solidity: function allocationManager() view returns(address)
func (_StrategyManager *StrategyManagerCaller) AllocationManager(opts *bind.CallOpts) (common.Address, error)
⋮----
// CalculateStrategyDepositDigestHash is a free data retrieval call binding the contract method 0x9ac01d61.
⋮----
// Solidity: function calculateStrategyDepositDigestHash(address staker, address strategy, address token, uint256 amount, uint256 nonce, uint256 expiry) view returns(bytes32)
func (_StrategyManager *StrategyManagerCaller) CalculateStrategyDepositDigestHash(opts *bind.CallOpts, staker common.Address, strategy common.Address, token common.Address, amount *big.Int, nonce *big.Int, expiry *big.Int) ([32]byte, error)
⋮----
// Delegation is a free data retrieval call binding the contract method 0xdf5cf723.
⋮----
// Solidity: function delegation() view returns(address)
func (_StrategyManager *StrategyManagerCaller) Delegation(opts *bind.CallOpts) (common.Address, error)
⋮----
// DomainSeparator is a free data retrieval call binding the contract method 0xf698da25.
⋮----
// Solidity: function domainSeparator() view returns(bytes32)
func (_StrategyManager *StrategyManagerCaller) DomainSeparator(opts *bind.CallOpts) ([32]byte, error)
⋮----
// GetBurnOrRedistributableCount is a free data retrieval call binding the contract method 0x829fca73.
⋮----
// Solidity: function getBurnOrRedistributableCount((address,uint32) operatorSet, uint256 slashId) view returns(uint256)
func (_StrategyManager *StrategyManagerCaller) GetBurnOrRedistributableCount(opts *bind.CallOpts, operatorSet OperatorSet, slashId *big.Int) (*big.Int, error)
⋮----
// GetBurnOrRedistributableShares is a free data retrieval call binding the contract method 0x31f8fb4c.
⋮----
// Solidity: function getBurnOrRedistributableShares((address,uint32) operatorSet, uint256 slashId) view returns(address[], uint256[])
func (_StrategyManager *StrategyManagerCaller) GetBurnOrRedistributableShares(opts *bind.CallOpts, operatorSet OperatorSet, slashId *big.Int) ([]common.Address, []*big.Int, error)
⋮----
// GetBurnOrRedistributableShares0 is a free data retrieval call binding the contract method 0x76fb162b.
⋮----
// Solidity: function getBurnOrRedistributableShares((address,uint32) operatorSet, uint256 slashId, address strategy) view returns(uint256)
func (_StrategyManager *StrategyManagerCaller) GetBurnOrRedistributableShares0(opts *bind.CallOpts, operatorSet OperatorSet, slashId *big.Int, strategy common.Address) (*big.Int, error)
⋮----
// GetBurnableShares is a free data retrieval call binding the contract method 0xfd980423.
⋮----
// Solidity: function getBurnableShares(address strategy) view returns(uint256)
func (_StrategyManager *StrategyManagerCaller) GetBurnableShares(opts *bind.CallOpts, strategy common.Address) (*big.Int, error)
⋮----
// GetDeposits is a free data retrieval call binding the contract method 0x94f649dd.
⋮----
// Solidity: function getDeposits(address staker) view returns(address[], uint256[])
func (_StrategyManager *StrategyManagerCaller) GetDeposits(opts *bind.CallOpts, staker common.Address) ([]common.Address, []*big.Int, error)
⋮----
// GetPendingOperatorSets is a free data retrieval call binding the contract method 0x3f292b08.
⋮----
// Solidity: function getPendingOperatorSets() view returns((address,uint32)[])
func (_StrategyManager *StrategyManagerCaller) GetPendingOperatorSets(opts *bind.CallOpts) ([]OperatorSet, error)
⋮----
// GetPendingSlashIds is a free data retrieval call binding the contract method 0x7def1564.
⋮----
// Solidity: function getPendingSlashIds((address,uint32) operatorSet) view returns(uint256[])
func (_StrategyManager *StrategyManagerCaller) GetPendingSlashIds(opts *bind.CallOpts, operatorSet OperatorSet) ([]*big.Int, error)
⋮----
// GetStakerStrategyList is a free data retrieval call binding the contract method 0xde44acb6.
⋮----
// Solidity: function getStakerStrategyList(address staker) view returns(address[])
func (_StrategyManager *StrategyManagerCaller) GetStakerStrategyList(opts *bind.CallOpts, staker common.Address) ([]common.Address, error)
⋮----
// GetStrategiesWithBurnableShares is a free data retrieval call binding the contract method 0x36a8c500.
⋮----
// Solidity: function getStrategiesWithBurnableShares() view returns(address[], uint256[])
func (_StrategyManager *StrategyManagerCaller) GetStrategiesWithBurnableShares(opts *bind.CallOpts) ([]common.Address, []*big.Int, error)
⋮----
// Nonces is a free data retrieval call binding the contract method 0x7ecebe00.
⋮----
// Solidity: function nonces(address signer) view returns(uint256 nonce)
func (_StrategyManager *StrategyManagerCaller) Nonces(opts *bind.CallOpts, signer common.Address) (*big.Int, error)
⋮----
// Owner is a free data retrieval call binding the contract method 0x8da5cb5b.
⋮----
// Solidity: function owner() view returns(address)
func (_StrategyManager *StrategyManagerCaller) Owner(opts *bind.CallOpts) (common.Address, error)
⋮----
// Paused is a free data retrieval call binding the contract method 0x5ac86ab7.
⋮----
// Solidity: function paused(uint8 index) view returns(bool)
func (_StrategyManager *StrategyManagerCaller) Paused(opts *bind.CallOpts, index uint8) (bool, error)
⋮----
// Paused0 is a free data retrieval call binding the contract method 0x5c975abb.
⋮----
// Solidity: function paused() view returns(uint256)
func (_StrategyManager *StrategyManagerCaller) Paused0(opts *bind.CallOpts) (*big.Int, error)
⋮----
// PauserRegistry is a free data retrieval call binding the contract method 0x886f1195.
⋮----
// Solidity: function pauserRegistry() view returns(address)
func (_StrategyManager *StrategyManagerCaller) PauserRegistry(opts *bind.CallOpts) (common.Address, error)
⋮----
// StakerDepositShares is a free data retrieval call binding the contract method 0xfe243a17.
⋮----
// Solidity: function stakerDepositShares(address staker, address strategy) view returns(uint256 shares)
func (_StrategyManager *StrategyManagerCaller) StakerDepositShares(opts *bind.CallOpts, staker common.Address, strategy common.Address) (*big.Int, error)
⋮----
// StakerStrategyList is a free data retrieval call binding the contract method 0xcbc2bd62.
⋮----
// Solidity: function stakerStrategyList(address staker, uint256 ) view returns(address strategies)
func (_StrategyManager *StrategyManagerCaller) StakerStrategyList(opts *bind.CallOpts, staker common.Address, arg1 *big.Int) (common.Address, error)
⋮----
// StakerStrategyListLength is a free data retrieval call binding the contract method 0x8b8aac3c.
⋮----
// Solidity: function stakerStrategyListLength(address staker) view returns(uint256)
func (_StrategyManager *StrategyManagerCaller) StakerStrategyListLength(opts *bind.CallOpts, staker common.Address) (*big.Int, error)
⋮----
// StrategyIsWhitelistedForDeposit is a free data retrieval call binding the contract method 0x663c1de4.
⋮----
// Solidity: function strategyIsWhitelistedForDeposit(address strategy) view returns(bool whitelisted)
func (_StrategyManager *StrategyManagerCaller) StrategyIsWhitelistedForDeposit(opts *bind.CallOpts, strategy common.Address) (bool, error)
⋮----
// StrategyWhitelister is a free data retrieval call binding the contract method 0x967fc0d2.
⋮----
// Solidity: function strategyWhitelister() view returns(address)
func (_StrategyManager *StrategyManagerCaller) StrategyWhitelister(opts *bind.CallOpts) (common.Address, error)
⋮----
// Version is a free data retrieval call binding the contract method 0x54fd4d50.
⋮----
// Solidity: function version() view returns(string)
func (_StrategyManager *StrategyManagerCaller) Version(opts *bind.CallOpts) (string, error)
⋮----
// AddShares is a paid mutator transaction binding the contract method 0x50ff7225.
⋮----
// Solidity: function addShares(address staker, address strategy, uint256 shares) returns(uint256, uint256)
func (_StrategyManager *StrategyManagerTransactor) AddShares(opts *bind.TransactOpts, staker common.Address, strategy common.Address, shares *big.Int) (*types.Transaction, error)
⋮----
// AddStrategiesToDepositWhitelist is a paid mutator transaction binding the contract method 0x5de08ff2.
⋮----
// Solidity: function addStrategiesToDepositWhitelist(address[] strategiesToWhitelist) returns()
func (_StrategyManager *StrategyManagerTransactor) AddStrategiesToDepositWhitelist(opts *bind.TransactOpts, strategiesToWhitelist []common.Address) (*types.Transaction, error)
⋮----
// BurnShares is a paid mutator transaction binding the contract method 0x4b6d5d6e.
⋮----
// Solidity: function burnShares(address strategy) returns()
func (_StrategyManager *StrategyManagerTransactor) BurnShares(opts *bind.TransactOpts, strategy common.Address) (*types.Transaction, error)
⋮----
// ClearBurnOrRedistributableShares is a paid mutator transaction binding the contract method 0x88c10299.
⋮----
// Solidity: function clearBurnOrRedistributableShares((address,uint32) operatorSet, uint256 slashId) returns(uint256[])
func (_StrategyManager *StrategyManagerTransactor) ClearBurnOrRedistributableShares(opts *bind.TransactOpts, operatorSet OperatorSet, slashId *big.Int) (*types.Transaction, error)
⋮----
// ClearBurnOrRedistributableSharesByStrategy is a paid mutator transaction binding the contract method 0x2d44def6.
⋮----
// Solidity: function clearBurnOrRedistributableSharesByStrategy((address,uint32) operatorSet, uint256 slashId, address strategy) returns(uint256)
func (_StrategyManager *StrategyManagerTransactor) ClearBurnOrRedistributableSharesByStrategy(opts *bind.TransactOpts, operatorSet OperatorSet, slashId *big.Int, strategy common.Address) (*types.Transaction, error)
⋮----
// DepositIntoStrategy is a paid mutator transaction binding the contract method 0xe7a050aa.
⋮----
// Solidity: function depositIntoStrategy(address strategy, address token, uint256 amount) returns(uint256 depositShares)
func (_StrategyManager *StrategyManagerTransactor) DepositIntoStrategy(opts *bind.TransactOpts, strategy common.Address, token common.Address, amount *big.Int) (*types.Transaction, error)
⋮----
// DepositIntoStrategyWithSignature is a paid mutator transaction binding the contract method 0x32e89ace.
⋮----
// Solidity: function depositIntoStrategyWithSignature(address strategy, address token, uint256 amount, address staker, uint256 expiry, bytes signature) returns(uint256 depositShares)
func (_StrategyManager *StrategyManagerTransactor) DepositIntoStrategyWithSignature(opts *bind.TransactOpts, strategy common.Address, token common.Address, amount *big.Int, staker common.Address, expiry *big.Int, signature []byte) (*types.Transaction, error)
⋮----
// IncreaseBurnOrRedistributableShares is a paid mutator transaction binding the contract method 0x3fb99ca5.
⋮----
// Solidity: function increaseBurnOrRedistributableShares((address,uint32) operatorSet, uint256 slashId, address strategy, uint256 sharesToBurn) returns()
func (_StrategyManager *StrategyManagerTransactor) IncreaseBurnOrRedistributableShares(opts *bind.TransactOpts, operatorSet OperatorSet, slashId *big.Int, strategy common.Address, sharesToBurn *big.Int) (*types.Transaction, error)
⋮----
// Initialize is a paid mutator transaction binding the contract method 0x1794bb3c.
⋮----
// Solidity: function initialize(address initialOwner, address initialStrategyWhitelister, uint256 initialPausedStatus) returns()
func (_StrategyManager *StrategyManagerTransactor) Initialize(opts *bind.TransactOpts, initialOwner common.Address, initialStrategyWhitelister common.Address, initialPausedStatus *big.Int) (*types.Transaction, error)
⋮----
// Pause is a paid mutator transaction binding the contract method 0x136439dd.
⋮----
// Solidity: function pause(uint256 newPausedStatus) returns()
func (_StrategyManager *StrategyManagerTransactor) Pause(opts *bind.TransactOpts, newPausedStatus *big.Int) (*types.Transaction, error)
⋮----
// PauseAll is a paid mutator transaction binding the contract method 0x595c6a67.
⋮----
// Solidity: function pauseAll() returns()
func (_StrategyManager *StrategyManagerTransactor) PauseAll(opts *bind.TransactOpts) (*types.Transaction, error)
⋮----
// RemoveDepositShares is a paid mutator transaction binding the contract method 0x724af423.
⋮----
// Solidity: function removeDepositShares(address staker, address strategy, uint256 depositSharesToRemove) returns(uint256)
func (_StrategyManager *StrategyManagerTransactor) RemoveDepositShares(opts *bind.TransactOpts, staker common.Address, strategy common.Address, depositSharesToRemove *big.Int) (*types.Transaction, error)
⋮----
// RemoveStrategiesFromDepositWhitelist is a paid mutator transaction binding the contract method 0xb5d8b5b8.
⋮----
// Solidity: function removeStrategiesFromDepositWhitelist(address[] strategiesToRemoveFromWhitelist) returns()
func (_StrategyManager *StrategyManagerTransactor) RemoveStrategiesFromDepositWhitelist(opts *bind.TransactOpts, strategiesToRemoveFromWhitelist []common.Address) (*types.Transaction, error)
⋮----
// RenounceOwnership is a paid mutator transaction binding the contract method 0x715018a6.
⋮----
// Solidity: function renounceOwnership() returns()
func (_StrategyManager *StrategyManagerTransactor) RenounceOwnership(opts *bind.TransactOpts) (*types.Transaction, error)
⋮----
// SetStrategyWhitelister is a paid mutator transaction binding the contract method 0xc6656702.
⋮----
// Solidity: function setStrategyWhitelister(address newStrategyWhitelister) returns()
func (_StrategyManager *StrategyManagerTransactor) SetStrategyWhitelister(opts *bind.TransactOpts, newStrategyWhitelister common.Address) (*types.Transaction, error)
⋮----
// TransferOwnership is a paid mutator transaction binding the contract method 0xf2fde38b.
⋮----
// Solidity: function transferOwnership(address newOwner) returns()
func (_StrategyManager *StrategyManagerTransactor) TransferOwnership(opts *bind.TransactOpts, newOwner common.Address) (*types.Transaction, error)
⋮----
// Unpause is a paid mutator transaction binding the contract method 0xfabc1cbc.
⋮----
// Solidity: function unpause(uint256 newPausedStatus) returns()
func (_StrategyManager *StrategyManagerTransactor) Unpause(opts *bind.TransactOpts, newPausedStatus *big.Int) (*types.Transaction, error)
⋮----
// WithdrawSharesAsTokens is a paid mutator transaction binding the contract method 0x2eae418c.
⋮----
// Solidity: function withdrawSharesAsTokens(address staker, address strategy, address token, uint256 shares) returns()
func (_StrategyManager *StrategyManagerTransactor) WithdrawSharesAsTokens(opts *bind.TransactOpts, staker common.Address, strategy common.Address, token common.Address, shares *big.Int) (*types.Transaction, error)
⋮----
// StrategyManagerBurnOrRedistributableSharesDecreasedIterator is returned from FilterBurnOrRedistributableSharesDecreased and is used to iterate over the raw logs and unpacked data for BurnOrRedistributableSharesDecreased events raised by the StrategyManager contract.
type StrategyManagerBurnOrRedistributableSharesDecreasedIterator struct {
	Event *StrategyManagerBurnOrRedistributableSharesDecreased // 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
}
⋮----
Event *StrategyManagerBurnOrRedistributableSharesDecreased // 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 *StrategyManagerBurnOrRedistributableSharesDecreasedIterator) Next() bool
⋮----
// If the iterator failed, stop iterating
⋮----
// If the iterator completed, deliver directly whatever's available
⋮----
// Iterator still in progress, wait for either a data or an error event
⋮----
// Error returns any retrieval or parsing error occurred during filtering.
func (it *StrategyManagerBurnOrRedistributableSharesDecreasedIterator) Error() error
⋮----
// Close terminates the iteration process, releasing any pending underlying
// resources.
func (it *StrategyManagerBurnOrRedistributableSharesDecreasedIterator) Close() error
⋮----
// StrategyManagerBurnOrRedistributableSharesDecreased represents a BurnOrRedistributableSharesDecreased event raised by the StrategyManager contract.
type StrategyManagerBurnOrRedistributableSharesDecreased struct {
	OperatorSet OperatorSet
	SlashId     *big.Int
	Strategy    common.Address
	Shares      *big.Int
	Raw         types.Log // Blockchain specific contextual infos
}
⋮----
Raw         types.Log // Blockchain specific contextual infos
⋮----
// FilterBurnOrRedistributableSharesDecreased is a free log retrieval operation binding the contract event 0xe6413aa0c789e437b0a06bf64b20926584f066c79a2d8b80a759c85472f7b0af.
⋮----
// Solidity: event BurnOrRedistributableSharesDecreased((address,uint32) operatorSet, uint256 slashId, address strategy, uint256 shares)
func (_StrategyManager *StrategyManagerFilterer) FilterBurnOrRedistributableSharesDecreased(opts *bind.FilterOpts) (*StrategyManagerBurnOrRedistributableSharesDecreasedIterator, error)
⋮----
// WatchBurnOrRedistributableSharesDecreased is a free log subscription operation binding the contract event 0xe6413aa0c789e437b0a06bf64b20926584f066c79a2d8b80a759c85472f7b0af.
⋮----
func (_StrategyManager *StrategyManagerFilterer) WatchBurnOrRedistributableSharesDecreased(opts *bind.WatchOpts, sink chan<- *StrategyManagerBurnOrRedistributableSharesDecreased) (event.Subscription, error)
⋮----
// New log arrived, parse the event and forward to the user
⋮----
// ParseBurnOrRedistributableSharesDecreased is a log parse operation binding the contract event 0xe6413aa0c789e437b0a06bf64b20926584f066c79a2d8b80a759c85472f7b0af.
⋮----
func (_StrategyManager *StrategyManagerFilterer) ParseBurnOrRedistributableSharesDecreased(log types.Log) (*StrategyManagerBurnOrRedistributableSharesDecreased, error)
⋮----
// StrategyManagerBurnOrRedistributableSharesIncreasedIterator is returned from FilterBurnOrRedistributableSharesIncreased and is used to iterate over the raw logs and unpacked data for BurnOrRedistributableSharesIncreased events raised by the StrategyManager contract.
type StrategyManagerBurnOrRedistributableSharesIncreasedIterator struct {
	Event *StrategyManagerBurnOrRedistributableSharesIncreased // 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
}
⋮----
Event *StrategyManagerBurnOrRedistributableSharesIncreased // Event containing the contract specifics and raw log
⋮----
// StrategyManagerBurnOrRedistributableSharesIncreased represents a BurnOrRedistributableSharesIncreased event raised by the StrategyManager contract.
type StrategyManagerBurnOrRedistributableSharesIncreased struct {
	OperatorSet OperatorSet
	SlashId     *big.Int
	Strategy    common.Address
	Shares      *big.Int
	Raw         types.Log // Blockchain specific contextual infos
}
⋮----
// FilterBurnOrRedistributableSharesIncreased is a free log retrieval operation binding the contract event 0x5f5209798bbac45a16d2dc3bc67319fab26ee00153916d6f07b69f8a134a1e8b.
⋮----
// Solidity: event BurnOrRedistributableSharesIncreased((address,uint32) operatorSet, uint256 slashId, address strategy, uint256 shares)
func (_StrategyManager *StrategyManagerFilterer) FilterBurnOrRedistributableSharesIncreased(opts *bind.FilterOpts) (*StrategyManagerBurnOrRedistributableSharesIncreasedIterator, error)
⋮----
// WatchBurnOrRedistributableSharesIncreased is a free log subscription operation binding the contract event 0x5f5209798bbac45a16d2dc3bc67319fab26ee00153916d6f07b69f8a134a1e8b.
⋮----
func (_StrategyManager *StrategyManagerFilterer) WatchBurnOrRedistributableSharesIncreased(opts *bind.WatchOpts, sink chan<- *StrategyManagerBurnOrRedistributableSharesIncreased) (event.Subscription, error)
⋮----
// ParseBurnOrRedistributableSharesIncreased is a log parse operation binding the contract event 0x5f5209798bbac45a16d2dc3bc67319fab26ee00153916d6f07b69f8a134a1e8b.
⋮----
func (_StrategyManager *StrategyManagerFilterer) ParseBurnOrRedistributableSharesIncreased(log types.Log) (*StrategyManagerBurnOrRedistributableSharesIncreased, error)
⋮----
// StrategyManagerBurnableSharesDecreasedIterator is returned from FilterBurnableSharesDecreased and is used to iterate over the raw logs and unpacked data for BurnableSharesDecreased events raised by the StrategyManager contract.
type StrategyManagerBurnableSharesDecreasedIterator struct {
	Event *StrategyManagerBurnableSharesDecreased // 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
}
⋮----
Event *StrategyManagerBurnableSharesDecreased // Event containing the contract specifics and raw log
⋮----
// StrategyManagerBurnableSharesDecreased represents a BurnableSharesDecreased event raised by the StrategyManager contract.
type StrategyManagerBurnableSharesDecreased struct {
	Strategy common.Address
	Shares   *big.Int
	Raw      types.Log // Blockchain specific contextual infos
}
⋮----
Raw      types.Log // Blockchain specific contextual infos
⋮----
// FilterBurnableSharesDecreased is a free log retrieval operation binding the contract event 0xd9d082c3ec4f3a3ffa55c324939a06407f5fbcb87d5e0ce3b9508c92c84ed839.
⋮----
// Solidity: event BurnableSharesDecreased(address strategy, uint256 shares)
func (_StrategyManager *StrategyManagerFilterer) FilterBurnableSharesDecreased(opts *bind.FilterOpts) (*StrategyManagerBurnableSharesDecreasedIterator, error)
⋮----
// WatchBurnableSharesDecreased is a free log subscription operation binding the contract event 0xd9d082c3ec4f3a3ffa55c324939a06407f5fbcb87d5e0ce3b9508c92c84ed839.
⋮----
func (_StrategyManager *StrategyManagerFilterer) WatchBurnableSharesDecreased(opts *bind.WatchOpts, sink chan<- *StrategyManagerBurnableSharesDecreased) (event.Subscription, error)
⋮----
// ParseBurnableSharesDecreased is a log parse operation binding the contract event 0xd9d082c3ec4f3a3ffa55c324939a06407f5fbcb87d5e0ce3b9508c92c84ed839.
⋮----
func (_StrategyManager *StrategyManagerFilterer) ParseBurnableSharesDecreased(log types.Log) (*StrategyManagerBurnableSharesDecreased, error)
⋮----
// StrategyManagerDepositIterator is returned from FilterDeposit and is used to iterate over the raw logs and unpacked data for Deposit events raised by the StrategyManager contract.
type StrategyManagerDepositIterator struct {
	Event *StrategyManagerDeposit // 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
}
⋮----
Event *StrategyManagerDeposit // Event containing the contract specifics and raw log
⋮----
// StrategyManagerDeposit represents a Deposit event raised by the StrategyManager contract.
type StrategyManagerDeposit struct {
	Staker   common.Address
	Strategy common.Address
	Shares   *big.Int
	Raw      types.Log // Blockchain specific contextual infos
}
⋮----
// FilterDeposit is a free log retrieval operation binding the contract event 0x5548c837ab068cf56a2c2479df0882a4922fd203edb7517321831d95078c5f62.
⋮----
// Solidity: event Deposit(address staker, address strategy, uint256 shares)
func (_StrategyManager *StrategyManagerFilterer) FilterDeposit(opts *bind.FilterOpts) (*StrategyManagerDepositIterator, error)
⋮----
// WatchDeposit is a free log subscription operation binding the contract event 0x5548c837ab068cf56a2c2479df0882a4922fd203edb7517321831d95078c5f62.
⋮----
func (_StrategyManager *StrategyManagerFilterer) WatchDeposit(opts *bind.WatchOpts, sink chan<- *StrategyManagerDeposit) (event.Subscription, error)
⋮----
// ParseDeposit is a log parse operation binding the contract event 0x5548c837ab068cf56a2c2479df0882a4922fd203edb7517321831d95078c5f62.
⋮----
func (_StrategyManager *StrategyManagerFilterer) ParseDeposit(log types.Log) (*StrategyManagerDeposit, error)
⋮----
// StrategyManagerInitializedIterator is returned from FilterInitialized and is used to iterate over the raw logs and unpacked data for Initialized events raised by the StrategyManager contract.
type StrategyManagerInitializedIterator struct {
	Event *StrategyManagerInitialized // 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
}
⋮----
Event *StrategyManagerInitialized // Event containing the contract specifics and raw log
⋮----
// StrategyManagerInitialized represents a Initialized event raised by the StrategyManager contract.
type StrategyManagerInitialized struct {
	Version uint8
	Raw     types.Log // Blockchain specific contextual infos
}
⋮----
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 (_StrategyManager *StrategyManagerFilterer) FilterInitialized(opts *bind.FilterOpts) (*StrategyManagerInitializedIterator, error)
⋮----
// WatchInitialized is a free log subscription operation binding the contract event 0x7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb3847402498.
⋮----
func (_StrategyManager *StrategyManagerFilterer) WatchInitialized(opts *bind.WatchOpts, sink chan<- *StrategyManagerInitialized) (event.Subscription, error)
⋮----
// ParseInitialized is a log parse operation binding the contract event 0x7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb3847402498.
⋮----
func (_StrategyManager *StrategyManagerFilterer) ParseInitialized(log types.Log) (*StrategyManagerInitialized, error)
⋮----
// StrategyManagerOwnershipTransferredIterator is returned from FilterOwnershipTransferred and is used to iterate over the raw logs and unpacked data for OwnershipTransferred events raised by the StrategyManager contract.
type StrategyManagerOwnershipTransferredIterator struct {
	Event *StrategyManagerOwnershipTransferred // 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
}
⋮----
Event *StrategyManagerOwnershipTransferred // Event containing the contract specifics and raw log
⋮----
// StrategyManagerOwnershipTransferred represents a OwnershipTransferred event raised by the StrategyManager contract.
type StrategyManagerOwnershipTransferred struct {
	PreviousOwner common.Address
	NewOwner      common.Address
	Raw           types.Log // Blockchain specific contextual infos
}
⋮----
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 (_StrategyManager *StrategyManagerFilterer) FilterOwnershipTransferred(opts *bind.FilterOpts, previousOwner []common.Address, newOwner []common.Address) (*StrategyManagerOwnershipTransferredIterator, error)
⋮----
var previousOwnerRule []interface{}
⋮----
var newOwnerRule []interface{}
⋮----
// WatchOwnershipTransferred is a free log subscription operation binding the contract event 0x8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0.
⋮----
func (_StrategyManager *StrategyManagerFilterer) WatchOwnershipTransferred(opts *bind.WatchOpts, sink chan<- *StrategyManagerOwnershipTransferred, previousOwner []common.Address, newOwner []common.Address) (event.Subscription, error)
⋮----
// ParseOwnershipTransferred is a log parse operation binding the contract event 0x8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0.
⋮----
func (_StrategyManager *StrategyManagerFilterer) ParseOwnershipTransferred(log types.Log) (*StrategyManagerOwnershipTransferred, error)
⋮----
// StrategyManagerPausedIterator is returned from FilterPaused and is used to iterate over the raw logs and unpacked data for Paused events raised by the StrategyManager contract.
type StrategyManagerPausedIterator struct {
	Event *StrategyManagerPaused // 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
}
⋮----
Event *StrategyManagerPaused // Event containing the contract specifics and raw log
⋮----
// StrategyManagerPaused represents a Paused event raised by the StrategyManager contract.
type StrategyManagerPaused struct {
	Account         common.Address
	NewPausedStatus *big.Int
	Raw             types.Log // Blockchain specific contextual infos
}
⋮----
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 (_StrategyManager *StrategyManagerFilterer) FilterPaused(opts *bind.FilterOpts, account []common.Address) (*StrategyManagerPausedIterator, error)
⋮----
var accountRule []interface{}
⋮----
// WatchPaused is a free log subscription operation binding the contract event 0xab40a374bc51de372200a8bc981af8c9ecdc08dfdaef0bb6e09f88f3c616ef3d.
⋮----
func (_StrategyManager *StrategyManagerFilterer) WatchPaused(opts *bind.WatchOpts, sink chan<- *StrategyManagerPaused, account []common.Address) (event.Subscription, error)
⋮----
// ParsePaused is a log parse operation binding the contract event 0xab40a374bc51de372200a8bc981af8c9ecdc08dfdaef0bb6e09f88f3c616ef3d.
⋮----
func (_StrategyManager *StrategyManagerFilterer) ParsePaused(log types.Log) (*StrategyManagerPaused, error)
⋮----
// StrategyManagerStrategyAddedToDepositWhitelistIterator is returned from FilterStrategyAddedToDepositWhitelist and is used to iterate over the raw logs and unpacked data for StrategyAddedToDepositWhitelist events raised by the StrategyManager contract.
type StrategyManagerStrategyAddedToDepositWhitelistIterator struct {
	Event *StrategyManagerStrategyAddedToDepositWhitelist // 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
}
⋮----
Event *StrategyManagerStrategyAddedToDepositWhitelist // Event containing the contract specifics and raw log
⋮----
// StrategyManagerStrategyAddedToDepositWhitelist represents a StrategyAddedToDepositWhitelist event raised by the StrategyManager contract.
type StrategyManagerStrategyAddedToDepositWhitelist struct {
	Strategy common.Address
	Raw      types.Log // Blockchain specific contextual infos
}
⋮----
// FilterStrategyAddedToDepositWhitelist is a free log retrieval operation binding the contract event 0x0c35b17d91c96eb2751cd456e1252f42a386e524ef9ff26ecc9950859fdc04fe.
⋮----
// Solidity: event StrategyAddedToDepositWhitelist(address strategy)
func (_StrategyManager *StrategyManagerFilterer) FilterStrategyAddedToDepositWhitelist(opts *bind.FilterOpts) (*StrategyManagerStrategyAddedToDepositWhitelistIterator, error)
⋮----
// WatchStrategyAddedToDepositWhitelist is a free log subscription operation binding the contract event 0x0c35b17d91c96eb2751cd456e1252f42a386e524ef9ff26ecc9950859fdc04fe.
⋮----
func (_StrategyManager *StrategyManagerFilterer) WatchStrategyAddedToDepositWhitelist(opts *bind.WatchOpts, sink chan<- *StrategyManagerStrategyAddedToDepositWhitelist) (event.Subscription, error)
⋮----
// ParseStrategyAddedToDepositWhitelist is a log parse operation binding the contract event 0x0c35b17d91c96eb2751cd456e1252f42a386e524ef9ff26ecc9950859fdc04fe.
⋮----
func (_StrategyManager *StrategyManagerFilterer) ParseStrategyAddedToDepositWhitelist(log types.Log) (*StrategyManagerStrategyAddedToDepositWhitelist, error)
⋮----
// StrategyManagerStrategyRemovedFromDepositWhitelistIterator is returned from FilterStrategyRemovedFromDepositWhitelist and is used to iterate over the raw logs and unpacked data for StrategyRemovedFromDepositWhitelist events raised by the StrategyManager contract.
type StrategyManagerStrategyRemovedFromDepositWhitelistIterator struct {
	Event *StrategyManagerStrategyRemovedFromDepositWhitelist // 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
}
⋮----
Event *StrategyManagerStrategyRemovedFromDepositWhitelist // Event containing the contract specifics and raw log
⋮----
// StrategyManagerStrategyRemovedFromDepositWhitelist represents a StrategyRemovedFromDepositWhitelist event raised by the StrategyManager contract.
type StrategyManagerStrategyRemovedFromDepositWhitelist struct {
	Strategy common.Address
	Raw      types.Log // Blockchain specific contextual infos
}
⋮----
// FilterStrategyRemovedFromDepositWhitelist is a free log retrieval operation binding the contract event 0x4074413b4b443e4e58019f2855a8765113358c7c72e39509c6af45fc0f5ba030.
⋮----
// Solidity: event StrategyRemovedFromDepositWhitelist(address strategy)
func (_StrategyManager *StrategyManagerFilterer) FilterStrategyRemovedFromDepositWhitelist(opts *bind.FilterOpts) (*StrategyManagerStrategyRemovedFromDepositWhitelistIterator, error)
⋮----
// WatchStrategyRemovedFromDepositWhitelist is a free log subscription operation binding the contract event 0x4074413b4b443e4e58019f2855a8765113358c7c72e39509c6af45fc0f5ba030.
⋮----
func (_StrategyManager *StrategyManagerFilterer) WatchStrategyRemovedFromDepositWhitelist(opts *bind.WatchOpts, sink chan<- *StrategyManagerStrategyRemovedFromDepositWhitelist) (event.Subscription, error)
⋮----
// ParseStrategyRemovedFromDepositWhitelist is a log parse operation binding the contract event 0x4074413b4b443e4e58019f2855a8765113358c7c72e39509c6af45fc0f5ba030.
⋮----
func (_StrategyManager *StrategyManagerFilterer) ParseStrategyRemovedFromDepositWhitelist(log types.Log) (*StrategyManagerStrategyRemovedFromDepositWhitelist, error)
⋮----
// StrategyManagerStrategyWhitelisterChangedIterator is returned from FilterStrategyWhitelisterChanged and is used to iterate over the raw logs and unpacked data for StrategyWhitelisterChanged events raised by the StrategyManager contract.
type StrategyManagerStrategyWhitelisterChangedIterator struct {
	Event *StrategyManagerStrategyWhitelisterChanged // 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
}
⋮----
Event *StrategyManagerStrategyWhitelisterChanged // Event containing the contract specifics and raw log
⋮----
// StrategyManagerStrategyWhitelisterChanged represents a StrategyWhitelisterChanged event raised by the StrategyManager contract.
type StrategyManagerStrategyWhitelisterChanged struct {
	PreviousAddress common.Address
	NewAddress      common.Address
	Raw             types.Log // Blockchain specific contextual infos
}
⋮----
// FilterStrategyWhitelisterChanged is a free log retrieval operation binding the contract event 0x4264275e593955ff9d6146a51a4525f6ddace2e81db9391abcc9d1ca48047d29.
⋮----
// Solidity: event StrategyWhitelisterChanged(address previousAddress, address newAddress)
func (_StrategyManager *StrategyManagerFilterer) FilterStrategyWhitelisterChanged(opts *bind.FilterOpts) (*StrategyManagerStrategyWhitelisterChangedIterator, error)
⋮----
// WatchStrategyWhitelisterChanged is a free log subscription operation binding the contract event 0x4264275e593955ff9d6146a51a4525f6ddace2e81db9391abcc9d1ca48047d29.
⋮----
func (_StrategyManager *StrategyManagerFilterer) WatchStrategyWhitelisterChanged(opts *bind.WatchOpts, sink chan<- *StrategyManagerStrategyWhitelisterChanged) (event.Subscription, error)
⋮----
// ParseStrategyWhitelisterChanged is a log parse operation binding the contract event 0x4264275e593955ff9d6146a51a4525f6ddace2e81db9391abcc9d1ca48047d29.
⋮----
func (_StrategyManager *StrategyManagerFilterer) ParseStrategyWhitelisterChanged(log types.Log) (*StrategyManagerStrategyWhitelisterChanged, error)
⋮----
// StrategyManagerUnpausedIterator is returned from FilterUnpaused and is used to iterate over the raw logs and unpacked data for Unpaused events raised by the StrategyManager contract.
type StrategyManagerUnpausedIterator struct {
	Event *StrategyManagerUnpaused // 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
}
⋮----
Event *StrategyManagerUnpaused // Event containing the contract specifics and raw log
⋮----
// StrategyManagerUnpaused represents a Unpaused event raised by the StrategyManager contract.
type StrategyManagerUnpaused 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 (_StrategyManager *StrategyManagerFilterer) FilterUnpaused(opts *bind.FilterOpts, account []common.Address) (*StrategyManagerUnpausedIterator, error)
⋮----
// WatchUnpaused is a free log subscription operation binding the contract event 0x3582d1828e26bf56bd801502bc021ac0bc8afb57c826e4986b45593c8fad389c.
⋮----
func (_StrategyManager *StrategyManagerFilterer) WatchUnpaused(opts *bind.WatchOpts, sink chan<- *StrategyManagerUnpaused, account []common.Address) (event.Subscription, error)
⋮----
// ParseUnpaused is a log parse operation binding the contract event 0x3582d1828e26bf56bd801502bc021ac0bc8afb57c826e4986b45593c8fad389c.
⋮----
func (_StrategyManager *StrategyManagerFilterer) ParseUnpaused(log types.Log) (*StrategyManagerUnpaused, error)
````

## File: pkg/bindings/StrategyManagerStorage/binding.go
````go
// Code generated - DO NOT EDIT.
// This file is a generated binding and any manual changes will be lost.
⋮----
package StrategyManagerStorage
⋮----
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"
)
⋮----
"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
)
⋮----
// OperatorSet is an auto generated low-level Go binding around an user-defined struct.
type OperatorSet struct {
	Avs common.Address
	Id  uint32
}
⋮----
// StrategyManagerStorageMetaData contains all meta data concerning the StrategyManagerStorage contract.
var StrategyManagerStorageMetaData = &bind.MetaData{
	ABI: "[{\"type\":\"function\",\"name\":\"DEFAULT_BURN_ADDRESS\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"DEPOSIT_TYPEHASH\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"addShares\",\"inputs\":[{\"name\":\"staker\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"strategy\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"},{\"name\":\"shares\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"addStrategiesToDepositWhitelist\",\"inputs\":[{\"name\":\"strategiesToWhitelist\",\"type\":\"address[]\",\"internalType\":\"contractIStrategy[]\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"allocationManager\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIAllocationManager\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"burnShares\",\"inputs\":[{\"name\":\"strategy\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"calculateStrategyDepositDigestHash\",\"inputs\":[{\"name\":\"staker\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"strategy\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"},{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"contractIERC20\"},{\"name\":\"amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"nonce\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"expiry\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"clearBurnOrRedistributableShares\",\"inputs\":[{\"name\":\"operatorSet\",\"type\":\"tuple\",\"internalType\":\"structOperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]},{\"name\":\"slashId\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256[]\",\"internalType\":\"uint256[]\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"clearBurnOrRedistributableSharesByStrategy\",\"inputs\":[{\"name\":\"operatorSet\",\"type\":\"tuple\",\"internalType\":\"structOperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]},{\"name\":\"slashId\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"strategy\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"delegation\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIDelegationManager\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"depositIntoStrategy\",\"inputs\":[{\"name\":\"strategy\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"},{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"contractIERC20\"},{\"name\":\"amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"depositShares\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"depositIntoStrategyWithSignature\",\"inputs\":[{\"name\":\"strategy\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"},{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"contractIERC20\"},{\"name\":\"amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"staker\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"expiry\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"signature\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[{\"name\":\"depositShares\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"getBurnOrRedistributableCount\",\"inputs\":[{\"name\":\"operatorSet\",\"type\":\"tuple\",\"internalType\":\"structOperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]},{\"name\":\"slashId\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getBurnOrRedistributableShares\",\"inputs\":[{\"name\":\"operatorSet\",\"type\":\"tuple\",\"internalType\":\"structOperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]},{\"name\":\"slashId\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"address[]\",\"internalType\":\"contractIStrategy[]\"},{\"name\":\"\",\"type\":\"uint256[]\",\"internalType\":\"uint256[]\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getBurnOrRedistributableShares\",\"inputs\":[{\"name\":\"operatorSet\",\"type\":\"tuple\",\"internalType\":\"structOperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]},{\"name\":\"slashId\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"strategy\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getBurnableShares\",\"inputs\":[{\"name\":\"strategy\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getDeposits\",\"inputs\":[{\"name\":\"staker\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"address[]\",\"internalType\":\"contractIStrategy[]\"},{\"name\":\"\",\"type\":\"uint256[]\",\"internalType\":\"uint256[]\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getPendingOperatorSets\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"tuple[]\",\"internalType\":\"structOperatorSet[]\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getPendingSlashIds\",\"inputs\":[{\"name\":\"operatorSet\",\"type\":\"tuple\",\"internalType\":\"structOperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256[]\",\"internalType\":\"uint256[]\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getStakerStrategyList\",\"inputs\":[{\"name\":\"staker\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"address[]\",\"internalType\":\"contractIStrategy[]\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getStrategiesWithBurnableShares\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address[]\",\"internalType\":\"address[]\"},{\"name\":\"\",\"type\":\"uint256[]\",\"internalType\":\"uint256[]\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"increaseBurnOrRedistributableShares\",\"inputs\":[{\"name\":\"operatorSet\",\"type\":\"tuple\",\"internalType\":\"structOperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]},{\"name\":\"slashId\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"strategy\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"},{\"name\":\"addedSharesToBurn\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"initialize\",\"inputs\":[{\"name\":\"initialOwner\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"initialStrategyWhitelister\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"initialPausedStatus\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"nonces\",\"inputs\":[{\"name\":\"signer\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"nonce\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"removeDepositShares\",\"inputs\":[{\"name\":\"staker\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"strategy\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"},{\"name\":\"depositSharesToRemove\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"removeStrategiesFromDepositWhitelist\",\"inputs\":[{\"name\":\"strategiesToRemoveFromWhitelist\",\"type\":\"address[]\",\"internalType\":\"contractIStrategy[]\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"setStrategyWhitelister\",\"inputs\":[{\"name\":\"newStrategyWhitelister\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"stakerDepositShares\",\"inputs\":[{\"name\":\"staker\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"strategy\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"}],\"outputs\":[{\"name\":\"shares\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"stakerStrategyList\",\"inputs\":[{\"name\":\"staker\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"strategies\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"stakerStrategyListLength\",\"inputs\":[{\"name\":\"staker\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"strategyIsWhitelistedForDeposit\",\"inputs\":[{\"name\":\"strategy\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"}],\"outputs\":[{\"name\":\"whitelisted\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"strategyWhitelister\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"withdrawSharesAsTokens\",\"inputs\":[{\"name\":\"staker\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"strategy\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"},{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"contractIERC20\"},{\"name\":\"shares\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"event\",\"name\":\"BurnOrRedistributableSharesDecreased\",\"inputs\":[{\"name\":\"operatorSet\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structOperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]},{\"name\":\"slashId\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"strategy\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"contractIStrategy\"},{\"name\":\"shares\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"BurnOrRedistributableSharesIncreased\",\"inputs\":[{\"name\":\"operatorSet\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structOperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]},{\"name\":\"slashId\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"strategy\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"contractIStrategy\"},{\"name\":\"shares\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"BurnableSharesDecreased\",\"inputs\":[{\"name\":\"strategy\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"contractIStrategy\"},{\"name\":\"shares\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Deposit\",\"inputs\":[{\"name\":\"staker\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"},{\"name\":\"strategy\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"contractIStrategy\"},{\"name\":\"shares\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"StrategyAddedToDepositWhitelist\",\"inputs\":[{\"name\":\"strategy\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"contractIStrategy\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"StrategyRemovedFromDepositWhitelist\",\"inputs\":[{\"name\":\"strategy\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"contractIStrategy\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"StrategyWhitelisterChanged\",\"inputs\":[{\"name\":\"previousAddress\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"},{\"name\":\"newAddress\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"error\",\"name\":\"MaxStrategiesExceeded\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"OnlyDelegationManager\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"OnlyStrategyWhitelister\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"SharesAmountTooHigh\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"SharesAmountZero\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"StakerAddressZero\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"StrategyAlreadyInSlash\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"StrategyNotFound\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"StrategyNotWhitelisted\",\"inputs\":[]}]",
}
⋮----
// StrategyManagerStorageABI is the input ABI used to generate the binding from.
// Deprecated: Use StrategyManagerStorageMetaData.ABI instead.
var StrategyManagerStorageABI = StrategyManagerStorageMetaData.ABI
⋮----
// StrategyManagerStorage is an auto generated Go binding around an Ethereum contract.
type StrategyManagerStorage struct {
	StrategyManagerStorageCaller     // Read-only binding to the contract
	StrategyManagerStorageTransactor // Write-only binding to the contract
	StrategyManagerStorageFilterer   // Log filterer for contract events
}
⋮----
StrategyManagerStorageCaller     // Read-only binding to the contract
StrategyManagerStorageTransactor // Write-only binding to the contract
StrategyManagerStorageFilterer   // Log filterer for contract events
⋮----
// StrategyManagerStorageCaller is an auto generated read-only Go binding around an Ethereum contract.
type StrategyManagerStorageCaller struct {
	contract *bind.BoundContract // Generic contract wrapper for the low level calls
}
⋮----
contract *bind.BoundContract // Generic contract wrapper for the low level calls
⋮----
// StrategyManagerStorageTransactor is an auto generated write-only Go binding around an Ethereum contract.
type StrategyManagerStorageTransactor struct {
	contract *bind.BoundContract // Generic contract wrapper for the low level calls
}
⋮----
// StrategyManagerStorageFilterer is an auto generated log filtering Go binding around an Ethereum contract events.
type StrategyManagerStorageFilterer struct {
	contract *bind.BoundContract // Generic contract wrapper for the low level calls
}
⋮----
// StrategyManagerStorageSession is an auto generated Go binding around an Ethereum contract,
// with pre-set call and transact options.
type StrategyManagerStorageSession struct {
	Contract     *StrategyManagerStorage // 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
}
⋮----
Contract     *StrategyManagerStorage // 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
⋮----
// StrategyManagerStorageCallerSession is an auto generated read-only Go binding around an Ethereum contract,
// with pre-set call options.
type StrategyManagerStorageCallerSession struct {
	Contract *StrategyManagerStorageCaller // Generic contract caller binding to set the session for
	CallOpts bind.CallOpts                 // Call options to use throughout this session
}
⋮----
Contract *StrategyManagerStorageCaller // Generic contract caller binding to set the session for
CallOpts bind.CallOpts                 // Call options to use throughout this session
⋮----
// StrategyManagerStorageTransactorSession is an auto generated write-only Go binding around an Ethereum contract,
// with pre-set transact options.
type StrategyManagerStorageTransactorSession struct {
	Contract     *StrategyManagerStorageTransactor // Generic contract transactor binding to set the session for
	TransactOpts bind.TransactOpts                 // Transaction auth options to use throughout this session
}
⋮----
Contract     *StrategyManagerStorageTransactor // Generic contract transactor binding to set the session for
TransactOpts bind.TransactOpts                 // Transaction auth options to use throughout this session
⋮----
// StrategyManagerStorageRaw is an auto generated low-level Go binding around an Ethereum contract.
type StrategyManagerStorageRaw struct {
	Contract *StrategyManagerStorage // Generic contract binding to access the raw methods on
}
⋮----
Contract *StrategyManagerStorage // Generic contract binding to access the raw methods on
⋮----
// StrategyManagerStorageCallerRaw is an auto generated low-level read-only Go binding around an Ethereum contract.
type StrategyManagerStorageCallerRaw struct {
	Contract *StrategyManagerStorageCaller // Generic read-only contract binding to access the raw methods on
}
⋮----
Contract *StrategyManagerStorageCaller // Generic read-only contract binding to access the raw methods on
⋮----
// StrategyManagerStorageTransactorRaw is an auto generated low-level write-only Go binding around an Ethereum contract.
type StrategyManagerStorageTransactorRaw struct {
	Contract *StrategyManagerStorageTransactor // Generic write-only contract binding to access the raw methods on
}
⋮----
Contract *StrategyManagerStorageTransactor // Generic write-only contract binding to access the raw methods on
⋮----
// NewStrategyManagerStorage creates a new instance of StrategyManagerStorage, bound to a specific deployed contract.
func NewStrategyManagerStorage(address common.Address, backend bind.ContractBackend) (*StrategyManagerStorage, error)
⋮----
// NewStrategyManagerStorageCaller creates a new read-only instance of StrategyManagerStorage, bound to a specific deployed contract.
func NewStrategyManagerStorageCaller(address common.Address, caller bind.ContractCaller) (*StrategyManagerStorageCaller, error)
⋮----
// NewStrategyManagerStorageTransactor creates a new write-only instance of StrategyManagerStorage, bound to a specific deployed contract.
func NewStrategyManagerStorageTransactor(address common.Address, transactor bind.ContractTransactor) (*StrategyManagerStorageTransactor, error)
⋮----
// NewStrategyManagerStorageFilterer creates a new log filterer instance of StrategyManagerStorage, bound to a specific deployed contract.
func NewStrategyManagerStorageFilterer(address common.Address, filterer bind.ContractFilterer) (*StrategyManagerStorageFilterer, error)
⋮----
// bindStrategyManagerStorage binds a generic wrapper to an already deployed contract.
func bindStrategyManagerStorage(address common.Address, caller bind.ContractCaller, transactor bind.ContractTransactor, filterer bind.ContractFilterer) (*bind.BoundContract, error)
⋮----
// 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 (_StrategyManagerStorage *StrategyManagerStorageRaw) Call(opts *bind.CallOpts, result *[]interface
⋮----
// Transfer initiates a plain transaction to move funds to the contract, calling
// its default method if one is available.
func (_StrategyManagerStorage *StrategyManagerStorageRaw) Transfer(opts *bind.TransactOpts) (*types.Transaction, error)
⋮----
// Transact invokes the (paid) contract method with params as input values.
func (_StrategyManagerStorage *StrategyManagerStorageRaw) Transact(opts *bind.TransactOpts, method string, params ...interface
⋮----
// DEFAULTBURNADDRESS is a free data retrieval call binding the contract method 0xf3b4a000.
//
// Solidity: function DEFAULT_BURN_ADDRESS() view returns(address)
func (_StrategyManagerStorage *StrategyManagerStorageCaller) DEFAULTBURNADDRESS(opts *bind.CallOpts) (common.Address, error)
⋮----
var out []interface{}
⋮----
// DEPOSITTYPEHASH is a free data retrieval call binding the contract method 0x48825e94.
⋮----
// Solidity: function DEPOSIT_TYPEHASH() view returns(bytes32)
func (_StrategyManagerStorage *StrategyManagerStorageCaller) DEPOSITTYPEHASH(opts *bind.CallOpts) ([32]byte, error)
⋮----
// AllocationManager is a free data retrieval call binding the contract method 0xca8aa7c7.
⋮----
// Solidity: function allocationManager() view returns(address)
func (_StrategyManagerStorage *StrategyManagerStorageCaller) AllocationManager(opts *bind.CallOpts) (common.Address, error)
⋮----
// CalculateStrategyDepositDigestHash is a free data retrieval call binding the contract method 0x9ac01d61.
⋮----
// Solidity: function calculateStrategyDepositDigestHash(address staker, address strategy, address token, uint256 amount, uint256 nonce, uint256 expiry) view returns(bytes32)
func (_StrategyManagerStorage *StrategyManagerStorageCaller) CalculateStrategyDepositDigestHash(opts *bind.CallOpts, staker common.Address, strategy common.Address, token common.Address, amount *big.Int, nonce *big.Int, expiry *big.Int) ([32]byte, error)
⋮----
// Delegation is a free data retrieval call binding the contract method 0xdf5cf723.
⋮----
// Solidity: function delegation() view returns(address)
func (_StrategyManagerStorage *StrategyManagerStorageCaller) Delegation(opts *bind.CallOpts) (common.Address, error)
⋮----
// GetBurnOrRedistributableCount is a free data retrieval call binding the contract method 0x829fca73.
⋮----
// Solidity: function getBurnOrRedistributableCount((address,uint32) operatorSet, uint256 slashId) view returns(uint256)
func (_StrategyManagerStorage *StrategyManagerStorageCaller) GetBurnOrRedistributableCount(opts *bind.CallOpts, operatorSet OperatorSet, slashId *big.Int) (*big.Int, error)
⋮----
// GetBurnOrRedistributableShares is a free data retrieval call binding the contract method 0x31f8fb4c.
⋮----
// Solidity: function getBurnOrRedistributableShares((address,uint32) operatorSet, uint256 slashId) view returns(address[], uint256[])
func (_StrategyManagerStorage *StrategyManagerStorageCaller) GetBurnOrRedistributableShares(opts *bind.CallOpts, operatorSet OperatorSet, slashId *big.Int) ([]common.Address, []*big.Int, error)
⋮----
// GetBurnOrRedistributableShares0 is a free data retrieval call binding the contract method 0x76fb162b.
⋮----
// Solidity: function getBurnOrRedistributableShares((address,uint32) operatorSet, uint256 slashId, address strategy) view returns(uint256)
func (_StrategyManagerStorage *StrategyManagerStorageCaller) GetBurnOrRedistributableShares0(opts *bind.CallOpts, operatorSet OperatorSet, slashId *big.Int, strategy common.Address) (*big.Int, error)
⋮----
// GetBurnableShares is a free data retrieval call binding the contract method 0xfd980423.
⋮----
// Solidity: function getBurnableShares(address strategy) view returns(uint256)
func (_StrategyManagerStorage *StrategyManagerStorageCaller) GetBurnableShares(opts *bind.CallOpts, strategy common.Address) (*big.Int, error)
⋮----
// GetDeposits is a free data retrieval call binding the contract method 0x94f649dd.
⋮----
// Solidity: function getDeposits(address staker) view returns(address[], uint256[])
func (_StrategyManagerStorage *StrategyManagerStorageCaller) GetDeposits(opts *bind.CallOpts, staker common.Address) ([]common.Address, []*big.Int, error)
⋮----
// GetPendingOperatorSets is a free data retrieval call binding the contract method 0x3f292b08.
⋮----
// Solidity: function getPendingOperatorSets() view returns((address,uint32)[])
func (_StrategyManagerStorage *StrategyManagerStorageCaller) GetPendingOperatorSets(opts *bind.CallOpts) ([]OperatorSet, error)
⋮----
// GetPendingSlashIds is a free data retrieval call binding the contract method 0x7def1564.
⋮----
// Solidity: function getPendingSlashIds((address,uint32) operatorSet) view returns(uint256[])
func (_StrategyManagerStorage *StrategyManagerStorageCaller) GetPendingSlashIds(opts *bind.CallOpts, operatorSet OperatorSet) ([]*big.Int, error)
⋮----
// GetStakerStrategyList is a free data retrieval call binding the contract method 0xde44acb6.
⋮----
// Solidity: function getStakerStrategyList(address staker) view returns(address[])
func (_StrategyManagerStorage *StrategyManagerStorageCaller) GetStakerStrategyList(opts *bind.CallOpts, staker common.Address) ([]common.Address, error)
⋮----
// GetStrategiesWithBurnableShares is a free data retrieval call binding the contract method 0x36a8c500.
⋮----
// Solidity: function getStrategiesWithBurnableShares() view returns(address[], uint256[])
func (_StrategyManagerStorage *StrategyManagerStorageCaller) GetStrategiesWithBurnableShares(opts *bind.CallOpts) ([]common.Address, []*big.Int, error)
⋮----
// Nonces is a free data retrieval call binding the contract method 0x7ecebe00.
⋮----
// Solidity: function nonces(address signer) view returns(uint256 nonce)
func (_StrategyManagerStorage *StrategyManagerStorageCaller) Nonces(opts *bind.CallOpts, signer common.Address) (*big.Int, error)
⋮----
// StakerDepositShares is a free data retrieval call binding the contract method 0xfe243a17.
⋮----
// Solidity: function stakerDepositShares(address staker, address strategy) view returns(uint256 shares)
func (_StrategyManagerStorage *StrategyManagerStorageCaller) StakerDepositShares(opts *bind.CallOpts, staker common.Address, strategy common.Address) (*big.Int, error)
⋮----
// StakerStrategyList is a free data retrieval call binding the contract method 0xcbc2bd62.
⋮----
// Solidity: function stakerStrategyList(address staker, uint256 ) view returns(address strategies)
func (_StrategyManagerStorage *StrategyManagerStorageCaller) StakerStrategyList(opts *bind.CallOpts, staker common.Address, arg1 *big.Int) (common.Address, error)
⋮----
// StakerStrategyListLength is a free data retrieval call binding the contract method 0x8b8aac3c.
⋮----
// Solidity: function stakerStrategyListLength(address staker) view returns(uint256)
func (_StrategyManagerStorage *StrategyManagerStorageCaller) StakerStrategyListLength(opts *bind.CallOpts, staker common.Address) (*big.Int, error)
⋮----
// StrategyIsWhitelistedForDeposit is a free data retrieval call binding the contract method 0x663c1de4.
⋮----
// Solidity: function strategyIsWhitelistedForDeposit(address strategy) view returns(bool whitelisted)
func (_StrategyManagerStorage *StrategyManagerStorageCaller) StrategyIsWhitelistedForDeposit(opts *bind.CallOpts, strategy common.Address) (bool, error)
⋮----
// StrategyWhitelister is a free data retrieval call binding the contract method 0x967fc0d2.
⋮----
// Solidity: function strategyWhitelister() view returns(address)
func (_StrategyManagerStorage *StrategyManagerStorageCaller) StrategyWhitelister(opts *bind.CallOpts) (common.Address, error)
⋮----
// AddShares is a paid mutator transaction binding the contract method 0x50ff7225.
⋮----
// Solidity: function addShares(address staker, address strategy, uint256 shares) returns(uint256, uint256)
func (_StrategyManagerStorage *StrategyManagerStorageTransactor) AddShares(opts *bind.TransactOpts, staker common.Address, strategy common.Address, shares *big.Int) (*types.Transaction, error)
⋮----
// AddStrategiesToDepositWhitelist is a paid mutator transaction binding the contract method 0x5de08ff2.
⋮----
// Solidity: function addStrategiesToDepositWhitelist(address[] strategiesToWhitelist) returns()
func (_StrategyManagerStorage *StrategyManagerStorageTransactor) AddStrategiesToDepositWhitelist(opts *bind.TransactOpts, strategiesToWhitelist []common.Address) (*types.Transaction, error)
⋮----
// BurnShares is a paid mutator transaction binding the contract method 0x4b6d5d6e.
⋮----
// Solidity: function burnShares(address strategy) returns()
func (_StrategyManagerStorage *StrategyManagerStorageTransactor) BurnShares(opts *bind.TransactOpts, strategy common.Address) (*types.Transaction, error)
⋮----
// ClearBurnOrRedistributableShares is a paid mutator transaction binding the contract method 0x88c10299.
⋮----
// Solidity: function clearBurnOrRedistributableShares((address,uint32) operatorSet, uint256 slashId) returns(uint256[])
func (_StrategyManagerStorage *StrategyManagerStorageTransactor) ClearBurnOrRedistributableShares(opts *bind.TransactOpts, operatorSet OperatorSet, slashId *big.Int) (*types.Transaction, error)
⋮----
// ClearBurnOrRedistributableSharesByStrategy is a paid mutator transaction binding the contract method 0x2d44def6.
⋮----
// Solidity: function clearBurnOrRedistributableSharesByStrategy((address,uint32) operatorSet, uint256 slashId, address strategy) returns(uint256)
func (_StrategyManagerStorage *StrategyManagerStorageTransactor) ClearBurnOrRedistributableSharesByStrategy(opts *bind.TransactOpts, operatorSet OperatorSet, slashId *big.Int, strategy common.Address) (*types.Transaction, error)
⋮----
// DepositIntoStrategy is a paid mutator transaction binding the contract method 0xe7a050aa.
⋮----
// Solidity: function depositIntoStrategy(address strategy, address token, uint256 amount) returns(uint256 depositShares)
func (_StrategyManagerStorage *StrategyManagerStorageTransactor) DepositIntoStrategy(opts *bind.TransactOpts, strategy common.Address, token common.Address, amount *big.Int) (*types.Transaction, error)
⋮----
// DepositIntoStrategyWithSignature is a paid mutator transaction binding the contract method 0x32e89ace.
⋮----
// Solidity: function depositIntoStrategyWithSignature(address strategy, address token, uint256 amount, address staker, uint256 expiry, bytes signature) returns(uint256 depositShares)
func (_StrategyManagerStorage *StrategyManagerStorageTransactor) DepositIntoStrategyWithSignature(opts *bind.TransactOpts, strategy common.Address, token common.Address, amount *big.Int, staker common.Address, expiry *big.Int, signature []byte) (*types.Transaction, error)
⋮----
// IncreaseBurnOrRedistributableShares is a paid mutator transaction binding the contract method 0x3fb99ca5.
⋮----
// Solidity: function increaseBurnOrRedistributableShares((address,uint32) operatorSet, uint256 slashId, address strategy, uint256 addedSharesToBurn) returns()
func (_StrategyManagerStorage *StrategyManagerStorageTransactor) IncreaseBurnOrRedistributableShares(opts *bind.TransactOpts, operatorSet OperatorSet, slashId *big.Int, strategy common.Address, addedSharesToBurn *big.Int) (*types.Transaction, error)
⋮----
// Initialize is a paid mutator transaction binding the contract method 0x1794bb3c.
⋮----
// Solidity: function initialize(address initialOwner, address initialStrategyWhitelister, uint256 initialPausedStatus) returns()
func (_StrategyManagerStorage *StrategyManagerStorageTransactor) Initialize(opts *bind.TransactOpts, initialOwner common.Address, initialStrategyWhitelister common.Address, initialPausedStatus *big.Int) (*types.Transaction, error)
⋮----
// RemoveDepositShares is a paid mutator transaction binding the contract method 0x724af423.
⋮----
// Solidity: function removeDepositShares(address staker, address strategy, uint256 depositSharesToRemove) returns(uint256)
func (_StrategyManagerStorage *StrategyManagerStorageTransactor) RemoveDepositShares(opts *bind.TransactOpts, staker common.Address, strategy common.Address, depositSharesToRemove *big.Int) (*types.Transaction, error)
⋮----
// RemoveStrategiesFromDepositWhitelist is a paid mutator transaction binding the contract method 0xb5d8b5b8.
⋮----
// Solidity: function removeStrategiesFromDepositWhitelist(address[] strategiesToRemoveFromWhitelist) returns()
func (_StrategyManagerStorage *StrategyManagerStorageTransactor) RemoveStrategiesFromDepositWhitelist(opts *bind.TransactOpts, strategiesToRemoveFromWhitelist []common.Address) (*types.Transaction, error)
⋮----
// SetStrategyWhitelister is a paid mutator transaction binding the contract method 0xc6656702.
⋮----
// Solidity: function setStrategyWhitelister(address newStrategyWhitelister) returns()
func (_StrategyManagerStorage *StrategyManagerStorageTransactor) SetStrategyWhitelister(opts *bind.TransactOpts, newStrategyWhitelister common.Address) (*types.Transaction, error)
⋮----
// WithdrawSharesAsTokens is a paid mutator transaction binding the contract method 0x2eae418c.
⋮----
// Solidity: function withdrawSharesAsTokens(address staker, address strategy, address token, uint256 shares) returns()
func (_StrategyManagerStorage *StrategyManagerStorageTransactor) WithdrawSharesAsTokens(opts *bind.TransactOpts, staker common.Address, strategy common.Address, token common.Address, shares *big.Int) (*types.Transaction, error)
⋮----
// StrategyManagerStorageBurnOrRedistributableSharesDecreasedIterator is returned from FilterBurnOrRedistributableSharesDecreased and is used to iterate over the raw logs and unpacked data for BurnOrRedistributableSharesDecreased events raised by the StrategyManagerStorage contract.
type StrategyManagerStorageBurnOrRedistributableSharesDecreasedIterator struct {
	Event *StrategyManagerStorageBurnOrRedistributableSharesDecreased // 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
}
⋮----
Event *StrategyManagerStorageBurnOrRedistributableSharesDecreased // 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 *StrategyManagerStorageBurnOrRedistributableSharesDecreasedIterator) Next() bool
⋮----
// If the iterator failed, stop iterating
⋮----
// If the iterator completed, deliver directly whatever's available
⋮----
// Iterator still in progress, wait for either a data or an error event
⋮----
// Error returns any retrieval or parsing error occurred during filtering.
func (it *StrategyManagerStorageBurnOrRedistributableSharesDecreasedIterator) Error() error
⋮----
// Close terminates the iteration process, releasing any pending underlying
// resources.
func (it *StrategyManagerStorageBurnOrRedistributableSharesDecreasedIterator) Close() error
⋮----
// StrategyManagerStorageBurnOrRedistributableSharesDecreased represents a BurnOrRedistributableSharesDecreased event raised by the StrategyManagerStorage contract.
type StrategyManagerStorageBurnOrRedistributableSharesDecreased struct {
	OperatorSet OperatorSet
	SlashId     *big.Int
	Strategy    common.Address
	Shares      *big.Int
	Raw         types.Log // Blockchain specific contextual infos
}
⋮----
Raw         types.Log // Blockchain specific contextual infos
⋮----
// FilterBurnOrRedistributableSharesDecreased is a free log retrieval operation binding the contract event 0xe6413aa0c789e437b0a06bf64b20926584f066c79a2d8b80a759c85472f7b0af.
⋮----
// Solidity: event BurnOrRedistributableSharesDecreased((address,uint32) operatorSet, uint256 slashId, address strategy, uint256 shares)
func (_StrategyManagerStorage *StrategyManagerStorageFilterer) FilterBurnOrRedistributableSharesDecreased(opts *bind.FilterOpts) (*StrategyManagerStorageBurnOrRedistributableSharesDecreasedIterator, error)
⋮----
// WatchBurnOrRedistributableSharesDecreased is a free log subscription operation binding the contract event 0xe6413aa0c789e437b0a06bf64b20926584f066c79a2d8b80a759c85472f7b0af.
⋮----
func (_StrategyManagerStorage *StrategyManagerStorageFilterer) WatchBurnOrRedistributableSharesDecreased(opts *bind.WatchOpts, sink chan<- *StrategyManagerStorageBurnOrRedistributableSharesDecreased) (event.Subscription, error)
⋮----
// New log arrived, parse the event and forward to the user
⋮----
// ParseBurnOrRedistributableSharesDecreased is a log parse operation binding the contract event 0xe6413aa0c789e437b0a06bf64b20926584f066c79a2d8b80a759c85472f7b0af.
⋮----
func (_StrategyManagerStorage *StrategyManagerStorageFilterer) ParseBurnOrRedistributableSharesDecreased(log types.Log) (*StrategyManagerStorageBurnOrRedistributableSharesDecreased, error)
⋮----
// StrategyManagerStorageBurnOrRedistributableSharesIncreasedIterator is returned from FilterBurnOrRedistributableSharesIncreased and is used to iterate over the raw logs and unpacked data for BurnOrRedistributableSharesIncreased events raised by the StrategyManagerStorage contract.
type StrategyManagerStorageBurnOrRedistributableSharesIncreasedIterator struct {
	Event *StrategyManagerStorageBurnOrRedistributableSharesIncreased // 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
}
⋮----
Event *StrategyManagerStorageBurnOrRedistributableSharesIncreased // Event containing the contract specifics and raw log
⋮----
// StrategyManagerStorageBurnOrRedistributableSharesIncreased represents a BurnOrRedistributableSharesIncreased event raised by the StrategyManagerStorage contract.
type StrategyManagerStorageBurnOrRedistributableSharesIncreased struct {
	OperatorSet OperatorSet
	SlashId     *big.Int
	Strategy    common.Address
	Shares      *big.Int
	Raw         types.Log // Blockchain specific contextual infos
}
⋮----
// FilterBurnOrRedistributableSharesIncreased is a free log retrieval operation binding the contract event 0x5f5209798bbac45a16d2dc3bc67319fab26ee00153916d6f07b69f8a134a1e8b.
⋮----
// Solidity: event BurnOrRedistributableSharesIncreased((address,uint32) operatorSet, uint256 slashId, address strategy, uint256 shares)
func (_StrategyManagerStorage *StrategyManagerStorageFilterer) FilterBurnOrRedistributableSharesIncreased(opts *bind.FilterOpts) (*StrategyManagerStorageBurnOrRedistributableSharesIncreasedIterator, error)
⋮----
// WatchBurnOrRedistributableSharesIncreased is a free log subscription operation binding the contract event 0x5f5209798bbac45a16d2dc3bc67319fab26ee00153916d6f07b69f8a134a1e8b.
⋮----
func (_StrategyManagerStorage *StrategyManagerStorageFilterer) WatchBurnOrRedistributableSharesIncreased(opts *bind.WatchOpts, sink chan<- *StrategyManagerStorageBurnOrRedistributableSharesIncreased) (event.Subscription, error)
⋮----
// ParseBurnOrRedistributableSharesIncreased is a log parse operation binding the contract event 0x5f5209798bbac45a16d2dc3bc67319fab26ee00153916d6f07b69f8a134a1e8b.
⋮----
func (_StrategyManagerStorage *StrategyManagerStorageFilterer) ParseBurnOrRedistributableSharesIncreased(log types.Log) (*StrategyManagerStorageBurnOrRedistributableSharesIncreased, error)
⋮----
// StrategyManagerStorageBurnableSharesDecreasedIterator is returned from FilterBurnableSharesDecreased and is used to iterate over the raw logs and unpacked data for BurnableSharesDecreased events raised by the StrategyManagerStorage contract.
type StrategyManagerStorageBurnableSharesDecreasedIterator struct {
	Event *StrategyManagerStorageBurnableSharesDecreased // 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
}
⋮----
Event *StrategyManagerStorageBurnableSharesDecreased // Event containing the contract specifics and raw log
⋮----
// StrategyManagerStorageBurnableSharesDecreased represents a BurnableSharesDecreased event raised by the StrategyManagerStorage contract.
type StrategyManagerStorageBurnableSharesDecreased struct {
	Strategy common.Address
	Shares   *big.Int
	Raw      types.Log // Blockchain specific contextual infos
}
⋮----
Raw      types.Log // Blockchain specific contextual infos
⋮----
// FilterBurnableSharesDecreased is a free log retrieval operation binding the contract event 0xd9d082c3ec4f3a3ffa55c324939a06407f5fbcb87d5e0ce3b9508c92c84ed839.
⋮----
// Solidity: event BurnableSharesDecreased(address strategy, uint256 shares)
func (_StrategyManagerStorage *StrategyManagerStorageFilterer) FilterBurnableSharesDecreased(opts *bind.FilterOpts) (*StrategyManagerStorageBurnableSharesDecreasedIterator, error)
⋮----
// WatchBurnableSharesDecreased is a free log subscription operation binding the contract event 0xd9d082c3ec4f3a3ffa55c324939a06407f5fbcb87d5e0ce3b9508c92c84ed839.
⋮----
func (_StrategyManagerStorage *StrategyManagerStorageFilterer) WatchBurnableSharesDecreased(opts *bind.WatchOpts, sink chan<- *StrategyManagerStorageBurnableSharesDecreased) (event.Subscription, error)
⋮----
// ParseBurnableSharesDecreased is a log parse operation binding the contract event 0xd9d082c3ec4f3a3ffa55c324939a06407f5fbcb87d5e0ce3b9508c92c84ed839.
⋮----
func (_StrategyManagerStorage *StrategyManagerStorageFilterer) ParseBurnableSharesDecreased(log types.Log) (*StrategyManagerStorageBurnableSharesDecreased, error)
⋮----
// StrategyManagerStorageDepositIterator is returned from FilterDeposit and is used to iterate over the raw logs and unpacked data for Deposit events raised by the StrategyManagerStorage contract.
type StrategyManagerStorageDepositIterator struct {
	Event *StrategyManagerStorageDeposit // 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
}
⋮----
Event *StrategyManagerStorageDeposit // Event containing the contract specifics and raw log
⋮----
// StrategyManagerStorageDeposit represents a Deposit event raised by the StrategyManagerStorage contract.
type StrategyManagerStorageDeposit struct {
	Staker   common.Address
	Strategy common.Address
	Shares   *big.Int
	Raw      types.Log // Blockchain specific contextual infos
}
⋮----
// FilterDeposit is a free log retrieval operation binding the contract event 0x5548c837ab068cf56a2c2479df0882a4922fd203edb7517321831d95078c5f62.
⋮----
// Solidity: event Deposit(address staker, address strategy, uint256 shares)
func (_StrategyManagerStorage *StrategyManagerStorageFilterer) FilterDeposit(opts *bind.FilterOpts) (*StrategyManagerStorageDepositIterator, error)
⋮----
// WatchDeposit is a free log subscription operation binding the contract event 0x5548c837ab068cf56a2c2479df0882a4922fd203edb7517321831d95078c5f62.
⋮----
func (_StrategyManagerStorage *StrategyManagerStorageFilterer) WatchDeposit(opts *bind.WatchOpts, sink chan<- *StrategyManagerStorageDeposit) (event.Subscription, error)
⋮----
// ParseDeposit is a log parse operation binding the contract event 0x5548c837ab068cf56a2c2479df0882a4922fd203edb7517321831d95078c5f62.
⋮----
func (_StrategyManagerStorage *StrategyManagerStorageFilterer) ParseDeposit(log types.Log) (*StrategyManagerStorageDeposit, error)
⋮----
// StrategyManagerStorageStrategyAddedToDepositWhitelistIterator is returned from FilterStrategyAddedToDepositWhitelist and is used to iterate over the raw logs and unpacked data for StrategyAddedToDepositWhitelist events raised by the StrategyManagerStorage contract.
type StrategyManagerStorageStrategyAddedToDepositWhitelistIterator struct {
	Event *StrategyManagerStorageStrategyAddedToDepositWhitelist // 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
}
⋮----
Event *StrategyManagerStorageStrategyAddedToDepositWhitelist // Event containing the contract specifics and raw log
⋮----
// StrategyManagerStorageStrategyAddedToDepositWhitelist represents a StrategyAddedToDepositWhitelist event raised by the StrategyManagerStorage contract.
type StrategyManagerStorageStrategyAddedToDepositWhitelist struct {
	Strategy common.Address
	Raw      types.Log // Blockchain specific contextual infos
}
⋮----
// FilterStrategyAddedToDepositWhitelist is a free log retrieval operation binding the contract event 0x0c35b17d91c96eb2751cd456e1252f42a386e524ef9ff26ecc9950859fdc04fe.
⋮----
// Solidity: event StrategyAddedToDepositWhitelist(address strategy)
func (_StrategyManagerStorage *StrategyManagerStorageFilterer) FilterStrategyAddedToDepositWhitelist(opts *bind.FilterOpts) (*StrategyManagerStorageStrategyAddedToDepositWhitelistIterator, error)
⋮----
// WatchStrategyAddedToDepositWhitelist is a free log subscription operation binding the contract event 0x0c35b17d91c96eb2751cd456e1252f42a386e524ef9ff26ecc9950859fdc04fe.
⋮----
func (_StrategyManagerStorage *StrategyManagerStorageFilterer) WatchStrategyAddedToDepositWhitelist(opts *bind.WatchOpts, sink chan<- *StrategyManagerStorageStrategyAddedToDepositWhitelist) (event.Subscription, error)
⋮----
// ParseStrategyAddedToDepositWhitelist is a log parse operation binding the contract event 0x0c35b17d91c96eb2751cd456e1252f42a386e524ef9ff26ecc9950859fdc04fe.
⋮----
func (_StrategyManagerStorage *StrategyManagerStorageFilterer) ParseStrategyAddedToDepositWhitelist(log types.Log) (*StrategyManagerStorageStrategyAddedToDepositWhitelist, error)
⋮----
// StrategyManagerStorageStrategyRemovedFromDepositWhitelistIterator is returned from FilterStrategyRemovedFromDepositWhitelist and is used to iterate over the raw logs and unpacked data for StrategyRemovedFromDepositWhitelist events raised by the StrategyManagerStorage contract.
type StrategyManagerStorageStrategyRemovedFromDepositWhitelistIterator struct {
	Event *StrategyManagerStorageStrategyRemovedFromDepositWhitelist // 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
}
⋮----
Event *StrategyManagerStorageStrategyRemovedFromDepositWhitelist // Event containing the contract specifics and raw log
⋮----
// StrategyManagerStorageStrategyRemovedFromDepositWhitelist represents a StrategyRemovedFromDepositWhitelist event raised by the StrategyManagerStorage contract.
type StrategyManagerStorageStrategyRemovedFromDepositWhitelist struct {
	Strategy common.Address
	Raw      types.Log // Blockchain specific contextual infos
}
⋮----
// FilterStrategyRemovedFromDepositWhitelist is a free log retrieval operation binding the contract event 0x4074413b4b443e4e58019f2855a8765113358c7c72e39509c6af45fc0f5ba030.
⋮----
// Solidity: event StrategyRemovedFromDepositWhitelist(address strategy)
func (_StrategyManagerStorage *StrategyManagerStorageFilterer) FilterStrategyRemovedFromDepositWhitelist(opts *bind.FilterOpts) (*StrategyManagerStorageStrategyRemovedFromDepositWhitelistIterator, error)
⋮----
// WatchStrategyRemovedFromDepositWhitelist is a free log subscription operation binding the contract event 0x4074413b4b443e4e58019f2855a8765113358c7c72e39509c6af45fc0f5ba030.
⋮----
func (_StrategyManagerStorage *StrategyManagerStorageFilterer) WatchStrategyRemovedFromDepositWhitelist(opts *bind.WatchOpts, sink chan<- *StrategyManagerStorageStrategyRemovedFromDepositWhitelist) (event.Subscription, error)
⋮----
// ParseStrategyRemovedFromDepositWhitelist is a log parse operation binding the contract event 0x4074413b4b443e4e58019f2855a8765113358c7c72e39509c6af45fc0f5ba030.
⋮----
func (_StrategyManagerStorage *StrategyManagerStorageFilterer) ParseStrategyRemovedFromDepositWhitelist(log types.Log) (*StrategyManagerStorageStrategyRemovedFromDepositWhitelist, error)
⋮----
// StrategyManagerStorageStrategyWhitelisterChangedIterator is returned from FilterStrategyWhitelisterChanged and is used to iterate over the raw logs and unpacked data for StrategyWhitelisterChanged events raised by the StrategyManagerStorage contract.
type StrategyManagerStorageStrategyWhitelisterChangedIterator struct {
	Event *StrategyManagerStorageStrategyWhitelisterChanged // 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
}
⋮----
Event *StrategyManagerStorageStrategyWhitelisterChanged // Event containing the contract specifics and raw log
⋮----
// StrategyManagerStorageStrategyWhitelisterChanged represents a StrategyWhitelisterChanged event raised by the StrategyManagerStorage contract.
type StrategyManagerStorageStrategyWhitelisterChanged struct {
	PreviousAddress common.Address
	NewAddress      common.Address
	Raw             types.Log // Blockchain specific contextual infos
}
⋮----
Raw             types.Log // Blockchain specific contextual infos
⋮----
// FilterStrategyWhitelisterChanged is a free log retrieval operation binding the contract event 0x4264275e593955ff9d6146a51a4525f6ddace2e81db9391abcc9d1ca48047d29.
⋮----
// Solidity: event StrategyWhitelisterChanged(address previousAddress, address newAddress)
func (_StrategyManagerStorage *StrategyManagerStorageFilterer) FilterStrategyWhitelisterChanged(opts *bind.FilterOpts) (*StrategyManagerStorageStrategyWhitelisterChangedIterator, error)
⋮----
// WatchStrategyWhitelisterChanged is a free log subscription operation binding the contract event 0x4264275e593955ff9d6146a51a4525f6ddace2e81db9391abcc9d1ca48047d29.
⋮----
func (_StrategyManagerStorage *StrategyManagerStorageFilterer) WatchStrategyWhitelisterChanged(opts *bind.WatchOpts, sink chan<- *StrategyManagerStorageStrategyWhitelisterChanged) (event.Subscription, error)
⋮----
// ParseStrategyWhitelisterChanged is a log parse operation binding the contract event 0x4264275e593955ff9d6146a51a4525f6ddace2e81db9391abcc9d1ca48047d29.
⋮----
func (_StrategyManagerStorage *StrategyManagerStorageFilterer) ParseStrategyWhitelisterChanged(log types.Log) (*StrategyManagerStorageStrategyWhitelisterChanged, error)
````

## File: pkg/bindings/TaskMailbox/binding.go
````go
// Code generated - DO NOT EDIT.
// This file is a generated binding and any manual changes will be lost.
⋮----
package TaskMailbox
⋮----
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"
)
⋮----
"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
)
⋮----
// BN254G1Point is an auto generated low-level Go binding around an user-defined struct.
type BN254G1Point struct {
	X *big.Int
	Y *big.Int
}
⋮----
// BN254G2Point is an auto generated low-level Go binding around an user-defined struct.
type BN254G2Point struct {
	X [2]*big.Int
	Y [2]*big.Int
}
⋮----
// IBN254CertificateVerifierTypesBN254Certificate is an auto generated low-level Go binding around an user-defined struct.
type IBN254CertificateVerifierTypesBN254Certificate struct {
	ReferenceTimestamp uint32
	MessageHash        [32]byte
	Signature          BN254G1Point
	Apk                BN254G2Point
	NonSignerWitnesses []IBN254CertificateVerifierTypesBN254OperatorInfoWitness
}
⋮----
// IBN254CertificateVerifierTypesBN254OperatorInfoWitness is an auto generated low-level Go binding around an user-defined struct.
type IBN254CertificateVerifierTypesBN254OperatorInfoWitness struct {
	OperatorIndex     uint32
	OperatorInfoProof []byte
	OperatorInfo      IOperatorTableCalculatorTypesBN254OperatorInfo
}
⋮----
// IECDSACertificateVerifierTypesECDSACertificate is an auto generated low-level Go binding around an user-defined struct.
type IECDSACertificateVerifierTypesECDSACertificate struct {
	ReferenceTimestamp uint32
	MessageHash        [32]byte
	Sig                []byte
}
⋮----
// IOperatorTableCalculatorTypesBN254OperatorInfo is an auto generated low-level Go binding around an user-defined struct.
type IOperatorTableCalculatorTypesBN254OperatorInfo struct {
	Pubkey  BN254G1Point
	Weights []*big.Int
}
⋮----
// ITaskMailboxTypesConsensus is an auto generated low-level Go binding around an user-defined struct.
type ITaskMailboxTypesConsensus struct {
	ConsensusType uint8
	Value         []byte
}
⋮----
// ITaskMailboxTypesExecutorOperatorSetTaskConfig is an auto generated low-level Go binding around an user-defined struct.
type ITaskMailboxTypesExecutorOperatorSetTaskConfig struct {
	TaskHook     common.Address
	TaskSLA      *big.Int
	FeeToken     common.Address
	CurveType    uint8
	FeeCollector common.Address
	Consensus    ITaskMailboxTypesConsensus
	TaskMetadata []byte
}
⋮----
// ITaskMailboxTypesTask is an auto generated low-level Go binding around an user-defined struct.
type ITaskMailboxTypesTask struct {
	Creator                         common.Address
	CreationTime                    *big.Int
	Avs                             common.Address
	AvsFee                          *big.Int
	RefundCollector                 common.Address
	ExecutorOperatorSetId           uint32
	FeeSplit                        uint16
	Status                          uint8
	IsFeeRefunded                   bool
	OperatorTableReferenceTimestamp uint32
	ExecutorOperatorSetTaskConfig   ITaskMailboxTypesExecutorOperatorSetTaskConfig
	Payload                         []byte
	ExecutorCert                    []byte
	Result                          []byte
}
⋮----
// ITaskMailboxTypesTaskParams is an auto generated low-level Go binding around an user-defined struct.
type ITaskMailboxTypesTaskParams struct {
	RefundCollector     common.Address
	ExecutorOperatorSet OperatorSet
	Payload             []byte
}
⋮----
// OperatorSet is an auto generated low-level Go binding around an user-defined struct.
type OperatorSet struct {
	Avs common.Address
	Id  uint32
}
⋮----
// TaskMailboxMetaData contains all meta data concerning the TaskMailbox contract.
var TaskMailboxMetaData = &bind.MetaData{
	ABI: "[{\"type\":\"constructor\",\"inputs\":[{\"name\":\"_bn254CertificateVerifier\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"_ecdsaCertificateVerifier\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"_maxTaskSLA\",\"type\":\"uint96\",\"internalType\":\"uint96\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"BN254_CERTIFICATE_VERIFIER\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"ECDSA_CERTIFICATE_VERIFIER\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"MAX_TASK_SLA\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint96\",\"internalType\":\"uint96\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"createTask\",\"inputs\":[{\"name\":\"taskParams\",\"type\":\"tuple\",\"internalType\":\"structITaskMailboxTypes.TaskParams\",\"components\":[{\"name\":\"refundCollector\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"executorOperatorSet\",\"type\":\"tuple\",\"internalType\":\"structOperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]},{\"name\":\"payload\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"feeSplit\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint16\",\"internalType\":\"uint16\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"feeSplitCollector\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getBN254CertificateBytes\",\"inputs\":[{\"name\":\"cert\",\"type\":\"tuple\",\"internalType\":\"structIBN254CertificateVerifierTypes.BN254Certificate\",\"components\":[{\"name\":\"referenceTimestamp\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"messageHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"signature\",\"type\":\"tuple\",\"internalType\":\"structBN254.G1Point\",\"components\":[{\"name\":\"X\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"Y\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]},{\"name\":\"apk\",\"type\":\"tuple\",\"internalType\":\"structBN254.G2Point\",\"components\":[{\"name\":\"X\",\"type\":\"uint256[2]\",\"internalType\":\"uint256[2]\"},{\"name\":\"Y\",\"type\":\"uint256[2]\",\"internalType\":\"uint256[2]\"}]},{\"name\":\"nonSignerWitnesses\",\"type\":\"tuple[]\",\"internalType\":\"structIBN254CertificateVerifierTypes.BN254OperatorInfoWitness[]\",\"components\":[{\"name\":\"operatorIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"operatorInfoProof\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"operatorInfo\",\"type\":\"tuple\",\"internalType\":\"structIOperatorTableCalculatorTypes.BN254OperatorInfo\",\"components\":[{\"name\":\"pubkey\",\"type\":\"tuple\",\"internalType\":\"structBN254.G1Point\",\"components\":[{\"name\":\"X\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"Y\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]},{\"name\":\"weights\",\"type\":\"uint256[]\",\"internalType\":\"uint256[]\"}]}]}]}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"stateMutability\":\"pure\"},{\"type\":\"function\",\"name\":\"getECDSACertificateBytes\",\"inputs\":[{\"name\":\"cert\",\"type\":\"tuple\",\"internalType\":\"structIECDSACertificateVerifierTypes.ECDSACertificate\",\"components\":[{\"name\":\"referenceTimestamp\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"messageHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"sig\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"stateMutability\":\"pure\"},{\"type\":\"function\",\"name\":\"getExecutorOperatorSetTaskConfig\",\"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\":\"structITaskMailboxTypes.ExecutorOperatorSetTaskConfig\",\"components\":[{\"name\":\"taskHook\",\"type\":\"address\",\"internalType\":\"contractIAVSTaskHook\"},{\"name\":\"taskSLA\",\"type\":\"uint96\",\"internalType\":\"uint96\"},{\"name\":\"feeToken\",\"type\":\"address\",\"internalType\":\"contractIERC20\"},{\"name\":\"curveType\",\"type\":\"uint8\",\"internalType\":\"enumIKeyRegistrarTypes.CurveType\"},{\"name\":\"feeCollector\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"consensus\",\"type\":\"tuple\",\"internalType\":\"structITaskMailboxTypes.Consensus\",\"components\":[{\"name\":\"consensusType\",\"type\":\"uint8\",\"internalType\":\"enumITaskMailboxTypes.ConsensusType\"},{\"name\":\"value\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]},{\"name\":\"taskMetadata\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getMessageHash\",\"inputs\":[{\"name\":\"taskHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"result\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"pure\"},{\"type\":\"function\",\"name\":\"getTaskInfo\",\"inputs\":[{\"name\":\"taskHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"tuple\",\"internalType\":\"structITaskMailboxTypes.Task\",\"components\":[{\"name\":\"creator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"creationTime\",\"type\":\"uint96\",\"internalType\":\"uint96\"},{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"avsFee\",\"type\":\"uint96\",\"internalType\":\"uint96\"},{\"name\":\"refundCollector\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"executorOperatorSetId\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"feeSplit\",\"type\":\"uint16\",\"internalType\":\"uint16\"},{\"name\":\"status\",\"type\":\"uint8\",\"internalType\":\"enumITaskMailboxTypes.TaskStatus\"},{\"name\":\"isFeeRefunded\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"operatorTableReferenceTimestamp\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"executorOperatorSetTaskConfig\",\"type\":\"tuple\",\"internalType\":\"structITaskMailboxTypes.ExecutorOperatorSetTaskConfig\",\"components\":[{\"name\":\"taskHook\",\"type\":\"address\",\"internalType\":\"contractIAVSTaskHook\"},{\"name\":\"taskSLA\",\"type\":\"uint96\",\"internalType\":\"uint96\"},{\"name\":\"feeToken\",\"type\":\"address\",\"internalType\":\"contractIERC20\"},{\"name\":\"curveType\",\"type\":\"uint8\",\"internalType\":\"enumIKeyRegistrarTypes.CurveType\"},{\"name\":\"feeCollector\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"consensus\",\"type\":\"tuple\",\"internalType\":\"structITaskMailboxTypes.Consensus\",\"components\":[{\"name\":\"consensusType\",\"type\":\"uint8\",\"internalType\":\"enumITaskMailboxTypes.ConsensusType\"},{\"name\":\"value\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]},{\"name\":\"taskMetadata\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]},{\"name\":\"payload\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"executorCert\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"result\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getTaskResult\",\"inputs\":[{\"name\":\"taskHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getTaskStatus\",\"inputs\":[{\"name\":\"taskHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint8\",\"internalType\":\"enumITaskMailboxTypes.TaskStatus\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"initialize\",\"inputs\":[{\"name\":\"_owner\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"_feeSplit\",\"type\":\"uint16\",\"internalType\":\"uint16\"},{\"name\":\"_feeSplitCollector\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"isExecutorOperatorSetRegistered\",\"inputs\":[{\"name\":\"operatorSetKey\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"isRegistered\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"owner\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"refundFee\",\"inputs\":[{\"name\":\"taskHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"registerExecutorOperatorSet\",\"inputs\":[{\"name\":\"operatorSet\",\"type\":\"tuple\",\"internalType\":\"structOperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]},{\"name\":\"isRegistered\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"renounceOwnership\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"setExecutorOperatorSetTaskConfig\",\"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\":\"structITaskMailboxTypes.ExecutorOperatorSetTaskConfig\",\"components\":[{\"name\":\"taskHook\",\"type\":\"address\",\"internalType\":\"contractIAVSTaskHook\"},{\"name\":\"taskSLA\",\"type\":\"uint96\",\"internalType\":\"uint96\"},{\"name\":\"feeToken\",\"type\":\"address\",\"internalType\":\"contractIERC20\"},{\"name\":\"curveType\",\"type\":\"uint8\",\"internalType\":\"enumIKeyRegistrarTypes.CurveType\"},{\"name\":\"feeCollector\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"consensus\",\"type\":\"tuple\",\"internalType\":\"structITaskMailboxTypes.Consensus\",\"components\":[{\"name\":\"consensusType\",\"type\":\"uint8\",\"internalType\":\"enumITaskMailboxTypes.ConsensusType\"},{\"name\":\"value\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]},{\"name\":\"taskMetadata\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"setFeeSplit\",\"inputs\":[{\"name\":\"_feeSplit\",\"type\":\"uint16\",\"internalType\":\"uint16\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"setFeeSplitCollector\",\"inputs\":[{\"name\":\"_feeSplitCollector\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"submitResult\",\"inputs\":[{\"name\":\"taskHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"executorCert\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"result\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"transferOwnership\",\"inputs\":[{\"name\":\"newOwner\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"event\",\"name\":\"ExecutorOperatorSetRegistered\",\"inputs\":[{\"name\":\"caller\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"avs\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"executorOperatorSetId\",\"type\":\"uint32\",\"indexed\":true,\"internalType\":\"uint32\"},{\"name\":\"isRegistered\",\"type\":\"bool\",\"indexed\":false,\"internalType\":\"bool\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ExecutorOperatorSetTaskConfigSet\",\"inputs\":[{\"name\":\"caller\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"avs\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"executorOperatorSetId\",\"type\":\"uint32\",\"indexed\":true,\"internalType\":\"uint32\"},{\"name\":\"config\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structITaskMailboxTypes.ExecutorOperatorSetTaskConfig\",\"components\":[{\"name\":\"taskHook\",\"type\":\"address\",\"internalType\":\"contractIAVSTaskHook\"},{\"name\":\"taskSLA\",\"type\":\"uint96\",\"internalType\":\"uint96\"},{\"name\":\"feeToken\",\"type\":\"address\",\"internalType\":\"contractIERC20\"},{\"name\":\"curveType\",\"type\":\"uint8\",\"internalType\":\"enumIKeyRegistrarTypes.CurveType\"},{\"name\":\"feeCollector\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"consensus\",\"type\":\"tuple\",\"internalType\":\"structITaskMailboxTypes.Consensus\",\"components\":[{\"name\":\"consensusType\",\"type\":\"uint8\",\"internalType\":\"enumITaskMailboxTypes.ConsensusType\"},{\"name\":\"value\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]},{\"name\":\"taskMetadata\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"FeeRefunded\",\"inputs\":[{\"name\":\"refundCollector\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"taskHash\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"avsFee\",\"type\":\"uint96\",\"indexed\":false,\"internalType\":\"uint96\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"FeeSplitCollectorSet\",\"inputs\":[{\"name\":\"feeSplitCollector\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"FeeSplitSet\",\"inputs\":[{\"name\":\"feeSplit\",\"type\":\"uint16\",\"indexed\":false,\"internalType\":\"uint16\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Initialized\",\"inputs\":[{\"name\":\"version\",\"type\":\"uint8\",\"indexed\":false,\"internalType\":\"uint8\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"OwnershipTransferred\",\"inputs\":[{\"name\":\"previousOwner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"newOwner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"TaskCreated\",\"inputs\":[{\"name\":\"creator\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"taskHash\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"avs\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"executorOperatorSetId\",\"type\":\"uint32\",\"indexed\":false,\"internalType\":\"uint32\"},{\"name\":\"operatorTableReferenceTimestamp\",\"type\":\"uint32\",\"indexed\":false,\"internalType\":\"uint32\"},{\"name\":\"refundCollector\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"},{\"name\":\"avsFee\",\"type\":\"uint96\",\"indexed\":false,\"internalType\":\"uint96\"},{\"name\":\"taskDeadline\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"payload\",\"type\":\"bytes\",\"indexed\":false,\"internalType\":\"bytes\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"TaskVerified\",\"inputs\":[{\"name\":\"aggregator\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"taskHash\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"avs\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"executorOperatorSetId\",\"type\":\"uint32\",\"indexed\":false,\"internalType\":\"uint32\"},{\"name\":\"executorCert\",\"type\":\"bytes\",\"indexed\":false,\"internalType\":\"bytes\"},{\"name\":\"result\",\"type\":\"bytes\",\"indexed\":false,\"internalType\":\"bytes\"}],\"anonymous\":false},{\"type\":\"error\",\"name\":\"CertificateStale\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"EmptyCertificateSignature\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ExecutorOperatorSetNotRegistered\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ExecutorOperatorSetTaskConfigNotSet\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"FeeAlreadyRefunded\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidAddressZero\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidConsensusType\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidConsensusValue\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidCurveType\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidFeeReceiver\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidFeeSplit\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidMessageHash\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidOperatorSetOwner\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidReferenceTimestamp\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidTaskCreator\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidTaskStatus\",\"inputs\":[{\"name\":\"expected\",\"type\":\"uint8\",\"internalType\":\"enumITaskMailboxTypes.TaskStatus\"},{\"name\":\"actual\",\"type\":\"uint8\",\"internalType\":\"enumITaskMailboxTypes.TaskStatus\"}]},{\"type\":\"error\",\"name\":\"OnlyRefundCollector\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"PayloadIsEmpty\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"TaskSLAExceedsMaximum\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ThresholdNotMet\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"TimestampAtCreation\",\"inputs\":[]}]",
	Bin: "0x60e060405234801561000f575f5ffd5b50604051615afb380380615afb83398101604081905261002e91610135565b6001600160a01b03808416608052821660a0526001600160601b03811660c05261005661005e565b505050610185565b5f54610100900460ff16156100c95760405162461bcd60e51b815260206004820152602760248201527f496e697469616c697a61626c653a20636f6e747261637420697320696e697469604482015266616c697a696e6760c81b606482015260840160405180910390fd5b5f5460ff90811614610118575f805460ff191660ff9081179091556040519081527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b565b80516001600160a01b0381168114610130575f5ffd5b919050565b5f5f5f60608486031215610147575f5ffd5b6101508461011a565b925061015e6020850161011a565b60408501519092506001600160601b038116811461017a575f5ffd5b809150509250925092565b60805160a05160c05161591b6101e05f395f81816103450152612ece01525f81816102650152818161323d015281816138120152613a3501525f81816103aa015281816131fd015281816137400152613962015261591b5ff3fe608060405234801561000f575f5ffd5b5060043610610153575f3560e01c8063678fbdb3116100bf578063b869416611610079578063b86941661461032d578063d3e043aa14610340578063f2fde38b1461037f578063f741e81a14610392578063f7424fc9146103a5578063fa2c0b37146103cc575f5ffd5b8063678fbdb3146102bb5780636bf6fad5146102ce578063708c0db9146102ee578063715018a6146103015780638da5cb5b14610309578063a5fabc811461031a575f5ffd5b8063468c07a011610110578063468c07a01461021857806349acd8841461022d5780634ad52e021461024057806354743ad21461026057806362fee037146102875780636373ea691461029a575f5ffd5b80631270a892146101575780631a20c505146101805780631ae370eb146101b15780631fb66f5d146101c45780632bf6cc79146101e557806337eaa10414610205575b5f5ffd5b61016a6101653660046141bb565b6103fe565b6040516101779190614270565b60405180910390f35b609b54610199906201000090046001600160a01b031681565b6040516001600160a01b039091168152602001610177565b61016a6101bf3660046144cd565b610427565b6101d76101d236600461460c565b61043a565b604051908152602001610177565b6101f86101f3366004614681565b610de3565b60405161017791906146c0565b6101d76102133660046146ce565b61128f565b61022b610226366004614720565b6112c2565b005b61022b61023b366004614748565b6112d6565b61025361024e366004614681565b611521565b6040516101779190614864565b6101997f000000000000000000000000000000000000000000000000000000000000000081565b61016a610295366004614681565b611aba565b609b546102a89061ffff1681565b60405161ffff9091168152602001610177565b61022b6102c93660046149af565b611fb7565b6102e16102dc3660046149ca565b611fc8565b60405161017791906149e4565b61022b6102fc3660046149f6565b6121dc565b61022b61230d565b6033546001600160a01b0316610199565b61022b610328366004614a3e565b612320565b61022b61033b366004614681565b612bfe565b6103677f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160601b039091168152602001610177565b61022b61038d3660046149af565b612e30565b61022b6103a0366004614b30565b612ea6565b6101997f000000000000000000000000000000000000000000000000000000000000000081565b6103ee6103da366004614681565b60996020525f908152604090205460ff1681565b6040519015158152602001610177565b6060816040516020016104119190614c5b565b6040516020818303038152906040529050919050565b6060816040516020016104119190614ddf565b5f6104436130db565b5f8260400151511161046857604051636b1a1b6960e11b815260040160405180910390fd5b60995f6104788460200151613134565b815260208101919091526040015f205460ff166104a85760405163c292b29760e01b815260040160405180910390fd5b5f609a5f6104b98560200151613134565b815260208082019290925260409081015f20815160e08101835281546001600160a01b038082168352600160a01b918290046001600160601b03169583019590955260018301549485169382019390935292909160608401910460ff16600281111561052757610527614698565b600281111561053857610538614698565b815260028201546001600160a01b0316602082015260408051808201825260038401805492909301929091829060ff16600181111561057957610579614698565b600181111561058a5761058a614698565b815260200160018201805461059e90614df1565b80601f01602080910402602001604051908101604052809291908181526020018280546105ca90614df1565b80156106155780601f106105ec57610100808354040283529160200191610615565b820191905f5260205f20905b8154815290600101906020018083116105f857829003601f168201915b505050505081525050815260200160058201805461063290614df1565b80601f016020809104026020016040519081016040528092919081815260200182805461065e90614df1565b80156106a95780601f10610680576101008083540402835291602001916106a9565b820191905f5260205f20905b81548152906001019060200180831161068c57829003601f168201915b50505050508152505090506106bd81613197565b6106da576040516314b0a41d60e11b815260040160405180910390fd5b5f6106e882606001516131e0565b90505f816001600160a01b0316635ddb9b5b86602001516040518263ffffffff1660e01b815260040161071b9190614e47565b602060405180830381865afa158015610736573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061075a9190614e55565b90505f826001600160a01b0316636141879e87602001516040518263ffffffff1660e01b815260040161078d9190614e47565b602060405180830381865afa1580156107a8573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906107cc9190614e55565b905063ffffffff8116158061080857506107e68183614e84565b63ffffffff1684602001516001600160601b0316426108059190614ea0565b11155b6108255760405163640fcd6b60e11b815260040160405180910390fd5b508251604051630a3fc61360e31b81526001600160a01b03909116906351fe3098906108579033908990600401614eee565b5f6040518083038186803b15801561086d575f5ffd5b505afa15801561087f573d5f5f3e3d5ffd5b50508451604051637036693f60e11b81525f93506001600160a01b03909116915063e06cd27e906108b4908990600401614f11565b602060405180830381865afa1580156108cf573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906108f39190614f23565b90505f60975430468960405160200161090f9493929190614f3e565b60405160208183030381529060405280519060200120905060975460016109369190614ea0565b609755604080516101c08101909152338152602081016109554261327a565b6001600160601b03908116825260208a81018051516001600160a01b039081168386015292871660408501528b5190921660608401529051015163ffffffff166080820152609b5461ffff1660a082015260c001600181525f602080830182905263ffffffff80881660408086019190915260608086018c90528d8201516080808801919091528251808601845286815260a0808901919091528351808701855287815260c09889015289875260988652958390208851958901516001600160601b03908116600160a01b9081026001600160a01b03988916178355948a0151938a0151168402928616929092176001830155870151600282018054968901519789015161ffff16600160c01b0261ffff60c01b19989095169093026001600160c01b0319909616941693909317939093179384168117835560e0850151919391929160ff60d01b1990911662ffffff60c01b1990911617600160d01b836003811115610ac457610ac4614698565b02179055506101008201516002808301805461012086015163ffffffff16600160e01b026001600160e01b03941515600160d81b02949094166001600160d81b039091161792909217909155610140830151805160208201516001600160601b0316600160a01b9081026001600160a01b0392831617600386019081556040840151600487018054919094166001600160a01b031982168117855560608601519596929594936001600160a81b031990921617918490811115610b8957610b89614698565b021790555060808201516002820180546001600160a01b0319166001600160a01b0390921691909117905560a08201518051600383018054909190829060ff191660018381811115610bdd57610bdd614698565b021790555060208201516001820190610bf69082614fbf565b50505060c08201516005820190610c0d9082614fbf565b5050506101608201516009820190610c259082614fbf565b50610180820151600a820190610c3b9082614fbf565b506101a0820151600b820190610c519082614fbf565b50505060408501516001600160a01b031615801590610c7857505f826001600160601b0316115b15610cf35760808501516001600160a01b0316610ca857604051633480121760e21b815260040160405180910390fd5b86516001600160a01b0316610cd057604051633480121760e21b815260040160405180910390fd5b6040850151610cf3906001600160a01b031633306001600160601b0386166132e5565b8451604051629c5c4560e41b8152600481018390526001600160a01b03909116906309c5c450906024015f604051808303815f87803b158015610d34575f5ffd5b505af1158015610d46573d5f5f3e3d5ffd5b5050505086602001515f01516001600160a01b031681336001600160a01b03167f33add0b01e02278be5459fbfa3274aee699ec47f4ee7236b59e7a2c8b5000c268a6020015160200151878c5f0151888c602001516001600160601b031642610daf9190614ea0565b8f60400151604051610dc696959493929190615079565b60405180910390a4945050505050610dde6001606555565b919050565b5f81815260986020908152604080832081516101c08101835281546001600160a01b038082168352600160a01b918290046001600160601b03908116968401969096526001840154808216958401959095529381900490941660608201526002820154928316608082015292820463ffffffff1660a0840152600160c01b820461ffff1660c084015283929160e0830190600160d01b900460ff166003811115610e8f57610e8f614698565b6003811115610ea057610ea0614698565b8152600282810154600160d81b810460ff9081161515602080860191909152600160e01b90920463ffffffff16604080860191909152805160e0810182526003870180546001600160a01b038082168452600160a01b918290046001600160601b03169684019690965260048901549586169383019390935260609687019691959094918601939290910490911690811115610f3e57610f3e614698565b6002811115610f4f57610f4f614698565b815260028201546001600160a01b0316602082015260408051808201825260038401805492909301929091829060ff166001811115610f9057610f90614698565b6001811115610fa157610fa1614698565b8152602001600182018054610fb590614df1565b80601f0160208091040260200160405190810160405280929190818152602001828054610fe190614df1565b801561102c5780601f106110035761010080835404028352916020019161102c565b820191905f5260205f20905b81548152906001019060200180831161100f57829003601f168201915b505050505081525050815260200160058201805461104990614df1565b80601f016020809104026020016040519081016040528092919081815260200182805461107590614df1565b80156110c05780601f10611097576101008083540402835291602001916110c0565b820191905f5260205f20905b8154815290600101906020018083116110a357829003601f168201915b50505050508152505081526020016009820180546110dd90614df1565b80601f016020809104026020016040519081016040528092919081815260200182805461110990614df1565b80156111545780601f1061112b57610100808354040283529160200191611154565b820191905f5260205f20905b81548152906001019060200180831161113757829003601f168201915b50505050508152602001600a8201805461116d90614df1565b80601f016020809104026020016040519081016040528092919081815260200182805461119990614df1565b80156111e45780601f106111bb576101008083540402835291602001916111e4565b820191905f5260205f20905b8154815290600101906020018083116111c757829003601f168201915b50505050508152602001600b820180546111fd90614df1565b80601f016020809104026020016040519081016040528092919081815260200182805461122990614df1565b80156112745780601f1061124b57610100808354040283529160200191611274565b820191905f5260205f20905b81548152906001019060200180831161125757829003601f168201915b505050505081525050905061128881613357565b9392505050565b5f82826040516020016112a39291906150d2565b6040516020818303038152906040528051906020012090505b92915050565b6112ca6133b2565b6112d38161340c565b50565b5f609a5f6112e385613134565b815260208082019290925260409081015f20815160e08101835281546001600160a01b038082168352600160a01b918290046001600160601b03169583019590955260018301549485169382019390935292909160608401910460ff16600281111561135157611351614698565b600281111561136257611362614698565b815260028201546001600160a01b0316602082015260408051808201825260038401805492909301929091829060ff1660018111156113a3576113a3614698565b60018111156113b4576113b4614698565b81526020016001820180546113c890614df1565b80601f01602080910402602001604051908101604052809291908181526020018280546113f490614df1565b801561143f5780601f106114165761010080835404028352916020019161143f565b820191905f5260205f20905b81548152906001019060200180831161142257829003601f168201915b505050505081525050815260200160058201805461145c90614df1565b80601f016020809104026020016040519081016040528092919081815260200182805461148890614df1565b80156114d35780601f106114aa576101008083540402835291602001916114d3565b820191905f5260205f20905b8154815290600101906020018083116114b657829003601f168201915b50505050508152505090506114e781613197565b611504576040516314b0a41d60e11b815260040160405180910390fd5b61151283826060015161347d565b61151c838361351e565b505050565b611529613f9b565b5f82815260986020908152604080832081516101c08101835281546001600160a01b038082168352600160a01b918290046001600160601b03908116968401969096526001840154808216958401959095529381900490941660608201526002820154928316608082015292820463ffffffff1660a0840152600160c01b820461ffff1660c08401529060e0830190600160d01b900460ff1660038111156115d3576115d3614698565b60038111156115e4576115e4614698565b8152600282810154600160d81b810460ff9081161515602080860191909152600160e01b90920463ffffffff16604080860191909152805160e0810182526003870180546001600160a01b038082168452600160a01b918290046001600160601b0316968401969096526004890154958616938301939093526060968701969195909491860193929091049091169081111561168257611682614698565b600281111561169357611693614698565b815260028201546001600160a01b0316602082015260408051808201825260038401805492909301929091829060ff1660018111156116d4576116d4614698565b60018111156116e5576116e5614698565b81526020016001820180546116f990614df1565b80601f016020809104026020016040519081016040528092919081815260200182805461172590614df1565b80156117705780601f1061174757610100808354040283529160200191611770565b820191905f5260205f20905b81548152906001019060200180831161175357829003601f168201915b505050505081525050815260200160058201805461178d90614df1565b80601f01602080910402602001604051908101604052809291908181526020018280546117b990614df1565b80156118045780601f106117db57610100808354040283529160200191611804565b820191905f5260205f20905b8154815290600101906020018083116117e757829003601f168201915b505050505081525050815260200160098201805461182190614df1565b80601f016020809104026020016040519081016040528092919081815260200182805461184d90614df1565b80156118985780601f1061186f57610100808354040283529160200191611898565b820191905f5260205f20905b81548152906001019060200180831161187b57829003601f168201915b50505050508152602001600a820180546118b190614df1565b80601f01602080910402602001604051908101604052809291908181526020018280546118dd90614df1565b80156119285780601f106118ff57610100808354040283529160200191611928565b820191905f5260205f20905b81548152906001019060200180831161190b57829003601f168201915b50505050508152602001600b8201805461194190614df1565b80601f016020809104026020016040519081016040528092919081815260200182805461196d90614df1565b80156119b85780601f1061198f576101008083540402835291602001916119b8565b820191905f5260205f20905b81548152906001019060200180831161199b57829003601f168201915b5050505050815250509050604051806101c00160405280825f01516001600160a01b0316815260200182602001516001600160601b0316815260200182604001516001600160a01b0316815260200182606001516001600160601b0316815260200182608001516001600160a01b031681526020018260a0015163ffffffff1681526020018260c0015161ffff168152602001611a5483613357565b6003811115611a6557611a65614698565b81526020018261010001511515815260200182610120015163ffffffff168152602001826101400151815260200182610160015181526020018261018001518152602001826101a00151815250915050919050565b5f81815260986020908152604080832081516101c08101835281546001600160a01b038082168352600160a01b918290046001600160601b0390811696840196909652600184015480821695840195909552938190049094166060808301919091526002830154938416608083015293830463ffffffff1660a0820152600160c01b830461ffff1660c08201529293929160e0830190600160d01b900460ff166003811115611b6b57611b6b614698565b6003811115611b7c57611b7c614698565b8152600282810154600160d81b810460ff9081161515602080860191909152600160e01b90920463ffffffff16604080860191909152805160e0810182526003870180546001600160a01b038082168452600160a01b918290046001600160601b03169684019690965260048901549586169383019390935260609687019691959094918601939290910490911690811115611c1a57611c1a614698565b6002811115611c2b57611c2b614698565b815260028201546001600160a01b0316602082015260408051808201825260038401805492909301929091829060ff166001811115611c6c57611c6c614698565b6001811115611c7d57611c7d614698565b8152602001600182018054611c9190614df1565b80601f0160208091040260200160405190810160405280929190818152602001828054611cbd90614df1565b8015611d085780601f10611cdf57610100808354040283529160200191611d08565b820191905f5260205f20905b815481529060010190602001808311611ceb57829003601f168201915b5050505050815250508152602001600582018054611d2590614df1565b80601f0160208091040260200160405190810160405280929190818152602001828054611d5190614df1565b8015611d9c5780601f10611d7357610100808354040283529160200191611d9c565b820191905f5260205f20905b815481529060010190602001808311611d7f57829003601f168201915b5050505050815250508152602001600982018054611db990614df1565b80601f0160208091040260200160405190810160405280929190818152602001828054611de590614df1565b8015611e305780601f10611e0757610100808354040283529160200191611e30565b820191905f5260205f20905b815481529060010190602001808311611e1357829003601f168201915b50505050508152602001600a82018054611e4990614df1565b80601f0160208091040260200160405190810160405280929190818152602001828054611e7590614df1565b8015611ec05780601f10611e9757610100808354040283529160200191611ec0565b820191905f5260205f20905b815481529060010190602001808311611ea357829003601f168201915b50505050508152602001600b82018054611ed990614df1565b80601f0160208091040260200160405190810160405280929190818152602001828054611f0590614df1565b8015611f505780601f10611f2757610100808354040283529160200191611f50565b820191905f5260205f20905b815481529060010190602001808311611f3357829003601f168201915b50505050508152505090505f611f6582613357565b90506002816003811115611f7b57611f7b614698565b146002829091611fa957604051634091b18960e11b8152600401611fa09291906150ea565b60405180910390fd5b5050506101a0015192915050565b611fbf6133b2565b6112d3816135af565b611fd061400e565b609a5f611fdc84613134565b815260208082019290925260409081015f20815160e08101835281546001600160a01b038082168352600160a01b918290046001600160601b03169583019590955260018301549485169382019390935292909160608401910460ff16600281111561204a5761204a614698565b600281111561205b5761205b614698565b815260028201546001600160a01b0316602082015260408051808201825260038401805492909301929091829060ff16600181111561209c5761209c614698565b60018111156120ad576120ad614698565b81526020016001820180546120c190614df1565b80601f01602080910402602001604051908101604052809291908181526020018280546120ed90614df1565b80156121385780601f1061210f57610100808354040283529160200191612138565b820191905f5260205f20905b81548152906001019060200180831161211b57829003601f168201915b505050505081525050815260200160058201805461215590614df1565b80601f016020809104026020016040519081016040528092919081815260200182805461218190614df1565b80156121cc5780601f106121a3576101008083540402835291602001916121cc565b820191905f5260205f20905b8154815290600101906020018083116121af57829003601f168201915b5050505050815250509050919050565b5f54610100900460ff16158080156121fa57505f54600160ff909116105b806122135750303b15801561221357505f5460ff166001145b6122765760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b6064820152608401611fa0565b5f805460ff191660011790558015612297575f805461ff0019166101001790555b61229f613629565b6122a7613657565b6122b084613685565b6122b98361340c565b6122c2826135af565b8015612307575f805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b50505050565b6123156133b2565b61231e5f613685565b565b6123286130db565b5f83815260986020908152604080832081516101c08101835281546001600160a01b038082168352600160a01b918290046001600160601b03908116968401969096526001840154808216958401959095529381900490941660608201526002820154928316608082015292820463ffffffff1660a0840152600160c01b820461ffff1660c084015292916127cc91849060e0830190600160d01b900460ff1660038111156123d9576123d9614698565b60038111156123ea576123ea614698565b8152600282810154600160d81b810460ff9081161515602080860191909152600160e01b90920463ffffffff16604080860191909152805160e0810182526003870180546001600160a01b038082168452600160a01b918290046001600160601b0316968401969096526004890154958616938301939093526060968701969195909491860193929091049091169081111561248857612488614698565b600281111561249957612499614698565b815260028201546001600160a01b0316602082015260408051808201825260038401805492909301929091829060ff1660018111156124da576124da614698565b60018111156124eb576124eb614698565b81526020016001820180546124ff90614df1565b80601f016020809104026020016040519081016040528092919081815260200182805461252b90614df1565b80156125765780601f1061254d57610100808354040283529160200191612576565b820191905f5260205f20905b81548152906001019060200180831161255957829003601f168201915b505050505081525050815260200160058201805461259390614df1565b80601f01602080910402602001604051908101604052809291908181526020018280546125bf90614df1565b801561260a5780601f106125e15761010080835404028352916020019161260a565b820191905f5260205f20905b8154815290600101906020018083116125ed57829003601f168201915b505050505081525050815260200160098201805461262790614df1565b80601f016020809104026020016040519081016040528092919081815260200182805461265390614df1565b801561269e5780601f106126755761010080835404028352916020019161269e565b820191905f5260205f20905b81548152906001019060200180831161268157829003601f168201915b50505050508152602001600a820180546126b790614df1565b80601f01602080910402602001604051908101604052809291908181526020018280546126e390614df1565b801561272e5780601f106127055761010080835404028352916020019161272e565b820191905f5260205f20905b81548152906001019060200180831161271157829003601f168201915b50505050508152602001600b8201805461274790614df1565b80601f016020809104026020016040519081016040528092919081815260200182805461277390614df1565b80156127be5780601f10612795576101008083540402835291602001916127be565b820191905f5260205f20905b8154815290600101906020018083116127a157829003601f168201915b505050505081525050613357565b905060018160038111156127e2576127e2614698565b14600182909161280757604051634091b18960e11b8152600401611fa09291906150ea565b50508154600160a01b90046001600160601b0316421161283a5760405163015a4b7560e51b815260040160405180910390fd5b600382015460405163ba33565d60e01b81526001600160a01b039091169063ba33565d90612872903390899089908990600401615105565b5f6040518083038186803b158015612888575f5ffd5b505afa15801561289a573d5f5f3e3d5ffd5b50506040805180820182526001808701546001600160a01b03168252600287015463ffffffff600160a01b91829004166020840152600488015484518086019095526006890180549497506129d6965060ff929091048216949390928492919091169081111561290c5761290c614698565b600181111561291d5761291d614698565b815260200160018201805461293190614df1565b80601f016020809104026020016040519081016040528092919081815260200182805461295d90614df1565b80156129a85780601f1061297f576101008083540402835291602001916129a8565b820191905f5260205f20905b81548152906001019060200180831161298b57829003601f168201915b5050509190925250505060028601548490600160e01b900463ffffffff166129d08b8a61128f565b8a6136d6565b60028301805460ff60d01b1916600160d11b179055600a83016129f98682614fbf565b50600b8301612a088582614fbf565b5060048301546001600160a01b031615801590612a3857506001830154600160a01b90046001600160601b031615155b15612b2757600283015460018401545f91612a879161271091612a7891600160c01b90910461ffff16906001600160601b03600160a01b9091041661513d565b612a829190615154565b61327a565b90506001600160601b03811615612ac757609b546004850154612ac7916001600160a01b039182169162010000909104166001600160601b038416613af8565b60018401545f90612ae9908390600160a01b90046001600160601b0316615173565b90506001600160601b03811615612b245760058501546004860154612b24916001600160a01b0391821691166001600160601b038416613af8565b50505b6003830154604051637041233f60e11b8152336004820152602481018890526001600160a01b039091169063e082467e906044015f604051808303815f87803b158015612b72575f5ffd5b505af1158015612b84573d5f5f3e3d5ffd5b505050600184015460028501546040516001600160a01b039092169250889133917f659f23b2e7edf490e5fd6561c5148691ed0375ed7ddd3ab1bcfcfdbec4f209a991612be99163ffffffff600160a01b9091041690600a8a0190600b8b0190615211565b60405180910390a450505061151c6001606555565b612c066130db565b5f81815260986020526040902060028101546001600160a01b03163314612c40576040516370f43cb760e01b815260040160405180910390fd5b6002810154600160d81b900460ff1615612c6d57604051633e3d786960e01b815260040160405180910390fd5b604080516101c08101825282546001600160a01b038082168352600160a01b918290046001600160601b03908116602085015260018601548083169585019590955293829004909316606083015260028401549283166080830152820463ffffffff1660a0820152600160c01b820461ffff1660c08201525f91612d0e9190849060e0830190600160d01b900460ff1660038111156123d9576123d9614698565b90506003816003811115612d2457612d24614698565b146003829091612d4957604051634091b18960e11b8152600401611fa09291906150ea565b505060028201805460ff60d81b1916600160d81b17905560048201546001600160a01b031615801590612d8f57506001820154600160a01b90046001600160601b031615155b15612dcb57600282015460018301546004840154612dcb926001600160a01b0391821692911690600160a01b90046001600160601b0316613af8565b60028201546001830154604051600160a01b9091046001600160601b0316815284916001600160a01b0316907fe3ed40d31808582f7a92a30beacc0ec788d5091407ec6c10c1b999b3f317aea39060200160405180910390a350506112d36001606555565b612e386133b2565b6001600160a01b038116612e9d5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401611fa0565b6112d381613685565b612eaf81613197565b612ecc576040516314b0a41d60e11b815260040160405180910390fd5b7f00000000000000000000000000000000000000000000000000000000000000006001600160601b031681602001516001600160601b03161115612f235760405163a7cf966560e01b815260040160405180910390fd5b612f308160a00151613b28565b612f3e82826060015161347d565b80609a5f612f4b85613134565b815260208082019290925260409081015f208351928401516001600160601b0316600160a01b9081026001600160a01b0394851617825591840151600182018054919094166001600160a01b03198216811785556060860151929492936001600160a81b03199092161790836002811115612fc857612fc8614698565b021790555060808201516002820180546001600160a01b0319166001600160a01b0390921691909117905560a08201518051600383018054909190829060ff19166001838181111561301c5761301c614698565b0217905550602082015160018201906130359082614fbf565b50505060c0820151600582019061304c9082614fbf565b50905050816020015163ffffffff16825f01516001600160a01b0316336001600160a01b03167f7cd76abd4025a20959a1b20f7c1536e3894a0735cd8de0215dde803ddea7f2d2846040516130a191906149e4565b60405180910390a460995f6130b584613134565b815260208101919091526040015f205460ff166130d7576130d782600161351e565b5050565b60026065540361312d5760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401611fa0565b6002606555565b5f815f0151826020015163ffffffff1660405160200161317f92919060609290921b6bffffffffffffffffffffffff1916825260a01b6001600160a01b031916601482015260200190565b6040516020818303038152906040526112bc90615241565b5f80826060015160028111156131af576131af614698565b141580156131c6575081516001600160a01b031615155b80156112bc575050602001516001600160601b0316151590565b5f60028260028111156131f5576131f5614698565b0361322157507f0000000000000000000000000000000000000000000000000000000000000000919050565b600182600281111561323557613235614698565b0361326157507f0000000000000000000000000000000000000000000000000000000000000000919050565b60405163fdea7c0960e01b815260040160405180910390fd5b5f6001600160601b038211156132e15760405162461bcd60e51b815260206004820152602660248201527f53616665436173743a2076616c756520646f65736e27742066697420696e203960448201526536206269747360d01b6064820152608401611fa0565b5090565b6040516001600160a01b03808516602483015283166044820152606481018290526123079085906323b872dd60e01b906084015b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b031990931692909217909152613be7565b6001606555565b5f60018260e00151600381111561337057613370614698565b14801561339d57508161014001516020015182602001516133919190615264565b6001600160601b031642115b156133aa57506003919050565b5060e0015190565b6033546001600160a01b0316331461231e5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401611fa0565b61271061ffff8216111561343357604051630601f69760e01b815260040160405180910390fd5b609b805461ffff191661ffff83169081179091556040519081527f886b2cfcb151fd8b19ed902cc88f4a06dd9fe351a4a9ab93f33fe84abc157edf9060200160405180910390a150565b5f613487826131e0565b6040516304240c4960e51b815290915033906001600160a01b038316906384818920906134b8908790600401614e47565b602060405180830381865afa1580156134d3573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906134f79190615283565b6001600160a01b03161461151c576040516342ecfee960e11b815260040160405180910390fd5b8060995f61352b85613134565b81526020019081526020015f205f6101000a81548160ff021916908315150217905550816020015163ffffffff16825f01516001600160a01b0316336001600160a01b03167f48b63f21a1eb9dd6880e196de6d7db3fbd0c282b74f1298dcb4cf53472298f39846040516135a3911515815260200190565b60405180910390a45050565b6001600160a01b0381166135d657604051630863a45360e11b815260040160405180910390fd5b609b805462010000600160b01b031916620100006001600160a01b038416908102919091179091556040517f262aa27c244f6f0088cb3092548a0adcaddedf459070a9ccab2dc6a07abe701d905f90a250565b5f54610100900460ff1661364f5760405162461bcd60e51b8152600401611fa09061529e565b61231e613cba565b5f54610100900460ff1661367d5760405162461bcd60e51b8152600401611fa09061529e565b61231e613ce9565b603380546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a35050565b5f855160018111156136ea576136ea614698565b0361389257600286600281111561370357613703614698565b036137c0575f8180602001905181019061371d9190615549565b905061372a818585613d0f565b6040516280b71560e41b81526001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169063080b715090613777908890859060040161561b565b5f604051808303815f875af1158015613792573d5f5f3e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526137b9919081019061563a565b5050613af0565b60018660028111156137d4576137d4614698565b03613261575f818060200190518101906137ee919061566b565b90506137fb818585613d99565b6040516380c7d3f360e01b81526001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016906380c7d3f39061384990889085906004016156e4565b5f60405180830381865afa158015613863573d5f5f3e3d5ffd5b505050506040513d5f823e601f3d908101601f1916820160405261388a9190810190615767565b505050613af0565b6001855160018111156138a7576138a7614698565b03613ad7575f85602001518060200190518101906138c591906157c0565b6040805160018082528183019092529192505f91906020808301908036833701905050905081815f815181106138fd576138fd6157db565b61ffff909216602092830291909101909101525f600289600281111561392557613925614698565b036139e3575f8480602001905181019061393f9190615549565b905061394c818888613d0f565b604051625f5e5d60e21b81526001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169063017d79749061399b908b908590889060040161582d565b6020604051808303815f875af11580156139b7573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906139db919061585e565b915050613ab9565b60018960028111156139f7576139f7614698565b03613261575f84806020019051810190613a11919061566b565b9050613a1e818888613d99565b604051630606d12160e51b81526001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169063c0da242090613a6e908b9085908890600401615879565b5f60405180830381865afa158015613a88573d5f5f3e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052613aaf9190810190615898565b509150613ab99050565b8061388a576040516359fa4a9360e01b815260040160405180910390fd5b6040516347d3772160e11b815260040160405180910390fd5b505050505050565b6040516001600160a01b03831660248201526044810182905261151c90849063a9059cbb60e01b90606401613319565b5f81516001811115613b3c57613b3c614698565b03613b6557602081015151156112d357604051631501e04760e21b815260040160405180910390fd5b600181516001811115613b7a57613b7a614698565b03613ad757806020015151602014613ba557604051631501e04760e21b815260040160405180910390fd5b5f8160200151806020019051810190613bbe91906157c0565b905061271061ffff821611156130d757604051631501e04760e21b815260040160405180910390fd5b5f613c3b826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b0316613e119092919063ffffffff16565b905080515f1480613c5b575080806020019051810190613c5b919061585e565b61151c5760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b6064820152608401611fa0565b5f54610100900460ff16613ce05760405162461bcd60e51b8152600401611fa09061529e565b61231e33613685565b5f54610100900460ff166133505760405162461bcd60e51b8152600401611fa09061529e565b8163ffffffff16835f015163ffffffff1614613d3e57604051634534032960e01b815260040160405180910390fd5b80836020015114613d6257604051638b56642d60e01b815260040160405180910390fd5b604083015151158015613d7b5750604083015160200151155b1561151c57604051637a8a1dbd60e11b815260040160405180910390fd5b8163ffffffff16835f015163ffffffff1614613dc857604051634534032960e01b815260040160405180910390fd5b80836020015114613dec57604051638b56642d60e01b815260040160405180910390fd5b5f8360400151511161151c57604051637a8a1dbd60e11b815260040160405180910390fd5b6060613e1f84845f85613e27565b949350505050565b606082471015613e885760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6044820152651c8818d85b1b60d21b6064820152608401611fa0565b5f5f866001600160a01b03168587604051613ea391906158cf565b5f6040518083038185875af1925050503d805f8114613edd576040519150601f19603f3d011682016040523d82523d5f602084013e613ee2565b606091505b5091509150613ef387838387613efe565b979650505050505050565b60608315613f6c5782515f03613f65576001600160a01b0385163b613f655760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401611fa0565b5081613e1f565b613e1f8383815115613f815781518083602001fd5b8060405162461bcd60e51b8152600401611fa09190614270565b604080516101c0810182525f80825260208201819052918101829052606081018290526080810182905260a0810182905260c081018290529060e082019081525f602082018190526040820152606001613ff361400e565b81526020016060815260200160608152602001606081525090565b6040805160e0810182525f8082526020820181905291810182905290606082019081525f602082015260400161404261404f565b8152602001606081525090565b60408051808201909152805f614042565b634e487b7160e01b5f52604160045260245ffd5b604051606081016001600160401b038111828210171561409657614096614060565b60405290565b604080519081016001600160401b038111828210171561409657614096614060565b60405160a081016001600160401b038111828210171561409657614096614060565b60405160e081016001600160401b038111828210171561409657614096614060565b604051601f8201601f191681016001600160401b038111828210171561412a5761412a614060565b604052919050565b63ffffffff811681146112d3575f5ffd5b5f6001600160401b0382111561415b5761415b614060565b50601f01601f191660200190565b5f82601f830112614178575f5ffd5b813561418b61418682614143565b614102565b81815284602083860101111561419f575f5ffd5b816020850160208301375f918101602001919091529392505050565b5f602082840312156141cb575f5ffd5b81356001600160401b038111156141e0575f5ffd5b8201606081850312156141f1575f5ffd5b6141f9614074565b813561420481614132565b81526020828101359082015260408201356001600160401b03811115614228575f5ffd5b61423486828501614169565b604083015250949350505050565b5f81518084528060208401602086015e5f602082860101526020601f19601f83011685010191505092915050565b602081525f6112886020830184614242565b5f60408284031215614292575f5ffd5b61429a61409c565b823581526020928301359281019290925250919050565b5f82601f8301126142c0575f5ffd5b6142ca6040614102565b8060408401858111156142db575f5ffd5b845b818110156142f55780358452602093840193016142dd565b509095945050505050565b5f6001600160401b0382111561431857614318614060565b5060051b60200190565b5f82601f830112614331575f5ffd5b813561433f61418682614300565b8082825260208201915060208360051b860101925085831115614360575f5ffd5b602085015b838110156144c35780356001600160401b03811115614382575f5ffd5b86016060818903601f19011215614397575f5ffd5b61439f614074565b60208201356143ad81614132565b815260408201356001600160401b038111156143c7575f5ffd5b6143d68a602083860101614169565b60208301525060608201356001600160401b038111156143f4575f5ffd5b6020818401019250506060828a03121561440c575f5ffd5b61441461409c565b61441e8a84614282565b815260408301356001600160401b03811115614438575f5ffd5b80840193505089601f84011261444c575f5ffd5b823561445a61418682614300565b8082825260208201915060208360051b87010192508c83111561447b575f5ffd5b6020860195505b8286101561449d578535825260209586019590910190614482565b806020850152505050806040830152508085525050602083019250602081019050614365565b5095945050505050565b5f602082840312156144dd575f5ffd5b81356001600160401b038111156144f2575f5ffd5b8201808403610120811215614505575f5ffd5b61450d6140be565b823561451881614132565b8152602083810135908201526145318660408501614282565b60408201526080607f1983011215614547575f5ffd5b61454f61409c565b915061455e86608085016142b1565b825261456d8660c085016142b1565b602083015281606082015261010083013591506001600160401b03821115614593575f5ffd5b61459f86838501614322565b608082015295945050505050565b6001600160a01b03811681146112d3575f5ffd5b8035610dde816145ad565b5f604082840312156145dc575f5ffd5b6145e461409c565b905081356145f1816145ad565b8152602082013561460181614132565b602082015292915050565b5f6020828403121561461c575f5ffd5b81356001600160401b03811115614631575f5ffd5b820160808185031215614642575f5ffd5b61464a614074565b8135614655816145ad565b815261466485602084016145cc565b602082015260608201356001600160401b03811115614228575f5ffd5b5f60208284031215614691575f5ffd5b5035919050565b634e487b7160e01b5f52602160045260245ffd5b600481106146bc576146bc614698565b9052565b602081016112bc82846146ac565b5f5f604083850312156146df575f5ffd5b8235915060208301356001600160401b038111156146fb575f5ffd5b61470785828601614169565b9150509250929050565b61ffff811681146112d3575f5ffd5b5f60208284031215614730575f5ffd5b813561128881614711565b80151581146112d3575f5ffd5b5f5f60608385031215614759575f5ffd5b61476384846145cc565b915060408301356147738161473b565b809150509250929050565b600381106146bc576146bc614698565b5f8151600281106147a1576147a1614698565b80845250602082015160406020850152613e1f6040850182614242565b80516001600160a01b031682526020808201516001600160601b0316908301526040808201515f916147fa908501826001600160a01b03169052565b50606082015161480d606085018261477e565b50608082015161482860808501826001600160a01b03169052565b5060a082015160e060a085015261484260e085018261478e565b905060c083015184820360c086015261485b8282614242565b95945050505050565b6020815261487e6020820183516001600160a01b03169052565b5f602083015161489960408401826001600160601b03169052565b5060408301516001600160a01b03811660608401525060608301516001600160601b03811660808401525060808301516001600160a01b03811660a08401525060a083015163ffffffff811660c08401525060c083015161ffff811660e08401525060e083015161490e6101008401826146ac565b506101008301518015156101208401525061012083015163ffffffff8116610140840152506101408301516101c06101608401526149506101e08401826147be565b9050610160840151601f198483030161018085015261496f8282614242565b915050610180840151601f19848303016101a085015261498f8282614242565b9150506101a0840151601f19848303016101c085015261485b8282614242565b5f602082840312156149bf575f5ffd5b8135611288816145ad565b5f604082840312156149da575f5ffd5b61128883836145cc565b602081525f61128860208301846147be565b5f5f5f60608486031215614a08575f5ffd5b8335614a13816145ad565b92506020840135614a2381614711565b91506040840135614a33816145ad565b809150509250925092565b5f5f5f60608486031215614a50575f5ffd5b8335925060208401356001600160401b03811115614a6c575f5ffd5b614a7886828701614169565b92505060408401356001600160401b03811115614a93575f5ffd5b614a9f86828701614169565b9150509250925092565b6001600160601b03811681146112d3575f5ffd5b8035610dde81614aa9565b803560038110610dde575f5ffd5b5f60408284031215614ae6575f5ffd5b614aee61409c565b9050813560028110614afe575f5ffd5b815260208201356001600160401b03811115614b18575f5ffd5b614b2484828501614169565b60208301525092915050565b5f5f60608385031215614b41575f5ffd5b614b4b84846145cc565b915060408301356001600160401b03811115614b65575f5ffd5b830160e08186031215614b76575f5ffd5b614b7e6140e0565b614b87826145c1565b8152614b9560208301614abd565b6020820152614ba6604083016145c1565b6040820152614bb760608301614ac8565b6060820152614bc8608083016145c1565b608082015260a08201356001600160401b03811115614be5575f5ffd5b614bf187828501614ad6565b60a08301525060c08201356001600160401b03811115614c0f575f5ffd5b614c1b87828501614169565b60c08301525080925050509250929050565b63ffffffff8151168252602081015160208301525f604082015160606040850152613e1f6060850182614242565b602081525f6112886020830184614c2d565b805f5b6002811015612307578151845260209384019390910190600101614c70565b5f610120830163ffffffff8351168452602083015160208501526040830151614cc5604086018280518252602090810151910152565b506060830151614cd9608086018251614c6d565b60200151614cea60c0860182614c6d565b506080830151610120610100860152818151808452610140870191506101408160051b88010193506020830192505f5b81811015614dd35761013f19888603018352835163ffffffff8151168652602081015160606020880152614d516060880182614242565b905060408201519150868103604088015260608101614d7b82845180518252602090810151910152565b6020928301516060604084015280518083529301925f92608001905b80841015614dba5784518252602082019150602085019450600184019350614d97565b5097505050602094850194939093019250600101614d1a565b50929695505050505050565b602081525f6112886020830184614c8f565b600181811c90821680614e0557607f821691505b602082108103614e2357634e487b7160e01b5f52602260045260245ffd5b50919050565b80516001600160a01b0316825260209081015163ffffffff16910152565b604081016112bc8284614e29565b5f60208284031215614e65575f5ffd5b815161128881614132565b634e487b7160e01b5f52601160045260245ffd5b63ffffffff81811683821601908111156112bc576112bc614e70565b808201808211156112bc576112bc614e70565b80516001600160a01b031682526020808201515f91614ed490850182614e29565b50604082015160806060850152613e1f6080850182614242565b6001600160a01b03831681526040602082018190525f90613e1f90830184614eb3565b602081525f6112886020830184614eb3565b5f60208284031215614f33575f5ffd5b815161128881614aa9565b84815260018060a01b0384166020820152826040820152608060608201525f614f6a6080830184614eb3565b9695505050505050565b601f82111561151c57805f5260205f20601f840160051c81016020851015614f995750805b601f840160051c820191505b81811015614fb8575f8155600101614fa5565b5050505050565b81516001600160401b03811115614fd857614fd8614060565b614fec81614fe68454614df1565b84614f74565b6020601f82116001811461501e575f83156150075750848201515b5f19600385901b1c1916600184901b178455614fb8565b5f84815260208120601f198516915b8281101561504d578785015182556020948501946001909201910161502d565b508482101561506a57868401515f19600387901b60f8161c191681555b50505050600190811b01905550565b63ffffffff8716815263ffffffff8616602082015260018060a01b03851660408201526001600160601b038416606082015282608082015260c060a08201525f6150c660c0830184614242565b98975050505050505050565b828152604060208201525f613e1f6040830184614242565b604081016150f882856146ac565b61128860208301846146ac565b60018060a01b0385168152836020820152608060408201525f61512b6080830185614242565b8281036060840152613ef38185614242565b80820281158282048414176112bc576112bc614e70565b5f8261516e57634e487b7160e01b5f52601260045260245ffd5b500490565b6001600160601b0382811682821603908111156112bc576112bc614e70565b5f815461519e81614df1565b8085526001821680156151b857600181146151d457615208565b60ff1983166020870152602082151560051b8701019350615208565b845f5260205f205f5b838110156151ff5781546020828a0101526001820191506020810190506151dd565b87016020019450505b50505092915050565b63ffffffff84168152606060208201525f61522f6060830185615192565b8281036040840152614f6a8185615192565b80516020808301519190811015614e23575f1960209190910360031b1b16919050565b6001600160601b0381811683821601908111156112bc576112bc614e70565b5f60208284031215615293575f5ffd5b8151611288816145ad565b6020808252602b908201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960408201526a6e697469616c697a696e6760a81b606082015260800190565b5f604082840312156152f9575f5ffd5b61530161409c565b825181526020928301519281019290925250919050565b5f82601f830112615327575f5ffd5b6153316040614102565b806040840185811115615342575f5ffd5b845b818110156142f5578051845260209384019301615344565b5f82601f83011261536b575f5ffd5b815161537961418682614143565b81815284602083860101111561538d575f5ffd5b8160208501602083015e5f918101602001919091529392505050565b5f82601f8301126153b8575f5ffd5b81516153c661418682614300565b8082825260208201915060208360051b8601019250858311156153e7575f5ffd5b602085015b838110156144c35780518352602092830192016153ec565b5f82601f830112615413575f5ffd5b815161542161418682614300565b8082825260208201915060208360051b860101925085831115615442575f5ffd5b602085015b838110156144c35780516001600160401b03811115615464575f5ffd5b86016060818903601f19011215615479575f5ffd5b615481614074565b602082015161548f81614132565b815260408201516001600160401b038111156154a9575f5ffd5b6154b88a60208386010161535c565b60208301525060608201516001600160401b038111156154d6575f5ffd5b6020818401019250506060828a0312156154ee575f5ffd5b6154f661409c565b6155008a846152e9565b815260408301516001600160401b0381111561551a575f5ffd5b6155268b8286016153a9565b602083015250806040830152508085525050602083019250602081019050615447565b5f60208284031215615559575f5ffd5b81516001600160401b0381111561556e575f5ffd5b8201808403610120811215615581575f5ffd5b6155896140be565b825161559481614132565b8152602083810151908201526155ad86604085016152e9565b60408201526080607f19830112156155c3575f5ffd5b6155cb61409c565b91506155da8660808501615318565b82526155e98660c08501615318565b602083015281606082015261010083015191506001600160401b0382111561560f575f5ffd5b61459f86838501615404565b6156258184614e29565b606060408201525f613e1f6060830184614c8f565b5f6020828403121561564a575f5ffd5b81516001600160401b0381111561565f575f5ffd5b613e1f848285016153a9565b5f6020828403121561567b575f5ffd5b81516001600160401b03811115615690575f5ffd5b8201606081850312156156a1575f5ffd5b6156a9614074565b81516156b481614132565b81526020828101519082015260408201516001600160401b038111156156d8575f5ffd5b6142348682850161535c565b6156ee8184614e29565b606060408201525f613e1f6060830184614c2d565b5f82601f830112615712575f5ffd5b815161572061418682614300565b8082825260208201915060208360051b860101925085831115615741575f5ffd5b602085015b838110156144c3578051615759816145ad565b835260209283019201615746565b5f5f60408385031215615778575f5ffd5b82516001600160401b0381111561578d575f5ffd5b615799858286016153a9565b92505060208301516001600160401b038111156157b4575f5ffd5b61470785828601615703565b5f602082840312156157d0575f5ffd5b815161128881614711565b634e487b7160e01b5f52603260045260245ffd5b5f8151808452602084019350602083015f5b8281101561582357815161ffff16865260209586019590910190600101615801565b5093949350505050565b6158378185614e29565b608060408201525f61584c6080830185614c8f565b8281036060840152614f6a81856157ef565b5f6020828403121561586e575f5ffd5b81516112888161473b565b6158838185614e29565b608060408201525f61584c6080830185614c2d565b5f5f604083850312156158a9575f5ffd5b82516158b48161473b565b60208401519092506001600160401b038111156157b4575f5ffd5b5f82518060208501845e5f92019182525091905056fea26469706673582212200c2addb5901e8aabaa09084fec22a6bf9ce632d87c36ef4a715d55b3d013506664736f6c634300081e0033",
}
⋮----
// TaskMailboxABI is the input ABI used to generate the binding from.
// Deprecated: Use TaskMailboxMetaData.ABI instead.
var TaskMailboxABI = TaskMailboxMetaData.ABI
⋮----
// TaskMailboxBin is the compiled bytecode used for deploying new contracts.
// Deprecated: Use TaskMailboxMetaData.Bin instead.
var TaskMailboxBin = TaskMailboxMetaData.Bin
⋮----
// DeployTaskMailbox deploys a new Ethereum contract, binding an instance of TaskMailbox to it.
func DeployTaskMailbox(auth *bind.TransactOpts, backend bind.ContractBackend, _bn254CertificateVerifier common.Address, _ecdsaCertificateVerifier common.Address, _maxTaskSLA *big.Int) (common.Address, *types.Transaction, *TaskMailbox, error)
⋮----
// TaskMailbox is an auto generated Go binding around an Ethereum contract.
type TaskMailbox struct {
	TaskMailboxCaller     // Read-only binding to the contract
	TaskMailboxTransactor // Write-only binding to the contract
	TaskMailboxFilterer   // Log filterer for contract events
}
⋮----
TaskMailboxCaller     // Read-only binding to the contract
TaskMailboxTransactor // Write-only binding to the contract
TaskMailboxFilterer   // Log filterer for contract events
⋮----
// TaskMailboxCaller is an auto generated read-only Go binding around an Ethereum contract.
type TaskMailboxCaller struct {
	contract *bind.BoundContract // Generic contract wrapper for the low level calls
}
⋮----
contract *bind.BoundContract // Generic contract wrapper for the low level calls
⋮----
// TaskMailboxTransactor is an auto generated write-only Go binding around an Ethereum contract.
type TaskMailboxTransactor struct {
	contract *bind.BoundContract // Generic contract wrapper for the low level calls
}
⋮----
// TaskMailboxFilterer is an auto generated log filtering Go binding around an Ethereum contract events.
type TaskMailboxFilterer struct {
	contract *bind.BoundContract // Generic contract wrapper for the low level calls
}
⋮----
// TaskMailboxSession is an auto generated Go binding around an Ethereum contract,
// with pre-set call and transact options.
type TaskMailboxSession struct {
	Contract     *TaskMailbox      // 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
}
⋮----
Contract     *TaskMailbox      // 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
⋮----
// TaskMailboxCallerSession is an auto generated read-only Go binding around an Ethereum contract,
// with pre-set call options.
type TaskMailboxCallerSession struct {
	Contract *TaskMailboxCaller // Generic contract caller binding to set the session for
	CallOpts bind.CallOpts      // Call options to use throughout this session
}
⋮----
Contract *TaskMailboxCaller // Generic contract caller binding to set the session for
CallOpts bind.CallOpts      // Call options to use throughout this session
⋮----
// TaskMailboxTransactorSession is an auto generated write-only Go binding around an Ethereum contract,
// with pre-set transact options.
type TaskMailboxTransactorSession struct {
	Contract     *TaskMailboxTransactor // Generic contract transactor binding to set the session for
	TransactOpts bind.TransactOpts      // Transaction auth options to use throughout this session
}
⋮----
Contract     *TaskMailboxTransactor // Generic contract transactor binding to set the session for
TransactOpts bind.TransactOpts      // Transaction auth options to use throughout this session
⋮----
// TaskMailboxRaw is an auto generated low-level Go binding around an Ethereum contract.
type TaskMailboxRaw struct {
	Contract *TaskMailbox // Generic contract binding to access the raw methods on
}
⋮----
Contract *TaskMailbox // Generic contract binding to access the raw methods on
⋮----
// TaskMailboxCallerRaw is an auto generated low-level read-only Go binding around an Ethereum contract.
type TaskMailboxCallerRaw struct {
	Contract *TaskMailboxCaller // Generic read-only contract binding to access the raw methods on
}
⋮----
Contract *TaskMailboxCaller // Generic read-only contract binding to access the raw methods on
⋮----
// TaskMailboxTransactorRaw is an auto generated low-level write-only Go binding around an Ethereum contract.
type TaskMailboxTransactorRaw struct {
	Contract *TaskMailboxTransactor // Generic write-only contract binding to access the raw methods on
}
⋮----
Contract *TaskMailboxTransactor // Generic write-only contract binding to access the raw methods on
⋮----
// NewTaskMailbox creates a new instance of TaskMailbox, bound to a specific deployed contract.
func NewTaskMailbox(address common.Address, backend bind.ContractBackend) (*TaskMailbox, error)
⋮----
// NewTaskMailboxCaller creates a new read-only instance of TaskMailbox, bound to a specific deployed contract.
func NewTaskMailboxCaller(address common.Address, caller bind.ContractCaller) (*TaskMailboxCaller, error)
⋮----
// NewTaskMailboxTransactor creates a new write-only instance of TaskMailbox, bound to a specific deployed contract.
func NewTaskMailboxTransactor(address common.Address, transactor bind.ContractTransactor) (*TaskMailboxTransactor, error)
⋮----
// NewTaskMailboxFilterer creates a new log filterer instance of TaskMailbox, bound to a specific deployed contract.
func NewTaskMailboxFilterer(address common.Address, filterer bind.ContractFilterer) (*TaskMailboxFilterer, error)
⋮----
// bindTaskMailbox binds a generic wrapper to an already deployed contract.
func bindTaskMailbox(address common.Address, caller bind.ContractCaller, transactor bind.ContractTransactor, filterer bind.ContractFilterer) (*bind.BoundContract, error)
⋮----
// 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 (_TaskMailbox *TaskMailboxRaw) Call(opts *bind.CallOpts, result *[]interface
⋮----
// Transfer initiates a plain transaction to move funds to the contract, calling
// its default method if one is available.
func (_TaskMailbox *TaskMailboxRaw) Transfer(opts *bind.TransactOpts) (*types.Transaction, error)
⋮----
// Transact invokes the (paid) contract method with params as input values.
func (_TaskMailbox *TaskMailboxRaw) Transact(opts *bind.TransactOpts, method string, params ...interface
⋮----
// BN254CERTIFICATEVERIFIER is a free data retrieval call binding the contract method 0xf7424fc9.
//
// Solidity: function BN254_CERTIFICATE_VERIFIER() view returns(address)
func (_TaskMailbox *TaskMailboxCaller) BN254CERTIFICATEVERIFIER(opts *bind.CallOpts) (common.Address, error)
⋮----
var out []interface{}
⋮----
// ECDSACERTIFICATEVERIFIER is a free data retrieval call binding the contract method 0x54743ad2.
⋮----
// Solidity: function ECDSA_CERTIFICATE_VERIFIER() view returns(address)
func (_TaskMailbox *TaskMailboxCaller) ECDSACERTIFICATEVERIFIER(opts *bind.CallOpts) (common.Address, error)
⋮----
// MAXTASKSLA is a free data retrieval call binding the contract method 0xd3e043aa.
⋮----
// Solidity: function MAX_TASK_SLA() view returns(uint96)
func (_TaskMailbox *TaskMailboxCaller) MAXTASKSLA(opts *bind.CallOpts) (*big.Int, error)
⋮----
// FeeSplit is a free data retrieval call binding the contract method 0x6373ea69.
⋮----
// Solidity: function feeSplit() view returns(uint16)
func (_TaskMailbox *TaskMailboxCaller) FeeSplit(opts *bind.CallOpts) (uint16, error)
⋮----
// FeeSplitCollector is a free data retrieval call binding the contract method 0x1a20c505.
⋮----
// Solidity: function feeSplitCollector() view returns(address)
func (_TaskMailbox *TaskMailboxCaller) FeeSplitCollector(opts *bind.CallOpts) (common.Address, error)
⋮----
// GetBN254CertificateBytes is a free data retrieval call binding the contract method 0x1ae370eb.
⋮----
// Solidity: function getBN254CertificateBytes((uint32,bytes32,(uint256,uint256),(uint256[2],uint256[2]),(uint32,bytes,((uint256,uint256),uint256[]))[]) cert) pure returns(bytes)
func (_TaskMailbox *TaskMailboxCaller) GetBN254CertificateBytes(opts *bind.CallOpts, cert IBN254CertificateVerifierTypesBN254Certificate) ([]byte, error)
⋮----
// GetECDSACertificateBytes is a free data retrieval call binding the contract method 0x1270a892.
⋮----
// Solidity: function getECDSACertificateBytes((uint32,bytes32,bytes) cert) pure returns(bytes)
func (_TaskMailbox *TaskMailboxCaller) GetECDSACertificateBytes(opts *bind.CallOpts, cert IECDSACertificateVerifierTypesECDSACertificate) ([]byte, error)
⋮----
// GetExecutorOperatorSetTaskConfig is a free data retrieval call binding the contract method 0x6bf6fad5.
⋮----
// Solidity: function getExecutorOperatorSetTaskConfig((address,uint32) operatorSet) view returns((address,uint96,address,uint8,address,(uint8,bytes),bytes))
func (_TaskMailbox *TaskMailboxCaller) GetExecutorOperatorSetTaskConfig(opts *bind.CallOpts, operatorSet OperatorSet) (ITaskMailboxTypesExecutorOperatorSetTaskConfig, error)
⋮----
// GetMessageHash is a free data retrieval call binding the contract method 0x37eaa104.
⋮----
// Solidity: function getMessageHash(bytes32 taskHash, bytes result) pure returns(bytes32)
func (_TaskMailbox *TaskMailboxCaller) GetMessageHash(opts *bind.CallOpts, taskHash [32]byte, result []byte) ([32]byte, error)
⋮----
// GetTaskInfo is a free data retrieval call binding the contract method 0x4ad52e02.
⋮----
// Solidity: function getTaskInfo(bytes32 taskHash) view returns((address,uint96,address,uint96,address,uint32,uint16,uint8,bool,uint32,(address,uint96,address,uint8,address,(uint8,bytes),bytes),bytes,bytes,bytes))
func (_TaskMailbox *TaskMailboxCaller) GetTaskInfo(opts *bind.CallOpts, taskHash [32]byte) (ITaskMailboxTypesTask, error)
⋮----
// GetTaskResult is a free data retrieval call binding the contract method 0x62fee037.
⋮----
// Solidity: function getTaskResult(bytes32 taskHash) view returns(bytes)
func (_TaskMailbox *TaskMailboxCaller) GetTaskResult(opts *bind.CallOpts, taskHash [32]byte) ([]byte, error)
⋮----
// GetTaskStatus is a free data retrieval call binding the contract method 0x2bf6cc79.
⋮----
// Solidity: function getTaskStatus(bytes32 taskHash) view returns(uint8)
func (_TaskMailbox *TaskMailboxCaller) GetTaskStatus(opts *bind.CallOpts, taskHash [32]byte) (uint8, error)
⋮----
// IsExecutorOperatorSetRegistered is a free data retrieval call binding the contract method 0xfa2c0b37.
⋮----
// Solidity: function isExecutorOperatorSetRegistered(bytes32 operatorSetKey) view returns(bool isRegistered)
func (_TaskMailbox *TaskMailboxCaller) IsExecutorOperatorSetRegistered(opts *bind.CallOpts, operatorSetKey [32]byte) (bool, error)
⋮----
// Owner is a free data retrieval call binding the contract method 0x8da5cb5b.
⋮----
// Solidity: function owner() view returns(address)
func (_TaskMailbox *TaskMailboxCaller) Owner(opts *bind.CallOpts) (common.Address, error)
⋮----
// CreateTask is a paid mutator transaction binding the contract method 0x1fb66f5d.
⋮----
// Solidity: function createTask((address,(address,uint32),bytes) taskParams) returns(bytes32)
func (_TaskMailbox *TaskMailboxTransactor) CreateTask(opts *bind.TransactOpts, taskParams ITaskMailboxTypesTaskParams) (*types.Transaction, error)
⋮----
// Initialize is a paid mutator transaction binding the contract method 0x708c0db9.
⋮----
// Solidity: function initialize(address _owner, uint16 _feeSplit, address _feeSplitCollector) returns()
func (_TaskMailbox *TaskMailboxTransactor) Initialize(opts *bind.TransactOpts, _owner common.Address, _feeSplit uint16, _feeSplitCollector common.Address) (*types.Transaction, error)
⋮----
// RefundFee is a paid mutator transaction binding the contract method 0xb8694166.
⋮----
// Solidity: function refundFee(bytes32 taskHash) returns()
func (_TaskMailbox *TaskMailboxTransactor) RefundFee(opts *bind.TransactOpts, taskHash [32]byte) (*types.Transaction, error)
⋮----
// RegisterExecutorOperatorSet is a paid mutator transaction binding the contract method 0x49acd884.
⋮----
// Solidity: function registerExecutorOperatorSet((address,uint32) operatorSet, bool isRegistered) returns()
func (_TaskMailbox *TaskMailboxTransactor) RegisterExecutorOperatorSet(opts *bind.TransactOpts, operatorSet OperatorSet, isRegistered bool) (*types.Transaction, error)
⋮----
// RenounceOwnership is a paid mutator transaction binding the contract method 0x715018a6.
⋮----
// Solidity: function renounceOwnership() returns()
func (_TaskMailbox *TaskMailboxTransactor) RenounceOwnership(opts *bind.TransactOpts) (*types.Transaction, error)
⋮----
// SetExecutorOperatorSetTaskConfig is a paid mutator transaction binding the contract method 0xf741e81a.
⋮----
// Solidity: function setExecutorOperatorSetTaskConfig((address,uint32) operatorSet, (address,uint96,address,uint8,address,(uint8,bytes),bytes) config) returns()
func (_TaskMailbox *TaskMailboxTransactor) SetExecutorOperatorSetTaskConfig(opts *bind.TransactOpts, operatorSet OperatorSet, config ITaskMailboxTypesExecutorOperatorSetTaskConfig) (*types.Transaction, error)
⋮----
// SetFeeSplit is a paid mutator transaction binding the contract method 0x468c07a0.
⋮----
// Solidity: function setFeeSplit(uint16 _feeSplit) returns()
func (_TaskMailbox *TaskMailboxTransactor) SetFeeSplit(opts *bind.TransactOpts, _feeSplit uint16) (*types.Transaction, error)
⋮----
// SetFeeSplitCollector is a paid mutator transaction binding the contract method 0x678fbdb3.
⋮----
// Solidity: function setFeeSplitCollector(address _feeSplitCollector) returns()
func (_TaskMailbox *TaskMailboxTransactor) SetFeeSplitCollector(opts *bind.TransactOpts, _feeSplitCollector common.Address) (*types.Transaction, error)
⋮----
// SubmitResult is a paid mutator transaction binding the contract method 0xa5fabc81.
⋮----
// Solidity: function submitResult(bytes32 taskHash, bytes executorCert, bytes result) returns()
func (_TaskMailbox *TaskMailboxTransactor) SubmitResult(opts *bind.TransactOpts, taskHash [32]byte, executorCert []byte, result []byte) (*types.Transaction, error)
⋮----
// TransferOwnership is a paid mutator transaction binding the contract method 0xf2fde38b.
⋮----
// Solidity: function transferOwnership(address newOwner) returns()
func (_TaskMailbox *TaskMailboxTransactor) TransferOwnership(opts *bind.TransactOpts, newOwner common.Address) (*types.Transaction, error)
⋮----
// TaskMailboxExecutorOperatorSetRegisteredIterator is returned from FilterExecutorOperatorSetRegistered and is used to iterate over the raw logs and unpacked data for ExecutorOperatorSetRegistered events raised by the TaskMailbox contract.
type TaskMailboxExecutorOperatorSetRegisteredIterator struct {
	Event *TaskMailboxExecutorOperatorSetRegistered // 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
}
⋮----
Event *TaskMailboxExecutorOperatorSetRegistered // 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 *TaskMailboxExecutorOperatorSetRegisteredIterator) Next() bool
⋮----
// If the iterator failed, stop iterating
⋮----
// If the iterator completed, deliver directly whatever's available
⋮----
// Iterator still in progress, wait for either a data or an error event
⋮----
// Error returns any retrieval or parsing error occurred during filtering.
func (it *TaskMailboxExecutorOperatorSetRegisteredIterator) Error() error
⋮----
// Close terminates the iteration process, releasing any pending underlying
// resources.
func (it *TaskMailboxExecutorOperatorSetRegisteredIterator) Close() error
⋮----
// TaskMailboxExecutorOperatorSetRegistered represents a ExecutorOperatorSetRegistered event raised by the TaskMailbox contract.
type TaskMailboxExecutorOperatorSetRegistered struct {
	Caller                common.Address
	Avs                   common.Address
	ExecutorOperatorSetId uint32
	IsRegistered          bool
	Raw                   types.Log // Blockchain specific contextual infos
}
⋮----
Raw                   types.Log // Blockchain specific contextual infos
⋮----
// FilterExecutorOperatorSetRegistered is a free log retrieval operation binding the contract event 0x48b63f21a1eb9dd6880e196de6d7db3fbd0c282b74f1298dcb4cf53472298f39.
⋮----
// Solidity: event ExecutorOperatorSetRegistered(address indexed caller, address indexed avs, uint32 indexed executorOperatorSetId, bool isRegistered)
func (_TaskMailbox *TaskMailboxFilterer) FilterExecutorOperatorSetRegistered(opts *bind.FilterOpts, caller []common.Address, avs []common.Address, executorOperatorSetId []uint32) (*TaskMailboxExecutorOperatorSetRegisteredIterator, error)
⋮----
var callerRule []interface{}
⋮----
var avsRule []interface{}
⋮----
var executorOperatorSetIdRule []interface{}
⋮----
// WatchExecutorOperatorSetRegistered is a free log subscription operation binding the contract event 0x48b63f21a1eb9dd6880e196de6d7db3fbd0c282b74f1298dcb4cf53472298f39.
⋮----
func (_TaskMailbox *TaskMailboxFilterer) WatchExecutorOperatorSetRegistered(opts *bind.WatchOpts, sink chan<- *TaskMailboxExecutorOperatorSetRegistered, caller []common.Address, avs []common.Address, executorOperatorSetId []uint32) (event.Subscription, error)
⋮----
// New log arrived, parse the event and forward to the user
⋮----
// ParseExecutorOperatorSetRegistered is a log parse operation binding the contract event 0x48b63f21a1eb9dd6880e196de6d7db3fbd0c282b74f1298dcb4cf53472298f39.
⋮----
func (_TaskMailbox *TaskMailboxFilterer) ParseExecutorOperatorSetRegistered(log types.Log) (*TaskMailboxExecutorOperatorSetRegistered, error)
⋮----
// TaskMailboxExecutorOperatorSetTaskConfigSetIterator is returned from FilterExecutorOperatorSetTaskConfigSet and is used to iterate over the raw logs and unpacked data for ExecutorOperatorSetTaskConfigSet events raised by the TaskMailbox contract.
type TaskMailboxExecutorOperatorSetTaskConfigSetIterator struct {
	Event *TaskMailboxExecutorOperatorSetTaskConfigSet // 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
}
⋮----
Event *TaskMailboxExecutorOperatorSetTaskConfigSet // Event containing the contract specifics and raw log
⋮----
// TaskMailboxExecutorOperatorSetTaskConfigSet represents a ExecutorOperatorSetTaskConfigSet event raised by the TaskMailbox contract.
type TaskMailboxExecutorOperatorSetTaskConfigSet struct {
	Caller                common.Address
	Avs                   common.Address
	ExecutorOperatorSetId uint32
	Config                ITaskMailboxTypesExecutorOperatorSetTaskConfig
	Raw                   types.Log // Blockchain specific contextual infos
}
⋮----
// FilterExecutorOperatorSetTaskConfigSet is a free log retrieval operation binding the contract event 0x7cd76abd4025a20959a1b20f7c1536e3894a0735cd8de0215dde803ddea7f2d2.
⋮----
// Solidity: event ExecutorOperatorSetTaskConfigSet(address indexed caller, address indexed avs, uint32 indexed executorOperatorSetId, (address,uint96,address,uint8,address,(uint8,bytes),bytes) config)
func (_TaskMailbox *TaskMailboxFilterer) FilterExecutorOperatorSetTaskConfigSet(opts *bind.FilterOpts, caller []common.Address, avs []common.Address, executorOperatorSetId []uint32) (*TaskMailboxExecutorOperatorSetTaskConfigSetIterator, error)
⋮----
// WatchExecutorOperatorSetTaskConfigSet is a free log subscription operation binding the contract event 0x7cd76abd4025a20959a1b20f7c1536e3894a0735cd8de0215dde803ddea7f2d2.
⋮----
func (_TaskMailbox *TaskMailboxFilterer) WatchExecutorOperatorSetTaskConfigSet(opts *bind.WatchOpts, sink chan<- *TaskMailboxExecutorOperatorSetTaskConfigSet, caller []common.Address, avs []common.Address, executorOperatorSetId []uint32) (event.Subscription, error)
⋮----
// ParseExecutorOperatorSetTaskConfigSet is a log parse operation binding the contract event 0x7cd76abd4025a20959a1b20f7c1536e3894a0735cd8de0215dde803ddea7f2d2.
⋮----
func (_TaskMailbox *TaskMailboxFilterer) ParseExecutorOperatorSetTaskConfigSet(log types.Log) (*TaskMailboxExecutorOperatorSetTaskConfigSet, error)
⋮----
// TaskMailboxFeeRefundedIterator is returned from FilterFeeRefunded and is used to iterate over the raw logs and unpacked data for FeeRefunded events raised by the TaskMailbox contract.
type TaskMailboxFeeRefundedIterator struct {
	Event *TaskMailboxFeeRefunded // 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
}
⋮----
Event *TaskMailboxFeeRefunded // Event containing the contract specifics and raw log
⋮----
// TaskMailboxFeeRefunded represents a FeeRefunded event raised by the TaskMailbox contract.
type TaskMailboxFeeRefunded struct {
	RefundCollector common.Address
	TaskHash        [32]byte
	AvsFee          *big.Int
	Raw             types.Log // Blockchain specific contextual infos
}
⋮----
Raw             types.Log // Blockchain specific contextual infos
⋮----
// FilterFeeRefunded is a free log retrieval operation binding the contract event 0xe3ed40d31808582f7a92a30beacc0ec788d5091407ec6c10c1b999b3f317aea3.
⋮----
// Solidity: event FeeRefunded(address indexed refundCollector, bytes32 indexed taskHash, uint96 avsFee)
func (_TaskMailbox *TaskMailboxFilterer) FilterFeeRefunded(opts *bind.FilterOpts, refundCollector []common.Address, taskHash [][32]byte) (*TaskMailboxFeeRefundedIterator, error)
⋮----
var refundCollectorRule []interface{}
⋮----
var taskHashRule []interface{}
⋮----
// WatchFeeRefunded is a free log subscription operation binding the contract event 0xe3ed40d31808582f7a92a30beacc0ec788d5091407ec6c10c1b999b3f317aea3.
⋮----
func (_TaskMailbox *TaskMailboxFilterer) WatchFeeRefunded(opts *bind.WatchOpts, sink chan<- *TaskMailboxFeeRefunded, refundCollector []common.Address, taskHash [][32]byte) (event.Subscription, error)
⋮----
// ParseFeeRefunded is a log parse operation binding the contract event 0xe3ed40d31808582f7a92a30beacc0ec788d5091407ec6c10c1b999b3f317aea3.
⋮----
func (_TaskMailbox *TaskMailboxFilterer) ParseFeeRefunded(log types.Log) (*TaskMailboxFeeRefunded, error)
⋮----
// TaskMailboxFeeSplitCollectorSetIterator is returned from FilterFeeSplitCollectorSet and is used to iterate over the raw logs and unpacked data for FeeSplitCollectorSet events raised by the TaskMailbox contract.
type TaskMailboxFeeSplitCollectorSetIterator struct {
	Event *TaskMailboxFeeSplitCollectorSet // 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
}
⋮----
Event *TaskMailboxFeeSplitCollectorSet // Event containing the contract specifics and raw log
⋮----
// TaskMailboxFeeSplitCollectorSet represents a FeeSplitCollectorSet event raised by the TaskMailbox contract.
type TaskMailboxFeeSplitCollectorSet struct {
	FeeSplitCollector common.Address
	Raw               types.Log // Blockchain specific contextual infos
}
⋮----
Raw               types.Log // Blockchain specific contextual infos
⋮----
// FilterFeeSplitCollectorSet is a free log retrieval operation binding the contract event 0x262aa27c244f6f0088cb3092548a0adcaddedf459070a9ccab2dc6a07abe701d.
⋮----
// Solidity: event FeeSplitCollectorSet(address indexed feeSplitCollector)
func (_TaskMailbox *TaskMailboxFilterer) FilterFeeSplitCollectorSet(opts *bind.FilterOpts, feeSplitCollector []common.Address) (*TaskMailboxFeeSplitCollectorSetIterator, error)
⋮----
var feeSplitCollectorRule []interface{}
⋮----
// WatchFeeSplitCollectorSet is a free log subscription operation binding the contract event 0x262aa27c244f6f0088cb3092548a0adcaddedf459070a9ccab2dc6a07abe701d.
⋮----
func (_TaskMailbox *TaskMailboxFilterer) WatchFeeSplitCollectorSet(opts *bind.WatchOpts, sink chan<- *TaskMailboxFeeSplitCollectorSet, feeSplitCollector []common.Address) (event.Subscription, error)
⋮----
// ParseFeeSplitCollectorSet is a log parse operation binding the contract event 0x262aa27c244f6f0088cb3092548a0adcaddedf459070a9ccab2dc6a07abe701d.
⋮----
func (_TaskMailbox *TaskMailboxFilterer) ParseFeeSplitCollectorSet(log types.Log) (*TaskMailboxFeeSplitCollectorSet, error)
⋮----
// TaskMailboxFeeSplitSetIterator is returned from FilterFeeSplitSet and is used to iterate over the raw logs and unpacked data for FeeSplitSet events raised by the TaskMailbox contract.
type TaskMailboxFeeSplitSetIterator struct {
	Event *TaskMailboxFeeSplitSet // 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
}
⋮----
Event *TaskMailboxFeeSplitSet // Event containing the contract specifics and raw log
⋮----
// TaskMailboxFeeSplitSet represents a FeeSplitSet event raised by the TaskMailbox contract.
type TaskMailboxFeeSplitSet struct {
	FeeSplit uint16
	Raw      types.Log // Blockchain specific contextual infos
}
⋮----
Raw      types.Log // Blockchain specific contextual infos
⋮----
// FilterFeeSplitSet is a free log retrieval operation binding the contract event 0x886b2cfcb151fd8b19ed902cc88f4a06dd9fe351a4a9ab93f33fe84abc157edf.
⋮----
// Solidity: event FeeSplitSet(uint16 feeSplit)
func (_TaskMailbox *TaskMailboxFilterer) FilterFeeSplitSet(opts *bind.FilterOpts) (*TaskMailboxFeeSplitSetIterator, error)
⋮----
// WatchFeeSplitSet is a free log subscription operation binding the contract event 0x886b2cfcb151fd8b19ed902cc88f4a06dd9fe351a4a9ab93f33fe84abc157edf.
⋮----
func (_TaskMailbox *TaskMailboxFilterer) WatchFeeSplitSet(opts *bind.WatchOpts, sink chan<- *TaskMailboxFeeSplitSet) (event.Subscription, error)
⋮----
// ParseFeeSplitSet is a log parse operation binding the contract event 0x886b2cfcb151fd8b19ed902cc88f4a06dd9fe351a4a9ab93f33fe84abc157edf.
⋮----
func (_TaskMailbox *TaskMailboxFilterer) ParseFeeSplitSet(log types.Log) (*TaskMailboxFeeSplitSet, error)
⋮----
// TaskMailboxInitializedIterator is returned from FilterInitialized and is used to iterate over the raw logs and unpacked data for Initialized events raised by the TaskMailbox contract.
type TaskMailboxInitializedIterator struct {
	Event *TaskMailboxInitialized // 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
}
⋮----
Event *TaskMailboxInitialized // Event containing the contract specifics and raw log
⋮----
// TaskMailboxInitialized represents a Initialized event raised by the TaskMailbox contract.
type TaskMailboxInitialized struct {
	Version uint8
	Raw     types.Log // Blockchain specific contextual infos
}
⋮----
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 (_TaskMailbox *TaskMailboxFilterer) FilterInitialized(opts *bind.FilterOpts) (*TaskMailboxInitializedIterator, error)
⋮----
// WatchInitialized is a free log subscription operation binding the contract event 0x7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb3847402498.
⋮----
func (_TaskMailbox *TaskMailboxFilterer) WatchInitialized(opts *bind.WatchOpts, sink chan<- *TaskMailboxInitialized) (event.Subscription, error)
⋮----
// ParseInitialized is a log parse operation binding the contract event 0x7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb3847402498.
⋮----
func (_TaskMailbox *TaskMailboxFilterer) ParseInitialized(log types.Log) (*TaskMailboxInitialized, error)
⋮----
// TaskMailboxOwnershipTransferredIterator is returned from FilterOwnershipTransferred and is used to iterate over the raw logs and unpacked data for OwnershipTransferred events raised by the TaskMailbox contract.
type TaskMailboxOwnershipTransferredIterator struct {
	Event *TaskMailboxOwnershipTransferred // 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
}
⋮----
Event *TaskMailboxOwnershipTransferred // Event containing the contract specifics and raw log
⋮----
// TaskMailboxOwnershipTransferred represents a OwnershipTransferred event raised by the TaskMailbox contract.
type TaskMailboxOwnershipTransferred struct {
	PreviousOwner common.Address
	NewOwner      common.Address
	Raw           types.Log // Blockchain specific contextual infos
}
⋮----
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 (_TaskMailbox *TaskMailboxFilterer) FilterOwnershipTransferred(opts *bind.FilterOpts, previousOwner []common.Address, newOwner []common.Address) (*TaskMailboxOwnershipTransferredIterator, error)
⋮----
var previousOwnerRule []interface{}
⋮----
var newOwnerRule []interface{}
⋮----
// WatchOwnershipTransferred is a free log subscription operation binding the contract event 0x8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0.
⋮----
func (_TaskMailbox *TaskMailboxFilterer) WatchOwnershipTransferred(opts *bind.WatchOpts, sink chan<- *TaskMailboxOwnershipTransferred, previousOwner []common.Address, newOwner []common.Address) (event.Subscription, error)
⋮----
// ParseOwnershipTransferred is a log parse operation binding the contract event 0x8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0.
⋮----
func (_TaskMailbox *TaskMailboxFilterer) ParseOwnershipTransferred(log types.Log) (*TaskMailboxOwnershipTransferred, error)
⋮----
// TaskMailboxTaskCreatedIterator is returned from FilterTaskCreated and is used to iterate over the raw logs and unpacked data for TaskCreated events raised by the TaskMailbox contract.
type TaskMailboxTaskCreatedIterator struct {
	Event *TaskMailboxTaskCreated // 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
}
⋮----
Event *TaskMailboxTaskCreated // Event containing the contract specifics and raw log
⋮----
// TaskMailboxTaskCreated represents a TaskCreated event raised by the TaskMailbox contract.
type TaskMailboxTaskCreated struct {
	Creator                         common.Address
	TaskHash                        [32]byte
	Avs                             common.Address
	ExecutorOperatorSetId           uint32
	OperatorTableReferenceTimestamp uint32
	RefundCollector                 common.Address
	AvsFee                          *big.Int
	TaskDeadline                    *big.Int
	Payload                         []byte
	Raw                             types.Log // Blockchain specific contextual infos
}
⋮----
Raw                             types.Log // Blockchain specific contextual infos
⋮----
// FilterTaskCreated is a free log retrieval operation binding the contract event 0x33add0b01e02278be5459fbfa3274aee699ec47f4ee7236b59e7a2c8b5000c26.
⋮----
// Solidity: event TaskCreated(address indexed creator, bytes32 indexed taskHash, address indexed avs, uint32 executorOperatorSetId, uint32 operatorTableReferenceTimestamp, address refundCollector, uint96 avsFee, uint256 taskDeadline, bytes payload)
func (_TaskMailbox *TaskMailboxFilterer) FilterTaskCreated(opts *bind.FilterOpts, creator []common.Address, taskHash [][32]byte, avs []common.Address) (*TaskMailboxTaskCreatedIterator, error)
⋮----
var creatorRule []interface{}
⋮----
// WatchTaskCreated is a free log subscription operation binding the contract event 0x33add0b01e02278be5459fbfa3274aee699ec47f4ee7236b59e7a2c8b5000c26.
⋮----
func (_TaskMailbox *TaskMailboxFilterer) WatchTaskCreated(opts *bind.WatchOpts, sink chan<- *TaskMailboxTaskCreated, creator []common.Address, taskHash [][32]byte, avs []common.Address) (event.Subscription, error)
⋮----
// ParseTaskCreated is a log parse operation binding the contract event 0x33add0b01e02278be5459fbfa3274aee699ec47f4ee7236b59e7a2c8b5000c26.
⋮----
func (_TaskMailbox *TaskMailboxFilterer) ParseTaskCreated(log types.Log) (*TaskMailboxTaskCreated, error)
⋮----
// TaskMailboxTaskVerifiedIterator is returned from FilterTaskVerified and is used to iterate over the raw logs and unpacked data for TaskVerified events raised by the TaskMailbox contract.
type TaskMailboxTaskVerifiedIterator struct {
	Event *TaskMailboxTaskVerified // 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
}
⋮----
Event *TaskMailboxTaskVerified // Event containing the contract specifics and raw log
⋮----
// TaskMailboxTaskVerified represents a TaskVerified event raised by the TaskMailbox contract.
type TaskMailboxTaskVerified struct {
	Aggregator            common.Address
	TaskHash              [32]byte
	Avs                   common.Address
	ExecutorOperatorSetId uint32
	ExecutorCert          []byte
	Result                []byte
	Raw                   types.Log // Blockchain specific contextual infos
}
⋮----
// FilterTaskVerified is a free log retrieval operation binding the contract event 0x659f23b2e7edf490e5fd6561c5148691ed0375ed7ddd3ab1bcfcfdbec4f209a9.
⋮----
// Solidity: event TaskVerified(address indexed aggregator, bytes32 indexed taskHash, address indexed avs, uint32 executorOperatorSetId, bytes executorCert, bytes result)
func (_TaskMailbox *TaskMailboxFilterer) FilterTaskVerified(opts *bind.FilterOpts, aggregator []common.Address, taskHash [][32]byte, avs []common.Address) (*TaskMailboxTaskVerifiedIterator, error)
⋮----
var aggregatorRule []interface{}
⋮----
// WatchTaskVerified is a free log subscription operation binding the contract event 0x659f23b2e7edf490e5fd6561c5148691ed0375ed7ddd3ab1bcfcfdbec4f209a9.
⋮----
func (_TaskMailbox *TaskMailboxFilterer) WatchTaskVerified(opts *bind.WatchOpts, sink chan<- *TaskMailboxTaskVerified, aggregator []common.Address, taskHash [][32]byte, avs []common.Address) (event.Subscription, error)
⋮----
// ParseTaskVerified is a log parse operation binding the contract event 0x659f23b2e7edf490e5fd6561c5148691ed0375ed7ddd3ab1bcfcfdbec4f209a9.
⋮----
func (_TaskMailbox *TaskMailboxFilterer) ParseTaskVerified(log types.Log) (*TaskMailboxTaskVerified, error)
````

## File: pkg/bindings/TaskMailboxStorage/binding.go
````go
// Code generated - DO NOT EDIT.
// This file is a generated binding and any manual changes will be lost.
⋮----
package TaskMailboxStorage
⋮----
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"
)
⋮----
"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
)
⋮----
// BN254G1Point is an auto generated low-level Go binding around an user-defined struct.
type BN254G1Point struct {
	X *big.Int
	Y *big.Int
}
⋮----
// BN254G2Point is an auto generated low-level Go binding around an user-defined struct.
type BN254G2Point struct {
	X [2]*big.Int
	Y [2]*big.Int
}
⋮----
// IBN254CertificateVerifierTypesBN254Certificate is an auto generated low-level Go binding around an user-defined struct.
type IBN254CertificateVerifierTypesBN254Certificate struct {
	ReferenceTimestamp uint32
	MessageHash        [32]byte
	Signature          BN254G1Point
	Apk                BN254G2Point
	NonSignerWitnesses []IBN254CertificateVerifierTypesBN254OperatorInfoWitness
}
⋮----
// IBN254CertificateVerifierTypesBN254OperatorInfoWitness is an auto generated low-level Go binding around an user-defined struct.
type IBN254CertificateVerifierTypesBN254OperatorInfoWitness struct {
	OperatorIndex     uint32
	OperatorInfoProof []byte
	OperatorInfo      IOperatorTableCalculatorTypesBN254OperatorInfo
}
⋮----
// IECDSACertificateVerifierTypesECDSACertificate is an auto generated low-level Go binding around an user-defined struct.
type IECDSACertificateVerifierTypesECDSACertificate struct {
	ReferenceTimestamp uint32
	MessageHash        [32]byte
	Sig                []byte
}
⋮----
// IOperatorTableCalculatorTypesBN254OperatorInfo is an auto generated low-level Go binding around an user-defined struct.
type IOperatorTableCalculatorTypesBN254OperatorInfo struct {
	Pubkey  BN254G1Point
	Weights []*big.Int
}
⋮----
// ITaskMailboxTypesConsensus is an auto generated low-level Go binding around an user-defined struct.
type ITaskMailboxTypesConsensus struct {
	ConsensusType uint8
	Value         []byte
}
⋮----
// ITaskMailboxTypesExecutorOperatorSetTaskConfig is an auto generated low-level Go binding around an user-defined struct.
type ITaskMailboxTypesExecutorOperatorSetTaskConfig struct {
	TaskHook     common.Address
	TaskSLA      *big.Int
	FeeToken     common.Address
	CurveType    uint8
	FeeCollector common.Address
	Consensus    ITaskMailboxTypesConsensus
	TaskMetadata []byte
}
⋮----
// ITaskMailboxTypesTask is an auto generated low-level Go binding around an user-defined struct.
type ITaskMailboxTypesTask struct {
	Creator                         common.Address
	CreationTime                    *big.Int
	Avs                             common.Address
	AvsFee                          *big.Int
	RefundCollector                 common.Address
	ExecutorOperatorSetId           uint32
	FeeSplit                        uint16
	Status                          uint8
	IsFeeRefunded                   bool
	OperatorTableReferenceTimestamp uint32
	ExecutorOperatorSetTaskConfig   ITaskMailboxTypesExecutorOperatorSetTaskConfig
	Payload                         []byte
	ExecutorCert                    []byte
	Result                          []byte
}
⋮----
// ITaskMailboxTypesTaskParams is an auto generated low-level Go binding around an user-defined struct.
type ITaskMailboxTypesTaskParams struct {
	RefundCollector     common.Address
	ExecutorOperatorSet OperatorSet
	Payload             []byte
}
⋮----
// OperatorSet is an auto generated low-level Go binding around an user-defined struct.
type OperatorSet struct {
	Avs common.Address
	Id  uint32
}
⋮----
// TaskMailboxStorageMetaData contains all meta data concerning the TaskMailboxStorage contract.
var TaskMailboxStorageMetaData = &bind.MetaData{
	ABI: "[{\"type\":\"function\",\"name\":\"BN254_CERTIFICATE_VERIFIER\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"ECDSA_CERTIFICATE_VERIFIER\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"MAX_TASK_SLA\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint96\",\"internalType\":\"uint96\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"createTask\",\"inputs\":[{\"name\":\"taskParams\",\"type\":\"tuple\",\"internalType\":\"structITaskMailboxTypes.TaskParams\",\"components\":[{\"name\":\"refundCollector\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"executorOperatorSet\",\"type\":\"tuple\",\"internalType\":\"structOperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]},{\"name\":\"payload\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]}],\"outputs\":[{\"name\":\"taskHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"feeSplit\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint16\",\"internalType\":\"uint16\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"feeSplitCollector\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getBN254CertificateBytes\",\"inputs\":[{\"name\":\"cert\",\"type\":\"tuple\",\"internalType\":\"structIBN254CertificateVerifierTypes.BN254Certificate\",\"components\":[{\"name\":\"referenceTimestamp\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"messageHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"signature\",\"type\":\"tuple\",\"internalType\":\"structBN254.G1Point\",\"components\":[{\"name\":\"X\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"Y\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]},{\"name\":\"apk\",\"type\":\"tuple\",\"internalType\":\"structBN254.G2Point\",\"components\":[{\"name\":\"X\",\"type\":\"uint256[2]\",\"internalType\":\"uint256[2]\"},{\"name\":\"Y\",\"type\":\"uint256[2]\",\"internalType\":\"uint256[2]\"}]},{\"name\":\"nonSignerWitnesses\",\"type\":\"tuple[]\",\"internalType\":\"structIBN254CertificateVerifierTypes.BN254OperatorInfoWitness[]\",\"components\":[{\"name\":\"operatorIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"operatorInfoProof\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"operatorInfo\",\"type\":\"tuple\",\"internalType\":\"structIOperatorTableCalculatorTypes.BN254OperatorInfo\",\"components\":[{\"name\":\"pubkey\",\"type\":\"tuple\",\"internalType\":\"structBN254.G1Point\",\"components\":[{\"name\":\"X\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"Y\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]},{\"name\":\"weights\",\"type\":\"uint256[]\",\"internalType\":\"uint256[]\"}]}]}]}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"stateMutability\":\"pure\"},{\"type\":\"function\",\"name\":\"getECDSACertificateBytes\",\"inputs\":[{\"name\":\"cert\",\"type\":\"tuple\",\"internalType\":\"structIECDSACertificateVerifierTypes.ECDSACertificate\",\"components\":[{\"name\":\"referenceTimestamp\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"messageHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"sig\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"stateMutability\":\"pure\"},{\"type\":\"function\",\"name\":\"getExecutorOperatorSetTaskConfig\",\"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\":\"structITaskMailboxTypes.ExecutorOperatorSetTaskConfig\",\"components\":[{\"name\":\"taskHook\",\"type\":\"address\",\"internalType\":\"contractIAVSTaskHook\"},{\"name\":\"taskSLA\",\"type\":\"uint96\",\"internalType\":\"uint96\"},{\"name\":\"feeToken\",\"type\":\"address\",\"internalType\":\"contractIERC20\"},{\"name\":\"curveType\",\"type\":\"uint8\",\"internalType\":\"enumIKeyRegistrarTypes.CurveType\"},{\"name\":\"feeCollector\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"consensus\",\"type\":\"tuple\",\"internalType\":\"structITaskMailboxTypes.Consensus\",\"components\":[{\"name\":\"consensusType\",\"type\":\"uint8\",\"internalType\":\"enumITaskMailboxTypes.ConsensusType\"},{\"name\":\"value\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]},{\"name\":\"taskMetadata\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getMessageHash\",\"inputs\":[{\"name\":\"taskHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"result\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"pure\"},{\"type\":\"function\",\"name\":\"getTaskInfo\",\"inputs\":[{\"name\":\"taskHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"tuple\",\"internalType\":\"structITaskMailboxTypes.Task\",\"components\":[{\"name\":\"creator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"creationTime\",\"type\":\"uint96\",\"internalType\":\"uint96\"},{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"avsFee\",\"type\":\"uint96\",\"internalType\":\"uint96\"},{\"name\":\"refundCollector\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"executorOperatorSetId\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"feeSplit\",\"type\":\"uint16\",\"internalType\":\"uint16\"},{\"name\":\"status\",\"type\":\"uint8\",\"internalType\":\"enumITaskMailboxTypes.TaskStatus\"},{\"name\":\"isFeeRefunded\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"operatorTableReferenceTimestamp\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"executorOperatorSetTaskConfig\",\"type\":\"tuple\",\"internalType\":\"structITaskMailboxTypes.ExecutorOperatorSetTaskConfig\",\"components\":[{\"name\":\"taskHook\",\"type\":\"address\",\"internalType\":\"contractIAVSTaskHook\"},{\"name\":\"taskSLA\",\"type\":\"uint96\",\"internalType\":\"uint96\"},{\"name\":\"feeToken\",\"type\":\"address\",\"internalType\":\"contractIERC20\"},{\"name\":\"curveType\",\"type\":\"uint8\",\"internalType\":\"enumIKeyRegistrarTypes.CurveType\"},{\"name\":\"feeCollector\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"consensus\",\"type\":\"tuple\",\"internalType\":\"structITaskMailboxTypes.Consensus\",\"components\":[{\"name\":\"consensusType\",\"type\":\"uint8\",\"internalType\":\"enumITaskMailboxTypes.ConsensusType\"},{\"name\":\"value\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]},{\"name\":\"taskMetadata\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]},{\"name\":\"payload\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"executorCert\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"result\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getTaskResult\",\"inputs\":[{\"name\":\"taskHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getTaskStatus\",\"inputs\":[{\"name\":\"taskHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint8\",\"internalType\":\"enumITaskMailboxTypes.TaskStatus\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"initialize\",\"inputs\":[{\"name\":\"owner\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"feeSplit\",\"type\":\"uint16\",\"internalType\":\"uint16\"},{\"name\":\"feeSplitCollector\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"isExecutorOperatorSetRegistered\",\"inputs\":[{\"name\":\"operatorSetKey\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"isRegistered\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"refundFee\",\"inputs\":[{\"name\":\"taskHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"registerExecutorOperatorSet\",\"inputs\":[{\"name\":\"operatorSet\",\"type\":\"tuple\",\"internalType\":\"structOperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]},{\"name\":\"isRegistered\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"setExecutorOperatorSetTaskConfig\",\"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\":\"structITaskMailboxTypes.ExecutorOperatorSetTaskConfig\",\"components\":[{\"name\":\"taskHook\",\"type\":\"address\",\"internalType\":\"contractIAVSTaskHook\"},{\"name\":\"taskSLA\",\"type\":\"uint96\",\"internalType\":\"uint96\"},{\"name\":\"feeToken\",\"type\":\"address\",\"internalType\":\"contractIERC20\"},{\"name\":\"curveType\",\"type\":\"uint8\",\"internalType\":\"enumIKeyRegistrarTypes.CurveType\"},{\"name\":\"feeCollector\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"consensus\",\"type\":\"tuple\",\"internalType\":\"structITaskMailboxTypes.Consensus\",\"components\":[{\"name\":\"consensusType\",\"type\":\"uint8\",\"internalType\":\"enumITaskMailboxTypes.ConsensusType\"},{\"name\":\"value\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]},{\"name\":\"taskMetadata\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"setFeeSplit\",\"inputs\":[{\"name\":\"feeSplit\",\"type\":\"uint16\",\"internalType\":\"uint16\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"setFeeSplitCollector\",\"inputs\":[{\"name\":\"feeSplitCollector\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"submitResult\",\"inputs\":[{\"name\":\"taskHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"executorCert\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"result\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"event\",\"name\":\"ExecutorOperatorSetRegistered\",\"inputs\":[{\"name\":\"caller\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"avs\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"executorOperatorSetId\",\"type\":\"uint32\",\"indexed\":true,\"internalType\":\"uint32\"},{\"name\":\"isRegistered\",\"type\":\"bool\",\"indexed\":false,\"internalType\":\"bool\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ExecutorOperatorSetTaskConfigSet\",\"inputs\":[{\"name\":\"caller\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"avs\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"executorOperatorSetId\",\"type\":\"uint32\",\"indexed\":true,\"internalType\":\"uint32\"},{\"name\":\"config\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structITaskMailboxTypes.ExecutorOperatorSetTaskConfig\",\"components\":[{\"name\":\"taskHook\",\"type\":\"address\",\"internalType\":\"contractIAVSTaskHook\"},{\"name\":\"taskSLA\",\"type\":\"uint96\",\"internalType\":\"uint96\"},{\"name\":\"feeToken\",\"type\":\"address\",\"internalType\":\"contractIERC20\"},{\"name\":\"curveType\",\"type\":\"uint8\",\"internalType\":\"enumIKeyRegistrarTypes.CurveType\"},{\"name\":\"feeCollector\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"consensus\",\"type\":\"tuple\",\"internalType\":\"structITaskMailboxTypes.Consensus\",\"components\":[{\"name\":\"consensusType\",\"type\":\"uint8\",\"internalType\":\"enumITaskMailboxTypes.ConsensusType\"},{\"name\":\"value\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]},{\"name\":\"taskMetadata\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"FeeRefunded\",\"inputs\":[{\"name\":\"refundCollector\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"taskHash\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"avsFee\",\"type\":\"uint96\",\"indexed\":false,\"internalType\":\"uint96\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"FeeSplitCollectorSet\",\"inputs\":[{\"name\":\"feeSplitCollector\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"FeeSplitSet\",\"inputs\":[{\"name\":\"feeSplit\",\"type\":\"uint16\",\"indexed\":false,\"internalType\":\"uint16\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"TaskCreated\",\"inputs\":[{\"name\":\"creator\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"taskHash\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"avs\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"executorOperatorSetId\",\"type\":\"uint32\",\"indexed\":false,\"internalType\":\"uint32\"},{\"name\":\"operatorTableReferenceTimestamp\",\"type\":\"uint32\",\"indexed\":false,\"internalType\":\"uint32\"},{\"name\":\"refundCollector\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"},{\"name\":\"avsFee\",\"type\":\"uint96\",\"indexed\":false,\"internalType\":\"uint96\"},{\"name\":\"taskDeadline\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"payload\",\"type\":\"bytes\",\"indexed\":false,\"internalType\":\"bytes\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"TaskVerified\",\"inputs\":[{\"name\":\"aggregator\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"taskHash\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"avs\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"executorOperatorSetId\",\"type\":\"uint32\",\"indexed\":false,\"internalType\":\"uint32\"},{\"name\":\"executorCert\",\"type\":\"bytes\",\"indexed\":false,\"internalType\":\"bytes\"},{\"name\":\"result\",\"type\":\"bytes\",\"indexed\":false,\"internalType\":\"bytes\"}],\"anonymous\":false},{\"type\":\"error\",\"name\":\"CertificateStale\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"EmptyCertificateSignature\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ExecutorOperatorSetNotRegistered\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ExecutorOperatorSetTaskConfigNotSet\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"FeeAlreadyRefunded\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidAddressZero\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidConsensusType\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidConsensusValue\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidCurveType\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidFeeReceiver\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidFeeSplit\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidMessageHash\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidOperatorSetOwner\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidReferenceTimestamp\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidTaskCreator\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidTaskStatus\",\"inputs\":[{\"name\":\"expected\",\"type\":\"uint8\",\"internalType\":\"enumITaskMailboxTypes.TaskStatus\"},{\"name\":\"actual\",\"type\":\"uint8\",\"internalType\":\"enumITaskMailboxTypes.TaskStatus\"}]},{\"type\":\"error\",\"name\":\"OnlyRefundCollector\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"PayloadIsEmpty\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"TaskSLAExceedsMaximum\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ThresholdNotMet\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"TimestampAtCreation\",\"inputs\":[]}]",
}
⋮----
// TaskMailboxStorageABI is the input ABI used to generate the binding from.
// Deprecated: Use TaskMailboxStorageMetaData.ABI instead.
var TaskMailboxStorageABI = TaskMailboxStorageMetaData.ABI
⋮----
// TaskMailboxStorage is an auto generated Go binding around an Ethereum contract.
type TaskMailboxStorage struct {
	TaskMailboxStorageCaller     // Read-only binding to the contract
	TaskMailboxStorageTransactor // Write-only binding to the contract
	TaskMailboxStorageFilterer   // Log filterer for contract events
}
⋮----
TaskMailboxStorageCaller     // Read-only binding to the contract
TaskMailboxStorageTransactor // Write-only binding to the contract
TaskMailboxStorageFilterer   // Log filterer for contract events
⋮----
// TaskMailboxStorageCaller is an auto generated read-only Go binding around an Ethereum contract.
type TaskMailboxStorageCaller struct {
	contract *bind.BoundContract // Generic contract wrapper for the low level calls
}
⋮----
contract *bind.BoundContract // Generic contract wrapper for the low level calls
⋮----
// TaskMailboxStorageTransactor is an auto generated write-only Go binding around an Ethereum contract.
type TaskMailboxStorageTransactor struct {
	contract *bind.BoundContract // Generic contract wrapper for the low level calls
}
⋮----
// TaskMailboxStorageFilterer is an auto generated log filtering Go binding around an Ethereum contract events.
type TaskMailboxStorageFilterer struct {
	contract *bind.BoundContract // Generic contract wrapper for the low level calls
}
⋮----
// TaskMailboxStorageSession is an auto generated Go binding around an Ethereum contract,
// with pre-set call and transact options.
type TaskMailboxStorageSession struct {
	Contract     *TaskMailboxStorage // 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
}
⋮----
Contract     *TaskMailboxStorage // 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
⋮----
// TaskMailboxStorageCallerSession is an auto generated read-only Go binding around an Ethereum contract,
// with pre-set call options.
type TaskMailboxStorageCallerSession struct {
	Contract *TaskMailboxStorageCaller // Generic contract caller binding to set the session for
	CallOpts bind.CallOpts             // Call options to use throughout this session
}
⋮----
Contract *TaskMailboxStorageCaller // Generic contract caller binding to set the session for
CallOpts bind.CallOpts             // Call options to use throughout this session
⋮----
// TaskMailboxStorageTransactorSession is an auto generated write-only Go binding around an Ethereum contract,
// with pre-set transact options.
type TaskMailboxStorageTransactorSession struct {
	Contract     *TaskMailboxStorageTransactor // Generic contract transactor binding to set the session for
	TransactOpts bind.TransactOpts             // Transaction auth options to use throughout this session
}
⋮----
Contract     *TaskMailboxStorageTransactor // Generic contract transactor binding to set the session for
TransactOpts bind.TransactOpts             // Transaction auth options to use throughout this session
⋮----
// TaskMailboxStorageRaw is an auto generated low-level Go binding around an Ethereum contract.
type TaskMailboxStorageRaw struct {
	Contract *TaskMailboxStorage // Generic contract binding to access the raw methods on
}
⋮----
Contract *TaskMailboxStorage // Generic contract binding to access the raw methods on
⋮----
// TaskMailboxStorageCallerRaw is an auto generated low-level read-only Go binding around an Ethereum contract.
type TaskMailboxStorageCallerRaw struct {
	Contract *TaskMailboxStorageCaller // Generic read-only contract binding to access the raw methods on
}
⋮----
Contract *TaskMailboxStorageCaller // Generic read-only contract binding to access the raw methods on
⋮----
// TaskMailboxStorageTransactorRaw is an auto generated low-level write-only Go binding around an Ethereum contract.
type TaskMailboxStorageTransactorRaw struct {
	Contract *TaskMailboxStorageTransactor // Generic write-only contract binding to access the raw methods on
}
⋮----
Contract *TaskMailboxStorageTransactor // Generic write-only contract binding to access the raw methods on
⋮----
// NewTaskMailboxStorage creates a new instance of TaskMailboxStorage, bound to a specific deployed contract.
func NewTaskMailboxStorage(address common.Address, backend bind.ContractBackend) (*TaskMailboxStorage, error)
⋮----
// NewTaskMailboxStorageCaller creates a new read-only instance of TaskMailboxStorage, bound to a specific deployed contract.
func NewTaskMailboxStorageCaller(address common.Address, caller bind.ContractCaller) (*TaskMailboxStorageCaller, error)
⋮----
// NewTaskMailboxStorageTransactor creates a new write-only instance of TaskMailboxStorage, bound to a specific deployed contract.
func NewTaskMailboxStorageTransactor(address common.Address, transactor bind.ContractTransactor) (*TaskMailboxStorageTransactor, error)
⋮----
// NewTaskMailboxStorageFilterer creates a new log filterer instance of TaskMailboxStorage, bound to a specific deployed contract.
func NewTaskMailboxStorageFilterer(address common.Address, filterer bind.ContractFilterer) (*TaskMailboxStorageFilterer, error)
⋮----
// bindTaskMailboxStorage binds a generic wrapper to an already deployed contract.
func bindTaskMailboxStorage(address common.Address, caller bind.ContractCaller, transactor bind.ContractTransactor, filterer bind.ContractFilterer) (*bind.BoundContract, error)
⋮----
// 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 (_TaskMailboxStorage *TaskMailboxStorageRaw) Call(opts *bind.CallOpts, result *[]interface
⋮----
// Transfer initiates a plain transaction to move funds to the contract, calling
// its default method if one is available.
func (_TaskMailboxStorage *TaskMailboxStorageRaw) Transfer(opts *bind.TransactOpts) (*types.Transaction, error)
⋮----
// Transact invokes the (paid) contract method with params as input values.
func (_TaskMailboxStorage *TaskMailboxStorageRaw) Transact(opts *bind.TransactOpts, method string, params ...interface
⋮----
// BN254CERTIFICATEVERIFIER is a free data retrieval call binding the contract method 0xf7424fc9.
//
// Solidity: function BN254_CERTIFICATE_VERIFIER() view returns(address)
func (_TaskMailboxStorage *TaskMailboxStorageCaller) BN254CERTIFICATEVERIFIER(opts *bind.CallOpts) (common.Address, error)
⋮----
var out []interface{}
⋮----
// ECDSACERTIFICATEVERIFIER is a free data retrieval call binding the contract method 0x54743ad2.
⋮----
// Solidity: function ECDSA_CERTIFICATE_VERIFIER() view returns(address)
func (_TaskMailboxStorage *TaskMailboxStorageCaller) ECDSACERTIFICATEVERIFIER(opts *bind.CallOpts) (common.Address, error)
⋮----
// MAXTASKSLA is a free data retrieval call binding the contract method 0xd3e043aa.
⋮----
// Solidity: function MAX_TASK_SLA() view returns(uint96)
func (_TaskMailboxStorage *TaskMailboxStorageCaller) MAXTASKSLA(opts *bind.CallOpts) (*big.Int, error)
⋮----
// FeeSplit is a free data retrieval call binding the contract method 0x6373ea69.
⋮----
// Solidity: function feeSplit() view returns(uint16)
func (_TaskMailboxStorage *TaskMailboxStorageCaller) FeeSplit(opts *bind.CallOpts) (uint16, error)
⋮----
// FeeSplitCollector is a free data retrieval call binding the contract method 0x1a20c505.
⋮----
// Solidity: function feeSplitCollector() view returns(address)
func (_TaskMailboxStorage *TaskMailboxStorageCaller) FeeSplitCollector(opts *bind.CallOpts) (common.Address, error)
⋮----
// GetBN254CertificateBytes is a free data retrieval call binding the contract method 0x1ae370eb.
⋮----
// Solidity: function getBN254CertificateBytes((uint32,bytes32,(uint256,uint256),(uint256[2],uint256[2]),(uint32,bytes,((uint256,uint256),uint256[]))[]) cert) pure returns(bytes)
func (_TaskMailboxStorage *TaskMailboxStorageCaller) GetBN254CertificateBytes(opts *bind.CallOpts, cert IBN254CertificateVerifierTypesBN254Certificate) ([]byte, error)
⋮----
// GetECDSACertificateBytes is a free data retrieval call binding the contract method 0x1270a892.
⋮----
// Solidity: function getECDSACertificateBytes((uint32,bytes32,bytes) cert) pure returns(bytes)
func (_TaskMailboxStorage *TaskMailboxStorageCaller) GetECDSACertificateBytes(opts *bind.CallOpts, cert IECDSACertificateVerifierTypesECDSACertificate) ([]byte, error)
⋮----
// GetExecutorOperatorSetTaskConfig is a free data retrieval call binding the contract method 0x6bf6fad5.
⋮----
// Solidity: function getExecutorOperatorSetTaskConfig((address,uint32) operatorSet) view returns((address,uint96,address,uint8,address,(uint8,bytes),bytes))
func (_TaskMailboxStorage *TaskMailboxStorageCaller) GetExecutorOperatorSetTaskConfig(opts *bind.CallOpts, operatorSet OperatorSet) (ITaskMailboxTypesExecutorOperatorSetTaskConfig, error)
⋮----
// GetMessageHash is a free data retrieval call binding the contract method 0x37eaa104.
⋮----
// Solidity: function getMessageHash(bytes32 taskHash, bytes result) pure returns(bytes32)
func (_TaskMailboxStorage *TaskMailboxStorageCaller) GetMessageHash(opts *bind.CallOpts, taskHash [32]byte, result []byte) ([32]byte, error)
⋮----
// GetTaskInfo is a free data retrieval call binding the contract method 0x4ad52e02.
⋮----
// Solidity: function getTaskInfo(bytes32 taskHash) view returns((address,uint96,address,uint96,address,uint32,uint16,uint8,bool,uint32,(address,uint96,address,uint8,address,(uint8,bytes),bytes),bytes,bytes,bytes))
func (_TaskMailboxStorage *TaskMailboxStorageCaller) GetTaskInfo(opts *bind.CallOpts, taskHash [32]byte) (ITaskMailboxTypesTask, error)
⋮----
// GetTaskResult is a free data retrieval call binding the contract method 0x62fee037.
⋮----
// Solidity: function getTaskResult(bytes32 taskHash) view returns(bytes)
func (_TaskMailboxStorage *TaskMailboxStorageCaller) GetTaskResult(opts *bind.CallOpts, taskHash [32]byte) ([]byte, error)
⋮----
// GetTaskStatus is a free data retrieval call binding the contract method 0x2bf6cc79.
⋮----
// Solidity: function getTaskStatus(bytes32 taskHash) view returns(uint8)
func (_TaskMailboxStorage *TaskMailboxStorageCaller) GetTaskStatus(opts *bind.CallOpts, taskHash [32]byte) (uint8, error)
⋮----
// IsExecutorOperatorSetRegistered is a free data retrieval call binding the contract method 0xfa2c0b37.
⋮----
// Solidity: function isExecutorOperatorSetRegistered(bytes32 operatorSetKey) view returns(bool isRegistered)
func (_TaskMailboxStorage *TaskMailboxStorageCaller) IsExecutorOperatorSetRegistered(opts *bind.CallOpts, operatorSetKey [32]byte) (bool, error)
⋮----
// CreateTask is a paid mutator transaction binding the contract method 0x1fb66f5d.
⋮----
// Solidity: function createTask((address,(address,uint32),bytes) taskParams) returns(bytes32 taskHash)
func (_TaskMailboxStorage *TaskMailboxStorageTransactor) CreateTask(opts *bind.TransactOpts, taskParams ITaskMailboxTypesTaskParams) (*types.Transaction, error)
⋮----
// Initialize is a paid mutator transaction binding the contract method 0x708c0db9.
⋮----
// Solidity: function initialize(address owner, uint16 feeSplit, address feeSplitCollector) returns()
func (_TaskMailboxStorage *TaskMailboxStorageTransactor) Initialize(opts *bind.TransactOpts, owner common.Address, feeSplit uint16, feeSplitCollector common.Address) (*types.Transaction, error)
⋮----
// RefundFee is a paid mutator transaction binding the contract method 0xb8694166.
⋮----
// Solidity: function refundFee(bytes32 taskHash) returns()
func (_TaskMailboxStorage *TaskMailboxStorageTransactor) RefundFee(opts *bind.TransactOpts, taskHash [32]byte) (*types.Transaction, error)
⋮----
// RegisterExecutorOperatorSet is a paid mutator transaction binding the contract method 0x49acd884.
⋮----
// Solidity: function registerExecutorOperatorSet((address,uint32) operatorSet, bool isRegistered) returns()
func (_TaskMailboxStorage *TaskMailboxStorageTransactor) RegisterExecutorOperatorSet(opts *bind.TransactOpts, operatorSet OperatorSet, isRegistered bool) (*types.Transaction, error)
⋮----
// SetExecutorOperatorSetTaskConfig is a paid mutator transaction binding the contract method 0xf741e81a.
⋮----
// Solidity: function setExecutorOperatorSetTaskConfig((address,uint32) operatorSet, (address,uint96,address,uint8,address,(uint8,bytes),bytes) config) returns()
func (_TaskMailboxStorage *TaskMailboxStorageTransactor) SetExecutorOperatorSetTaskConfig(opts *bind.TransactOpts, operatorSet OperatorSet, config ITaskMailboxTypesExecutorOperatorSetTaskConfig) (*types.Transaction, error)
⋮----
// SetFeeSplit is a paid mutator transaction binding the contract method 0x468c07a0.
⋮----
// Solidity: function setFeeSplit(uint16 feeSplit) returns()
func (_TaskMailboxStorage *TaskMailboxStorageTransactor) SetFeeSplit(opts *bind.TransactOpts, feeSplit uint16) (*types.Transaction, error)
⋮----
// SetFeeSplitCollector is a paid mutator transaction binding the contract method 0x678fbdb3.
⋮----
// Solidity: function setFeeSplitCollector(address feeSplitCollector) returns()
func (_TaskMailboxStorage *TaskMailboxStorageTransactor) SetFeeSplitCollector(opts *bind.TransactOpts, feeSplitCollector common.Address) (*types.Transaction, error)
⋮----
// SubmitResult is a paid mutator transaction binding the contract method 0xa5fabc81.
⋮----
// Solidity: function submitResult(bytes32 taskHash, bytes executorCert, bytes result) returns()
func (_TaskMailboxStorage *TaskMailboxStorageTransactor) SubmitResult(opts *bind.TransactOpts, taskHash [32]byte, executorCert []byte, result []byte) (*types.Transaction, error)
⋮----
// TaskMailboxStorageExecutorOperatorSetRegisteredIterator is returned from FilterExecutorOperatorSetRegistered and is used to iterate over the raw logs and unpacked data for ExecutorOperatorSetRegistered events raised by the TaskMailboxStorage contract.
type TaskMailboxStorageExecutorOperatorSetRegisteredIterator struct {
	Event *TaskMailboxStorageExecutorOperatorSetRegistered // 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
}
⋮----
Event *TaskMailboxStorageExecutorOperatorSetRegistered // 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 *TaskMailboxStorageExecutorOperatorSetRegisteredIterator) Next() bool
⋮----
// If the iterator failed, stop iterating
⋮----
// If the iterator completed, deliver directly whatever's available
⋮----
// Iterator still in progress, wait for either a data or an error event
⋮----
// Error returns any retrieval or parsing error occurred during filtering.
func (it *TaskMailboxStorageExecutorOperatorSetRegisteredIterator) Error() error
⋮----
// Close terminates the iteration process, releasing any pending underlying
// resources.
func (it *TaskMailboxStorageExecutorOperatorSetRegisteredIterator) Close() error
⋮----
// TaskMailboxStorageExecutorOperatorSetRegistered represents a ExecutorOperatorSetRegistered event raised by the TaskMailboxStorage contract.
type TaskMailboxStorageExecutorOperatorSetRegistered struct {
	Caller                common.Address
	Avs                   common.Address
	ExecutorOperatorSetId uint32
	IsRegistered          bool
	Raw                   types.Log // Blockchain specific contextual infos
}
⋮----
Raw                   types.Log // Blockchain specific contextual infos
⋮----
// FilterExecutorOperatorSetRegistered is a free log retrieval operation binding the contract event 0x48b63f21a1eb9dd6880e196de6d7db3fbd0c282b74f1298dcb4cf53472298f39.
⋮----
// Solidity: event ExecutorOperatorSetRegistered(address indexed caller, address indexed avs, uint32 indexed executorOperatorSetId, bool isRegistered)
func (_TaskMailboxStorage *TaskMailboxStorageFilterer) FilterExecutorOperatorSetRegistered(opts *bind.FilterOpts, caller []common.Address, avs []common.Address, executorOperatorSetId []uint32) (*TaskMailboxStorageExecutorOperatorSetRegisteredIterator, error)
⋮----
var callerRule []interface{}
⋮----
var avsRule []interface{}
⋮----
var executorOperatorSetIdRule []interface{}
⋮----
// WatchExecutorOperatorSetRegistered is a free log subscription operation binding the contract event 0x48b63f21a1eb9dd6880e196de6d7db3fbd0c282b74f1298dcb4cf53472298f39.
⋮----
func (_TaskMailboxStorage *TaskMailboxStorageFilterer) WatchExecutorOperatorSetRegistered(opts *bind.WatchOpts, sink chan<- *TaskMailboxStorageExecutorOperatorSetRegistered, caller []common.Address, avs []common.Address, executorOperatorSetId []uint32) (event.Subscription, error)
⋮----
// New log arrived, parse the event and forward to the user
⋮----
// ParseExecutorOperatorSetRegistered is a log parse operation binding the contract event 0x48b63f21a1eb9dd6880e196de6d7db3fbd0c282b74f1298dcb4cf53472298f39.
⋮----
func (_TaskMailboxStorage *TaskMailboxStorageFilterer) ParseExecutorOperatorSetRegistered(log types.Log) (*TaskMailboxStorageExecutorOperatorSetRegistered, error)
⋮----
// TaskMailboxStorageExecutorOperatorSetTaskConfigSetIterator is returned from FilterExecutorOperatorSetTaskConfigSet and is used to iterate over the raw logs and unpacked data for ExecutorOperatorSetTaskConfigSet events raised by the TaskMailboxStorage contract.
type TaskMailboxStorageExecutorOperatorSetTaskConfigSetIterator struct {
	Event *TaskMailboxStorageExecutorOperatorSetTaskConfigSet // 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
}
⋮----
Event *TaskMailboxStorageExecutorOperatorSetTaskConfigSet // Event containing the contract specifics and raw log
⋮----
// TaskMailboxStorageExecutorOperatorSetTaskConfigSet represents a ExecutorOperatorSetTaskConfigSet event raised by the TaskMailboxStorage contract.
type TaskMailboxStorageExecutorOperatorSetTaskConfigSet struct {
	Caller                common.Address
	Avs                   common.Address
	ExecutorOperatorSetId uint32
	Config                ITaskMailboxTypesExecutorOperatorSetTaskConfig
	Raw                   types.Log // Blockchain specific contextual infos
}
⋮----
// FilterExecutorOperatorSetTaskConfigSet is a free log retrieval operation binding the contract event 0x7cd76abd4025a20959a1b20f7c1536e3894a0735cd8de0215dde803ddea7f2d2.
⋮----
// Solidity: event ExecutorOperatorSetTaskConfigSet(address indexed caller, address indexed avs, uint32 indexed executorOperatorSetId, (address,uint96,address,uint8,address,(uint8,bytes),bytes) config)
func (_TaskMailboxStorage *TaskMailboxStorageFilterer) FilterExecutorOperatorSetTaskConfigSet(opts *bind.FilterOpts, caller []common.Address, avs []common.Address, executorOperatorSetId []uint32) (*TaskMailboxStorageExecutorOperatorSetTaskConfigSetIterator, error)
⋮----
// WatchExecutorOperatorSetTaskConfigSet is a free log subscription operation binding the contract event 0x7cd76abd4025a20959a1b20f7c1536e3894a0735cd8de0215dde803ddea7f2d2.
⋮----
func (_TaskMailboxStorage *TaskMailboxStorageFilterer) WatchExecutorOperatorSetTaskConfigSet(opts *bind.WatchOpts, sink chan<- *TaskMailboxStorageExecutorOperatorSetTaskConfigSet, caller []common.Address, avs []common.Address, executorOperatorSetId []uint32) (event.Subscription, error)
⋮----
// ParseExecutorOperatorSetTaskConfigSet is a log parse operation binding the contract event 0x7cd76abd4025a20959a1b20f7c1536e3894a0735cd8de0215dde803ddea7f2d2.
⋮----
func (_TaskMailboxStorage *TaskMailboxStorageFilterer) ParseExecutorOperatorSetTaskConfigSet(log types.Log) (*TaskMailboxStorageExecutorOperatorSetTaskConfigSet, error)
⋮----
// TaskMailboxStorageFeeRefundedIterator is returned from FilterFeeRefunded and is used to iterate over the raw logs and unpacked data for FeeRefunded events raised by the TaskMailboxStorage contract.
type TaskMailboxStorageFeeRefundedIterator struct {
	Event *TaskMailboxStorageFeeRefunded // 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
}
⋮----
Event *TaskMailboxStorageFeeRefunded // Event containing the contract specifics and raw log
⋮----
// TaskMailboxStorageFeeRefunded represents a FeeRefunded event raised by the TaskMailboxStorage contract.
type TaskMailboxStorageFeeRefunded struct {
	RefundCollector common.Address
	TaskHash        [32]byte
	AvsFee          *big.Int
	Raw             types.Log // Blockchain specific contextual infos
}
⋮----
Raw             types.Log // Blockchain specific contextual infos
⋮----
// FilterFeeRefunded is a free log retrieval operation binding the contract event 0xe3ed40d31808582f7a92a30beacc0ec788d5091407ec6c10c1b999b3f317aea3.
⋮----
// Solidity: event FeeRefunded(address indexed refundCollector, bytes32 indexed taskHash, uint96 avsFee)
func (_TaskMailboxStorage *TaskMailboxStorageFilterer) FilterFeeRefunded(opts *bind.FilterOpts, refundCollector []common.Address, taskHash [][32]byte) (*TaskMailboxStorageFeeRefundedIterator, error)
⋮----
var refundCollectorRule []interface{}
⋮----
var taskHashRule []interface{}
⋮----
// WatchFeeRefunded is a free log subscription operation binding the contract event 0xe3ed40d31808582f7a92a30beacc0ec788d5091407ec6c10c1b999b3f317aea3.
⋮----
func (_TaskMailboxStorage *TaskMailboxStorageFilterer) WatchFeeRefunded(opts *bind.WatchOpts, sink chan<- *TaskMailboxStorageFeeRefunded, refundCollector []common.Address, taskHash [][32]byte) (event.Subscription, error)
⋮----
// ParseFeeRefunded is a log parse operation binding the contract event 0xe3ed40d31808582f7a92a30beacc0ec788d5091407ec6c10c1b999b3f317aea3.
⋮----
func (_TaskMailboxStorage *TaskMailboxStorageFilterer) ParseFeeRefunded(log types.Log) (*TaskMailboxStorageFeeRefunded, error)
⋮----
// TaskMailboxStorageFeeSplitCollectorSetIterator is returned from FilterFeeSplitCollectorSet and is used to iterate over the raw logs and unpacked data for FeeSplitCollectorSet events raised by the TaskMailboxStorage contract.
type TaskMailboxStorageFeeSplitCollectorSetIterator struct {
	Event *TaskMailboxStorageFeeSplitCollectorSet // 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
}
⋮----
Event *TaskMailboxStorageFeeSplitCollectorSet // Event containing the contract specifics and raw log
⋮----
// TaskMailboxStorageFeeSplitCollectorSet represents a FeeSplitCollectorSet event raised by the TaskMailboxStorage contract.
type TaskMailboxStorageFeeSplitCollectorSet struct {
	FeeSplitCollector common.Address
	Raw               types.Log // Blockchain specific contextual infos
}
⋮----
Raw               types.Log // Blockchain specific contextual infos
⋮----
// FilterFeeSplitCollectorSet is a free log retrieval operation binding the contract event 0x262aa27c244f6f0088cb3092548a0adcaddedf459070a9ccab2dc6a07abe701d.
⋮----
// Solidity: event FeeSplitCollectorSet(address indexed feeSplitCollector)
func (_TaskMailboxStorage *TaskMailboxStorageFilterer) FilterFeeSplitCollectorSet(opts *bind.FilterOpts, feeSplitCollector []common.Address) (*TaskMailboxStorageFeeSplitCollectorSetIterator, error)
⋮----
var feeSplitCollectorRule []interface{}
⋮----
// WatchFeeSplitCollectorSet is a free log subscription operation binding the contract event 0x262aa27c244f6f0088cb3092548a0adcaddedf459070a9ccab2dc6a07abe701d.
⋮----
func (_TaskMailboxStorage *TaskMailboxStorageFilterer) WatchFeeSplitCollectorSet(opts *bind.WatchOpts, sink chan<- *TaskMailboxStorageFeeSplitCollectorSet, feeSplitCollector []common.Address) (event.Subscription, error)
⋮----
// ParseFeeSplitCollectorSet is a log parse operation binding the contract event 0x262aa27c244f6f0088cb3092548a0adcaddedf459070a9ccab2dc6a07abe701d.
⋮----
func (_TaskMailboxStorage *TaskMailboxStorageFilterer) ParseFeeSplitCollectorSet(log types.Log) (*TaskMailboxStorageFeeSplitCollectorSet, error)
⋮----
// TaskMailboxStorageFeeSplitSetIterator is returned from FilterFeeSplitSet and is used to iterate over the raw logs and unpacked data for FeeSplitSet events raised by the TaskMailboxStorage contract.
type TaskMailboxStorageFeeSplitSetIterator struct {
	Event *TaskMailboxStorageFeeSplitSet // 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
}
⋮----
Event *TaskMailboxStorageFeeSplitSet // Event containing the contract specifics and raw log
⋮----
// TaskMailboxStorageFeeSplitSet represents a FeeSplitSet event raised by the TaskMailboxStorage contract.
type TaskMailboxStorageFeeSplitSet struct {
	FeeSplit uint16
	Raw      types.Log // Blockchain specific contextual infos
}
⋮----
Raw      types.Log // Blockchain specific contextual infos
⋮----
// FilterFeeSplitSet is a free log retrieval operation binding the contract event 0x886b2cfcb151fd8b19ed902cc88f4a06dd9fe351a4a9ab93f33fe84abc157edf.
⋮----
// Solidity: event FeeSplitSet(uint16 feeSplit)
func (_TaskMailboxStorage *TaskMailboxStorageFilterer) FilterFeeSplitSet(opts *bind.FilterOpts) (*TaskMailboxStorageFeeSplitSetIterator, error)
⋮----
// WatchFeeSplitSet is a free log subscription operation binding the contract event 0x886b2cfcb151fd8b19ed902cc88f4a06dd9fe351a4a9ab93f33fe84abc157edf.
⋮----
func (_TaskMailboxStorage *TaskMailboxStorageFilterer) WatchFeeSplitSet(opts *bind.WatchOpts, sink chan<- *TaskMailboxStorageFeeSplitSet) (event.Subscription, error)
⋮----
// ParseFeeSplitSet is a log parse operation binding the contract event 0x886b2cfcb151fd8b19ed902cc88f4a06dd9fe351a4a9ab93f33fe84abc157edf.
⋮----
func (_TaskMailboxStorage *TaskMailboxStorageFilterer) ParseFeeSplitSet(log types.Log) (*TaskMailboxStorageFeeSplitSet, error)
⋮----
// TaskMailboxStorageTaskCreatedIterator is returned from FilterTaskCreated and is used to iterate over the raw logs and unpacked data for TaskCreated events raised by the TaskMailboxStorage contract.
type TaskMailboxStorageTaskCreatedIterator struct {
	Event *TaskMailboxStorageTaskCreated // 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
}
⋮----
Event *TaskMailboxStorageTaskCreated // Event containing the contract specifics and raw log
⋮----
// TaskMailboxStorageTaskCreated represents a TaskCreated event raised by the TaskMailboxStorage contract.
type TaskMailboxStorageTaskCreated struct {
	Creator                         common.Address
	TaskHash                        [32]byte
	Avs                             common.Address
	ExecutorOperatorSetId           uint32
	OperatorTableReferenceTimestamp uint32
	RefundCollector                 common.Address
	AvsFee                          *big.Int
	TaskDeadline                    *big.Int
	Payload                         []byte
	Raw                             types.Log // Blockchain specific contextual infos
}
⋮----
Raw                             types.Log // Blockchain specific contextual infos
⋮----
// FilterTaskCreated is a free log retrieval operation binding the contract event 0x33add0b01e02278be5459fbfa3274aee699ec47f4ee7236b59e7a2c8b5000c26.
⋮----
// Solidity: event TaskCreated(address indexed creator, bytes32 indexed taskHash, address indexed avs, uint32 executorOperatorSetId, uint32 operatorTableReferenceTimestamp, address refundCollector, uint96 avsFee, uint256 taskDeadline, bytes payload)
func (_TaskMailboxStorage *TaskMailboxStorageFilterer) FilterTaskCreated(opts *bind.FilterOpts, creator []common.Address, taskHash [][32]byte, avs []common.Address) (*TaskMailboxStorageTaskCreatedIterator, error)
⋮----
var creatorRule []interface{}
⋮----
// WatchTaskCreated is a free log subscription operation binding the contract event 0x33add0b01e02278be5459fbfa3274aee699ec47f4ee7236b59e7a2c8b5000c26.
⋮----
func (_TaskMailboxStorage *TaskMailboxStorageFilterer) WatchTaskCreated(opts *bind.WatchOpts, sink chan<- *TaskMailboxStorageTaskCreated, creator []common.Address, taskHash [][32]byte, avs []common.Address) (event.Subscription, error)
⋮----
// ParseTaskCreated is a log parse operation binding the contract event 0x33add0b01e02278be5459fbfa3274aee699ec47f4ee7236b59e7a2c8b5000c26.
⋮----
func (_TaskMailboxStorage *TaskMailboxStorageFilterer) ParseTaskCreated(log types.Log) (*TaskMailboxStorageTaskCreated, error)
⋮----
// TaskMailboxStorageTaskVerifiedIterator is returned from FilterTaskVerified and is used to iterate over the raw logs and unpacked data for TaskVerified events raised by the TaskMailboxStorage contract.
type TaskMailboxStorageTaskVerifiedIterator struct {
	Event *TaskMailboxStorageTaskVerified // 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
}
⋮----
Event *TaskMailboxStorageTaskVerified // Event containing the contract specifics and raw log
⋮----
// TaskMailboxStorageTaskVerified represents a TaskVerified event raised by the TaskMailboxStorage contract.
type TaskMailboxStorageTaskVerified struct {
	Aggregator            common.Address
	TaskHash              [32]byte
	Avs                   common.Address
	ExecutorOperatorSetId uint32
	ExecutorCert          []byte
	Result                []byte
	Raw                   types.Log // Blockchain specific contextual infos
}
⋮----
// FilterTaskVerified is a free log retrieval operation binding the contract event 0x659f23b2e7edf490e5fd6561c5148691ed0375ed7ddd3ab1bcfcfdbec4f209a9.
⋮----
// Solidity: event TaskVerified(address indexed aggregator, bytes32 indexed taskHash, address indexed avs, uint32 executorOperatorSetId, bytes executorCert, bytes result)
func (_TaskMailboxStorage *TaskMailboxStorageFilterer) FilterTaskVerified(opts *bind.FilterOpts, aggregator []common.Address, taskHash [][32]byte, avs []common.Address) (*TaskMailboxStorageTaskVerifiedIterator, error)
⋮----
var aggregatorRule []interface{}
⋮----
// WatchTaskVerified is a free log subscription operation binding the contract event 0x659f23b2e7edf490e5fd6561c5148691ed0375ed7ddd3ab1bcfcfdbec4f209a9.
⋮----
func (_TaskMailboxStorage *TaskMailboxStorageFilterer) WatchTaskVerified(opts *bind.WatchOpts, sink chan<- *TaskMailboxStorageTaskVerified, aggregator []common.Address, taskHash [][32]byte, avs []common.Address) (event.Subscription, error)
⋮----
// ParseTaskVerified is a log parse operation binding the contract event 0x659f23b2e7edf490e5fd6561c5148691ed0375ed7ddd3ab1bcfcfdbec4f209a9.
⋮----
func (_TaskMailboxStorage *TaskMailboxStorageFilterer) ParseTaskVerified(log types.Log) (*TaskMailboxStorageTaskVerified, error)
````

## File: script/configs/devnet/deploy_from_scratch.anvil.config.json
````json
{
  "maintainer": "samlaf@eigenlabs.org",
  "multisig_addresses": {
       "operationsMultisig": "0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266",
       "communityMultisig": "0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266",
       "pauserMultisig": "0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266",
       "executorMultisig": "0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266",
       "timelock": "0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266"
  },
  "strategies": [
       {
            "token_address": "0x0000000000000000000000000000000000000000",
            "token_symbol": "WETH",
            "max_per_deposit": 115792089237316195423570985008687907853269984665640564039457584007913129639935,
            "max_deposits": 115792089237316195423570985008687907853269984665640564039457584007913129639935
          }
  ],
  "strategyManager": {
       "init_paused_status": 0,
       "init_withdrawal_delay_blocks": 1
  },
  "eigenPod": {
       "PARTIAL_WITHDRAWAL_FRAUD_PROOF_PERIOD_BLOCKS": 1,
       "MAX_RESTAKED_BALANCE_GWEI_PER_VALIDATOR": "32000000000"
  },
  "eigenPodManager": {
       "init_paused_status": 30
  },
  "delayedWithdrawalRouter": {
       "init_paused_status": 0,
       "init_withdrawal_delay_blocks": 1
  },
  "slasher": {
       "init_paused_status": 0
  },
  "delegation": {
       "init_paused_status": 0,
       "init_withdrawal_delay_blocks": 1
  },
  "rewardsCoordinator": {
       "init_paused_status": 0,
       "CALCULATION_INTERVAL_SECONDS": 604800,
       "MAX_REWARDS_DURATION": 6048000,
       "MAX_RETROACTIVE_LENGTH": 7776000,
       "MAX_FUTURE_LENGTH": 2592000,
       "GENESIS_REWARDS_TIMESTAMP": 1710979200,
       "rewards_updater_address": "0x18a0f92Ad9645385E8A8f3db7d0f6CF7aBBb0aD4",
       "activation_delay": 7200,
       "calculation_interval_seconds": 604800,
       "global_operator_commission_bips": 1000,
       "OPERATOR_SET_GENESIS_REWARDS_TIMESTAMP": 1720656000,
       "OPERATOR_SET_MAX_RETROACTIVE_LENGTH": 2592000,
       "emissions_controller_address": "0x0000000000000000000000000000000000000000"
  },
  "ethPOSDepositAddress": "0x00000000219ab540356cBB839Cbe05303d7705Fa",
  "semver": "v1.0.3"
}
````

## File: script/configs/devnet/deploy_from_scratch.holesky.config.json
````json
{
  "maintainer": "samlaf@eigenlabs.org",
  "multisig_addresses": {
       "operationsMultisig": "0xDA29BB71669f46F2a779b4b62f03644A84eE3479",
       "communityMultisig": "0xDA29BB71669f46F2a779b4b62f03644A84eE3479",
       "pauserMultisig": "0xDA29BB71669f46F2a779b4b62f03644A84eE3479",
       "executorMultisig": "0xDA29BB71669f46F2a779b4b62f03644A84eE3479",
       "timelock": "0xDA29BB71669f46F2a779b4b62f03644A84eE3479"
  },
  "strategies": [
       {
            "token_address": "0x0000000000000000000000000000000000000000",
            "token_symbol": "WETH",
            "max_per_deposit": 115792089237316195423570985008687907853269984665640564039457584007913129639935,
            "max_deposits": 115792089237316195423570985008687907853269984665640564039457584007913129639935
          }
  ],
  "strategyManager": {
       "init_paused_status": 0,
       "init_withdrawal_delay_blocks": 1
  },
  "eigenPod": {
       "PARTIAL_WITHDRAWAL_FRAUD_PROOF_PERIOD_BLOCKS": 1,
       "MAX_RESTAKED_BALANCE_GWEI_PER_VALIDATOR": "32000000000"
  },
  "eigenPodManager": {
       "init_paused_status": 30
  },
  "delayedWithdrawalRouter": {
       "init_paused_status": 0,
       "init_withdrawal_delay_blocks": 1
  },
  "slasher": {
       "init_paused_status": 0
  },
  "delegation": {
       "init_paused_status": 0,
       "init_withdrawal_delay_blocks": 1
  },
  "rewardsCoordinator": {
       "init_paused_status": 0,
       "CALCULATION_INTERVAL_SECONDS": 604800,
       "MAX_REWARDS_DURATION": 6048000,
       "MAX_RETROACTIVE_LENGTH": 7776000,
       "MAX_FUTURE_LENGTH": 2592000,
       "GENESIS_REWARDS_TIMESTAMP": 1710979200,
       "rewards_updater_address": "0xDA29BB71669f46F2a779b4b62f03644A84eE3479",
       "activation_delay": 7200,
       "calculation_interval_seconds": 604800,
       "global_operator_commission_bips": 1000,
       "OPERATOR_SET_GENESIS_REWARDS_TIMESTAMP": 1720656000,
       "OPERATOR_SET_MAX_RETROACTIVE_LENGTH": 2592000,
       "emissions_controller_address": "0x0000000000000000000000000000000000000000"
  },
  "ethPOSDepositAddress": "0x00000000219ab540356cBB839Cbe05303d7705Fa",
  "semver": "v0.0.0"
}
````

## File: script/configs/devnet/deploy_from_scratch.holesky.slashing.config.json
````json
{
    "multisig_addresses": {
         "operationsMultisig": "0xBB37b72F67A410B76Ce9b9aF9e37aa561B1C5B07",
         "communityMultisig": "0xBB37b72F67A410B76Ce9b9aF9e37aa561B1C5B07",
         "pauserMultisig": "0xBB37b72F67A410B76Ce9b9aF9e37aa561B1C5B07",
         "executorMultisig": "0xBB37b72F67A410B76Ce9b9aF9e37aa561B1C5B07",
         "timelock": "0xBB37b72F67A410B76Ce9b9aF9e37aa561B1C5B07"
    },
    "strategyManager": {
         "init_paused_status": 0,
         "init_withdrawal_delay_blocks": 1
    },
    "eigenPod": {
         "PARTIAL_WITHDRAWAL_FRAUD_PROOF_PERIOD_BLOCKS": 1,
         "MAX_RESTAKED_BALANCE_GWEI_PER_VALIDATOR": "32000000000"
    },
    "eigenPodManager": {
         "init_paused_status": 115792089237316195423570985008687907853269984665640564039457584007913129639935
    },
    "slasher": {
         "init_paused_status": 0
    },
    "delegation": {
         "init_paused_status": 0,
         "init_withdrawal_delay_blocks": 1
    },
    "rewardsCoordinator": {
         "init_paused_status": 115792089237316195423570985008687907853269984665640564039457584007913129639935,
         "CALCULATION_INTERVAL_SECONDS": 604800,
         "MAX_REWARDS_DURATION": 6048000,
         "MAX_RETROACTIVE_LENGTH": 7776000,
         "MAX_FUTURE_LENGTH": 2592000,
         "GENESIS_REWARDS_TIMESTAMP": 1710979200,
         "rewards_updater_address": "0xBB37b72F67A410B76Ce9b9aF9e37aa561B1C5B07",
         "activation_delay": 7200,
         "calculation_interval_seconds": 604800,
         "global_operator_commission_bips": 1000,
         "OPERATOR_SET_GENESIS_REWARDS_TIMESTAMP": 1720656000,
         "OPERATOR_SET_MAX_RETROACTIVE_LENGTH": 2592000,
         "emissions_controller_address": "0x0000000000000000000000000000000000000000"
    },
    "allocationManager": {
      "init_paused_status": 0,
      "DEALLOCATION_DELAY": 86400,
      "ALLOCATION_CONFIGURATION_DELAY": 600
    },
    "ethPOSDepositAddress": "0x4242424242424242424242424242424242424242",
     "semver": "v0.0.0"
  }
````

## File: script/configs/local/deploy_from_scratch.slashing.anvil.config.json
````json
{
  "maintainer": "samlaf@eigenlabs.org",
  "multisig_addresses": {
    "operationsMultisig": "0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266",
    "communityMultisig": "0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266",
    "pauserMultisig": "0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266",
    "executorMultisig": "0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266",
    "timelock": "0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266"
  },
  "strategies": [
    {
      "token_address": "0x0000000000000000000000000000000000000000",
      "token_symbol": "WETH",
      "max_per_deposit": 115792089237316195423570985008687907853269984665640564039457584007913129639935,
      "max_deposits": 115792089237316195423570985008687907853269984665640564039457584007913129639935
    }
  ],
  "allocationManager": {
    "init_paused_status": 0,
    "DEALLOCATION_DELAY": 900,
    "ALLOCATION_CONFIGURATION_DELAY": 1200
  },
  "strategyManager": {
    "init_paused_status": 0,
    "init_withdrawal_delay_blocks": 1
  },
  "eigenPod": {
    "PARTIAL_WITHDRAWAL_FRAUD_PROOF_PERIOD_BLOCKS": 1,
    "MAX_RESTAKED_BALANCE_GWEI_PER_VALIDATOR": "32000000000"
  },
  "eigenPodManager": {
    "init_paused_status": 30
  },
  "delayedWithdrawalRouter": {
    "init_paused_status": 0,
    "init_withdrawal_delay_blocks": 1
  },
  "slasher": {
    "init_paused_status": 0
  },
  "delegation": {
    "withdrawal_delay_blocks": 900,
    "init_paused_status": 0,
    "init_withdrawal_delay_blocks": 1
  },
  "rewardsCoordinator": {
    "init_paused_status": 0,
    "CALCULATION_INTERVAL_SECONDS": 604800,
    "MAX_REWARDS_DURATION": 6048000,
    "MAX_RETROACTIVE_LENGTH": 7776000,
    "MAX_FUTURE_LENGTH": 2592000,
    "GENESIS_REWARDS_TIMESTAMP": 1710979200,
    "rewards_updater_address": "0x18a0f92Ad9645385E8A8f3db7d0f6CF7aBBb0aD4",
    "activation_delay": 7200,
    "calculation_interval_seconds": 604800,
    "global_operator_commission_bips": 1000,
    "OPERATOR_SET_GENESIS_REWARDS_TIMESTAMP": 1720656000,
    "OPERATOR_SET_MAX_RETROACTIVE_LENGTH": 2592000,
    "emissions_controller_address": "0x0000000000000000000000000000000000000000"
  },
  "addresses": {
    "token": {
      "eigenStrategy": "0x0000000000000000000000000000000000000000"
    }
  },
  "ethPOSDepositAddress": "0x00000000219ab540356cBB839Cbe05303d7705Fa",
  "semver": "v0.0.0"
}
````

## File: script/configs/mainnet/mainnet-addresses.config.json
````json
{
    "lastUpdated": "v1.4.1-mainnet-prooftra",
    "addresses": {
        "allocationManager": "0x948a420b8CC1d6BFd0B6087C2E7c344a2CD0bc39",
        "allocationManagerImplementation": "0x740058839A1668Af5700e5d7B062007275e77D25",
        "avsDirectory": "0x135dda560e946695d6f155dacafc6f1f25c1f5af",
        "avsDirectoryImplementation": "0xA396D855D70e1A1ec1A0199ADB9845096683B6A2",
        "beaconOracle": "0x343907185b71aDF0eBa9567538314396aa985442",
        "baseStrategyImplementation": "0x0EC17ef9c00F360DB28CA8008684a4796b11E456",
        "delayedWithdrawalRouter": "0x7Fe7E9CC0F274d2435AD5d56D5fa73E47F6A23D8",
        "delayedWithdrawalRouterImplementation": "0x4bb6731b02314d40abbffbc4540f508874014226",
        "delegationManager": "0x39053D51B77DC0d36036Fc1fCc8Cb819df8Ef37A",
        "delegationManagerImplementation": "0xA75112d1df37FA53a431525CD47A7d7faCEA7E73",
        "eigenLayerPauserReg": "0x0c431C66F4dE941d089625E5B423D00707977060",
        "eigenLayerProxyAdmin": "0x8b9566AdA63B64d1E1dcF1418b43fd1433b72444",
        "eigenPodBeacon": "0x5a2a4F2F3C18f09179B6703e63D9eDD165909073",
        "eigenPodImplementation": "0xe2E2dB234b0FFB9AFe41e52dB7d3c2B8585646c3",
        "eigenPodManager": "0x91E677b07F7AF907ec9a428aafA9fc14a0d3A338",
        "eigenPodManagerImplementation": "0x8dB49233e3b7691D68745A31e4A0Cd9Cf924B7E9",
        "emptyContract": "0x1f96861fEFa1065a5A96F20Deb6D8DC3ff48F7f9",
        "permissionController": "0x25E5F8B1E7aDf44518d35D5B2271f114e081f0E5",
        "permissionControllerImplementation": "0xe7f3705c9Addf2DE14e03C345fA982CAb2c1C6B1",
        "rewardsCoordinator": "0x7750d328b314EfFa365A0402CcfD489B80B0adda",
        "rewardsCoordinatorImplementation": "0xa505c0116aD65071F0130061F94745b7853220aB",
        "slasher": "0xD92145c07f8Ed1D392c1B88017934E301CC1c3Cd",
        "slasherImplementation": "0xf3234220163a757edf1e11a8a085638d9b236614",
        "strategyManager": "0x858646372CC42E1A627fcE94aa7A7033e7CF075A",
        "strategyManagerImplementation": "0xba4b2b8A076851A3044882493C2e36503d50b925",
        "strategyFactory": "0x5e4C39Ad7A3E881585e383dB9827EB4811f6F647",
        "strategyFactoryImplementation": "0x1b97d8F963179C0e17E5F3d85cdfd9a31A49bc66",
        "strategyFactoryBeacon": "0x0ed6703C298d28aE0878d1b28e88cA87F9662fE9",
        "strategyFactoryBeaconImplementation": "0x0EC17ef9c00F360DB28CA8008684a4796b11E456",
        "numStrategiesDeployed": 12,
        "strategies": {
            "stETH": "0x93c4b944D05dfe6df7645A86cd2206016c51564D",
            "rETH": "0x1BeE69b7dFFfA4E2d53C2a2Df135C388AD25dCD2",
            "cbETH": "0x54945180dB7943c0ed0FEE7EdaB2Bd24620256bc",
            "ETHx": "0x9d7eD45EE2E8FC5482fa2428f15C971e6369011d",
            "ankrETH": "0x13760F50a9d7377e4F20CB8CF9e4c26586c658ff",
            "oETH": "0xa4C637e0F704745D182e4D38cAb7E7485321d059",
            "osETH": "0x57ba429517c3473B6d34CA9aCd56c0e735b94c02",
            "swETH": "0x0Fe4F44beE93503346A3Ac9EE5A26b130a5796d6",
            "wBETH": "0x7CA911E83dabf90C90dD3De5411a10F1A6112184",
            "sfrxETH": "0x8CA7A5d6f3acd3A7A8bC468a8CD0FB14B6BD28b6",
            "lsETH": "0xAe60d8180437b5C34bB956822ac2710972584473",
            "mETH": "0x298aFB19A105D59E74658C4C334Ff360BadE6dd2"
        },
        "strategyAddresses": [
            "0x93c4b944D05dfe6df7645A86cd2206016c51564D",
            "0x1BeE69b7dFFfA4E2d53C2a2Df135C388AD25dCD2",
            "0x54945180dB7943c0ed0FEE7EdaB2Bd24620256bc",
            "0x9d7eD45EE2E8FC5482fa2428f15C971e6369011d",
            "0x13760F50a9d7377e4F20CB8CF9e4c26586c658ff",
            "0xa4C637e0F704745D182e4D38cAb7E7485321d059",
            "0x57ba429517c3473B6d34CA9aCd56c0e735b94c02",
            "0x0Fe4F44beE93503346A3Ac9EE5A26b130a5796d6",
            "0x7CA911E83dabf90C90dD3De5411a10F1A6112184",
            "0x8CA7A5d6f3acd3A7A8bC468a8CD0FB14B6BD28b6",
            "0xAe60d8180437b5C34bB956822ac2710972584473",
            "0x298aFB19A105D59E74658C4C334Ff360BadE6dd2"
        ],
        "token": {
            "tokenProxyAdmin": "0x3f5Ab2D4418d38568705bFd6672630fCC3435CC9",
            "EIGEN": "0xec53bf9167f50cdeb3ae105f56099aaab9061f83",
            "bEIGEN": "0x83E9115d334D248Ce39a6f36144aEaB5b3456e75",
            "EIGENImpl": "0x17f56E911C279bad67eDC08acbC9cf3DC4eF26A0",
            "bEIGENImpl": "0xF2b225815F70c9b327DC9db758A36c92A4279b17",
            "eigenStrategy": "0xaCB55C530Acdb2849e6d4f36992Cd8c9D50ED8F7",
            "eigenStrategyImpl": "0x90B074DDD680bD06C72e28b09231A0F848205729"
        }
    },
    "numStrategies": 12,
    "chainInfo": {
        "chainId": 1,
        "deploymentBlock": 22434239
    },
    "parameters": {
        "communityMultisig": "0xFEA47018D632A77bA579846c840d5706705Dc598",
        "executorMultisig": "0x369e6F597e22EaB55fFb173C6d9cD234BD699111",
        "operationsMultisig": "0xBE1685C81aA44FF9FB319dD389addd9374383e90",
        "pauserMultisig": "0x5050389572f2d220ad927CcbeA0D406831012390",
        "timelock": "0xA6Db1A8C5a981d1536266D2a393c5F8dDb210EAF",
        "semver": "v1.4.1"
    }
}
````

## File: script/configs/mainnet.json
````json
{
    "config": {
        "environment": {
            "chainid": 1,
            "lastUpdated": "slashing-integration-testing",
            "name": "mainnet"
        },
        "params": {
            "ethPOS": "0x00000000219ab540356cBB839Cbe05303d7705Fa",
            "EIGENPOD_GENESIS_TIME": 1606824023,
            "CALCULATION_INTERVAL_SECONDS": 604800,
            "MAX_REWARDS_DURATION": 6048000,
            "MAX_RETROACTIVE_LENGTH": 14515200,
            "MAX_FUTURE_LENGTH": 2592000,
            "GENESIS_REWARDS_TIMESTAMP": 1710979200,
            "REWARDS_UPDATER_ADDRESS": "0x8f94F55fD8c9E090296283137C303fE97d32A9e2",
            "ACTIVATION_DELAY": 604800,
            "GLOBAL_OPERATOR_COMMISSION_BIPS": 1000,
            "MIN_WITHDRAWAL_DELAY_BLOCKS": 100800,
            "ALLOCATION_CONFIGURATION_DELAY": 126000
        }
    },
    "deployment": {
        "admin": {
            "communityMultisig": "0xFEA47018D632A77bA579846c840d5706705Dc598",
            "executorMultisig": "0x369e6F597e22EaB55fFb173C6d9cD234BD699111",
            "operationsMultisig": "0xBE1685C81aA44FF9FB319dD389addd9374383e90",
            "pauserMultisig": "0x5050389572f2d220ad927CcbeA0D406831012390",
            "pauserRegistry": "0x0c431C66F4dE941d089625E5B423D00707977060",
            "proxyAdmin": "0x8b9566AdA63B64d1E1dcF1418b43fd1433b72444",
            "timelock": "0xA6Db1A8C5a981d1536266D2a393c5F8dDb210EAF"
        },
        "core": {
            "avsDirectory": {
                "proxy": "0x135dda560e946695d6f155dacafc6f1f25c1f5af",
                "impl": "0xdabdb3cd346b7d5f5779b0b614ede1cc9dcba5b7",
                "pendingImpl": "0x0000000000000000000000000000000000000000"
            },
            "delegationManager": {
                "proxy": "0x39053D51B77DC0d36036Fc1fCc8Cb819df8Ef37A",
                "impl": "0x1784be6401339fc0fedf7e9379409f5c1bfe9dda",
                "pendingImpl": "0x0000000000000000000000000000000000000000"
            },
            "rewardsCoordinator": {
                "proxy": "0x7750d328b314EfFa365A0402CcfD489B80B0adda",
                "impl": "0x5bf7c13D5FAdba224ECB3D5C0a67A231D1628785",
                "pendingImpl": "0x0000000000000000000000000000000000000000"
            },
            "slasher": {
                "proxy": "0xD92145c07f8Ed1D392c1B88017934E301CC1c3Cd",
                "impl": "0xf3234220163a757edf1e11a8a085638d9b236614",
                "pendingImpl": "0x0000000000000000000000000000000000000000"
            },
            "strategyManager": {
                "proxy": "0x858646372CC42E1A627fcE94aa7A7033e7CF075A",
                "impl": "0x70f44c13944d49a236e3cd7a94f48f5dab6c619b",
                "pendingImpl": "0x0000000000000000000000000000000000000000"
            }
        },
        "pods": {
            "delayedWithdrawalRouter": {
                "proxy": "0x7Fe7E9CC0F274d2435AD5d56D5fa73E47F6A23D8",
                "impl": "0x4bb6731b02314d40abbffbc4540f508874014226",
                "pendingImpl": "0x0000000000000000000000000000000000000000"
            },
            "eigenPod": {
                "beacon": "0x5a2a4F2F3C18f09179B6703e63D9eDD165909073",
                "impl": "0x6D225e974Fa404D25Ffb84eD6E242Ffa18eF6430",
                "pendingImpl": "0x0000000000000000000000000000000000000000"
            },
            "eigenPodManager": {
                "proxy": "0x91E677b07F7AF907ec9a428aafA9fc14a0d3A338",
                "impl": "0x731A0aD160e407393Ff662231Add6Dd145AD3FEa",
                "pendingImpl": "0x0000000000000000000000000000000000000000"
            }
        },
        "strategies": {
            "strategyFactory": {
                "proxy": "0x5e4C39Ad7A3E881585e383dB9827EB4811f6F647",
                "impl": "0x3e07cc2D34C8E0965f5BA45Ac1E960e535155c74",
                "pendingImpl": "0x0000000000000000000000000000000000000000"
            },
            "strategyBeacon": {
                "beacon": "0x0ed6703C298d28aE0878d1b28e88cA87F9662fE9",
                "impl": "0xe9FA8F904d97854C7389b68923262ADCC6C27827",
                "pendingImpl": "0x0000000000000000000000000000000000000000"
            },
            "preLongtailStrats": {
                "impl": "0xdfdA04f980bE6A64E3607c95Ca26012Ab9aA46d3",
                "addrs": [
                    "0x93c4b944D05dfe6df7645A86cd2206016c51564D",
                    "0x1BeE69b7dFFfA4E2d53C2a2Df135C388AD25dCD2",
                    "0x54945180dB7943c0ed0FEE7EdaB2Bd24620256bc",
                    "0x9d7eD45EE2E8FC5482fa2428f15C971e6369011d",
                    "0x13760F50a9d7377e4F20CB8CF9e4c26586c658ff",
                    "0xa4C637e0F704745D182e4D38cAb7E7485321d059",
                    "0x57ba429517c3473B6d34CA9aCd56c0e735b94c02",
                    "0x0Fe4F44beE93503346A3Ac9EE5A26b130a5796d6",
                    "0x7CA911E83dabf90C90dD3De5411a10F1A6112184",
                    "0x8CA7A5d6f3acd3A7A8bC468a8CD0FB14B6BD28b6",
                    "0xAe60d8180437b5C34bB956822ac2710972584473",
                    "0x298aFB19A105D59E74658C4C334Ff360BadE6dd2"
                ]
            }
        },
        "token": {
            "bEIGEN": {
                "proxy": "0x83E9115d334D248Ce39a6f36144aEaB5b3456e75",
                "impl": "0xB91c69Af3eE022bd0a59Da082945914BFDcEFFE3",
                "pendingImpl": "0x0000000000000000000000000000000000000000",
                "proxyAdmin": "0x3f5Ab2D4418d38568705bFd6672630fCC3435CC9"
            },
            "EIGEN": {
                "proxy": "0xec53bf9167f50cdeb3ae105f56099aaab9061f83",
                "impl": "0x7ec354c84680112d3cff1544ec1eb19ca583700b",
                "pendingImpl": "0x0000000000000000000000000000000000000000",
                "proxyAdmin": "0xB8915E195121f2B5D989Ec5727fd47a5259F1CEC"
            },
            "eigenStrategy": {
                "proxy": "0xaCB55C530Acdb2849e6d4f36992Cd8c9D50ED8F7",
                "impl": "0x27e7a3a81741b9fcc5ad7edcbf9f8a72a5c00428",
                "pendingImpl": "0x0000000000000000000000000000000000000000"
            }
        }
    }
}
````

## File: script/configs/zipzoop.json
````json
{
  "config": {
    "environment": {
      "chainid": 31337,
      "lastUpdated": "v0.4.2-mainnet-pepe",
      "name": "zipzoop-tester"
    },
    "params": {
      "ACTIVATION_DELAY": 7200,
      "CALCULATION_INTERVAL_SECONDS": 604800,
      "EIGENPOD_GENESIS_TIME": 1695902400,
      "GENESIS_REWARDS_TIMESTAMP": 1710979200,
      "GLOBAL_OPERATOR_COMMISSION_BIPS": 1000,
      "MAX_FUTURE_LENGTH": 2592000,
      "MAX_RETROACTIVE_LENGTH": 7776000,
      "MAX_REWARDS_DURATION": 6048000,
      "REWARDS_UPDATER_ADDRESS": "0x18a0f92Ad9645385E8A8f3db7d0f6CF7aBBb0aD4",
      "ethPOS": "0x4242424242424242424242424242424242424242",
      "multiSendCallOnly": "0x40A2aCCbd92BCA938b02010E17A5b8929b49130D"
    }
  },
  "deployment": {
    "admin": {
      "communityMultisig": "0xDA29BB71669f46F2a779b4b62f03644A84eE3479",
      "executorMultisig": "0xDA29BB71669f46F2a779b4b62f03644A84eE3479",
      "operationsMultisig": "0xDA29BB71669f46F2a779b4b62f03644A84eE3479",
      "pauserMultisig": "0xDA29BB71669f46F2a779b4b62f03644A84eE3479",
      "pauserRegistry": "0x9Ab2FEAf0465f0eD51Fc2b663eF228B418c9Dad1",
      "proxyAdmin": "0x1BEF05C7303d44e0E2FCD2A19d993eDEd4c51b5B",
      "timelock": "0x0000000000000000000000000000000000000000"
    },
    "core": {
      "avsDirectory": {
        "impl": "0x357978adC03375BD6a3605DE055fABb84695d79A",
        "pendingImpl": "0x0000000000000000000000000000000000000000",
        "proxy": "0x141d6995556135D4997b2ff72EB443Be300353bC"
      },
      "delegationManager": {
        "impl": "0x56E88cb4f0136fC27D95499dE4BE2acf47946Fa1",
        "pendingImpl": "0x0000000000000000000000000000000000000000",
        "proxy": "0x75dfE5B44C2E530568001400D3f704bC8AE350CC"
      },
      "rewardsCoordinator": {
        "impl": "0x7523b42b081C30fA245AA4039c645e36746fC400",
        "pendingImpl": "0x0000000000000000000000000000000000000000",
        "proxy": "0xb22Ef643e1E067c994019A4C19e403253C05c2B0"
      },
      "slasher": {
        "impl": "0x9460fCe11E1e0365419fa860599903B4E5097cf0",
        "pendingImpl": "0x0000000000000000000000000000000000000000",
        "proxy": "0x12699471dF8dca329C76D72823B1b79d55709384"
      },
      "strategyManager": {
        "impl": "0x1a26B23a004C512350d7Dd89056655A80b850199",
        "pendingImpl": "0x0000000000000000000000000000000000000000",
        "proxy": "0xF9fbF2e35D8803273E214c99BF15174139f4E67a"
      }
    },
    "pods": {
      "delayedWithdrawalRouter": {
        "impl": "0x0011FA2c512063C495f77296Af8d195F33A8Dd38",
        "pendingImpl": "0x0000000000000000000000000000000000000000",
        "proxy": "0xC4BC46a87A67a531eCF7f74338E1FA79533334Fa"
      },
      "eigenPod": {
        "beacon": "0x92Cc4a800A1513E85C481dDDf3A06C6921211eaC",
        "impl": "0x8Da4b953cbFb715624D98C0D2b4a7978462eFd38",
        "pendingImpl": "0x0000000000000000000000000000000000000000"
      },
      "eigenPodManager": {
        "impl": "0x10EBa780CCd9E5e9FFBe529C25046c076Be91048",
        "pendingImpl": "0x0000000000000000000000000000000000000000",
        "proxy": "0xB8d8952f572e67B11e43bC21250967772fa883Ff"
      }
    },
    "strategies": {
      "preLongtailStrats": {
        "addrs": [
          "0x6E5D5060B33ca2090A78E9cb74Fe207453b30E49",
          "0xf6a09ae03D7760aEcf1626Ce7Df0F113BEC2d9bD",
          "0x7fA77c321bf66e42eaBC9b10129304F7f90c5585",
          "0x24DA526F9e465c4fb6BAe41E226Df8aA5b34eAc7",
          "0x6dC6cE589F852F96ac86cB160AB0B15b9f56DeDd",
          "0x3c28437E610fB099Cc3d6De4D9c707DFACD308AE",
          "0x7b6257F5caf7311b36F7416133A8499c68a83c3a",
          "0xC86382179500e8Ed3e686fC4A99eD9EC72df3f56",
          "0x3cb1fD19CFb178C1098f2fc1e11090A0642B2314",
          "0x87f6C7d24b109919eB38295e3F8298425e6331D9",
          "0x5C8b55722f421556a2AAfb7A3EA63d4c3e514312",
          "0xD523267698C81a372191136e477fdebFa33D9FB4",
          "0xdcCF401fD121d8C542E96BC1d0078884422aFAD2"
        ],
        "impl": "0x62450517EfA1CE60d79801daf8f95973865e8D40"
      },
      "strategyBeacon": {
        "beacon": "0xf2c2AcA859C685895E60ca7A14274365b64c0c2a",
        "impl": "0xd648792F932FbabcCC80Cd376812074434412685",
        "pendingImpl": "0x0000000000000000000000000000000000000000"
      },
      "strategyFactory": {
        "impl": "0x7a9478c0AcB819d7c235FbE2a6E13ee1D2fCD862",
        "pendingImpl": "0x0000000000000000000000000000000000000000",
        "proxy": "0xad4A89E3cA9b3dc25AABe0aa7d72E61D2Ec66052"
      }
    },
    "token": {
      "EIGEN": {
        "impl": "0x95a7431400F362F3647a69535C5666cA0133CAA0",
        "pendingImpl": "0x0000000000000000000000000000000000000000",
        "proxy": "0xD58f6844f79eB1fbd9f7091d05f7cb30d3363926",
        "proxyAdmin": "0x1BEF05C7303d44e0E2FCD2A19d993eDEd4c51b5B"
      },
      "bEIGEN": {
        "impl": "0xd5FdabDac3d8ACeAB7BFfDDFA18877A4c5D5Aa82",
        "pendingImpl": "0x0000000000000000000000000000000000000000",
        "proxy": "0xA72942289a043874249E60469F68f08B8c6ECCe8",
        "proxyAdmin": "0x1BEF05C7303d44e0E2FCD2A19d993eDEd4c51b5B"
      },
      "eigenStrategy": {
        "impl": "0x59D13E7Fb0bC0e57c1fc6594ff701592A6e4dD2B",
        "pendingImpl": "0x0000000000000000000000000000000000000000",
        "proxy": "0xdcCF401fD121d8C542E96BC1d0078884422aFAD2"
      }
    }
  }
}
````

## File: script/deploy/devnet/deploy_from_scratch.s.sol
````
// SPDX-License-Identifier: BUSL-1.1
⋮----
import "@openzeppelin/contracts/token/ERC20/presets/ERC20PresetFixedSupply.sol";
import "@openzeppelin/contracts/proxy/transparent/ProxyAdmin.sol";
import "@openzeppelin/contracts/proxy/transparent/TransparentUpgradeableProxy.sol";
import "@openzeppelin/contracts/proxy/beacon/UpgradeableBeacon.sol";
⋮----
import "../../../src/contracts/interfaces/IETHPOSDeposit.sol";
⋮----
import "../../../src/contracts/core/StrategyManager.sol";
import "../../../src/contracts/core/DelegationManager.sol";
import "../../../src/contracts/core/AVSDirectory.sol";
import "../../../src/contracts/core/RewardsCoordinator.sol";
import "../../../src/contracts/core/AllocationManager.sol";
import "../../../src/contracts/core/AllocationManagerView.sol";
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";
⋮----
import "../../../src/contracts/permissions/PauserRegistry.sol";
⋮----
import "../../../src/test/mocks/EmptyContract.sol";
import "../../../src/test/mocks/ETHDepositMock.sol";
⋮----
import "forge-std/Script.sol";
import "forge-std/Test.sol";
⋮----
// # To load the variables in the .env file
// source .env
⋮----
// # To deploy and verify our contract
// forge script script/deploy/devnet/deploy_from_scratch.s.sol --rpc-url $RPC_URL --private-key $PRIVATE_KEY --broadcast --sig "run(string memory configFile)" -- local/deploy_from_scratch.anvil.config.json
contract DeployFromScratch is Script, Test {
⋮----
// EigenLayer Contracts
⋮----
// the ETH2 deposit contract -- if not on mainnet, we deploy a mock as stand-in
⋮----
// strategies deployed
⋮----
// OTHER DEPLOYMENT PARAMETERS
⋮----
// DelegationManager
⋮----
// AllocationManager
⋮----
// RewardsCoordinator
⋮----
// one week in blocks -- 50400
⋮----
function run(
⋮----
// read and log the chainID
⋮----
// READ JSON CONFIG DATA
⋮----
// bytes memory parsedData = vm.parseJson(config_data);
⋮----
// START RECORDING TRANSACTIONS FOR DEPLOYMENT
⋮----
// deploy proxy admin for ability to upgrade proxy contracts
⋮----
//deploy pauser registry
⋮----
/// First, deploy upgradeable proxy contracts that **will point** to the implementations. Since the implementation contracts are
/// not yet deployed, we give these proxies an empty contract as the initial implementation, to act as if they have no code.
⋮----
// if on mainnet, use the ETH2 deposit contract address
⋮----
// if not on mainnet, deploy a mock
⋮----
// Second, deploy the *implementation* contracts, using the *proxy contracts* as inputs
⋮----
// Third, upgrade the proxy contracts to use the correct implementation contracts and initialize them.
⋮----
executorMultisig // feeRecipient
⋮----
// Deploy strategyFactory & base
// Create base strategy implementation
⋮----
// Create a proxy beacon for base strategy implementation
⋮----
// Create duration vault strategy implementation and beacon
⋮----
// Create strategy factory implementation with beacons (beacons are now immutable)
⋮----
// Strategy Factory, upgrade and initialized
⋮----
// Set the strategyWhitelister to the factory
⋮----
// Deploy a WETH strategy
⋮----
// Transfer ownership
⋮----
// STOP RECORDING TRANSACTIONS FOR DEPLOYMENT
⋮----
// CHECK CORRECTNESS OF DEPLOYMENT
⋮----
// Check DM and AM have same withdrawa/deallocation delay
// TODO: Update after AllocationManager is converted to timestamps as well
// require(
//     delegation.minWithdrawalDelayBlocks() == allocationManager.DEALLOCATION_DELAY(),
//     "DelegationManager and AllocationManager have different withdrawal/deallocation delays"
// );
⋮----
// WRITE JSON DATA
⋮----
vm.serializeUint(deployed_addresses, "numStrategiesDeployed", 0); // for compatibility with other scripts
⋮----
// dummy token data
⋮----
// serialize all the data
⋮----
// TODO: should output to different file depending on configFile passed to run()
⋮----
function _verifyContractsPointAtOneAnother(
⋮----
function _verifyImplementationsSetCorrectly() internal view {
⋮----
function _verifyInitialOwners() internal view {
⋮----
// require(delegation.owner() == executorMultisig, "delegation: owner not set correctly");
⋮----
// require(allocationManager.owner() == executorMultisig, "allocationManager: owner not set correctly");
⋮----
function _checkPauserInitializations() internal view {
⋮----
// // pause *nothing*
// uint256 STRATEGY_MANAGER_INIT_PAUSED_STATUS = 0;
// // pause *everything*
⋮----
// uint256 DELEGATION_INIT_PAUSED_STATUS = type(uint256).max;
// // pause *all of the proof-related functionality* (everything that can be paused other than creation of EigenPods)
// uint256 EIGENPOD_MANAGER_INIT_PAUSED_STATUS = (2**1) + (2**2) + (2**3) + (2**4); /* = 30 */
⋮----
// require(strategyManager.paused() == 0, "strategyManager: init paused status set incorrectly");
// require(delegation.paused() == type(uint256).max, "delegation: init paused status set incorrectly");
// require(eigenPodManager.paused() == 30, "eigenPodManager: init paused status set incorrectly");
⋮----
function _verifyInitializationParams() internal view {
// // one week in blocks -- 50400
// uint32 STRATEGY_MANAGER_INIT_WITHDRAWAL_DELAY_BLOCKS = 7 days / 12 seconds;
// require(strategyManager.withdrawalDelayBlocks() == 7 days / 12 seconds,
//     "strategyManager: withdrawalDelayBlocks initialized incorrectly");
// uint256 MAX_RESTAKED_BALANCE_GWEI_PER_VALIDATOR = 32 ether;
````

## File: script/deploy/local/deploy_from_scratch.slashing.s.sol
````
// SPDX-License-Identifier: BUSL-1.1
⋮----
import "@openzeppelin/contracts/token/ERC20/presets/ERC20PresetFixedSupply.sol";
import "@openzeppelin/contracts/proxy/transparent/ProxyAdmin.sol";
import "@openzeppelin/contracts/proxy/transparent/TransparentUpgradeableProxy.sol";
import "@openzeppelin/contracts/proxy/beacon/UpgradeableBeacon.sol";
⋮----
import "../../../src/contracts/interfaces/IETHPOSDeposit.sol";
import "../../../src/contracts/strategies/EigenStrategy.sol";
⋮----
import "../../../src/contracts/core/StrategyManager.sol";
import "../../../src/contracts/core/DelegationManager.sol";
import "../../../src/contracts/core/AVSDirectory.sol";
import "../../../src/contracts/core/RewardsCoordinator.sol";
import "../../../src/contracts/core/AllocationManager.sol";
import "../../../src/contracts/core/AllocationManagerView.sol";
import "../../../src/contracts/permissions/PermissionController.sol";
⋮----
import "../../../src/contracts/strategies/StrategyBaseTVLLimits.sol";
⋮----
import "../../../src/contracts/pods/EigenPod.sol";
import "../../../src/contracts/pods/EigenPodManager.sol";
⋮----
import "../../../src/contracts/permissions/PauserRegistry.sol";
⋮----
import "../../../src/test/mocks/EmptyContract.sol";
import "../../../src/test/mocks/ETHDepositMock.sol";
⋮----
import "forge-std/Script.sol";
import "forge-std/Test.sol";
⋮----
// # To load the variables in the .env file
// source .env
⋮----
// # To deploy and verify our contract
// forge script script/deploy/local/deploy_from_scratch.slashing.s.sol --rpc-url $RPC_URL -vvvv --private-key $PRIVATE_KEY --broadcast --sig "run(string memory configFile)" -- local/deploy_from_scratch.slashing.anvil.config.json
contract DeployFromScratch is Script, Test {
⋮----
// struct used to encode token info in config file
⋮----
// EigenLayer Contracts
⋮----
// the ETH2 deposit contract -- if not on mainnet, we deploy a mock as stand-in
⋮----
// strategies deployed
⋮----
// OTHER DEPLOYMENT PARAMETERS
⋮----
// DelegationManager
⋮----
// AllocationManager
⋮----
// RewardsCoordinator
⋮----
// one week in blocks -- 50400
⋮----
function run(
⋮----
// read and log the chainID
⋮----
// READ JSON CONFIG DATA
⋮----
// bytes memory parsedData = vm.parseJson(config_data);
⋮----
// tokens to deploy strategies for
⋮----
// load token list
⋮----
// START RECORDING TRANSACTIONS FOR DEPLOYMENT
⋮----
// deploy proxy admin for ability to upgrade proxy contracts
⋮----
//deploy pauser registry
⋮----
/// First, deploy upgradeable proxy contracts that **will point** to the implementations. Since the implementation contracts are
/// not yet deployed, we give these proxies an empty contract as the initial implementation, to act as if they have no code.
⋮----
// if on mainnet, use the ETH2 deposit contract address
⋮----
// if not on mainnet, deploy a mock
⋮----
// Second, deploy the *implementation* contracts, using the *proxy contracts* as inputs
// Deploy AllocationManagerView as a standalone implementation (not a proxy)
⋮----
// Third, upgrade the proxy contracts to use the correct implementation contracts and initialize them.
⋮----
executorMultisig // feeRecipient
⋮----
// deploy StrategyBaseTVLLimits contract implementation
⋮----
// create upgradeable proxies that each point to the implementation and initialize them
⋮----
// Transfer ownership
⋮----
// STOP RECORDING TRANSACTIONS FOR DEPLOYMENT
⋮----
// CHECK CORRECTNESS OF DEPLOYMENT
⋮----
// WRITE JSON DATA
⋮----
vm.serializeUint(deployed_addresses, "numStrategiesDeployed", 0); // for compatibility with other scripts
⋮----
// dummy token data
⋮----
// serialize all the data
⋮----
function _verifyContractsPointAtOneAnother(
⋮----
function _verifyImplementationsSetCorrectly() internal view {
⋮----
function _verifyInitialOwners() internal view {
⋮----
// require(delegation.owner() == executorMultisig, "delegation: owner not set correctly");
⋮----
function _checkPauserInitializations() internal view {
⋮----
// // pause *nothing*
// uint256 STRATEGY_MANAGER_INIT_PAUSED_STATUS = 0;
// // pause *everything*
⋮----
// uint256 DELEGATION_INIT_PAUSED_STATUS = type(uint256).max;
// // pause *all of the proof-related functionality* (everything that can be paused other than creation of EigenPods)
// uint256 EIGENPOD_MANAGER_INIT_PAUSED_STATUS = (2**1) + (2**2) + (2**3) + (2**4); /* = 30 */
⋮----
// require(strategyManager.paused() == 0, "strategyManager: init paused status set incorrectly");
// require(delegation.paused() == type(uint256).max, "delegation: init paused status set incorrectly");
// require(eigenPodManager.paused() == 30, "eigenPodManager: init paused status set incorrectly");
⋮----
function _verifyInitializationParams() internal view {
// // one week in blocks -- 50400
// uint32 STRATEGY_MANAGER_INIT_WITHDRAWAL_DELAY_BLOCKS = 7 days / 12 seconds;
// require(strategyManager.withdrawalDelayBlocks() == 7 days / 12 seconds,
//     "strategyManager: withdrawalDelayBlocks initialized incorrectly");
// uint256 MAX_RESTAKED_BALANCE_GWEI_PER_VALIDATOR = 32 ether;
````

## File: script/deploy/multichain/.gitignore
````
# Ignore wallet files to prevent sensitive information from being committed
*.wallet.json
````

## File: script/deploy/multichain/create_generator_config.s.sol
````
// SPDX-License-Identifier: BUSL-1.1
⋮----
import "@openzeppelin/contracts/utils/Strings.sol";
import "src/contracts/interfaces/IOperatorTableCalculator.sol";
import "src/contracts/interfaces/ICrossChainRegistry.sol";
import "src/contracts/libraries/BN254.sol";
import "src/contracts/libraries/Merkle.sol";
import {Env} from "../../releases/Env.sol";
import "forge-std/Script.sol";
import "forge-std/Test.sol";
⋮----
// zeus run --command 'forge script script/deploy/multichain/create_generator_config.s.sol --sig "run(string memory,uint256,uint256)" $NETWORK $X_COORD $Y_COORD' --env $NETWORK
contract CreateGeneratorConfig is Script, Test {
⋮----
function run(
⋮----
// Network must be preprod, testnet-sepolia, or mainnet
⋮----
// Create G1Point from provided coordinates
⋮----
///
///                     Create the `BN254OperatorSetInfo` struct
⋮----
// 1. Generate the `BN254OperatorSetInfo` struct
⋮----
// 2. Set the numOperators and totalWeights
⋮----
// 3. Set the apk (aggregate public key)
⋮----
// 4. Set the operatorInfoTreeRoot
⋮----
///                     OUTPUT - OPERATOR SET INFO (TOML FORMAT)
⋮----
// Write operator set info to TOML file
⋮----
// Log the generated config
⋮----
function _writeOperatorSetToml(
⋮----
// Build JSON object using serializeJson
⋮----
// Top level fields
⋮----
// generator object
⋮----
// generatorInfo object
⋮----
// aggregatePubkey nested object
⋮----
// Write TOML file using writeToml
// If we are on testnet-sepolia, write to testnet.toml
⋮----
function _strEq(
⋮----
/// @dev Returns the ops multisig address for the given network
function _getGeneratorAddress() internal view returns (address generatorAddress) {
````

## File: script/deploy/multichain/deploy_generator.s.sol.sol
````
// SPDX-License-Identifier: BUSL-1.1
⋮----
import "@openzeppelin/contracts/utils/Strings.sol";
import "src/test/utils/OperatorWalletLib.sol";
import "src/test/utils/Random.sol";
import "src/contracts/interfaces/IOperatorTableCalculator.sol";
import "src/contracts/interfaces/ICrossChainRegistry.sol";
⋮----
import "src/contracts/libraries/Merkle.sol";
import {Env} from "../../releases/Env.sol";
⋮----
import "forge-std/Script.sol";
import "forge-std/Test.sol";
⋮----
// zeus run --command 'forge script script/deploy/multichain/deploy_generator.s.sol --sig "run(string memory,string memory)" $NETWORK $SALT' --env $NETWORK
contract DeployGenerator is Script, Test {
⋮----
function run(
⋮----
///
///                     WALLET CREATION
⋮----
// 1. Create a BN254 Wallet using random salt
⋮----
///                     Create the `BN254OperatorInfo` struct
⋮----
// 1. Generate the `BN254OperatorInfo` struct
⋮----
// 2. Set the numOperators and totalWeights
⋮----
// 3. Set the apk
⋮----
// 4. Set the operatorInfoTreeRoot
⋮----
///                     OUTPUT - OPERATOR SET INFO (TOML FORMAT)
⋮----
// Write operator set info to TOML file
⋮----
///                     OUTPUT - BLS WALLET
⋮----
// Write operator data to a separate function to avoid stack too deep
⋮----
function _writeOperatorData(
⋮----
// Serialize regular wallet info
⋮----
// Serialize BLS wallet info
⋮----
// Serialize publicKeyG1
⋮----
// Serialize publicKeyG2
⋮----
// Combine wallet and blsWallet into operator object
⋮----
// Write to separate file
⋮----
function _writeOperatorSetToml(
⋮----
// Build JSON object using serializeJson
⋮----
// Top level fields
⋮----
// generator object
⋮----
// generatorInfo object
⋮----
// aggregatePubkey nested object
⋮----
// Write TOML file using writeToml
// If we are on testnet-sepolia, write to testnet.toml
⋮----
function _strEq(
⋮----
/// @dev Returns the ops multisig address for the given network
function _getGeneratorAddress() internal view returns (address generatorAddress) {
````

## File: script/interfaces/IUpgradeableBeacon.sol
````
// SPDX-License-Identifier: BUSL-1.1
⋮----
interface IUpgradeableBeacon {
function upgradeTo(
⋮----
function implementation() external returns (address);
````

## File: script/operations/e2e/ClaimRewards.s.sol
````
// SPDX-License-Identifier: BUSL-1.1
⋮----
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(
⋮----
/// @notice Claim using an explicitly provided RewardsCoordinator address.
function runWithRewardsCoordinator(
⋮----
function _claim(
⋮----
function _loadClaimFromFile(
⋮----
// Accept either:
// - direct object: { rootIndex, earnerIndex, earnerTreeProof, earnerLeaf, tokenIndices, tokenTreeProofs, tokenLeaves }
// - wrapped: { proof: { ... } } (Sidecar-style)
⋮----
// If the proof contains scalar token fields, wrap them into single-element arrays.
⋮----
function _hasJsonPath(
⋮----
function _resolvePath(
````

## File: script/operations/e2e/DurationVaultHoodiE2E.s.sol
````
// SPDX-License-Identifier: BUSL-1.1
⋮----
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 {
⋮----
// core
⋮----
// identities
⋮----
// deployed
⋮----
// config
⋮----
// ephemeral
⋮----
/// 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 {
⋮----
/// @notice Run using addresses passed as arguments.
/// @dev Use:
/// forge script ... --sig "runWithCore(address,address,address,address,address)" -- <allocationManager> <delegationManager> <strategyManager> <strategyFactory> <rewardsCoordinator>
function runWithCore(
⋮----
function _runWithCore(
⋮----
// If you want fork-only simulation without passing a private key, you can set E2E_SENDER=<address>.
⋮----
// Ensure the allocation has become effective, otherwise slashing can legitimately produce 0.
⋮----
// Rewards-only: reuse the previously deployed vault and just create a new rewards submission in a window
// that includes "now" (the script enforces this).
⋮----
// "all" (default): run everything in one shot; slashing may produce 0 if allocation isn't effective yet.
⋮----
function _loadCoreFromEnv()
⋮----
function _initContext(
⋮----
// In forge scripts, `msg.sender` is the script contract; use tx.origin as the broadcaster address.
⋮----
ctx.durationSeconds = uint32(vm.envOr("E2E_VAULT_DURATION_SECONDS", uint256(120))); // 2 minutes default
⋮----
function _setupAVS(
⋮----
function _createOperatorSet(
⋮----
function _deployVault(
⋮----
function _depositAndLock(
⋮----
function _slashAndRedistribute(
⋮----
// 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
⋮----
function _createRewardsSubmission(
⋮----
// RewardsCoordinator constraints (enforced again on-chain):
// - startTimestamp % CALCULATION_INTERVAL_SECONDS == 0
// - duration % CALCULATION_INTERVAL_SECONDS == 0
⋮----
// Mode A: Standard AVS rewards submission (works for protocol; may not be indexed by Sidecar if it only
// understands legacy AVSDirectory registrations).
⋮----
// Defaults are aligned for live networks like preprod-hoodi (interval = 1 day).
⋮----
// 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.
⋮----
// 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.
⋮----
// Must be strictly retroactive: end < now.
⋮----
function _submitAndVerifyOperatorDirectedOperatorSetRewards(
⋮----
function _submitAndVerifyRewards(
⋮----
function _defaultAlignedRewardsStartTimestamp(
⋮----
// Use the current interval boundary so the window includes "now".
// Example: interval=86400, now=10:15 UTC => start at today 00:00 UTC.
⋮----
function _operatorSetContainsStrategy(
⋮----
function _getDepositedShares(
⋮----
function _stateFile() internal view returns (string memory) {
⋮----
function _persistState(
⋮----
// Capture the allocation effect block so the user knows how long to wait before running the slash phase.
⋮----
function _loadState() internal view returns (PersistedState memory st) {
````

## File: script/operations/e2e/MockAVSRegistrar.sol
````
// SPDX-License-Identifier: BUSL-1.1
⋮----
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 {
⋮----
event OperatorRegistered(address indexed operator, address indexed avs, uint32[] operatorSetIds, bytes data);
event OperatorDeregistered(address indexed operator, address indexed avs, uint32[] operatorSetIds);
⋮----
/// operator => operatorSetId => registered
⋮----
function supportsAVS(
⋮----
function registerOperator(
⋮----
function deregisterOperator(
````

## File: script/operations/e2e/README.md
````markdown
# 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 != <earner arg>` to avoid accidental mismatched claims. In practice you should pass the same address as the EOA you’re broadcasting from.
````

## File: script/operations/update-generator/1-updateGenerator.s.sol
````
// SPDX-License-Identifier: BUSL-1.1
⋮----
import "../../releases/Env.sol";
import "../../releases/TestUtils.sol";
import {MultisigBuilder} from "zeus-templates/templates/MultisigBuilder.sol";
⋮----
// Types
import "src/contracts/interfaces/IOperatorTableCalculator.sol";
import "src/contracts/libraries/OperatorSetLib.sol";
import "src/contracts/libraries/BN254.sol";
import "src/contracts/interfaces/IBaseCertificateVerifier.sol";
⋮----
// For TOML parsing
import {stdToml} from "forge-std/StdToml.sol";
⋮----
/// Purpose: Update the generator on a PREPROD/TESTNET environment
contract QueueTransferProxyAdmin is MultisigBuilder {
⋮----
function _runAsMultisig() internal virtual override prank(Env.opsMultisig()) {
⋮----
function testScript() public virtual {
// Require that the environment is a testnet environment supported by multichain
⋮----
// Update the generator
⋮----
// Get the generator params
⋮----
// Check that the generator has been updated in the operator table updater
⋮----
// Check that the generator has been updated in the certificate verifier
⋮----
// Get the operatorSetInfo
⋮----
function _getGeneratorParams(
⋮----
// Read the TOML file
⋮----
// Parse generator
⋮----
// Parse generatorInfo
````

## File: script/operations/update-generator/README.md
````markdown
# Generator Update

The `generator`, signs off on roots. In order to generate this operatorSet, we use the following [script](../../deploy/multichain/deploy_generator.s.sol) The script outputs two items:

1. `network.wallet.json`: Private keys and BLS sig info (should be kept secure)
2. `network.toml`: A toml file passed into initialization on `operatorTableUpdater`

See our [docs](../../../docs/multichain/) for more information.
````

## File: script/operations/update-generator/upgrade.json
````json
{
    "name": "update-generator",
    "from": "1.8.0-rc.0",
    "to": "1.8.0-rc.0",
    "phases": [
        {
            "type": "multisig",
            "filename": "1-updateGenerator.s.sol"
        }
    ]
}
````

## File: script/operations/README.md
````markdown
# Operations Scripting With Zeus

This directory is where you will build [Zeus](https://github.com/Layr-Labs/zeus) scripts to do one-off protocol interactions. It *should not* be used for pauser multisig interactions - see the Pauser guide for more information. 

When running or testing a script, _you tell zeus which environment to use,_ and it will fork the corresponding network state and setup environment variables for that environment's params/deployment addresses.

zeus script --env testnet-hoodi --multisig script/releases/tests/ExecuteTransferOwnership.s.sol

##### Getting Started

* Install [Zeus](https://github.com/Layr-Labs/zeus)
* Run `zeus login`

At this point, you should be able to view an environment's config (try `zeus env show preprod`)

---

### Writing a Script

Operations scripts are generally single script that require a multisig step. The step should include comprehensive test functions to validate the changes at each stage of the upgrade process.

### Upgrade.json
The `upgrade.json` file denotes the steps of the script. See previous upgrade scripts for examples

### MultisigBuilder

`MultisigBuilder` is the base class for any action to be taken by a Safe Multisig. The entry function is `execute()` and requires adding `-s "execute(string memory)" "<path_to_config>"` as a `forge script` flag. Any inheriting contract is expected to inherit the `_execute()` internal function and return a `MultisigCall[]` object, containing all intended multisig calls.

The `MultisigCall` struct contains 3 fields:
* `to`: the address to call with the multisig
* `value`: the amount of ETH to send as part of the transaction.
* `data`: the calldata associated with the multisig call.

Once the `_execute()` function is implemented, the base MultisigBuilder contract will combine these calls into one `SafeTx` object, which is intended to pass all calls into the [MultiSendCallOnly](https://github.com/safe-global/safe-smart-account/blob/6fde75d29c8b52d5ac0c93a6fb7631d434b64119/contracts/libraries/MultiSendCallOnly.sol) contract.

### Running A Script

Example script:

```bash
zeus script --env <env> --<eoa or multisig> <path to script>

# zeus script --env testnet-sepolia --multisig script/operations/update-generator/1-updateGenerator.s.sol
```

To run tests:

```bash
zeus test --env <env> <path to script> --rpcUrl <rpc_url>

# zeus test script/operations/update-generator/1-updateGenerator.s.sol --env testnet-sepolia --rpcUrl $RPC_SEPOLIA
```
````

## File: script/releases/v1.12.0-incentive-council/1-deployImplementations.s.sol
````
// SPDX-License-Identifier: BUSL-1.1
⋮----
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 {
⋮----
function _runAsEOA() internal virtual override {
⋮----
/// core/
// Deploy EmissionsController proxy first (RewardsCoordinator needs its address as immutable)
// Preprod already has EmissionsController proxy deployed
⋮----
// Update the MAX_REWARDS_DURATION environment variable before deploying RewardsCoordinator
// 63072000s = 730 days = 2 years
⋮----
/// strategies/
⋮----
// Deploy DurationVaultStrategy implementation and beacon
⋮----
// Deploy StrategyFactory (requires beacons to exist for immutable constructor args)
⋮----
function _deployDurationVaultBeacon(
⋮----
function deployEmissionsControllerProxy() internal onlyEOA {
⋮----
function testScript() public virtual {
⋮----
// Validate incentive council implementations
⋮----
// Validate duration vault implementations
````

## File: script/releases/v1.12.0-incentive-council/2-queueUpgrade.s.sol
````
// SPDX-License-Identifier: BUSL-1.1
⋮----
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 {
⋮----
function _runAsMultisig() internal virtual override prank(Env.opsMultisig()) {
⋮----
function _getCalldataToExecutor() internal returns (bytes memory) {
⋮----
// 1. Upgrade EmissionsController proxy to the new implementation and initialize
// Preprod needs to be upgraded, not redeployed.
⋮----
Env.opsMultisig(), // initialOwner
Env.incentiveCouncilMultisig(), // initialIncentiveCouncil
0 // initialPausedStatus
⋮----
// 2. Upgrade strategy contracts for Duration Vault feature.
⋮----
// 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.
⋮----
uint8 initializedVersion = uint8(uint256(slot0) & 0xFF); // Mask to get only the first byte
⋮----
// Not yet reinitialized - perform upgrade with reinitialization
⋮----
// Already reinitialized - just upgrade without calling initialize
⋮----
// 4. Register DurationVaultStrategy beacon and EmissionsController in protocol registry.
⋮----
// 5. Remove minting rights from the old hopper.
⋮----
// 6. Grant minting rights to the EmissionsController.
⋮----
// Execute the calls.
⋮----
function testScript() public virtual override {
⋮----
// Check that the upgrade does not exist in the timelock
⋮----
// Check that the upgrade has been added to the timelock
⋮----
/// @notice Validates state before queuing the upgrade
function _validatePreUpgradeState() internal view {
// Ensure new implementations are deployed
⋮----
// Ensure EmissionsController proxy is deployed
⋮----
// Ensure old hopper currently has minting rights
⋮----
// Ensure EmissionsController does NOT have minting rights yet
// Skip check if we are on preprod, as the EmissionsController is already deployed.
````

## File: script/releases/v1.12.0-incentive-council/3-completeUpgrade.s.sol
````
// SPDX-License-Identifier: BUSL-1.1
⋮----
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 {
⋮----
function _runAsMultisig() internal virtual override prank(Env.protocolCouncilMultisig()) {
⋮----
function testScript() public virtual override {
⋮----
// Deploy the implementations (from previous step 1)
⋮----
// Queue the upgrade (from previous step 2)
⋮----
_unsafeResetHasPranked(); // reset hasPranked so we can use it again
⋮----
// Warp Past delay
vm.warp(block.timestamp + timelock.getMinDelay()); // 1 tick after ETA
⋮----
// Execute
⋮----
// Run Tests
⋮----
// TestUtils.validateProxiesAlreadyInitialized();
⋮----
// Incentive council validations (must run before validateProtocolRegistry which pauses everything)
⋮----
// Duration vault validations
⋮----
// Run last since it calls pauseAll()
⋮----
/// @notice Validates that the EmissionsController was upgraded and initialized correctly
function _validateEmissionsControllerUpgrade() internal view {
⋮----
// Validate proxy admin
⋮----
// Validate implementation
⋮----
// Validate initialization state
⋮----
// Validate immutables
⋮----
// Validate protocol registry entry
⋮----
/// @notice Validates that the RewardsCoordinator was upgraded and reinitialized correctly
function _validateRewardsCoordinatorUpgrade() internal view {
⋮----
// Validate reinitialization state
⋮----
//assertEq(rc.paused(), 2, "RC: paused status incorrect");
⋮----
// Validate immutables still intact
⋮----
/// @notice Validates that minting rights were correctly transferred
function _validateMintingRights() internal view {
⋮----
// Validate EmissionsController has minting rights
⋮----
// Validate old hopper does NOT have minting rights
````

## File: script/releases/v1.12.0-incentive-council/upgrade.json
````json
{
    "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"
        }
    ]
}
````

## File: script/releases/CoreContractsDeployer.sol
````
// SPDX-License-Identifier: BUSL-1.1
⋮----
import {EOADeployer} from "zeus-templates/templates/EOADeployer.sol";
import "./Env.sol";
⋮----
/// @title CoreContractsDeployer
/// @notice Provides reusable helpers for deploying individual core contract implementations.
/// Usage:
/// ```solidity
/// vm.startBroadcast();
/// deployPermissionController();
/// deployKeyRegistrar();
/// vm.stopBroadcast();
/// ```
abstract contract CoreContractsDeployer is EOADeployer {
⋮----
/// permissions/
function deployPermissionController() internal onlyEOA returns (PermissionController deployed) {
⋮----
function deployKeyRegistrar() internal onlyEOA returns (KeyRegistrar deployed) {
⋮----
/// core/
function deployAllocationManagerView() internal onlyEOA returns (AllocationManagerView deployed) {
⋮----
function deployAllocationManager() internal onlyEOA returns (AllocationManager deployed) {
⋮----
function deployAVSDirectory() internal onlyEOA returns (AVSDirectory deployed) {
⋮----
function deployDelegationManager() internal onlyEOA returns (DelegationManager deployed) {
⋮----
function deployProtocolRegistry() internal onlyEOA returns (ProtocolRegistry deployed) {
⋮----
function deployReleaseManager() internal onlyEOA returns (ReleaseManager deployed) {
⋮----
function deployRewardsCoordinator() internal onlyEOA returns (RewardsCoordinator deployed) {
⋮----
// 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.
⋮----
function deployStrategyManager() internal onlyEOA returns (StrategyManager deployed) {
⋮----
function deployEmissionsController() internal onlyEOA returns (EmissionsController deployed) {
⋮----
/// pods/
function deployEigenPodManager() internal onlyEOA returns (EigenPodManager deployed) {
⋮----
function deployEigenPod() internal onlyEOA returns (EigenPod deployed) {
⋮----
/// strategies/
function deployEigenStrategy() internal onlyEOA returns (EigenStrategy deployed) {
⋮----
function deployStrategyBase() internal onlyEOA returns (StrategyBase deployed) {
⋮----
function deployStrategyBaseTVLLimits() internal onlyEOA returns (StrategyBaseTVLLimits deployed) {
⋮----
function deployStrategyFactory() internal onlyEOA returns (StrategyFactory deployed) {
⋮----
function deployDurationVaultStrategy() internal onlyEOA returns (DurationVaultStrategy deployed) {
⋮----
/// multichain/
function deployBN254CertificateVerifier() internal onlyEOA returns (BN254CertificateVerifier deployed) {
⋮----
function deployCrossChainRegistry() internal onlyEOA returns (CrossChainRegistry deployed) {
⋮----
function deployECDSACertificateVerifier() internal onlyEOA returns (ECDSACertificateVerifier deployed) {
⋮----
function deployOperatorTableUpdater() internal onlyEOA returns (OperatorTableUpdater deployed) {
⋮----
/// avs/
function deployTaskMailbox() internal onlyEOA returns (TaskMailbox deployed) {
````

## File: script/releases/CoreUpgradeQueueBuilder.sol
````
// SPDX-License-Identifier: BUSL-1.1
⋮----
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.
/// Usage:
/// ```solidity
/// MultisigCall[] storage executorCalls = Encode.newMultisigCalls();
/// executorCalls.upgradeAVSDirectory();
/// ```
⋮----
/// permissions/
function upgradePermissionController(
⋮----
function upgradeKeyRegistrar(
⋮----
/// core/
function upgradeAllocationManager(
⋮----
function upgradeAVSDirectory(
⋮----
function upgradeDelegationManager(
⋮----
function upgradeProtocolRegistry(
⋮----
function upgradeReleaseManager(
⋮----
function upgradeRewardsCoordinator(
⋮----
function upgradeAndReinitializeRewardsCoordinator(
⋮----
function upgradeStrategyManager(
⋮----
function upgradeEmissionsController(
⋮----
function upgradeAndInitializeEmissionsController(
⋮----
/// pods/
function upgradeEigenPodManager(
⋮----
function upgradeEigenPod(
⋮----
/// strategies/
function upgradeEigenStrategy(
⋮----
function upgradeStrategyBase(
⋮----
function upgradeStrategyBaseTVLLimits(
⋮----
function upgradeStrategyFactory(
⋮----
function upgradeDurationVaultStrategy(
⋮----
/// multichain/
function upgradeBN254CertificateVerifier(
⋮----
function upgradeCrossChainRegistry(
⋮----
function upgradeECDSACertificateVerifier(
⋮----
function upgradeOperatorTableUpdater(
⋮----
/// avs/
function upgradeTaskMailbox(
````

## File: script/releases/CrosschainDeployLib.sol
````
// SPDX-License-Identifier: BUSL-1.1
⋮----
import "@openzeppelin/contracts/proxy/transparent/TransparentUpgradeableProxy.sol";
⋮----
import "src/test/mocks/EmptyContract.sol";
import "script/releases/Env.sol";
import "script/releases/TestUtils.sol";
/// @dev https://github.com/pcaversaccio/createx/tree/main
⋮----
interface ICreateX {
function deployCreate2(
⋮----
function computeCreate2Address(
⋮----
/// @dev The creation code for the empty contract for production environments
/// @dev Originally, this code was deployed on every chain with a specific metadata hash. We want this to be consistent on all future deployments
/// @dev You can cross check the creation code here: https://etherscan.io/address/0x5b5e139f2d778e668932a6f3094aa172a862e61b#code
/// @dev The metadata hash should match if deployed from the `v1.8.1` tag
⋮----
/// @dev The creation code for a proxy contract for production environments
/// @dev This code does not include the constructor arguments, which are encoded in the `computeUpgradeableProxyInitCode` function
/// @dev You can cross check the creation code here: https://etherscan.io/address/0x7e644d79422f17c01e4894b5f4f588d331ebfa28653d42ae832dc59e38c9798f#code
⋮----
/// @dev The creation code for the empty contract for preprod/testnet environments
/// @dev You can cross check the creation code here: https://sepolia.etherscan.io/address/0xa6192470D7D4c39f8F392167ADde283F60b34E15#code
⋮----
/// @dev The creation code for a proxy contract for preprod/abitestnet environments.
⋮----
/// @dev You can cross check the creation code here: https://sepolia.etherscan.io/address/0xB02A15c6Bd0882b35e9936A9579f35FB26E11476#code
⋮----
/// -----------------------------------------------------------------------
/// Write
⋮----
/*
     * @notice Deploys a crosschain empty contract.
     * @dev The empty contract MUST stay consistent across all chains/deployments.
     * @dev The empty contract MUST always be deployed with the same salt.
     */
function deployEmptyContract(
⋮----
/*
     * @notice Deploys a crosschain `TransparentUpgradeableProxy` using CreateX.
     * @dev The initial admin is the deployer.
     * @dev The implementation MUST also be deterministic to ensure the contract can be deployed on all chains.
     * @dev The salt MUST be unique for each proxy deployment sharing the same implementation otherwise address collisions WILL occur.
     * @dev The `admin` is also assumed to be the deployer.
     *
     * @dev Example usage:
     * ```solidity
     * bytes11 salt = bytes11(uint88(0xffffffffffffffffffffff));
     * address emptyContract = crosschainDeployLib.deployEmptyContract(deployer);
     * address proxy = crosschainDeployLib.deployCrosschainProxy(deployer, emptyContract, salt);
     * ITransparentUpgradeableProxy(address(proxy)).upgradeTo(address(implementation));
     * ITransparentUpgradeableProxy(address(proxy)).changeAdmin(address(admin));
     * ```
     */
function deployCrosschainProxy(
⋮----
/*
     * @notice Deploys a crosschain contract with CreateX.
     *
     * @dev Example usage:
     * ```solidity
     * type(EmptyContract).creationCode.deployCrosschain(deployer, EMPTY_CONTRACT_SALT)
     * ```
     */
function _deployCrosschain(
⋮----
/// Helpers
⋮----
/*
     * @notice Returns an encoded CreateX salt.
     * @dev The deployer is the only account that can use this salt via CreateX hence the name "protected".
     * @dev The salt is structured as: Deployer EOA (20 bytes) | Cross-chain flag (1 byte) | Entropy (11 bytes)
     * @dev Example: 0xbebebebebebebebebebebebebebebebebebebebe|ff|1212121212121212121212
     */
function computeProtectedSalt(
⋮----
bytes1(uint8(0)), // Cross-chain redeploy protection enabled (0: false, 1: true)
bytes11(keccak256(bytes(name))) // salt
⋮----
/*
     * @notice Returns the initialization code for a transparent upgradeable proxy.
     * @dev The returned init code does not include metadata typically appended by the compiler.
     */
function computeUpgradeableProxyInitCode(
⋮----
// return creationCode;
⋮----
/*
     * @notice Computes the deterministic address where a crosschain contract will be deployed.
     * @dev Uses CreateX's computeCreate2Address with a protected salt to ensure deterministic deployment.
     * @param deployer The address of the deployer account.
     * @param initCodeHash The keccak256 hash of the contract's initialization code.
     * @param name The name used to generate the protected salt.
     * @return The deterministic address where the contract will be deployed.
     */
function computeCrosschainAddress(
⋮----
/*
     * @notice Computes the deterministic address where a crosschain upgradeable proxy will be deployed.
     * @dev Computes the init code hash for a transparent upgradeable proxy and calls computeCrosschainAddress.
     * @param adminAndDeployer The address that will be both the admin and deployer of the proxy.
     * @param implementation The address of the implementation contract.
     * @param name The name used to generate the protected salt.
     * @return The deterministic address where the upgradeable proxy will be deployed.
     */
function computeCrosschainUpgradeableProxyAddress(
````

## File: script/releases/Env.sol
````
// SPDX-License-Identifier: BUSL-1.1
⋮----
import "forge-std/Vm.sol";
import "zeus-templates/utils/ZEnvHelpers.sol";
⋮----
import {TimelockController} from "@openzeppelin/contracts/governance/TimelockController.sol";
import "@openzeppelin/contracts/proxy/beacon/UpgradeableBeacon.sol";
import "@openzeppelin/contracts/proxy/transparent/ProxyAdmin.sol";
import "@openzeppelin/contracts/proxy/transparent/TransparentUpgradeableProxy.sol";
⋮----
/// core/
import "src/contracts/core/AllocationManagerView.sol";
import "src/contracts/core/AllocationManager.sol";
⋮----
import "src/contracts/core/AVSDirectory.sol";
import "src/contracts/core/DelegationManager.sol";
import "src/contracts/core/RewardsCoordinator.sol";
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";
import "src/contracts/permissions/PermissionController.sol";
import "src/contracts/permissions/KeyRegistrar.sol";
⋮----
/// pods/
import "src/contracts/pods/EigenPod.sol";
import "src/contracts/pods/EigenPodManager.sol";
⋮----
/// strategies/
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";
import "src/contracts/interfaces/IBackingEigen.sol";
import "src/contracts/token/Eigen.sol";
import "src/contracts/token/BackingEigen.sol";
⋮----
/// multichain/
import "src/contracts/multichain/CrossChainRegistry.sol";
import "src/contracts/multichain/OperatorTableUpdater.sol";
import "src/contracts/multichain/ECDSACertificateVerifier.sol";
import "src/contracts/multichain/BN254CertificateVerifier.sol";
⋮----
/// avs/
import "src/contracts/avs/task/TaskMailbox.sol";
⋮----
// For destination chains
import "src/test/mocks/EmptyContract.sol";
⋮----
/// Dummy types and variables to facilitate syntax, e.g: `Env.proxy.delegationManager()`
⋮----
/// env
function env() internal view returns (string memory) {
⋮----
function envVersion() internal view returns (string memory) {
⋮----
function deployVersion() internal view returns (string memory) {
⋮----
function executorMultisig() internal view returns (address) {
⋮----
function opsMultisig() internal view returns (address) {
⋮----
function communityMultisig() internal view returns (address) {
⋮----
function protocolCouncilMultisig() internal view returns (address) {
⋮----
function pauserMultisig() internal view returns (address) {
⋮----
function incentiveCouncilMultisig() internal view returns (address) {
⋮----
function multichainDeployerMultisig() internal view returns (address) {
⋮----
function legacyTokenHopper() internal view returns (address) {
⋮----
function createX() internal view returns (address) {
⋮----
function proxyAdmin() internal view returns (address) {
⋮----
function ethPOS() internal view returns (IETHPOSDeposit) {
⋮----
function timelockController() internal view returns (TimelockController) {
⋮----
function multiSendCallOnly() internal view returns (address) {
⋮----
function MIN_WITHDRAWAL_DELAY() internal view returns (uint32) {
⋮----
function ALLOCATION_CONFIGURATION_DELAY() internal view returns (uint32) {
⋮----
function REWARDS_UPDATER() internal view returns (address) {
⋮----
function ACTIVATION_DELAY() internal view returns (uint32) {
⋮----
function DEFAULT_SPLIT_BIPS() internal view returns (uint16) {
⋮----
function CALCULATION_INTERVAL_SECONDS() internal view returns (uint32) {
⋮----
function MAX_REWARDS_DURATION() internal view returns (uint32) {
⋮----
function MAX_RETROACTIVE_LENGTH() internal view returns (uint32) {
⋮----
function MAX_FUTURE_LENGTH() internal view returns (uint32) {
⋮----
function GENESIS_REWARDS_TIMESTAMP() internal view returns (uint32) {
⋮----
function REWARDS_PAUSE_STATUS() internal view returns (uint256) {
⋮----
function EMISSIONS_INFLATION_RATE() internal view returns (uint256) {
⋮----
function EMISSIONS_START_TIME() internal view returns (uint256) {
⋮----
function EMISSIONS_COOLDOWN_SECONDS() internal view returns (uint256) {
⋮----
function SLASH_ESCROW_DELAY() internal view returns (uint32) {
⋮----
function CROSS_CHAIN_REGISTRY_PAUSE_STATUS() internal view returns (uint256) {
⋮----
function TABLE_UPDATE_CADENCE() internal view returns (uint32) {
⋮----
function MAX_TASK_SLA() internal view returns (uint96) {
// MAX_TASK_SLA is stored as uint256 in zeus env, cast to uint96
⋮----
function isSourceChain() internal view returns (bool) {
⋮----
function isDestinationChain() internal view returns (bool) {
⋮----
function allocationManager(
⋮----
function allocationManagerView(
⋮----
function avsDirectory(
⋮----
function delegationManager(
⋮----
function rewardsCoordinator(
⋮----
function strategyManager(
⋮----
function releaseManager(
⋮----
function protocolRegistry(
⋮----
function emissionsController(
⋮----
/// permissions/
function pauserRegistry(
⋮----
function permissionController(
⋮----
function keyRegistrar(
⋮----
function eigenPod(
⋮----
function eigenPodManager(
⋮----
function eigenStrategy(
⋮----
// Beacon proxy
function strategyBase(
⋮----
// Beaconed impl
⋮----
// Returns the number of proxy instances
function strategyBaseTVLLimits_Count(
⋮----
// Returns the proxy instance at index `i`
function strategyBaseTVLLimits(
⋮----
function strategyFactory(
⋮----
// Beacon proxy for duration vault strategies
function durationVaultStrategy(
⋮----
// Beaconed impl for duration vault strategies
⋮----
function eigen(
⋮----
function beigen(
⋮----
function emptyContract(
⋮----
function crossChainRegistry(
⋮----
function operatorTableUpdater(
⋮----
function ecdsaCertificateVerifier(
⋮----
function bn254CertificateVerifier(
⋮----
function taskMailbox(
⋮----
/// Helpers
function _deployedInstance(
⋮----
function _deployedInstanceCount(
⋮----
function _deployedProxy(
⋮----
function _deployedProxyOr(
⋮----
function _deployedBeacon(
⋮----
function _deployedImpl(
⋮----
function _envAddress(
⋮----
function _envU256(
⋮----
function _envU64(
⋮----
function _envU32(
⋮----
function _envU16(
⋮----
function _envBool(
⋮----
function _string(
⋮----
function _strEq(
⋮----
/// @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(
⋮----
/// @notice Parses a semver string into major, minor, patch components
function _parseVersion(
⋮----
/// @notice Parses a uint from a substring of bytes
function _parseUint(
⋮----
/// @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(
⋮----
// https://eips.ethereum.org/EIPS/eip-1967
⋮----
/// @dev Get the implementation address for a proxy
function getProxyImplementationBySlot(
⋮----
///
/// Environment Type Helpers
⋮----
/// Types that help facilitate network type differentation
/// @dev Mimics the deployment matrix in: https://github.com/Layr-Labs/eigenlayer-contracts?tab=readme-ov-file#deployments
function isCoreProtocolDeployed() internal view returns (bool) {
⋮----
/// @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) {
⋮----
function supportsEigenPods() internal view returns (bool) {
⋮----
function isSource() internal view returns (bool) {
⋮----
function isDestination() internal view returns (bool) {
⋮----
/// @dev Whether the environment is a testnet environment
function _isTestnetEnvironment() internal view returns (bool) {
⋮----
/// @dev Whether the environment is a production environment with real funds
function _isProductionEnvironment() internal view returns (bool) {
⋮----
function _isMainnet() private view returns (bool) {
⋮----
function _isBase() private view returns (bool) {
⋮----
function _isSepolia() private view returns (bool) {
⋮----
function _isBaseSepolia() private view returns (bool) {
⋮----
function _isHoodi() private view returns (bool) {
⋮----
function _isPreprod() private view returns (bool) {
````

## File: script/releases/README.md
````markdown
# Release Scripting With Zeus

This directory is where you will build [Zeus](https://github.com/Layr-Labs/zeus) scripts to manage core protocol releases. Releases are broken up into multiple steps composed of either a `forge` script or a custom shell script. Zeus's role is:
* Provide an environment to your script via environment variables
* Update environment after a release is run to completion
* Track status of releases to ensure steps are run (in order) only once per environment

**Note about environments:** Zeus scripts are intended to be written once, and run across _any_ environment we use. We currently have 6 live environments (`preprod`, `testnet`, `testnet-sepolia`, `testnet-hoodi`, `testnet-base-sepolia`, and `mainnet`), and the params/deployment addresses for each live in separate folders in [`layr-labs/eigenlayer-contracts-zeus-metadata`](https://github.com/Layr-Labs/eigenlayer-contracts-zeus-metadata).

When running or testing a script, _you tell zeus which environment to use,_ and it will fork the corresponding network state and setup environment variables for that environment's params/deployment addresses.

##### Getting Started

* Install [Zeus](https://github.com/Layr-Labs/zeus)
* Run `zeus login`

At this point, you should be able to view an environment's config (try `zeus env show preprod`)

---

### Writing a Script

Scripts are broken up into multiple steps, typically following a deploy-queue-execute pattern:

1. **Deploy (1-deployContracts.s.sol)**
   - Inherits from `EOADeployer`
   - Deploys new contract implementations
   - Validates deployments through extensive checks:
     - Implementation addresses
     - Proxy admin ownership
     - Constructor parameters
     - Initialization state
     - Version numbers

2. **Queue (2-queueUpgrade.s.sol)**
   - Inherits from `MultisigBuilder`
   - Prepares upgrade transaction for the Timelock
   - Constructs calldata for the Executor Multisig
   - Schedules the transaction in the Timelock
   - Includes validation to ensure proper queuing

3. **Execute (3-executeUpgrade.s.sol)**
   - Inherits from the Queue script
   - Executes the queued transaction after the timelock delay
   - Performs final validation of the upgrade:
     - Proxy implementation addresses
     - Proxy admin ownership
     - Constructor parameters
     - Initialization state

Each step should include comprehensive test functions to validate the changes at each stage of the upgrade process.

### EOADeployer

`EOADeployer` is the base contract for performing EOA deploys, providing a `Deployment` struct. The entry function is `deploy()` and requires adding `-s "deploy(string memory)" "<path_to_config>"` as a `forge script` flag. Any inheriting contract is expected to inherit the `_deploy()` internal function and return a `Deployment[]` array, containing all deployed contract details.

The `Deployment` struct contains 3 fields:
* `name`: the name of the contract published
* `address`: the address to which the contract was published
* `envToUpdate`: the environment variable in the config file to update if relevant.
    * Leave this as an empty string if deploying an instance of a contract that doesn't need to be tracked long-term.

If you need to do something with an EOA other than deploy, the base `ConfigParser` provided by `zeus-templates` is the appropriate base contract.

### MultisigBuilder

`MultisigBuilder` is the base class for any action to be taken by a Safe Multisig. The entry function is `execute()` and requires adding `-s "execute(string memory)" "<path_to_config>"` as a `forge script` flag. Any inheriting contract is expected to inherit the `_execute()` internal function and return a `MultisigCall[]` object, containing all intended multisig calls.

The `MultisigCall` struct contains 3 fields:
* `to`: the address to call with the multisig
* `value`: the amount of ETH to send as part of the transaction.
* `data`: the calldata associated with the multisig call.

Once the `_execute()` function is implemented, the base MultisigBuilder contract will combine these calls into one `SafeTx` object, which is intended to pass all calls into the [MultiSendCallOnly](https://github.com/safe-global/safe-smart-account/blob/6fde75d29c8b52d5ac0c93a6fb7631d434b64119/contracts/libraries/MultiSendCallOnly.sol) contract.

## Setting up a Release Directory

### Naming

Every file must be named either `#-eoa.s.sol` or `#-multisig.s.sol`, where `#` represents the script's order in the release process and the choice of `(eoa|multisig)` represents the relevant signing strategy.

## Example: How to write a Deploy-Queue-Upgrade

Before diving into how to do this, a quick context blurb for those unfamiliar. If you are familiar, feel free to jump to the next subsection, [Deploy](#deploy).

### Context

A deploy-queue-execute flow is common given EigenLayer's [multisig governance](https://docs.eigenlayer.xyz/eigenlayer/security/multisig-governance) structure. For context, the Executor Multisig (a 1-of-2 multisig) owns many critical privileges on EigenLayer, such as the ability to upgrade core contracts. An EigenLayer upgrade will often originate from the Operations Multisig, controlled by Eigen Labs, which is 1 of the 2 signers. Well, in spirit at least.

Technically, there is an intermediate contract between the Ops Multisig and Executor known as the Timelock into which actions must be queued for a waiting period (~10 days). After the delay, the Operations Multsig must then poke the Timelock to forward the transaction to the Executor, which will finally take action.

### Deploy

Deploy scripts are expected to inherit the `EOADeployer` script and produce a `Deployment[]` array containing all deployed contract names, addresses, and overridden config values.

An example deploy script looks as follows:

```solidity
pragma solidity ^0.8.12;

import "zeus-templates/templates/EOADeployer.sol";

... // imagine imports here

contract DeployEigenPodManager is EOADeployer {

    function _deploy(Addresses memory, Environment memory, Params memory params) internal override returns (Deployment[] memory) {

        vm.startBroadcast();

        address newEigenPodManager = new EigenPodManager(
            ... // imagine params here
        );

        _deployments.push(Deployment({
            name: type(EigenPodManager).name,
            deployedTo: newEigenPodManager,
            envToUpdate: "eigenPodManager.pendingImpl"
        }));

        vm.stopBroadcast();

        return _deployments;
    }
}
```

Here, the script inherits the `EOADeployer` and implements the `_deploy()` function, creating a new `EigenPodManager` with relevant details and requesting for Zeus to set the `pendingImpl` field of the `eigenPodManager` in the config to the given address. It would be pending because a transaction must be issued to upgrade the EigenPodManager to this new implementation.

### Queue

Once the above `eigenPodManager` is deployed, a `queueTransaction` operation must be taken in the Timelock if upgrading via the Ops Multisig. This could look like something below:

```solidity
// SPDX-License-Identifier: BUSL-1.1
pragma solidity ^0.8.12;

import "zeus-templates/templates/OpsTimelockBuilder.sol";

import {ProxyAdmin} from "@openzeppelin/contracts/proxy/transparent/ProxyAdmin.sol";
import {IUpgradeableBeacon} from "script/interfaces/IUpgradeableBeacon.sol";
import "src/contracts/pods/EigenPodManager.sol";

contract QueueEigenPodAndManager is OpsTimelockBuilder {

    using MultisigCallUtils for MultisigCall[];
    using SafeTxUtils for SafeTx;

    MultisigCall[] internal _executorCalls;

    function queue(Addresses memory addrs, Environment memory env, Params memory params) public override returns (MultisigCall[] memory) {

        // construct initialization data for eigenPodManager
        bytes memory eigenPodManagerData = abi.encodeWithSelector(
            EigenPodManager(addrs.eigenPodManager.pendingImpl).initialize.selector,
            ... // imagine initialization data
        );

        // upgrade eigenPodManager
        _executorCalls.append({
            to: addrs.proxyAdmin,
            data: abi.encodeWithSelector(
                ProxyAdmin.upgradeAndCall.selector,
                addrs.eigenPodManager.proxy,
                addrs.eigenPodManager.pendingImpl,
                eigenPodManagerData // initialize impl here
            )
        });

        // upgrade eigenPod beacon implementation
        _executorCalls.append({
            to: addrs.eigenPod.beacon,
            data: abi.encodeWithSelector(
                IUpgradeableBeacon.upgradeTo.selector,
                addrs.eigenPod.pendingImpl
            )
        });

        return _executorCalls;
    }
}
```

After inheriting the `OpsTimelockBuilder` contract (which is an extension of `MultisigBuilder`), we implement the `queue()` function from the perspective of the Executor Multisig. All calls are eventually encoded as a `SafeTx` from the Ops Multisig to the Timelock.

### Upgrade

Once the delay has passed, `executeTransaction` can be called on the timelock with the appropriate calldata. As an example:

```solidity
// SPDX-License-Identifier: BUSL-1.1
pragma solidity ^0.8.12;

import "zeus-templates/templates/OpsTimelockBuilder.sol";

import "src/contracts/pods/EigenPodManager.sol";

import "./2-multisig.s.sol"; // using previous script to avoid rewriting

contract ExecuteEigenPodManager is MultisigBuilder {

    using MultisigCallUtils for MultisigCall[];
    using SafeTxUtils for *;

    function _execute(Addresses memory addrs, Environment memory env, Params memory params) internal override returns (MultisigCall[] memory) {

        QueueEigenPodManager queue = new QueueEigenPodManager();

        MultisigCall[] memory _executorCalls = queue.queue(addrs, env, params);

        // steals logic from queue() to perform execute()
        // likely the first step of any _execute() after a _queue()
        bytes memory executorCalldata = queue.makeExecutorCalldata(
            _executorCalls,
            params.multiSendCallOnly,
            addrs.timelock
        );

        // execute queued transaction upgrading eigenPodManager
        _multisigCalls.append({
            to: addrs.timelock,
            value: 0,
            data: abi.encodeWithSelector(
                ITimelock.executeTransaction.selector,
                executorCalldata
            )
        });

        return _multisigCalls;
    }
}
```

After reusing the previous script's `queue()` function to recreate the calldata, we wrap it up in an `executeTransaction` encoded data blob and return the `MultisigCall`, which will then be crafted as a `SafeTx` by the parent contract.
````

## File: script/releases/TestUtils.sol
````
// SPDX-License-Identifier: BUSL-1.1
⋮----
import "./Env.sol";
import "forge-std/Vm.sol";
import "src/contracts/mixins/SplitContractMixin.sol";
⋮----
/// @notice Utility library for testing contract deployments
/// @dev This library exposes the following test functions:
/// @dev - validateProxyAdmins/validateDestinationProxyAdmins - Check that proxy admins are correctly set.
/// @dev - validateProxyConstructors/validateDestinationProxyConstructors - Check that proxy constructors are correctly set.
/// @dev - validateProxiesAlreadyInitialized/validateDestinationProxiesAlreadyInitialized - Check that proxies are already initialized.
/// @dev - validateProxyStorage/validateDestinationProxyStorage - Check that proxy storage is correctly set.
/// @dev - validateImplConstructors/validateDestinationImplConstructors - Check that implementation constructors are correctly set.
/// @dev - validateImplsNotInitializable/validateDestinationImplsNotInitializable - Check that implementation cannot be initialized.
/// @dev - validateImplAddressesMatchProxy/validateDestinationImplAddressesMatchProxy - Check that implementation addresses match the proxy admin's reported implementation address.
/// @dev - validateProtocolRegistry/validateDestinationProtocolRegistry - Check that the protocol version is correctly set.
⋮----
///
///                         PROXY ADMIN VALIDATION
⋮----
/// @dev This function is run on *all* deployed contracts to ensure that the proxyAdmin is correctly set.
function validateProxyAdmins() internal view {
⋮----
/// pemissions/
⋮----
/// core/
⋮----
// Protocol registry tested in the `validateDestinationProxyAdmins` function
⋮----
/// pods/
⋮----
/// strategies/
⋮----
/// multichain/
⋮----
function validateDestinationProxyAdmins() internal view {
⋮----
/// avs/
⋮----
///                         PROXY VALIDATION
⋮----
/// @dev Validate that the proxy constructors are correctly set
function validateProxyConstructors() internal view {
⋮----
// PermissionController has no constructor
⋮----
// ProtocolRegistry has no constructor
⋮----
// EigenPod beacon doesn't have immutable, only implementation does
⋮----
// StrategyBase beacon doesn't have immutables, only implementation does
⋮----
function validateDestinationProxyConstructors() internal view {
⋮----
/// @dev Validate that the proxies are already initialized.
function validateProxiesAlreadyInitialized() internal {
⋮----
// KeyRegistrar and PermissionController are initializable, but do not expose the `initialize` function.
⋮----
// Protocol registry tested in the `validateDestinationProxiesAlreadyInitialized` function
// ReleaseManager is initializable, but does not expose the `initialize` function.
⋮----
// EigenPod proxies are initialized by individual users
⋮----
// StrategyBase proxies are initialized when deployed by factory
⋮----
function validateDestinationProxiesAlreadyInitialized() internal {
⋮----
// BN254 and ECDSA certificate verifiers are initializable, but do not expose the `initialize` function.
⋮----
function validateProxyStorage() internal view {
⋮----
/// permissions/
⋮----
// PauserRegistry is also deployed on destination chain and tested in the `validateDestinationProxyStorage` function
// PermissionController and KeyRegistrar have no initial storage
⋮----
// Protocol registry tested in the `validateDestinationProxyStorage` function
⋮----
// ReleaseManager has no initial storage
⋮----
//assertTrue(rewards.paused() == 2, "rc.paused invalid");
⋮----
// Operator table updater and certificate verifies do not have initial storage
⋮----
// For hoodi, the paused status is 31 (all flags set)
⋮----
function validateDestinationProxyStorage() internal view {
⋮----
// PauserRegistry is also deployed on destination chain
⋮----
// Reset of params are dependent on per chain state (eg. generator state)
⋮----
///                        IMPLEMENTATION VALIDATION
⋮----
/// @dev Validate that the implementation constructors are correctly set
function validateImplConstructors() internal view {
⋮----
function validateDestinationImplConstructors() internal view {
⋮----
/// @dev Validate that the implementation contracts are not initializable.
/// @dev Each function checks that initializing the contract will revert.
function validateImplsNotInitializable() internal {
⋮----
// AllocationManagerView is initializable, but does not expose the `initialize` function.
⋮----
// Protocol registry tested in the `validateDestinationImplsNotInitializable` function
⋮----
// EigenPod implementations are initialized by individual users
⋮----
// StrategyBase implementations are initialized when deployed by factory
⋮----
function validateDestinationImplsNotInitializable() internal {
⋮----
/// @notice After the upgrade is complete, call to _validateNewImplAddresses to ensure the impl addresses match the proxy admin's reported implementation address.
function validateImplAddressesMatchProxy() internal view {
⋮----
// Protocol registry tested in the `validateDestinationImplAddressesMatchProxy` function
⋮----
function validateDestinationImplAddressesMatchProxy() internal view {
⋮----
/// @dev Skip the protocol registry validation as it will be deployed while the upgrade is in progress.
/// TODO: Uncomment this after v1.9.0 is live
// assertTrue(
//     _getProxyImpl(address(Env.proxy.protocolRegistry())) == address(Env.impl.protocolRegistry()),
//     "protocolRegistry impl address mismatch"
// );
⋮----
///                        VERSION VALIDATION FUNCTIONS
⋮----
/// Validate versions of specific contracts
/// @dev We need to validate versions of specific contracts because some contracts can have mismatched versions.
function validateKeyRegistrarVersion() internal view {
⋮----
function validateAVSDirectoryVersion() internal view {
⋮----
function validateDelegationManagerVersion() internal view {
⋮----
function validateStrategyManagerVersion() internal view {
⋮----
function validateECDSACertificateVerifierVersion() internal view {
⋮----
///                         VALIDATE IMMUTABLES
⋮----
/// @dev These functions are used to validate the immutables of either proxy or implementation contracts.
⋮----
function validateKeyRegistrarImmutables(
⋮----
// PermissionController has no immutables
⋮----
function validateAllocationManagerViewImmutables(
⋮----
// TODO: Uncomment after this method exists.
⋮----
//     allocationManagerView.SLASHER_CONFIGURATION_DELAY() == Env.ALLOCATION_CONFIGURATION_DELAY(),
//     "allocationManagerView SLASHER_CONFIGURATION_DELAY incorrect"
⋮----
function validateAllocationManagerImmutables(
⋮----
//     allocationManager.SLASHER_CONFIGURATION_DELAY() == Env.ALLOCATION_CONFIGURATION_DELAY(),
//     "allocationManager SLASHER_CONFIGURATION_DELAY incorrect"
⋮----
function validateAVSDirectoryImmutables(
⋮----
function validateDelegationManagerImmutables(
⋮----
function validateReleaseManagerImmutables(
⋮----
function validateRewardsCoordinatorImmutables(
⋮----
function validateEmissionsControllerImmutables(
⋮----
function validateStrategyManagerImmutables(
⋮----
function validateEigenPodImmutables(
⋮----
function validateEigenPodManagerImmutables(
⋮----
function validateEigenStrategyImmutables(
⋮----
function validateStrategyBaseImmutables(
⋮----
function validateStrategyBaseTVLLimitsImmutables(
⋮----
function validateStrategyFactoryImmutables(
⋮----
function validateDurationVaultStrategyImmutables(
⋮----
function validateBN254CertificateVerifierImmutables(
⋮----
function validateCrossChainRegistryImmutables(
⋮----
function validateECDSACertificateVerifierImmutables(
⋮----
function validateOperatorTableUpdaterImmutables(
⋮----
function validateTaskMailboxImmutables(
⋮----
///                         VALIDATE INITIALIZED
⋮----
/// @dev These functions are used to validate the initialized state of either proxy or implementation contracts.
⋮----
function validateAllocationManagerInitialized(
⋮----
function validateAVSDirectoryInitialized(
⋮----
function validateDelegationManagerInitialized(
⋮----
function validateProtocolRegistryInitialized(
⋮----
function validateRewardsCoordinatorInitialized(
⋮----
function validateStrategyManagerInitialized(
⋮----
function validateEigenPodManagerInitialized(
⋮----
function validateEigenStrategyInitialized(
⋮----
function validateStrategyBaseTVLLimitsInitialized(
⋮----
function validateStrategyFactoryInitialized(
⋮----
function validateCrossChainRegistryInitialized(
⋮----
function validateOperatorTableUpdaterInitialized(
⋮----
function validateTaskMailboxInitialized(
⋮----
function validateEmissionsControllerInitialized(
⋮----
function validateRewardsCoordinatorConstructor(
⋮----
// Validate constructor immutables are correctly set
⋮----
///                         VALIDATE PROTOCOL REGISTRY
⋮----
/// @notice Validate the protocol registry by checking the version and all contracts
/// @dev This should be called *after* an upgrade has been completed
function validateProtocolRegistry() internal {
// Version is checked in the `validateDestinationProtocolRegistry` function
⋮----
// Check the deployments
⋮----
// Protocol registry tested in the `validateDestinationProtocolRegistry` function
⋮----
/// token/
⋮----
function validateDestinationProtocolRegistry() internal {
/// First, check the version of the registry
⋮----
// Then, check the deployments
⋮----
// Lastly, attempt to call pauseAll on the protocol registry
⋮----
///                         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 {
⋮----
/// @notice Validates DurationVaultStrategy factory beacon reference
function validateDurationVaultStrategyStorage() internal view {
⋮----
/// @notice Validates DurationVaultStrategy implementation immutables
function validateDurationVaultStrategyImplConstructors() internal view {
⋮----
/// @notice Validates DurationVaultStrategy beacon points to correct implementation
function validateDurationVaultStrategyImplAddressesMatchProxy() internal view {
⋮----
/// @notice Validates DurationVaultStrategy in protocol registry
function validateDurationVaultStrategyProtocolRegistry() internal view {
⋮----
/// @dev Query and return `proxyAdmin.getProxyImplementation(proxy)`
function _getProxyImpl(
⋮----
/// @dev Query and return `proxyAdmin.getProxyAdmin(proxy)`
function _getProxyAdmin(
⋮----
function _strEq(
⋮----
function assertTrue(
⋮----
function assertFalse(
````

## File: script/tasks/allocate_operatorSet.s.sol
````
// SPDX-License-Identifier: BUSL-1.1
⋮----
import "../../src/contracts/core/AVSDirectory.sol";
import "../../src/contracts/core/AllocationManager.sol";
⋮----
import "forge-std/Script.sol";
import "forge-std/Test.sol";
⋮----
// use forge:
// RUST_LOG=forge,foundry=trace forge script script/tasks/allocate_operatorSet.s.sol --rpc-url $RPC_URL --private-key $PRIVATE_KEY --broadcast --sig "run(string memory configFile,address strategy,address avs,uint32 operatorSetId,uint64 magnitude)" -- <DEPLOYMENT_OUTPUT_JSON> <STRATEGY_ADDRESS> <AVS_ADDRESS> <OPERATOR_SET_ID> <MAGNITUDE>
// RUST_LOG=forge,foundry=trace forge script script/tasks/allocate_operatorSet.s.sol --rpc-url $RPC_URL --private-key $PRIVATE_KEY --broadcast --sig "run(string memory configFile,address strategy,address avs,uint32 operatorSetId,uint64 magnitude)" -- local/slashing_output.json 0x8aCd85898458400f7Db866d53FCFF6f0D49741FF 0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266 00000001 0500000000000000000
contract AllocateOperatorSet is Script, Test {
⋮----
function run(
⋮----
// Load config
⋮----
// Pull allocationManager address
⋮----
// START RECORDING TRANSACTIONS FOR DEPLOYMENT
⋮----
// Attach to the AllocationManager
⋮----
// Correct array initialization
⋮----
// Set OperatorSets
⋮----
// Set new mangitudes
⋮----
// Define a single MagnitudeAllocation and wrap it in an array
⋮----
// Perform allocation
⋮----
// STOP RECORDING TRANSACTIONS FOR DEPLOYMENT
````

## File: script/tasks/complete_withdrawal_from_strategy.s.sol
````
// SPDX-License-Identifier: BUSL-1.1
⋮----
import "../../src/contracts/core/AllocationManager.sol";
import "../../src/contracts/core/DelegationManager.sol";
import "../../src/contracts/pods/EigenPodManager.sol";
import "../../src/contracts/libraries/SlashingLib.sol";
⋮----
import "forge-std/Script.sol";
import "forge-std/Test.sol";
⋮----
// use forge:
// RUST_LOG=forge,foundry=trace forge script script/tasks/complete_withdrawal_from_strategy.s.sol --rpc-url $RPC_URL --private-key $PRIVATE_KEY --broadcast --sig "run(string memory configFile,,address strategy,address token,uint256 amount)" -- <DEPLOYMENT_OUTPUT_JSON> <STRATEGY_ADDRESS> <TOKEN_ADDRESS> <AMOUNT> <NONCE> <START_BLOCK_NUMBER>
// RUST_LOG=forge,foundry=trace forge script script/tasks/complete_withdrawal_from_strategy.s.sol --rpc-url $RPC_URL --private-key $PRIVATE_KEY --broadcast --sig "run(string memory configFile,,address strategy,address token,uint256 amount,uint256 nonce,uint32 startBlock)" -- local/slashing_output.json 0x8aCd85898458400f7Db866d53FCFF6f0D49741FF 0x67d269191c92Caf3cD7723F116c85e6E9bf55933 750 0 630
contract CompleteWithdrawFromStrategy is Script, Test {
⋮----
function run(
⋮----
// Load config
⋮----
// Pull addresses from config
⋮----
// START RECORDING TRANSACTIONS FOR DEPLOYMENT
⋮----
// Add token to array
⋮----
// Get the withdrawal struct
⋮----
// complete
⋮----
// STOP RECORDING TRANSACTIONS FOR DEPLOYMENT
⋮----
function getWithdrawalStruct(
⋮----
// Add strategy to array
⋮----
// Add shares to array
⋮----
// Get DSF for Staker in strategy
⋮----
// Get TM for Operator in strategies
⋮----
// Get scaled shares for the given amount
⋮----
// Log the current state before completing
⋮----
// Create the withdrawal struct
⋮----
// Return the withdrawal struct
⋮----
function _getSlashingFactor(
````

## File: script/tasks/deposit_into_strategy.s.sol
````
// SPDX-License-Identifier: BUSL-1.1
⋮----
import "../../src/contracts/core/StrategyManager.sol";
⋮----
import "forge-std/Script.sol";
import "forge-std/Test.sol";
⋮----
// use cast:
//
// cast send <TOKEN_ADDRESS> "approve(address,uint256)" \
// <STRATEGY_MANAGER_ADDRESS> \
// <AMOUNT> \
// --private-key <YOUR_PRIVATE_KEY>
⋮----
// cast send <STRATEGY_MANAGER_ADDRESS> "depositIntoStrategy(address,address,uint256)" \
// <STRATEGY_ADDRESS> \
// <TOKEN_ADDRESS> \
⋮----
// use forge:
// RUST_LOG=forge,foundry=trace forge script script/tasks/deposit_into_strategy.s.sol --rpc-url $RPC_URL --private-key $PRIVATE_KEY --broadcast --sig "run(string memory configFile,address strategy,address token,uint256 amount)" -- <DEPLOYMENT_OUTPUT_JSON> <STRATEGY_ADDRESS> <TOKEN_ADDRESS> <AMOUNT>
// RUST_LOG=forge,foundry=trace forge script script/tasks/deposit_into_strategy.s.sol --rpc-url $RPC_URL --private-key $PRIVATE_KEY --broadcast --sig "run(string memory configFile,address strategy,address token,uint256 amount)" -- local/slashing_output.json 0x8aCd85898458400f7Db866d53FCFF6f0D49741FF 0x67d269191c92Caf3cD7723F116c85e6E9bf55933 $DEPOSIT_SHARES
contract DepositIntoStrategy is Script, Test {
⋮----
function run(
⋮----
// Load config
⋮----
// Pull strategy manager address
⋮----
// START RECORDING TRANSACTIONS FOR DEPLOYMENT
⋮----
// approve spend
⋮----
// do deposit
````

## File: script/tasks/README.md
````markdown
# Setup slashing locally

These tasks deploy the `slashing-magnitudes` contracts and set up the sender (`address(PRIVATE_KEY)`) as an `AVS`, `Operator` and `Staker`. 

We then register the `Operator` to an `OperatorSet`, allocate the `Strategy` in that `OperatorSet` and perform a `slashing`.

---

1. Start `anvil` in one terminal
```sh
anvil
```

2. Run the full setup in another terminal
```sh
./run.sh
```

OR

2. Deploy contracts in another terminal (this will save addresses to [../output/local/slashing_output.json](../output/local/slashing_output.json))
```sh
export RPC_URL=127.0.0.1:8545
export PRIVATE_KEY=0xac0974bec39a17e36ba4a6b4d238ff944bacb478cbed5efcae784d7bf4f2ff80
export SENDER=$(cast wallet address --private-key $PRIVATE_KEY)

mkdir ./script/output/local
forge script -C src/contracts --via-ir ../deploy/local/deploy_from_scratch.slashing.s.sol \
    --rpc-url $RPC_URL --private-key $PRIVATE_KEY --broadcast \
    --sig "run(string memory configFile)" \
    -- local/deploy_from_scratch.slashing.anvil.config.json
```

3. Build the task scripts
```sh
forge build -C script/tasks
```

4. Extract `DELEGATION_MANAGER`, `STRATEGY_MANAGER`, `STRATEGY` and `TOKEN` addresses from deployment output
```sh
export DELEGATION_MANAGER=$(jq -r '.addresses.delegationManager' "../output/local/slashing_output.json")
export STRATEGY_MANAGER=$(jq -r '.addresses.strategyManager' "../output/local/slashing_output.json")
export STRATEGY=$(jq -r '.addresses.strategy' "../output/local/slashing_output.json")
export TOKEN=$(jq -r '.addresses.TestToken' "../output/local/slashing_output.json")
```

5. Unpause the `avsDirectory`
```sh
forge script ../tasks/unpause_avsDirectory.s.sol \
    --rpc-url $RPC_URL --private-key $PRIVATE_KEY --broadcast \
    --sig "run(string memory configFile)" \
    -- local/slashing_output.json
```

6. Deposit into `Strategy`
```sh
forge script ../tasks/deposit_into_strategy.s.sol \
    --rpc-url $RPC_URL --private-key $PRIVATE_KEY --broadcast \
    --sig "run(string memory configFile,address strategy,address token,uint256 amount)" \
    -- local/slashing_output.json $STRATEGY $TOKEN 1000
```

7. Register as `Operator`
```sh
forge script ../tasks/register_as_operator.s.sol \
    --rpc-url $RPC_URL --private-key $PRIVATE_KEY --broadcast \
    --sig "run(string memory configFile,address operator,string metadataURI)" \
    -- local/slashing_output.json $SENDER "metadataURI"
```

8. Register `Operator` to `OperatorSet`
```sh
forge script ../tasks/register_operator_to_operatorSet.s.sol \
    --tc RegisterOperatorToOperatorSets \
    --rpc-url $RPC_URL --private-key $PRIVATE_KEY --broadcast \
    --sig "run(string memory configFile)" \
    -- local/slashing_output.json
```

9. Move the chain by **600** blocks (to move beyond `pendingDelay`)
```
cast rpc anvil_mine 600 --rpc-url $RPC_URL
```

10. Allocate the `OperatorSet` **(50%)**
```sh
forge script ../tasks/allocate_operatorSet.s.sol \
    --rpc-url $RPC_URL --private-key $PRIVATE_KEY --broadcast \
    --sig "run(string memory configFile,address strategy,address avs,uint32 operatorSetId,uint64 magnitude)" \
    -- local/slashing_output.json $STRATEGY $SENDER 00000001 0500000000000000000
```

11. Slash the `OperatorSet` **(50%)** - we expect that 25% of our shares will be slashed when we withdraw them
```sh
forge script ../tasks/slash_operatorSet.s.sol \
    --rpc-url $RPC_URL --private-key $PRIVATE_KEY --broadcast \
    --sig "run(string memory configFile,address operator,uint32 operatorSetId,uint256 wadToSlash)" \
    -- local/slashing_output.json $SENDER 00000001 0500000000000000000
```

12. Verify that the sender holds **1000** Deposited `TOKEN` shares:
```sh
cast call $STRATEGY_MANAGER "getDeposits(address)(address[],uint256[])" $SENDER  --rpc-url $RPC_URL
```

13. Verify that the sender holds **750** Withdrawable `TOKEN` shares:
```sh
cast call $DELEGATION_MANAGER "getWithdrawableShares(address,address[])(uint256[])" $SENDER "[$STRATEGY]" --rpc-url $RPC_URL
```

14. Withdraw slashed shares from `DelegationManager`

- Extract Nonce and available shares from $DELEGATION_MANAGER
```sh
export DEPOSITS=$(cast call $DELEGATION_MANAGER "getDepositedShares(address)(address[],uint256[])" $SENDER "[$STRATEGY]" --rpc-url $RPC_URL | sed -n '2p' | tr -d '[]')
export SHARES=$(cast call $DELEGATION_MANAGER "getWithdrawableShares(address,address[])(uint256[],uint256[])" $SENDER "[$STRATEGY]" --rpc-url $RPC_URL | sed -n '1p' | tr -d '[]')
export NONCE=$(cast call $DELEGATION_MANAGER "cumulativeWithdrawalsQueued(address)(uint256)" $SENDER --rpc-url $RPC_URL)
```

- Queue withdrawal
```sh
forge script ../tasks/withdraw_from_strategy.s.sol \
    --rpc-url $RPC_URL --private-key $PRIVATE_KEY --broadcast \
    --sig "run(string memory configFile,address strategy,address token,uint256 amount)" \
    -- local/slashing_output.json $STRATEGY $TOKEN $DEPOSITS
```

- Record the withdrawal `START_BLOCK`
```sh
export WITHDRAWAL_START_BLOCK_NUMBER=$(cast block-number --rpc-url $RPC_URL)
```

- Move the chain by 5 blocks (to move beyond `MIN_WITHDRAWAL_DELAY_BLOCKS` (5))
```sh
cast rpc anvil_mine 5 --rpc-url $RPC_URL
```

- Complete withdrawal

```sh
forge script ../tasks/complete_withdrawal_from_strategy.s.sol \
    --rpc-url $RPC_URL --private-key $PRIVATE_KEY --broadcast \
    --sig "run(string memory configFile,address strategy,address token,uint256 amount,uint256 nonce,uint32 startBlock)" \
    -- local/slashing_output.json $STRATEGY $TOKEN $SHARES $NONCE $WITHDRAWAL_START_BLOCK_NUMBER
```

15. Verify that the `SHARES` we're withdrawn back to the sender
```sh
cast call $TOKEN "balanceOf(address)(uint256)" $SENDER --rpc-url $RPC_URL
```

16. Verify that the sender holds 0 withdrawable `TOKEN` shares:
```sh
cast call $DELEGATION_MANAGER "getWithdrawableShares(address,address[])(uint256[])" $SENDER "[$STRATEGY]" --rpc-url $RPC_URL
```
````

## File: script/tasks/register_as_operator.s.sol
````
// SPDX-License-Identifier: BUSL-1.1
⋮----
import "../../src/contracts/core/DelegationManager.sol";
⋮----
import "forge-std/Script.sol";
import "forge-std/Test.sol";
⋮----
// use cast:
// cast send <DELEGATION_MANAGER_ADDRESS> "registerAsOperator((address,address,uint32),uint256,string)" \
// "(address(0), <OPERATOR_ADDRESS>, 0)" \
// 0 \
// "<METADATA_URI>" \
// --private-key <YOUR_PRIVATE_KEY>
⋮----
// use forge:
// RUST_LOG=forge,foundry=trace forge script script/tasks/register_as_operator.s.sol --rpc-url $RPC_URL --private-key $PRIVATE_KEY --broadcast --sig "run(string memory configFile,address operator,string memory metadataURI)" -- <DEPLOYMENT_OUTPUT_JSON> <OPERATOR_ADDRESS> <METADATA_URI>
// RUST_LOG=forge,foundry=trace forge script script/tasks/register_as_operator.s.sol --rpc-url $RPC_URL --private-key $PRIVATE_KEY --broadcast --sig "run(string memory configFile,address operator,string metadataURI)" -- local/slashing_output.json 0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266 "test"
contract RegisterAsOperator is Script, Test {
⋮----
function run(
⋮----
// Load config
⋮----
// Pull delegation manager address
⋮----
// START RECORDING TRANSACTIONS FOR DEPLOYMENT
⋮----
// Attach the delegationManager
⋮----
// Register the sender as an Operator
⋮----
// STOP RECORDING TRANSACTIONS FOR DEPLOYMENT
````

## File: script/tasks/register_operator_to_operatorSet.s.sol
````
// SPDX-License-Identifier: BUSL-1.1
⋮----
import "../../src/contracts/core/AVSDirectory.sol";
import "../../src/contracts/interfaces/IAVSDirectory.sol";
import "../../src/contracts/core/AllocationManager.sol";
import "../../src/contracts/interfaces/IAllocationManager.sol";
⋮----
import "forge-std/Script.sol";
import "forge-std/Test.sol";
⋮----
// Define dummy AVSRegistrar contract to prevent revert
contract AVSRegistrar is IAVSRegistrar {
function registerOperator(
⋮----
function deregisterOperator(
⋮----
function supportsAVS(
address /*avs*/
⋮----
// use forge:
// RUST_LOG=forge,foundry=trace forge script script/tasks/register_operator_to_operatorSet.s.sol --rpc-url $RPC_URL --private-key $PRIVATE_KEY --broadcast --sig "run(string memory configFile)" -- <DEPLOYMENT_OUTPUT_JSON>
// RUST_LOG=forge,foundry=trace forge script script/tasks/register_operator_to_operatorSet.s.sol --rpc-url $RPC_URL --private-key $PRIVATE_KEY --broadcast --sig "run(string memory configFile)" -- local/slashing_output.json
contract RegisterOperatorToOperatorSets is Script, Test {
⋮----
function run(
⋮----
// Load config
⋮----
// Pull avs directory address
⋮----
// START RECORDING TRANSACTIONS FOR DEPLOYMENT
⋮----
// Attach to the deployed contracts
⋮----
// Use privateKey to register as an operator
⋮----
// Sign as Operator
⋮----
// Add strategies to array
⋮----
// Create OperatorSet(s)
⋮----
// Register the Operator to the AVS
⋮----
// Deploy and set registrar.
⋮----
// Register OperatorSet(s)
⋮----
// STOP RECORDING TRANSACTIONS FOR DEPLOYMENT
````

## File: script/tasks/run.sh
````bash
#!/bin/bash

# These tasks deploy the `slashing-magnitudes` contracts and set up the sender (`address(PRIVATE_KEY)`) as an `AVS`, `Operator` and `Staker`. 
# We then register the `Operator` to an `OperatorSet`, allocate the `strategy` in that `OperatorSet`, deposit `TestTokens` and perform a `slashing`.

# Environment Configuration
RPC_URL="127.0.0.1:8545"
PRIVATE_KEY="0xac0974bec39a17e36ba4a6b4d238ff944bacb478cbed5efcae784d7bf4f2ff80"
SENDER=$(cast wallet address --private-key $PRIVATE_KEY)
OUTPUT_DIR="../output/local"

# Define amount of shares to deposit/withdraw
DEPOSIT_SHARES=1000

# Ensure output directory exists
mkdir -p $OUTPUT_DIR

# Deploy contracts
forge script -C src/contracts --via-ir ../deploy/local/deploy_from_scratch.slashing.s.sol \
    --rpc-url $RPC_URL --private-key $PRIVATE_KEY --broadcast \
    --sig "run(string memory configFile)" \
    -- local/deploy_from_scratch.slashing.anvil.config.json

# Compile task contracts
forge build -C script/tasks

# Extract contract addresses from deployment output
DELEGATION_MANAGER=$(jq -r '.addresses.delegationManager' "$OUTPUT_DIR/slashing_output.json")
STRATEGY=$(jq -r '.addresses.strategy' "$OUTPUT_DIR/slashing_output.json")
TOKEN=$(jq -r '.addresses.TestToken' "$OUTPUT_DIR/slashing_output.json")
BALANCE=$(cast call $TOKEN "balanceOf(address)(uint256)" $SENDER --rpc-url $RPC_URL)

# Unpause the AVS Directory
forge script ../tasks/unpause_avsDirectory.s.sol \
    --rpc-url $RPC_URL --private-key $PRIVATE_KEY --broadcast \
    --sig "run(string memory configFile)" \
    -- local/slashing_output.json

# Deposit shares into strategy
forge script ../tasks/deposit_into_strategy.s.sol \
    --rpc-url $RPC_URL --private-key $PRIVATE_KEY --broadcast \
    --sig "run(string memory configFile,address strategy,address token,uint256 amount)" \
    -- local/slashing_output.json $STRATEGY $TOKEN $DEPOSIT_SHARES

# Register as Operator
forge script ../tasks/register_as_operator.s.sol \
    --rpc-url $RPC_URL --private-key $PRIVATE_KEY --broadcast \
    --sig "run(string memory configFile,address operator,string metadataURI)" \
    -- local/slashing_output.json $SENDER "metadataURI"

# Register Operator to OperatorSet
forge script ../tasks/register_operator_to_operatorSet.s.sol \
    --rpc-url $RPC_URL --private-key $PRIVATE_KEY --broadcast \
    --tc RegisterOperatorToOperatorSets \
    --sig "run(string memory configFile)" \
    -- local/slashing_output.json

# Advance the blockchain by 600 blocks to pass pending delay
cast rpc anvil_mine 600 --rpc-url $RPC_URL

# Allocate OperatorSet (50% allocation)
forge script ../tasks/allocate_operatorSet.s.sol \
    --rpc-url $RPC_URL --private-key $PRIVATE_KEY --broadcast \
    --sig "run(string memory configFile,address strategy,address avs,uint32 operatorSetId,uint64 magnitude)" \
    -- local/slashing_output.json $STRATEGY $SENDER 00000001 0500000000000000000

# Slash the OperatorSet (50%)
forge script ../tasks/slash_operatorSet.s.sol \
    --rpc-url $RPC_URL --private-key $PRIVATE_KEY --broadcast \
    --sig "run(string memory configFile,address operator,uint32 operatorSetId,uint256 wadToSlash)" \
    -- local/slashing_output.json $SENDER 00000001 0500000000000000000

# Deposit more shares into strategy
forge script ../tasks/deposit_into_strategy.s.sol \
    --rpc-url $RPC_URL --private-key $PRIVATE_KEY --broadcast \
    --sig "run(string memory configFile,address strategy,address token,uint256 amount)" \
    -- local/slashing_output.json $STRATEGY $TOKEN $DEPOSIT_SHARES

# Fetch current withdrawable shares and nonce
DEPOSITS=$(cast call $DELEGATION_MANAGER "getDepositedShares(address)(address[],uint256[])" $SENDER "[$STRATEGY]" --rpc-url $RPC_URL | sed -n '2p' | tr -d '[]')
SHARES=$(cast call $DELEGATION_MANAGER "getWithdrawableShares(address,address[])(uint256[],uint256[])" $SENDER "[$STRATEGY]" --rpc-url $RPC_URL | sed -n '1p' | tr -d '[]')
NONCE=$(cast call $DELEGATION_MANAGER "cumulativeWithdrawalsQueued(address)(uint256)" $SENDER --rpc-url $RPC_URL)

# Withdraw slashed shares from Delegation Manager
forge script ../tasks/withdraw_from_strategy.s.sol \
    --rpc-url $RPC_URL --private-key $PRIVATE_KEY --broadcast \
    --sig "run(string memory configFile,address strategy,address token,uint256 amount)" \
    -- local/slashing_output.json $STRATEGY $TOKEN $DEPOSITS

# Capture block number after initiating withdrawal
WITHDRAWAL_START_BLOCK_NUMBER=$(cast block-number --rpc-url $RPC_URL)

# Advance the blockchain by 5 blocks to meet `MIN_WITHDRAWAL_DELAY_BLOCKS`
cast rpc anvil_mine 5 --rpc-url $RPC_URL

# Slash the OperatorSet (50%)
forge script ../tasks/slash_operatorSet.s.sol \
    --rpc-url $RPC_URL --private-key $PRIVATE_KEY --broadcast \
    --sig "run(string memory configFile,address operator,uint32 operatorSetId,uint256 wadToSlash)" \
    -- local/slashing_output.json $SENDER 00000001 0500000000000000000

# Complete the withdrawal process
forge script ../tasks/complete_withdrawal_from_strategy.s.sol \
    --rpc-url $RPC_URL --private-key $PRIVATE_KEY --broadcast \
    --sig "run(string memory configFile,address strategy,address token,uint256 amount,uint256 nonce,uint32 startBlock)" \
    -- local/slashing_output.json $STRATEGY $TOKEN $SHARES $NONCE $WITHDRAWAL_START_BLOCK_NUMBER

# Verification
FINAL_SHARES=$(cast call $DELEGATION_MANAGER "getWithdrawableShares(address,address[])(uint256[],uint256[])" $SENDER "[$STRATEGY]" --rpc-url $RPC_URL | sed -n '1p' | tr -d '[]')
FINAL_BALANCE=$(cast call $TOKEN "balanceOf(address)(uint256)" $SENDER --rpc-url $RPC_URL)
BALANCE_AS_DEC=$(echo "$BALANCE" | awk '{print $1}')
FINAL_BALANCE_AS_DEC=$(echo "$FINAL_BALANCE" | awk '{print $1}')
SLASHED_BY_BALANCE=$(bc <<< "$BALANCE_AS_DEC - $FINAL_BALANCE_AS_DEC")

# Print details
echo -e "==========================\n"
echo -e "Addresses saved to: $(realpath $(pwd)/../../script/output/local/slashing_output.json)"
echo -e "\n==========================\n"
echo "Number of tokens held initially: $BALANCE"
echo "Number of shares deposited: $DEPOSITS"
echo "Number of shares after slashing: $SHARES"
echo "Number of shares remaining: $FINAL_SHARES"
echo "Number of tokens held: $FINAL_BALANCE"
echo "Number of tokens slashed: $SLASHED_BY_BALANCE"
echo -e "\n=========================="
````

## File: script/tasks/slash_operatorSet.s.sol
````
// SPDX-License-Identifier: BUSL-1.1
⋮----
import "../../src/contracts/core/AllocationManager.sol";
⋮----
import "forge-std/Script.sol";
import "forge-std/Test.sol";
⋮----
// use forge:
// RUST_LOG=forge,foundry=trace forge script script/tasks/slash_operatorSet.s.sol --rpc-url $RPC_URL --private-key $PRIVATE_KEY --broadcast --sig "run(string memory configFile,address operator,uint32 operatorSetId,uint256 wadToSlash)" -- <DEPLOYMENT_OUTPUT_JSON> <OPERATOR_ADDRESS> <OPERATOR_SET_ID> <WADS_TO_SLASH>
// RUST_LOG=forge,foundry=trace forge script script/tasks/slash_operatorSet.s.sol --rpc-url $RPC_URL --private-key $PRIVATE_KEY --broadcast --sig "run(string memory configFile,address operator,uint32 operatorSetId,uint256 wadToSlash)" -- local/slashing_output.json 0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266 00000001 05000000
contract SlashOperatorSet is Script, Test, IAllocationManagerTypes {
⋮----
function run(
⋮----
// Load config
⋮----
// Pull allocationManager address
⋮----
// START RECORDING TRANSACTIONS FOR DEPLOYMENT
⋮----
// Attach to the AllocationManager
⋮----
// Define SlashingParams struct instance with correct array initialization
⋮----
// Perform slashing
⋮----
// STOP RECORDING TRANSACTIONS FOR DEPLOYMENT
````

## File: script/tasks/unpause_avsDirectory.s.sol
````
// SPDX-License-Identifier: BUSL-1.1
⋮----
import "../../src/contracts/core/AVSDirectory.sol";
⋮----
import "forge-std/Script.sol";
import "forge-std/Test.sol";
⋮----
// use cast:
//
// cast send <TOKEN_ADDRESS> "approve(address,uint256)" \
// <STRATEGY_MANAGER_ADDRESS> \
// <AMOUNT> \
// --private-key <YOUR_PRIVATE_KEY>
⋮----
// cast send <STRATEGY_MANAGER_ADDRESS> "depositIntoStrategy(address,address,uint256)" \
// <STRATEGY_ADDRESS> \
// <TOKEN_ADDRESS> \
⋮----
// use forge:
// RUST_LOG=forge,foundry=trace forge script script/tasks/unpause_avsDirectory.s.sol --rpc-url $RPC_URL --private-key $PRIVATE_KEY --broadcast --sig "run(string memory configFile)" -- <DEPLOYMENT_OUTPUT_JSON>
// RUST_LOG=forge,foundry=trace forge script script/tasks/unpause_avsDirectory.s.sol --rpc-url $RPC_URL --private-key $PRIVATE_KEY --broadcast --sig "run(string memory configFile)" -- local/slashing_output.json
contract UnpauseAVSDirectory is Script, Test {
⋮----
function run(
⋮----
// Load config
⋮----
// Pull avs directory address
⋮----
// START RECORDING TRANSACTIONS FOR DEPLOYMENT
⋮----
// Attach to the AVSDirectory
⋮----
// Unpause the AVSDirectory
⋮----
// STOP RECORDING TRANSACTIONS FOR DEPLOYMENT
````

## File: script/tasks/withdraw_from_strategy.s.sol
````
// SPDX-License-Identifier: BUSL-1.1
⋮----
import "../../src/contracts/core/AllocationManager.sol";
import "../../src/contracts/core/DelegationManager.sol";
import "../../src/contracts/libraries/SlashingLib.sol";
⋮----
import "forge-std/Script.sol";
import "forge-std/Test.sol";
⋮----
// use forge:
// RUST_LOG=forge,foundry=trace forge script script/tasks/withdraw_from_strategy.s.sol --rpc-url $RPC_URL --private-key $PRIVATE_KEY --broadcast --sig "run(string memory configFile,address strategy,address token,uint256 amount)" -- <DEPLOYMENT_OUTPUT_JSON> <STRATEGY_ADDRESS> <TOKEN_ADDRESS> <AMOUNT>
// RUST_LOG=forge,foundry=trace forge script script/tasks/withdraw_from_strategy.s.sol --rpc-url $RPC_URL --private-key $PRIVATE_KEY --broadcast --sig "run(string memory configFile,address strategy,address token,uint256 amount)" -- local/slashing_output.json 0x8aCd85898458400f7Db866d53FCFF6f0D49741FF 0x67d269191c92Caf3cD7723F116c85e6E9bf55933 750
contract WithdrawFromStrategy is Script, Test {
⋮----
function run(
⋮----
// Load config
⋮----
// Pull addresses from config
// address allocationManager = stdJson.readAddress(config_data, ".addresses.allocationManager");
⋮----
// START RECORDING TRANSACTIONS FOR DEPLOYMENT
⋮----
// Attach to DelegationManager
// AllocationManager am = AllocationManager(allocationManager);
⋮----
// Add strategy to array
⋮----
// Add shares to array
⋮----
// Add token to array
⋮----
// Get the current withdrawal nonce for sender
⋮----
// Define QueuedWithdrawalParams struct instance
⋮----
// Withdrawal roots will be returned when we queue
⋮----
// Log the details we need to reproduce the WithdrawalRoot
⋮----
// Queue withdrawal
⋮----
// Log the withdrawalRoot
⋮----
// STOP RECORDING TRANSACTIONS FOR DEPLOYMENT
````

## File: script/utils/validateStorage/README.md
````markdown
# Storage Validation Scripts
This script uses cast and forge inspect to get the layouts of the local and on-chain contract. Your `ETHERSCAN_API_KEY` must be set as an environment variable. The storage layouts are saved into csv files and passed into the typescript helper validateStorage.ts, which takes paths to two csv layouts and validates the storage slots.

## Run validation
To validate the storage of an upgradeable deployed contract against a local one, run the script:
```bash
bash script/upgrade/validateUpgrade.sh -n <network> -c <contract> -a <implementation address>
```

The supported networks are `mainnet`. The supported contracts are `strategyManager`, `delegation`, `eigenPod`, `eigenPodManager`, and `slasher`.

The above script generates two csv files, `localLayout.csv` and `onChainLayout.csv`. To keep these csv files after validating storage, add a `-k` flag to the above command

Additionally, one can validate the storage of two csv files outputted by the `forge inspect` command by running 

```js
npx ts-node script/upgrade/validateStorage.ts --old <path_to_old_layout_csv> --new <path_to_new_layout_csv> --keep
```

## Limitations
Storage slot validation is NOT comprehensive, and errs on the side of caution. We recommend using this script as a tool along with manual storage slot verification. The validation is opinionated on storage for each contract consuming 50 slots and gaps being sized accordingly.

The script does not validate legal type changes (i.e. from bool to uint8) and errors out if the types of slots have updated, including having different struct names. A manual check will need to be done to validate this conversion. In addition, the script does not support non-contiguous gaps.
````

## File: script/utils/validateStorage/validateStorage.ts
````typescript
import yargs, { string } from 'yargs';
⋮----
import chalk from 'chalk';
⋮----
// This function does basic validation of storage
async function validateStorageSlots()
⋮----
// Get csv files and format into mappings
⋮----
// Assert that the new layout is not smaller than the old layout
⋮----
// List of warnings
⋮----
// List of errors
⋮----
// Loop through new layout
⋮----
// No more storage slots to compare with in old layout
⋮----
// Mark slot as read
⋮----
// Get item in slot
⋮----
// Check that slot number is correct
⋮----
// If old slot is empty and new slot is not, add an error - overwrote old storage with an empty slot
⋮----
// If either slot is empty, continue
// Case1: newEntry.empty && oldEntry.empty -> fine
// Case2: newEntry.empty && !oldEntry.empty -> error already added
// Case3: !newEntry.empty && oldEntry.empty -> created new slot, will check with gaps
⋮----
// Remaining slots are now non-empty non-gaps
// Check that slot name has not changed
⋮----
// Check that slot type has not changed
⋮----
// Check gaps, starting from from the beginning of the old layout
⋮----
// Ignore non gap slots
⋮----
// If the size is the same, continue
⋮----
// Gap is not present at the same slot in the new layout, find the next gap
⋮----
// Add error if no gap is found, we should have gaps at the end of all contracts
⋮----
// Get number of slots between gaps and extract the gap size
⋮----
// Check that gap has been properly resized
⋮----
// Okay to resize down if there is a non-empty slot after the gap and it's aligned to the 50th + 1 slot
⋮----
// Check that gaps are aligned to the 50th slot in the new layout
⋮----
// Find last gap slot
⋮----
for(let i = 0; i < lastGapSlot; i++) { // Ignore last gap
⋮----
// Find the next non-gap slot
⋮----
// Sanity check that all slots in old layout have been read
⋮----
// Delete files if keep is not specified
⋮----
// Print warnings
⋮----
// Print errors or success
⋮----
function formatCSV(csv: string)
⋮----
// Array with all storage slots
⋮----
// Begin iterating when table begins, ignore any output before
let storageBegin = 2; // storage begins on line 2 if there is no extra output
⋮----
// Reached EOF
⋮----
// Extract the relevant data from each line
⋮----
// Push the entry to the storageSlots array
⋮----
// Push empty slots for size of gap
⋮----
// Assert that the storageSlots array is sorted by slot
⋮----
// Gap in format `uint256[x]`, return x
function getGapSize(gap: string): number
⋮----
type StorageSlot = {
  name: string,
  type: string,
  slot: number,
  offset: number,
  bytes: number,
  empty: boolean,
  read: boolean
}
````

## File: script/utils/validateStorage/validateUpgrade.sh
````bash
#!/bin/bash

source .env 

# Parse command-line arguments using getopt
while getopts ":n:c:a:k:" opt; do
  case $opt in
    n) NETWORK="$OPTARG";;
    c) CONTRACT="$OPTARG";;
    a) ADDRESS="$OPTARG";;
    \?) echo "Invalid option -$OPTARG" >&2; exit 1;;
  esac
done

# Validate that network and contract inputs are provided
if [ -z "$NETWORK" ] || [ -z "$CONTRACT" ] || [ -z "$ADDRESS" ]; then
  echo "Usage: $0 -n <network> -c <contract> -a <address> -k"
  exit 1
fi

# Validate the network input
if [ "$NETWORK" != "mainnet" ] ; then
  echo "Invalid network. Use 'mainnet'."
  exit 1
fi

# Get local path for contract & validate contract input
case $CONTRACT in
    "strategyManager") CONTRACT_PATH="src/contracts/core/StrategyManager.sol:StrategyManager";;
    "delegation") CONTRACT_PATH="src/contracts/core/DelegationManager.sol:DelegationManager";;
    "eigenPodManager") CONTRACT_PATH="src/contracts/pods/EigenPodManager.sol:EigenPodManager";;
    "eigenPod") CONTRACT_PATH="src/contracts/pods/EigenPod.sol:EigenPod";;
    "slasher") CONTRACT_PATH="src/contracts/core/Slasher.sol:Slasher";;
    *)
    echo "Invalid contract name."
    exit 1
    ;;
esac

# Set RPC
if [ "$NETWORK" == "mainnet" ]; then
    RPC_URL="$RPC_MAINNET"
fi

# Print the selected network and contract
echo "Checking storage layouts for contract on: $NETWORK"
echo "Contract to validate upgrade: $CONTRACT"

# Get storage layout for on-chain contract
echo "Retrieving on-chain storage layout for $ADDRESS"
command="cast storage $ADDRESS --rpc-url $RPC_URL --etherscan-api-key $ETHERSCAN_API_KEY"
eval "$command > /dev/null 2>&1" # precompile contracts so onChainLayout.csv isn't filled with warnings
output=$(eval $command)
echo "$output" | tail -n +2 > onChainLayout.csv
echo "On-chain storage saved to onChainLayout.csv"

# Get storage layout for local contract
echo "Retrieving local storage layout for $CONTRACT at $CONTRACT_PATH"
command="forge inspect $CONTRACT_PATH storage --pretty"
output=$(eval $command)
echo "$output" | tail -n +1 > localLayout.csv
echo "Local storage saved to localLayout.csv"

# Compare the two storage layouts via typescript script
echo "Comparing storage layouts..."

# Add -k operator if present
if [ ! -k "$1" ]; then
  echo "Keeping old storage layout files"
  eval "npx ts-node script/utils/validateStorage/validateStorage.ts --old onChainLayout.csv --new localLayout.csv --keep"
else
  eval "npx ts-node script/utils/validateStorage/validateStorage.ts --old onChainLayout.csv --new localLayout.csv"
fi
````

## File: script/utils/ExistingDeploymentParser.sol
````
// SPDX-License-Identifier: BUSL-1.1
⋮----
import "@openzeppelin/contracts/proxy/transparent/ProxyAdmin.sol";
import "@openzeppelin/contracts/proxy/transparent/TransparentUpgradeableProxy.sol";
import "@openzeppelin/contracts/proxy/beacon/UpgradeableBeacon.sol";
⋮----
import "../../src/contracts/core/StrategyManager.sol";
import "../../src/contracts/core/DelegationManager.sol";
import "../../src/contracts/core/AVSDirectory.sol";
import "../../src/contracts/core/RewardsCoordinator.sol";
import "../../src/contracts/core/AllocationManager.sol";
import "../../src/contracts/core/AllocationManagerView.sol";
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";
import "../../src/contracts/pods/EigenPodManager.sol";
⋮----
import "../../src/contracts/permissions/PauserRegistry.sol";
import "../../src/contracts/permissions/KeyRegistrar.sol";
import "../../src/contracts/multichain/BN254CertificateVerifier.sol";
import "../../src/contracts/multichain/OperatorTableUpdater.sol";
⋮----
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";
⋮----
contract ExistingDeploymentParser is Script, Logger {
⋮----
/// -----------------------------------------------------------------------
/// EigenLayer Contract Parameters
⋮----
/// @dev AllocationManager
⋮----
/// @dev AVSDirectory
⋮----
/// @dev DelegationManager
⋮----
/// @dev EigenPodManager
⋮----
/// @dev EigenPod
⋮----
/// @dev RewardsCoordinator
⋮----
/// @dev StrategyManager
⋮----
/// @dev Strategy Deployment
⋮----
/// @dev EmissionsController
⋮----
/// EigenLayer Contracts
⋮----
/// @dev EigenPods
⋮----
/// @dev PermissionController
⋮----
/// @dev StrategyFactory
⋮----
// Token
⋮----
/// @dev Multichain
⋮----
/// Storage
⋮----
// EigenPods deployed
⋮----
// All eigenpods is just single array list of above eigenPods
⋮----
// strategies deployed
⋮----
// Strategies to Deploy
⋮----
///
⋮----
function NAME() public view virtual override returns (string memory) {
⋮----
/// @notice use for parsing already deployed EigenLayer contracts
function _parseDeployedContracts(
⋮----
// read and log the chainID
⋮----
// READ JSON CONFIG DATA
⋮----
// check that the chainID matches the one in the config
⋮----
// read all of the deployed addresses
⋮----
// FIXME: hotfix - remove later...
⋮----
// AllocationManager
⋮----
// allocationManagerView = IAllocationManagerView(json.readAddress(".addresses.allocationManagerView"));
⋮----
// AVSDirectory
⋮----
// DelegationManager
⋮----
// PermissionController
⋮----
// RewardsCoordinator
⋮----
// StrategyManager
⋮----
// StrategyFactory
⋮----
// StrategyBeacon
⋮----
// EigenPodManager
⋮----
// EigenPod
⋮----
// Strategies Deployed, load strategy list
⋮----
// Form the key for the current element
⋮----
// Use the key and parse the strategy address
⋮----
// token
⋮----
function _parseDeployedEigenPods(
⋮----
/// @notice use for deploying a new set of EigenLayer contracts
/// Note that this does assertEq multisigs to already be deployed
function _parseInitialDeploymentParams(
⋮----
// Strategies to Deploy, load strategy list
⋮----
// Use parseJson with the key to get the value for the current element
⋮----
// Decode the token information into the Token struct
⋮----
// Read initialize params for upgradeable contracts
⋮----
// check that all values are non-zero
⋮----
/// @notice Ensure contracts point at each other correctly via constructors
function _verifyContractPointers() internal view virtual {
⋮----
// EPM
⋮----
/// @notice verify implementations for Transparent Upgradeable Proxies
function _verifyImplementations() internal view virtual {
⋮----
/// @notice Verify initialization of Transparent Upgradeable Proxies. Also check
/// initialization params if this is the first deployment.
/// @dev isInitialDeployment True if this is the first deployment of contracts from scratch
function _verifyContractsInitialized(
bool /* isInitialDeployment */
⋮----
0, // initialPausedStatus
address(0), // rewardsUpdater
0, // activationDelay
0, // defaultSplitBips
address(0) // feeRecipient
⋮----
// Strategies
⋮----
/// @notice Verify params based on config constants that are updated from calling `_parseInitialDeploymentParams`
function _verifyInitializationParams() internal view virtual {
⋮----
// assertEq(
//     rewardsCoordinator.owner(), executorMultisig,
//     "rewardsCoordinator: owner not set correctly"
// );
⋮----
//     rewardsCoordinator.paused(), REWARDS_COORDINATOR_INIT_PAUSED_STATUS,
//     "rewardsCoordinator: init paused status set incorrectly"
⋮----
//     rewardsCoordinator.rewardsUpdater(), REWARDS_COORDINATOR_UPDATER,
//     "rewardsCoordinator: rewardsUpdater not set correctly"
⋮----
// assertEq(delegationManager.owner(), executorMultisig, "delegationManager: owner not set correctly");
⋮----
// EigenPodBeacon
⋮----
// EigenPodImplementation
⋮----
// Pausing Permissions
⋮----
function logInitialDeploymentParams() public {
⋮----
// todo log all rewards coordinator params
⋮----
/// @notice Log contract addresses and write to output json file
function logAndOutputContractAddresses(
⋮----
// WRITE JSON DATA
⋮----
// serialize all the data
⋮----
/// @notice used for parsing parameters used in the integration test upgrade
function _parseParamsForIntegrationUpgrade(
````

## File: script/utils/multisend_tx_parser.py
````python
def parse_multisend_transactions(tx_bytes: bytes)
⋮----
i = 0
txs = []
⋮----
operation = tx_bytes[i]
⋮----
to = tx_bytes[i:i+20]
⋮----
value = int.from_bytes(tx_bytes[i:i+32], byteorder='big')
⋮----
data_length = int.from_bytes(tx_bytes[i:i+32], byteorder='big')
⋮----
data = tx_bytes[i:i+data_length]
⋮----
hex_input = sys.argv[1]
⋮----
hex_input = hex_input[2:]
⋮----
tx_bytes = binascii.unhexlify(hex_input)
⋮----
transactions = parse_multisend_transactions(tx_bytes)
````

## File: script/.gitignore
````
output/devnet/*
````

## File: src/contracts/avs/task/TaskMailbox.sol
````
// SPDX-License-Identifier: BUSL-1.1
⋮----
import {ReentrancyGuardUpgradeable} from "@openzeppelin-upgrades/contracts/security/ReentrancyGuardUpgradeable.sol";
import {OwnableUpgradeable} from "@openzeppelin-upgrades/contracts/access/OwnableUpgradeable.sol";
import {Initializable} from "@openzeppelin-upgrades/contracts/proxy/utils/Initializable.sol";
import {IERC20} from "@openzeppelin/contracts/token/ERC20/IERC20.sol";
import {SafeERC20} from "@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol";
import {SafeCast} from "@openzeppelin/contracts/utils/math/SafeCast.sol";
⋮----
import {IAVSTaskHook} from "../../interfaces/IAVSTaskHook.sol";
import {
    IBN254CertificateVerifier,
    IBN254CertificateVerifierTypes
} from "../../interfaces/IBN254CertificateVerifier.sol";
import {
    IECDSACertificateVerifier,
    IECDSACertificateVerifierTypes
} from "../../interfaces/IECDSACertificateVerifier.sol";
import {IBaseCertificateVerifier} from "../../interfaces/IBaseCertificateVerifier.sol";
import {IKeyRegistrarTypes} from "../../interfaces/IKeyRegistrar.sol";
import {ITaskMailbox} from "../../interfaces/ITaskMailbox.sol";
import {OperatorSet} from "../../libraries/OperatorSetLib.sol";
import {TaskMailboxStorage} from "./TaskMailboxStorage.sol";
⋮----
/// @title TaskMailbox
/// @author Layr Labs, Inc.
/// @notice Contract for managing the lifecycle of tasks that are executed by operator sets of task-based AVSs.
contract TaskMailbox is Initializable, OwnableUpgradeable, ReentrancyGuardUpgradeable, TaskMailboxStorage {
⋮----
/// @notice Constructor for TaskMailbox
/// @param _bn254CertificateVerifier Address of the BN254 certificate verifier
/// @param _ecdsaCertificateVerifier Address of the ECDSA certificate verifier
/// @param _maxTaskSLA Maximum task SLA in seconds
⋮----
/// @notice Initializer for TaskMailbox
/// @param _owner The owner of the contract
/// @param _feeSplit The initial fee split in basis points
/// @param _feeSplitCollector The initial fee split collector address
function initialize(
⋮----
///
///                         EXTERNAL FUNCTIONS
⋮----
/// @inheritdoc ITaskMailbox
function setExecutorOperatorSetTaskConfig(
⋮----
// Validate config is populated with non-zero values
⋮----
// Validate task SLA is within maximum limit
⋮----
// Validate consensus enum within range
⋮----
// Validate operator set ownership
⋮----
// If executor operator set is not registered, register it.
⋮----
function registerExecutorOperatorSet(
⋮----
// Validate that task config has been set before registration can be toggled.
⋮----
function createTask(
⋮----
// Get the operator table reference timestamp and max staleness period
⋮----
// Scoping to prevent `Stack too deep` error during compilation
⋮----
// Pre-task submission checks: AVS can validate the caller and task params.
⋮----
// Calculate the AVS fee using the task hook
⋮----
// Transfer fee to the TaskMailbox if there's a fee to transfer
⋮----
// Post-task submission checks: AVS can write to storage in their hook for validating task lifecycle
⋮----
function submitResult(
⋮----
// Pre-task result submission checks: AVS can validate the caller, task result, params and certificate.
⋮----
// Verify certificate based on consensus configuration
⋮----
// Transfer fee to the fee collector if there's a fee to transfer
⋮----
// Calculate fee split amount
⋮----
// Transfer split to fee split collector if there's a split
⋮----
// Transfer remaining fee to AVS fee collector
⋮----
// Post-task result submission checks: AVS can update hook storage for task lifecycle if needed.
⋮----
function refundFee(
⋮----
// Mark fee as refunded to prevent double refunds
⋮----
// Transfer fee to refund collector if there's a fee to refund
⋮----
function setFeeSplit(
⋮----
function setFeeSplitCollector(
⋮----
///                         INTERNAL FUNCTIONS
⋮----
/// @notice Sets the fee split percentage
/// @param _feeSplit The fee split in basis points (0-10000)
function _setFeeSplit(
⋮----
/// @notice Sets the fee split collector address
/// @param _feeSplitCollector The address to receive fee splits
function _setFeeSplitCollector(
⋮----
/// @notice Gets the current status of a task
/// @param task The task to get the status for
/// @return The current status of the task, considering expiration
function _getTaskStatus(
⋮----
/// @notice Registers an executor operator set with the TaskMailbox
/// @param operatorSet The operator set to register
/// @param isRegistered Whether the operator set is registered
function _registerExecutorOperatorSet(
⋮----
/// @notice Gets the certificate verifier for a given curve type
/// @param curveType The curve type to get the certificate verifier for
/// @return The address of the certificate verifier
/// @dev This function will revert if the curve type is invalid
function _getCertificateVerifier(
⋮----
/// @notice Checks if a task config is populated
/// @param taskConfig The task config to check
/// @return True if all elements of the task config are populated, false otherwise
function _isConfigPopulated(
⋮----
/// @notice Validates that the caller is the owner of the operator set
/// @param operatorSet The operator set to validate ownership for
/// @param curveType The curve type used to determine the certificate verifier
/// @dev This function will revert if the curve type is invalid or if msg.sender is not the owner of the operator set
function _validateOperatorSetOwner(
⋮----
/// @notice Validates the consensus configuration
/// @param consensus The consensus configuration to validate
function _validateConsensus(
⋮----
// For NONE consensus type, value should be empty bytes
⋮----
// Decode and validate the stake proportion threshold
⋮----
/// @notice Validates a BN254 certificate's basic requirements
/// @param cert The BN254 certificate to validate
/// @param operatorTableReferenceTimestamp The expected reference timestamp
/// @param messageHash The expected message hash
function _validateBN254Certificate(
⋮----
/// @notice Validates an ECDSA certificate's basic requirements
/// @param cert The ECDSA certificate to validate
⋮----
function _validateECDSACertificate(
⋮----
/// @notice Verifies an executor certificate based on the consensus configuration
/// @param curveType The curve type used for signature verification
/// @param consensus The consensus configuration
/// @param executorOperatorSet The executor operator set
/// @param operatorTableReferenceTimestamp The reference timestamp of the operator table
/// @param messageHash The hash of the message that was signed by the operators
/// @param executorCert The executor certificate to verify
function _verifyExecutorCertificate(
⋮----
// For NONE consensus type, just verify the certificate.
// The consensus logic handling is left to the AVS in the `handlePostTaskResultSubmission` hook.
⋮----
// Verify certificate based on curve type
⋮----
// BN254 Certificate verification
⋮----
// Validate the certificate
⋮----
// ECDSA Certificate verification
⋮----
// Decode stake proportion threshold
⋮----
// This assumes that that the `BN254TableCalculator` or `ECDSATableCalculator` have been set as the `OperatorTableCalculator` in the `CrossChainRegistry` on the source chain while creating a generation reservation.
// These table calculators calculate slashable stake for an operatorSet and value all strategies equally. Hence `totalStakeProportionThresholds` is an array of length 1.
⋮----
// If the threshold is not met, revert
⋮----
///                         VIEW FUNCTIONS
⋮----
function getExecutorOperatorSetTaskConfig(
⋮----
function getTaskInfo(
⋮----
function getTaskStatus(
⋮----
function getTaskResult(
⋮----
function getBN254CertificateBytes(
⋮----
function getECDSACertificateBytes(
⋮----
function getMessageHash(
````

## File: src/contracts/avs/task/TaskMailboxStorage.sol
````
// SPDX-License-Identifier: BUSL-1.1
⋮----
import {ITaskMailbox} from "../../interfaces/ITaskMailbox.sol";
⋮----
/// @title TaskMailboxStorage
/// @author Layr Labs, Inc.
/// @notice Storage contract for the TaskMailbox contract.
abstract contract TaskMailboxStorage is ITaskMailbox {
/// @notice Equivalent to 100%, but in basis points.
⋮----
/// @notice Immutable BN254 certificate verifier
⋮----
/// @notice Immutable ECDSA certificate verifier
⋮----
/// @notice Maximum task SLA in seconds.
/// @dev This will be set to `DEALLOCATION_DELAY / 2` so that AVSs can still slash operators in case of stake deallocation during inflight tasks.
⋮----
/// @notice Global counter for tasks created across the TaskMailbox
⋮----
/// @notice Mapping from task hash to task details
⋮----
/// @notice Mapping to track registered executor operator sets by their keys
⋮----
/// @notice Mapping from executor operator set key to its task configuration
⋮----
/// @notice The fee split percentage in basis points (0-10000)
⋮----
/// @notice The address that receives the fee split
⋮----
/// @notice Constructor for TaskMailboxStorage
/// @param _bn254CertificateVerifier Address of the BN254 certificate verifier
/// @param _ecdsaCertificateVerifier Address of the ECDSA certificate verifier
/// @param _maxTaskSLA Maximum task SLA in seconds
⋮----
/// @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
````

## File: src/contracts/core/storage/AllocationManagerStorage.sol
````
// SPDX-License-Identifier: BUSL-1.1
⋮----
import "@openzeppelin/contracts/utils/structs/EnumerableSet.sol";
import "@openzeppelin/contracts/utils/structs/DoubleEndedQueue.sol";
⋮----
import "../../interfaces/IAllocationManager.sol";
import {Snapshots} from "../../libraries/Snapshots.sol";
⋮----
abstract contract AllocationManagerStorage is IAllocationManagerStorage {
⋮----
// Constants
⋮----
/// @dev The default burn address for slashed funds.
⋮----
/// @dev The beacon chain ETH strategy.
⋮----
/// @dev Index for flag that pauses operator allocations/deallocations when set.
⋮----
/// @dev Index for flag that pauses operator register/deregister to operator sets when set.
⋮----
// Immutables
⋮----
/// @notice The DelegationManager contract for EigenLayer
⋮----
/// @notice The Eigen strategy contract
/// @dev Cannot be added to redistributing operator sets
⋮----
/// @notice Delay before deallocations are clearable and can be added back into freeMagnitude
/// In this window, deallocations still remain slashable by the operatorSet they were allocated to.
⋮----
/// @notice Delay before allocation delay modifications take effect.
⋮----
/// @notice Delay before slasher changes take effect.
/// @dev Currently set to the same value as ALLOCATION_CONFIGURATION_DELAY.
⋮----
// Mutatables
⋮----
/// AVS => OPERATOR SET
⋮----
/// @dev Contains the AVS's configured registrar contract that handles registration/deregistration
/// Note: if set to 0, defaults to the AVS's address
⋮----
/// @dev Lists the operator set ids an AVS has created
⋮----
/// @dev Lists the strategies an AVS supports for an operator set
⋮----
/// @dev Lists the members of an AVS's operator set
⋮----
/// OPERATOR => OPERATOR SET (REGISTRATION/DEREGISTRATION)
⋮----
/// @notice Returns the allocation delay info for each `operator`; the delay and whether or not it's previously been set.
⋮----
/// @dev Lists the operator sets the operator is registered for. Note that an operator
/// can be registered without allocated stake. Likewise, an operator can allocate
/// without being registered.
⋮----
/// @dev Lists the operator sets the operator has outstanding allocations in.
⋮----
/// @dev Contains the operator's registration status for an operator set.
⋮----
/// @dev For an operator set, lists all strategies an operator has outstanding allocations from.
⋮----
/// @dev For an operator set and strategy, the current allocated magnitude and any pending modification
⋮----
/// OPERATOR => STRATEGY (MAX/USED AND DEALLOCATIONS)
⋮----
/// @dev Contains a history of the operator's maximum magnitude for a given strategy
⋮----
/// @dev For a strategy, contains the amount of magnitude an operator has allocated to operator sets
⋮----
/// @dev For a strategy, keeps an ordered queue of operator sets that have pending deallocations
/// These must be completed in order to free up magnitude for future allocation
⋮----
/// @dev Lists the AVSs who has registered metadata and claimed itself as an AVS
/// @notice bool is not used and is always true if the avs has registered metadata
⋮----
/// @notice Returns the number of slashes for a given operator set.
/// @dev This is also used as a unique slash identifier.
/// @dev This tracks the number of slashes after the redistribution release.
⋮----
/// @notice Returns the address where slashed funds will be sent for a given operator set.
/// @dev For redistributing Operator Sets, returns the configured redistribution address set during Operator Set creation.
///      For non-redistributing or non-existing operator sets, the public getter for this function `getRedistributionRecipient`
///      returns `DEFAULT_BURN_ADDRESS`
⋮----
/// @notice Returns the address that can slash a given operator set.
⋮----
// Construction
⋮----
/// @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
````

## File: src/contracts/core/storage/AVSDirectoryStorage.sol
````
// SPDX-License-Identifier: BUSL-1.1
⋮----
import "../../interfaces/IAVSDirectory.sol";
import "../../interfaces/IDelegationManager.sol";
⋮----
abstract contract AVSDirectoryStorage is IAVSDirectory {
// Constants
⋮----
/// @notice The EIP-712 typehash for the `Registration` struct used by the contract
⋮----
/// @notice The EIP-712 typehash for the `OperatorSetRegistration` struct used by the contract
⋮----
/// @notice The EIP-712 typehash for the `OperatorSetMembership` struct used by the contract
⋮----
/// @dev Index for flag that pauses operator register/deregister to avs when set.
⋮----
/// @dev Index for flag that pauses operator register/deregister to operator sets when set.
⋮----
// Immutables
⋮----
/// @notice The DelegationManager contract for EigenLayer
⋮----
// Mutatables
⋮----
/// @dev Do not remove, deprecated storage.
⋮----
/// @notice Returns the registration status of each `operator` for a given `avs`.
/// @dev This storage will be deprecated once M2-based deregistration is removed.
⋮----
/// @notice Returns whether a `salt` has been used by a given `operator`.
⋮----
// Construction
⋮----
/// @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
````

## File: src/contracts/core/storage/DelegationManagerStorage.sol
````
// SPDX-License-Identifier: BUSL-1.1
⋮----
import "@openzeppelin/contracts/utils/structs/EnumerableSet.sol";
⋮----
import "../../libraries/SlashingLib.sol";
import "../../interfaces/IDelegationManager.sol";
import "../../interfaces/IEigenPodManager.sol";
import "../../interfaces/IAllocationManager.sol";
⋮----
import {Snapshots} from "../../libraries/Snapshots.sol";
⋮----
/// @title Storage variables for the `DelegationManager` contract.
/// @author Layr Labs, Inc.
/// @notice Terms of Service: https://docs.eigenlayer.xyz/overview/terms-of-service
/// @notice This storage contract is separate from the logic to simplify the upgrade process.
abstract contract DelegationManagerStorage is IDelegationManager {
⋮----
// Constants
⋮----
/// @notice The EIP-712 typehash for the `DelegationApproval` struct used by the contract
⋮----
/// @dev Index for flag that pauses new delegations when set
⋮----
/// @dev Index for flag that pauses queuing new withdrawals when set.
⋮----
/// @dev Index for flag that pauses completing existing withdrawals when set.
⋮----
/// @notice Canonical, virtual beacon chain ETH strategy
⋮----
// Immutables
⋮----
/// @notice The StrategyManager contract for EigenLayer
⋮----
/// @notice The EigenPodManager contract for EigenLayer
⋮----
/// @notice The AllocationManager contract for EigenLayer
⋮----
/// @notice Minimum withdrawal delay in blocks until a queued withdrawal can be completed.
⋮----
// Mutatables
⋮----
/// @dev Do not remove, deprecated storage.
⋮----
/// @notice Tracks the current balance of shares an `operator` is delegated according to each `strategy`.
/// Updated by both the `StrategyManager` and `EigenPodManager` when a staker's delegatable balance changes,
/// and by the `AllocationManager` when the `operator` is slashed.
///
/// @dev The following invariant should hold for each `strategy`:
⋮----
/// operatorShares[operator] = sum(withdrawable shares of all stakers delegated to operator)
⋮----
/// @notice Returns the operator details for a given `operator`.
/// Note: two of the `OperatorDetails` fields are deprecated. The only relevant field
/// is `OperatorDetails.delegationApprover`.
⋮----
/// @notice Returns the `operator` a `staker` is delegated to, or address(0) if not delegated.
/// Note: operators are delegated to themselves
⋮----
/// @notice Do not remove, deprecated storage.
⋮----
/// @notice Returns whether `delegationApprover` has already used the given `salt`.
⋮----
/// @dev Returns whether a withdrawal is pending for a given `withdrawalRoot`.
/// @dev This variable will be deprecated in the future, values should only be read or deleted.
⋮----
/// @notice Returns the total number of withdrawals that have been queued for a given `staker`.
/// @dev This only increments (doesn't decrement), and is used to help ensure that otherwise identical withdrawals have unique hashes.
⋮----
/// See conversation here: https://github.com/Layr-Labs/eigenlayer-contracts/pull/365/files#r1417525270
⋮----
/// @notice Returns the scaling factor applied to a `staker` for a given `strategy`
⋮----
/// @notice Returns a list of queued withdrawals for a given `staker`.
/// @dev Entries are removed when the withdrawal is completed.
/// @dev This variable only reflects withdrawals that were made after the slashing release.
⋮----
/// @notice Returns the details of a queued withdrawal given by `withdrawalRoot`.
⋮----
/// @notice Contains history of the total cumulative staker withdrawals for an operator and a given strategy.
/// Used to calculate burned StrategyManager shares when an operator is slashed.
/// @dev Stores scaledShares instead of total withdrawn shares to track current slashable shares, dependent on the maxMagnitude
⋮----
// Construction
⋮----
/// @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
````

## File: src/contracts/core/storage/EmissionsControllerStorage.sol
````
// SPDX-License-Identifier: BUSL-1.1
⋮----
import "../../interfaces/IEmissionsController.sol";
import "../../interfaces/IRewardsCoordinator.sol";
⋮----
abstract contract EmissionsControllerStorage is IEmissionsController {
// Constants
⋮----
/// @inheritdoc IEmissionsController
⋮----
/// @dev Index for flag that pauses pressing the button when set.
⋮----
/// @dev Returns the hash of the reentrancy error from OZ 4.9.0 ReentrancyGuard.
/// Used to detect griefing attacks.
⋮----
// Immutables
⋮----
/// @dev The EIGEN token that will be minted for emissions.
⋮----
/// @dev The backing Eigen token that will be minted for emissions.
⋮----
/// @dev The AllocationManager contract for managing operator sets.
⋮----
/// @dev The RewardsCoordinator contract for submitting rewards.
⋮----
// Mutatables
⋮----
// Slot 0 (Packed)
⋮----
/// @dev Returns an append-only array of distributions.
⋮----
/// @dev Mapping from epoch number to epoch metadata.
⋮----
// Construction
⋮----
// Check if epochLength is aligned with CALCULATION_INTERVAL_SECONDS.
⋮----
// Check if startTime is aligned with CALCULATION_INTERVAL_SECONDS.
⋮----
/// @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
````

## File: src/contracts/core/storage/ProtocolRegistryStorage.sol
````
// SPDX-License-Identifier: BUSL-1.1
⋮----
import "@openzeppelin-upgrades/contracts/utils/ShortStringsUpgradeable.sol";
import "@openzeppelin/contracts/utils/structs/EnumerableMap.sol";
import "../../interfaces/IProtocolRegistry.sol";
⋮----
abstract contract ProtocolRegistryStorage is IProtocolRegistry {
///
///                           CONSTANTS
⋮----
/// @inheritdoc IProtocolRegistry
⋮----
///                          MUTABLE STATE
⋮----
/// @notice Returns the semantic version of the protocol.
⋮----
/// @notice Maps deployment name hashes to addresses (enumerable for iteration).
⋮----
/// @notice Maps deployment addresses to their configurations.
⋮----
/// @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
````

## File: src/contracts/core/storage/ReleaseManagerStorage.sol
````
// SPDX-License-Identifier: BUSL-1.1
⋮----
import "../../interfaces/IReleaseManager.sol";
⋮----
abstract contract ReleaseManagerStorage is IReleaseManager {
// Mutables
⋮----
/// @notice Returns an array of releases for a given operator set.
⋮----
/// @notice Returns the metadata URI for a given operator set.
⋮----
/// @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
````

## File: src/contracts/core/storage/RewardsCoordinatorStorage.sol
````
// SPDX-License-Identifier: BUSL-1.1
⋮----
import "../../interfaces/IRewardsCoordinator.sol";
⋮----
/// @title Storage variables for the `RewardsCoordinator` contract.
/// @author Layr Labs, Inc.
/// @notice Terms of Service: https://docs.eigenlayer.xyz/overview/terms-of-service
/// @notice This storage contract is separate from the logic to simplify the upgrade process.
abstract contract RewardsCoordinatorStorage is IRewardsCoordinator {
// Constants
⋮----
/// @dev Index for flag that pauses calling createAVSRewardsSubmission and createEigenDARewardsSubmission
⋮----
/// @dev Index for flag that pauses calling createRewardsForAllSubmission
⋮----
/// @dev Index for flag that pauses calling processClaim
⋮----
/// @dev Index for flag that pauses submitRoots and disableRoot
⋮----
/// @dev Index for flag that pauses calling createRewardsForAllEarners
⋮----
/// @dev Index for flag that pauses calling createOperatorDirectedAVSRewardsSubmission
⋮----
/// @dev Index for flag that pauses calling setOperatorAVSSplit
⋮----
/// @dev Index for flag that pauses calling setOperatorPISplit
⋮----
/// @dev Index for flag that pauses calling setOperatorSetSplit
⋮----
/// @dev Index for flag that pauses calling createOperatorDirectedOperatorSetRewardsSubmission
⋮----
/// @dev Index for flag that pauses calling createUniqueStakeRewardsSubmission
⋮----
/// @dev Index for flag that pauses calling createTotalStakeRewardsSubmission
⋮----
/// @dev Salt for the earner leaf, meant to distinguish from tokenLeaf since they have the same sized data
⋮----
/// @dev Salt for the token leaf, meant to distinguish from earnerLeaf since they have the same sized data
⋮----
/// @notice The maximum rewards token amount for a single rewards submission, constrained by off-chain calculation
⋮----
/// @notice Equivalent to 100%, but in basis points.
⋮----
/// @notice Canonical, virtual beacon chain ETH strategy
⋮----
/// @notice Protocol fee percentage in basis points (20%).
⋮----
// Immutables
⋮----
/// @notice The DelegationManager contract for EigenLayer
⋮----
/// @notice The StrategyManager contract for EigenLayer
⋮----
/// @notice The AllocationManager contract for EigenLayer
⋮----
/// @notice The RewardsCoordinator contract for EigenLayer
⋮----
/// @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
⋮----
/// @notice The maximum amount of time (seconds) that a rewards submission can span over
⋮----
/// @notice max amount of time (seconds) that a rewards submission can start in the past
⋮----
/// @notice max amount of time (seconds) that a rewards submission can start in the future
⋮----
/// @notice absolute min timestamp (seconds) that a rewards submission can start at
⋮----
/// @notice The cadence at which a snapshot is taken offchain for calculating rewards distributions
⋮----
// Mutatables
⋮----
/// @dev Do not remove, deprecated storage.
⋮----
/// @notice List of roots submitted by the rewardsUpdater
/// @dev Array is internal with an external getter so we can return a `DistributionRoot[] memory` object
⋮----
/// Slot 2
/// @notice The address of the entity that can update the contract with new merkle roots
⋮----
/// @notice Delay in timestamp (seconds) before a posted root can be claimed against
⋮----
/// @notice Timestamp for last submitted DistributionRoot
⋮----
/// @notice the default split for all operators across all avss in bips.
⋮----
/// @notice Returns the `claimer` for a given `earner`.
/// @dev The claimer is able to call `processClaim` on behalf of the `earner`.
⋮----
/// @notice Returns the total claimed amount for an `earner` for a given `token`.
⋮----
/// @notice Returns the submission `nonce` for an `avs`.
⋮----
/// @notice Returns whether a `hash` is a `valid` rewards submission hash for a given `avs`.
⋮----
/// @notice Returns whether a `hash` is a `valid` rewards submission for all hash for a given `avs`.
⋮----
/// @notice Returns whether a `submitter` is a `valid` rewards for all submitter.
⋮----
/// @notice Returns whether a `hash` is a `valid` rewards submission for all earners hash for a given `avs`.
⋮----
/// @notice Returns whether a `hash` is a `valid` operator set performance rewards submission hash for a given `avs`.
⋮----
/// @notice Returns the `split` an `operator` takes for an `avs`.
⋮----
/// @notice Returns the `split` an `operator` takes for Programmatic Incentives.
⋮----
/// @notice Returns the `split` an `operator` takes for a given operator set.
⋮----
/// @notice Returns whether a `hash` is a `valid` unique stake rewards submission hash for a given `avs`.
⋮----
/// @notice Returns whether a `hash` is a `valid` total stake rewards submission hash for a given `avs`.
⋮----
/// @notice Returns whether a `submitter` is opted in for protocol fees.
⋮----
/// @notice The address that receives optional protocol fees
⋮----
// Construction
⋮----
/// @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
````

## File: src/contracts/core/storage/StrategyManagerStorage.sol
````
// SPDX-License-Identifier: BUSL-1.1
⋮----
import "@openzeppelin/contracts/utils/structs/EnumerableMap.sol";
import "@openzeppelin/contracts/utils/structs/EnumerableSet.sol";
⋮----
import "../../interfaces/IAllocationManager.sol";
import "../../interfaces/IAVSDirectory.sol";
import "../../interfaces/IDelegationManager.sol";
import "../../interfaces/IEigenPodManager.sol";
import "../../interfaces/IStrategy.sol";
import "../../interfaces/IStrategyManager.sol";
⋮----
/// @title Storage variables for the `StrategyManager` contract.
/// @author Layr Labs, Inc.
/// @notice Terms of Service: https://docs.eigenlayer.xyz/overview/terms-of-service
/// @notice This storage contract is separate from the logic to simplify the upgrade process.
abstract contract StrategyManagerStorage is IStrategyManager {
// Constants
⋮----
/// @notice The EIP-712 typehash for the deposit struct used by the contract
⋮----
// maximum length of dynamic arrays in `stakerStrategyList` mapping, for sanity's sake
⋮----
// index for flag that pauses deposits when set
⋮----
/// @notice default address for burning slashed shares and transferring underlying tokens
⋮----
// Immutables
⋮----
// Mutatables
⋮----
/// @dev Do not remove, deprecated storage.
⋮----
/// @notice Returns the signature `nonce` for each `signer`.
⋮----
/// @notice Returns the permissioned address that can whitelist strategies.
⋮----
/// @notice Returns the number of deposited `shares` for a `staker` for a given `strategy`.
/// @dev All of these shares may not be withdrawable if the staker has delegated to an operator that has been slashed.
⋮----
/// @notice Returns a list of the `strategies` that a `staker` is currently staking in.
⋮----
/// @notice Returns whether a `strategy` is `whitelisted` for deposits.
⋮----
/// @notice Returns the amount of `shares` that have been slashed on EigenLayer but not burned yet. Takes 3 storage slots.
/// @dev After the redistribution upgrade, this storage variable is no longer used, and will be deprecated.
⋮----
/// @notice Returns the amount of `shares` that have been slashed on EigenLayer but not marked for burning or redistribution yet.
⋮----
/// @notice Returns a list of operator sets who have pending burn or redistributable shares.
⋮----
/// @notice Returns a list of slash ids for each operator set who have pending burn or redistributable shares.
⋮----
// Construction
⋮----
/// @param _delegation The delegation contract of EigenLayer.
⋮----
/// @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
````

## File: src/contracts/core/AllocationManager.sol
````
// SPDX-License-Identifier: BUSL-1.1
⋮----
import "@openzeppelin-upgrades/contracts/proxy/utils/Initializable.sol";
import "@openzeppelin-upgrades/contracts/security/ReentrancyGuardUpgradeable.sol";
import "../mixins/Deprecated_OwnableUpgradeable.sol";
import "../mixins/SplitContractMixin.sol";
import "../mixins/PermissionControllerMixin.sol";
import "../permissions/Pausable.sol";
import "../libraries/SlashingLib.sol";
import "../libraries/OperatorSetLib.sol";
import "./storage/AllocationManagerStorage.sol";
⋮----
contract AllocationManager is
⋮----
///
///                         INITIALIZING FUNCTIONS
⋮----
/// @dev Initializes the DelegationManager address, the deallocation delay, and the allocation configuration delay.
⋮----
/// @inheritdoc IAllocationManagerActions
function initialize(
⋮----
function slashOperator(
⋮----
// Check that the operator set exists and the operator is registered to it
⋮----
// Assert that the caller is the slasher for the operator set
⋮----
function modifyAllocations(
⋮----
// Check that the caller is allowed to modify allocations on behalf of the operator
// We do not use a modifier to avoid `stack too deep` errors
⋮----
// Check that the operator exists and has configured an allocation delay
⋮----
// Check that the operator set exists and get the operator's registration status
// Operators do not need to be registered for an operator set in order to allocate
// slashable magnitude to the set. In fact, it is expected that operators will
// allocate magnitude before registering, as AVS's will likely only accept
// registrations from operators that are already slashable.
⋮----
// 1. If the operator has any pending deallocations for this strategy, clear them
// to free up magnitude for allocation. Fetch the operator's up to date allocation
// info and ensure there is no remaining pending modification.
⋮----
// 2. Check whether the operator's allocation is slashable. If not, we allow instant
// deallocation.
⋮----
// 3. Calculate the change in magnitude
⋮----
// 4. Handle deallocation/allocation
⋮----
// If the operator is slashable, deallocated magnitude will be freed after
// the deallocation delay. This magnitude remains slashable until then.
⋮----
// deallocations are slashable in the window [block.number, block.number + deallocationDelay]
// therefore, the effectBlock is set to the block right after the slashable window
⋮----
// Deallocation immediately updates/frees magnitude if the operator is not slashable
⋮----
// Allocation immediately consumes available magnitude, but the additional
// magnitude does not become slashable until after the allocation delay
⋮----
// 5. Update state
⋮----
// 6. Emit an event for the updated allocation
⋮----
function clearDeallocationQueue(
⋮----
function registerForOperatorSets(
⋮----
// Check if the operator has registered.
⋮----
// Check the operator set exists and the operator is not currently registered to it
⋮----
// Add operator to operator set
⋮----
// Mark the operator registered
⋮----
// Call the AVS to complete registration. If the AVS reverts, registration will fail.
⋮----
function deregisterFromOperatorSets(
⋮----
// Check that the caller is either authorized on behalf of the operator or AVS
⋮----
// Check the operator set exists and the operator is registered to it
⋮----
// Remove operator from operator set
⋮----
// Mark operator deregistered until the DEALLOCATION_DELAY passes
// forgefmt: disable-next-item
⋮----
// Call the AVS to complete deregistration
⋮----
function setAllocationDelay(
⋮----
/// If the caller is the delegationManager, the operator is newly registered
/// This results in *newly-registered* operators in the core protocol to have their allocation delay effective immediately
⋮----
// If we're not newly registered, check that the caller (not the delegationManager) is authorized to set the allocation delay for the operator
⋮----
function setAVSRegistrar(
⋮----
// Check that the registrar is correctly configured to prevent an AVSRegistrar contract
// from being used with the wrong AVS
⋮----
function updateAVSMetadataURI(
⋮----
/// @notice This function will be deprecated in Early Q2 2026 in favor of `createOperatorSets` which takes in `CreateSetParamsV2`
function createOperatorSets(
⋮----
/// @notice This function will be deprecated in Early Q2 2026 in favor of `createRedistributingOperatorSets` which takes in `CreateSetParamsV2`
function createRedistributingOperatorSets(
⋮----
function addStrategiesToOperatorSet(
⋮----
function removeStrategiesFromOperatorSet(
⋮----
function updateSlasher(
⋮----
// Prevent updating a slasher if one is not already set
// A slasher is set either on operatorSet creation or, for operatorSets created prior to v1.9.0, via `migrateSlashers`
⋮----
/// @dev WARNING: Gas cost is O(appointees) per operator set due to `PermissionController.getAppointees()` call.
///      May exceed block gas limit for AVSs with large appointee sets. Consider batching operator sets if needed.
function migrateSlashers(
⋮----
// If the operatorSet does not exist, continue
⋮----
// If the slasher is already set, continue
⋮----
// Get the slasher from the permission controller.
⋮----
// If there are no slashers or the first slasher is the 0 address, set the slasher to the AVS
⋮----
// Else, set the slasher to the first slasher
⋮----
///                         INTERNAL FUNCTIONS
⋮----
/// @dev Slashes an operator.
/// @param params The slashing parameters. See IAllocationManager.sol#slashOperator for specifics.
/// @param operatorSet The operator set from which the operator is being slashed.
/// @return slashId The operator set's unique identifier for the slash.
/// @return shares The number of shares to be burned or redistributed for each strategy that was slashed.
function _slashOperator(
⋮----
// Increment the slash count for the operator set.
⋮----
// For each strategy in the operator set, slash any existing allocation
⋮----
// Check that `strategies` is in ascending order.
⋮----
// Check that `wadToSlash` is within acceptable bounds.
⋮----
// Check that the operator set contains the strategy.
⋮----
// 1. Get the operator's allocation info for the strategy and operator set
⋮----
// 2. Skip if the operator does not have a slashable allocation
// NOTE: this "if" is equivalent to: `if (!_isAllocationSlashable)`, because the other
// conditions in this method are already true (isOperatorSlashable + operatorSetStrategies.contains)
⋮----
// 3. Calculate the amount of magnitude being slashed, and subtract from
// the operator's currently-allocated magnitude, as well as the strategy's
// max and encumbered magnitudes
⋮----
// 4. If there is a pending deallocation, reduce the pending deallocation proportionally.
// This ensures that when the deallocation is completed, less magnitude is freed.
⋮----
// Emit an event for the updated allocation
⋮----
// 6. Slash operators shares in the DelegationManager
⋮----
/// @dev Adds a strategy to an operator set.
/// @param operatorSet The operator set to add the strategy to.
/// @param strategy The strategy to add to the operator set.
/// @param isRedistributing Whether the operator set is redistributing.
function _addStrategyToOperatorSet(
⋮----
// We do not currently support redistributing beaconchain ETH or EIGEN.
⋮----
/// @notice Creates a new operator set for an AVS.
/// @param avs The AVS address that owns the operator set.
/// @param params The parameters for creating the operator set.
/// @param redistributionRecipient Address to receive redistributed funds when operators are slashed.
/// @dev If `redistributionRecipient` is address(0), the operator set is considered non-redistributing
/// and slashed funds are sent to the `DEFAULT_BURN_ADDRESS`.
/// @dev Providing `BEACONCHAIN_ETH_STRAT` as a strategy will revert since it's not currently supported.
/// @dev The address that can slash the operatorSet is the `avs` address.
function _createOperatorSet(
⋮----
// Create the operator set, ensuring it does not already exist.
⋮----
// Update the slasher for the operator set
⋮----
/// @dev Clear one or more pending deallocations to a strategy's allocated magnitude
/// @param operator the operator whose pending deallocations will be cleared
/// @param strategy the strategy to update
/// @param numToClear the number of pending deallocations to clear
function _clearDeallocationQueue(
⋮----
// If we've reached a pending deallocation that isn't completable yet,
// we can stop. Any subsequent deallocation will also be uncompletable.
⋮----
// Update state. This completes the deallocation, because `_getUpdatedAllocation`
// gave us strategy/allocation info as if the deallocation was already completed.
⋮----
// Remove the deallocation from the queue
⋮----
/// @dev Sets the operator's allocation delay. This is the number of blocks between an operator
/// allocating magnitude to an operator set, and the magnitude becoming slashable.
/// @param operator The operator to set the delay on behalf of.
/// @param delay The allocation delay in blocks.
/// @param newlyRegistered Whether the operator is newly registered in the core protocol.
function _setAllocationDelay(
⋮----
// If there is a pending delay that can be applied now, set it
⋮----
// Update delay and isSet immediately for storage consistency
⋮----
// Wait the entire configuration delay before the delay takes effect
⋮----
/// @notice returns whether the operator's allocation is slashable in the given operator set
function _isAllocationSlashable(
⋮----
/// forgefmt: disable-next-item
⋮----
// If the operator set does not use this strategy, any allocation from it is not slashable
⋮----
// If the operator is not slashable by the operatorSet, any allocation is not slashable
⋮----
// If there is nothing allocated, the allocation is not slashable
⋮----
/// @dev For an operator set, get the operator's effective allocated magnitude.
/// If the operator set has a pending deallocation that can be completed at the
/// current block number, this method returns a view of the allocation as if the deallocation
/// was completed.
/// @return info the effective allocated and pending magnitude for the operator set, and
/// the effective encumbered magnitude for all operator sets belonging to this strategy
function _getUpdatedAllocation(
⋮----
// If the pending change can't be completed yet, return as-is
⋮----
// Otherwise, complete the pending change and return updated info
⋮----
// If the completed change was a deallocation, update used magnitude
⋮----
function _updateAllocationInfo(
⋮----
// Update encumbered magnitude if it has changed
// The mapping should NOT be updated when there is a deallocation on a delay
⋮----
// Update allocation for this operator set from the strategy
// We emit an `AllocationUpdated` from the `modifyAllocations` and `slashOperator` functions.
// `clearDeallocationQueue` does not emit an `AllocationUpdated` event since it was
// emitted when the deallocation was queued
⋮----
// Note: these no-op if the sets already contain the added values (or do not contain removed ones)
⋮----
// If we have a pending modification, ensure the allocation is in the operator's
// list of enumerable strategies/sets.
⋮----
// If we do NOT have a pending modification, and no existing magnitude, remove the
// allocation from the operator's lists.
⋮----
function _updateMaxMagnitude(
⋮----
function _calcDelta(
⋮----
/// @dev Use safe casting when downcasting to uint64
function _addInt128(
⋮----
/// @dev Helper function to update the slasher for an operator set
/// @param operatorSet the operator set to update the slasher for
/// @param slasher the new slasher
/// @param instantEffectBlock Whether the new slasher will take effect immediately. Instant if on operatorSet creation or migration function.
///        The new slasher will take `ALLOCATION_CONFIGURATION_DELAY` blocks to take effect if called by the `updateSlasher` function.
function _updateSlasher(
⋮----
// Ensure that the slasher address is not the 0 address, which is used to denote if the slasher is not set
⋮----
// If there is a pending slasher that can be applied, apply it
⋮----
// No-op if proposing the same pending slasher that hasn't taken effect yet
⋮----
// Set the pending parameters
⋮----
// Update slasher field immediately for storage consistency
⋮----
/// @notice Helper function to convert CreateSetParams to CreateSetParamsV2
/// @param params The parameters to convert
/// @param avs The AVS address that owns the operator sets, which will be the slasher
/// @return The converted parameters, into CreateSetParamsV2 format
/// @dev The slasher will be set to the AVS address
function _convertCreateSetParams(
⋮----
///                         VIEW FUNCTIONS
⋮----
/// Public View Functions
⋮----
/// @inheritdoc IAllocationManagerView
function getAVSRegistrar(
⋮----
function isRedistributingOperatorSet(
⋮----
function getAllocationDelay(
⋮----
// If there is a pending delay that can be applied, apply it
⋮----
function isOperatorSlashable(
⋮----
// slashableUntil returns the last block the operator is slashable in so we check for
// less than or equal to
⋮----
function getRedistributionRecipient(
⋮----
// Load the redistribution recipient and return it if set, otherwise return the default burn address.
⋮----
function getSlasher(
⋮----
/// External View Functions
/// These functions are delegated to the view implementation
⋮----
function getOperatorSetCount(
⋮----
function getAllocatedSets(
⋮----
function getAllocatedStrategies(
⋮----
function getAllocation(
⋮----
function getAllocations(
⋮----
function getStrategyAllocations(
⋮----
function getEncumberedMagnitude(
⋮----
function getAllocatableMagnitude(
⋮----
function getMaxMagnitude(
⋮----
function getMaxMagnitudes(
⋮----
function getMaxMagnitudesAtBlock(
⋮----
function getRegisteredSets(
⋮----
function isMemberOfOperatorSet(
⋮----
function isOperatorSet(
⋮----
function getMembers(
⋮----
function getMemberCount(
⋮----
function getStrategiesInOperatorSet(
⋮----
function getMinimumSlashableStake(
⋮----
function getAllocatedStake(
⋮----
function getPendingSlasher(
⋮----
function getSlashCount(
⋮----
function isOperatorRedistributable(
````

## File: src/contracts/core/AllocationManagerView.sol
````
// SPDX-License-Identifier: BUSL-1.1
pragma solidity ^0.8.29; // Minimum for `layout at` directive.
⋮----
import "./storage/AllocationManagerStorage.sol";
⋮----
/// @notice Non-state mutating view functions, (static) called by the `AllocationManager`.
/// @dev The `layout at 151` directive specifies that `AllocationManagerStorage` should be placed
///      starting at storage slot 151. This slot number is calculated based on the storage layout
///      of the main `AllocationManager` contract, which inherits from multiple contracts in this order:
///
///      1. Initializable
///      2. Deprecated_OwnableUpgradeable
///      3. Pausable
///      4. AllocationManagerStorage
⋮----
///      Since `AllocationManagerView` only needs access to the storage variables from
///      `AllocationManagerStorage` (without the other mixins), it uses `layout at 151` to
///      align its storage layout with the main `AllocationManager` contract.
contract AllocationManagerView layout at 151 is IAllocationManagerView, AllocationManagerStorage {
⋮----
///                         INITIALIZING FUNCTIONS
⋮----
/// @dev Initializes the DelegationManager address, the deallocation delay, and the allocation configuration delay.
⋮----
///                         INTERNAL FUNCTIONS
⋮----
/// @dev For an operator set, get the operator's effective allocated magnitude.
/// If the operator set has a pending deallocation that can be completed at the
/// current block number, this method returns a view of the allocation as if the deallocation
/// was completed.
/// @return info the effective allocated and pending magnitude for the operator set, and
/// the effective encumbered magnitude for all operator sets belonging to this strategy
function _getUpdatedAllocation(
⋮----
// If the pending change can't be completed yet, return as-is
⋮----
// Otherwise, complete the pending change and return updated info
⋮----
// If the completed change was a deallocation, update used magnitude
⋮----
/// @dev Returns the minimum allocated stake at the future block.
/// @param operatorSet The operator set to get the minimum allocated stake for.
/// @param operators The operators to get the minimum allocated stake for.
/// @param strategies The strategies to get the minimum allocated stake for.
/// @param futureBlock The future block to get the minimum allocated stake for.
function _getMinimumAllocatedStake(
⋮----
// Fetch the max magnitude and allocation for the operator/strategy.
// Prevent division by 0 if needed. This mirrors the "FullySlashed" checks
// in the DelegationManager
⋮----
// If the pending change takes effect before `futureBlock`, include it in `currentMagnitude`
// However, ONLY include the pending change if it is a deallocation, since this method
// is supposed to return the minimum slashable stake between now and `futureBlock`
⋮----
/// @dev Use safe casting when downcasting to uint64
function _addInt128(
⋮----
/// @notice Helper function to check if an operator is redistributable from a list of operator sets
/// @param operator The operator to check
/// @param operatorSets The list of operator sets to check
/// @return True if the operator is redistributable from any of the operator sets, false otherwise
function _isOperatorRedistributable(
⋮----
///                         VIEW FUNCTIONS
⋮----
/// @inheritdoc IAllocationManagerView
function getOperatorSetCount(
⋮----
function getAllocatedSets(
⋮----
function getAllocatedStrategies(
⋮----
function getAllocation(
⋮----
function getAllocations(
⋮----
function getStrategyAllocations(
⋮----
function getEncumberedMagnitude(
⋮----
function getAllocatableMagnitude(
⋮----
/// @dev For an operator, returns up-to-date amounts for current encumbered and available
/// magnitude. Note that these two values will always add up to the operator's max magnitude
/// for the strategy
function _getFreeAndUsedMagnitude(
⋮----
// This method needs to simulate clearing any pending deallocations.
// This roughly mimics the calculations done in `_clearDeallocationQueue` and
// `_getUpdatedAllocation`, while operating on a `curEncumberedMagnitude`
// rather than continually reading/updating state.
⋮----
// If we've reached a pending deallocation that isn't completable yet,
// we can stop. Any subsequent modifications will also be uncompletable.
⋮----
// The diff is a deallocation. Add to encumbered magnitude. Note that this is a deallocation
// queue and allocations aren't considered because encumbered magnitude
// is updated as soon as the allocation is created.
⋮----
// The difference between the operator's max magnitude and its encumbered magnitude
// is the magnitude that can be allocated.
⋮----
function getMaxMagnitude(
⋮----
function getMaxMagnitudes(
⋮----
function getMaxMagnitudesAtBlock(
⋮----
function getAllocationDelay(
⋮----
// If there is a pending delay that can be applied, apply it
⋮----
function getRegisteredSets(
⋮----
function isMemberOfOperatorSet(
⋮----
function isOperatorSet(
⋮----
function getMembers(
⋮----
function getMemberCount(
⋮----
function getAVSRegistrar(
⋮----
function getStrategiesInOperatorSet(
⋮----
function getMinimumSlashableStake(
⋮----
// If the operator is not slashable by the opSet, all strategies should have a slashable stake of 0
⋮----
function getAllocatedStake(
⋮----
/// This helper function returns the minimum allocated stake by taking into account deallocations at some `futureBlock`.
/// We use the block.number, as the `futureBlock`, meaning that no **future** deallocations are considered.
⋮----
function isOperatorSlashable(
⋮----
// slashableUntil returns the last block the operator is slashable in so we check for
// less than or equal to
⋮----
function getRedistributionRecipient(
⋮----
// Load the redistribution recipient and return it if set, otherwise return the default burn address.
⋮----
function isRedistributingOperatorSet(
⋮----
function getSlashCount(
⋮----
function isOperatorRedistributable(
⋮----
// Get the registered and allocated sets for the operator.
// We get both sets, since:
//    - Upon registration the operator allocation will be pending to a redistributing operator set, and as such not yet in RegisteredSets.
//    - Upon deregistration the operator is removed from RegisteredSets, but is still allocated.
⋮----
// Check if the operator is redistributable from any of the registered or allocated sets
⋮----
/// @dev Returns (address(0), 0) for non-existent operator sets or when no pending slasher change exists.
function getPendingSlasher(
⋮----
// Initialize the pending slasher and effect block to the address(0) and 0 respectively
⋮----
// If there is a pending slasher, set it
⋮----
/// @dev Returns address(0) for non-existent operator sets.
function getSlasher(
⋮----
// If there is a pending slasher that can be applied, apply it
````

## File: src/contracts/core/AVSDirectory.sol
````
// SPDX-License-Identifier: BUSL-1.1
⋮----
import "@openzeppelin-upgrades/contracts/proxy/utils/Initializable.sol";
import "@openzeppelin-upgrades/contracts/access/OwnableUpgradeable.sol";
import "@openzeppelin-upgrades/contracts/security/ReentrancyGuardUpgradeable.sol";
⋮----
import "../mixins/SignatureUtilsMixin.sol";
import "../permissions/Pausable.sol";
import "./storage/AVSDirectoryStorage.sol";
⋮----
contract AVSDirectory is
⋮----
///
///                         INITIALIZING FUNCTIONS
⋮----
/// @dev Initializes the immutable addresses of the strategy manager, delegationManager,
/// and eigenpodManager contracts
⋮----
/// @inheritdoc IAVSDirectory
function initialize(
⋮----
///                    EXTERNAL FUNCTIONS
⋮----
function updateAVSMetadataURI(
⋮----
function cancelSalt(
⋮----
// Mutate `operatorSaltIsSpent` to `true` to prevent future spending.
⋮----
///        LEGACY EXTERNAL FUNCTIONS - SUPPORT DEPRECATED IN FUTURE RELEASE AFTER SLASHING RELEASE
⋮----
function registerOperatorToAVS(
⋮----
// Assert that the `operator` is not actively registered to the AVS.
⋮----
// Assert `operator` has not already spent `operatorSignature.salt`.
⋮----
// Assert `operator` is a registered operator.
⋮----
// Assert that `operatorSignature.signature` is a valid signature for the operator AVS registration.
⋮----
// Mutate `operatorSaltIsSpent` to `true` to prevent future respending.
⋮----
// Set the operator as registered
⋮----
function deregisterOperatorFromAVS(
⋮----
// Assert that operator is registered for the AVS.
⋮----
// Set the operator as deregistered
⋮----
///                         VIEW FUNCTIONS
⋮----
function calculateOperatorAVSRegistrationDigestHash(
````

## File: src/contracts/core/DelegationManager.sol
````
// SPDX-License-Identifier: BUSL-1.1
⋮----
import "@openzeppelin-upgrades/contracts/proxy/utils/Initializable.sol";
import "@openzeppelin-upgrades/contracts/security/ReentrancyGuardUpgradeable.sol";
⋮----
import "../mixins/SignatureUtilsMixin.sol";
import "../mixins/PermissionControllerMixin.sol";
import "../mixins/Deprecated_OwnableUpgradeable.sol";
import "../permissions/Pausable.sol";
import "../libraries/SlashingLib.sol";
import "../libraries/Snapshots.sol";
import "./storage/DelegationManagerStorage.sol";
⋮----
/// @title DelegationManager
/// @author Layr Labs, Inc.
/// @notice Terms of Service: https://docs.eigenlayer.xyz/overview/terms-of-service
/// @notice  This is the contract for delegation in EigenLayer. The main functionalities of this contract are
/// - enabling anyone to register as an operator in EigenLayer
/// - allowing operators to specify parameters related to stakers who delegate to them
/// - enabling any staker to delegate its stake to the operator of its choice (a given staker can only delegate to a single operator at a time)
/// - enabling a staker to undelegate its assets from the operator it is delegated to (performed as part of the withdrawal process, initiated through the StrategyManager)
contract DelegationManager is
⋮----
// @notice Simple permission for functions that are only callable by the StrategyManager contract OR by the EigenPodManagerContract
modifier onlyStrategyManagerOrEigenPodManager() {
⋮----
modifier onlyEigenPodManager() {
⋮----
modifier onlyAllocationManager() {
⋮----
///
///                         INITIALIZING FUNCTIONS
⋮----
/// @dev Initializes the immutable addresses of the strategy manager, eigenpod manager, and allocation manager.
⋮----
function initialize(
⋮----
///                         EXTERNAL FUNCTIONS
⋮----
/// @inheritdoc IDelegationManager
function registerAsOperator(
⋮----
// delegate from the operator to themselves
⋮----
function modifyOperatorDetails(
⋮----
function updateOperatorMetadataURI(
⋮----
function delegateTo(
⋮----
// If the operator has a `delegationApprover`, check the provided signature
⋮----
// Delegate msg.sender to the operator
⋮----
function undelegate(
⋮----
// Check that the `staker` can undelegate
⋮----
// If the action is not being initiated by the staker, validate that it is initiated
// by the operator or their delegationApprover.
⋮----
function redelegate(
⋮----
// delegateTo uses msg.sender as staker
⋮----
function queueWithdrawals(
⋮----
// Remove shares from staker's strategies and place strategies/shares in queue.
// If the staker is delegated to an operator, the operator's delegated shares are also reduced
// NOTE: This will fail if the staker doesn't have the shares implied by the input parameters.
// The view function getWithdrawableShares() can be used to check what shares are available for withdrawal.
⋮----
function completeQueuedWithdrawal(
⋮----
function completeQueuedWithdrawals(
⋮----
function increaseDelegatedShares(
⋮----
/// Note: Unlike `decreaseDelegatedShares`, we don't return early if the staker has no operator.
/// This is because `_increaseDelegation` updates the staker's deposit scaling factor, which we
/// need to do even if not delegated.
⋮----
// Increase the staker's deposit scaling factor and delegate shares to the operator
⋮----
function decreaseDelegatedShares(
⋮----
// Calculate the shares to remove from the operator by calculating difference in shares
// from the newly updated beaconChainSlashingFactor
⋮----
// Decrease the operator's shares
⋮----
function slashOperatorShares(
⋮----
// Calculate the total deposit shares to slash (burn or redistribute) - slashed operator shares plus still-slashable
// shares sitting in the withdrawal queue.
⋮----
// Remove shares from operator
⋮----
staker: address(0), // we treat this as a decrease for the 0-staker (only used for events)
⋮----
// Emit event for operator shares being slashed
⋮----
///                         INTERNAL FUNCTIONS
⋮----
/// @notice Sets operator parameters in the `_operatorDetails` mapping.
/// @param operator The account registered as an operator updating their operatorDetails
/// @param newDelegationApprover The new parameters for the operator
function _setDelegationApprover(
⋮----
/// @notice Delegates *from* a `staker` *to* an `operator`.
/// @param staker The address to delegate *from* -- this address is delegating control of its own assets.
/// @param operator The address to delegate *to* -- this address is being given power to place the `staker`'s assets at risk on services
/// @dev Assumes the following is checked before calling this function:
///          1) the `staker` is not already delegated to an operator
///          2) the `operator` has indeed registered as an operator in EigenLayer
///          3) if applicable, the `operator's` `delegationApprover` signed off on delegation
/// Ensures that:
///          1) new delegations are not paused (PAUSED_NEW_DELEGATION)
function _delegate(
⋮----
// When a staker is not delegated to an operator, their deposit shares are equal to their
// withdrawable shares -- except for the beaconChainETH strategy, which is handled below
⋮----
// Retrieve the amount of slashing experienced by the operator in each strategy so far.
// When delegating, we "forgive" the staker for this slashing by adjusting their
// deposit scaling factor.
⋮----
// Delegate to the operator
⋮----
// Special case for beacon chain slashing - ensure the staker's beacon chain slashing is
// reflected in the number of shares they delegate.
⋮----
// forgefmt: disable-next-item
⋮----
/// @dev Undelegates `staker` from their operator, queueing a withdrawal for all
/// their deposited shares in the process.
⋮----
///          1) the `staker` is currently delegated to an operator
///          2) the `staker` is not an operator themselves
⋮----
///          1) the withdrawal queue is not paused (PAUSED_ENTER_WITHDRAWAL_QUEUE)
function _undelegate(
⋮----
// Undelegate the staker
⋮----
// Get all of the staker's deposited strategies/shares. These will be removed from the operator
// and queued for withdrawal.
⋮----
// For the operator and each of the staker's strategies, get the slashing factors to apply
// when queueing for withdrawal
⋮----
// Queue a withdrawal for each strategy independently. This is done for UX reasons.
⋮----
// The operator's delegated shares are also reduced.
⋮----
/// @notice Removes `sharesToWithdraw` in `strategies` from `staker` who is currently delegated to `operator` and queues a withdrawal to the `withdrawer`.
/// @param staker The staker queuing a withdrawal
/// @param operator The operator the staker is delegated to
/// @param strategies The strategies to queue a withdrawal for
/// @param depositSharesToWithdraw The amount of deposit shares the staker wishes to withdraw, must be less than staker's depositShares in storage
/// @param slashingFactors The corresponding slashing factor for the staker/operator for each strategy
⋮----
/// @dev The amount withdrawable by the staker may not actually be the same as the depositShares that are in storage in the StrategyManager/EigenPodManager.
/// This is a result of any slashing that has occurred during the time the staker has been delegated to an operator. So the proportional amount that is withdrawn
/// out of the amount withdrawable for the staker has to also be decremented from the staker's deposit shares.
/// So the amount of depositShares withdrawn out has to be proportionally scaled down depending on the slashing that has occurred.
/// Ex. Suppose as a staker, I have 100 depositShares for a strategy thats sitting in the StrategyManager in the `stakerDepositShares` mapping but I actually have been slashed 50%
/// and my real withdrawable amount is 50 shares.
/// Now when I go to withdraw 40 depositShares, I'm proportionally withdrawing 40% of my withdrawable shares. We calculate below the actual shares withdrawn via the `toShares()` function to
/// get 20 shares to queue withdraw. The end state is that I have 60 depositShares and 30 withdrawable shares now, this still accurately reflects a 50% slashing that has occurred on my existing stake.
/// @dev depositSharesToWithdraw are converted to sharesToWithdraw using the `toShares` library function. sharesToWithdraw are then divided by the current maxMagnitude of the operator (at queue time)
/// and this value is stored in the Withdrawal struct as `scaledShares.
/// Upon completion the `scaledShares` are then multiplied by the maxMagnitude of the operator at completion time. This is how we factor in any slashing events
/// that occurred during the withdrawal delay period. Shares in a withdrawal are no longer slashable once the withdrawal is completable.
/// @dev If the `operator` is indeed an operator, then the operator's delegated shares in the `strategies` are also decreased appropriately.
function _removeSharesAndQueueWithdrawal(
⋮----
// Remove shares from staker and operator
// Each of these operations fail if we attempt to remove more shares than exist
⋮----
// Calculate how many shares can be withdrawn after factoring in slashing
⋮----
// Scale shares for queue withdrawal
⋮----
// Remove delegated shares from the operator
⋮----
// Staker was delegated and remains slashable during the withdrawal delay period
// Cumulative withdrawn scaled shares are updated for the strategy, this is for accounting
// purposes for burning shares if slashed
⋮----
// Remove deposit shares from EigenPodManager/StrategyManager
⋮----
// Create queue entry and increment withdrawal nonce
⋮----
/// @dev This function completes a queued withdrawal for a staker.
/// This will apply any slashing that has occurred since the the withdrawal was queued by multiplying the withdrawal's
/// scaledShares by the operator's maxMagnitude for each strategy. This ensures that any slashing that has occurred
/// during the period the withdrawal was queued until its slashableUntil block is applied to the withdrawal amount.
/// If receiveAsTokens is true, then these shares will be withdrawn as tokens.
/// If receiveAsTokens is false, then they will be redeposited according to the current operator the staker is delegated to,
/// and added back to the operator's delegatedShares.
function _completeQueuedWithdrawal(
⋮----
// slashableUntil is block inclusive so we need to check if the current block is strictly greater than the slashableUntil block
// meaning the withdrawal can be completed.
⋮----
// Given the max magnitudes of the operator the staker was originally delegated to, calculate
// the slashing factors for each of the withdrawal's strategies.
⋮----
// Remove the withdrawal from the queue. Note that for legacy withdrawals, the removals
// from `_stakerQueuedWithdrawalRoots` and `queuedWithdrawals` will no-op.
⋮----
// Given the max magnitudes of the operator the staker is now delegated to, calculate the current
// slashing factors to apply to each withdrawal if it is received as shares.
⋮----
// Calculate how much slashing to apply, as well as shares to withdraw
⋮----
//Do nothing if 0 shares to withdraw
⋮----
// Withdraws `shares` in `strategy` to `withdrawer`. If the shares are virtual beaconChainETH shares,
// then a call is ultimately forwarded to the `staker`s EigenPod; otherwise a call is ultimately forwarded
// to the `strategy` with info on the `token`.
⋮----
// Award shares back in StrategyManager/EigenPodManager.
⋮----
// Update the staker's deposit scaling factor and delegate shares to their operator
⋮----
/// @notice Increases `operator`s depositedShares in `strategy` based on staker's addedDepositShares
/// and updates the staker's depositScalingFactor for the strategy.
/// @param operator The operator to increase the delegated delegatedShares for
/// @param staker The staker to increase the depositScalingFactor for
/// @param strategy The strategy to increase the delegated delegatedShares and the depositScalingFactor for
/// @param prevDepositShares The number of delegated deposit shares the staker had in the strategy prior to the increase
/// @param addedShares The shares added to the staker in the StrategyManager/EigenPodManager
/// @param slashingFactor The current slashing factor for the staker/operator/strategy
function _increaseDelegation(
⋮----
// Ensure that the operator has not been fully slashed for a strategy
// and that the staker has not been fully slashed if it is the beaconChainStrategy
// This is to prevent a divWad by 0 when updating the depositScalingFactor
⋮----
// If `addedShares` is 0, do nothing
⋮----
// Update the staker's depositScalingFactor. This only results in an update
// if the slashing factor has changed for this strategy.
⋮----
// If the staker is delegated to an operator, update the operator's shares
⋮----
/// @notice Decreases `operator`s shares in `strategy` based on staker's removed shares
/// @param operator The operator to decrease the delegated delegated shares for
/// @param staker The staker to decrease the delegated delegated shares for
/// @param strategy The strategy to decrease the delegated delegated shares for
/// @param sharesToDecrease The shares to remove from the operator's delegated shares
function _decreaseDelegation(
⋮----
// Decrement operator shares
⋮----
/// @dev If `operator` has configured a `delegationApprover`, check that `signature` and `salt`
/// are a valid approval for `staker` delegating to `operator`.
function _checkApproverSignature(
⋮----
// Check that the salt hasn't been used previously, then mark the salt as spent
⋮----
// Validate the signature
⋮----
/// @dev Calculate the amount of slashing to apply to the staker's shares.
/// @dev Be mindful of rounding in `mulWad()`, it's possible for the slashing factor to round down to 0
/// even when both operatorMaxMagnitude and beaconChainSlashingFactor are non-zero. This is only possible
/// in an edge case where the operator has a very low maxMagnitude.
function _getSlashingFactor(
⋮----
/// @dev Calculate the amount of slashing to apply to the staker's shares across multiple strategies
function _getSlashingFactors(
⋮----
/// Note: specifically checks the operator's magnitude at a prior block, used for completing withdrawals
function _getSlashingFactorsAtBlock(
⋮----
/// @dev Calculate amount of slashable shares that would be slashed from the queued withdrawals from an operator for a strategy
/// given the previous maxMagnitude and the new maxMagnitude.
/// Note: To get the total amount of slashable shares in the queue withdrawable, set newMaxMagnitude to 0 and prevMaxMagnitude
/// is the current maxMagnitude of the operator.
function _getSlashableSharesInQueue(
⋮----
// A maxMagnitude of 0 means the operator has been fully slashed (100%).
// There's nothing left to slash, so slashable shares in the queue is 0.
⋮----
// We want ALL shares added to the withdrawal queue in the window [block.number - MIN_WITHDRAWAL_DELAY_BLOCKS, block.number]
//
// To get this, we take the current shares in the withdrawal queue and subtract the number of shares
// that were in the queue before MIN_WITHDRAWAL_DELAY_BLOCKS.
⋮----
// The difference between these values is the number of scaled shares that entered the withdrawal queue
// less than or equal to MIN_WITHDRAWAL_DELAY_BLOCKS ago. These shares are still slashable.
⋮----
// Convert scaled shares to slashed withdrawable shares.
⋮----
// @dev Math derivation (where n is the pre-slash state):
//   - depositShares (s_n): shares stored in StrategyManager/EigenPodManager
//   - depositScalingFactor (k_n): staker's scaling factor, initialized to 1
//   - prevMaxMagnitude (m_n): operator's previous magnitude, starts at WAD, decreases on slash
//   - newMaxMagnitude (m_(n+1)): operator's new magnitude, <= prevMaxMagnitude
//   - operatorShares: s_n * k_n * m_n (withdrawable shares)
//   - scaledShares: s_n * k_n (stored when queueing withdrawal)
⋮----
// We want: operatorShares slashed = s_n * k_n * m_n - s_n * k_n * m_(n+1)
⋮----
// calcSlashedAmount computes: opShares - opShares * m_(n+1) / m_n
//   = s_n * k_n * m_n - s_n * k_n * m_n * m_(n+1) / m_n
//   = s_n * k_n * m_n - s_n * k_n * m_(n+1)  ✓
⋮----
// So we pass: operatorShares = scaledShares * m_n = s_n * k_n * m_n
⋮----
/// @dev Add to the cumulative withdrawn scaled shares from an operator for a given strategy
function _addQueuedSlashableShares(
⋮----
/// @dev Get the shares from a queued withdrawal.
function _getSharesByWithdrawalRoot(
⋮----
// If the slashableUntil block is in the past, read the slashing factors at that block.
// Otherwise, read the current slashing factors. Note that if the slashableUntil block is the current block
// or in the future, then the slashing factors are still subject to change before the withdrawal is completable,
// which may result in fewer shares being withdrawn.
⋮----
/// @dev Depending on the strategy used, determine which ShareManager contract to make external calls to
function _getShareManager(
⋮----
///                         VIEW FUNCTIONS
⋮----
function isDelegated(
⋮----
function isOperator(
⋮----
function delegationApprover(
⋮----
function depositScalingFactor(
⋮----
function getOperatorShares(
⋮----
function getOperatorsShares(
⋮----
function getSlashableSharesInQueue(
⋮----
// Return amount of slashable scaled shares remaining
⋮----
function getWithdrawableShares(
⋮----
// Get the slashing factors for the staker/operator/strategies
⋮----
// Calculate the withdrawable shares based on the slashing factor
⋮----
function getDepositedShares(
⋮----
// Get a list of the staker's deposited strategies/shares in the strategy manager
⋮----
// If the staker has no beacon chain ETH shares, return any shares from the strategy manager
⋮----
// Allocate extra space for beaconChainETHStrategy and shares
⋮----
// Copy any strategy manager shares to complete array
⋮----
function queuedWithdrawals(
⋮----
function getQueuedWithdrawal(
⋮----
function getQueuedWithdrawals(
⋮----
function getQueuedWithdrawalRoots(
⋮----
function convertToDepositShares(
⋮----
// Calculate the deposit shares based on the slashing factor
⋮----
function calculateWithdrawalRoot(
⋮----
function minWithdrawalDelayBlocks() external view returns (uint32) {
⋮----
function calculateDelegationApprovalDigestHash(
⋮----
/// forgefmt: disable-next-item
````

## File: src/contracts/core/EmissionsController.sol
````
// SPDX-License-Identifier: BUSL-1.1
⋮----
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
⋮----
/// @dev Modifier that checks if the caller is the incentive council.
modifier onlyIncentiveCouncil() {
⋮----
/// -----------------------------------------------------------------------
/// Initialization
⋮----
/// @inheritdoc IEmissionsController
function initialize(
⋮----
// Set the initial owner.
⋮----
// Set the initial incentive council.
⋮----
// Set the initial paused status.
⋮----
/// Permissionless Trigger
⋮----
function sweep() external override nonReentrant onlyWhenNotPaused(PAUSED_TOKEN_FLOWS) {
⋮----
function pressButton(
⋮----
// Check if emissions have not started yet.
// Prevents minting EIGEN before the first epoch has started.
⋮----
// Check if all distributions have already been processed.
⋮----
// Mint the total amount of bEIGEN/EIGEN needed for all distributions.
⋮----
// NOTE: Approvals may not be entirely spent.
⋮----
// Max approve EIGEN for spending bEIGEN.
⋮----
// Max approve RewardsCoordinator for spending EIGEN.
⋮----
// First mint the bEIGEN in order to wrap it into EIGEN.
⋮----
// Then wrap it into EIGEN.
⋮----
// Mark the epoch as minted.
⋮----
// Calculate the start timestamp for the distribution (equivalent to `lastTimeButtonPressable()`).
⋮----
// Calculate the last index to process.
⋮----
// If length exceeds total distributions, set last index to total distributions (exclusive upper bound).
⋮----
// Process distributions starting from the next one to process...
⋮----
// Skip disabled distributions...
⋮----
// Skip distributions that haven't started yet...
⋮----
// Skip distributions that have ended (0 means infinite)...
⋮----
// Update total processed count for this epoch.
⋮----
/// @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(
⋮----
// Calculate the total amount of emissions for the distribution.
⋮----
// Success flag for the distribution.
⋮----
// Skip if the total amount is 0.
⋮----
// Skip cases where the below `amountPerSubmission` calculation would revert.
⋮----
// Calculate the amount per submission.
⋮----
// Update the rewards submissions start timestamp, duration, and amount.
⋮----
// Dispatch the `RewardsCoordinator` call based on the distribution type.
⋮----
// Emit an event for the processed distribution.
⋮----
/// @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(
⋮----
/// @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(
⋮----
if (keccak256(returnData) == REENTRANCY_ERROR_HASH) return true; // prevent reentrancy attacks
if (returnData.length == 0) return true; // prevent OOG errors
⋮----
/// Owner Functions
⋮----
function setIncentiveCouncil(
⋮----
/// @dev Internal helper to set the incentive council.
function _setIncentiveCouncil(
⋮----
// Check that new incentive council is not the zero address to prevent lost funds.
⋮----
// Set the new incentive council.
⋮----
// Emit an event for the updated incentive council.
⋮----
/// Incentive Council Functions
⋮----
function addDistribution(
⋮----
// Checks
⋮----
// Check if the distribution is disabled.
⋮----
// Can only add/update distributions if all distributions have been processed for the current epoch.
// Prevents pending weight changes from affecting the current epoch.
⋮----
// Asserts the following:
// - The start epoch is in the future.
// - The total weight of all distributions does not exceed the max total weight.
⋮----
// Effects
⋮----
// Increment the total added count for the current epoch.
⋮----
// Update return value to the next available distribution id.
// Use the current length of the distributions array as the new id.
⋮----
// Update the total weight.
⋮----
// Append the distribution to the distributions array.
⋮----
// Emit an event for the new distribution.
⋮----
function updateDistribution(
⋮----
// Update the pending total weight (will be committed when pressButton starts a new epoch).
⋮----
// Update the distribution in the distributions array.
⋮----
// Emit an event for the updated distribution.
⋮----
/// Internal Helpers
⋮----
function _checkOnlyIncentiveCouncil() internal view {
// Check if the caller is the incentive council.
⋮----
function _checkAllDistributionsProcessed(
⋮----
// Check if all distributions have been processed for the current epoch.
⋮----
function _checkDistribution(
⋮----
// Check if the operator set is registered (for OperatorSetTotalStake or OperatorSetUniqueStake distributions).
⋮----
// Check if the start epoch is in the future.
// Prevents updating a distribution to a past or current epoch.
⋮----
// After emissions start - require future epochs only
⋮----
// Check if the new total weight of all distributions exceeds max total weight.
// Prevents distributing more supply than inflation rate allows.
⋮----
// Check if rewards submissions array is empty for non-Manual distributions.
// Manual distributions handle rewards differently and don't require submissions.
⋮----
/// @dev Internal helper to check if the button is pressable.
⋮----
/// @return True if the button is pressable, false otherwise.
function _isButtonPressable(
⋮----
// If emissions haven't started yet, button is not pressable.
⋮----
// Return true if there are any unprocessed distributions for the current epoch.
⋮----
/// View
⋮----
function getCurrentEpoch() public view returns (uint256) {
// If the start time has not elapsed, default to max uint256.
⋮----
// Calculate the current epoch by dividing the time since start by the epoch length.
⋮----
function isButtonPressable() public view returns (bool) {
⋮----
function nextTimeButtonPressable() external view returns (uint256) {
⋮----
// If emissions haven't started yet, return the start time.
⋮----
// Return the start time of the next epoch.
⋮----
function lastTimeButtonPressable() external view returns (uint256) {
⋮----
// If emissions haven't started yet, return the max uint256.
⋮----
// Return the start time of the current epoch.
⋮----
function getTotalProcessableDistributions() public view returns (uint256) {
⋮----
// Before emissions start, return the full count since distributions added
// before emissions are not tracked as "added in current epoch"
⋮----
function getDistribution(
⋮----
function getDistributions(
⋮----
// Avoid out-of-bounds error.
⋮----
// Create a new array in memory with the given length.
⋮----
// Copy the specified subset of distributions from the storage array to the memory array.
````

## File: src/contracts/core/ProtocolRegistry.sol
````
// SPDX-License-Identifier: BUSL-1.1
⋮----
import "@openzeppelin-upgrades/contracts/proxy/utils/Initializable.sol";
import "@openzeppelin-upgrades/contracts/access/AccessControlEnumerableUpgradeable.sol";
import "../interfaces/IPausable.sol";
import "./storage/ProtocolRegistryStorage.sol";
⋮----
contract ProtocolRegistry is Initializable, AccessControlEnumerableUpgradeable, ProtocolRegistryStorage {
⋮----
///
///                         INITIALIZING FUNCTIONS
⋮----
/// @inheritdoc IProtocolRegistry
function initialize(
⋮----
function ship(
⋮----
// Validate array lengths match
⋮----
// Update the semantic version.
⋮----
// Validate no zero addresses
⋮----
// Validate no empty names
⋮----
// Append each provided
⋮----
function configure(
⋮----
// Verify name is a shipped deployment and get its address (O(1) lookup)
⋮----
// Update the config
⋮----
// Emit the event.
⋮----
/// @dev WARNING: This function will revert if ANY pausable deployment fails to pause.
///      Ensure all deployments marked as pausable correctly implement IPausable.pauseAll().
///      A single misconfigured deployment will block the entire protocol pause.
function pauseAll() external onlyRole(PAUSER_ROLE) {
⋮----
// Iterate over all stored deployments.
⋮----
// Only attempt to pause deployments marked as pausable.
⋮----
///                             HELPER FUNCTIONS
⋮----
/// @dev Updates the semantic version of the protocol.
function _updateSemanticVersion(
⋮----
/// @dev Appends a deployment.
function _appendDeployment(
⋮----
// Clean up old config if name exists with different address
⋮----
// Store name => address mapping
⋮----
// Store deployment config
⋮----
// Emit the events.
⋮----
/// @dev Unwraps a ShortString to a uint256.
function _unwrap(
⋮----
///                              VIEW FUNCTIONS
⋮----
function version() external view virtual returns (string memory) {
⋮----
function majorVersion() external view returns (string memory) {
⋮----
function getAddress(
⋮----
function getDeployment(
⋮----
function getAllDeployments()
⋮----
function totalDeployments() public view returns (uint256) {
````

## File: src/contracts/core/ReleaseManager.sol
````
// SPDX-License-Identifier: BUSL-1.1
⋮----
import "@openzeppelin-upgrades/contracts/proxy/utils/Initializable.sol";
import "../mixins/PermissionControllerMixin.sol";
import "./storage/ReleaseManagerStorage.sol";
⋮----
contract ReleaseManager is Initializable, ReleaseManagerStorage, PermissionControllerMixin {
⋮----
///
///                         INITIALIZING FUNCTIONS
⋮----
///                         EXTERNAL FUNCTIONS
⋮----
/// @inheritdoc IReleaseManager
function publishRelease(
⋮----
// New release id is the length of the array before this call.
⋮----
// Increment total releases for this operator set.
⋮----
function publishMetadataURI(
⋮----
///                         VIEW FUNCTIONS
⋮----
function getTotalReleases(
⋮----
function getRelease(
⋮----
function getLatestRelease(
⋮----
function getLatestUpgradeByTime(
⋮----
function isValidRelease(
⋮----
function getMetadataURI(
````

## File: src/contracts/core/RewardsCoordinator.sol
````
// SPDX-License-Identifier: BUSL-1.1
⋮----
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/Merkle.sol";
import "../permissions/Pausable.sol";
import "./storage/RewardsCoordinatorStorage.sol";
import "../mixins/PermissionControllerMixin.sol";
⋮----
/// @title RewardsCoordinator
/// @author Eigen Labs Inc.
/// @notice Terms of Service: https://docs.eigenlayer.xyz/overview/terms-of-service
/// @notice  This is the contract for rewards in EigenLayer. The main functionalities of this contract are
/// - enabling any ERC20 rewards from AVSs to their operators and stakers for a given time range
/// - allowing stakers and operators to claim their earnings including a split bips for operators
/// - allowing the protocol to provide ERC20 tokens to stakers over a specified time range
contract RewardsCoordinator is
⋮----
modifier onlyRewardsUpdater() {
⋮----
modifier onlyRewardsForAllSubmitter() {
⋮----
/// -----------------------------------------------------------------------
/// Initialization
⋮----
/// @dev Sets the immutable variables for the contract
⋮----
/// @dev Initializes the addresses of the initial owner, pauser registry, rewardsUpdater and
/// configures the initial paused status, activationDelay, and defaultOperatorSplitBips.
/// @inheritdoc IRewardsCoordinator
function initialize(
⋮----
/// External Functions
⋮----
function createEigenDARewardsSubmission(
⋮----
function createAVSRewardsSubmission(
⋮----
function createRewardsForAllSubmission(
⋮----
function createRewardsForAllEarners(
⋮----
function createOperatorDirectedAVSRewardsSubmission(
⋮----
// 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.
⋮----
// Then transfer the full amount to the contract.
⋮----
// Then take the protocol fee (if the submitter is opted in for protocol fees).
⋮----
// Last update storage.
⋮----
function createOperatorDirectedOperatorSetRewardsSubmission(
⋮----
function createUniqueStakeRewardsSubmission(
⋮----
// First validate the submission.
⋮----
function createTotalStakeRewardsSubmission(
⋮----
function processClaim(
⋮----
function processClaims(
⋮----
function submitRoot(
⋮----
function disableRoot(
⋮----
function setClaimerFor(
⋮----
// Require that the earner is an operator or AVS
⋮----
function setActivationDelay(
⋮----
function setDefaultOperatorSplit(
⋮----
function setFeeRecipient(
⋮----
function setOperatorAVSSplit(
⋮----
function setOperatorPISplit(
⋮----
function setOperatorSetSplit(
⋮----
function setOptInForProtocolFee(
⋮----
function setRewardsUpdater(
⋮----
function setRewardsForAllSubmitter(
⋮----
/// 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(
⋮----
/// @notice Internal helper to process reward claims.
/// @param claim The RewardsMerkleClaims to be processed.
/// @param recipient The address recipient that receives the ERC20 rewards
function _processClaim(
⋮----
// If claimerFor earner is not set, claimer is by default the earner. Else set to claimerFor
⋮----
// Calculate amount to claim and update cumulativeClaimed
⋮----
function _setActivationDelay(
⋮----
function _setDefaultOperatorSplit(
⋮----
function _setRewardsUpdater(
⋮----
function _setClaimer(
⋮----
function _setFeeRecipient(
⋮----
/// @notice Internal helper to set the operator split.
/// @param operatorSplit The split struct for an Operator
/// @param split The split in basis points.
/// @param activatedAt The timestamp when the split is activated.
function _setOperatorSplit(
⋮----
// If the operator split has not been initialized yet, set the old split to `type(uint16).max` as a flag.
⋮----
function _setOptInForProtocolFee(
⋮----
/// @notice Common checks for all RewardsSubmissions.
function _validateCommonRewardsSubmission(
⋮----
// Require reward submission is for whitelisted strategy or beaconChainETHStrategy
⋮----
/// @notice Validate a RewardsSubmission. Called from both `createAVSRewardsSubmission` and `createRewardsForAllSubmission`
function _validateRewardsSubmission(
⋮----
/// @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 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(
⋮----
// Check that each operator is a non-zero address.
⋮----
// Check that each operator is in ascending order.
⋮----
// Check that each operator reward amount is non-zero.
⋮----
// Increment the total amount before fees by the operator reward amount.
⋮----
// Take the protocol fee (if the submitter is opted in for protocol fees).
⋮----
function _checkClaim(
⋮----
// Verify inclusion of earners leaf (earner, earnerTokenRoot) in the distribution root
⋮----
// For each of the tokenLeaf proofs, verify inclusion of token tree leaf again the earnerTokenRoot
⋮----
/// @notice verify inclusion of the token claim proof in the earner token root hash (earnerTokenRoot).
/// The token leaf comprises of the IERC20 token and cumulativeAmount of earnings.
/// @param earnerTokenRoot root hash of the earner token subtree
/// @param tokenLeafIndex index of the token leaf
/// @param tokenProof proof of the token leaf in the earner token subtree
/// @param tokenLeaf token leaf to be verified
function _verifyTokenClaimProof(
⋮----
// Validate index size so that there aren't multiple valid indices for the given proof
// index can't be greater than 2**(tokenProof/32)
⋮----
// Verify inclusion of token leaf
⋮----
/// @notice verify inclusion of earner claim proof in the distribution root. This verifies
/// the inclusion of the earner and earnerTokenRoot hash in the tree. The token claims are proven separately
/// against the earnerTokenRoot hash (see _verifyTokenClaimProof). The earner leaf comprises of (earner, earnerTokenRoot)
/// @param root distribution root that should be read from storage
/// @param earnerLeafIndex index of the earner leaf
/// @param earnerProof proof of the earners account root in the merkle tree
/// @param earnerLeaf leaf of earner merkle tree containing the earner address and earner's token root hash
function _verifyEarnerClaimProof(
⋮----
// index can't be greater than 2**(earnerProof/32)
⋮----
// Verify inclusion of earner leaf
⋮----
// forgefmt: disable-next-item
⋮----
/// @notice Internal helper to get the operator split in basis points.
/// @dev It takes default split and activation delay into account while calculating the split.
⋮----
/// @return The split in basis points.
function _getOperatorSplit(
⋮----
// Return the Default Operator Split if the operator split has not been initialized.
// Also return the Default Operator Split if the operator split has been initialized but not activated yet. (i.e the first initialization)
⋮----
// Return the new split if the new split has been activated, else return the old split.
⋮----
/// @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(
⋮----
/// @notice Internal helper to take protocol fees from a operator-directed rewards submission.
⋮----
/// @param amountAfterFee The amount after the protocol fee is taken.
function _takeOperatorDirectedProtocolFee(
⋮----
/// External View Functions
⋮----
function calculateEarnerLeafHash(
⋮----
function calculateTokenLeafHash(
⋮----
function checkClaim(
⋮----
function getOperatorAVSSplit(
⋮----
function getOperatorPISplit(
⋮----
function getOperatorSetSplit(
⋮----
function getDistributionRootsLength() public view returns (uint256) {
⋮----
function getDistributionRootAtIndex(
⋮----
function getCurrentDistributionRoot() external view returns (DistributionRoot memory) {
⋮----
function getCurrentClaimableDistributionRoot() external view returns (DistributionRoot memory) {
⋮----
// Silence compiler warning.
⋮----
function getRootIndexFromHash(
````

## File: src/contracts/core/StrategyManager.sol
````
// SPDX-License-Identifier: BUSL-1.1
⋮----
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 "../mixins/SignatureUtilsMixin.sol";
import "../interfaces/IEigenPodManager.sol";
import "../permissions/Pausable.sol";
import "./storage/StrategyManagerStorage.sol";
⋮----
/// @title The primary entry- and exit-point for funds into and out of EigenLayer.
/// @author Layr Labs, Inc.
/// @notice Terms of Service: https://docs.eigenlayer.xyz/overview/terms-of-service
/// @notice This contract is for managing deposits in different strategies. The main
/// functionalities are:
/// - adding and removing strategies that any delegator can deposit into
/// - enabling deposit of assets into specified strategy(s)
contract StrategyManager is
⋮----
modifier onlyStrategyWhitelister() {
⋮----
modifier onlyStrategiesWhitelistedForDeposit(
⋮----
modifier onlyDelegationManager() {
⋮----
/// @param _delegation The delegation contract of EigenLayer.
⋮----
// EXTERNAL FUNCTIONS
⋮----
/// @notice Initializes the strategy manager contract. Sets the `pauserRegistry` (currently **not** modifiable after being set),
/// and transfers contract ownership to the specified `initialOwner`.
/// @param initialOwner Ownership of this contract is transferred to this address.
/// @param initialStrategyWhitelister The initial value of `strategyWhitelister` to set.
function initialize(
⋮----
/// @inheritdoc IStrategyManager
function depositIntoStrategy(
⋮----
function depositIntoStrategyWithSignature(
⋮----
// Cache staker's nonce to avoid sloads.
⋮----
// Assert that the signature is valid.
⋮----
// Increment the nonce for the staker.
⋮----
// deposit the tokens (from the `msg.sender`) and credit the new shares to the `staker`
⋮----
/// @inheritdoc IShareManager
function removeDepositShares(
⋮----
function addShares(
⋮----
function withdrawSharesAsTokens(
⋮----
function increaseBurnOrRedistributableShares(
⋮----
// Create storage pointer for readability.
⋮----
// Sanity check that the strategy is not already in the slash's burn or redistributable shares.
// This should never happen because the `AllocationManager` ensures that strategies for a given slash are unique.
// Add the shares to the operator set's burn or redistributable shares.
⋮----
// NOTE: Duplicate operator sets and slash ids will not revert, but will not be added.
⋮----
function clearBurnOrRedistributableShares(
⋮----
// Get the strategies to clear.
⋮----
// Note: We don't need to iterate backwards since we're indexing into the `EnumerableMap` directly.
⋮----
function clearBurnOrRedistributableSharesByStrategy(
⋮----
function burnShares(
⋮----
// Burning acts like withdrawing, except that the destination is to the burn address.
// If we have no shares to burn, we don't need to call the strategy.
⋮----
function setStrategyWhitelister(
⋮----
function addStrategiesToDepositWhitelist(
⋮----
// change storage and emit event only if strategy is not already in whitelist
⋮----
function removeStrategiesFromDepositWhitelist(
⋮----
// change storage and emit event only if strategy is already in whitelist
⋮----
// INTERNAL FUNCTIONS
⋮----
/// @notice This function adds `shares` for a given `strategy` to the `staker` and runs through the necessary update logic.
/// @param staker The address to add shares to
/// @param strategy The Strategy in which the `staker` is receiving shares
/// @param shares The amount of shares to grant to the `staker`
/// @dev In particular, this function calls `delegation.increaseDelegatedShares(staker, strategy, shares)` to ensure that all
/// delegated shares are tracked, increases the stored share amount in `stakerDepositShares[staker][strategy]`, and adds `strategy`
/// to the `staker`'s list of strategies, if it is not in the list already.
function _addShares(
⋮----
// sanity checks on inputs
⋮----
// allow the strategy to veto or enforce constraints on adding shares
⋮----
// if they dont have prevDepositShares of this strategy, add it to their strats
⋮----
// add the returned depositedShares to their existing shares for this strategy
⋮----
/// @notice Internal function in which `amount` of ERC20 `token` is transferred from `msg.sender` to the Strategy-type contract
/// `strategy`, with the resulting shares credited to `staker`.
/// @param staker The address that will be credited with the new shares.
/// @param strategy The Strategy contract to deposit into.
/// @param token The ERC20 token to deposit.
/// @param amount The amount of `token` to deposit.
/// @return shares The amount of *new* shares in `strategy` that have been credited to the `staker`.
function _depositIntoStrategy(
⋮----
// transfer tokens from the sender to the strategy
⋮----
// deposit the assets into the specified strategy and get the equivalent amount of shares in that strategy
⋮----
// add the returned shares to the staker's existing shares for this strategy
⋮----
// Increase shares delegated to operator
⋮----
/// @notice Decreases the shares that `staker` holds in `strategy` by `depositSharesToRemove`.
/// @param staker The address to decrement shares from
/// @param strategy The strategy for which the `staker`'s shares are being decremented
/// @param depositSharesToRemove The amount of deposit shares to decrement
/// @dev If the amount of shares represents all of the staker`s shares in said strategy,
/// then the strategy is removed from stakerStrategyList[staker] and 'true' is returned. Otherwise 'false' is returned.
/// Also returns the user's updated deposit shares after decrement.
function _removeDepositShares(
⋮----
//check that the user has sufficient shares
⋮----
// 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
⋮----
// allow the strategy to veto or enforce constraints on removing shares
⋮----
// subtract the shares from the staker's existing shares for this strategy
⋮----
// if no existing shares, remove the strategy from the staker's dynamic array of strategies
⋮----
/// @notice Removes `strategy` from `staker`'s dynamic array of strategies, i.e. from `stakerStrategyList[staker]`
/// @param staker The user whose array will have an entry removed
/// @param strategy The Strategy to remove from `stakerStrategyList[staker]`
function _removeStrategyFromStakerStrategyList(
⋮----
//loop through all of the strategies, find the right one, then replace
⋮----
//replace the strategy with the last strategy in the list
⋮----
// if we didn't find the strategy, revert
⋮----
// pop off the last entry in the list of strategies
⋮----
/// @notice Clears burn/redistributable shares and sends underlying tokens to recipient.
/// @param operatorSet The operator set to clear the shares for.
/// @param slashId The slash id to clear the shares for.
/// @param strategy The strategy to clear the shares for.
/// @param recipient The recipient to withdraw the shares to.
function _clearBurnOrRedistributableShares(
⋮----
// Withdraw the shares to the burn address.
⋮----
// Emit an event to notify the that burnable shares have been decreased.
⋮----
// If there are no more strategies to burn or redistribute...
⋮----
// Remove the slash id from the pending slash ids.
⋮----
// If there are no more pending slash ids for this operator set, remove the operator set from the pending operator sets.
⋮----
/// @notice Internal function for modifying the `strategyWhitelister`. Used inside of the `setStrategyWhitelister` and `initialize` functions.
/// @param newStrategyWhitelister The new address for the `strategyWhitelister` to take.
function _setStrategyWhitelister(
⋮----
// VIEW FUNCTIONS
⋮----
function getDeposits(
⋮----
function getStakerStrategyList(
⋮----
function stakerStrategyListLength(
⋮----
function calculateStrategyDepositDigestHash(
⋮----
/// forgefmt: disable-next-item
⋮----
function getBurnOrRedistributableShares(
⋮----
// Store the data structure for readability
⋮----
function getBurnOrRedistributableCount(
⋮----
function getBurnableShares(
⋮----
function getStrategiesWithBurnableShares() external view returns (address[] memory, uint256[] memory) {
⋮----
function getPendingOperatorSets() external view returns (OperatorSet[] memory) {
⋮----
function getPendingSlashIds(
````

## File: src/contracts/interfaces/IAllocationManager.sol
````
// SPDX-License-Identifier: BUSL-1.1
⋮----
import {OperatorSet} from "../libraries/OperatorSetLib.sol";
import "./IDelegationManager.sol";
import "./IPauserRegistry.sol";
import "./IPausable.sol";
import "./IStrategy.sol";
import "./IAVSRegistrar.sol";
⋮----
interface IAllocationManagerErrors {
/// Input Validation
/// @dev Thrown when `wadToSlash` is zero or greater than 1e18
⋮----
/// @dev Thrown when two array parameters have mismatching lengths.
⋮----
/// @dev Thrown when the AVSRegistrar is not correctly configured to prevent an AVSRegistrar contract
/// from being used with the wrong AVS
⋮----
/// @dev Thrown when an invalid strategy is provided.
⋮----
/// @dev Thrown when an invalid redistribution recipient is provided.
⋮----
/// @dev Thrown when an operatorSet is already migrated
⋮----
/// Caller
⋮----
/// @dev Thrown when caller is not authorized to call a function.
⋮----
/// Operator Status
⋮----
/// @dev Thrown when an invalid operator is provided.
⋮----
/// @dev Thrown when an invalid avs whose metadata is not registered is provided.
⋮----
/// @dev Thrown when an operator's allocation delay has yet to be set.
⋮----
/// @dev Thrown when attempting to slash an operator when they are not slashable.
⋮----
/// @dev Thrown when trying to add an operator to a set they are already a member of
⋮----
/// @dev Thrown when trying to slash/remove an operator from a set they are not a member of
⋮----
/// Operator Set Status
⋮----
/// @dev Thrown when an invalid operator set is provided.
⋮----
/// @dev Thrown when provided `strategies` are not in ascending order.
⋮----
/// @dev Thrown when trying to add a strategy to an operator set that already contains it.
⋮----
/// @dev Thrown when a strategy is referenced that does not belong to an operator set.
⋮----
/// Modifying Allocations
⋮----
/// @dev Thrown when an operator attempts to set their allocation for an operatorSet to the same value
⋮----
/// @dev Thrown when an allocation is attempted for a given operator when they have pending allocations or deallocations.
⋮----
/// @dev Thrown when an allocation is attempted that exceeds a given operators total allocatable magnitude.
⋮----
/// SlasherStatus
⋮----
/// @dev Thrown when an operator set does not have a slasher set
⋮----
interface IAllocationManagerTypes {
/// @notice Defines allocation information from a strategy to an operator set, for an operator
/// @param currentMagnitude the current magnitude allocated from the strategy to the operator set
/// @param pendingDiff a pending change in magnitude, if it exists (0 otherwise)
/// @param effectBlock the block at which the pending magnitude diff will take effect
⋮----
/// @notice Slasher configuration for an operator set.
/// @param slasher The current effective slasher address. Updated immediately when instantEffectBlock=true
///        (e.g., during operator set creation or migration).
/// @param pendingSlasher The slasher address that will become effective at effectBlock.
/// @param effectBlock The block number at which pendingSlasher becomes the effective slasher.
/// @dev It is not possible for the slasher to be the 0 address, which is used to denote if the slasher is not set
⋮----
/// @notice Allocation delay configuration for an operator.
/// @param delay The current effective allocation delay. Updated immediately for newly registered operators.
/// @param isSet Whether the allocation delay has been configured. True immediately for newly registered operators.
/// @param pendingDelay The allocation delay that will become effective at effectBlock.
/// @param effectBlock The block number at which pendingDelay becomes the effective delay.
⋮----
/// @notice Contains registration details for an operator pertaining to an operator set
/// @param registered Whether the operator is currently registered for the operator set
/// @param slashableUntil If the operator is not registered, they are still slashable until
/// this block is reached.
⋮----
/// @notice Contains allocation info for a specific strategy
/// @param maxMagnitude the maximum magnitude that can be allocated between all operator sets
/// @param encumberedMagnitude the currently-allocated magnitude for the strategy
⋮----
/// @notice Struct containing parameters to slashing
/// @param operator the address to slash
/// @param operatorSetId the ID of the operatorSet the operator is being slashed on behalf of
/// @param strategies the set of strategies to slash
/// @param wadsToSlash the parts in 1e18 to slash, this will be proportional to the operator's
/// slashable stake allocation for the operatorSet
/// @param description the description of the slashing provided by the AVS for legibility
⋮----
/// @notice struct used to modify the allocation of slashable magnitude to an operator set
/// @param operatorSet the operator set to modify the allocation for
/// @param strategies the strategies to modify allocations for
/// @param newMagnitudes the new magnitude to allocate for each strategy to this operator set
⋮----
/// @notice Parameters used to register for an AVS's operator sets
/// @param avs the AVS being registered for
/// @param operatorSetIds the operator sets within the AVS to register for
/// @param data extra data to be passed to the AVS to complete registration
⋮----
/// @notice Parameters used to deregister from an AVS's operator sets
/// @param operator the operator being deregistered
/// @param avs the avs being deregistered from
/// @param operatorSetIds the operator sets within the AVS being deregistered from
⋮----
/// @notice Parameters used by an AVS to create new operator sets
/// @param operatorSetId the id of the operator set to create
/// @param strategies the strategies to add as slashable to the operator set
/// @dev This struct and its associated method will be deprecated in Early Q2 2026
⋮----
/// @param slasher the address that will be the slasher for the operator set
⋮----
interface IAllocationManagerEvents is IAllocationManagerTypes {
/// @notice Emitted when operator updates their allocation delay.
event AllocationDelaySet(address operator, uint32 delay, uint32 effectBlock);
⋮----
/// @notice Emitted when an operator set's slasher is updated.
event SlasherUpdated(OperatorSet operatorSet, address slasher, uint32 effectBlock);
⋮----
/// @notice Emitted when an operator set's slasher is migrated.
event SlasherMigrated(OperatorSet operatorSet, address slasher);
⋮----
/// @notice Emitted when an operator's magnitude is updated for a given operatorSet and strategy
event AllocationUpdated(
⋮----
/// @notice Emitted when operator's encumbered magnitude is updated for a given strategy
event EncumberedMagnitudeUpdated(address operator, IStrategy strategy, uint64 encumberedMagnitude);
⋮----
/// @notice Emitted when an operator's max magnitude is updated for a given strategy
event MaxMagnitudeUpdated(address operator, IStrategy strategy, uint64 maxMagnitude);
⋮----
/// @notice Emitted when an operator is slashed by an operator set for a strategy
/// `wadSlashed` is the proportion of the operator's total delegated stake that was slashed
event OperatorSlashed(
⋮----
/// @notice Emitted when an AVS configures the address that will handle registration/deregistration
event AVSRegistrarSet(address avs, IAVSRegistrar registrar);
⋮----
/// @notice Emitted when an AVS updates their metadata URI (Uniform Resource Identifier).
/// @dev The URI is never stored; it is simply emitted through an event for off-chain indexing.
event AVSMetadataURIUpdated(address indexed avs, string metadataURI);
⋮----
/// @notice Emitted when an operator set is created by an AVS.
event OperatorSetCreated(OperatorSet operatorSet);
⋮----
/// @notice Emitted when an operator is added to an operator set.
event OperatorAddedToOperatorSet(address indexed operator, OperatorSet operatorSet);
⋮----
/// @notice Emitted when an operator is removed from an operator set.
event OperatorRemovedFromOperatorSet(address indexed operator, OperatorSet operatorSet);
⋮----
/// @notice Emitted when a redistributing operator set is created by an AVS.
event RedistributionAddressSet(OperatorSet operatorSet, address redistributionRecipient);
⋮----
/// @notice Emitted when a strategy is added to an operator set.
event StrategyAddedToOperatorSet(OperatorSet operatorSet, IStrategy strategy);
⋮----
/// @notice Emitted when a strategy is removed from an operator set.
event StrategyRemovedFromOperatorSet(OperatorSet operatorSet, IStrategy strategy);
⋮----
interface IAllocationManagerStorage is IAllocationManagerEvents {
/// @notice The DelegationManager contract for EigenLayer
function delegation() external view returns (IDelegationManager);
⋮----
/// @notice The Eigen strategy contract
/// @dev Cannot be added to redistributing operator sets
function eigenStrategy() external view returns (IStrategy);
⋮----
/// @notice Returns the number of blocks between an operator deallocating magnitude and the magnitude becoming
/// unslashable and then being able to be reallocated to another operator set. Note that unlike the allocation delay
/// which is configurable by the operator, the DEALLOCATION_DELAY is globally fixed and cannot be changed.
function DEALLOCATION_DELAY() external view returns (uint32 delay);
⋮----
/// @notice Delay before alloaction delay modifications take effect.
function ALLOCATION_CONFIGURATION_DELAY() external view returns (uint32);
⋮----
/// @notice Delay before slasher changes take effect.
/// @dev Currently set to the same value as ALLOCATION_CONFIGURATION_DELAY.
function SLASHER_CONFIGURATION_DELAY() external view returns (uint32);
⋮----
interface IAllocationManagerActions is IAllocationManagerErrors, IAllocationManagerEvents, IAllocationManagerStorage {
/// @dev Initializes the initial owner and paused status.
function initialize(
⋮----
/// @notice Called by an AVS to slash an operator in a given operator set. The operator must be registered
/// and have slashable stake allocated to the operator set.
///
/// @param avs The AVS address initiating the slash.
/// @param params The slashing parameters, containing:
///  - operator: The operator to slash.
///  - operatorSetId: The ID of the operator set the operator is being slashed from.
///  - strategies: Array of strategies to slash allocations from (must be in ascending order).
///  - wadsToSlash: Array of proportions to slash from each strategy (must be between 0 and 1e18).
///  - description: Description of why the operator was slashed.
⋮----
/// @return slashId The ID of the slash.
/// @return shares The amount of shares that were slashed for each strategy.
⋮----
/// @dev For each strategy:
///      1. Reduces the operator's current allocation magnitude by wadToSlash proportion.
///      2. Reduces the strategy's max and encumbered magnitudes proportionally.
///      3. If there is a pending deallocation, reduces it proportionally.
///      4. Updates the operator's shares in the DelegationManager.
⋮----
/// @dev Small slashing amounts may not result in actual token burns due to
///      rounding, which will result in small amounts of tokens locked in the contract
///      rather than fully burning through the burn mechanism.
function slashOperator(
⋮----
/// @notice Modifies the proportions of slashable stake allocated to an operator set from a list of strategies
/// Note that deallocations remain slashable for DEALLOCATION_DELAY blocks therefore when they are cleared they may
/// free up less allocatable magnitude than initially deallocated.
/// @param operator the operator to modify allocations for
/// @param params array of magnitude adjustments for one or more operator sets
/// @dev Updates encumberedMagnitude for the updated strategies
function modifyAllocations(
⋮----
/// @notice This function takes a list of strategies and for each strategy, removes from the deallocationQueue
/// all clearable deallocations up to max `numToClear` number of deallocations, updating the encumberedMagnitude
/// of the operator as needed.
⋮----
/// @param operator address to clear deallocations for
/// @param strategies a list of strategies to clear deallocations for
/// @param numToClear a list of number of pending deallocations to clear for each strategy
⋮----
/// @dev can be called permissionlessly by anyone
function clearDeallocationQueue(
⋮----
/// @notice Allows an operator to register for one or more operator sets for an AVS. If the operator
/// has any stake allocated to these operator sets, it immediately becomes slashable.
/// @dev After registering within the ALM, this method calls the AVS Registrar's `IAVSRegistrar.
/// registerOperator` method to complete registration. This call MUST succeed in order for
/// registration to be successful.
function registerForOperatorSets(
⋮----
/// @notice Allows an operator or AVS to deregister the operator from one or more of the AVS's operator sets.
/// If the operator has any slashable stake allocated to the AVS, it remains slashable until the
/// DEALLOCATION_DELAY has passed.
/// @dev After deregistering within the ALM, this method calls the AVS Registrar's `IAVSRegistrar.
/// deregisterOperator` method to complete deregistration. This call MUST succeed in order for
/// deregistration to be successful.
function deregisterFromOperatorSets(
⋮----
/// @notice Called by the delegation manager OR an operator to set an operator's allocation delay.
/// This is set when the operator first registers, and is the number of blocks between an operator
/// allocating magnitude to an operator set, and the magnitude becoming slashable.
/// @param operator The operator to set the delay on behalf of.
/// @param delay the allocation delay in blocks
/// @dev When the delay is set for a newly-registered operator (via the `DelegationManager.registerAsOperator` method),
/// the delay will take effect immediately, allowing for operators to allocate slashable stake immediately.
/// Else, the delay will take effect after `ALLOCATION_CONFIGURATION_DELAY` blocks.
function setAllocationDelay(
⋮----
/// @notice Called by an AVS to configure the address that is called when an operator registers
/// or is deregistered from the AVS's operator sets. If not set (or set to 0), defaults
/// to the AVS's address.
/// @param registrar the new registrar address
function setAVSRegistrar(
⋮----
///  @notice Called by an AVS to emit an `AVSMetadataURIUpdated` event indicating the information has updated.
⋮----
///  @param metadataURI The URI for metadata associated with an AVS.
⋮----
///  @dev Note that the `metadataURI` is *never stored* and is only emitted in the `AVSMetadataURIUpdated` event.
function updateAVSMetadataURI(
⋮----
/// @notice Allows an AVS to create new operator sets, defining strategies that the operator set uses
/// @dev Upon creation, the address that can slash the operatorSet is the `avs` address. If you would like to use a different address,
///      use the `createOperatorSets` method which takes in `CreateSetParamsV2` instead.
/// @dev THIS FUNCTION WILL BE DEPRECATED IN EARLY Q2 2026 IN FAVOR OF `createOperatorSets`, WHICH TAKES IN `CreateSetParamsV2`
/// @dev Reverts for:
///      - NonexistentAVSMetadata: The AVS metadata is not registered
///      - InvalidOperatorSet: The operatorSet already exists
///      - InputAddressZero: The slasher is the zero address
function createOperatorSets(
⋮----
/// @notice Allows an AVS to create new Redistribution operator sets.
/// @param avs The AVS creating the new operator sets.
/// @param params An array of operator set creation parameters.
/// @param redistributionRecipients An array of addresses that will receive redistributed funds when operators are slashed.
/// @dev Same logic as `createOperatorSets`, except `redistributionRecipients` corresponding to each operator set are stored.
///      Additionally, emits `RedistributionOperatorSetCreated` event instead of `OperatorSetCreated` for each created operator set.
/// @dev The address that can slash the operatorSet is the `avs` address. If you would like to use a different address,
⋮----
/// @dev THIS FUNCTION WILL BE DEPRECATED IN EARLY Q2 2026 IN FAVOR OF `createRedistributingOperatorSets` WHICH TAKES IN `CreateSetParamsV2`
⋮----
///      - InputArrayLengthMismatch: The length of the params array does not match the length of the redistributionRecipients array
⋮----
///      - InputAddressZero: The redistribution recipient is the zero address
///      - InvalidRedistributionRecipient: The redistribution recipient is the zero address or the default burn address
⋮----
///      - InvalidStrategy: The strategy is the BEACONCHAIN_ETH_STRAT or the EIGEN strategy
⋮----
function createRedistributingOperatorSets(
⋮----
/// @notice Allows an AVS to add strategies to an operator set
/// @dev Strategies MUST NOT already exist in the operator set
/// @dev If the operatorSet is redistributing, the `BEACONCHAIN_ETH_STRAT` may not be added, since redistribution is not supported for native eth
/// @param avs the avs to set strategies for
/// @param operatorSetId the operator set to add strategies to
/// @param strategies the strategies to add
function addStrategiesToOperatorSet(
⋮----
/// @notice Allows an AVS to remove strategies from an operator set
/// @dev Strategies MUST already exist in the operator set
/// @param avs the avs to remove strategies for
/// @param operatorSetId the operator set to remove strategies from
/// @param strategies the strategies to remove
function removeStrategiesFromOperatorSet(
⋮----
/// @notice Allows an AVS to update the slasher for an operator set
/// @param operatorSet the operator set to update the slasher for
/// @param slasher the new slasher
/// @dev The new slasher will take effect after `SLASHER_CONFIGURATION_DELAY` blocks.
/// @dev No-op if the proposed slasher is already pending and hasn't taken effect yet (delay countdown is not restarted).
/// @dev The slasher can only be updated if it has already been set. The slasher is set either on operatorSet creation or,
///      for operatorSets created prior to v1.9.0, via `migrateSlashers`
⋮----
///      - InvalidCaller: The caller cannot update the slasher for the operator set (set via the `PermissionController`)
///      - InvalidOperatorSet: The operator set does not exist
///      - SlasherNotSet: The slasher has not been set yet
⋮----
function updateSlasher(
⋮----
/// @notice Allows any address to migrate the slasher from the permission controller to the ALM
/// @param operatorSets the list of operator sets to migrate the slasher for
/// @dev This function is used to migrate the slasher from the permission controller to the ALM for operatorSets created prior to `v1.9.0`
/// @dev Migrates based on the following rules:
///      - If there is no slasher set or the slasher in the `PermissionController`is the 0 address, the AVS address will be set as the slasher
///      - If there are multiple slashers set in the `PermissionController`, the first address will be set as the slasher
/// @dev A migration can only be completed once for a given operatorSet
/// @dev This function will be deprecated in Early Q2 2026. EigenLabs will migrate the slasher for all operatorSets created prior to `v1.9.0`
/// @dev This function does not revert to allow for simpler offchain calling. It will no-op if:
///      - The operator set does not exist
///      - The slasher has already been set, either via migration or creation of the operatorSet
/// @dev WARNING: Gas cost is O(appointees) per operator set due to `PermissionController.getAppointees()` call.
///      May exceed block gas limit for AVSs with large appointee sets. Consider batching operator sets if needed.
function migrateSlashers(
⋮----
interface IAllocationManagerView is IAllocationManagerErrors, IAllocationManagerEvents, IAllocationManagerStorage {
⋮----
///                         VIEW FUNCTIONS
⋮----
/// @notice Returns the number of operator sets for the AVS
/// @param avs the AVS to query
function getOperatorSetCount(
⋮----
/// @notice Returns the list of operator sets the operator has current or pending allocations/deallocations in
/// @param operator the operator to query
/// @return the list of operator sets the operator has current or pending allocations/deallocations in
function getAllocatedSets(
⋮----
/// @notice Returns the list of strategies an operator has current or pending allocations/deallocations from
/// given a specific operator set.
⋮----
/// @param operatorSet the operator set to query
/// @return the list of strategies
function getAllocatedStrategies(
⋮----
/// @notice Returns the current/pending stake allocation an operator has from a strategy to an operator set
⋮----
/// @param strategy the strategy to query
/// @return the current/pending stake allocation
function getAllocation(
⋮----
/// @notice Returns the current/pending stake allocations for multiple operators from a strategy to an operator set
/// @param operators the operators to query
⋮----
/// @return each operator's allocation
function getAllocations(
⋮----
/// @notice Given a strategy, returns a list of operator sets and corresponding stake allocations.
/// @dev Note that this returns a list of ALL operator sets the operator has allocations in. This means
/// some of the returned allocations may be zero.
⋮----
/// @return the list of all operator sets the operator has allocations for
/// @return the corresponding list of allocations from the specific `strategy`
function getStrategyAllocations(
⋮----
/// @notice For a strategy, get the amount of magnitude that is allocated across one or more operator sets
⋮----
/// @param strategy the strategy to get allocatable magnitude for
/// @return currently allocated magnitude
function getEncumberedMagnitude(
⋮----
/// @notice For a strategy, get the amount of magnitude not currently allocated to any operator set
⋮----
/// @return magnitude available to be allocated to an operator set
function getAllocatableMagnitude(
⋮----
/// @notice Returns the maximum magnitude an operator can allocate for the given strategy
/// @dev The max magnitude of an operator starts at WAD (1e18), and is decreased anytime
/// the operator is slashed. This value acts as a cap on the max magnitude of the operator.
⋮----
/// @param strategy the strategy to get the max magnitude for
/// @return the max magnitude for the strategy
function getMaxMagnitude(
⋮----
/// @notice Returns the maximum magnitude an operator can allocate for the given strategies
⋮----
/// @param strategies the strategies to get the max magnitudes for
/// @return the max magnitudes for each strategy
function getMaxMagnitudes(
⋮----
/// @notice Returns the maximum magnitudes each operator can allocate for the given strategy
⋮----
/// @param strategy the strategy to get the max magnitudes for
/// @return the max magnitudes for each operator
⋮----
/// at a given block number
⋮----
/// @param blockNumber the blockNumber at which to check the max magnitudes
⋮----
function getMaxMagnitudesAtBlock(
⋮----
/// @notice Returns the time in blocks between an operator allocating slashable magnitude
/// and the magnitude becoming slashable. If the delay has not been set, `isSet` will be false.
/// @dev The operator must have a configured delay before allocating magnitude
/// @param operator The operator to query
/// @return isSet Whether the operator has configured a delay
/// @return delay The time in blocks between allocating magnitude and magnitude becoming slashable
function getAllocationDelay(
⋮----
/// @notice Returns a list of all operator sets the operator is registered for
/// @param operator The operator address to query.
function getRegisteredSets(
⋮----
/// @notice Returns whether the operator is registered for the operator set
⋮----
/// @param operatorSet The operator set to query
function isMemberOfOperatorSet(
⋮----
/// @notice Returns whether the operator set exists
function isOperatorSet(
⋮----
/// @notice Returns all the operators registered to an operator set
/// @param operatorSet The operatorSet to query.
function getMembers(
⋮----
/// @notice Returns the number of operators registered to an operatorSet.
/// @param operatorSet The operatorSet to get the member count for
function getMemberCount(
⋮----
/// @notice Returns the address that handles registration/deregistration for the AVS
/// If not set, defaults to the input address (`avs`)
function getAVSRegistrar(
⋮----
/// @notice Returns an array of strategies in the operatorSet.
⋮----
function getStrategiesInOperatorSet(
⋮----
/// @notice Returns the minimum amount of stake that will be slashable as of some future block,
/// according to each operator's allocation from each strategy to the operator set. Note that this function
/// will return 0 for the slashable stake if the operator is not slashable at the time of the call.
/// @dev This method queries actual delegated stakes in the DelegationManager and applies
/// each operator's allocation to the stake to produce the slashable stake each allocation
/// represents. This method does not consider slashable stake in the withdrawal queue even though there could be
/// slashable stake in the queue.
/// @dev This minimum takes into account `futureBlock`, and will omit any pending magnitude
/// diffs that will not be in effect as of `futureBlock`. NOTE that in order to get the true
/// minimum slashable stake as of some future block, `futureBlock` MUST be greater than block.number
/// @dev NOTE that `futureBlock` should be fewer than `DEALLOCATION_DELAY` blocks in the future,
/// or the values returned from this method may not be accurate due to deallocations.
⋮----
/// @param operators the list of operators whose slashable stakes will be returned
/// @param strategies the strategies that each slashable stake corresponds to
/// @param futureBlock the block at which to get allocation information. Should be a future block.
function getMinimumSlashableStake(
⋮----
/// @notice Returns the current allocated stake, irrespective of the operator's slashable status for the operatorSet.
⋮----
/// @param strategies the strategies to query
function getAllocatedStake(
⋮----
/// @notice Returns whether an operator is slashable by an operator set.
/// This returns true if the operator is registered or their slashableUntil block has not passed.
/// This is because even when operators are deregistered, they still remain slashable for a period of time.
/// @param operator the operator to check slashability for
/// @param operatorSet the operator set to check slashability for
function isOperatorSlashable(
⋮----
/// @notice Returns the address that can slash a given operator set.
/// @param operatorSet The operator set to query.
/// @return The address that can slash the operator set. Returns `address(0)` if the operator set doesn't exist.
/// @dev If there is a pending slasher that can be applied after the `effectBlock`, the pending slasher will be returned.
function getSlasher(
⋮----
/// @notice Returns pending slasher for a given operator set.
⋮----
/// @return pendingSlasher The pending slasher for the operator set. Returns `address(0)` if there is no pending slasher or the operator set doesn't exist.
/// @return effectBlock The block at which the pending slasher will take effect. Returns `0` if there is no pending slasher or the operator set doesn't exist.
function getPendingSlasher(
⋮----
/// @notice Returns the address where slashed funds will be sent for a given operator set.
/// @param operatorSet The Operator Set to query.
/// @return For redistributing Operator Sets, returns the configured redistribution address set during Operator Set creation.
///         For non-redistributing operator sets, returns the `DEFAULT_BURN_ADDRESS`.
function getRedistributionRecipient(
⋮----
/// @notice Returns whether a given operator set supports redistribution
/// or not when funds are slashed and burned from EigenLayer.
⋮----
/// @return For redistributing Operator Sets, returns true.
///         For non-redistributing Operator Sets, returns false.
function isRedistributingOperatorSet(
⋮----
/// @notice Returns the number of slashes for a given operator set.
⋮----
/// @return The number of slashes for the operator set.
function getSlashCount(
⋮----
/// @notice Returns whether an operator is slashable by a redistributing operator set.
/// @param operator The operator to query.
function isOperatorRedistributable(
⋮----
interface IAllocationManager is IAllocationManagerActions, IAllocationManagerView, IPausable {}
````

## File: src/contracts/interfaces/IAVSDirectory.sol
````
// SPDX-License-Identifier: BUSL-1.1
⋮----
import "./ISignatureUtilsMixin.sol";
import "./IPauserRegistry.sol";
import "./IStrategy.sol";
⋮----
interface IAVSDirectoryErrors {
/// Operator Status
/// @dev Thrown when an operator does not exist in the DelegationManager
⋮----
/// @dev Thrown when an operator is already registered to an AVS.
⋮----
/// @dev Thrown when `operator` is already registered to the AVS.
⋮----
/// @dev Thrown when attempting to spend a spent eip-712 salt.
⋮----
interface IAVSDirectoryTypes {
/// @notice Enum representing the registration status of an operator with an AVS.
/// @notice Only used by legacy M2 AVSs that have not integrated with operatorSets.
⋮----
UNREGISTERED, // Operator not registered to AVS
REGISTERED // Operator registered to AVS
⋮----
/// @notice Struct representing the registration status of an operator with an operator set.
/// Keeps track of last deregistered timestamp for slashability concerns.
/// @param registered whether the operator is registered with the operator set
/// @param lastDeregisteredTimestamp the timestamp at which the operator was last deregistered
⋮----
interface IAVSDirectoryEvents is IAVSDirectoryTypes {
///  @notice Emitted when an operator's registration status with an AVS id updated
///  @notice Only used by legacy M2 AVSs that have not integrated with operatorSets.
event OperatorAVSRegistrationStatusUpdated(
⋮----
/// @notice Emitted when an AVS updates their metadata URI (Uniform Resource Identifier).
/// @dev The URI is never stored; it is simply emitted through an event for off-chain indexing.
event AVSMetadataURIUpdated(address indexed avs, string metadataURI);
⋮----
interface IAVSDirectory is IAVSDirectoryEvents, IAVSDirectoryErrors, ISignatureUtilsMixin {
///
///                         EXTERNAL FUNCTIONS
⋮----
/// @dev Initializes the addresses of the initial owner and paused status.
function initialize(
⋮----
///  @notice Called by an AVS to emit an `AVSMetadataURIUpdated` event indicating the information has updated.
⋮----
///  @param metadataURI The URI for metadata associated with an AVS.
⋮----
///  @dev Note that the `metadataURI` is *never stored* and is only emitted in the `AVSMetadataURIUpdated` event.
function updateAVSMetadataURI(
⋮----
/// @notice Called by an operator to cancel a salt that has been used to register with an AVS.
⋮----
/// @param salt A unique and single use value associated with the approver signature.
function cancelSalt(
⋮----
///  @notice Legacy function called by the AVS's service manager contract
/// to register an operator with the AVS. NOTE: this function will be deprecated in a future release
/// after the slashing release. New AVSs should use `registerForOperatorSets` instead.
⋮----
///  @param operator The address of the operator to register.
///  @param operatorSignature The signature, salt, and expiry of the operator's signature.
⋮----
///  @dev msg.sender must be the AVS.
///  @dev Only used by legacy M2 AVSs that have not integrated with operator sets.
function registerOperatorToAVS(
⋮----
///  @notice Legacy function called by an AVS to deregister an operator from the AVS.
/// NOTE: this function will be deprecated in a future release after the slashing release.
/// New AVSs integrating should use `deregisterOperatorFromOperatorSets` instead.
⋮----
///  @param operator The address of the operator to deregister.
⋮----
function deregisterOperatorFromAVS(
⋮----
///                         VIEW FUNCTIONS
⋮----
function operatorSaltIsSpent(
⋮----
///  @notice Calculates the digest hash to be signed by an operator to register with an AVS.
⋮----
///  @param operator The account registering as an operator.
///  @param avs The AVS the operator is registering with.
///  @param salt A unique and single-use value associated with the approver's signature.
///  @param expiry The time after which the approver's signature becomes invalid.
function calculateOperatorAVSRegistrationDigestHash(
⋮----
/// @notice The EIP-712 typehash for the Registration struct used by the contract.
function OPERATOR_AVS_REGISTRATION_TYPEHASH() external view returns (bytes32);
⋮----
/// @notice The EIP-712 typehash for the OperatorSetRegistration struct used by the contract.
function OPERATOR_SET_REGISTRATION_TYPEHASH() external view returns (bytes32);
````

## File: src/contracts/interfaces/IAVSRegistrar.sol
````
// SPDX-License-Identifier: BUSL-1.1
⋮----
interface IAVSRegistrar {
/// @notice Called by the AllocationManager when an operator wants to register
/// for one or more operator sets. This method should revert if registration
/// is unsuccessful.
/// @param operator the registering operator
/// @param avs the AVS the operator is registering for. This should be the same as IAVSRegistrar.avs()
/// @param operatorSetIds the list of operator set ids being registered for
/// @param data arbitrary data the operator can provide as part of registration
function registerOperator(
⋮----
/// @notice Called by the AllocationManager when an operator is deregistered from one or more operator sets
/// @param operator the deregistering operator
/// @param avs the AVS the operator is deregistering from. This should be the same as IAVSRegistrar.avs()
/// @param operatorSetIds the list of operator set ids being deregistered from
function deregisterOperator(
⋮----
/// @notice Returns true if the AVS is supported by the registrar
/// @param avs the AVS to check
/// @return true if the AVS is supported, false otherwise
function supportsAVS(
````

## File: src/contracts/interfaces/IAVSTaskHook.sol
````
// SPDX-License-Identifier: BUSL-1.1
⋮----
import {ITaskMailboxTypes} from "./ITaskMailbox.sol";
⋮----
/// @title IAVSTaskHook
/// @author Layr Labs, Inc.
/// @notice Interface for AVS-specific task lifecycle hooks.
/// @dev This interface allows AVSs to implement custom validation logic for tasks.
interface IAVSTaskHook {
/// @notice Validates a task before it is created
/// @param caller Address that is creating the task
/// @param taskParams Task parameters
/// @dev This function should revert if the task should not be created
function validatePreTaskCreation(
⋮----
/// @notice Handles a task after it is created
/// @param taskHash Unique identifier of the task
/// @dev This function can be used to perform additional validation or update AVS-specific state
function handlePostTaskCreation(
⋮----
/// @notice Validates a task before it is submitted for verification
/// @param caller Address that is submitting the result
⋮----
/// @param cert Certificate proving the validity of the result
/// @param result Task execution result data
/// @dev This function should revert if the task should not be verified
function validatePreTaskResultSubmission(
⋮----
/// @notice Handles a task result submission
/// @param caller Address that submitted the result
⋮----
function handlePostTaskResultSubmission(
⋮----
/// @notice Calculates the fee for a task payload against a specific fee market
/// @param taskParams The task parameters
/// @return The fee for the task
function calculateTaskFee(
````

## File: src/contracts/interfaces/IBackingEigen.sol
````
// SPDX-License-Identifier: BUSL-1.1
⋮----
import "@openzeppelin/contracts/token/ERC20/IERC20.sol";
⋮----
interface IBackingEigen is IERC20 {
/// @notice This function allows the owner to set the allowedFrom status of an address
/// @param from the address whose allowedFrom status is being set
/// @param isAllowedFrom the new allowedFrom status
function setAllowedFrom(
⋮----
/// @notice This function allows the owner to set the allowedTo status of an address
/// @param to the address whose allowedTo status is being set
/// @param isAllowedTo the new allowedTo status
function setAllowedTo(
⋮----
/// @notice Allows the owner to disable transfer restrictions
function disableTransferRestrictions() external;
⋮----
/// @notice An initializer function that sets initial values for the contract's state variables.
function initialize(
⋮----
// @notice Allows the contract owner to modify an entry in the `isMinter` mapping.
function setIsMinter(
⋮----
/// @notice Allows any privileged address to mint `amount` new tokens to the address `to`.
/// @dev Callable only by an address that has `isMinter` set to true.
function mint(
⋮----
/// @dev Destroys `amount` tokens from the caller.
///
/// See {ERC20-_burn}.
function burn(
⋮----
/// @notice the address of the wrapped Eigen token EIGEN
function EIGEN() external view returns (IERC20);
⋮----
/// @notice the timestamp after which transfer restrictions are disabled
function transferRestrictionsDisabledAfter() external view returns (uint256);
⋮----
/// @dev Clock used for flagging checkpoints. Has been overridden to implement timestamp based
/// checkpoints (and voting).
function clock() external view returns (uint48);
⋮----
/// @dev Machine-readable description of the clock as specified in EIP-6372.
/// 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(
````

## File: src/contracts/interfaces/IBaseCertificateVerifier.sol
````
// SPDX-License-Identifier: BUSL-1.1
⋮----
import "./ICrossChainRegistry.sol";
import {OperatorSet} from "../libraries/OperatorSetLib.sol";
⋮----
interface IBaseCertificateVerifierEvents {
/// @notice Emitted when the owner of an operatorSet is updated
event OperatorSetOwnerUpdated(OperatorSet operatorSet, address owner);
⋮----
/// @notice Emitted when the max staleness period of an operatorSet is updated
event MaxStalenessPeriodUpdated(OperatorSet operatorSet, uint32 maxStalenessPeriod);
⋮----
interface IBaseCertificateVerifierErrors {
/// @notice Thrown when the table updater is not caller
/// @dev Error code: 0x061836d6
/// @dev We restrict table updates to only come from the `OperatorTableUpdater` contract
⋮----
/// @notice Thrown when the table update is stale
/// @dev Error code: 0x2f20889f
/// @dev We require newer reference timestamps to ensure that operator tables are append-only
⋮----
/// @notice Thrown when array lengths mismatch
/// @dev Error code: 0xa24a13a6
⋮----
/// @notice Thrown when the certificate is too stale, per the max staleness period of the operatorSet
/// @dev Error code: 0xc81f9ad6
⋮----
/// @notice Thrown when the reference timestamp does not exist
/// @dev Error code: 0x6568bdb8
/// @dev We require valid reference timestamps to ensure certificates reference existing operator table updates
⋮----
/// @notice Thrown when certificate verification fails
/// @dev Error code: 0x439cc0cd
⋮----
/// @notice Thrown when the global table root is disabled
/// @dev Error code: 0x1b14174b
/// @dev Roots are disabled by governance if a security issue is detected
⋮----
/// @notice A base interface that verifies certificates for a given operatorSet
/// @notice This is a base interface that all curve certificate verifiers (eg. BN254, ECDSA) must implement
/// @dev A single `CertificateVerifier` is used for all operatorSets for a given key type
/// @dev The `CertificateVerifier` verifies certificates for a given operatorSet against an operator table. Operator tables are updated by an offchain service
interface IBaseCertificateVerifier is
⋮----
/// @notice The following steps describe the certificate verification process, in order:
/// 1. The AVS configures the following parameters in EigenLayer core:
///    a. AllocationManager.createOperatorSet: Creates an operatorSet
///    b. KeyRegistrar.configureOperatorSet: Configures the curve type of the operatorSet
///    c. CrossChainRegistry.makeGenerationReservation: Registers the operatorSet to be transported by the multichain protocol. This includes
///      the `owner`, `maxStalenessPeriod`, and `operatorTableCalculator` for the operatorSet. The output of the `OperatorTableCalculator`
///      are the operatorSet's stake weights (i.e. operator table) and is transported by the multichain protocol, along with the `maxStalenessPeriod` and `owner`
/// 2. The multichain protocol calculates the operatorTable of an operatorSet. The time at which the table is calculated is the reference timesetamp. The protocol
///    will then call `updateOperatorTable` to update the operatorSet's operator table for a given referenceTimestamp
/// 3. A task is created and certificate is generated, off-chain, by the AVS to validate the completion of a task.
///    The reference timestamp in the certificate is used to key into the operator table that was updated in step 2.
/// 4. The certificate is verified, either normally, proportionally, or nominally.
/// @dev The `referenceTimestamp` is used to key into the operatorSet's stake weights. It is NOT when the certificate was generated off-chain
/// @dev The `maxStalenessPeriod` configured in step 1c denotes if a certificate is too stale with respect to the `referenceTimestamp`
/// @dev Operator tables for ALL operatorSets with an active generation reservation are updated at a set cadence. See `crossChainRegistry.tableUpdateCadence` for the frequency of table updates
/// @dev To ensure that tables do not become stale between table updates (i.e. a large operator has joined or been ejected), the multichain protocol updates tables for operatorSets when the following events are emitted:
///      - AllocationManager: `OperatorSlashed`
///      - AllocationManager: `OperatorAddedToOperatorSet`
///      - AllocationManager: `OperatorRemovedFromOperatorSet`
/// @dev Certificates can be replayed across all destination chains
/// @dev Race conditions should be handled by the AVS. The protocol makes no guarantees about how certificates should be verified (eg. preventing certificates against tables that are NOT the latest)
///      Some examples of race conditions include:
///      a. An in-flight certificate for a past reference timestamp and an operator table update for a newer reference timestamp. The AVS should decide whether it
///         wants to only confirm tasks against the *latest* certificate
///      b. An in-flight certificate against a stake table with a majority-stake operator that has been slashed or removed from the operatorSet
/// @notice The address of the owner of the operatorSet
/// @param operatorSet The operatorSet to get the owner of
/// @return The owner
/// @dev The owner of the OperatorSet is not used by this contract, but can be used by periphery contracts
///      to gate access control for on-chain operations
/// @dev This value is set by the AVS in the `CrossChainRegistry` and transported by the multichain protocol when the operator table is updated
function getOperatorSetOwner(
⋮----
/// @notice The max staleness period of the operator table for a given operatorSet. This value is AVS-set and
///         transported by the multichain protocol
/// @param operatorSet The operatorSet to get the max staleness period of
/// @return The max staleness period
/// @dev A staleness period of 0 allows for certificates to be verified against any timestamp in the past
/// @dev Staleness periods cannot be greater than 0 and less than the update cadence of the `OperatorTables`, since
///      certificates would be unable to be validated against. This value is set and bounds enforced in the `CrossChainRegistry`
/// @dev This value is NOT checkpointed. A new staleness period applies to ALL certificates, regardless of a certificate's reference timestamp
⋮----
function maxOperatorTableStaleness(
⋮----
/// @notice The latest reference timestamp of the operator table for a given operatorSet. This value is
///     updated each time an operator table is updated
/// @param operatorSet The operatorSet to get the latest reference timestamp of
/// @return The latest reference timestamp, 0 if the operatorSet has never been updated
/// @dev The latest reference timestamp is set when the operator table is updated
/// @dev The reference timestamp denotes the timestamp at which the operator table was calculated by the multichain protocol
function latestReferenceTimestamp(
⋮----
/// @notice Whether the operator table has been updated for a given reference timestamp
/// @param operatorSet The operatorSet to check
/// @param referenceTimestamp The reference timestamp to check
/// @return Whether the reference timestamp has been updated
/// @dev The reference timestamp is set when the operator table is updated
function isReferenceTimestampSet(
⋮----
/// @notice Get the total stake weights for all operators at a given reference timestamp
/// @param operatorSet The operator set to calculate stakes for
/// @param referenceTimestamp The reference timestamp
/// @return The sum of stake weights for each stake type, empty if the operatorSet has not been updated for the given reference timestamp
/// @dev The stake weights are defined in the AVS's `OperatorTableCalculator` and transported by the multichain protocol. An example
///      of this can be [slashable_stake, delegated_stake, strategy_i_stake, ...], where each stake type is an element in the array.
///      The stake weights are defined by the operatorSet's `OperatorTableCalculator` and transported by the multichain protocol
/// @dev For ECDSA, this function *reverts* if the reference timestamp is not set or the number of operators is 0
/// @dev For BN254, this function returns empty array if the reference timestamp is not set or the number of operators is 0
function getTotalStakeWeights(
⋮----
/// @notice Get the number of operators at a given reference timestamp
/// @param operatorSet The operator set to get the number of operators for
⋮----
/// @return The number of operators
/// @dev Returns 0 if the reference timestamp is not set or the number of operators is 0
function getOperatorCount(
````

## File: src/contracts/interfaces/IBN254CertificateVerifier.sol
````
// SPDX-License-Identifier: BUSL-1.1
⋮----
import {BN254} from "../libraries/BN254.sol";
import {OperatorSet} from "../libraries/OperatorSetLib.sol";
import "./IOperatorTableCalculator.sol";
import "./IBaseCertificateVerifier.sol";
⋮----
interface IBN254CertificateVerifierTypes is IOperatorTableCalculatorTypes {
/// @notice A witness for an operator, used to identify the non-signers for a given certificate
/// @param operatorIndex the index of the nonsigner in the `BN254OperatorInfo` tree
/// @param operatorInfoProofs merkle proof of the nonsigner at the index.
///        Leave empty if the non-signing operator is already stored from a previous verification at the same `referenceTimestamp`
/// @param operatorInfo the `BN254OperatorInfo` for the operator.
⋮----
/// @dev Non-signing operators are stored in the `BN254CertificateVerifier` upon the first successful certificate verification that includes a merkle proof for the non-signing operator.
///      This is done to avoid the need to provide proofs for non-signing operators for each certificate with the same `referenceTimestamp`
⋮----
/// @notice A BN254 Certificate
/// @param referenceTimestamp a reference timestamp that corresponds to a timestamp at which an operator table was updated for the operatorSet.
/// @param messageHash the hash of a task that was completed by operators. The messageHash is defined by the AVS, see `TaskMailbox.sol` for an example implementation.
///                    NOTE: This value is NOT the message that is signed by operators - see `calculateCertificateDigest` for the signable digest.
/// @param signature the G1 signature of the message. The signature is over the signable digest, which is calculated by `calculateCertificateDigest`
/// @param apk the G2 aggregate public key
/// @param nonSignerWitnesses an array of witnesses of non-signing operators
/// @dev Non-signer witnesses MUST be strictly increasing by `operatorIndex`
/// @dev The `referenceTimestamp` is used to key into the operatorSet's stake weights. It is NOT the timestamp at which the certificate was generated off-chain
⋮----
interface IBN254CertificateVerifierEvents is IBN254CertificateVerifierTypes {
/// @notice Emitted when an BN254 table is updated
event TableUpdated(OperatorSet operatorSet, uint32 referenceTimestamp, BN254OperatorSetInfo operatorSetInfo);
⋮----
interface IBN254CertificateVerifierErrors {
/// @notice thrown when operator index provided in certificate is invalid
/// @dev Error code: 0x03f4a78e
/// @dev We enforce that operator indices are within valid bounds to prevent out-of-bounds access in the merkle tree verification
⋮----
/// @notice thrown when the non-signer witnesses are not strictly increasing by operatorIndex
/// @dev Error code: 0xec6268b8
/// @dev We enforce strictly increasing order to prevent duplicates and ensure deterministic processing
⋮----
/// @notice An interface for verifying BN254 certificates
/// @notice This implements the base `IBaseCertificateVerifier` interface
interface IBN254CertificateVerifier is
⋮----
/// @notice The following steps describe the certificate verification process, in order:
/// 1. The AVS configures the following parameters in EigenLayer core:
///    a. AllocationManager.createOperatorSet: Creates an operatorSet
///    b. KeyRegistrar.configureOperatorSet: Configures the curve type of the operatorSet
///    c. CrossChainRegistry.makeGenerationReservation: Registers the operatorSet to be transported by the multichain protocol. This includes
///      the `owner`, `maxStalenessPeriod`, and `operatorTableCalculator` for the operatorSet. The output of the `OperatorTableCalculator`
///      are the operatorSet's stake weights (i.e. operator table) and is transported by the multichain protocol, along with the `maxStalenessPeriod` and `owner`
/// 2. The multichain protocol calculates the operatorTable of an operatorSet. The time at which the table is calculated is the reference timestamp. The protocol
///    will then call `updateOperatorTable` to update the operatorSet's operator table for a given referenceTimestamp
/// 3. A task is created and certificate is generated, off-chain, by the AVS to validate the completion of a task.
///    The reference timestamp in the certificate is used to key into the operator table that was updated in step 2.
/// 4. The certificate is verified, either normally, proportionally, or nominally.
/// @dev The `referenceTimestamp` is used to key into the operatorSet's stake weights. It is NOT when the certificate was generated off-chain
/// @dev The `maxStalenessPeriod` configured in step 1c denotes if a certificate is too stale with respect to the `referenceTimestamp`
/// @dev Operator tables for ALL operatorSets with an active generation reservation are updated at a set cadence. See `crossChainRegistry.tableUpdateCadence` for the frequency of table updates
/// @dev To ensure that operatorSets can immediately begin to verify certificates and that tables do not become stale between table updates (i.e. a large operator has joined or been ejected),
/// the multichain protocol updates tables for operatorSets when the following events are emitted:
///      - AllocationManager: `OperatorSlashed`
///      - AllocationManager: `OperatorAddedToOperatorSet`
///      - AllocationManager: `OperatorRemovedFromOperatorSet`
///      - CrossChainRegistry: `GenerationReservationCreated`
/// @dev Operator tables are updated at a cadence of `tableUpdateCadence` seconds, which is given by `CrossChainRegistry.tableUpdateCadence`. Currently daily on testnet and weekly (Monday) on mainnet at 14:00 UTC
/// @dev Certificates can be replayed across all destination chains
/// @dev Race conditions should be handled by the AVS. The protocol makes no guarantees about how certificates should be verified (eg. preventing certificates against tables that are NOT the latest)
///      Some examples of race conditions include:
///      a. An in-flight certificate for a past reference timestamp and an operator table update for a newer reference timestamp. The AVS should decide whether it
///         wants to only confirm tasks against the *latest* certificate
///      b. An in-flight certificate against a stake table with a majority-stake operator that has been slashed or removed from the operatorSet
/// @notice updates the operatorSet with the operator table (i.e. stake weights) and its configuration
/// @param operatorSet the operatorSet to update the operator table for
/// @param referenceTimestamp the timestamp at which the operatorSetInfo (i.e. operator table) was sourced
/// @param operatorSetInfo the operator table for this operatorSet. This includes the `totalWeights`, `operatorInfoTreeRoot`, `aggregatePubkey`, and `numOperators`.
///        See `IOperatorTableCalculator.BN254OperatorSetInfo` for more details
/// @param operatorSetConfig the configuration of the operatorSet, which includes the owner and max staleness period
/// @dev This function can only be called by the `OperatorTableUpdater` contract, which is itself permissionless to call
/// @dev The `referenceTimestamp` must correspond to a reference timestamp for a globalTableRoot stored in the `OperatorTableUpdater`
///      In addition, it must be greater than the latest reference timestamp for the given operatorSet
/// @dev Reverts for:
///      - OnlyTableUpdater: Caller is not the authorized OperatorTableUpdater
///      - TableUpdateStale: referenceTimestamp is not greater than the latest reference timestamp
/// @dev Emits the following events:
///      - TableUpdated: When operator table is successfully updated
function updateOperatorTable(
⋮----
/// @notice verifies a certificate against the operator table for a given reference timestamp
/// @param operatorSet the operatorSet that the certificate is for
/// @param cert a certificate
/// @return totalSignedStakeWeights total stake weight that signed the certificate for each stake type. Each
///         index corresponds to a stake type in the `weights` array in the `BN254OperatorSetInfo` struct
/// @dev The `referenceTimestamp` in the `BN254Certificate` is used to determine the operator table to use for the verification
/// @dev AVS' are responsible for managing potential race conditions when certificates are signed close to operator table updates. Some examples include:
⋮----
/// @dev Reverts if the certificate's `referenceTimestamp` is too stale with respect to the `maxStalenessPeriod` of the operatorSet
/// @dev This function is *non-view* because it caches non-signing operator info upon a successful certificate verification. See `getNonsignerOperatorInfo` for more details
⋮----
///      - CertificateStale: Certificate referenceTimestamp is too stale per maxStalenessPeriod
///      - ReferenceTimestampDoesNotExist: No operator table exists for the referenceTimestamp
///      - RootDisabled: The global table root for this timestamp has been disabled
///      - InvalidOperatorIndex: Operator index provided in nonSigner witness is invalid
///      - NonSignerIndicesNotSorted: Non-signer witnesses are not strictly increasing by operatorIndex
///      - VerificationFailed: Merkle proof verification failed or BLS signature verification failed
function verifyCertificate(
⋮----
/// @notice verifies a certificate and makes sure that the signed stakes meet
/// provided portions of the total stake weight on the AVS
⋮----
/// @param cert the certificate
/// @param totalStakeProportionThresholds the proportion, in BPS, of total stake weight that
///        the signed stake of the certificate should meet. Each index corresponds to
///        a stake type in the `totalWeights` array in the `BN254OperatorSetInfo`
/// @return Whether or not certificate is valid and meets proportion thresholds
⋮----
///      - ArrayLengthMismatch: signedStakes length does not equal totalStakeProportionThresholds length
function verifyCertificateProportion(
⋮----
/// provided nominal stake thresholds
⋮----
/// @param totalStakeNominalThresholds the nominal amount of stake that
⋮----
/// @return Whether or not certificate is valid and meets nominal thresholds
⋮----
///      - ArrayLengthMismatch: signedStakes length does not equal totalStakeNominalThresholds length
function verifyCertificateNominal(
⋮----
/// @notice Convenience function to attempt signature verification with gas limit for safety
/// @param msgHash The message hash that was signed
/// @param aggPubkey The aggregate public key of signers
/// @param apkG2 The G2 point representation of the aggregate public key
/// @param signature The BLS signature to verify
/// @return pairingSuccessful Whether the pairing operation completed successfully
/// @return signatureValid Whether the signature is valid
/// @dev This function should be used off-chain to validate a signature. Careful consideration should be taken
///      when parsing `pairingSuccessful` and `signatureValid`. Refer to our internal usage of this function
function trySignatureVerification(
⋮----
/// @notice Get cached nonsigner operator info
/// @param operatorSet The operatorSet
/// @param referenceTimestamp The reference timestamp
/// @param operatorIndex The operator index
/// @return The cached operator info, empty if the operator is not in the cache
/// @dev The non-signing operatorInfo is stored upon a successful certificate verification. Once cached,
///      merkle proofs for non-signing operators do not need to be passed in as part of the `BN254Certificate` for a given reference timestamp
/// @dev Non-signing operators are stored on the `operatorInfoTreeRoot` that is transported in the `BN254OperatorSetInfo` struct on an operator table update
/// @dev The tree structure of the `operatorInfoTreeRoot` is as follows. (Below is a tree of height 2 -- in practice, each tree will have a height appropriate for the total number of leaves.)
/// ```
///                    OperatorInfoTreeRoot
///                           |
///                    ┌──────┴──────┐
///                    │             │
///              Internal Node    Internal Node
///               (0-1)           (2-3)
⋮----
///              ┌─────┴─────┐   ┌───┴───┐
///              │           │   │       │
///         Leaf 0        Leaf 1  Leaf 2  Leaf 3
///    BN254OperatorInfo  #1      #2      #3
///         #0
⋮----
function getNonsignerOperatorInfo(
⋮----
/// @notice Check if a nonsigner is cached
/// @param operatorSet The operator set
⋮----
/// @return Whether the operator is cached
⋮----
function isNonsignerCached(
⋮----
/// @notice Get operator set info for a timestamp
⋮----
/// @return The operator set info, empty if the operatorSet has not been updated for the given reference timestamp
function getOperatorSetInfo(
⋮----
/// @notice Calculate the digest for a certificate, which must be signed over by operators who complete a task
⋮----
/// @param messageHash The message hash of the task
/// @return The digest
/// @dev This is a chain-agnostic digest, so it can be used to verify certificates across
///      multiple destination chains
function calculateCertificateDigest(
````

## File: src/contracts/interfaces/ICrossChainRegistry.sol
````
// SPDX-License-Identifier: BUSL-1.1
⋮----
import {OperatorSet} from "../libraries/OperatorSetLib.sol";
import "./IOperatorTableCalculator.sol";
⋮----
interface ICrossChainRegistryErrors {
/// @notice Thrown when the chainId is invalid
/// @dev Error code: 0x7a47c9a2
⋮----
/// @notice Thrown when a generation reservation already exists for the operator set
/// @dev Error code: 0x18834615
⋮----
/// @notice Thrown when a generation reservation does not exist for the operator set
/// @dev Error code: 0x9a575d52
⋮----
/// @notice Thrown when a chain ID is already whitelisted
/// @dev Error code: 0x497ec636
⋮----
/// @notice Thrown when a chain ID is not whitelisted
/// @dev Error code: 0xb3f92ba1
⋮----
/// @notice Thrown when the operator set is not valid
/// @dev Error code: 0x7ec5c154
/// @dev We require valid operator sets (existing in AllocationManager) to ensure cross-chain operations are performed on legitimate operator configurations
⋮----
/// @notice Thrown when the key type is not set for the operatorSet
/// @dev Error code: 0xe57cacbd
/// @dev We require operator sets to have configured curve types so the multichain protocol can properly decode the operator table
⋮----
/// @notice Thrown when the chainIDs array is empty
/// @dev Error code: 0x8631a075
⋮----
/// @notice Thrown when the lengths between two arrays are not the same
/// @dev Error code: 0xa24a13a6
⋮----
/// @notice Thrown when the staleness period set by an operatorSet is invalid
/// @dev Error code: 0x5c8c9062
/// @dev We enforce valid staleness periods (0 or >= table update cadence) to ensure certificates are not prematurely invalidated between table updates
⋮----
/// @notice Thrown when the table update cadence is invalid
/// @dev Error code: 0xb6cc70d8
⋮----
/// @notice Thrown when the range is invalid for the `getActiveGenerationReservations` function
/// @dev A valid range is defined as `startIndex` <= `endIndex` in `getActiveGenerationReservationsByRange`
/// @dev Error Code: 0x561ce9bb
⋮----
/// @notice Thrown when the end index is invalid for the `getActiveGenerationReservations` function
/// @dev A valid end index is defined as `endIndex` <= `getActiveGenerationReservationCount()` in `getActiveGenerationReservationsByRange`
/// @dev Error Code: 0xb68d84c0
⋮----
interface ICrossChainRegistryTypes {
/// @notice A per-operatorSet configuration struct that is transported from the CrossChainRegistry on L1.
/// @param owner the permissioned owner of the OperatorSet on L2 that can be used by downstream contracts to authorize actions
/// @param maxStalenessPeriod the maximum staleness period of the operatorSet, in seconds
///
/// @dev A `maxStalenessPeriod` of 0 completely removes staleness checks, allowing certificates to be validated regardless of their timestamp
/// @dev A nonzero `maxStalenessPeriod` has a floor of the table update cadence, which is the frequency at which operator tables are expected
///      to be updated. The table update cadence is set by the owner of the `CrossChainRegistry`
⋮----
interface ICrossChainRegistryEvents is ICrossChainRegistryTypes {
/// @notice Emitted when a generation reservation is created
event GenerationReservationCreated(OperatorSet operatorSet);
⋮----
/// @notice Emitted when a generation reservation is removed
event GenerationReservationRemoved(OperatorSet operatorSet);
⋮----
/// @notice Emitted when an operatorTableCalculator is set
event OperatorTableCalculatorSet(OperatorSet operatorSet, IOperatorTableCalculator operatorTableCalculator);
⋮----
/// @notice Emitted when an operatorTableCalculator is removed, when a generation reservation is removed
event OperatorTableCalculatorRemoved(OperatorSet operatorSet);
⋮----
/// @notice Emitted when an operatorSetConfig is set
event OperatorSetConfigSet(OperatorSet operatorSet, OperatorSetConfig config);
⋮----
/// @notice Emitted when an operatorSetConfig is removed, when a generation reservation is removed
event OperatorSetConfigRemoved(OperatorSet operatorSet);
⋮----
/// @notice Emitted when a chainID is added to the whitelist
event ChainIDAddedToWhitelist(uint256 chainID, address operatorTableUpdater);
⋮----
/// @notice Emitted when a chainID is removed from the whitelist
event ChainIDRemovedFromWhitelist(uint256 chainID);
⋮----
/// @notice Emitted when the table update cadence is set
event TableUpdateCadenceSet(uint32 tableUpdateCadence);
⋮----
/// @notice The CrossChainRegistry allows AVSs to register their operatorSets and the associated operator table for cross-chain transport by the multichain protocol
interface ICrossChainRegistry is ICrossChainRegistryErrors, ICrossChainRegistryEvents {
/// @notice Creates a generation reservation, which transports the operator table of an operatorSet to all whitelisted chains
/// @param operatorSet the operatorSet to make a reservation for
/// @param operatorTableCalculator the address of the operatorTableCalculator. This contract is deployed (or a template is used) by the AVS
///                                to calculate the stake weights for the operatorSet. See `IOperatorTableCalculator` for more details
/// @param config the config to set for the operatorSet, which includes the owner of the operatorSet and the max staleness period
/// @dev Tables are transported at a cadence of `tableUpdateCadence` seconds. The `maxStalenessPeriod` is used to determine the maximum
/// @dev msg.sender must be an authorized caller for operatorSet.avs
/// @dev Once a generation reservation is created, the operator table will be transported to all chains that are whitelisted
/// @dev It is expected that the AVS has:
///      - Deployed or is using a generalizable `OperatorTableCalculator` to calculate its operator's stake weights
///      - Set the `KeyType` for the operatorSet in the `KeyRegistrar`, even if the AVS is not using the `KeyRegistrar` for operator key management
///           - Valid Key Types are given in the `IKeyRegistrarTypes.CurveType` enum. The `KeyType` must not be `NONE`
///      - Created an operatorSet in the `AllocationManager`
/// @dev Reverts for:
///      - CurrentlyPaused: Generation reservations are paused
///      - InvalidPermissions: Caller is not an authorized caller for operatorSet.avs
///      - InvalidOperatorSet: The operatorSet does not exist in the AllocationManager
///      - KeyTypeNotSet: The key type is not set for the operatorSet in the KeyRegistrar
///      - GenerationReservationAlreadyExists: A generation reservation already exists for the operatorSet
///      - InvalidStalenessPeriod: The maxStalenessPeriod is invalid
/// @dev Emits the following events:
///      - GenerationReservationCreated: When the generation reservation is successfully created
///      - OperatorTableCalculatorSet: When the operator table calculator is set for the operatorSet
///      - OperatorSetConfigSet: When the operator set config is set for the operatorSet
function createGenerationReservation(
⋮----
/// @notice Removes a generation reservation for a given operatorSet
/// @param operatorSet the operatorSet to remove
⋮----
///      - GenerationReservationDoesNotExist: A generation reservation does not exist for the operatorSet
⋮----
///      - OperatorTableCalculatorRemoved: When the operator table calculator is removed
///      - OperatorSetConfigRemoved: When the operator set config is removed
///      - GenerationReservationRemoved: When the generation reservation is removed
function removeGenerationReservation(
⋮----
/// @notice Sets the operatorTableCalculator for the operatorSet
/// @param operatorSet the operatorSet whose operatorTableCalculator is desired to be set
/// @param operatorTableCalculator the contract to call to calculate the operator table
⋮----
/// @dev operatorSet must have an active reservation
⋮----
///      - CurrentlyPaused: Setting the operatorTableCalculator is paused
⋮----
///      - OperatorTableCalculatorSet: When the operator table calculator is successfully set
function setOperatorTableCalculator(
⋮----
/// @notice Sets the operatorSetConfig for a given operatorSet
/// @param operatorSet the operatorSet to set the operatorSetConfig for
/// @param config the config to set, which includes the owner of the operatorSet and the max staleness period
⋮----
/// @dev operatorSet must have an active generation reservation
/// @dev The max staleness period is NOT checkpointed and is applied globally regardless of the reference timestamp of a certificate
⋮----
///      - CurrentlyPaused: Setting the operatorSetConfig is paused
⋮----
///      - OperatorSetConfigSet: When the operator set config is successfully set
function setOperatorSetConfig(
⋮----
/// @notice Adds chainIDs to the whitelist of chainIDs that are transported to by the multichain protocol
/// @param chainIDs the chainIDs to add to the whitelist
/// @param operatorTableUpdaters the operatorTableUpdaters for each whitelisted chainID
/// @dev msg.sender must be the owner of the CrossChainRegistry
⋮----
///      - "Ownable: caller is not the owner": Caller is not the owner of the contract
///      - CurrentlyPaused: Chain whitelisting is paused
///      - ArrayLengthMismatch: The chainIDs and operatorTableUpdaters arrays have different lengths
///      - InvalidChainId: Any chainID is zero
///      - ChainIDAlreadyWhitelisted: Any chainID is already whitelisted
⋮----
///      - ChainIDAddedToWhitelist: When each chainID is successfully added to the whitelist
function addChainIDsToWhitelist(
⋮----
/// @notice Removes chainIDs from the whitelist of chainIDs
/// @param chainIDs the chainIDs to remove from the whitelist
⋮----
///      - ChainIDNotWhitelisted: Any chainID is not currently whitelisted
⋮----
///      - ChainIDRemovedFromWhitelist: When each chainID is successfully removed from the whitelist
function removeChainIDsFromWhitelist(
⋮----
/// @notice Sets the table update cadence in seconds. This is the frequency at which operator tables are expected to be updated on all destination chains
/// @param tableUpdateCadence the table update cadence
⋮----
/// @dev The table update cadence cannot be 0
⋮----
///      - InvalidTableUpdateCadence: The tableUpdateCadence is zero
⋮----
///      - TableUpdateCadenceSet: When the table update cadence is successfully set
/// @dev The table update cadence is weekly on mainnet and daily on testnet
function setTableUpdateCadence(
⋮----
///                         VIEW FUNCTIONS
⋮----
/// @notice Gets the active generation reservations
/// @return An array of operatorSets with active generationReservations
function getActiveGenerationReservations() external view returns (OperatorSet[] memory);
⋮----
/// @notice Gets the active generation reservations by range
/// @param startIndex the start index of the range, inclusive
/// @param endIndex the end index of the range, exclusive
⋮----
///      - InvalidRange: startIndex is greater than endIndex
///      - InvalidEndIndex: endIndex is greater than the length of the active generation reservations array
function getActiveGenerationReservationsByRange(
⋮----
/// @notice Checks if a given operatorSet has an active generation reservation
/// @param operatorSet the operatorSet to check
/// @return True if the operatorSet has an active generation reservation, false otherwise
function hasActiveGenerationReservation(
⋮----
/// @notice Gets the operatorTableCalculator for a given operatorSet
/// @param operatorSet the operatorSet to get the operatorTableCalculator for
/// @dev You should check if an operatorSet has an active generation reservation prior to calling this method
/// @return The operatorTableCalculator for the given operatorSet
function getOperatorTableCalculator(
⋮----
/// @notice Gets the operatorSetConfig for a given operatorSet
/// @param operatorSet the operatorSet to get the operatorSetConfig for
⋮----
/// @return The operatorSetConfig for the given operatorSet
function getOperatorSetConfig(
⋮----
/// @notice Calculates the operatorTableBytes for a given operatorSet
/// @param operatorSet the operatorSet to calculate the operator table for
/// @return the encoded operatorTableBytes containing:
///         - operatorSet details
///         - curve type from KeyRegistrar
///         - operator set configuration
///         - calculated operator table from the calculator contract
⋮----
/// @dev This function aggregates data from multiple sources for cross-chain transport
/// @dev Reverts when the call to the operatorTableCalculator contract call fails
function calculateOperatorTableBytes(
⋮----
/// @notice Gets the list of chains that are supported by the CrossChainRegistry
/// @return An array of chainIDs that are supported by the CrossChainRegistry
/// @return An array of operatorTableUpdaters corresponding to each chainID
function getSupportedChains() external view returns (uint256[] memory, address[] memory);
⋮----
/// @notice Gets the table update cadence, in seconds
/// @return The table update cadence, in seconds
/// @dev The table update cadence is applicable to all whitelisted chains, and is the
///      frequency at which operator tables are expected to be updated on all destination chains
function getTableUpdateCadence() external view returns (uint32);
⋮----
/// @notice Gets the number of active generation reservations
/// @return The number of active generation reservations
/// @dev This function can be used in conjunction with the paginated version of `getActiveGenerationReservations`
///      to iterate over all active generation reservations
function getActiveGenerationReservationCount() external view returns (uint256);
````

## File: src/contracts/interfaces/IDelegationManager.sol
````
// SPDX-License-Identifier: BUSL-1.1
⋮----
import "./IStrategy.sol";
import "./IPauserRegistry.sol";
import "./ISignatureUtilsMixin.sol";
import "../libraries/SlashingLib.sol";
import "../libraries/OperatorSetLib.sol";
⋮----
interface IDelegationManagerErrors {
/// @dev Thrown when caller is neither the StrategyManager or EigenPodManager contract.
⋮----
/// @dev Thrown when msg.sender is not the EigenPodManager
⋮----
/// @dev Throw when msg.sender is not the AllocationManager
⋮----
/// Delegation Status
⋮----
/// @dev Thrown when an operator attempts to undelegate.
⋮----
/// @dev Thrown when an account is actively delegated.
⋮----
/// @dev Thrown when an account is not actively delegated.
⋮----
/// @dev Thrown when `operator` is not a registered operator.
⋮----
/// Invalid Inputs
⋮----
/// @dev Thrown when attempting to execute an action that was not queued.
⋮----
/// @dev Thrown when caller cannot undelegate on behalf of a staker.
⋮----
/// @dev Thrown when two array parameters have mismatching lengths.
⋮----
/// @dev Thrown when input arrays length is zero.
⋮----
/// Slashing
⋮----
/// @dev Thrown when an operator has been fully slashed(maxMagnitude is 0) for a strategy.
/// or if the staker has had been natively slashed to the point of their beaconChainScalingFactor equalling 0.
⋮----
/// Signatures
⋮----
/// @dev Thrown when attempting to spend a spent eip-712 salt.
⋮----
/// Withdrawal Processing
⋮----
/// @dev Thrown when attempting to withdraw before delay has elapsed.
⋮----
/// @dev Thrown when withdrawer is not the current caller.
⋮----
interface IDelegationManagerTypes {
// @notice Struct used for storing information about a single operator who has registered with EigenLayer
⋮----
/// @notice DEPRECATED -- this field is no longer used, payments are handled in RewardsCoordinator.sol
⋮----
/// @notice Address to verify signatures when a staker wishes to delegate to the operator, as well as controlling "forced undelegations".
/// @dev Signature verification follows these rules:
/// 1) If this address is left as address(0), then any staker will be free to delegate to the operator, i.e. no signature verification will be performed.
/// 2) If this address is an EOA (i.e. it has no code), then we follow standard ECDSA signature verification for delegations to the operator.
/// 3) If this address is a contract (i.e. it has code) then we forward a call to the contract and verify that it returns the correct EIP-1271 "magic value".
⋮----
/// @notice DEPRECATED -- this field is no longer used. An analogous field is the `allocationDelay` stored in the AllocationManager
⋮----
/// @notice Abstract struct used in calculating an EIP712 signature for an operator's delegationApprover to approve that a specific staker delegate to the operator.
/// @dev Used in computing the `DELEGATION_APPROVAL_TYPEHASH` and as a reference in the computation of the approverDigestHash in the `_delegate` function.
⋮----
// the staker who is delegating
⋮----
// the operator being delegated to
⋮----
// the operator's provided salt
⋮----
// the expiration timestamp (UTC) of the signature
⋮----
/// @dev A struct representing an existing queued withdrawal. After the withdrawal delay has elapsed, this withdrawal can be completed via `completeQueuedWithdrawal`.
/// A `Withdrawal` is created by the `DelegationManager` when `queueWithdrawals` is called. The `withdrawalRoots` hashes returned by `queueWithdrawals` can be used
/// to fetch the corresponding `Withdrawal` from storage (via `getQueuedWithdrawal`).
///
/// @param staker The address that queued the withdrawal
/// @param delegatedTo The address that the staker was delegated to at the time the withdrawal was queued. Used to determine if additional slashing occurred before
/// this withdrawal became completable.
/// @param withdrawer The address that will call the contract to complete the withdrawal. Note that this will always equal `staker`; alternate withdrawers are not
/// supported at this time.
/// @param nonce The staker's `cumulativeWithdrawalsQueued` at time of queuing. Used to ensure withdrawals have unique hashes.
/// @param startBlock The block number when the withdrawal was queued.
/// @param strategies The strategies requested for withdrawal when the withdrawal was queued
/// @param scaledShares The staker's deposit shares requested for withdrawal, scaled by the staker's `depositScalingFactor`. Upon completion, these will be
/// scaled by the appropriate slashing factor as of the withdrawal's completable block. The result is what is actually withdrawable.
⋮----
/// @param strategies The strategies to withdraw from
/// @param depositShares For each strategy, the number of deposit shares to withdraw. Deposit shares can
/// be queried via `getDepositedShares`.
/// NOTE: The number of shares ultimately received when a withdrawal is completed may be lower depositShares
/// if the staker or their delegated operator has experienced slashing.
/// @param __deprecated_withdrawer This field is ignored. The only party that may complete a withdrawal
/// is the staker that originally queued it. Alternate withdrawers are not supported.
⋮----
interface IDelegationManagerEvents is IDelegationManagerTypes {
// @notice Emitted when a new operator registers in EigenLayer and provides their delegation approver.
event OperatorRegistered(address indexed operator, address delegationApprover);
⋮----
/// @notice Emitted when an operator updates their delegation approver
event DelegationApproverUpdated(address indexed operator, address newDelegationApprover);
⋮----
/// @notice Emitted when @param operator indicates that they are updating their MetadataURI string
/// @dev Note that these strings are *never stored in storage* and are instead purely emitted in events for off-chain indexing
event OperatorMetadataURIUpdated(address indexed operator, string metadataURI);
⋮----
/// @notice Emitted whenever an operator's shares are increased for a given strategy. Note that shares is the delta in the operator's shares.
event OperatorSharesIncreased(address indexed operator, address staker, IStrategy strategy, uint256 shares);
⋮----
/// @notice Emitted whenever an operator's shares are decreased for a given strategy. Note that shares is the delta in the operator's shares.
event OperatorSharesDecreased(address indexed operator, address staker, IStrategy strategy, uint256 shares);
⋮----
/// @notice Emitted when @param staker delegates to @param operator.
event StakerDelegated(address indexed staker, address indexed operator);
⋮----
/// @notice Emitted when @param staker undelegates from @param operator.
event StakerUndelegated(address indexed staker, address indexed operator);
⋮----
/// @notice Emitted when @param staker is undelegated via a call not originating from the staker themself
event StakerForceUndelegated(address indexed staker, address indexed operator);
⋮----
/// @notice Emitted when a staker's depositScalingFactor is updated
event DepositScalingFactorUpdated(address staker, IStrategy strategy, uint256 newDepositScalingFactor);
⋮----
/// @notice Emitted when a new withdrawal is queued.
/// @param withdrawalRoot Is the hash of the `withdrawal`.
/// @param withdrawal Is the withdrawal itself.
/// @param sharesToWithdraw Is an array of the expected shares that were queued for withdrawal corresponding to the strategies in the `withdrawal`.
event SlashingWithdrawalQueued(bytes32 withdrawalRoot, Withdrawal withdrawal, uint256[] sharesToWithdraw);
⋮----
/// @notice Emitted when a queued withdrawal is completed
event SlashingWithdrawalCompleted(bytes32 withdrawalRoot);
⋮----
/// @notice Emitted whenever an operator's shares are slashed for a given strategy
event OperatorSharesSlashed(address indexed operator, IStrategy strategy, uint256 totalSlashedShares);
⋮----
/// @title DelegationManager
/// @author Layr Labs, Inc.
/// @notice Terms of Service: https://docs.eigenlayer.xyz/overview/terms-of-service
/// @notice  This is the contract for delegation in EigenLayer. The main functionalities of this contract are
/// - enabling anyone to register as an operator in EigenLayer
/// - allowing operators to specify parameters related to stakers who delegate to them
/// - enabling any staker to delegate its stake to the operator of its choice (a given staker can only delegate to a single operator at a time)
/// - enabling a staker to undelegate its assets from the operator it is delegated to (performed as part of the withdrawal process, initiated through the StrategyManager)
interface IDelegationManager is ISignatureUtilsMixin, IDelegationManagerErrors, IDelegationManagerEvents {
/// @dev Initializes the initial owner and paused status.
function initialize(
⋮----
/// @notice Registers the caller as an operator in EigenLayer.
/// @param initDelegationApprover is an address that, if set, must provide a signature when stakers delegate
/// to an operator.
/// @param allocationDelay The delay before allocations take effect.
/// @param metadataURI is a URI for the operator's metadata, i.e. a link providing more details on the operator.
⋮----
/// @dev Once an operator is registered, they cannot 'deregister' as an operator, and they will forever be considered "delegated to themself".
/// @dev This function will revert if the caller is already delegated to an operator.
/// @dev Note that the `metadataURI` is *never stored * and is only emitted in the `OperatorMetadataURIUpdated` event
function registerAsOperator(
⋮----
/// @notice Updates an operator's stored `delegationApprover`.
/// @param operator is the operator to update the delegationApprover for
/// @param newDelegationApprover is the new delegationApprover for the operator
⋮----
/// @dev The caller must have previously registered as an operator in EigenLayer.
function modifyOperatorDetails(
⋮----
/// @notice Called by an operator to emit an `OperatorMetadataURIUpdated` event indicating the information has updated.
/// @param operator The operator to update metadata for
/// @param metadataURI The URI for metadata associated with an operator
⋮----
function updateOperatorMetadataURI(
⋮----
/// @notice Caller delegates their stake to an operator.
/// @param operator The account (`msg.sender`) is delegating its assets to for use in serving applications built on EigenLayer.
/// @param approverSignatureAndExpiry (optional) Verifies the operator approves of this delegation
/// @param approverSalt (optional) A unique single use value tied to an individual signature.
/// @dev The signature/salt are used ONLY if the operator has configured a delegationApprover.
/// If they have not, these params can be left empty.
function delegateTo(
⋮----
/// @notice Undelegates the staker from their operator and queues a withdrawal for all of their shares
/// @param staker The account to be undelegated
/// @return withdrawalRoots The roots of the newly queued withdrawals, if a withdrawal was queued. Returns
/// an empty array if none was queued.
⋮----
/// @dev Reverts if the `staker` is also an operator, since operators are not allowed to undelegate from themselves.
/// @dev Reverts if the caller is not the staker, nor the operator who the staker is delegated to, nor the operator's specified "delegationApprover"
/// @dev Reverts if the `staker` is not delegated to an operator
function undelegate(
⋮----
/// @notice Undelegates the staker from their current operator, and redelegates to `newOperator`
/// Queues a withdrawal for all of the staker's withdrawable shares. These shares will only be
/// delegated to `newOperator` AFTER the withdrawal is completed.
/// @dev This method acts like a call to `undelegate`, then `delegateTo`
/// @param newOperator the new operator that will be delegated all assets
/// @dev NOTE: the following 2 params are ONLY checked if `newOperator` has a `delegationApprover`.
/// If not, they can be left empty.
/// @param newOperatorApproverSig A signature from the operator's `delegationApprover`
/// @param approverSalt A unique single use value tied to the approver's signature
function redelegate(
⋮----
/// @notice Allows a staker to queue a withdrawal of their deposit shares. The withdrawal can be
/// completed after the MIN_WITHDRAWAL_DELAY_BLOCKS via either of the completeQueuedWithdrawal methods.
⋮----
/// While in the queue, these shares are removed from the staker's balance, as well as from their operator's
/// delegated share balance (if applicable). Note that while in the queue, deposit shares are still subject
/// to slashing. If any slashing has occurred, the shares received may be less than the queued deposit shares.
⋮----
/// @dev To view all the staker's strategies/deposit shares that can be queued for withdrawal, see `getDepositedShares`
/// @dev To view the current conversion between a staker's deposit shares and withdrawable shares, see `getWithdrawableShares`
function queueWithdrawals(
⋮----
/// @notice Used to complete a queued withdrawal
/// @param withdrawal The withdrawal to complete
/// @param tokens Array in which the i-th entry specifies the `token` input to the 'withdraw' function of the i-th Strategy in the `withdrawal.strategies` array.
/// @param tokens For each `withdrawal.strategies`, the underlying token of the strategy
/// NOTE: if `receiveAsTokens` is false, the `tokens` array is unused and can be filled with default values. However, `tokens.length` MUST still be equal to `withdrawal.strategies.length`.
/// NOTE: For the `beaconChainETHStrategy`, the corresponding `tokens` value is ignored (can be 0).
/// @param receiveAsTokens If true, withdrawn shares will be converted to tokens and sent to the caller. If false, the caller receives shares that can be delegated to an operator.
/// NOTE: if the caller receives shares and is currently delegated to an operator, the received shares are
/// automatically delegated to the caller's current operator.
function completeQueuedWithdrawal(
⋮----
/// @notice Used to complete multiple queued withdrawals
/// @param withdrawals Array of Withdrawals to complete. See `completeQueuedWithdrawal` for the usage of a single Withdrawal.
/// @param tokens Array of tokens for each Withdrawal. See `completeQueuedWithdrawal` for the usage of a single array.
/// @param receiveAsTokens Whether or not to complete each withdrawal as tokens. See `completeQueuedWithdrawal` for the usage of a single boolean.
/// @dev See `completeQueuedWithdrawal` for relevant dev tags
function completeQueuedWithdrawals(
⋮----
/// @notice Called by a share manager when a staker's deposit share balance in a strategy increases.
/// This method delegates any new shares to an operator (if applicable), and updates the staker's
/// deposit scaling factor regardless.
/// @param staker The address whose deposit shares have increased
/// @param strategy The strategy in which shares have been deposited
/// @param prevDepositShares The number of deposit shares the staker had in the strategy prior to the increase
/// @param addedShares The number of deposit shares added by the staker
⋮----
/// @dev Note that if the either the staker's current operator has been slashed 100% for `strategy`, OR the
/// staker has been slashed 100% on the beacon chain such that the calculated slashing factor is 0, this
/// method WILL REVERT.
function increaseDelegatedShares(
⋮----
/// @notice If the staker is delegated, decreases its operator's shares in response to
/// a decrease in balance in the beaconChainETHStrategy
/// @param staker the staker whose operator's balance will be decreased
/// @param curDepositShares the current deposit shares held by the staker
/// @param beaconChainSlashingFactorDecrease the amount that the staker's beaconChainSlashingFactor has decreased by
/// @dev Note: `beaconChainSlashingFactorDecrease` are assumed to ALWAYS be < 1 WAD.
/// These invariants are maintained in the EigenPodManager.
function decreaseDelegatedShares(
⋮----
/// @notice Decreases the operator's shares in storage after a slash and increases the burnable shares by calling
/// into either the StrategyManager or EigenPodManager (if the strategy is beaconChainETH).
/// @param operator The operator to decrease shares for.
/// @param operatorSet The operator set to decrease shares for.
/// @param slashId The slash id to decrease shares for.
/// @param strategy The strategy to decrease shares for.
/// @param prevMaxMagnitude The previous maxMagnitude of the operator.
/// @param newMaxMagnitude The new maxMagnitude of the operator.
/// @dev Callable only by the AllocationManager.
/// @dev Note: Assumes `prevMaxMagnitude <= newMaxMagnitude`. This invariant is maintained in
/// the AllocationManager.
/// @return totalDepositSharesToSlash The total deposit shares to burn or redistribute.
function slashOperatorShares(
⋮----
///                         VIEW FUNCTIONS
⋮----
/// @notice returns the address of the operator that `staker` is delegated to.
/// @notice Mapping: staker => operator whom the staker is currently delegated to.
/// @dev Note that returning address(0) indicates that the staker is not actively delegated to any operator.
function delegatedTo(
⋮----
/// @notice Mapping: delegationApprover => 32-byte salt => whether or not the salt has already been used by the delegationApprover.
/// @dev Salts are used in the `delegateTo` function. Note that this function only processes the delegationApprover's
/// signature + the provided salt if the operator being delegated to has specified a nonzero address as their `delegationApprover`.
function delegationApproverSaltIsSpent(
⋮----
/// @notice Mapping: staker => cumulative number of queued withdrawals they have ever initiated.
/// @dev This only increments (doesn't decrement), and is used to help ensure that otherwise identical withdrawals have unique hashes.
function cumulativeWithdrawalsQueued(
⋮----
/// @notice Returns 'true' if `staker` *is* actively delegated, and 'false' otherwise.
function isDelegated(
⋮----
/// @notice Returns true is an operator has previously registered for delegation.
function isOperator(
⋮----
/// @notice Returns the delegationApprover account for an operator
function delegationApprover(
⋮----
/// @notice Returns the shares that an operator has delegated to them in a set of strategies
/// @param operator the operator to get shares for
/// @param strategies the strategies to get shares for
function getOperatorShares(
⋮----
/// @notice Returns the shares that a set of operators have delegated to them in a set of strategies
/// @param operators the operators to get shares for
⋮----
function getOperatorsShares(
⋮----
/// @notice Returns amount of withdrawable shares from an operator for a strategy that is still in the queue
/// and therefore slashable.
⋮----
/// @param strategy the strategy to get shares for
/// @return the amount of shares that are slashable in the withdrawal queue for an operator and a strategy
/// @dev If multiple slashes occur to shares in the queue, the function properly accounts for the fewer
///      number of shares that are available to be slashed.
function getSlashableSharesInQueue(
⋮----
/// @notice Given a staker and a set of strategies, return the shares they can queue for withdrawal and the
/// corresponding depositShares.
/// This value depends on which operator the staker is delegated to.
/// The shares amount returned is the actual amount of Strategy shares the staker would receive (subject
/// to each strategy's underlying shares to token ratio).
function getWithdrawableShares(
⋮----
/// @notice Returns the number of shares in storage for a staker and all their strategies
function getDepositedShares(
⋮----
/// @notice Returns the scaling factor applied to a staker's deposits for a given strategy
function depositScalingFactor(
⋮----
/// @notice Returns the Withdrawal associated with a `withdrawalRoot`.
/// @param withdrawalRoot The hash identifying the queued withdrawal.
/// @return withdrawal The withdrawal details.
function queuedWithdrawals(
⋮----
/// @notice Returns the Withdrawal and corresponding shares associated with a `withdrawalRoot`
/// @param withdrawalRoot The hash identifying the queued withdrawal
/// @return withdrawal The withdrawal details
/// @return shares Array of shares corresponding to each strategy in the withdrawal
/// @dev The shares are what a user would receive from completing a queued withdrawal, assuming all slashings are applied
/// @dev Withdrawals queued before the slashing release cannot be queried with this method
function getQueuedWithdrawal(
⋮----
/// @notice Returns all queued withdrawals and their corresponding shares for a staker.
/// @param staker The address of the staker to query withdrawals for.
/// @return withdrawals Array of Withdrawal structs containing details about each queued withdrawal.
/// @return shares 2D array of shares, where each inner array corresponds to the strategies in the withdrawal.
/// @dev The shares are what a user would receive from completing a queued withdrawal, assuming all slashings are applied.
function getQueuedWithdrawals(
⋮----
/// @notice Returns a list of queued withdrawal roots for the `staker`.
/// NOTE that this only returns withdrawals queued AFTER the slashing release.
function getQueuedWithdrawalRoots(
⋮----
/// @notice Converts shares for a set of strategies to deposit shares, likely in order to input into `queueWithdrawals`.
/// This function will revert from a division by 0 error if any of the staker's strategies have a slashing factor of 0.
/// @param staker the staker to convert shares for
/// @param strategies the strategies to convert shares for
/// @param withdrawableShares the shares to convert
/// @return the deposit shares
/// @dev will be a few wei off due to rounding errors
function convertToDepositShares(
⋮----
/// @notice Returns the keccak256 hash of `withdrawal`.
function calculateWithdrawalRoot(
⋮----
/// @notice Calculates the digest hash to be signed by the operator's delegationApprove and used in the `delegateTo` function.
/// @param staker The account delegating their stake
/// @param operator The account receiving delegated stake
/// @param _delegationApprover the operator's `delegationApprover` who will be signing the delegationHash (in general)
/// @param approverSalt A unique and single use value associated with the approver signature.
/// @param expiry Time after which the approver's signature becomes invalid
function calculateDelegationApprovalDigestHash(
⋮----
/// @notice return address of the beaconChainETHStrategy
function beaconChainETHStrategy() external view returns (IStrategy);
⋮----
/// @notice Returns the minimum withdrawal delay in blocks to pass for withdrawals queued to be completable.
/// Also applies to legacy withdrawals so any withdrawals not completed prior to the slashing upgrade will be subject
/// to this longer delay.
/// @dev Backwards-compatible interface to return the internal `MIN_WITHDRAWAL_DELAY_BLOCKS` value
/// @dev Previous value in storage was deprecated. See `__deprecated_minWithdrawalDelayBlocks`
function minWithdrawalDelayBlocks() external view returns (uint32);
⋮----
/// @notice The EIP-712 typehash for the DelegationApproval struct used by the contract
function DELEGATION_APPROVAL_TYPEHASH() external view returns (bytes32);
````

## File: src/contracts/interfaces/IDurationVaultStrategy.sol
````
// SPDX-License-Identifier: BUSL-1.1
⋮----
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.
⋮----
/// @dev Thrown when attempting to configure a zero duration.
⋮----
/// @dev Thrown when attempting to mutate configuration from a non-admin.
⋮----
/// @dev Thrown when attempting to call arbitrator-only functionality from a non-arbitrator.
⋮----
/// @dev Thrown when attempting to configure a zero-address arbitrator.
⋮----
/// @dev Thrown when attempting to lock an already locked vault.
⋮----
/// @dev Thrown when attempting to deposit after the vault has been locked.
⋮----
/// @dev Thrown when attempting to remove shares during the allocations period.
⋮----
/// @dev Thrown when attempting to add shares when not delegated to the vault operator.
⋮----
/// @dev Thrown when attempting to mark the vault as matured before duration elapses.
⋮----
/// @dev Thrown when attempting to use the arbitrator early-advance after the duration has elapsed.
⋮----
/// @dev Thrown when attempting to use the arbitrator early-advance before the vault is locked.
⋮----
/// @dev Thrown when operator integration inputs are missing or invalid.
⋮----
/// @dev Thrown when attempting to deposit into a vault whose underlying token is blacklisted.
⋮----
/// @dev Thrown when a deposit exceeds the configured `maxPerDeposit` limit.
⋮----
/// @dev Thrown when attempting to lock with an operator set that doesn't include this strategy.
⋮----
/// @dev Thrown when attempting to allocate while a pending allocation modification already exists.
⋮----
/// @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.
⋮----
/// @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.
⋮----
/// @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(
⋮----
/// @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
⋮----
/// @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(
⋮----
/// @notice Updates the delegation approver used for operator delegation approvals.
/// @param newDelegationApprover The new delegation approver (0x0 for open delegation).
⋮----
function updateDelegationApprover(
⋮----
/// @notice Updates the operator metadata URI emitted by the DelegationManager.
/// @param newOperatorMetadataURI The new operator metadata URI.
⋮----
function updateOperatorMetadataURI(
⋮----
/// @notice Sets the claimer for operator rewards accrued to the vault.
/// @param claimer The address authorized to claim rewards for the vault.
⋮----
function setRewardsClaimer(
⋮----
/// @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(
⋮----
/// @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);
````

## File: src/contracts/interfaces/IECDSACertificateVerifier.sol
````
// SPDX-License-Identifier: BUSL-1.1
⋮----
import {OperatorSet} from "../libraries/OperatorSetLib.sol";
import "./IBaseCertificateVerifier.sol";
import "./IOperatorTableCalculator.sol";
⋮----
interface IECDSACertificateVerifierErrors {
/// @notice Thrown when the signature length is invalid
/// @dev Error code: 0x4be6321b
/// @dev We require valid signature lengths (65 bytes per signature) for proper ECDSA signature verification and recovery
⋮----
/// @notice Thrown when the signatures are not ordered by signer address to validate unique signers
/// @dev Error code: 0xb550c570
/// @dev We order signers by address as a gas optimization for verification and to ensure unique signers without additional storage
⋮----
/// @notice Thrown when the operator count is zero
/// @dev Error code: 0x40a42054
/// @dev We require a non-zero operator count to ensure there are operators available for certificate verification
⋮----
/// @notice Thrown when the operator index is out of bounds
⋮----
/// @dev We require a valid operator index to ensure the operator exists in the operator table
⋮----
interface IECDSACertificateVerifierTypes is IOperatorTableCalculatorTypes {
/// @notice A Certificate used to verify a set of ECDSA signatures for an off-chain task
/// @param referenceTimestamp a reference timestamp that corresponds to a timestamp at which an operator table was updated for the operatorSet
/// @param messageHash the hash of a task that was completed by operators. The messageHash is defined by the AVS, see `TaskMailbox.sol` for an example implementation.
///                    NOTE: This value is NOT the message that is signed by operators - see `calculateCertificateDigest` for the signable digest.
/// @param sig the concatenated signature of each signing operator, in ascending order of signer address. The signature should be over the signable digest,
///            which is calculated by `calculateCertificateDigest`
/// @dev The signers can be sorted via OZ sort library
/// @dev ECDSA certificates DO NOT support smart contract signatures
/// @dev The `referenceTimestamp` is used to key into the operatorSet's stake weights. It is NOT the timestamp at which the certificate was generated off-chain
⋮----
interface IECDSACertificateVerifierEvents is IECDSACertificateVerifierTypes {
/// @notice Emitted when an ECDSA table is updated
event TableUpdated(OperatorSet operatorSet, uint32 referenceTimestamp, ECDSAOperatorInfo[] operatorInfos);
⋮----
/// @notice An interface for verifying ECDSA certificates
/// @notice This implements the base `IBaseCertificateVerifier` interface
interface IECDSACertificateVerifier is
⋮----
/// @notice The following steps describe the certificate verification process, in order:
/// 1. The AVS configures the following parameters in EigenLayer core:
///    a. AllocationManager.createOperatorSet: Creates an operatorSet
///    b. KeyRegistrar.configureOperatorSet: Configures the curve type of the operatorSet
///    c. CrossChainRegistry.makeGenerationReservation: Registers the operatorSet to be transported by the multichain protocol. This includes
///      the `owner`, `maxStalenessPeriod`, and `operatorTableCalculator` for the operatorSet. The output of the `OperatorTableCalculator`
///      are the operatorSet's stake weights (i.e. operator table) and is transported by the multichain protocol, along with the `maxStalenessPeriod` and `owner`
/// 2. The multichain protocol calculates the operatorTable of an operatorSet. The time at which the table is calculated is the reference timestamp. The protocol
///    will then call `updateOperatorTable` to update the operatorSet's operator table for a given referenceTimestamp
/// 3. A task is created and certificate is generated, off-chain, by the AVS to validate the completion of a task.
///    The reference timestamp in the certificate is used to key into the operator table that was updated in step 2.
/// 4. The certificate is verified, either normally, proportionally, or nominally.
/// @dev The `referenceTimestamp` is used to key into the operatorSet's stake weights. It is NOT when the certificate was generated off-chain
/// @dev The `maxStalenessPeriod` configured in step 1c denotes if a certificate is too stale with respect to the `referenceTimestamp`
/// @dev Operator tables for ALL operatorSets with an active generation reservation are updated at a set cadence. See `crossChainRegistry.tableUpdateCadence` for the frequency of table updates
/// @dev To ensure that operatorSets can immediately begin to verify certificates and that tables do not become stale between table updates (i.e. a large operator has joined or been ejected),
///      the multichain protocol updates tables for operatorSets when the following events are emitted:
///      - AllocationManager: `OperatorSlashed`
///      - AllocationManager: `OperatorAddedToOperatorSet`
///      - AllocationManager: `OperatorRemovedFromOperatorSet`
///      - CrossChainRegistry: `GenerationReservationCreated`
/// @dev Operator tables are updated at a cadence of `tableUpdateCadence` seconds, which is given by `CrossChainRegistry.tableUpdateCadence`. Currently daily on testnet and weekly (Monday) on mainnet at 14:00 UTC
/// @dev Certificates can be replayed across all destination chains
/// @dev Race conditions should be handled by the AVS. The protocol makes no guarantees about how certificates should be verified (eg. preventing certificates against tables that are NOT the latest)
///      Some examples of race conditions include:
///      a. An in-flight certificate for a past reference timestamp and an operator table update for a newer reference timestamp. The AVS should decide whether it
///         wants to only confirm tasks against the *latest* certificate
///      b. An in-flight certificate against a stake table with a majority-stake operator that has been slashed or removed from the operatorSet
/// @notice updates the operatorSet with the operator table (i.e. stake weights) and its configuration
/// @param operatorSet the operatorSet to update the operator table for
/// @param referenceTimestamp the timestamp at which the operatorInfos (i.e. operator table) was sourced
/// @param operatorInfos the operatorInfos to update the operator table with.
///        See `IOperatorTableCalculator.ECDSAOperatorInfo` for more details
/// @param operatorSetConfig the configuration of the operatorSet, which includes the owner and max staleness period
/// @dev This function can only be called by the `OperatorTableUpdater` contract, which is itself permissionless to call
/// @dev The `referenceTimestamp` must correspond to a reference timestamp for a globalTableRoot stored in the `OperatorTableUpdater`
///      In addition, it must be greater than the latest reference timestamp for the given operatorSet
/// @dev Reverts for:
///      - OnlyTableUpdater: Caller is not the operatorTableUpdater
///      - TableUpdateStale: The referenceTimestamp is not greater than the latest reference timestamp
/// @dev Emits the following events:
///      - TableUpdated: When the operator table is successfully updated
function updateOperatorTable(
⋮----
/// @notice verifies a certificate against the operator table for a given reference timestamp
/// @param operatorSet the operatorSet that the certificate is for
/// @param cert a certificate
/// @return totalSignedStakeWeights total stake weight that signed the certificate for each stake type. Each
/// index corresponds to a stake type in the `weights` array in the `ECDSAOperatorInfo` struct
/// @return signers array of addresses that signed the certificate
/// @dev This function DOES NOT support smart contact signatures
/// @dev The `referenceTimestamp` in the `ECDSACertificate` is used to determine the operator table to use for the verification
/// @dev AVS' are responsible for managing potential race conditions when certificates are signed close to operator table updates. Some examples include:
⋮----
///      - CertificateStale: The certificate's referenceTimestamp is too stale with respect to the maxStalenessPeriod of the operatorSet
///      - ReferenceTimestampDoesNotExist: The root at referenceTimestamp does not exist
///      - RootDisabled: The root at referenceTimestamp is not valid
///      - InvalidSignatureLength: Signatures are not proper length
///      - InvalidSignature: Each signature is not valid
///      - SignersNotOrdered: Signatures are not ordered by signer address ascending
///      - ReferenceTimestampDoesNotExist: The operatorSet has not been updated for the referenceTimestamp
///      - OperatorCountZero: There are zero operators for the referenceTimestamp
///      - VerificationFailed: Any signer is not a registered operator
function verifyCertificate(
⋮----
/// @notice verifies a certificate and makes sure that the signed stakes meet
/// provided portions of the total stake weight on the AVS
/// @param operatorSet the operatorSet to verify the certificate for
⋮----
/// @param totalStakeProportionThresholds the proportion, in BPS, of total stake weight that
/// the signed stake of the certificate should meet. Each index corresponds to
/// a stake type in the `weights` array in the `ECDSAOperatorInfo`
/// @return Whether or not the certificate is valid and meets thresholds
⋮----
///      - All requirements from verifyCertificate
///      - ArrayLengthMismatch: signedStakes.length does not equal totalStakeProportionThresholds.length
function verifyCertificateProportion(
⋮----
/// provided nominal stake thresholds
⋮----
/// @param totalStakeNominalThresholds the nominal amount of total stake weight that
⋮----
///      - ArrayLengthMismatch: signedStakes.length does not equal totalStakeNominalThresholds.length
function verifyCertificateNominal(
⋮----
/// @notice Get operator infos for a timestamp, which for each operator is the operator's signing key and stake weights
/// @param operatorSet The operator set
/// @param referenceTimestamp The reference timestamp
/// @return The operator infos, empty if the operatorSet has not been updated for the given reference timestamp
function getOperatorInfos(
⋮----
/// @notice Get a single operator info by index
⋮----
/// @param operatorIndex The index of the operator
/// @return The operator info, empty if the operatorSet has not been updated for the given reference timestamp
/// @dev The index is at most the number of operators in the operatorSet at the given reference timestamp,
///      which is given by `getOperatorCount`
⋮----
///      - IndexOutOfBounds: operatorIndex is greater than or equal to the number of operators
function getOperatorInfo(
⋮----
/// @notice Override domainSeparator to not include chainId
/// @return The domain separator hash without chainId
/// @dev This function overrides the base domainSeparator to not include chainId to replay
///      certificates across multiple destination chains
function domainSeparator() external view returns (bytes32);
⋮----
/// @notice Calculate the EIP-712 digest bytes for a certificate, returning the raw bytes of the digest
⋮----
/// @param messageHash The message hash of the task
/// @return The EIP-712 digest
/// @dev EIP-712 is a standard ECDSA signature verification framework. See https://eips.ethereum.org/EIPS/eip-712 for more details
/// @dev This function is public to allow offchain tools to calculate the same digest
/// @dev Note: This does not support smart contract based signatures for multichain
/// @dev This is a chain-agnostic digest, so it can be used to verify certificates across
///      multiple destination chains
/// @dev This function returns the raw bytes of the digest, which still need to be hashed
///      before signing with ECDSA
function calculateCertificateDigestBytes(
⋮----
/// @notice Calculate the EIP-712 digest for a certificate, returning the hash of the digest
⋮----
function calculateCertificateDigest(
````

## File: src/contracts/interfaces/IEigen.sol
````
// SPDX-License-Identifier: BUSL-1.1
⋮----
import "@openzeppelin/contracts/token/ERC20/IERC20.sol";
⋮----
interface IEigen is IERC20 {
/// @notice This function allows the owner to set the allowedFrom status of an address
/// @param from the address whose allowedFrom status is being set
/// @param isAllowedFrom the new allowedFrom status
function setAllowedFrom(
⋮----
/// @notice This function allows the owner to set the allowedTo status of an address
/// @param to the address whose allowedTo status is being set
/// @param isAllowedTo the new allowedTo status
function setAllowedTo(
⋮----
/// @notice Allows the owner to disable transfer restrictions
function disableTransferRestrictions() external;
⋮----
/// @notice This function allows minter to mint tokens
function mint() external;
⋮----
/// @notice This function allows bEIGEN holders to wrap their tokens into Eigen
function wrap(
⋮----
/// @notice This function allows Eigen holders to unwrap their tokens into bEIGEN
function unwrap(
⋮----
/// @dev Clock used for flagging checkpoints. Has been overridden to implement timestamp based
/// checkpoints (and voting).
function clock() external view returns (uint48);
⋮----
/// @dev Machine-readable description of the clock as specified in EIP-6372.
/// 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);
````

## File: src/contracts/interfaces/IEigenPod.sol
````
// SPDX-License-Identifier: BUSL-1.1
⋮----
import "@openzeppelin/contracts/token/ERC20/IERC20.sol";
⋮----
import "../libraries/BeaconChainProofs.sol";
import "./IEigenPodManager.sol";
⋮----
interface IEigenPodErrors {
/// @dev Thrown when msg.sender is not the EPM.
⋮----
/// @dev Thrown when msg.sender is not the pod owner.
⋮----
/// @dev Thrown when msg.sender is not owner or the proof submitter.
⋮----
/// @dev Thrown when attempting an action that is currently paused.
⋮----
/// Invalid Inputs
⋮----
/// @dev Thrown when an address of zero is provided.
⋮----
/// @dev Thrown when two array parameters have mismatching lengths.
⋮----
/// @dev Thrown when `validatorPubKey` length is not equal to 48-bytes.
⋮----
/// @dev Thrown when provided timestamp is out of range.
⋮----
/// Checkpoints
⋮----
/// @dev Thrown when no active checkpoints are found.
⋮----
/// @dev Thrown if an uncompleted checkpoint exists.
⋮----
/// @dev Thrown if there's not a balance available to checkpoint.
⋮----
/// @dev Thrown when attempting to create a checkpoint twice within a given block.
⋮----
/// Withdrawing
⋮----
/// @dev Thrown when amount exceeds `restakedExecutionLayerGwei`.
⋮----
/// Validator Status
⋮----
/// @dev Thrown when a validator's withdrawal credentials have already been verified.
⋮----
/// @dev Thrown if the provided proof is not valid for this EigenPod.
⋮----
/// @dev Thrown when a validator is not in the ACTIVE status in the pod.
⋮----
/// @dev Thrown when validator is not active yet on the beacon chain.
⋮----
/// @dev Thrown if a validator is exiting the beacon chain.
⋮----
/// @dev Thrown when a validator has not been slashed on the beacon chain.
⋮----
/// Consolidation and Withdrawal Requests
⋮----
/// @dev Thrown when a predeploy request is initiated with insufficient msg.value
⋮----
/// @dev Thrown when calling the predeploy fails
⋮----
/// @dev Thrown when querying a predeploy for its current fee fails
⋮----
/// Misc
⋮----
/// @dev Thrown when an invalid block root is returned by the EIP-4788 oracle.
⋮----
/// @dev Thrown when attempting to send an invalid amount to the beacon deposit contract.
⋮----
/// @dev Thrown when provided `beaconTimestamp` is too far in the past.
⋮----
/// @dev Thrown when provided `beaconTimestamp` is before the last checkpoint
⋮----
/// @dev Thrown when the pectraForkTimestamp returned from the EigenPodManager is zero
⋮----
interface IEigenPodTypes {
⋮----
INACTIVE, // doesnt exist
ACTIVE, // staked on ethpos and withdrawal credentials are pointed to the EigenPod
WITHDRAWN // withdrawn from the Beacon Chain
⋮----
/// @param validatorIndex index of the validator on the beacon chain
/// @param restakedBalanceGwei amount of beacon chain ETH restaked on EigenLayer in gwei
/// @param lastCheckpointedAt timestamp of the validator's most recent balance update
/// @param status last recorded status of the validator
⋮----
/// @param srcPubkey the pubkey of the source validator for the consolidation
/// @param targetPubkey the pubkey of the target validator for the consolidation
/// @dev Note that if srcPubkey == targetPubkey, this is a "switch request," and will
/// change the validator's withdrawal credential type from 0x01 to 0x02.
/// For more notes on usage, see `requestConsolidation`
⋮----
/// @param pubkey the pubkey of the validator to withdraw from
/// @param amountGwei the amount (in gwei) to withdraw from the beacon chain to the pod
/// @dev Note that if amountGwei == 0, this is a "full exit request," and will fully exit
/// the validator to the pod.
/// For more notes on usage, see `requestWithdrawal`
⋮----
interface IEigenPodEvents is IEigenPodTypes {
/// @notice Emitted when an ETH validator stakes via this eigenPod
event EigenPodStaked(bytes32 pubkeyHash);
⋮----
/// @notice Emitted when a pod owner updates the proof submitter address
event ProofSubmitterUpdated(address prevProofSubmitter, address newProofSubmitter);
⋮----
/// @notice Emitted when an ETH validator's withdrawal credentials are successfully verified to be pointed to this eigenPod
event ValidatorRestaked(bytes32 pubkeyHash);
⋮----
/// @notice Emitted when an ETH validator's  balance is proven to be updated.  Here newValidatorBalanceGwei
//  is the validator's balance that is credited on EigenLayer.
event ValidatorBalanceUpdated(bytes32 pubkeyHash, uint64 balanceTimestamp, uint64 newValidatorBalanceGwei);
⋮----
/// @notice Emitted when restaked beacon chain ETH is withdrawn from the eigenPod.
event RestakedBeaconChainETHWithdrawn(address indexed recipient, uint256 amount);
⋮----
/// @notice Emitted when ETH is received via the `receive` fallback
event NonBeaconChainETHReceived(uint256 amountReceived);
⋮----
/// @notice Emitted when a checkpoint is created
event CheckpointCreated(
⋮----
/// @notice Emitted when a checkpoint is finalized
event CheckpointFinalized(uint64 indexed checkpointTimestamp, int256 totalShareDeltaWei);
⋮----
/// @notice Emitted when a validator is proven for a given checkpoint
event ValidatorCheckpointed(uint64 indexed checkpointTimestamp, bytes32 indexed pubkeyHash);
⋮----
/// @notice Emitted when a validator is proven to have 0 balance at a given checkpoint
event ValidatorWithdrawn(uint64 indexed checkpointTimestamp, bytes32 indexed pubkeyHash);
⋮----
/// @notice Emitted when a consolidation request is initiated where source == target
event SwitchToCompoundingRequested(bytes32 indexed validatorPubkeyHash);
⋮----
/// @notice Emitted when a standard consolidation request is initiated
event ConsolidationRequested(bytes32 indexed sourcePubkeyHash, bytes32 indexed targetPubkeyHash);
⋮----
/// @notice Emitted when a withdrawal request is initiated where request.amountGwei == 0
event ExitRequested(bytes32 indexed validatorPubkeyHash);
⋮----
/// @notice Emitted when a partial withdrawal request is initiated
event WithdrawalRequested(bytes32 indexed validatorPubkeyHash, uint64 withdrawalAmountGwei);
⋮----
/// @title The implementation contract used for restaking beacon chain ETH on EigenLayer
/// @author Layr Labs, Inc.
/// @notice Terms of Service: https://docs.eigenlayer.xyz/overview/terms-of-service
/// @dev Note that all beacon chain balances are stored as gwei within the beacon chain datastructures. We choose
///   to account balances in terms of gwei in the EigenPod contract and convert to wei when making calls to other contracts
interface IEigenPod is IEigenPodErrors, IEigenPodEvents {
/// @notice Used to initialize the pointers to contracts crucial to the pod's functionality, in beacon proxy construction from EigenPodManager
function initialize(
⋮----
/// @notice Called by EigenPodManager when the owner wants to create another ETH validator.
/// @dev This function only supports staking to a 0x01 validator. For compounding validators, please interact directly with the deposit contract.
function stake(
⋮----
/// @notice Transfers `amountWei` from this contract to the `recipient`. Only callable by the EigenPodManager as part
/// of the DelegationManager's withdrawal flow.
/// @dev `amountWei` is not required to be a whole Gwei amount. Amounts less than a Gwei multiple may be unrecoverable due to Gwei conversion.
function withdrawRestakedBeaconChainETH(
⋮----
/// @dev Create a checkpoint used to prove this pod's active validator set. Checkpoints are completed
/// by submitting one checkpoint proof per ACTIVE validator. During the checkpoint process, the total
/// change in ACTIVE validator balance is tracked, and any validators with 0 balance are marked `WITHDRAWN`.
/// @dev Once finalized, the pod owner is awarded shares corresponding to:
/// - the total change in their ACTIVE validator balances
/// - any ETH in the pod not already awarded shares
/// @dev A checkpoint cannot be created if the pod already has an outstanding checkpoint. If
/// this is the case, the pod owner MUST complete the existing checkpoint before starting a new one.
/// @param revertIfNoBalance Forces a revert if the pod ETH balance is 0. This allows the pod owner
/// to prevent accidentally starting a checkpoint that will not increase their shares
function startCheckpoint(
⋮----
/// @dev Progress the current checkpoint towards completion by submitting one or more validator
/// checkpoint proofs. Anyone can call this method to submit proofs towards the current checkpoint.
/// For each validator proven, the current checkpoint's `proofsRemaining` decreases.
/// @dev If the checkpoint's `proofsRemaining` reaches 0, the checkpoint is finalized.
/// (see `_updateCheckpoint` for more details)
/// @dev This method can only be called when there is a currently-active checkpoint.
/// @param balanceContainerProof proves the beacon's current balance container root against a checkpoint's `beaconBlockRoot`
/// @param proofs Proofs for one or more validator current balances against the `balanceContainerRoot`
function verifyCheckpointProofs(
⋮----
/// @dev Verify one or more validators have their withdrawal credentials pointed at this EigenPod, and award
/// shares based on their effective balance. Proven validators are marked `ACTIVE` within the EigenPod, and
/// future checkpoint proofs will need to include them.
/// @dev Withdrawal credential proofs MUST NOT be older than `currentCheckpointTimestamp`.
/// @dev Validators proven via this method MUST NOT have an exit epoch set already.
/// @param beaconTimestamp the beacon chain timestamp sent to the 4788 oracle contract. Corresponds
/// to the parent beacon block root against which the proof is verified.
/// @param stateRootProof proves a beacon state root against a beacon block root
/// @param validatorIndices a list of validator indices being proven
/// @param validatorFieldsProofs proofs of each validator's `validatorFields` against the beacon state root
/// @param validatorFields the fields of the beacon chain "Validator" container. See consensus specs for
/// details: https://github.com/ethereum/consensus-specs/blob/dev/specs/phase0/beacon-chain.md#validator
function verifyWithdrawalCredentials(
⋮----
/// @dev Prove that one of this pod's active validators was slashed on the beacon chain. A successful
/// staleness proof allows the caller to start a checkpoint.
///
/// @dev Note that in order to start a checkpoint, any existing checkpoint must already be completed!
/// (See `_startCheckpoint` for details)
⋮----
/// @dev Note that this method allows anyone to start a checkpoint as soon as a slashing occurs on the beacon
/// chain. This is intended to make it easier to external watchers to keep a pod's balance up to date.
⋮----
/// @dev Note too that beacon chain slashings are not instant. There is a delay between the initial slashing event
/// and the validator's final exit back to the execution layer. During this time, the validator's balance may or
/// may not drop further due to a correlation penalty. This method allows proof of a slashed validator
/// to initiate a checkpoint for as long as the validator remains on the beacon chain. Once the validator
/// has exited and been checkpointed at 0 balance, they are no longer "checkpoint-able" and cannot be proven
/// "stale" via this method.
/// See https://eth2book.info/capella/part3/transition/epoch/#slashings for more info.
⋮----
/// @param proof the fields of the beacon chain "Validator" container, along with a merkle proof against
/// the beacon state root. See the consensus specs for more details:
/// https://github.com/ethereum/consensus-specs/blob/dev/specs/phase0/beacon-chain.md#validator
⋮----
/// @dev Staleness conditions:
/// - Validator's last checkpoint is older than `beaconTimestamp`
/// - Validator MUST be in `ACTIVE` status in the pod
/// - Validator MUST be slashed on the beacon chain
function verifyStaleBalance(
⋮----
/// @notice Allows the owner or proof submitter to initiate one or more requests to
/// consolidate their validators on the beacon chain.
/// @param requests An array of requests consisting of the source and target pubkeys
/// of the validators to be consolidated
/// @dev The target validator MUST have ACTIVE (proven) withdrawal credentials pointed at
/// the pod. This prevents cross-pod consolidations.
/// @dev The consolidation request predeploy requires a fee is sent with each request;
/// this is pulled from msg.value. After submitting all requests, any remaining fee is
/// refunded to the caller by calling its fallback function.
/// @dev This contract exposes `getConsolidationRequestFee` to query the current fee for
/// a single request. If submitting multiple requests in a single block, the total fee
/// is equal to (fee * requests.length). This fee is updated at the end of each block.
⋮----
/// (See https://eips.ethereum.org/EIPS/eip-7251#fee-calculation for details)
⋮----
/// @dev Note on beacon chain behavior:
/// - If request.srcPubkey == request.targetPubkey, this is a "switch" consolidation. Once
///   processed on the beacon chain, the validator's withdrawal credentials will be changed
///   to compounding (0x02).
/// - The rest of the notes assume src != target.
/// - The target validator MUST already have 0x02 credentials. The source validator can have either.
/// - Consolidation sets the source validator's exit_epoch and withdrawable_epoch, similar to an exit.
///   When the exit epoch is reached, an epoch sweep will process the consolidation and transfer balance
///   from the source to the target validator.
/// - Consolidation transfers min(srcValidator.effective_balance, state.balance[srcIndex]) to the target.
///   This may not be the entirety of the source validator's balance; any remainder will be moved to the
///   pod when hit by a subsequent withdrawal sweep.
⋮----
/// @dev Note that consolidation requests CAN FAIL for a variety of reasons. Failures occur when the request
/// is processed on the beacon chain, and are invisible to the pod. The pod and predeploy cannot guarantee
/// a request will succeed; it's up to the pod owner to determine this for themselves. If your request fails,
/// you can retry by initiating another request via this method.
⋮----
/// Some requirements that are NOT checked by the pod:
/// - If request.srcPubkey == request.targetPubkey, the validator MUST have 0x01 credentials
/// - If request.srcPubkey != request.targetPubkey, the target validator MUST have 0x02 credentials
/// - Both the source and target validators MUST be active on the beacon chain and MUST NOT have
///   initiated exits
/// - The source validator MUST NOT have pending partial withdrawal requests (via `requestWithdrawal`)
/// - If the source validator is slashed after requesting consolidation (but before processing),
///   the consolidation will be skipped.
⋮----
/// For further reference, see consolidation processing at block and epoch boundaries:
/// - Block: https://github.com/ethereum/consensus-specs/blob/dev/specs/electra/beacon-chain.md#new-process_consolidation_request
/// - Epoch: https://github.com/ethereum/consensus-specs/blob/dev/specs/electra/beacon-chain.md#new-process_pending_consolidations
function requestConsolidation(
⋮----
/// withdraw funds from validators on the beacon chain.
/// @param requests An array of requests consisting of the source validator and an
/// amount to withdraw
/// @dev The withdrawal request predeploy requires a fee is sent with each request;
⋮----
/// @dev This contract exposes `getWithdrawalRequestFee` to query the current fee for
⋮----
/// (See https://eips.ethereum.org/EIPS/eip-7002#fee-update-rule for details)
⋮----
/// - Withdrawal requests have two types: full exit requests, and partial exit requests.
///   Partial exit requests will be skipped if the validator has 0x01 withdrawal credentials.
///   If you want your validators to have access to partial exits, use `requestConsolidation`
///   to change their withdrawal credentials to compounding (0x02).
/// - If request.amount == 0, this is a FULL exit request. A full exit request initiates a
///   standard validator exit.
/// - Other amounts are treated as PARTIAL exit requests. A partial exit request will NOT result
///   in a validator with less than 32 ETH balance. Any requested amount above this is ignored.
/// - The actual amount withdrawn for a partial exit is given by the formula:
///   min(request.amount, state.balances[vIdx] - 32 ETH - pending_balance_to_withdraw)
///   (where `pending_balance_to_withdraw` is the sum of any outstanding partial exit requests)
///   (Note that this means you may request more than is actually withdrawn!)
⋮----
/// @dev Note that withdrawal requests CAN FAIL for a variety of reasons. Failures occur when the request
⋮----
/// - request.pubkey MUST be a valid validator pubkey
/// - request.pubkey MUST belong to a validator whose withdrawal credentials are this pod
/// - If request.amount is for a partial exit, the validator MUST have 0x02 withdrawal credentials
/// - If request.amount is for a full exit, the validator MUST NOT have any pending partial exits
/// - The validator MUST be active and MUST NOT have initiated exit
⋮----
/// For further reference: https://github.com/ethereum/consensus-specs/blob/dev/specs/electra/beacon-chain.md#new-process_withdrawal_request
function requestWithdrawal(
⋮----
/// @notice called by owner of a pod to remove any ERC20s deposited in the pod
function recoverTokens(
⋮----
/// @notice Allows the owner of a pod to update the proof submitter, a permissioned
/// address that can call various EigenPod methods, but cannot trigger asset withdrawals
/// from the DelegationManager.
/// @dev Note that EITHER the podOwner OR proofSubmitter can access these methods,
/// so it's fine to set your proofSubmitter to 0 if you want the podOwner to be the
/// only address that can call these methods.
/// @param newProofSubmitter The new proof submitter address. If set to 0, only the
/// pod owner will be able to call EigenPod methods.
function setProofSubmitter(
⋮----
///                                VIEW METHODS
⋮----
/// @notice An address with permissions to call `startCheckpoint` and `verifyWithdrawalCredentials`, set
/// by the podOwner. This role exists to allow a podOwner to designate a hot wallet that can call
/// these methods, allowing the podOwner to remain a cold wallet that is only used to manage funds.
/// @dev If this address is NOT set, only the podOwner can call `startCheckpoint` and `verifyWithdrawalCredentials`
function proofSubmitter() external view returns (address);
⋮----
/// @notice Native ETH in the pod that has been accounted for in a checkpoint (denominated in gwei).
/// This amount is withdrawable from the pod via the DelegationManager withdrawal flow.
function withdrawableRestakedExecutionLayerGwei() external view returns (uint64);
⋮----
/// @notice The single EigenPodManager for EigenLayer
function eigenPodManager() external view returns (IEigenPodManager);
⋮----
/// @notice The owner of this EigenPod
function podOwner() external view returns (address);
⋮----
/// @notice Returns the validatorInfo struct for the provided pubkeyHash
function validatorPubkeyHashToInfo(
⋮----
/// @notice Returns the validatorInfo struct for the provided pubkey
function validatorPubkeyToInfo(
⋮----
/// @notice Returns the validator status for a given validator pubkey hash
function validatorStatus(
⋮----
/// @notice Returns the validator status for a given validator pubkey
⋮----
/// @notice Number of validators with proven withdrawal credentials, who do not have proven full withdrawals
function activeValidatorCount() external view returns (uint256);
⋮----
/// @notice The timestamp of the last checkpoint finalized
function lastCheckpointTimestamp() external view returns (uint64);
⋮----
/// @notice The timestamp of the currently-active checkpoint. Will be 0 if there is not active checkpoint
function currentCheckpointTimestamp() external view returns (uint64);
⋮----
/// @notice Returns the currently-active checkpoint
/// If there's not an active checkpoint, this method returns the checkpoint that was last active.
function currentCheckpoint() external view returns (Checkpoint memory);
⋮----
/// @notice For each checkpoint, the total balance attributed to exited validators, in gwei
⋮----
/// NOTE that the values added to this mapping are NOT guaranteed to capture the entirety of a validator's
/// exit - rather, they capture the total change in a validator's balance when a checkpoint shows their
/// balance change from nonzero to zero. While a change from nonzero to zero DOES guarantee that a validator
/// has been fully exited, it is possible that the magnitude of this change does not capture what is
/// typically thought of as a "full exit."
⋮----
/// For example:
/// 1. Consider a validator was last checkpointed at 32 ETH before exiting. Once the exit has been processed,
/// it is expected that the validator's exited balance is calculated to be `32 ETH`.
/// 2. However, before `startCheckpoint` is called, a deposit is made to the validator for 1 ETH. The beacon
/// chain will automatically withdraw this ETH, but not until the withdrawal sweep passes over the validator
/// again. Until this occurs, the validator's current balance (used for checkpointing) is 1 ETH.
/// 3. If `startCheckpoint` is called at this point, the balance delta calculated for this validator will be
/// `-31 ETH`, and because the validator has a nonzero balance, it is not marked WITHDRAWN.
/// 4. After the exit is processed by the beacon chain, a subsequent `startCheckpoint` and checkpoint proof
/// will calculate a balance delta of `-1 ETH` and attribute a 1 ETH exit to the validator.
⋮----
/// If this edge case impacts your usecase, it should be possible to mitigate this by monitoring for deposits
/// to your exited validators, and waiting to call `startCheckpoint` until those deposits have been automatically
/// exited.
⋮----
/// Additional edge cases this mapping does not cover:
/// - If a validator is slashed, their balance exited will reflect their original balance rather than the slashed amount
/// - The final partial withdrawal for an exited validator will be likely be included in this mapping.
///   i.e. if a validator was last checkpointed at 32.1 ETH before exiting, the next checkpoint will calculate their
///   "exited" amount to be 32.1 ETH rather than 32 ETH.
function checkpointBalanceExitedGwei(
⋮----
/// @notice Query the 4788 oracle to get the parent block root of the slot with the given `timestamp`
/// @param timestamp of the block for which the parent block root will be returned. MUST correspond
/// to an existing slot within the last 24 hours. If the slot at `timestamp` was skipped, this method
/// will revert.
function getParentBlockRoot(
⋮----
/// @notice Returns the fee required to add a consolidation request to the EIP-7251 predeploy this block.
/// @dev Note that the predeploy updates its fee every block according to https://eips.ethereum.org/EIPS/eip-7251#fee-calculation
/// Consider overestimating the amount sent to ensure the fee does not update before your transaction.
function getConsolidationRequestFee() external view returns (uint256);
⋮----
/// @notice Returns the current fee required to add a withdrawal request to the EIP-7002 predeploy.
/// @dev Note that the predeploy updates its fee every block according to https://eips.ethereum.org/EIPS/eip-7002#fee-update-rule
⋮----
function getWithdrawalRequestFee() external view returns (uint256);
````

## File: src/contracts/interfaces/IEigenPodManager.sol
````
// SPDX-License-Identifier: BUSL-1.1
⋮----
import "@openzeppelin/contracts/proxy/beacon/IBeacon.sol";
import "./IETHPOSDeposit.sol";
import "./IStrategyManager.sol";
import "./IEigenPod.sol";
import "./IShareManager.sol";
import "./IPausable.sol";
import "./IStrategy.sol";
⋮----
interface IEigenPodManagerErrors {
/// @dev Thrown when caller is not a EigenPod.
⋮----
/// @dev Thrown when caller is not DelegationManager.
⋮----
/// @dev Thrown when caller already has an EigenPod.
⋮----
/// @dev Thrown when shares is not a multiple of gwei.
⋮----
/// @dev Thrown when shares would result in a negative integer.
⋮----
/// @dev Thrown when the strategy is not the beaconChainETH strategy.
⋮----
/// @dev Thrown when the pods shares are negative and a beacon chain balance update is attempted.
/// The podOwner should complete legacy withdrawal first.
⋮----
/// @dev Thrown when caller is not the proof timestamp setter
⋮----
interface IEigenPodManagerEvents {
/// @notice Emitted to notify the deployment of an EigenPod
event PodDeployed(address indexed eigenPod, address indexed podOwner);
⋮----
/// @notice Emitted to notify a deposit of beacon chain ETH recorded in the strategy manager
event BeaconChainETHDeposited(address indexed podOwner, uint256 amount);
⋮----
/// @notice Emitted when the balance of an EigenPod is updated
event PodSharesUpdated(address indexed podOwner, int256 sharesDelta);
⋮----
/// @notice Emitted every time the total shares of a pod are updated
event NewTotalShares(address indexed podOwner, int256 newTotalShares);
⋮----
/// @notice Emitted when a withdrawal of beacon chain ETH is completed
event BeaconChainETHWithdrawalCompleted(
⋮----
/// @notice Emitted when a staker's beaconChainSlashingFactor is updated
event BeaconChainSlashingFactorDecreased(
⋮----
/// @notice Emitted when an operator is slashed and shares to be burned are increased
event BurnableETHSharesIncreased(uint256 shares);
⋮----
/// @notice Emitted when the Pectra fork timestamp is updated
event PectraForkTimestampSet(uint64 newPectraForkTimestamp);
⋮----
/// @notice Emitted when the proof timestamp setter is updated
event ProofTimestampSetterSet(address newProofTimestampSetter);
⋮----
interface IEigenPodManagerTypes {
/// @notice The amount of beacon chain slashing experienced by a pod owner as a proportion of WAD
/// @param isSet whether the slashingFactor has ever been updated. Used to distinguish between
/// a value of "0" and an uninitialized value.
/// @param slashingFactor the proportion of the pod owner's balance that has been decreased due to
/// slashing or other beacon chain balance decreases.
/// @dev NOTE: if !isSet, `slashingFactor` should be treated as WAD. `slashingFactor` is monotonically
/// decreasing and can hit 0 if fully slashed.
⋮----
/// @title Interface for factory that creates and manages solo staking pods that have their withdrawal credentials pointed to EigenLayer.
/// @author Layr Labs, Inc.
/// @notice Terms of Service: https://docs.eigenlayer.xyz/overview/terms-of-service
interface IEigenPodManager is
⋮----
/// @notice Creates an EigenPod for the sender.
/// @dev Function will revert if the `msg.sender` already has an EigenPod.
/// @dev Returns EigenPod address
function createPod() external returns (address);
⋮----
/// @notice Stakes for a new beacon chain validator on the sender's EigenPod.
/// Also creates an EigenPod for the sender if they don't have one already.
/// @param pubkey The 48 bytes public key of the beacon chain validator.
/// @param signature The validator's signature of the deposit data.
/// @param depositDataRoot The root/hash of the deposit data for the validator's deposit.
function stake(
⋮----
/// @notice Adds any positive share delta to the pod owner's deposit shares, and delegates them to the pod
/// owner's operator (if applicable). A negative share delta does NOT impact the pod owner's deposit shares,
/// but will reduce their beacon chain slashing factor and delegated shares accordingly.
/// @param podOwner is the pod owner whose balance is being updated.
/// @param prevRestakedBalanceWei is the total amount restaked through the pod before the balance update, including
/// any amount currently in the withdrawal queue.
/// @param balanceDeltaWei is the amount the balance changed
/// @dev Callable only by the podOwner's EigenPod contract.
/// @dev Reverts if `sharesDelta` is not a whole Gwei amount
function recordBeaconChainETHBalanceUpdate(
⋮----
/// @notice Sets the address that can set proof timestamps
function setProofTimestampSetter(
⋮----
/// @notice Sets the Pectra fork timestamp, only callable by `proofTimestampSetter`
function setPectraForkTimestamp(
⋮----
/// @notice Returns the address of the `podOwner`'s EigenPod if it has been deployed.
function ownerToPod(
⋮----
/// @notice Returns the address of the `podOwner`'s EigenPod (whether it is deployed yet or not).
function getPod(
⋮----
/// @notice The ETH2 Deposit Contract
function ethPOS() external view returns (IETHPOSDeposit);
⋮----
/// @notice Beacon proxy to which the EigenPods point
function eigenPodBeacon() external view returns (IBeacon);
⋮----
/// @notice Returns 'true' if the `podOwner` has created an EigenPod, and 'false' otherwise.
function hasPod(
⋮----
/// @notice Returns the number of EigenPods that have been created
function numPods() external view returns (uint256);
⋮----
/// @notice Mapping from Pod owner owner to the number of shares they have in the virtual beacon chain ETH strategy.
/// @dev The share amount can become negative. This is necessary to accommodate the fact that a pod owner's virtual beacon chain ETH shares can
/// decrease between the pod owner queuing and completing a withdrawal.
/// When the pod owner's shares would otherwise increase, this "deficit" is decreased first _instead_.
/// Likewise, when a withdrawal is completed, this "deficit" is decreased and the withdrawal amount is decreased; We can think of this
/// as the withdrawal "paying off the deficit".
function podOwnerDepositShares(
⋮----
/// @notice returns canonical, virtual beaconChainETH strategy
function beaconChainETHStrategy() external view returns (IStrategy);
⋮----
/// @notice Returns the historical sum of proportional balance decreases a pod owner has experienced when
/// updating their pod's balance.
function beaconChainSlashingFactor(
⋮----
/// @notice Returns the accumulated amount of beacon chain ETH Strategy shares
function burnableETHShares() external view returns (uint256);
⋮----
/// @notice Returns the timestamp of the Pectra hard fork
/// @dev Specifically, this returns the timestamp of the first non-missed slot at or after the Pectra hard fork
function pectraForkTimestamp() external view returns (uint64);
````

## File: src/contracts/interfaces/IEmissionsController.sol
````
// SPDX-License-Identifier: BUSL-1.1
⋮----
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.
⋮----
/// @dev Thrown when caller is not the incentive council.
⋮----
/// @dev Thrown when the start epoch is the current or past epoch.
⋮----
/// @dev Thrown when the total weight of all distributions exceeds the max total weight (100%).
⋮----
/// @dev Thrown when attempting to add a disabled distribution.
⋮----
/// @dev Thrown when all distributions have been processed for the current epoch.
⋮----
/// @dev Thrown when not all distributions have been processed for the current epoch.
⋮----
/// @dev Thrown when the distribution type is invalid. Should be unreachable.
⋮----
/// @dev Thrown when rewards submissions array is empty for a distribution that requires it.
⋮----
/// @dev Thrown when the operator set is not registered.
⋮----
/// @dev Thrown when emissions have not started yet.
⋮----
/// @dev Thrown when epoch length is not aligned with CALCULATION_INTERVAL_SECONDS.
⋮----
/// @dev Thrown when start time is not aligned with CALCULATION_INTERVAL_SECONDS.
⋮----
/// @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
⋮----
/// @notice A struct containing the total minted and processed amounts for an epoch.
⋮----
/// Whether the epoch has been minted.
⋮----
/// The total number of distributions processed for the epoch.
⋮----
/// The total number of distributions that have been added this epoch.
⋮----
/// @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.
⋮----
/// The bips denominated weight of the distribution.
⋮----
/// The configured start epoch.
⋮----
/// The number of epochs to repeat the distribution (0 for infinite, 1 for single epoch, N for N epochs).
⋮----
/// The type of distribution.
⋮----
/// The operator set (Required only for OperatorSetTotalStake and OperatorSetUniqueStake distribution types).
⋮----
/// The strategies and their respective multipliers for distributing rewards.
⋮----
/// @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(
⋮----
/// @notice Emitted when a distribution is added.
⋮----
/// @param epoch The epoch the distribution was added.
⋮----
event DistributionAdded(uint256 indexed distributionId, uint256 indexed epoch, Distribution distribution);
⋮----
/// @notice Emitted when a distribution is updated.
⋮----
/// @param epoch The epoch the distribution was updated.
⋮----
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.
⋮----
function BACKING_EIGEN() external view returns (IBackingEigen);
⋮----
/// @notice The AllocationManager address.
⋮----
function ALLOCATION_MANAGER() external view returns (IAllocationManager);
⋮----
/// @notice The RewardsCoordinator address.
⋮----
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.
⋮----
function EMISSIONS_INFLATION_RATE() external view returns (uint256);
⋮----
/// @notice The start time of the emissions.
⋮----
function EMISSIONS_START_TIME() external view returns (uint256);
⋮----
/// @notice The cooldown seconds of the emissions.
⋮----
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(
⋮----
/// 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(
⋮----
/// 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.
⋮----
function setIncentiveCouncil(
⋮----
/// 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(
⋮----
/// @notice Updates an existing distribution's parameters.
⋮----
///      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.
⋮----
/// @param distributionId The id of the distribution to update.
/// @param distribution The new distribution parameters.
function updateDistribution(
⋮----
/// 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.
⋮----
/// @return The Distribution struct at the given index.
function getDistribution(
⋮----
/// @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(
````

## File: src/contracts/interfaces/IETHPOSDeposit.sol
````
// ┏━━━┓━┏┓━┏┓━━┏━━━┓━━┏━━━┓━━━━┏━━━┓━━━━━━━━━━━━━━━━━━━┏┓━━━━━┏━━━┓━━━━━━━━━┏┓━━━━━━━━━━━━━━┏┓━
// ┃┏━━┛┏┛┗┓┃┃━━┃┏━┓┃━━┃┏━┓┃━━━━┗┓┏┓┃━━━━━━━━━━━━━━━━━━┏┛┗┓━━━━┃┏━┓┃━━━━━━━━┏┛┗┓━━━━━━━━━━━━┏┛┗┓
// ┃┗━━┓┗┓┏┛┃┗━┓┗┛┏┛┃━━┃┃━┃┃━━━━━┃┃┃┃┏━━┓┏━━┓┏━━┓┏━━┓┏┓┗┓┏┛━━━━┃┃━┗┛┏━━┓┏━┓━┗┓┏┛┏━┓┏━━┓━┏━━┓┗┓┏┛
// ┃┏━━┛━┃┃━┃┏┓┃┏━┛┏┛━━┃┃━┃┃━━━━━┃┃┃┃┃┏┓┃┃┏┓┃┃┏┓┃┃━━┫┣┫━┃┃━━━━━┃┃━┏┓┃┏┓┃┃┏┓┓━┃┃━┃┏┛┗━┓┃━┃┏━┛━┃┃━
// ┃┗━━┓━┃┗┓┃┃┃┃┃┃┗━┓┏┓┃┗━┛┃━━━━┏┛┗┛┃┃┃━┫┃┗┛┃┃┗┛┃┣━━┃┃┃━┃┗┓━━━━┃┗━┛┃┃┗┛┃┃┃┃┃━┃┗┓┃┃━┃┗┛┗┓┃┗━┓━┃┗┓
// ┗━━━┛━┗━┛┗┛┗┛┗━━━┛┗┛┗━━━┛━━━━┗━━━┛┗━━┛┃┏━┛┗━━┛┗━━┛┗┛━┗━┛━━━━┗━━━┛┗━━┛┗┛┗┛━┗━┛┗┛━┗━━━┛┗━━┛━┗━┛
// ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┃┃━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
// ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┗┛━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
⋮----
// SPDX-License-Identifier: CC0-1.0
⋮----
// This interface is designed to be compatible with the Vyper version.
/// @notice This is the Ethereum 2.0 deposit contract interface.
/// For more information see the Phase 0 specification under https://github.com/ethereum/eth2.0-specs
interface IETHPOSDeposit {
/// @notice A processed deposit event.
event DepositEvent(bytes pubkey, bytes withdrawal_credentials, bytes amount, bytes signature, bytes index);
⋮----
/// @notice Submit a Phase 0 DepositData object.
/// @param pubkey A BLS12-381 public key.
/// @param withdrawal_credentials Commitment to a public key for withdrawals.
/// @param signature A BLS12-381 signature.
/// @param deposit_data_root The SHA-256 hash of the SSZ-encoded DepositData object.
/// Used as a protection against malformed input.
function deposit(
⋮----
/// @notice Query the current deposit root hash.
/// @return The deposit root hash.
function get_deposit_root() external view returns (bytes32);
⋮----
/// @notice Query the current deposit count.
/// @return The deposit count encoded as a little endian 64-bit number.
function get_deposit_count() external view returns (bytes memory);
````

## File: src/contracts/interfaces/IKeyRegistrar.sol
````
// SPDX-License-Identifier: BUSL-1.1
⋮----
import {OperatorSet} from "../libraries/OperatorSetLib.sol";
import {BN254} from "../libraries/BN254.sol";
⋮----
interface IKeyRegistrarErrors {
/// @notice Error thrown when a key is already registered
/// @dev Error code: 0x18f78402
/// @dev We prevent duplicate key registrations to maintain global key uniqueness and avoid conflicting operator-key mappings
⋮----
/// @notice Error thrown when an operator is already registered
/// @dev Error code: 0x42ee68b5
/// @dev We prevent duplicate operator registrations to prevent re-registrations with a new key
⋮----
/// @notice Error thrown when the key format is invalid
/// @dev Error code: 0xd1091181
/// @dev We enforce proper key formats (20 bytes for ECDSA, valid G1/G2 points for BN254) to ensure cryptographic validity and prevent malformed key data
⋮----
/// @notice Error thrown when the address is zero
/// @dev Error code: 0xd92e233d
⋮----
/// @notice Error thrown when the public key is zero
/// @dev Error code: 0x4935505f
⋮----
/// @notice Error thrown when the curve type is invalid
/// @dev Error code: 0xfdea7c09
/// @dev We require valid curve types (ECDSA or BN254)
⋮----
/// @notice Error thrown when the keypair is invalid
/// @dev Error code: 0x1b56a68b
⋮----
/// @notice Error thrown when the configuration is already set
/// @dev Error code: 0x0081f09f
/// @dev We prevent reconfiguration of operator sets to maintain consistency and avoid conflicting curve type settings
⋮----
/// @notice Error thrown when the operator set is not configured
/// @dev Error code: 0xb9a620da
/// @dev We require operator sets to be configured before key operations to ensure proper curve type validation and prevent operations on unconfigured sets
⋮----
/// @notice Error thrown when the key is not found
/// @dev Error code: 0x2e40e187
/// @dev We require existing key registrations for deregistration operations to ensure meaningful state changes and prevent operations on non-existent keys
⋮----
/// @notice Error thrown when the operator is still slashable when trying to deregister a key
/// @dev Error code: 0x10702879
/// @dev We prevent key deregistration while operators are slashable to avoid race conditions and ensure operators cannot escape slashing by deregistering keys
⋮----
interface IKeyRegistrarTypes {
/// @dev Enum defining supported curve types
⋮----
/// @dev Structure to store key information
⋮----
bytes keyData; // Flexible storage for different curve types
⋮----
interface IKeyRegistrarEvents is IKeyRegistrarTypes {
/// @notice Emitted when a key is registered
event KeyRegistered(OperatorSet operatorSet, address indexed operator, CurveType curveType, bytes pubkey);
/// @notice Emitted when a key is deregistered
event KeyDeregistered(OperatorSet operatorSet, address indexed operator, CurveType curveType);
/// @notice Emitted when the aggregate BN254 key is updated
event AggregateBN254KeyUpdated(OperatorSet operatorSet, BN254.G1Point newAggregateKey);
/// @notice Emitted when an operator set is configured
event OperatorSetConfigured(OperatorSet operatorSet, CurveType curveType);
⋮----
/// @notice The `KeyRegistrar` is used by AVSs to set their key type and by operators to register and deregister keys to operatorSets
/// @notice The integration pattern is as follows:
/// 1. The AVS calls `configureOperatorSet` to set the key type for their operatorSet
/// 2. Operators call `registerKey` to register their keys to the operatorSet
/// @dev This contract requires that keys are unique across all operatorSets, globally
/// @dev For the multichain protocol, the key type of the operatorSet must be set in the `KeyRegistrar`, but the
///      AVS is not required to use the KeyRegistrar for operator key management and can implement its own registry
interface IKeyRegistrar is IKeyRegistrarErrors, IKeyRegistrarEvents {
/// @notice Configures an operator set with curve type
/// @param operatorSet The operator set to configure
/// @param curveType Type of curve (ECDSA, BN254)
/// @dev Only authorized callers for the AVS can configure operator sets
/// @dev Reverts for:
///      - InvalidPermissions: Caller is not authorized for the AVS (via the PermissionController)
///      - InvalidCurveType: The curve type is not ECDSA or BN254
///      - ConfigurationAlreadySet: The operator set is already configured
/// @dev Emits the following events:
///      - OperatorSetConfigured: When the operator set is successfully configured with a curve type
function configureOperatorSet(
⋮----
/// @notice Registers a cryptographic key for an operator with a specific operator set
/// @param operator Address of the operator to register key for
/// @param operatorSet The operator set to register the key for
/// @param pubkey Public key bytes. For ECDSA, this is the address of the key. For BN254, this is the G1 and G2 key combined (see `encodeBN254KeyData`)
/// @param signature Signature proving ownership. For ECDSA this is a signature of the `getECDSAKeyRegistrationMessageHash`. For BN254 this is a signature of the `getBN254KeyRegistrationMessageHash`.
/// @dev Can be called by operator directly or by addresses they've authorized via the `PermissionController`
/// @dev There exist no restriction on the state of the operator with respect to the operatorSet. That is, an operator
///      does not have to be registered for the operator in the `AllocationManager` to register a key for it
/// @dev For ECDSA, we allow a smart contract to be the pubkey (via ERC1271 signatures), but note that the multichain protocol DOES NOT support smart contract signatures
⋮----
///      - InvalidPermissions: Caller is not the operator or authorized via the PermissionController
///      - OperatorSetNotConfigured: The operator set is not configured
///      - OperatorAlreadyRegistered: The operator is already registered for the operatorSet in the KeyRegistrar
///      - InvalidKeyFormat: For ECDSA: The key is not exactly 20 bytes
///      - ZeroAddress: For ECDSA: The key is the zero address
///      - KeyAlreadyRegistered: For ECDSA: The key is already registered globally by hash
///      - InvalidSignature: For ECDSA: The signature is not valid
///      - InvalidKeyFormat: For BN254: The key data is not exactly 192 bytes
///      - InvalidSignature: For BN254: The signature is not exactly 64 bytes
///      - ZeroPubkey: For BN254: The G1 point is the zero point
///      - InvalidSignature: For BN254: The signature is not valid
///      - KeyAlreadyRegistered: For BN254: The key is already registered globally by hash
⋮----
///      - KeyRegistered: When the key is successfully registered for the operator and operatorSet
function registerKey(
⋮----
/// @notice Deregisters a cryptographic key for an operator with a specific operator set
/// @param operator Address of the operator to deregister key for
/// @param operatorSet The operator set to deregister the key from
/// @dev Can be called by the operator directly or by addresses they've authorized via the `PermissionController`
/// @dev Keys remain in global key registry to prevent reuse
⋮----
///      - InvalidPermissions: Caller is not authorized for the operator (via the PermissionController)
///      - OperatorStillSlashable: The operator is still slashable for the AVS
⋮----
///      - KeyNotFound: The operator does not have a registered key for this operator set
⋮----
///      - KeyDeregistered: When the key is successfully deregistered for the operator and operatorSet
function deregisterKey(
⋮----
/// @notice Checks if a key is registered for an operator with a specific operator set
/// @param operatorSet The operator set to check
/// @param operator Address of the operator
/// @return True if the key is registered, false otherwise
/// @dev If the operatorSet is not configured, this function will return false
function isRegistered(
⋮----
/// @notice Gets the curve type for an operator set
/// @param operatorSet The operator set to get the curve type for
/// @return The curve type, either ECDSA, BN254, or NONE
function getOperatorSetCurveType(
⋮----
/// @notice Gets the BN254 public key for an operator with a specific operator set
/// @param operatorSet The operator set to get the key for
⋮----
/// @return g1Point The BN254 G1 public key
/// @return g2Point The BN254 G2 public key
⋮----
///      - InvalidCurveType: The operatorSet is not configured for BN254
/// @dev Returns empty points if the operator has not registered a key for the operatorSet. We
///      recommend calling `isRegistered` first to check if the operator has a key registered
function getBN254Key(
⋮----
/// @notice Gets the ECDSA public key for an operator with a specific operator set as bytes
⋮----
/// @return pubkey The ECDSA public key in bytes format
⋮----
///      - InvalidCurveType: The operatorSet is not configured for ECDSA
/// @dev Returns 0x0 if the operator has not registered a key for the operatorSet. We
⋮----
function getECDSAKey(
⋮----
/// @notice Gets the ECDSA public key for an operator with a specific operator set
⋮----
/// @return pubkey The ECDSA public key in address format
⋮----
function getECDSAAddress(
⋮----
/// @notice Checks if a key hash is globally registered
/// @param keyHash Hash of the key
/// @return True if the key is globally registered
function isKeyGloballyRegistered(
⋮----
/// @notice Gets the key hash for an operator with a specific operator set
/// @param operatorSet The operator set to get the key hash for
⋮----
/// @return keyHash The key hash
function getKeyHash(
⋮----
/// @notice Gets the operator from signing key
/// @param operatorSet The operator set to get the operator for
/// @param keyData The key data. For ECDSA, this is the signing key address. For BN254, this can be either the G1 key or the G1 and G2 key combined.
/// @return operator. Returns 0x0 if the key is not registered
/// @return status registration status. Returns false if the key is not registered
/// @dev This function decodes the key data based on the curve type of the operator set
/// @dev This function will return the operator address even if the operator is not registered for the operator set
⋮----
///      - InvalidCurveType: The CurveType is not configured
function getOperatorFromSigningKey(
⋮----
/// @notice Returns the message hash for ECDSA key registration, which must be signed by the operator when registering an ECDSA key
/// @param operator The operator address
/// @param operatorSet The operator set
/// @param keyAddress The address of the key
/// @return The message hash for signing
function getECDSAKeyRegistrationMessageHash(
⋮----
/// @notice Returns the message hash for BN254 key registration, which must be signed by the operator when registering a BN254 key
⋮----
/// @param keyData The BN254 key data
⋮----
function getBN254KeyRegistrationMessageHash(
⋮----
/// @notice Encodes the BN254 key data into a bytes array
/// @param g1Point The BN254 G1 public key
/// @param g2Point The BN254 G2 public key
/// @return The encoded key data
function encodeBN254KeyData(
````

## File: src/contracts/interfaces/IOperatorTableCalculator.sol
````
// SPDX-License-Identifier: BUSL-1.1
⋮----
import "../libraries/BN254.sol";
import "../libraries/OperatorSetLib.sol";
⋮----
interface IOperatorTableCalculatorTypes {
/// BN254 Table Calculator Types
/// @notice A struct that contains information about a single operator for a given BN254 operatorSet
/// @param pubkey The G1 public key of the operator
/// @param weights The weights of the operator for a single operatorSet
///
/// @dev The `weights` array is as a list of arbitrary stake types. For example,
///      it can be [slashable_stake, delegated_stake, strategy_i_stake, ...]. Each stake type is an element in the array.
///      The stake weights are defined by the operatorSet's `OperatorTableCalculator` and transported by the multichain protocol
⋮----
/// @dev An AVS defines the `weights` array based on the criteria it wants to use for distribution and verification of off-chain tasks.
///      For example, a slashable that wants to distribute some tasks based on `EIGEN` stake and other based on `stETH` stake would
///      use [slashable_EIGEN_stake, slashable_stETH_stake] as the `weights` array
⋮----
/// @dev It is up to the AVS to define the `weights` array, which is used by the `IBN254CertificateVerifier` to verify Certificates
⋮----
/// @dev For each operator, the `weights` array should be the same length and composition, otherwise verification issues can arise
⋮----
/// @notice A struct that contains information about all operators for a given BN254OperatorSet
/// @param operatorInfoTreeRoot The root of the operatorInfo tree
/// @param numOperators The number of operators in the operatorSet
/// @param aggregatePubkey The aggregate G1 public key of the operators in the operatorSet
/// @param totalWeights The total stake weights of the operators in the operatorSet
⋮----
/// @dev The operatorInfoTreeRoot is the root of a merkle tree that contains the operatorInfos for each operator in the operatorSet.
///      It is calculated on-chain by the `BN254TableCalculator` and used by the `IBN254CertificateVerifier` to verify stakes against the non-signing operators
⋮----
/// @dev Retrieval of the `aggregatePubKey` depends on maintaining a key registry contract, see `KeyRegistrar` for an example implementation
⋮----
/// @dev The `totalWeights` array should be the same length and composition as each individual `weights` array in `BN254OperatorInfo`.
///      For example, if there are 3 operators with individual weights arrays with composition of  [delegated_stake, slashable_stake]
///      of [100, 200], [300, 400], and [500, 600], the `totalWeights` array would be [900, 1200]
⋮----
/// ECDSA Table Calculator Types
⋮----
/// @notice A struct that contains information about a single operator for an ECDSA signing key
/// @param pubkey The address of the signing ECDSA key of the operator and not the operator address itself.
⋮----
/// @dev The `weights` array can be defined as a list of arbitrary stake types. For example,
⋮----
///      For example, a slashable operatorSet that wants to distribute some tasks based on `EIGEN` stake and other based on `stETH` stake would
⋮----
/// @dev It is up to the AVS to define the `weights` array, which is used by the `IECDSACertificateVerifier` to verify Certificates
⋮----
/// @notice A base operator table calculator that all operator table calculators (ECDSA, BN254) must implement
/// @dev This interface is implemented by the AVS in their own `OperatorTableCalculator` contract, see the https://github.com/Layr-Labs/eigenlayer-middleware repository for an example implementation
/// @dev Once deployed, the AVS will set the `OperatorTableCalculator` via `CrossChainRegistry.createGenerationReservation`
interface IOperatorTableCalculator {
/// @notice The OperatorTableCalculator calculates the stake weights to generate an operator table for a given operatorSet
/// @notice This contract is read by the multichain protocol to calculate and transport the operator table to destination chains
/// @dev To distribute stake-weighted tasks to operators, the AVS should read this contract (via RPC) at the `referenceTimestamp`
///      for which the operator table was updated on the destination chains
/// @dev The operatorTableCalculator is configured by the AVS in the core `CrossChainRegistry` contract
/// @notice Calculates the operator table, in bytes, for a given operatorSet
/// @param operatorSet the operatorSet to calculate the operator table for
/// @return operatorTableBytes the operatorTableBytes for the given operatorSet
/// @dev The `operatorTableBytes` is used by the offchain multichain protocol to calculate and merkleize the operator table
function calculateOperatorTableBytes(
⋮----
/// @notice Get the operator stake weights for a given operatorSet
/// @param operatorSet The operatorSet to get the stake weights for
/// @return operators The addresses of the operators in the operatorSet
/// @return weights The stake weights for each operator in the operatorSet, this is a 2D array where the first index is the operator
///         and the second index is the stake weight.
⋮----
///      it can be [slashable_stake, delegated_stake, strategy_i_stake, ...]. Each stake type is an element in the array
/// @dev This function can be used by the AVS to distribute stake-weighted tasks to operators. Specifically, the AVS should read this function
///      at the `referenceTimestamp` for which the operator table was updated on the destination chains
function getOperatorSetWeights(
⋮----
/// @notice Get the weights for a given operator in a given operatorSet
/// @param operatorSet The operatorSet to get the weight for
/// @param operator The operator to get the weight for
/// @return weights The weights for the operator in the operatorSet
⋮----
function getOperatorWeights(
````

## File: src/contracts/interfaces/IOperatorTableUpdater.sol
````
// SPDX-License-Identifier: BUSL-1.1
⋮----
import "../libraries/OperatorSetLib.sol";
⋮----
import "./IECDSACertificateVerifier.sol";
import "./IBN254CertificateVerifier.sol";
import "./IKeyRegistrar.sol";
import "./ICrossChainRegistry.sol";
⋮----
interface IOperatorTableUpdaterErrors {
/// @notice Thrown when the global table root is in the future
/// @dev Error code: 0xb4233b6a
/// @dev We enforce that reference timestamps cannot be in the future to prevent manipulation and ensure temporal consistency
⋮----
/// @notice Thrown when the global table root is stale
/// @dev Error code: 0x1bfd4358
/// @dev We enforce that new reference timestamps must be greater than the latest to prevent retroactive updates and maintain chronological order
⋮----
/// @notice Thrown when the table root does not match what is in the certificate
/// @dev Error code: 0x8b56642d
/// @dev We enforce that the message hash in the certificate matches the expected EIP-712 hash to prevent certificate replay attacks
⋮----
/// @notice Thrown when the GlobalTableRoot update fails
/// @dev Error code: 0xc108107c
/// @dev We enforce that certificates are valid according to the confirmation threshold to prevent unauthorized global root updates
⋮----
/// @notice Thrown when the table has been updated for the timestamp
/// @dev Error code: 0x207617df
/// @dev We enforce that reference timestamps for operator tables increase to prevent retroactive operator table modifications
⋮----
/// @notice Thrown when the global table root does not match what is in storage
/// @dev Error code: 0xc73a136a
/// @dev We enforce that the provided global table root matches the stored root for the timestamp to ensure data integrity
⋮----
/// @notice Thrown when the operator set proof is invalid
/// @dev Error code: 0xafa42ca7
/// @dev We enforce that merkle proofs are valid to prevent unauthorized operator table updates and maintain cryptographic security
⋮----
/// @notice Thrown when the confirmation threshold is invalid
/// @dev Error code: 0x0e66de06
⋮----
/// @notice Thrown when the curve type is invalid
/// @dev Error code: 0xfdea7c09
⋮----
/// @notice Thrown when a root is invalid
/// @dev Error code: 0x504570e3
⋮----
/// @notice Thrown when the generator is invalid (via a non-zero reference timestamp)
/// @dev Error code: 0x6446f917
/// @dev We enforce that the generator has a reference timestamp of 0 to ensure proper initialization and prevent conflicts
⋮----
/// @notice Thrown when the operator set to update is the generator
/// @dev Error code: 0x7ec5c154
⋮----
/// @notice Thrown when the generator's global table root is being disabled
/// @dev Error code: 0x332415fa
⋮----
interface IOperatorTableUpdaterEvents {
/// @notice Emitted when a new global table root is set
/// @param referenceTimestamp the timestamp of the global table root
/// @param globalTableRoot the root of the global table
event NewGlobalTableRoot(uint32 indexed referenceTimestamp, bytes32 indexed globalTableRoot);
⋮----
/// @notice Emitted when the generator is updated
/// @param operatorSet The operatorSet which certifies against global roots
event GeneratorUpdated(OperatorSet operatorSet);
⋮----
/// @notice Emitted when the global root confirmation threshold is updated
/// @param bps The threshold, in bps, for a global root to be signed off on and updated
event GlobalRootConfirmationThresholdUpdated(uint16 bps);
⋮----
/// @notice Emitted when a global table root is disabled
/// @param globalTableRoot the global table root that was disabled
event GlobalRootDisabled(bytes32 indexed globalTableRoot);
⋮----
interface IOperatorTableUpdater is
⋮----
/// @notice Sets the global table root
/// @param globalTableRootCert certificate of the global table root, signed by the `Generator`. This is a `BN254Certificate`
/// @param globalTableRoot merkle root of all operatorSet tables
/// @param referenceTimestamp block timestamp at which the global table root was calculated
/// @param referenceBlockNumber block number, corresponding to the `referenceTimestamp` of the global table root
/// @dev Any entity can submit with a valid certificate signed off by the `Generator`
/// @dev The `msgHash` in the `globalOperatorTableRootCert` is the hash of the `globalTableRoot`, `referenceTimestamp`, and `referenceBlockNumber`
/// @dev Per the `BN254CertificateVerifier`, the value that the `Generator` signs over is given by `calculateGlobalTableUpdateSignableDigest`
/// @dev The `referenceTimestamp` nested in the `globalTableRootCert` should be `getGeneratorReferenceTimestamp` (ie. `GENERATOR_REFERENCE_TIMESTAMP`), whereas
///      the `referenceTimestamp` passed directly in the calldata is the block timestamp at which the global table root was calculated
/// @dev Reverts for:
///      - GlobalTableRootInFuture: referenceTimestamp is in the future
///      - GlobalTableRootStale: referenceTimestamp is not greater than latest reference timestamp
///      - InvalidMessageHash: certificate messageHash does not match expected EIP-712 hash
///      - CertificateInvalid: certificate verification failed against confirmation threshold
/// @dev Emits the following events:
///      - NewGlobalTableRoot: When global table root is successfully confirmed
function confirmGlobalTableRoot(
⋮----
/// @notice The threshold, in bps, for a global root to be signed off on and updated
/// @dev Only callable by the owner of the contract
⋮----
///      - "Ownable: caller is not the owner": caller is not the owner
///      - InvalidConfirmationThreshold: bps is greater than MAX_BPS (10000)
⋮----
///      - GlobalRootConfirmationThresholdUpdated: When threshold is successfully updated
function setGlobalRootConfirmationThreshold(
⋮----
/// @notice Updates the `Generator` to a new operatorSet
/// @param generator The operatorSet which certifies against global roots
/// @param generatorInfo The operatorSetInfo for the generator
/// @dev We have a separate function for updating this operatorSet since it's not transported and updated
///      in the same way as the other operatorSets
⋮----
/// @dev Uses GENERATOR_GLOBAL_TABLE_ROOT constant to break circular dependency for certificate verification
/// @dev We ensure that there are no collisions with other reference timestamps because we expect the generator to have an initial reference timestamp of 0
/// @dev The `_latestReferenceTimestamp` is not updated since this root is ONLY used for the `Generator`
/// @dev The `_referenceBlockNumber` and `_referenceTimestamps` mappings are not updated since they are only used for introspection for official operatorSets
⋮----
///      - InvalidGenerator: generator has a non-zero reference timestamp
⋮----
///      - GeneratorUpdated: When generator is successfully updated
function updateGenerator(
⋮----
/// @notice Updates an operator table
/// @param referenceTimestamp the reference timestamp of the globalTableRoot
/// @param globalTableRoot the new globalTableRoot
/// @param operatorSetIndex the index of the given operatorSet being updated
/// @param proof the proof of the leaf at index against the globalTableRoot
/// @param operatorTableBytes the bytes of the operator table
/// @dev This function calls `updateOperatorTable` on the `ECDSACertificateVerifier` or `BN254CertificateVerifier`
///      depending on the `KeyType` of the operatorSet, which is encoded in the `operatorTableBytes`
/// @dev Function silently returns if the `referenceTimestamp` has already been updated for the `operatorSet`
⋮----
///      - InvalidRoot: globalTableRoot is disabled or invalid
///      - InvalidOperatorSet: operatorSet is the generator (not allowed for regular updates)
///      - TableUpdateForPastTimestamp: referenceTimestamp is not greater than latest for the operatorSet
///      - InvalidGlobalTableRoot: provided globalTableRoot does not match stored root for referenceTimestamp
///      - InvalidOperatorSetProof: merkle proof verification failed
///      - InvalidCurveType: unsupported curve type in operatorTableBytes
/// @dev The operator table is updated at a cadence of `tableUpdateCadence` seconds, which is given by `CrossChainRegistry.tableUpdateCadence`
function updateOperatorTable(
⋮----
/// @notice Disables a global table root
/// @param globalTableRoot the global table root to disable
/// @dev Only callable by the pauser
/// @dev Cannot disable the GENERATOR_GLOBAL_TABLE_ROOT
⋮----
///      - OnlyPauser: caller is not the pauser
///      - InvalidRoot: globalTableRoot is already disabled or does not exist
///      - CannotDisableGeneratorRoot: attempting to disable the generator's global table root
⋮----
///      - GlobalRootDisabled: When global table root is successfully disabled
function disableRoot(
⋮----
/// @notice Get the current global table root
/// @return globalTableRoot the current global table root
function getCurrentGlobalTableRoot() external view returns (bytes32 globalTableRoot);
⋮----
/// @notice Get the table root by timestamp
/// @param referenceTimestamp the timestamp of the table root
/// @return tableRoot the table root at the given timestamp
function getGlobalTableRootByTimestamp(
⋮----
/// @notice Get the operatorSet which certifies against global roots
/// @return The operatorSet which certifies against global roots
function getGenerator() external view returns (OperatorSet memory);
⋮----
/// @notice Get the certificate verifier for a given key type
/// @param curveType The curve type
/// @return The certificate verifier for the given key type
function getCertificateVerifier(
⋮----
/// @notice Get the latest reference timestamp
/// @return The latest reference timestamp
function getLatestReferenceTimestamp() external view returns (uint32);
⋮----
/// @notice Get the latest reference block number
/// @return The latest reference block number
function getLatestReferenceBlockNumber() external view returns (uint32);
⋮----
/// @notice Get the reference block number for a given reference timestamp
/// @param referenceTimestamp the reference timestamp
/// @return The reference block number for the given reference timestamp
function getReferenceBlockNumberByTimestamp(
⋮----
/// @notice Get the reference timestamp for a given reference block number
/// @param referenceBlockNumber the reference block number
/// @return The reference timestamp for the given reference block number
function getReferenceTimestampByBlockNumber(
⋮----
/// @notice Get the message hash for the certificate of a global table root update
/// @param globalTableRoot the global table root
⋮----
/// @return The message hash for a global table root
function getGlobalTableUpdateMessageHash(
⋮----
/// @notice Get the signable digest for confirming a global table root update
⋮----
/// @param referenceTimestamp the reference timestamp used when computing the message hash
⋮----
/// @return The digest to be signed by the Generator
/// @dev Calls into the `BN254CertificateVerifier` to calculate the signable digest
function getGlobalTableUpdateSignableDigest(
⋮----
/// @notice Get the reference timestamp of the generator
/// @return The reference timestamp of the generator
/// @dev The `Generator's` referenceTimestamp is hardcoded to 1. See `GENERATOR_REFERENCE_TIMESTAMP` in `OperatorTableUpdaterStorage.sol`
function getGeneratorReferenceTimestamp() external view returns (uint32);
⋮----
/// @notice Get the operator set config for the Generator
/// @return The operator set config for the Generator
/// @dev The Generator's config has maxStalenessPeriod = 0 and owner = address(operatorTableUpdater)
function getGeneratorConfig() external view returns (OperatorSetConfig memory);
⋮----
/// @notice Get the validity status of a global table root
⋮----
/// @return The validity status of the global table root
function isRootValid(
⋮----
/// @notice Get the validity status of a global table root by timestamp
⋮----
function isRootValidByTimestamp(
````

## File: src/contracts/interfaces/IPausable.sol
````
// SPDX-License-Identifier: BUSL-1.1
⋮----
import "../interfaces/IPauserRegistry.sol";
⋮----
/// @title Adds pausability to a contract, with pausing & unpausing controlled by the `pauser` and `unpauser` of a PauserRegistry contract.
/// @author Layr Labs, Inc.
/// @notice Terms of Service: https://docs.eigenlayer.xyz/overview/terms-of-service
/// @notice Contracts that inherit from this contract may define their own `pause` and `unpause` (and/or related) functions.
/// These functions should be permissioned as "onlyPauser" which defers to a `PauserRegistry` for determining access control.
/// @dev Pausability is implemented using a uint256, which allows up to 256 different single bit-flags; each bit can potentially pause different functionality.
/// Inspiration for this was taken from the NearBridge design here https://etherscan.io/address/0x3FEFc5A4B1c02f21cBc8D3613643ba0635b9a873#code.
/// For the `pause` and `unpause` functions we've implemented, if you pause, you can only flip (any number of) switches to on/1 (aka "paused"), and if you unpause,
/// you can only flip (any number of) switches to off/0 (aka "paused").
/// If you want a pauseXYZ function that just flips a single bit / "pausing flag", it will:
/// 1) 'bit-wise and' (aka `&`) a flag with the current paused state (as a uint256)
/// 2) update the paused state to this new value
/// @dev We note as well that we have chosen to identify flags by their *bit index* as opposed to their numerical value, so, e.g. defining `DEPOSITS_PAUSED = 3`
/// indicates specifically that if the *third bit* of `_paused` is flipped -- i.e. it is a '1' -- then deposits should be paused
interface IPausable {
/// @dev Thrown when caller is not pauser.
⋮----
/// @dev Thrown when caller is not unpauser.
⋮----
/// @dev Thrown when currently paused.
⋮----
/// @dev Thrown when invalid `newPausedStatus` is provided.
⋮----
/// @dev Thrown when a null address input is provided.
⋮----
/// @notice Emitted when the pause is triggered by `account`, and changed to `newPausedStatus`.
event Paused(address indexed account, uint256 newPausedStatus);
⋮----
/// @notice Emitted when the pause is lifted by `account`, and changed to `newPausedStatus`.
event Unpaused(address indexed account, uint256 newPausedStatus);
⋮----
/// @notice Address of the `PauserRegistry` contract that this contract defers to for determining access control (for pausing).
function pauserRegistry() external view returns (IPauserRegistry);
⋮----
/// @notice This function is used to pause an EigenLayer contract's functionality.
/// It is permissioned to the `pauser` address, which is expected to be a low threshold multisig.
/// @param newPausedStatus represents the new value for `_paused` to take, which means it may flip several bits at once.
/// @dev This function can only pause functionality, and thus cannot 'unflip' any bit in `_paused` from 1 to 0.
function pause(
⋮----
/// @notice Alias for `pause(type(uint256).max)`.
function pauseAll() external;
⋮----
/// @notice This function is used to unpause an EigenLayer contract's functionality.
/// It is permissioned to the `unpauser` address, which is expected to be a high threshold multisig or governance contract.
⋮----
/// @dev This function can only unpause functionality, and thus cannot 'flip' any bit in `_paused` from 0 to 1.
function unpause(
⋮----
/// @notice Returns the current paused status as a uint256.
function paused() external view returns (uint256);
⋮----
/// @notice Returns 'true' if the `indexed`th bit of `_paused` is 1, and 'false' otherwise
function paused(
````

## File: src/contracts/interfaces/IPauserRegistry.sol
````
// SPDX-License-Identifier: BUSL-1.1
⋮----
/// @title Interface for the `PauserRegistry` contract.
/// @author Layr Labs, Inc.
/// @notice Terms of Service: https://docs.eigenlayer.xyz/overview/terms-of-service
interface IPauserRegistry {
⋮----
event PauserStatusChanged(address pauser, bool canPause);
⋮----
event UnpauserChanged(address previousUnpauser, address newUnpauser);
⋮----
/// @notice Mapping of addresses to whether they hold the pauser role.
function isPauser(
⋮----
/// @notice Unique address that holds the unpauser role. Capable of changing *both* the pauser and unpauser addresses.
function unpauser() external view returns (address);
````

## File: src/contracts/interfaces/IPermissionController.sol
````
// SPDX-License-Identifier: BUSL-1.1
⋮----
interface IPermissionControllerErrors {
/// @notice Thrown when a non-admin caller attempts to perform an admin-only action.
⋮----
/// @notice Thrown when attempting to remove an admin that does not exist.
⋮----
/// @notice Thrown when attempting to set an appointee for a function that already has one.
⋮----
/// @notice Thrown when attempting to interact with a non-existent appointee.
⋮----
/// @notice Thrown when attempting to remove the last remaining admin.
⋮----
/// @notice Thrown when attempting to set an admin that is already registered.
⋮----
/// @notice Thrown when attempting to interact with an admin that is not in pending status.
⋮----
/// @notice Thrown when attempting to add an admin that is already pending.
⋮----
interface IPermissionControllerEvents {
/// @notice Emitted when an appointee is set for an account to handle specific function calls.
event AppointeeSet(address indexed account, address indexed appointee, address target, bytes4 selector);
⋮----
/// @notice Emitted when an appointee's permission to handle function calls for an account is revoked.
event AppointeeRemoved(address indexed account, address indexed appointee, address target, bytes4 selector);
⋮----
/// @notice Emitted when an address is set as a pending admin for an account, requiring acceptance.
event PendingAdminAdded(address indexed account, address admin);
⋮----
/// @notice Emitted when a pending admin status is removed for an account before acceptance.
event PendingAdminRemoved(address indexed account, address admin);
⋮----
/// @notice Emitted when an address accepts and becomes an active admin for an account.
event AdminSet(address indexed account, address admin);
⋮----
/// @notice Emitted when an admin's permissions are removed from an account.
event AdminRemoved(address indexed account, address admin);
⋮----
interface IPermissionController is IPermissionControllerErrors, IPermissionControllerEvents {
/// @notice Sets a pending admin for an account.
/// @param account The account to set the pending admin for.
/// @param admin The address to set as pending admin.
/// @dev The pending admin must accept the role before becoming an active admin.
/// @dev Multiple admins can be set for a single account.
function addPendingAdmin(
⋮----
/// @notice Removes a pending admin from an account before they have accepted the role.
/// @param account The account to remove the pending admin from.
/// @param admin The pending admin address to remove.
/// @dev Only an existing admin of the account can remove a pending admin.
function removePendingAdmin(
⋮----
/// @notice Allows a pending admin to accept their admin role for an account.
/// @param account The account to accept the admin role for.
/// @dev Only addresses that were previously set as pending admins can accept the role.
function acceptAdmin(
⋮----
/// @notice Removes an active admin from an account.
/// @param account The account to remove the admin from.
/// @param admin The admin address to remove.
/// @dev Only an existing admin of the account can remove another admin.
/// @dev Will revert if removing this admin would leave the account with zero admins.
function removeAdmin(
⋮----
/// @notice Sets an appointee who can call specific functions on behalf of an account.
/// @param account The account to set the appointee for.
/// @param appointee The address to be given permission.
/// @param target The contract address the appointee can interact with.
/// @param selector The function selector the appointee can call.
/// @dev Only an admin of the account can set appointees.
function setAppointee(
⋮----
/// @notice Removes an appointee's permission to call a specific function.
/// @param account The account to remove the appointee from.
/// @param appointee The appointee address to remove.
/// @param target The contract address to remove permissions for.
/// @param selector The function selector to remove permissions for.
/// @dev Only an admin of the account can remove appointees.
function removeAppointee(
⋮----
/// @notice Checks if a given address is an admin of an account.
/// @param account The account to check admin status for.
/// @param caller The address to check.
/// @dev If the account has no admins, returns true only if the caller is the account itself.
/// @return Returns true if the caller is an admin, false otherwise.
function isAdmin(
⋮----
/// @notice Checks if an address is currently a pending admin for an account.
/// @param account The account to check pending admin status for.
/// @param pendingAdmin The address to check.
/// @return Returns true if the address is a pending admin, false otherwise.
function isPendingAdmin(
⋮----
/// @notice Retrieves all active admins for an account.
/// @param account The account to get the admins for.
/// @dev If the account has no admins, returns an array containing only the account address.
/// @return An array of admin addresses.
function getAdmins(
⋮----
/// @notice Retrieves all pending admins for an account.
/// @param account The account to get the pending admins for.
/// @return An array of pending admin addresses.
function getPendingAdmins(
⋮----
/// @notice Checks if a caller has permission to call a specific function.
/// @param account The account to check permissions for.
/// @param caller The address attempting to make the call.
/// @param target The contract address being called.
/// @param selector The function selector being called.
/// @dev Returns true if the caller is either an admin or an appointed caller.
/// @dev Be mindful that upgrades to the contract may invalidate the appointee's permissions.
/// This is only possible if a function's selector changes (e.g. if a function's parameters are modified).
/// @return Returns true if the caller has permission, false otherwise.
function canCall(
⋮----
/// @notice Retrieves all permissions granted to an appointee for a given account.
/// @param account The account to check appointee permissions for.
/// @param appointee The appointee address to check.
/// @return Two arrays: target contract addresses and their corresponding function selectors.
function getAppointeePermissions(
⋮----
/// @notice Retrieves all appointees that can call a specific function for an account.
/// @param account The account to get appointees for.
/// @param target The contract address to check.
/// @param selector The function selector to check.
/// @dev Does not include admins in the returned list, even though they have calling permission.
/// @return An array of appointee addresses.
function getAppointees(
````

## File: src/contracts/interfaces/IProtocolRegistry.sol
````
// SPDX-License-Identifier: BUSL-1.1
⋮----
interface IProtocolRegistryErrors {
/// @notice Thrown when array lengths don't match in ship().
⋮----
/// @notice Thrown when a zero address is provided.
⋮----
/// @notice Thrown when trying to configure an address that hasn't been shipped.
⋮----
/// @notice Thrown when an empty contract name is provided.
⋮----
interface IProtocolRegistryTypes {
/// @notice Configuration for a protocol deployment.
/// @param pausable Whether this deployment can be paused.
/// @param deprecated Whether this deployment is deprecated.
⋮----
interface IProtocolRegistryEvents is IProtocolRegistryTypes {
/// @notice Emitted when a deployment is shipped.
/// @param addr The address of the deployment.
/// @param config The configuration for the deployment.
event DeploymentShipped(address indexed addr, DeploymentConfig config);
⋮----
/// @notice Emitted when a deployment is configured.
⋮----
event DeploymentConfigured(address indexed addr, DeploymentConfig config);
⋮----
/// @notice Emitted when a deployment config is deleted due to name re-assignment.
/// @param addr The address whose config was deleted.
event DeploymentConfigDeleted(address indexed addr);
⋮----
/// @notice Emitted when the semantic version is updated.
/// @param previousSemanticVersion The previous semantic version.
/// @param semanticVersion The new semantic version.
event SemanticVersionUpdated(string previousSemanticVersion, string semanticVersion);
⋮----
interface IProtocolRegistry is IProtocolRegistryErrors, IProtocolRegistryEvents {
/// @notice Initializes the ProtocolRegistry with the initial admin.
/// @param initialAdmin The address to set as the initial admin.
/// @param pauserMultisig The address to set as the pauser multisig.
function initialize(
⋮----
/// @notice Ships a list of deployments.
/// @dev Only callable by the admin.
/// @param addresses The addresses of the deployments to ship. Must not contain zero addresses.
/// @param configs The configurations of the deployments to ship.
/// @param contractNames The names of the contracts to ship.
/// @param semanticVersion The semantic version to ship.
/// @dev Contract names can be passed in as type(contract).name, e.g. `type(AllocationManager).name`
/// @dev Contract names must be <= 31 bytes
/// @dev Contract names can be re-shipped with a new address. When this happens,
///      the old address's config is automatically deleted to prevent orphaned configs.
/// @dev All input arrays (`addresses`, `configs`, `names`) must have the same length.
function ship(
⋮----
/// @notice Configures a deployment.
/// @dev Only callable by the admin. Name must have been previously shipped.
/// @param name The name of the deployment to configure.
/// @param config The configuration to set.
function configure(
⋮----
/// @notice Pauses all deployments that support pausing.
/// @dev Loops over all deployments and attempts to invoke `pauseAll()` on each contract that is marked as pausable.
/// @dev WARNING: Reverts if any pausable deployment doesn't implement IPausable or if any pauseAll() call reverts.
///      A single misconfigured deployment will block the entire protocol pause. Ensure registry is correctly configured.
function pauseAll() external;
⋮----
/// @notice Returns the full semantic version string of the protocol (e.g. "1.2.3").
/// @dev Follows Semantic Versioning 2.0.0 (see https://semver.org/).
/// @return The SemVer-formatted version string of the protocol.
function version() external view returns (string memory);
⋮----
/// @notice Returns the major version component of the protocol's semantic version.
/// @dev Extracts and returns only the major version number as a string (e.g. "1" for version "1.2.3").
/// @return The major version number as a string.
function majorVersion() external view returns (string memory);
⋮----
/// @notice Returns a deployment by name.
/// @param name The name of the deployment to get.
/// @return address The address of the deployment.
function getAddress(
⋮----
/// @return addr The address.
/// @return config The configuration.
function getDeployment(
⋮----
/// @notice Returns all deployments.
/// @return names The names of the deployments.
/// @return addresses The addresses.
/// @return configs The configurations.
function getAllDeployments()
⋮----
/// @notice Returns the total number of deployments.
/// @return The total number of deployments.
function totalDeployments() external view returns (uint256);
⋮----
/// @notice Returns the pauser role for the protocol.
/// @return The pauser role for the protocol.
function PAUSER_ROLE() external view returns (bytes32);
````

## File: src/contracts/interfaces/IProxyAdmin.sol
````
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (proxy/transparent/ProxyAdmin.sol)
⋮----
/// @dev This is an auxiliary contract meant to be assigned as the admin of a {TransparentUpgradeableProxy}. For an
/// explanation of why you would want to use this see the documentation for {TransparentUpgradeableProxy}.
interface IProxyAdmin {
/// @dev Returns the current implementation of `proxy`.
///
/// Requirements:
⋮----
/// - This contract must be the admin of `proxy`.
function getProxyImplementation(
⋮----
/// @dev Returns the current admin of `proxy`.
⋮----
function getProxyAdmin(
⋮----
/// @dev Changes the admin of `proxy` to `newAdmin`.
⋮----
/// - This contract must be the current admin of `proxy`.
function changeProxyAdmin(
⋮----
/// @dev Upgrades `proxy` to `implementation`. See {TransparentUpgradeableProxy-upgradeTo}.
⋮----
function upgrade(
⋮----
/// @dev Upgrades `proxy` to `implementation` and calls a function on the new implementation. See
/// {TransparentUpgradeableProxy-upgradeToAndCall}.
⋮----
function upgradeAndCall(
````

## File: src/contracts/interfaces/IReleaseManager.sol
````
// SPDX-License-Identifier: BUSL-1.1
⋮----
import "../libraries/OperatorSetLib.sol";
⋮----
interface IReleaseManagerErrors {
/// @notice Thrown when a metadata URI must be published before publishing a release.
⋮----
/// @notice Thrown when the upgrade by time is in the past.
⋮----
/// @notice Thrown when the metadata URI is empty.
⋮----
/// @notice Thrown when there are no releases for an operator set.
⋮----
interface IReleaseManagerTypes {
/// @notice Represents a software artifact with its digest and registry URL.
/// @param digest The hash digest of the artifact.
/// @param registry Where the artifact can be found.
⋮----
/// @notice Represents a release containing multiple artifacts and an upgrade deadline.
/// @param artifacts Array of artifacts included in this release.
/// @param upgradeByTime Timestamp by which operators must upgrade to this release. A value of 0 signals an instant upgrade requirement.
⋮----
interface IReleaseManagerEvents is IReleaseManagerTypes {
/// @notice Emitted when a new release is published.
/// @param operatorSet The operator set this release is for.
/// @param releaseId The id of the release that was published.
/// @param release The release that was published.
event ReleasePublished(OperatorSet indexed operatorSet, uint256 indexed releaseId, Release release);
⋮----
/// @notice Emitted when a metadata URI is published.
/// @param operatorSet The operator set this metadata URI is for.
/// @param metadataURI The metadata URI that was published.
event MetadataURIPublished(OperatorSet indexed operatorSet, string metadataURI);
⋮----
interface IReleaseManager is IReleaseManagerErrors, IReleaseManagerEvents {
///
///                         WRITE FUNCTIONS
⋮----
/// @notice Publishes a new release for an operator set.
/// @dev If the upgradeByTime is 0, the release is meant to signal an instant upgrade.
⋮----
/// @return releaseId The index of the newly published release.
function publishRelease(
⋮----
/// @notice Publishes a metadata URI for an operator set.
⋮----
function publishMetadataURI(
⋮----
///                         VIEW FUNCTIONS
⋮----
/// @notice Returns the total number of releases for an operator set.
/// @param operatorSet The operator set to query.
/// @return The number of releases.
function getTotalReleases(
⋮----
/// @notice Returns a specific release by index.
⋮----
/// @param releaseId The id of the release to get.
/// @return The release at the specified index.
function getRelease(
⋮----
/// @notice Returns the latest release for an operator set.
⋮----
/// @return The id of the latest release.
/// @return The latest release.
function getLatestRelease(
⋮----
/// @notice Returns the upgrade by time for the latest release.
⋮----
/// @return The upgrade by time for the latest release.
function getLatestUpgradeByTime(
⋮----
/// @notice Returns true if the release is the latest release, false otherwise.
⋮----
/// @param releaseId The id of the release to check.
/// @return True if the release is the latest release, false otherwise.
function isValidRelease(
⋮----
/// @notice Returns the metadata URI for an operator set.
⋮----
/// @return The metadata URI for the operator set.
function getMetadataURI(
````

## File: src/contracts/interfaces/IRewardsCoordinator.sol
````
// SPDX-License-Identifier: BUSL-1.1
⋮----
import "@openzeppelin/contracts/token/ERC20/IERC20.sol";
import "../libraries/OperatorSetLib.sol";
⋮----
import "./IAllocationManager.sol";
import "./IDelegationManager.sol";
import "./IStrategyManager.sol";
import "./IPauserRegistry.sol";
import "./IPermissionController.sol";
import "./IStrategy.sol";
import "./IEmissionsController.sol";
⋮----
interface IRewardsCoordinatorErrors {
/// @dev Thrown when msg.sender is not allowed to call a function
⋮----
/// @dev Thrown when a earner not an AVS or Operator
⋮----
/// Invalid Inputs
⋮----
/// @dev Thrown when an input address is zero
⋮----
/// @dev Thrown when an invalid root is provided.
⋮----
/// @dev Thrown when an invalid root index is provided.
⋮----
/// @dev Thrown when input arrays length is zero.
⋮----
/// @dev Thrown when two array parameters have mismatching lengths.
⋮----
/// @dev Thrown when provided root is not for new calculated period.
⋮----
/// @dev Thrown when rewards end timestamp has not elapsed.
⋮----
/// @dev Thrown when an invalid operator set is provided.
⋮----
/// Rewards Submissions
⋮----
/// @dev Thrown when input `amount` is zero.
⋮----
/// @dev Thrown when input `amount` exceeds maximum.
⋮----
/// @dev Thrown when input `split` exceeds `ONE_HUNDRED_IN_BIPS`
⋮----
/// @dev Thrown when an operator attempts to set a split before the previous one becomes active
⋮----
/// @dev Thrown when input `duration` exceeds maximum.
⋮----
/// @dev Thrown when input `duration` is zero.
⋮----
/// @dev Thrown when input `duration` is not evenly divisble by CALCULATION_INTERVAL_SECONDS.
⋮----
/// @dev Thrown when GENESIS_REWARDS_TIMESTAMP is not evenly divisble by CALCULATION_INTERVAL_SECONDS.
⋮----
/// @dev Thrown when CALCULATION_INTERVAL_SECONDS is not evenly divisble by SNAPSHOT_CADENCE.
⋮----
/// @dev Thrown when `startTimestamp` is not evenly divisble by CALCULATION_INTERVAL_SECONDS.
⋮----
/// @dev Thrown when `startTimestamp` is too far in the future.
⋮----
/// @dev Thrown when `startTimestamp` is too far in the past.
⋮----
/// @dev Thrown when an attempt to use a non-whitelisted strategy is made.
⋮----
/// @dev Thrown when `strategies` is not sorted in ascending order.
⋮----
/// @dev Thrown when `operators` are not sorted in ascending order
⋮----
/// @dev Thrown when an operator-directed rewards submission is not retroactive
⋮----
/// Claims
⋮----
/// @dev Thrown when an invalid earner claim proof is provided.
⋮----
/// @dev Thrown when an invalid token leaf index is provided.
⋮----
/// @dev Thrown when an invalid earner leaf index is provided.
⋮----
/// @dev Thrown when cumulative earnings are not greater than cumulative claimed.
⋮----
/// Reward Root Checks
⋮----
/// @dev Thrown if a root has already been disabled.
⋮----
/// @dev Thrown if a root has not been activated yet.
⋮----
/// @dev Thrown if a root has already been activated.
⋮----
interface IRewardsCoordinatorTypes {
/// @notice A linear combination of strategies and multipliers for AVSs to weigh
/// EigenLayer strategies.
/// @param strategy The EigenLayer strategy to be used for the rewards submission
/// @param multiplier The weight of the strategy in the rewards submission
⋮----
/// @notice A reward struct for an operator
/// @param operator The operator to be rewarded
/// @param amount The reward amount for the operator
⋮----
/// @notice A split struct for an Operator
/// @param oldSplitBips The old split in basis points. This is the split that is active if `block.timestamp < activatedAt`
/// @param newSplitBips The new split in basis points. This is the split that is active if `block.timestamp >= activatedAt`
/// @param activatedAt The timestamp at which the split will be activated
⋮----
/// Sliding Window for valid RewardsSubmission startTimestamp
///
/// Scenario A: GENESIS_REWARDS_TIMESTAMP IS WITHIN RANGE
///         <-----MAX_RETROACTIVE_LENGTH-----> t (block.timestamp) <---MAX_FUTURE_LENGTH--->
///             <--------------------valid range for startTimestamp------------------------>
///             ^
///         GENESIS_REWARDS_TIMESTAMP
⋮----
/// Scenario B: GENESIS_REWARDS_TIMESTAMP IS OUT OF RANGE
⋮----
///         <------------------------valid range for startTimestamp------------------------>
///     ^
/// GENESIS_REWARDS_TIMESTAMP
/// @notice RewardsSubmission struct submitted by AVSs when making rewards for their operators and stakers
/// RewardsSubmission can be for a time range within the valid window for startTimestamp and must be within max duration.
/// See `createAVSRewardsSubmission()` for more details.
/// @param strategiesAndMultipliers The strategies and their relative weights
/// cannot have duplicate strategies and need to be sorted in ascending address order
/// @param token The rewards token to be distributed
/// @param amount The total amount of tokens to be distributed
/// @param startTimestamp The timestamp (seconds) at which the submission range is considered for distribution
/// could start in the past or in the future but within a valid range. See the diagram above.
/// @param duration The duration of the submission range in seconds. Must be <= MAX_REWARDS_DURATION
⋮----
/// @notice OperatorDirectedRewardsSubmission struct submitted by AVSs when making operator-directed rewards for their operators and stakers.
/// @param strategiesAndMultipliers The strategies and their relative weights.
/// @param token The rewards token to be distributed.
/// @param operatorRewards The rewards for the operators.
/// @param startTimestamp The timestamp (seconds) at which the submission range is considered for distribution.
/// @param duration The duration of the submission range in seconds.
/// @param description Describes what the rewards submission is for.
⋮----
/// @notice A distribution root is a merkle root of the distribution of earnings for a given period.
/// The RewardsCoordinator stores all historical distribution roots so that earners can claim their earnings against older roots
/// if they wish but the merkle tree contains the cumulative earnings of all earners and tokens for a given period so earners (or their claimers if set)
/// only need to claim against the latest root to claim all available earnings.
/// @param root The merkle root of the distribution
/// @param rewardsCalculationEndTimestamp The timestamp (seconds) until which rewards have been calculated
/// @param activatedAt The timestamp (seconds) at which the root can be claimed against
⋮----
/// @notice Internal leaf in the merkle tree for the earner's account leaf
/// @param earner The address of the earner
/// @param earnerTokenRoot The merkle root of the earner's token subtree
/// Each leaf in the earner's token subtree is a TokenTreeMerkleLeaf
⋮----
/// @notice The actual leaves in the distribution merkle tree specifying the token earnings
/// for the respective earner's subtree. Each leaf is a claimable amount of a token for an earner.
/// @param token The token for which the earnings are being claimed
/// @param cumulativeEarnings The cumulative earnings of the earner for the token
⋮----
/// @notice A claim against a distribution root called by an
/// earners claimer (could be the earner themselves). Each token claim will claim the difference
/// between the cumulativeEarnings of the earner and the cumulativeClaimed of the claimer.
/// Each claim can specify which of the earner's earned tokens they want to claim.
/// See `processClaim()` for more details.
/// @param rootIndex The index of the root in the list of DistributionRoots
/// @param earnerIndex The index of the earner's account root in the merkle tree
/// @param earnerTreeProof The proof of the earner's EarnerTreeMerkleLeaf against the merkle root
/// @param earnerLeaf The earner's EarnerTreeMerkleLeaf struct, providing the earner address and earnerTokenRoot
/// @param tokenIndices The indices of the token leaves in the earner's subtree
/// @param tokenTreeProofs The proofs of the token leaves against the earner's earnerTokenRoot
/// @param tokenLeaves The token leaves to be claimed
/// @dev The merkle tree is structured with the merkle root at the top and EarnerTreeMerkleLeaf as internal leaves
/// in the tree. Each earner leaf has its own subtree with TokenTreeMerkleLeaf as leaves in the subtree.
/// To prove a claim against a specified rootIndex(which specifies the distributionRoot being used),
/// the claim will first verify inclusion of the earner leaf in the tree against _distributionRoots[rootIndex].root.
/// Then for each token, it will verify inclusion of the token leaf in the earner's subtree against the earner's earnerTokenRoot.
⋮----
/// @notice Parameters for the RewardsCoordinator constructor
/// @param delegationManager The address of the DelegationManager contract
/// @param strategyManager The address of the StrategyManager contract
/// @param allocationManager The address of the AllocationManager contract
/// @param pauserRegistry The address of the PauserRegistry contract
/// @param permissionController The address of the PermissionController contract
/// @param CALCULATION_INTERVAL_SECONDS The interval at which rewards are calculated
/// @param MAX_REWARDS_DURATION The maximum duration of a rewards submission
/// @param MAX_RETROACTIVE_LENGTH The maximum retroactive length of a rewards submission
/// @param MAX_FUTURE_LENGTH The maximum future length of a rewards submission
/// @param GENESIS_REWARDS_TIMESTAMP The timestamp at which rewards are first calculated
/// @param version The semantic version of the contract (e.g. "1.2.3")
/// @dev Needed to avoid stack-too-deep errors
⋮----
interface IRewardsCoordinatorEvents is IRewardsCoordinatorTypes {
/// @notice emitted when an AVS creates a valid RewardsSubmission
event AVSRewardsSubmissionCreated(
⋮----
/// @notice emitted when a valid RewardsSubmission is created for all stakers by a valid submitter
event RewardsSubmissionForAllCreated(
⋮----
/// @notice emitted when a valid RewardsSubmission is created when rewardAllStakersAndOperators is called
event RewardsSubmissionForAllEarnersCreated(
⋮----
/// @notice Emitted when an AVS creates a valid `OperatorDirectedRewardsSubmission`
/// @param caller The address calling `createOperatorDirectedAVSRewardsSubmission`.
/// @param avs The avs on behalf of which the operator-directed rewards are being submitted.
/// @param operatorDirectedRewardsSubmissionHash Keccak256 hash of (`avs`, `submissionNonce` and `operatorDirectedRewardsSubmission`).
/// @param submissionNonce Current nonce of the avs. Used to generate a unique submission hash.
/// @param operatorDirectedRewardsSubmission The Operator-Directed Rewards Submission. Contains the token, start timestamp, duration, operator rewards, description and, strategy and multipliers.
event OperatorDirectedAVSRewardsSubmissionCreated(
⋮----
/// @notice Emitted when an AVS creates a valid `OperatorDirectedRewardsSubmission` for an operator set.
/// @param caller The address calling `createOperatorDirectedOperatorSetRewardsSubmission`.
⋮----
/// @param operatorSet The operatorSet on behalf of which the operator-directed rewards are being submitted.
⋮----
event OperatorDirectedOperatorSetRewardsSubmissionCreated(
⋮----
/// @notice Emitted when an AVS creates a valid `UniqueStakeRewardsSubmission` for an operator set.
/// @param caller The address calling `createUniqueStakeRewardsSubmission`.
/// @param rewardsSubmissionHash Keccak256 hash of (`avs`, `submissionNonce` and `rewardsSubmission`).
/// @param operatorSet The operatorSet on behalf of which the rewards are being submitted.
⋮----
/// @param rewardsSubmission The Rewards Submission. Contains the token, start timestamp, duration, strategies and multipliers.
event UniqueStakeRewardsSubmissionCreated(
⋮----
/// @notice Emitted when an AVS creates a valid `TotalStakeRewardsSubmission` for an operator set.
/// @param caller The address calling `createTotalStakeRewardsSubmission`.
⋮----
event TotalStakeRewardsSubmissionCreated(
⋮----
/// @notice rewardsUpdater is responsible for submitting DistributionRoots, only owner can set rewardsUpdater
event RewardsUpdaterSet(address indexed oldRewardsUpdater, address indexed newRewardsUpdater);
⋮----
event RewardsForAllSubmitterSet(
⋮----
event ActivationDelaySet(uint32 oldActivationDelay, uint32 newActivationDelay);
event DefaultOperatorSplitBipsSet(uint16 oldDefaultOperatorSplitBips, uint16 newDefaultOperatorSplitBips);
⋮----
/// @notice Emitted when the operator split for an AVS is set.
/// @param caller The address calling `setOperatorAVSSplit`.
/// @param operator The operator on behalf of which the split is being set.
/// @param avs The avs for which the split is being set by the operator.
/// @param activatedAt The timestamp at which the split will be activated.
/// @param oldOperatorAVSSplitBips The old split for the operator for the AVS.
/// @param newOperatorAVSSplitBips The new split for the operator for the AVS.
event OperatorAVSSplitBipsSet(
⋮----
/// @notice Emitted when the operator split for Programmatic Incentives is set.
/// @param caller The address calling `setOperatorPISplit`.
⋮----
/// @param oldOperatorPISplitBips The old split for the operator for Programmatic Incentives.
/// @param newOperatorPISplitBips The new split for the operator for Programmatic Incentives.
event OperatorPISplitBipsSet(
⋮----
/// @notice Emitted when the operator split for a given operatorSet is set.
/// @param caller The address calling `setOperatorSetSplit`.
⋮----
/// @param operatorSet The operatorSet for which the split is being set.
⋮----
/// @param oldOperatorSetSplitBips The old split for the operator for the operatorSet.
/// @param newOperatorSetSplitBips The new split for the operator for the operatorSet.
event OperatorSetSplitBipsSet(
⋮----
event ClaimerForSet(address indexed earner, address indexed oldClaimer, address indexed claimer);
⋮----
/// @notice rootIndex is the specific array index of the newly created root in the storage array
event DistributionRootSubmitted(
⋮----
event DistributionRootDisabled(uint32 indexed rootIndex);
⋮----
/// @notice root is one of the submitted distribution roots that was claimed against
event RewardsClaimed(
⋮----
/// @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.
/// @author Layr Labs, Inc.
/// @notice Terms of Service: https://docs.eigenlayer.xyz/overview/terms-of-service
/// @notice Allows AVSs to make "Rewards Submissions", which get distributed amongst the AVSs' confirmed
/// Operators and the Stakers delegated to those Operators.
/// Calculations are performed based on the completed RewardsSubmission, with the results posted in
/// a Merkle root against which Stakers & Operators can make claims.
interface IRewardsCoordinator is IRewardsCoordinatorErrors, IRewardsCoordinatorEvents {
/// @dev Initializes the addresses of the initial owner, pauser registry, rewardsUpdater and
/// configures the initial paused status, activationDelay, and defaultOperatorSplitBips.
function initialize(
⋮----
/// @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(
⋮----
/// @notice Creates a new rewards submission on behalf of an AVS, to be split amongst the
⋮----
/// @dev Expected to be called by the ServiceManager of the AVS on behalf of which the submission is being made
⋮----
function createAVSRewardsSubmission(
⋮----
/// @notice similar to `createAVSRewardsSubmission` except the rewards are split amongst *all* stakers
/// rather than just those delegated to operators who are registered to a single avs and is
/// a permissioned call based on isRewardsForAllSubmitter mapping.
⋮----
function createRewardsForAllSubmission(
⋮----
/// @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 authorized rewardsForAllSubmitters, primarily the EmissionsController
⋮----
function createRewardsForAllEarners(
⋮----
/// @notice Creates a new operator-directed rewards submission on behalf of an AVS, to be split amongst the operators and
/// set of stakers delegated to operators who are registered to the `avs`.
/// @param avs The AVS on behalf of which the reward is being submitted
/// @param operatorDirectedRewardsSubmissions The operator-directed rewards submissions being created
⋮----
/// @dev The `RewardsCoordinator` contract needs a token approval of sum of all `operatorRewards` in the `operatorDirectedRewardsSubmissions`, before calling this function.
⋮----
/// @dev Operators must be in ascending order of addresses to check for duplicates.
/// @dev This function will revert if the `operatorDirectedRewardsSubmissions` is malformed.
function createOperatorDirectedAVSRewardsSubmission(
⋮----
/// @notice Creates a new operator-directed rewards submission for an operator set, to be split amongst the operators and
/// set of stakers delegated to operators who are part of the operator set.
/// @param operatorSet The operator set for which the rewards are being submitted
⋮----
/// @dev Expected to be called by the AVS that created the operator set
⋮----
/// @dev The `RewardsCoordinator` contract needs a token approval of sum of all `operatorRewards` in the `operatorDirectedRewardsSubmissions`, before calling this function
⋮----
/// @dev Operators must be in ascending order of addresses to check for duplicates
/// @dev This function will revert if the `operatorDirectedRewardsSubmissions` is malformed
function createOperatorDirectedOperatorSetRewardsSubmission(
⋮----
/// @notice Creates a new unique stake rewards submission for an operator set, to be split amongst the operators and
/// set of stakers delegated to operators. The operators have to both be registered and allocate unique slashable stake to the operator set to be rewarded.
⋮----
/// @dev This function will revert if the `rewardsSubmissions` is malformed.
function createUniqueStakeRewardsSubmission(
⋮----
/// @notice Creates a new total stake rewards submission for an operator set, to be split amongst the operators and
/// set of stakers delegated to operators. The operators have to just be registered to the operator set to be rewarded.
⋮----
function createTotalStakeRewardsSubmission(
⋮----
/// @notice Claim rewards against a given root (read from _distributionRoots[claim.rootIndex]).
/// Earnings are cumulative so earners don't have to claim against all distribution roots they have earnings for,
/// they can simply claim against the latest root and the contract will calculate the difference between
/// their cumulativeEarnings and cumulativeClaimed. This difference is then transferred to recipient address.
/// @param claim The RewardsMerkleClaim to be processed.
/// Contains the root index, earner, token leaves, and required proofs
/// @param recipient The address recipient that receives the ERC20 rewards
/// @dev only callable by the valid claimer, that is
/// if claimerFor[claim.earner] is address(0) then only the earner can claim, otherwise only
/// claimerFor[claim.earner] can claim the rewards.
function processClaim(
⋮----
/// @notice Batch claim rewards against a given root (read from _distributionRoots[claim.rootIndex]).
⋮----
/// @param claims The RewardsMerkleClaims to be processed.
⋮----
/// @dev This function may fail to execute with a large number of claims due to gas limits. Use a smaller array of claims if necessary.
function processClaims(
⋮----
/// @notice Creates a new distribution root. activatedAt is set to block.timestamp + activationDelay
⋮----
/// @param rewardsCalculationEndTimestamp The timestamp until which rewards have been calculated
/// @dev Only callable by the rewardsUpdater
function submitRoot(
⋮----
/// @notice allow the rewardsUpdater to disable/cancel a pending root submission in case of an error
/// @param rootIndex The index of the root to be disabled
function disableRoot(
⋮----
/// @notice Sets the address of the entity that can call `processClaim` on ehalf of an earner
/// @param claimer The address of the entity that can call `processClaim` on behalf of the earner
/// @dev Assumes msg.sender is the earner
function setClaimerFor(
⋮----
/// @notice Sets the address of the entity that can call `processClaim` on behalf of an earner
/// @param earner The address to set the claimer for
⋮----
/// @dev Only callable by operators or AVSs. We define an AVS that has created at least one
///      operatorSet in the `AllocationManager`
⋮----
/// @notice Sets the delay in timestamp before a posted root can be claimed against
/// @dev Only callable by the contract owner
/// @param _activationDelay The new value for activationDelay
function setActivationDelay(
⋮----
/// @notice Sets the default split for all operators across all avss.
/// @param split The default split for all operators across all avss in bips.
/// @dev Only callable by the contract owner.
function setDefaultOperatorSplit(
⋮----
/// @notice Sets the fee recipient address which receives optional protocol fees
⋮----
/// @param _feeRecipient The address of the new fee recipient
function setFeeRecipient(
⋮----
/// @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
/// @param split The split for the operator for the specific avs in bips.
/// @dev Only callable by the operator
/// @dev Split has to be between 0 and 10000 bips (inclusive)
/// @dev The split will be activated after the activation delay
function setOperatorAVSSplit(
⋮----
/// @notice Sets the split for a specific operator for Programmatic Incentives.
⋮----
/// @param split The split for the operator for Programmatic Incentives in bips.
⋮----
function setOperatorPISplit(
⋮----
/// @notice Sets the split for a specific operator for a specific operatorSet.
/// @param operator The operator who is setting the split.
/// @param operatorSet The operatorSet for which the split is being set by the operator.
/// @param split The split for the operator for the specific operatorSet in bips.
⋮----
function setOperatorSetSplit(
⋮----
/// @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(
⋮----
/// @notice Sets the permissioned `rewardsUpdater` address which can post new roots
⋮----
/// @param _rewardsUpdater The address of the new rewardsUpdater
function setRewardsUpdater(
⋮----
/// @notice Sets the permissioned `rewardsForAllSubmitter` address which can submit createRewardsForAllSubmission
⋮----
/// @param _submitter The address of the rewardsForAllSubmitter
/// @param _newValue The new value for isRewardsForAllSubmitter
function setRewardsForAllSubmitter(
⋮----
///                         VIEW FUNCTIONS
⋮----
/// @notice Delay in timestamp (seconds) before a posted root can be claimed against
function activationDelay() external view returns (uint32);
⋮----
/// @notice The timestamp until which RewardsSubmissions have been calculated
function currRewardsCalculationEndTimestamp() external view returns (uint32);
⋮----
/// @notice Mapping: earner => the address of the entity who can call `processClaim` on behalf of the earner
function claimerFor(
⋮----
/// @notice Mapping: claimer => token => total amount claimed
function cumulativeClaimed(
⋮----
/// @notice the default split for all operators across all avss
function defaultOperatorSplitBips() external view returns (uint16);
⋮----
/// @notice the split for a specific `operator` for a specific `avs`
function getOperatorAVSSplit(
⋮----
/// @notice the split for a specific `operator` for Programmatic Incentives
function getOperatorPISplit(
⋮----
/// @notice Returns the split for a specific `operator` for a given `operatorSet`
function getOperatorSetSplit(
⋮----
/// @notice return the hash of the earner's leaf
function calculateEarnerLeafHash(
⋮----
/// @notice returns the hash of the earner's token leaf
function calculateTokenLeafHash(
⋮----
/// @notice returns 'true' if the claim would currently pass the check in `processClaims`
/// but will revert if not valid
function checkClaim(
⋮----
/// @notice returns the number of distribution roots posted
function getDistributionRootsLength() external view returns (uint256);
⋮----
/// @notice returns the distributionRoot at the specified index
function getDistributionRootAtIndex(
⋮----
/// @notice returns the current distributionRoot
function getCurrentDistributionRoot() external view returns (DistributionRoot memory);
⋮----
/// @notice loop through the distribution roots from reverse and get latest root that is not disabled and activated
/// i.e. a root that can be claimed against
function getCurrentClaimableDistributionRoot() external view returns (DistributionRoot memory);
⋮----
/// @notice loop through distribution roots from reverse and return index from hash
function getRootIndexFromHash(
⋮----
/// @notice The address of the entity that can update the contract with new merkle roots
function rewardsUpdater() external view returns (address);
⋮----
/// @notice The interval in seconds at which the calculation for a RewardsSubmission distribution is done.
/// @dev Rewards Submission durations must be multiples of this interval.
function CALCULATION_INTERVAL_SECONDS() external view returns (uint32);
⋮----
/// @notice The maximum amount of time (seconds) that a RewardsSubmission can span over
function MAX_REWARDS_DURATION() external view returns (uint32);
⋮----
/// @notice max amount of time (seconds) that a submission can start in the past
function MAX_RETROACTIVE_LENGTH() external view returns (uint32);
⋮----
/// @notice max amount of time (seconds) that a submission can start in the future
function MAX_FUTURE_LENGTH() external view returns (uint32);
⋮----
/// @notice absolute min timestamp (seconds) that a submission can start at
function GENESIS_REWARDS_TIMESTAMP() external view returns (uint32);
````

## File: src/contracts/interfaces/ISemVerMixin.sol
````
// SPDX-License-Identifier: BUSL-1.1
⋮----
/// @title ISemVerMixin
/// @notice A mixin interface that provides semantic versioning functionality.
/// @dev Follows SemVer 2.0.0 specification (https://semver.org/)
interface ISemVerMixin {
/// @notice Returns the semantic version string of the contract.
/// @return The version string in SemVer format (e.g., "1.1.1")
function version() external view returns (string memory);
````

## File: src/contracts/interfaces/IShareManager.sol
````
// SPDX-License-Identifier: BUSL-1.1
⋮----
import "../libraries/SlashingLib.sol";
import "./IStrategy.sol";
import "@openzeppelin/contracts/token/ERC20/IERC20.sol";
import "../libraries/OperatorSetLib.sol";
/// @title Interface for a `IShareManager` contract.
/// @author Layr Labs, Inc.
/// @notice Terms of Service: https://docs.eigenlayer.xyz/overview/terms-of-service
/// @notice This contract is used by the DelegationManager as a unified interface to interact with the EigenPodManager and StrategyManager
⋮----
interface IShareManager {
/// @notice Used by the DelegationManager to remove a Staker's shares from a particular strategy when entering the withdrawal queue
/// @dev strategy must be beaconChainETH when talking to the EigenPodManager
/// @return updatedShares the staker's deposit shares after decrement
function removeDepositShares(
⋮----
/// @notice Used by the DelegationManager to award a Staker some shares that have passed through the withdrawal queue
⋮----
/// @return existingDepositShares the shares the staker had before any were added
/// @return addedShares the new shares added to the staker's balance
function addShares(
⋮----
/// @notice Used by the DelegationManager to convert deposit shares to tokens and send them to a staker
⋮----
/// @dev token is not validated when talking to the EigenPodManager
function withdrawSharesAsTokens(
⋮----
/// @notice Returns the current shares of `user` in `strategy`
⋮----
/// @dev returns 0 if the user has negative shares
function stakerDepositShares(
⋮----
/// @notice Increase the amount of burnable/redistributable shares for a given Strategy. This is called by the DelegationManager
/// when an operator is slashed in EigenLayer.
/// @param operatorSet The operator set to burn shares in.
/// @param slashId The slash id to burn shares in.
/// @param strategy The strategy to burn shares in.
/// @param addedSharesToBurn The amount of added shares to burn.
/// @dev This function is only called by the DelegationManager when an operator is slashed.
function increaseBurnOrRedistributableShares(
````

## File: src/contracts/interfaces/ISignatureUtilsMixin.sol
````
// SPDX-License-Identifier: BUSL-1.1
⋮----
interface ISignatureUtilsMixinErrors {
/// @notice Thrown when a signature is invalid.
⋮----
/// @notice Thrown when a signature has expired.
⋮----
interface ISignatureUtilsMixinTypes {
/// @notice Struct that bundles together a signature and an expiration time for the signature.
/// @dev Used primarily for stack management.
⋮----
// the signature itself, formatted as a single bytes object
⋮----
// the expiration timestamp (UTC) of the signature
⋮----
/// @notice Struct that bundles together a signature, a salt for uniqueness, and an expiration time for the signature.
⋮----
// the salt used to generate the signature
⋮----
/// @title The interface for common signature utilities.
/// @author Layr Labs, Inc.
/// @notice Terms of Service: https://docs.eigenlayer.xyz/overview/terms-of-service
interface ISignatureUtilsMixin is ISignatureUtilsMixinErrors, ISignatureUtilsMixinTypes {
/// @notice Computes the EIP-712 domain separator used for signature validation.
/// @dev The domain separator is computed according to EIP-712 specification, using:
///      - The hardcoded name "EigenLayer"
///      - The contract's version string
///      - The current chain ID
///      - This contract's address
/// @return The 32-byte domain separator hash used in EIP-712 structured data signing.
/// @dev See https://eips.ethereum.org/EIPS/eip-712#definition-of-domainseparator.
function domainSeparator() external view returns (bytes32);
````

## File: src/contracts/interfaces/IStrategy.sol
````
// SPDX-License-Identifier: BUSL-1.1
⋮----
import "@openzeppelin/contracts/token/ERC20/IERC20.sol";
import "../libraries/SlashingLib.sol";
⋮----
interface IStrategyErrors {
/// @dev Thrown when called by an account that is not strategy manager.
⋮----
/// @dev Thrown when new shares value is zero.
⋮----
/// @dev Thrown when total shares exceeds max.
⋮----
/// @dev Thrown when amount shares is greater than total shares.
⋮----
/// @dev Thrown when attempting an action with a token that is not accepted.
⋮----
/// StrategyBaseWithTVLLimits
⋮----
/// @dev Thrown when `maxPerDeposit` exceeds max.
⋮----
/// @dev Thrown when balance exceeds max total deposits.
⋮----
interface IStrategyEvents {
/// @notice Used to emit an event for the exchange rate between 1 share and underlying token in a strategy contract
/// @param rate is the exchange rate in wad 18 decimals
/// @dev Tokens that do not have 18 decimals must have offchain services scale the exchange rate by the proper magnitude
event ExchangeRateEmitted(uint256 rate);
⋮----
/// Used to emit the underlying token and its decimals on strategy creation
/// @notice token
/// @param token is the ERC20 token of the strategy
/// @param decimals are the decimals of the ERC20 token in the strategy
event StrategyTokenSet(IERC20 token, uint8 decimals);
⋮----
/// @title Minimal interface for an `Strategy` contract.
/// @author Layr Labs, Inc.
/// @notice Terms of Service: https://docs.eigenlayer.xyz/overview/terms-of-service
/// @notice Custom `Strategy` implementations may expand extensively on this interface.
interface IStrategy is IStrategyErrors, IStrategyEvents {
/// @notice Used to deposit tokens into this Strategy
/// @param token is the ERC20 token being deposited
/// @param amount is the amount of token being deposited
/// @dev This function is only callable by the strategyManager contract. It is invoked inside of the strategyManager's
/// `depositIntoStrategy` function, and individual share balances are recorded in the strategyManager as well.
/// @return newShares is the number of new shares issued at the current exchange ratio.
function deposit(
⋮----
/// @notice Used to withdraw tokens from this Strategy, to the `recipient`'s address
/// @param recipient is the address to receive the withdrawn funds
/// @param token is the ERC20 token being transferred out
/// @param amountShares is the amount of shares being withdrawn
⋮----
/// other functions, and individual share balances are recorded in the strategyManager as well.
/// @return amountOut is the amount of tokens being transferred out.
function withdraw(
⋮----
/// @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(
⋮----
/// @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(
⋮----
/// @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.
/// @notice In contrast to `sharesToUnderlyingView`, this function **may** make state modifications
/// @param amountShares is the amount of shares to calculate its conversion into the underlying token
/// @return The amount of underlying tokens corresponding to the input `amountShares`
/// @dev Implementation for these functions in particular may vary significantly for different strategies
function sharesToUnderlying(
⋮----
/// @notice Used to convert an amount of underlying tokens to the equivalent amount of shares in this strategy.
/// @notice In contrast to `underlyingToSharesView`, this function **may** make state modifications
/// @param amountUnderlying is the amount of `underlyingToken` to calculate its conversion into strategy shares
/// @return The amount of shares corresponding to the input `amountUnderlying`.  This is used as deposit shares
/// in the `StrategyManager` contract.
⋮----
function underlyingToShares(
⋮----
/// @notice convenience function for fetching the current underlying value of all of the `user`'s shares in
/// this strategy. In contrast to `userUnderlyingView`, this function **may** make state modifications
function userUnderlying(
⋮----
/// @notice convenience function for fetching the current total shares of `user` in this strategy, by
/// querying the `strategyManager` contract
function shares(
⋮----
/// @notice In contrast to `sharesToUnderlying`, this function guarantees no state modifications
⋮----
function sharesToUnderlyingView(
⋮----
/// @notice In contrast to `underlyingToShares`, this function guarantees no state modifications
⋮----
/// @return The amount of shares corresponding to the input `amountUnderlying`. This is used as deposit shares
⋮----
function underlyingToSharesView(
⋮----
/// this strategy. In contrast to `userUnderlying`, this function guarantees no state modifications
function userUnderlyingView(
⋮----
/// @notice The underlying token for shares in this Strategy
function underlyingToken() external view returns (IERC20);
⋮----
/// @notice The total number of extant shares in this Strategy
function totalShares() external view returns (uint256);
⋮----
/// @notice Returns either a brief string explaining the strategy's goal & purpose, or a link to metadata that explains in more detail.
function explanation() external view returns (string memory);
````

## File: src/contracts/interfaces/IStrategyFactory.sol
````
// SPDX-License-Identifier: BUSL-1.1
⋮----
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.
/// @notice Terms of Service: https://docs.eigenlayer.xyz/overview/terms-of-service
/// @dev This may not be compatible with non-standard ERC20 tokens. Caution is warranted.
interface IStrategyFactory {
/// @dev Thrown when attempting to deploy a strategy for a blacklisted token.
⋮----
/// @dev Thrown when attempting to deploy a strategy that already exists.
⋮----
/// @dev Thrown when attempting to blacklist a token that is already blacklisted
⋮----
event TokenBlacklisted(IERC20 token);
⋮----
/// @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
/// These strategies MIGHT not be whitelisted in the StrategyManager,
/// though deployNewStrategy does whitelist by default.
/// These strategies MIGHT not be the only strategy for the underlying token
/// as additional strategies can be whitelisted by the owner of the factory.
function deployedStrategies(
⋮----
/// @notice Returns whether a token is blacklisted from having new strategies deployed.
function isBlacklisted(
⋮----
/// @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.
/// $dev Immense caution is warranted for non-standard ERC20 tokens, particularly "reentrant" tokens
/// like those that conform to ERC777.
function deployNewStrategy(
⋮----
/// @notice Deploys a new duration-bound vault strategy contract.
/// @dev Enforces the same blacklist semantics as vanilla strategies.
function deployDurationVaultStrategy(
⋮----
/// @notice Returns all duration vaults that have ever been deployed for a given token.
function getDurationVaults(
⋮----
/// @notice Owner-only function to pass through a call to `StrategyManager.addStrategiesToDepositWhitelist`
function whitelistStrategies(
⋮----
/// @notice Owner-only function to pass through a call to `StrategyManager.removeStrategiesFromDepositWhitelist`
function removeStrategiesFromWhitelist(
⋮----
/// @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(
````

## File: src/contracts/interfaces/IStrategyManager.sol
````
// SPDX-License-Identifier: BUSL-1.1
⋮----
import "./IStrategy.sol";
import "./IShareManager.sol";
import "./IDelegationManager.sol";
import "./IEigenPodManager.sol";
⋮----
interface IStrategyManagerErrors {
/// @dev Thrown when total strategies deployed exceeds max.
⋮----
/// @dev Thrown when call attempted from address that's not delegation manager.
⋮----
/// @dev Thrown when call attempted from address that's not strategy whitelister.
⋮----
/// @dev Thrown when provided `shares` amount is too high.
⋮----
/// @dev Thrown when provided `shares` amount is zero.
⋮----
/// @dev Thrown when provided `staker` address is null.
⋮----
/// @dev Thrown when provided `strategy` not found.
⋮----
/// @dev Thrown when attempting to deposit to a non-whitelisted strategy.
⋮----
/// @dev Thrown when attempting to add a strategy that is already in the operator set's burn or redistributable shares.
⋮----
interface IStrategyManagerEvents {
/// @notice Emitted when a new deposit occurs on behalf of `staker`.
/// @param staker Is the staker who is depositing funds into EigenLayer.
/// @param strategy Is the strategy that `staker` has deposited into.
/// @param shares Is the number of new shares `staker` has been granted in `strategy`.
event Deposit(address staker, IStrategy strategy, uint256 shares);
⋮----
/// @notice Emitted when the `strategyWhitelister` is changed
event StrategyWhitelisterChanged(address previousAddress, address newAddress);
⋮----
/// @notice Emitted when a strategy is added to the approved list of strategies for deposit
event StrategyAddedToDepositWhitelist(IStrategy strategy);
⋮----
/// @notice Emitted when a strategy is removed from the approved list of strategies for deposit
event StrategyRemovedFromDepositWhitelist(IStrategy strategy);
⋮----
/// @notice Emitted when an operator is slashed and shares to be burned or redistributed are increased
event BurnOrRedistributableSharesIncreased(
⋮----
/// @notice Emitted when shares marked for burning or redistribution are decreased and transferred to the operator set's redistribution recipient
event BurnOrRedistributableSharesDecreased(
⋮----
/// @notice Emitted when shares are burnt
/// @dev This event is only emitted in the pre-redistribution slash path
event BurnableSharesDecreased(IStrategy strategy, uint256 shares);
⋮----
/// @title Interface for the primary entrypoint for funds into EigenLayer.
/// @author Layr Labs, Inc.
/// @notice Terms of Service: https://docs.eigenlayer.xyz/overview/terms-of-service
/// @notice See the `StrategyManager` contract itself for implementation details.
interface IStrategyManager is IStrategyManagerErrors, IStrategyManagerEvents, IShareManager {
/// @notice Initializes the strategy manager contract. Sets the `pauserRegistry` (currently **not** modifiable after being set),
/// and transfers contract ownership to the specified `initialOwner`.
/// @param initialOwner Ownership of this contract is transferred to this address.
/// @param initialStrategyWhitelister The initial value of `strategyWhitelister` to set.
/// @param initialPausedStatus The initial value of `_paused` to set.
function initialize(
⋮----
/// @notice Deposits `amount` of `token` into the specified `strategy` and credits shares to the caller
/// @param strategy the strategy that handles `token`
/// @param token the token from which the `amount` will be transferred
/// @param amount the number of tokens to deposit
/// @return depositShares the number of deposit shares credited to the caller
/// @dev The caller must have previously approved this contract to transfer at least `amount` of `token` on their behalf.
///
/// WARNING: Be extremely cautious when depositing tokens that do not strictly adhere to ERC20 standards.
/// Tokens that diverge significantly from ERC20 norms can cause unexpected behavior in token balances for
/// that strategy, e.g. ERC-777 tokens allowing cross-contract reentrancy.
function depositIntoStrategy(
⋮----
/// @notice Deposits `amount` of `token` into the specified `strategy` and credits shares to the `staker`
/// Note tokens are transferred from `msg.sender`, NOT from `staker`. This method allows the caller, using a
/// signature, to deposit their tokens to another staker's balance.
⋮----
/// @param amount the number of tokens to transfer from the caller to the strategy
/// @param staker the staker that the deposited assets will be credited to
/// @param expiry the timestamp at which the signature expires
/// @param signature a valid ECDSA or EIP-1271 signature from `staker`
/// @return depositShares the number of deposit shares credited to `staker`
⋮----
function depositIntoStrategyWithSignature(
⋮----
/// @notice Legacy burn strategy shares for the given strategy by calling into the strategy to transfer
/// to the default burn address.
/// @param strategy The strategy to burn shares in.
/// @dev This function will be DEPRECATED in a release after redistribution
function burnShares(
⋮----
/// @notice Removes burned shares from storage and transfers the underlying tokens for the slashId to the redistribution recipient.
/// @dev Reentrancy is checked in the `clearBurnOrRedistributableSharesByStrategy` function.
/// @param operatorSet The operator set to burn shares in.
/// @param slashId The slash ID to burn shares in.
/// @return The amounts of tokens transferred to the redistribution recipient for each strategy
function clearBurnOrRedistributableShares(
⋮----
/// @notice Removes a single strategy's shares from storage and transfers the underlying tokens for the slashId to the redistribution recipient.
⋮----
/// @return The amount of tokens transferred to the redistribution recipient for the strategy.
function clearBurnOrRedistributableSharesByStrategy(
⋮----
/// @notice Returns the strategies and shares that have NOT been sent to the redistribution recipient for a given slashId.
/// @param operatorSet The operator set to burn or redistribute shares in.
/// @param slashId The slash ID to burn or redistribute shares in.
/// @return The strategies and shares for the given slashId.
function getBurnOrRedistributableShares(
⋮----
/// @notice Returns the shares for a given strategy for a given slashId.
⋮----
/// @param strategy The strategy to get the shares for.
/// @return The shares for the given strategy for the given slashId.
/// @dev This function will return revert if the shares have already been sent to the redistribution recipient.
⋮----
/// @notice Returns the number of strategies that have NOT been sent to the redistribution recipient for a given slashId.
⋮----
/// @return The number of strategies for the given slashId.
function getBurnOrRedistributableCount(
⋮----
/// @notice Owner-only function to change the `strategyWhitelister` address.
/// @param newStrategyWhitelister new address for the `strategyWhitelister`.
function setStrategyWhitelister(
⋮----
/// @notice Owner-only function that adds the provided Strategies to the 'whitelist' of strategies that stakers can deposit into
/// @param strategiesToWhitelist Strategies that will be added to the `strategyIsWhitelistedForDeposit` mapping (if they aren't in it already)
function addStrategiesToDepositWhitelist(
⋮----
/// @notice Owner-only function that removes the provided Strategies from the 'whitelist' of strategies that stakers can deposit into
/// @param strategiesToRemoveFromWhitelist Strategies that will be removed to the `strategyIsWhitelistedForDeposit` mapping (if they are in it)
function removeStrategiesFromDepositWhitelist(
⋮----
/// @notice Returns bool for whether or not `strategy` is whitelisted for deposit
function strategyIsWhitelistedForDeposit(
⋮----
/// @notice Get all details on the staker's deposits and corresponding shares
/// @return (staker's strategies, shares in these strategies)
function getDeposits(
⋮----
function getStakerStrategyList(
⋮----
/// @notice Simple getter function that returns `stakerStrategyList[staker].length`.
function stakerStrategyListLength(
⋮----
/// @notice Returns the current shares of `user` in `strategy`
function stakerDepositShares(
⋮----
/// @notice Returns the single, central Delegation contract of EigenLayer
function delegation() external view returns (IDelegationManager);
⋮----
/// @notice Returns the address of the `strategyWhitelister`
function strategyWhitelister() external view returns (address);
⋮----
/// @notice Returns the burnable shares of a strategy
/// @dev This function will be deprecated in a release after redistribution
function getBurnableShares(
⋮----
/// @notice Gets every strategy with burnable shares and the amount of burnable shares in each said strategy
⋮----
/// WARNING: This operation can copy the entire storage to memory, which can be quite expensive. This is designed
/// to mostly be used by view accessors that are queried without any gas fees. Users should keep in mind that
/// this function has an unbounded cost, and using it as part of a state-changing function may render the function
/// uncallable if the map grows to a point where copying to memory consumes too much gas to fit in a block.
function getStrategiesWithBurnableShares() external view returns (address[] memory, uint256[] memory);
⋮----
/// @param staker The address of the staker.
/// @param strategy The strategy to deposit into.
/// @param token The token to deposit.
/// @param amount The amount of `token` to deposit.
/// @param nonce The nonce of the staker.
/// @param expiry The expiry of the signature.
/// @return The EIP-712 signable digest hash.
function calculateStrategyDepositDigestHash(
⋮----
/// @notice Returns the operator sets that have pending burn or redistributable shares.
/// @return The operator sets that have pending burn or redistributable shares.
function getPendingOperatorSets() external view returns (OperatorSet[] memory);
⋮----
/// @notice Returns the slash IDs that are pending to be burned or redistributed.
/// @dev This function will return revert if the operator set has no pending burn or redistributable shares.
/// @param operatorSet The operator set to get the pending slash IDs for.
/// @return The slash IDs that are pending to be burned or redistributed.
function getPendingSlashIds(
````

## File: src/contracts/interfaces/ITaskMailbox.sol
````
// SPDX-License-Identifier: BUSL-1.1
⋮----
import {IERC20} from "@openzeppelin/contracts/token/ERC20/IERC20.sol";
⋮----
import {IAVSTaskHook} from "./IAVSTaskHook.sol";
import {IBN254CertificateVerifierTypes} from "./IBN254CertificateVerifier.sol";
import {IECDSACertificateVerifierTypes} from "./IECDSACertificateVerifier.sol";
import {IKeyRegistrarTypes} from "./IKeyRegistrar.sol";
import {OperatorSet} from "../libraries/OperatorSetLib.sol";
⋮----
/// @title ITaskMailboxTypes
/// @notice Interface defining the type structures used in the TaskMailbox
interface ITaskMailboxTypes {
/// @notice Enum defining the type of consensus mechanism
⋮----
/// @notice Consensus configuration for task verification
/// @param consensusType The type of consensus mechanism
/// @param value Encoded consensus parameters based on consensusType
⋮----
/// @notice Configuration for the executor operator set
/// @param taskHook Address of the AVS task hook contract
/// @param taskSLA Time (in seconds) within which the task must be completed
/// @param feeToken ERC20 token used for task fees
/// @param curveType The curve type used for signature verification
/// @param feeCollector Address to receive AVS fees
/// @param consensus Consensus configuration for task verification
/// @param taskMetadata Additional metadata for task execution
⋮----
/// @notice Parameters for creating a new task
/// @param refundCollector Address to receive refunds if task is not completed
/// @param executorOperatorSet The operator set that will execute the task
/// @param payload Task payload
⋮----
/// @notice Status of a task in the system
⋮----
NONE, // 0 - Default value for uninitialized tasks
CREATED, // 1 - Task has been created
VERIFIED, // 2 - Task has been verified
EXPIRED // 3 - Task has expired
⋮----
/// @notice Complete task information
/// @param creator Address that created the task
/// @param creationTime Block timestamp when task was created
/// @param avs Address of the AVS handling the task
/// @param avsFee Fee paid to the AVS
/// @param refundCollector Address to receive refunds
/// @param executorOperatorSetId ID of the operator set executing the task
/// @param feeSplit Percentage split of fees taken by the TaskMailbox in basis points
/// @param status Current status of the task
/// @param isFeeRefunded Whether the fee has been refunded
/// @param executorOperatorSetTaskConfig Configuration for executor operator set task execution
⋮----
/// @param executorCert Executor certificate
/// @param result Task execution result data
⋮----
/// @title ITaskMailboxErrors
/// @notice Interface defining errors that can be thrown by the TaskMailbox
interface ITaskMailboxErrors is ITaskMailboxTypes {
/// @notice Thrown when a certificate verification threshold is not met
⋮----
/// @notice Thrown when an executor operator set is not registered
⋮----
/// @notice Thrown when an executor operator set task config is not set
⋮----
/// @notice Thrown when an input address is zero
⋮----
/// @notice Thrown when an invalid curve type is provided
⋮----
/// @notice Thrown when a task creator is invalid
⋮----
/// @notice Thrown when a task status is invalid
/// @param expected The expected task status
/// @param actual The actual task status
⋮----
/// @notice Thrown when a payload is empty
⋮----
/// @notice Thrown when a timestamp is at creation
⋮----
/// @notice Thrown when an operator set owner is invalid
⋮----
/// @notice Thrown when an invalid consensus type is provided
⋮----
/// @notice Thrown when an invalid consensus value is provided
⋮----
/// @notice Thrown when a certificate has an invalid reference timestamp
⋮----
/// @notice Thrown when a certificate has an empty signature
⋮----
/// @notice Thrown when fee receiver is zero address
⋮----
/// @notice Thrown when fee has already been refunded
⋮----
/// @notice Thrown when caller is not the refund collector
⋮----
/// @notice Thrown when fee split value is invalid (> 10000 bips)
⋮----
/// @notice Thrown when a certificate has an invalid message hash
⋮----
/// @notice Thrown when a certificate is stale
⋮----
/// @notice Thrown when task SLA exceeds the maximum allowed
⋮----
/// @title ITaskMailboxEvents
/// @notice Interface defining events emitted by the TaskMailbox
interface ITaskMailboxEvents is ITaskMailboxTypes {
/// @notice Emitted when an executor operator set is registered
/// @param caller Address that called the registration function
/// @param avs Address of the AVS being registered
/// @param executorOperatorSetId ID of the executor operator set
/// @param isRegistered Whether the operator set is registered
event ExecutorOperatorSetRegistered(
⋮----
/// @notice Emitted when an executor operator set task configuration is set
/// @param caller Address that called the configuration function
/// @param avs Address of the AVS being configured
⋮----
/// @param config The task configuration for the executor operator set
event ExecutorOperatorSetTaskConfigSet(
⋮----
/// @notice Emitted when a new task is created
⋮----
/// @param taskHash Unique identifier of the task
⋮----
/// @param operatorTableReferenceTimestamp Reference timestamp of the operator table
⋮----
/// @param taskDeadline Timestamp by which the task must be completed
⋮----
event TaskCreated(
⋮----
/// @notice Emitted when a task is verified
/// @param aggregator Address that submitted the verification
⋮----
event TaskVerified(
⋮----
/// @notice Emitted when a task fee is refunded
/// @param refundCollector Address that received the refund
⋮----
/// @param avsFee Amount of fee refunded
event FeeRefunded(address indexed refundCollector, bytes32 indexed taskHash, uint96 avsFee);
⋮----
/// @notice Emitted when the fee split is updated
/// @param feeSplit The new fee split value in basis points
event FeeSplitSet(uint16 feeSplit);
⋮----
/// @notice Emitted when the fee split collector is updated
/// @param feeSplitCollector The new fee split collector address
event FeeSplitCollectorSet(address indexed feeSplitCollector);
⋮----
/// @title ITaskMailbox
/// @author Layr Labs, Inc.
/// @notice Interface for the TaskMailbox contract.
interface ITaskMailbox is ITaskMailboxErrors, ITaskMailboxEvents {
///
///                         EXTERNAL FUNCTIONS
⋮----
/// @notice Initializes the TaskMailbox
/// @param owner The owner of the contract
/// @param feeSplit The initial fee split in basis points
/// @param feeSplitCollector The initial fee split collector address
function initialize(
⋮----
/// @notice Sets the task configuration for an executor operator set
/// @param operatorSet The operator set to configure
/// @param config Task configuration for the operator set
/// @dev Fees can be switched off by setting the fee token to the zero address.
function setExecutorOperatorSetTaskConfig(
⋮----
/// @notice Registers an executor operator set with the TaskMailbox
/// @param operatorSet The operator set to register
/// @param isRegistered Whether the operator set is going to be (de)registered
/// @dev This function can be called to toggle the registration once the task config has been set.
function registerExecutorOperatorSet(
⋮----
/// @notice Creates a new task
/// @param taskParams Parameters for the task
/// @return taskHash Unique identifier of the created task
/// @dev If the operator set has its fee token set, call `IAVSTaskHook.calculateTaskFee()` to get
/// the fee for the task and approve the TaskMailbox for the fee before calling this function.
function createTask(
⋮----
/// @notice Submits the result of a task execution
⋮----
/// @param executorCert Certificate proving the validity of the result
⋮----
function submitResult(
⋮----
/// @notice Refunds the fee for an expired task
⋮----
/// @dev Can only be called by the refund collector for expired tasks
function refundFee(
⋮----
/// @notice Sets the fee split percentage
/// @param feeSplit The fee split in basis points (0-10000)
/// @dev Only callable by the owner
function setFeeSplit(
⋮----
/// @notice Sets the fee split collector address
/// @param feeSplitCollector The address to receive fee splits
⋮----
function setFeeSplitCollector(
⋮----
///                         VIEW FUNCTIONS
⋮----
/// @notice Checks if an executor operator set is registered
/// @param operatorSetKey Key of the operator set to check
/// @return True if the executor operator set is registered, false otherwise
function isExecutorOperatorSetRegistered(
⋮----
/// @notice Gets the task configuration for an executor operator set
/// @param operatorSet The operator set to get configuration for
/// @return Task configuration for the operator set
function getExecutorOperatorSetTaskConfig(
⋮----
/// @notice Gets complete information about a task
⋮----
/// @return Complete task information
function getTaskInfo(
⋮----
/// @notice Gets the current status of a task
⋮----
/// @return Current status of the task
function getTaskStatus(
⋮----
/// @notice Gets the result of a verified task
⋮----
/// @return Result data of the task
function getTaskResult(
⋮----
/// @notice Gets the bytes of a BN254 certificate
/// @param cert The certificate to get the bytes of
/// @return The bytes of the certificate
function getBN254CertificateBytes(
⋮----
/// @notice Gets the bytes of a ECDSA certificate
⋮----
function getECDSACertificateBytes(
⋮----
/// @notice Gets the message hash for a task that needs to be signed by operators
⋮----
/// @return The message hash for the task that needs to be signed by operators
function getMessageHash(
⋮----
/// @notice Gets the current fee split percentage
/// @return The fee split in basis points
function feeSplit() external view returns (uint16);
⋮----
/// @notice Gets the current fee split collector address
/// @return The address that receives fee splits
function feeSplitCollector() external view returns (address);
⋮----
/// @notice Gets the BN254 certificate verifier address
/// @return The address of the BN254 certificate verifier
function BN254_CERTIFICATE_VERIFIER() external view returns (address);
⋮----
/// @notice Gets the ECDSA certificate verifier address
/// @return The address of the ECDSA certificate verifier
function ECDSA_CERTIFICATE_VERIFIER() external view returns (address);
⋮----
/// @notice Gets the maximum task SLA allowed
/// @dev This will be set to `DEALLOCATION_DELAY / 2` so that AVSs can still slash operators in case of stake deallocation during inflight tasks.
/// @return The maximum task SLA in seconds
function MAX_TASK_SLA() external view returns (uint96);
````

## File: src/contracts/libraries/BeaconChainProofs.sol
````
// SPDX-License-Identifier: BUSL-1.1
⋮----
import "./Merkle.sol";
import "../libraries/Endian.sol";
⋮----
//Utility library for parsing and PHASE0 beacon chain block headers
//SSZ Spec: https://github.com/ethereum/consensus-specs/blob/dev/ssz/simple-serialize.md#merkleization
//BeaconBlockHeader Spec: https://github.com/ethereum/consensus-specs/blob/dev/specs/phase0/beacon-chain.md#beaconblockheader
//BeaconState Spec: https://github.com/ethereum/consensus-specs/blob/dev/specs/phase0/beacon-chain.md#beaconstate
⋮----
/// @dev Thrown when a proof is invalid.
⋮----
/// @dev Thrown when a proof with an invalid length is provided.
⋮----
/// @dev Thrown when a validator fields length is invalid.
⋮----
/// @notice Heights of various merkle trees in the beacon chain
///         beaconBlockRoot
///                |                              HEIGHT: BEACON_BLOCK_HEADER_TREE_HEIGHT
///         beaconStateRoot
///        /               \                      HEIGHT: BEACON_STATE_TREE_HEIGHT
/// validatorContainerRoot, balanceContainerRoot
///          |                       |            HEIGHT: BALANCE_TREE_HEIGHT
///          |              individual balances
///          |                                    HEIGHT: VALIDATOR_TREE_HEIGHT
/// individual validators
⋮----
/// @notice Index of the beaconStateRoot in the `BeaconBlockHeader` container
///
/// BeaconBlockHeader = [..., state_root, ...]
///                      0...      3
⋮----
/// (See https://github.com/ethereum/consensus-specs/blob/dev/specs/phase0/beacon-chain.md#beaconblockheader)
⋮----
/// @notice Indices for fields in the `BeaconState` container
⋮----
/// BeaconState = [..., validators, balances, ...]
///                0...     11         12
⋮----
/// (See https://github.com/ethereum/consensus-specs/blob/dev/specs/capella/beacon-chain.md#beaconstate)
⋮----
/// @notice Number of fields in the `Validator` container
/// (See https://github.com/ethereum/consensus-specs/blob/dev/specs/phase0/beacon-chain.md#validator)
⋮----
/// @notice Indices for fields in the `Validator` container
⋮----
/// @notice Slot/Epoch timings
⋮----
/// @notice `FAR_FUTURE_EPOCH` is used as the default value for certain `Validator`
/// fields when a `Validator` is first created on the beacon chain
⋮----
/// @notice The beacon chain version to validate against
⋮----
/// @notice Contains a beacon state root and a merkle proof verifying its inclusion under a beacon block root
⋮----
/// @notice Contains a validator's fields and a merkle proof of their inclusion under a beacon state root
⋮----
/// @notice Contains a beacon balance container root and a proof of this root under a beacon block root
⋮----
/// @notice Contains a validator balance root and a proof of its inclusion under a balance container root
⋮----
///              VALIDATOR FIELDS -> BEACON STATE ROOT -> BEACON BLOCK ROOT
⋮----
/// @notice Verify a merkle proof of the beacon state root against a beacon block root
/// @param beaconBlockRoot merkle root of the beacon block
/// @param proof the beacon state root and merkle proof of its inclusion under `beaconBlockRoot`
function verifyStateRoot(
⋮----
/// This merkle proof verifies the `beaconStateRoot` under the `beaconBlockRoot`
/// - beaconBlockRoot
/// |                            HEIGHT: BEACON_BLOCK_HEADER_TREE_HEIGHT
/// -- beaconStateRoot
⋮----
/// @notice Verify a merkle proof of a validator container against a `beaconStateRoot`
/// @dev This proof starts at a validator's container root, proves through the validator container root,
/// and continues proving to the root of the `BeaconState`
/// @dev See https://eth2book.info/capella/part3/containers/dependencies/#validator for info on `Validator` containers
/// @dev See https://eth2book.info/capella/part3/containers/state/#beaconstate for info on `BeaconState` containers
/// @param beaconStateRoot merkle root of the `BeaconState` container
/// @param validatorFields an individual validator's fields. These are merklized to form a `validatorRoot`,
/// which is used as the leaf to prove against `beaconStateRoot`
/// @param validatorFieldsProof a merkle proof of inclusion of `validatorFields` under `beaconStateRoot`
/// @param validatorIndex the validator's unique index
function verifyValidatorFields(
⋮----
/// Note: the reason we use `VALIDATOR_TREE_HEIGHT + 1` here is because the merklization process for
/// this container includes hashing the root of the validator tree with the length of the validator list
⋮----
// Merkleize `validatorFields` to get the leaf to prove
⋮----
/// This proof combines two proofs, so its index accounts for the relative position of leaves in two trees:
/// - beaconStateRoot
/// |                            HEIGHT: BEACON_STATE_TREE_HEIGHT
/// -- validatorContainerRoot
/// |                            HEIGHT: VALIDATOR_TREE_HEIGHT + 1
/// ---- validatorRoot
⋮----
///          VALIDATOR BALANCE -> BALANCE CONTAINER ROOT -> BEACON BLOCK ROOT
⋮----
/// @notice Verify a merkle proof of the beacon state's balances container against the beacon block root
/// @dev This proof starts at the balance container root, proves through the beacon state root, and
/// continues proving through the beacon block root. As a result, this proof will contain elements
/// of a `StateRootProof` under the same block root, with the addition of proving the balances field
/// within the beacon state.
/// @dev This is used to make checkpoint proofs more efficient, as a checkpoint will verify multiple balances
/// against the same balance container root.
⋮----
/// @param proof a beacon balance container root and merkle proof of its inclusion under `beaconBlockRoot`
function verifyBalanceContainer(
⋮----
/// ---- balancesContainerRoot
⋮----
/// @notice Verify a merkle proof of a validator's balance against the beacon state's `balanceContainerRoot`
/// @param balanceContainerRoot the merkle root of all validators' current balances
/// @param validatorIndex the index of the validator whose balance we are proving
/// @param proof the validator's associated balance root and a merkle proof of inclusion under `balanceContainerRoot`
/// @return validatorBalanceGwei the validator's current balance (in gwei)
function verifyValidatorBalance(
⋮----
/// Note: the reason we use `BALANCE_TREE_HEIGHT + 1` here is because the merklization process for
/// this container includes hashing the root of the balances tree with the length of the balances list
⋮----
/// When merkleized, beacon chain balances are combined into groups of 4 called a `balanceRoot`. The merkle
/// proof here verifies that this validator's `balanceRoot` is included in the `balanceContainerRoot`
/// - balanceContainerRoot
/// |                            HEIGHT: BALANCE_TREE_HEIGHT
/// -- balanceRoot
⋮----
/// Extract the individual validator's balance from the `balanceRoot`
⋮----
/// @notice Parses a balanceRoot to get the uint64 balance of a validator.
/// @dev During merkleization of the beacon state balance tree, four uint64 values are treated as a single
/// leaf in the merkle tree. We use validatorIndex % 4 to determine which of the four uint64 values to
/// extract from the balanceRoot.
/// @param balanceRoot is the combination of 4 validator balances being proven for
/// @param validatorIndex is the index of the validator being proven for
/// @return The validator's balance, in Gwei
function getBalanceAtIndex(
⋮----
/// @notice Indices for fields in the `Validator` container:
/// 0: pubkey
/// 1: withdrawal credentials
/// 2: effective balance
/// 3: slashed?
/// 4: activation eligibility epoch
/// 5: activation epoch
/// 6: exit epoch
/// 7: withdrawable epoch
⋮----
/// @dev Retrieves a validator's pubkey hash
function getPubkeyHash(
⋮----
/// @dev Retrieves a validator's withdrawal credentials
function getWithdrawalCredentials(
⋮----
/// @dev Retrieves a validator's effective balance (in gwei)
function getEffectiveBalanceGwei(
⋮----
/// @dev Retrieves a validator's activation epoch
function getActivationEpoch(
⋮----
/// @dev Retrieves true IFF a validator is marked slashed
function isValidatorSlashed(
⋮----
/// @dev Retrieves a validator's exit epoch
function getExitEpoch(
⋮----
/// @dev We check if the proofTimestamp is <= pectraForkTimestamp because a `proofTimestamp` at the `pectraForkTimestamp`
///      is considered to be Pre-Pectra given the EIP-4788 oracle returns the parent block.
function getBeaconStateTreeHeight(
````

## File: src/contracts/libraries/BN254.sol
````
// SPDX-License-Identifier: MIT
// several functions are taken or adapted from https://github.com/HarryR/solcrypto/blob/master/contracts/altbn128.sol (MIT license):
// Copyright 2017 Christian Reitwiessner
// Permission is hereby granted, free of charge, to any person obtaining a copy
// of this software and associated documentation files (the "Software"), to
// deal in the Software without restriction, including without limitation the
// rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
// sell copies of the Software, and to permit persons to whom the Software is
// furnished to do so, subject to the following conditions:
// The above copyright notice and this permission notice shall be included in
// all copies or substantial portions of the Software.
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
// IN THE SOFTWARE.
⋮----
// The remainder of the code in this library is written by LayrLabs Inc. and is also under an MIT license
⋮----
/// @title Library for operations on the BN254 elliptic curve.
/// @author Layr Labs, Inc.
/// @notice Terms of Service: https://docs.eigenlayer.xyz/overview/terms-of-service
/// @notice Contains BN254 parameters, common operations (addition, scalar mul, pairing), and BLS signature functionality.
⋮----
// modulus for the underlying field F_p of the elliptic curve
⋮----
// modulus for the underlying field F_r of the elliptic curve
⋮----
// Encoding of field elements is: X[1] * i + X[0]
⋮----
/// @dev Thrown when the sum of two points of G1 fails
⋮----
/// @dev Thrown when the scalar multiplication of a point of G1 fails
⋮----
/// @dev Thrown when the scalar is too large.
⋮----
/// @dev Thrown when the pairing check fails
⋮----
/// @dev Thrown when the exponentiation mod fails
⋮----
function generatorG1() internal pure returns (G1Point memory) {
⋮----
// generator of group G2
/// @dev Generator point in F_q2 is of the form: (x0 + ix1, y0 + it1).
⋮----
/// @notice returns the G2 generator
/// @dev mind the ordering of the 1s and 0s!
///      this is because of the (unknown to us) convention used in the bn254 pairing precompile contract
///      "Elements a * i + b of F_p^2 are encoded as two elements of F_p, (a, b)."
///      https://github.com/ethereum/EIPs/blob/master/EIPS/eip-197.md#encoding
function generatorG2() internal pure returns (G2Point memory) {
⋮----
// negation of the generator of group G2
⋮----
function negGeneratorG2() internal pure returns (G2Point memory) {
⋮----
/// @param p Some point in G1.
/// @return The negation of `p`, i.e. p.plus(p.negate()) should be zero.
function negate(
⋮----
// The prime q in the base field F_q for G1
⋮----
/// @return r the sum of two points of G1
function plus(
⋮----
// solium-disable-next-line security/no-inline-assembly
⋮----
// Use "invalid" to make gas estimation work
⋮----
/// @notice an optimized ecMul implementation that takes O(log_2(s)) ecAdds
/// @param p the point to multiply
/// @param s the scalar to multiply by
/// @dev this function is only safe to use if the scalar is 9 bits or less
function scalar_mul_tiny(
⋮----
// if s is 1 return p
⋮----
// the accumulated product to return
⋮----
// the 2^n*p to add to the accumulated product in each iteration
⋮----
// value of most significant bit
⋮----
// index of most significant bit
⋮----
//loop until we reach the most significant bit
⋮----
// if the  current bit is 1, add the 2^n*p to the accumulated product
⋮----
// double the 2^n*p for the next iteration
⋮----
// increment the index and double the value of the most significant bit
⋮----
// return the accumulated product
⋮----
/// @return r the product of a point on G1 and a scalar, i.e.
///         p == p.scalar_mul(1) and p.plus(p) == p.scalar_mul(2) for all
///         points p.
function scalar_mul(
⋮----
///  @return The result of computing the pairing check
///         e(p1[0], p2[0]) *  .... * e(p1[n], p2[n]) == 1
///         For example,
///         pairing([P1(), P1().negate()], [P2(), P2()]) should return true.
function pairing(
⋮----
/// @notice This function is functionally the same as pairing(), however it specifies a gas limit
///         the user can set, as a precompile may use the entire gas budget if it reverts.
function safePairing(
⋮----
//Out is the output of the pairing precompile, either 0 or 1 based on whether the two pairings are equal.
//Success is true if the precompile actually goes through (aka all inputs are valid)
⋮----
/// @return hashedG1 the keccak256 hash of the G1 Point
/// @dev used for BLS signatures
function hashG1Point(
⋮----
/// @return the keccak256 hash of the G2 Point
⋮----
function hashG2Point(
⋮----
/// @notice adapted from https://github.com/HarryR/solcrypto/blob/master/contracts/altbn128.sol
function hashToG1(
⋮----
// y^2 == beta
⋮----
/// Given X, find Y
///
///   where y = sqrt(x^3 + b)
⋮----
/// Returns: (x^3 + b), y
function findYFromX(
⋮----
// beta = (x^3 + b) % p
⋮----
// y^2 = x^3 + b
// this acts like: y = sqrt(beta) = beta^((p+1) / 4)
⋮----
function expMod(
⋮----
input[0] = 0x20; // baseLen = new(big.Int).SetBytes(getData(input, 0, 32))
input[1] = 0x20; // expLen  = new(big.Int).SetBytes(getData(input, 32, 32))
input[2] = 0x20; // modLen  = new(big.Int).SetBytes(getData(input, 64, 32))
````

## File: src/contracts/libraries/BN254SignatureVerifier.sol
````
// SPDX-License-Identifier: BUSL-1.1
⋮----
import {BN254} from "./BN254.sol";
⋮----
/// @title BN254SignatureVerifier
/// @notice Library for BN254 signature verification
/// @dev Provides unified signature verification with consistent gamma calculation and hash-to-G1 conversion
⋮----
/// @notice Core BN254 signature verification function with optional gas limiting
/// @param msgHash The message hash that was signed
/// @param signature The BLS signature to verify (G1 point)
/// @param pubkeyG1 The G1 component of the public key
/// @param pubkeyG2 The G2 component of the public key
/// @param useGasLimit Whether to use gas-limited safe pairing
/// @param pairingGas Gas limit for pairing (ignored if useGasLimit is false)
/// @return success True if verification succeeded (always true if useGasLimit=false due to revert)
/// @return pairingSuccessful True if pairing operation completed (only relevant when useGasLimit=true)
function verifySignature(
⋮----
// Calculate pairing inputs
⋮----
// Use safe pairing with gas limit
⋮----
/// @notice Internal function to calculate gamma value for signature verification
/// @param msgHash The message hash
⋮----
/// @param signature The signature point
/// @return gamma The calculated gamma value
function _calculateGamma(
````

## File: src/contracts/libraries/Endian.sol
````
// SPDX-License-Identifier: BUSL-1.1
⋮----
/// @notice Converts a little endian-formatted uint64 to a big endian-formatted uint64
/// @param lenum little endian-formatted uint64 input, provided as 'bytes32' type
/// @return n The big endian-formatted uint64
/// @dev Note that the input is formatted as a 'bytes32' type (i.e. 256 bits), but it is immediately truncated to a uint64 (i.e. 64 bits)
/// through a right-shift/shr operation.
function fromLittleEndianUint64(
⋮----
// the number needs to be stored in little-endian encoding (ie in bytes 0-8)
⋮----
// forgefmt: disable-next-item
````

## File: src/contracts/libraries/Merkle.sol
````
// SPDX-License-Identifier: MIT
// Adapted from OpenZeppelin Contracts (last updated v4.8.0) (utils/cryptography/MerkleProof.sol)
⋮----
/// @dev These functions deal with verification of Merkle Tree proofs.
///
/// WARNING: You should avoid using leaf values that are 64 bytes long prior to
/// hashing, salt the leaves, or hash the leaves with a hash function other than
/// what is used for the Merkle tree's internal nodes. This is because the
/// concatenation of a sorted pair of internal nodes in the Merkle tree could
/// be reinterpreted as a leaf value.
⋮----
/// @notice Thrown when the provided proof was not a multiple of 32, or was empty for SHA256.
/// @dev Error code: 0x4dc5f6a4
⋮----
/// @notice Thrown when the provided index was outside the max index for the tree.
/// @dev Error code: 0x63df8171
⋮----
/// @notice Thrown when the provided leaves' length was not a power of two.
/// @dev Error code: 0xf6558f51
⋮----
/// @notice Thrown when the provided leaves' length was 0.
/// @dev Error code: 0xbaec3d9a
⋮----
/// @notice Thrown when the provided leaves' length was insufficient.
/// @dev Error code: 0xf8ef0367
/// @dev This is used for the SHA256 Merkle tree, where the tree must have more than 1 leaf.
⋮----
/// @notice Thrown when the root is empty.
/// @dev Error code: 0x53ce4ece
/// @dev Empty roots should never be valid. We prevent them to avoid issues like the Nomad bridge attack: <https://medium.com/nomad-xyz-blog/nomad-bridge-hack-root-cause-analysis-875ad2e5aacd>
⋮----
/// @notice Verifies that a given leaf is included in a Merkle tree
/// @param proof The proof of inclusion for the leaf
/// @param root The root of the Merkle tree
/// @param leaf The leaf to verify
/// @param index The index of the leaf in the Merkle tree
/// @return True if the leaf is included in the Merkle tree, false otherwise
/// @dev A `proof` is valid if and only if the rebuilt hash matches the root of the tree.
/// @dev Reverts for:
///      - InvalidProofLength: proof.length is not a multiple of 32.
///      - InvalidIndex: index is not 0 at conclusion of computation (implying outside the max index for the tree).
function verifyInclusionKeccak(
⋮----
/// @notice Returns the rebuilt hash obtained by traversing a Merkle tree up
/// from `leaf` using `proof`.
⋮----
/// @return The rebuilt hash
⋮----
/// @dev The tree is built assuming `leaf` is the 0 indexed `index`'th leaf from the bottom left of the tree.
function processInclusionProofKeccak(
⋮----
// if index is even, then computedHash is a left sibling
⋮----
// if index is odd, then computedHash is a right sibling
⋮----
// Confirm proof was fully consumed by end of computation
⋮----
///      - InvalidProofLength: proof.length is 0 or not a multiple of 32.
⋮----
function verifyInclusionSha256(
⋮----
function processInclusionProofSha256(
⋮----
/// @notice Returns the Merkle root of a tree created from a set of leaves using SHA-256 as its hash function
/// @param leaves the leaves of the Merkle tree
/// @return The computed Merkle root of the tree.
⋮----
///      - NotEnoughLeaves: leaves.length is less than 2.
///      - LeavesNotPowerOfTwo: leaves.length is not a power of two.
/// @dev Unlike the Keccak version, this function does not allow a single-leaf tree.
function merkleizeSha256(
⋮----
// There are half as many nodes in the layer above the leaves
⋮----
// Create a layer to store the internal nodes
⋮----
// Fill the layer with the pairwise hashes of the leaves
⋮----
// While we haven't computed the root
⋮----
// The next layer above has half as many nodes
⋮----
// Overwrite the first numNodesInLayer nodes in layer with the pairwise hashes of their children
⋮----
// The first node in the layer is the root
⋮----
/// @notice Returns the Merkle root of a tree created from a set of leaves using Keccak as its hash function
⋮----
///      - NoLeaves: leaves.length is 0.
function merkleizeKeccak(
⋮----
// Pad to the next power of 2
⋮----
/// @notice Returns the Merkle proof for a given index in a tree created from a set of leaves using Keccak as its hash function
⋮----
/// @param index the index of the leaf to get the proof for
/// @return proof The computed Merkle proof for the leaf at index.
⋮----
///      - InvalidIndex: index is outside the max index for the tree.
function getProofKeccak(
⋮----
// TODO: very inefficient, use ZERO_HASHES
// pad to the next power of 2
⋮----
// Flip the least significant bit of index to get the sibling index
⋮----
// Add the sibling to the proof
⋮----
/// @notice Returns the Merkle proof for a given index in a tree created from a set of leaves using SHA-256 as its hash function
⋮----
/// @dev Unlike the Keccak version, this function does not allow a single-leaf proof.
function getProofSha256(
⋮----
/// @notice Returns whether the input is a power of two
/// @param value the value to check
/// @return True if the input is a power of two, false otherwise
function isPowerOfTwo(
````

## File: src/contracts/libraries/OperatorSetLib.sol
````
// SPDX-License-Identifier: BUSL-1.1
⋮----
/// @notice An operator set identified by the AVS address and an identifier
/// @param avs The address of the AVS this operator set belongs to
/// @param id The unique identifier for the operator set
⋮----
function key(
⋮----
function decode(
⋮----
/// forgefmt: disable-next-item
````

## File: src/contracts/libraries/SlashingLib.sol
````
// SPDX-License-Identifier: BUSL-1.1
⋮----
import "@openzeppelin/contracts/utils/math/Math.sol";
import "@openzeppelin-upgrades/contracts/utils/math/SafeCastUpgradeable.sol";
⋮----
/// @dev All scaling factors have `1e18` as an initial/default value. This value is represented
/// by the constant `WAD`, which is used to preserve precision with uint256 math.
///
/// When applying scaling factors, they are typically multiplied/divided by `WAD`, allowing this
/// constant to act as a "1" in mathematical formulae.
⋮----
/*
 * There are 2 types of shares:
 *      1. deposit shares
 *          - These can be converted to an amount of tokens given a strategy
 *              - by calling `sharesToUnderlying` on the strategy address (they're already tokens
 *              in the case of EigenPods)
 *          - These live in the storage of the EigenPodManager and individual StrategyManager strategies
 *      2. withdrawable shares
 *          - For a staker, this is the amount of shares that they can withdraw
 *          - For an operator, the shares delegated to them are equal to the sum of their stakers'
 *            withdrawable shares
 *
 * Along with a slashing factor, the DepositScalingFactor is used to convert between the two share types.
 */
⋮----
/// @dev Thrown if an updated deposit scaling factor is 0 to avoid underflow.
⋮----
// WAD MATH
⋮----
function mulWad(
⋮----
function divWad(
⋮----
/// @notice Used explicitly for calculating slashed magnitude, we want to ensure even in the
/// situation where an operator is slashed several times and precision has been lost over time,
/// an incoming slashing request isn't rounded down to 0 and an operator is able to avoid slashing penalties.
function mulWadRoundUp(
⋮----
// GETTERS
⋮----
function scalingFactor(
⋮----
function scaleForQueueWithdrawal(
⋮----
function scaleForCompleteWithdrawal(
⋮----
function update(
⋮----
// If this is the staker's first deposit or they are delegating to an operator,
// the slashing factor is inverted and applied to the existing DSF. This has the
// effect of "forgiving" prior slashing for any subsequent deposits.
⋮----
/// Base Equations:
/// (1) newShares = currentShares + addedShares
/// (2) newDepositShares = prevDepositShares + addedShares
/// (3) newShares = newDepositShares * newDepositScalingFactor * slashingFactor
⋮----
/// Plugging (1) into (3):
/// (4) newDepositShares * newDepositScalingFactor * slashingFactor = currentShares + addedShares
⋮----
/// Solving for newDepositScalingFactor
/// (5) newDepositScalingFactor = (currentShares + addedShares) / (newDepositShares * slashingFactor)
⋮----
/// Plugging in (2) into (5):
/// (7) newDepositScalingFactor = (currentShares + addedShares) / ((prevDepositShares + addedShares) * slashingFactor)
/// Note that magnitudes must be divided by WAD for precision. Thus,
⋮----
/// (8) newDepositScalingFactor = WAD * (currentShares + addedShares) / ((prevDepositShares + addedShares) * slashingFactor / WAD)
/// (9) newDepositScalingFactor = (currentShares + addedShares) * WAD / (prevDepositShares + addedShares) * WAD / slashingFactor
⋮----
// Step 1: Calculate Numerator
⋮----
// Step 2: Compute currentShares + addedShares
⋮----
// Step 3: Calculate newDepositScalingFactor
/// forgefmt: disable-next-item
⋮----
// Avoid potential underflow.
⋮----
/// @dev Reset the staker's DSF for a strategy by setting it to 0. This is the same
/// as setting it to WAD (see the `scalingFactor` getter above).
⋮----
/// A DSF is reset when a staker reduces their deposit shares to 0, either by queueing
/// a withdrawal, or undelegating from their operator. This ensures that subsequent
/// delegations/deposits do not use a stale DSF (e.g. from a prior operator).
function reset(
⋮----
// CONVERSION
⋮----
function calcWithdrawable(
⋮----
function calcDepositShares(
⋮----
/// @notice Calculates the amount of shares that should be slashed given the previous and new magnitudes.
/// @param operatorShares The amount of shares to slash.
/// @param prevMaxMagnitude The previous magnitude of the operator.
/// @param newMaxMagnitude The new magnitude of the operator.
/// @return The amount of shares that should be slashed.
/// @dev This function will revert with a divide by zero error if the previous magnitude is 0.
function calcSlashedAmount(
⋮----
// round up mulDiv so we don't overslash
````

## File: src/contracts/libraries/Snapshots.sol
````
// SPDX-License-Identifier: MIT
⋮----
import "@openzeppelin-upgrades/contracts/utils/math/MathUpgradeable.sol";
⋮----
import "./SlashingLib.sol";
⋮----
/// @title Library for handling snapshots as part of allocating and slashing.
/// @notice This library is using OpenZeppelin's CheckpointsUpgradeable library (v4.9.0)
/// and removes structs and functions that are unessential.
/// Interfaces and structs are renamed for clarity and usage.
/// Some additional functions have also been added for convenience.
/// @dev This library defines the `DefaultWadHistory` and `DefaultZeroHistory` struct, for snapshotting values as they change at different points in
/// time, and later looking up past values by block number. See {Votes} as an example.
///
/// To create a history of snapshots define a variable type `Snapshots.DefaultWadHistory` or `Snapshots.DefaultZeroHistory` in your contract,
/// and store a new snapshot for the current transaction block using the {push} function. If there is no history yet, the value is either WAD or 0,
/// depending on the type of History struct used. This is implemented because for the AllocationManager we want the
/// the default value to be WAD(1e18) but when used in the DelegationManager we want the default value to be 0.
⋮----
/// _Available since v4.5._
⋮----
/// @dev Pushes a (`key`, `value`) pair into a DefaultWadHistory so that it is stored as the snapshot.
function push(
⋮----
/// @dev Pushes a (`key`, `value`) pair into a DefaultZeroHistory so that it is stored as the snapshot.
/// `value` is cast to uint224. Responsibility for the safety of this operation falls outside of this library.
⋮----
/// @dev Return default value of WAD if there are no snapshots for DefaultWadHistory.
/// This is used for looking up maxMagnitudes in the AllocationManager.
function upperLookup(
⋮----
/// @dev Return default value of 0 if there are no snapshots for DefaultZeroHistory.
/// This is used for looking up cumulative scaled shares in the DelegationManager.
⋮----
/// @dev Returns the value in the most recent snapshot, or WAD if there are no snapshots.
function latest(
⋮----
/// @dev Returns the value in the most recent snapshot, or 0 if there are no snapshots.
⋮----
/// @dev Returns the number of snapshots.
function length(
⋮----
/// @dev Pushes a (`key`, `value`) pair into an ordered list of snapshots, either by inserting a new snapshot,
/// or by updating the last one.
function _insert(
⋮----
// Validate that inserted keys are always >= the previous key
⋮----
// Update existing snapshot if `key` matches
⋮----
// `key` was not in the list; push as a new entry
⋮----
/// @dev Returns the value in the last (most recent) snapshot with key lower or equal than the search key, or `defaultValue` if there is none.
function _upperLookup(
⋮----
/// @dev Returns the value in the most recent snapshot, or `defaultValue` if there are no snapshots.
function _latest(
⋮----
/// @dev Return the index of the last (most recent) snapshot with key lower or equal than the search key, or `high` if there is none.
/// `low` and `high` define a section where to do the search, with inclusive `low` and exclusive `high`.
⋮----
/// WARNING: `high` should not be greater than the array's length.
function _upperBinaryLookup(
⋮----
/// @dev Access an element of the array without performing bounds check. The position is assumed to be within bounds.
function _unsafeAccess(
````

## File: src/contracts/mixins/Deprecated_OwnableUpgradeable.sol
````
// SPDX-License-Identifier: BUSL-1.1
⋮----
import "@openzeppelin-upgrades/contracts/proxy/utils/Initializable.sol";
import "@openzeppelin-upgrades/contracts/utils/ContextUpgradeable.sol";
⋮----
/// @title Deprecated_OwnableUpgradeable
/// @dev This contract can be inherited in place of OpenZeppelin's OwnableUpgradeable
/// to maintain the same storage layout while effectively removing the Ownable functionality.
///
/// This is useful in cases where a contract previously used OwnableUpgradeable but no longer
/// needs ownership functionality, yet must maintain the same storage slots to ensure
/// compatibility with existing deployed proxies.
⋮----
/// The contract preserves the same storage layout as OwnableUpgradeable:
/// - It keeps the `_owner` storage variable in the same slot
/// - It maintains the same storage gap for future upgrades
abstract contract Deprecated_OwnableUpgradeable is Initializable, ContextUpgradeable {
⋮----
/// @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
````

## File: src/contracts/mixins/LeafCalculatorMixin.sol
````
// SPDX-License-Identifier: BUSL-1.1
⋮----
import {IOperatorTableCalculatorTypes} from "../interfaces/IOperatorTableCalculator.sol";
⋮----
/// @title LeafCalculatorMixin
/// @notice Reusable mixin for calculating operator info and operator table leaf hashes
/// @dev Provides standardized leaf calculation functions for use across multiple contracts and repositories.
///      This mixin centralizes the leaf hashing logic to ensure consistency across the EigenLayer ecosystem
///      and maintains proper cryptographic security through salt-based domain separation.
abstract contract LeafCalculatorMixin {
/// @dev Salt for operator info leaf hash calculation
/// @dev The salt is used to prevent against second preimage attacks: attacks where an
/// attacker can create a partial proof using an internal node rather than a leaf to
/// validate a proof. The salt ensures that leaves cannot be concatenated together to
/// form a valid proof, as well as reducing the likelihood of an internal node matching
/// the salt prefix.
/// @dev Value derived from keccak256("OPERATOR_INFO_LEAF_SALT") = 0x75...
/// This ensures collision resistance and semantic meaning.
⋮----
/// @dev Salt for operator table leaf hash calculation
⋮----
/// @dev Value derived from keccak256("OPERATOR_TABLE_LEAF_SALT") = 0x8e...
⋮----
/// @notice Calculate the leaf hash for an operator info
/// @param operatorInfo The BN254 operator info struct containing the operator's public key and stake weights
/// @return The leaf hash (keccak256 of salt and encoded operator info)
⋮----
///
/// This is a standard "domain separation" technique in Merkle tree implementations
/// to ensure leaf nodes and internal nodes can never be confused with each other.
/// See Section 2.1 of <https://www.rfc-editor.org/rfc/rfc9162#name-merkle-trees> for more.
⋮----
/// Uses abi.encodePacked for the salt and abi.encode for the struct to handle complex types
/// (structs with dynamic arrays) while maintaining gas efficiency where possible.
function calculateOperatorInfoLeaf(
⋮----
/// @notice Calculate the leaf hash for an operator table
/// @param operatorTableBytes The encoded operator table as bytes containing operator set data
/// @return The leaf hash (keccak256 of salt and operator table bytes)
⋮----
/// Uses abi.encodePacked for both salt and bytes for optimal gas efficiency since both
/// are simple byte arrays without complex nested structures.
function calculateOperatorTableLeaf(
````

## File: src/contracts/mixins/PermissionControllerMixin.sol
````
// SPDX-License-Identifier: BUSL-1.1
⋮----
import "../interfaces/IPermissionController.sol";
⋮----
abstract contract PermissionControllerMixin {
/// @dev Thrown when the caller is not allowed to call a function on behalf of an account.
⋮----
/// @notice Pointer to the permission controller contract.
⋮----
/// @notice Modifier that checks if the caller can call on behalf of an account, reverts if not permitted.
/// @param account The account on whose behalf the function is being called.
/// @dev Use this modifier when the entire function requires authorization.
/// @dev This is the most common pattern - prefer this over `_checkCanCall` when possible.
modifier checkCanCall(
⋮----
/// @notice Checks if the caller is permitted to call the current function on behalf of the given account.
⋮----
/// @dev Reverts with `InvalidPermissions()` if the caller is not permitted.
/// @dev Use this function instead of the modifier when:
///      - You need to avoid "stack too deep" errors (e.g., when combining multiple modifiers)
///      - You need more control over when the check occurs in your function logic
function _checkCanCall(
⋮----
/// @return allowed True if the caller is permitted, false otherwise.
/// @dev Unlike `_checkCanCall`, this function returns a boolean instead of reverting.
/// @dev Use this function when you need conditional logic based on permissions, such as:
///      - OR conditions: `require(_canCall(operator) || _canCall(avs), InvalidCaller());`
///      - If-else branches: `if (_canCall(account)) { ... } else { ... }`
///      - Multiple authorization paths in the same function
/// @dev This function queries the permissionController to determine if msg.sender is authorized
///      to call the current function (identified by msg.sig) on behalf of `account`.
function _canCall(
````

## File: src/contracts/mixins/SemVerMixin.sol
````
// SPDX-License-Identifier: BUSL-1.1
⋮----
import "../interfaces/ISemVerMixin.sol";
import "@openzeppelin-upgrades/contracts/utils/ShortStringsUpgradeable.sol";
⋮----
/// @title SemVerMixin
/// @notice A mixin contract that provides semantic versioning functionality.
/// @dev Follows SemVer 2.0.0 specification (https://semver.org/).
abstract contract SemVerMixin is ISemVerMixin {
⋮----
/// @notice The semantic version string for this contract, stored as a ShortString for gas efficiency.
⋮----
/// @notice Initializes the contract with a semantic version string.
/// @param _version The SemVer-formatted version string (e.g., "1.2.3")
/// @dev Version should follow SemVer 2.0.0 format: MAJOR.MINOR.PATCH
⋮----
/// @inheritdoc ISemVerMixin
function version() public view virtual returns (string memory) {
⋮----
/// @notice Returns the major version of the contract.
/// @dev Supports single digit major versions (e.g., "1" for version "1.2.3")
/// @return The major version string (e.g., "1" for version "1.2.3")
function _majorVersion() internal view returns (string memory) {
````

## File: src/contracts/mixins/SignatureUtilsMixin.sol
````
// SPDX-License-Identifier: BUSL-1.1
⋮----
import "@openzeppelin-upgrades/contracts/utils/ShortStringsUpgradeable.sol";
import "@openzeppelin-upgrades/contracts/utils/cryptography/SignatureCheckerUpgradeable.sol";
⋮----
import "../interfaces/ISignatureUtilsMixin.sol";
import "./SemVerMixin.sol";
⋮----
/// @dev The EIP-712 domain type hash used for computing the domain separator
///      See https://eips.ethereum.org/EIPS/eip-712#definition-of-domainseparator
⋮----
/// @title SignatureUtilsMixin
/// @notice A mixin contract that provides utilities for validating signatures according to EIP-712 and EIP-1271 standards.
/// @dev The domain name is hardcoded to "EigenLayer". This contract implements signature validation functionality that can be
///      inherited by other contracts. The domain separator uses the major version (e.g., "v1") to maintain EIP-712
///      signature compatibility across minor and patch version updates.
abstract contract SignatureUtilsMixin is ISignatureUtilsMixin, SemVerMixin {
⋮----
/// @notice Initializes the contract with a semantic version string.
/// @param _version The SemVer-formatted version string (e.g., "1.1.1") to use for this contract's domain separator.
/// @dev Version should follow SemVer 2.0.0 format with 'v' prefix: vMAJOR.MINOR.PATCH.
///      Only the major version component is used in the domain separator to maintain signature compatibility
///      across minor and patch version updates.
⋮----
/// EXTERNAL FUNCTIONS ///
⋮----
/// @inheritdoc ISignatureUtilsMixin
function domainSeparator() public view virtual returns (bytes32) {
// forgefmt: disable-next-item
⋮----
/// INTERNAL HELPERS ///
⋮----
/// @notice Creates a digest that can be signed using EIP-712.
/// @dev Prepends the EIP-712 prefix ("\x19\x01") and domain separator to the input hash.
///      This follows the EIP-712 specification for creating structured data hashes.
///      See https://eips.ethereum.org/EIPS/eip-712#specification.
/// @param hash The hash of the typed data to be signed.
/// @return The complete digest that should be signed according to EIP-712.
function _calculateSignableDigest(
⋮----
/// @notice Validates a signature against a signer and digest, with an expiry timestamp.
/// @dev Reverts if the signature is invalid or expired. Uses EIP-1271 for smart contract signers.
///      For EOA signers, validates ECDSA signatures directly.
///      For contract signers, calls isValidSignature according to EIP-1271.
///      See https://eips.ethereum.org/EIPS/eip-1271#specification.
/// @param signer The address that should have signed the digest.
/// @param signableDigest The digest that was signed, created via _calculateSignableDigest.
/// @param signature The signature bytes to validate.
/// @param expiry The timestamp after which the signature is no longer valid.
function _checkIsValidSignatureNow(
⋮----
// First, check if the signature has expired by comparing the expiry timestamp
// against the current block timestamp.
⋮----
// Next, verify that the signature is valid for the given signer and digest.
// For EOA signers, this performs standard ECDSA signature verification.
// For contract signers, this calls the EIP-1271 isValidSignature method.
````

## File: src/contracts/mixins/SplitContractMixin.sol
````
// SPDX-License-Identifier: BUSL-1.1
⋮----
abstract contract SplitContractMixin {
/// @notice The address of the second half of the contract.
⋮----
/// @dev Delegates the current call to `implementation`.
///
/// This function does not return to its internal call site, it will return directly to the external caller.
⋮----
/// Copied from OpenZeppelin Contracts v4.9.0 (proxy/Proxy.sol).
function _delegate(
⋮----
// Copy msg.data. We take full control of memory in this inline assembly
// block because it will not return to Solidity code. We overwrite the
// Solidity scratch pad at memory position 0.
⋮----
// Call the implementation.
// out and outsize are 0 because we don't know the size yet.
⋮----
// Copy the returned data.
⋮----
// delegatecall returns 0 on error.
⋮----
/// @dev Performs a delegate call to `implementation` in the context of a view function.
⋮----
/// This function typecasts the non-view `_delegate` function to a view function in order to
/// allow its invocation from a view context. This is required because the EVM itself does not
/// enforce view/pure mutability, and using inline assembly, it is possible to cast a function
/// pointer to a view (read-only) signature. This pattern is sometimes used for readonly proxies,
/// but it should be used cautiously since any state-modifying logic in the underlying delegate
/// violates the spirit of a view call.
⋮----
/// @param implementation The address to which the call should be delegated.
function _delegateView(
⋮----
/// @solidity memory-safe-assembly
````

## File: src/contracts/multichain/BN254CertificateVerifier.sol
````
// SPDX-License-Identifier: BUSL-1.1
⋮----
import "@openzeppelin-upgrades/contracts/proxy/utils/Initializable.sol";
⋮----
import "../libraries/BN254.sol";
import "../libraries/BN254SignatureVerifier.sol";
import "../libraries/Merkle.sol";
import "../libraries/OperatorSetLib.sol";
import "../mixins/LeafCalculatorMixin.sol";
import "./BN254CertificateVerifierStorage.sol";
⋮----
/// @title BN254CertificateVerifier
/// @notice Singleton verifier for BN254 certificates across multiple operator sets
/// @dev This contract uses BN254 curves for signature verification and
///      caches operator information for efficient verification
contract BN254CertificateVerifier is Initializable, BN254CertificateVerifierStorage, LeafCalculatorMixin {
⋮----
/// @notice Struct to hold verification context and reduce stack depth
⋮----
/// @notice Restricts access to the operator table updater
modifier onlyTableUpdater() {
⋮----
/// @notice Constructor for the certificate verifier
/// @dev Disables initializers to prevent implementation initialization
/// @param _operatorTableUpdater Address authorized to update operator tables
⋮----
///
///                         EXTERNAL FUNCTIONS
⋮----
///@inheritdoc IBN254CertificateVerifier
function updateOperatorTable(
⋮----
// Validate that the new timestamp is greater than the latest reference timestamp
⋮----
// Store the operator set info
⋮----
function verifyCertificate(
⋮----
function verifyCertificateProportion(
⋮----
// Calculate threshold as proportion of total signed stake weight
// totalStakeProportionThresholds is in basis points (e.g. 6600 = 66%)
⋮----
function verifyCertificateNominal(
⋮----
///                         INTERNAL FUNCTIONS
⋮----
/// @notice Internal function to verify a certificate
/// @param operatorSet The operator set the certificate is for
/// @param cert The certificate to verify
/// @return totalSignedStakeWeights The amount of stake that signed the certificate for each stake type
function _verifyCertificate(
⋮----
// Initialize signed stakes with total stake weights
⋮----
/// @notice Validates certificate timestamp against staleness requirements
/// @param operatorSetKey The operator set key
/// @param referenceTimestamp The reference timestamp to validate
function _validateCertificateTimestamp(
⋮----
// Assert that the certificate is not stale
⋮----
// Assert that the reference timestamp has been set
⋮----
// Assert that the root that corresponds to the reference timestamp is not disabled
⋮----
/// @notice Processes non-signer witnesses and returns aggregate non-signer public key
/// @param ctx The verification context
/// @param cert The certificate being verified
/// @return nonSignerApk The aggregate public key of non-signers
function _processNonSigners(
⋮----
// Enforce strictly increasing order of non-signer operator indices
⋮----
// Subtract non-signer stakes from total signed stakes
⋮----
/// @notice Gets operator info from cache or verifies and caches it
⋮----
/// @param referenceTimestamp The reference timestamp
/// @param witness The operator info witness containing proof data
/// @return operatorInfo The verified operator information
function _getOrCacheNonsignerOperatorInfo(
⋮----
// Check if operator info is cached using pubkey existence (weights can be 0)
⋮----
/// @notice Verifies the BLS signature
⋮----
/// @param cert The certificate containing the signature to verify
function _verifySignature(
⋮----
// Calculate signer aggregate public key by subtracting non-signers from total
⋮----
// Compute EIP-712 digest that binds referenceTimestamp and messageHash
⋮----
/// @notice Verifies a merkle proof for an operator info
⋮----
/// @param operatorIndex The index of the operator
/// @param operatorInfo The operator info
/// @param proof The merkle proof as bytes
/// @return verified Whether the proof is valid
function _verifyOperatorInfoMerkleProof(
⋮----
///                         VIEW FUNCTIONS
⋮----
///@inheritdoc IBaseCertificateVerifier
function getOperatorSetOwner(
⋮----
function maxOperatorTableStaleness(
⋮----
function latestReferenceTimestamp(
⋮----
function isReferenceTimestampSet(
⋮----
function getTotalStakeWeights(
⋮----
/// @inheritdoc IBaseCertificateVerifier
function getOperatorCount(
⋮----
function trySignatureVerification(
⋮----
true, // use gas limit
⋮----
function getNonsignerOperatorInfo(
⋮----
function isNonsignerCached(
⋮----
function getOperatorSetInfo(
⋮----
/// @inheritdoc IBN254CertificateVerifier
function calculateCertificateDigest(
````

## File: src/contracts/multichain/BN254CertificateVerifierStorage.sol
````
// SPDX-License-Identifier: BUSL-1.1
⋮----
import "../interfaces/IOperatorTableUpdater.sol";
import "../interfaces/IBN254CertificateVerifier.sol";
import "../interfaces/IBaseCertificateVerifier.sol";
⋮----
abstract contract BN254CertificateVerifierStorage is IBN254CertificateVerifier {
// Constants
⋮----
/// @dev EIP-712 type hash for certificate verification
⋮----
/// @dev Gas limit for pairing operations to prevent DoS attacks
⋮----
/// @dev Basis point unit denominator for division
⋮----
// OPERATOR_INFO_LEAF_SALT is now inherited from LeafCalculatorMixin
⋮----
// Immutables
⋮----
/// @dev The address that can update operator tables
⋮----
// Mutatables
⋮----
/// @dev Mapping from operatorSet key to owner address
⋮----
/// @dev Mapping from operatorSet key to maximum staleness period
⋮----
/// @dev Mapping from operatorSet key to latest reference timestamp
⋮----
/// @dev Mapping from operatorSet key to reference timestamp to operator set info
⋮----
/// @dev Mapping from operatorSet key to reference timestamp to operator index to operator info
/// This is used to cache operator info that has been proven against a tree root
⋮----
/// @dev Mapping from operatorSet key to reference timestamp to whether it has been updated
⋮----
// Construction
⋮----
/// @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
````

## File: src/contracts/multichain/CrossChainRegistry.sol
````
// SPDX-License-Identifier: BUSL-1.1
⋮----
import "@openzeppelin-upgrades/contracts/proxy/utils/Initializable.sol";
import "@openzeppelin-upgrades/contracts/access/OwnableUpgradeable.sol";
import "../mixins/PermissionControllerMixin.sol";
import "../permissions/Pausable.sol";
import "../interfaces/IKeyRegistrar.sol";
import "./CrossChainRegistryStorage.sol";
⋮----
/// @title CrossChainRegistry
/// @author Layr Labs, Inc.
/// @notice Implementation contract for managing cross-chain operator set configurations and generation reservations
/// @dev Manages operator table calculations, transport destinations, and operator set configurations for cross-chain operations
contract CrossChainRegistry is
⋮----
///
///                         MODIFIERS
⋮----
/// @dev Validates that the operator set exists in the AllocationManager
/// @param operatorSet The operator set to validate
modifier isValidOperatorSet(
⋮----
modifier checkHasActiveGenerationReservation(
⋮----
///                         INITIALIZING FUNCTIONS
⋮----
/// @dev Initializes the CrossChainRegistry with immutable dependencies
/// @param _allocationManager The allocation manager for operator set validation
/// @param _keyRegistrar The key registrar for operator set curve type validation
/// @param _permissionController The permission controller for access control
/// @param _pauserRegistry The pauser registry for pause functionality
⋮----
/// @notice Initializes the contract with the initial paused status and owner
/// @param initialOwner The initial owner of the contract
/// @param initialTableUpdateCadence The initial table update cadence
/// @param initialPausedStatus The initial paused status bitmap
function initialize(
⋮----
///                         EXTERNAL FUNCTIONS
⋮----
/// @inheritdoc ICrossChainRegistry
function createGenerationReservation(
⋮----
// Validate the the KeyType has been set in the KeyRegistrar for the OperatorSet
⋮----
// Add to active generation reservations
⋮----
// Set the operator table calculator
⋮----
// Set the operator set config
⋮----
function removeGenerationReservation(
⋮----
// Clear all storage for the operator set
// 1. Remove the operator table calculator
⋮----
// 2. Remove the operator set config
⋮----
// 3. Remove from active generation reservations
⋮----
function setOperatorTableCalculator(
⋮----
function setOperatorSetConfig(
⋮----
function addChainIDsToWhitelist(
⋮----
// Validate chainID
⋮----
// Add to whitelist
⋮----
function removeChainIDsFromWhitelist(
⋮----
// Remove from whitelist
⋮----
function setTableUpdateCadence(
⋮----
///                         INTERNAL FUNCTIONS
⋮----
/// @dev Internal function to set the operator table calculator for an operator set
/// @param operatorSet The operator set to set the calculator for
/// @param operatorTableCalculator The operator table calculator contract
function _setOperatorTableCalculator(
⋮----
/// @dev Internal function to set the operator set config for an operator set
/// @param operatorSet The operator set to set the config for
/// @param config The operator set config
/// @dev The 0 staleness period is special case and is allowed, since it allows for certificates to ALWAYS be valid
function _setOperatorSetConfig(
⋮----
/// @dev Internal function to set the table update cadence
/// @param tableUpdateCadence the table update cadence
/// @dev The table update cadence cannot be 0 as that is special-cased to allow for certificates to ALWAYS be valid
function _setTableUpdateCadence(
⋮----
///                         VIEW FUNCTIONS
⋮----
function getActiveGenerationReservations() external view returns (OperatorSet[] memory) {
⋮----
function hasActiveGenerationReservation(
⋮----
function getActiveGenerationReservationsByRange(
⋮----
function getOperatorTableCalculator(
⋮----
function getOperatorSetConfig(
⋮----
function calculateOperatorTableBytes(
⋮----
function getSupportedChains() external view returns (uint256[] memory, address[] memory) {
⋮----
function getTableUpdateCadence() external view returns (uint32) {
⋮----
function getActiveGenerationReservationCount() external view returns (uint256) {
````

## File: src/contracts/multichain/CrossChainRegistryStorage.sol
````
// SPDX-License-Identifier: BUSL-1.1
⋮----
import "@openzeppelin/contracts/utils/structs/EnumerableSet.sol";
import "@openzeppelin/contracts/utils/structs/EnumerableMap.sol";
import "../interfaces/ICrossChainRegistry.sol";
import "../interfaces/IOperatorTableCalculator.sol";
import "../interfaces/IAllocationManager.sol";
import "../interfaces/IKeyRegistrar.sol";
import "../libraries/OperatorSetLib.sol";
⋮----
/// @title CrossChainRegistryStorage
/// @author Layr Labs, Inc.
/// @notice Storage contract for the CrossChainRegistry, containing all storage variables and immutables
/// @dev This abstract contract is designed to be inherited by the CrossChainRegistry implementation
abstract contract CrossChainRegistryStorage is ICrossChainRegistry {
⋮----
// Constants
⋮----
/// @dev Index for flag that pauses generation reservations when set
⋮----
/// @dev Index for flag that pauses operator table calculator modifications when set
⋮----
/// @dev Index for flag that pauses operator set config modifications when set
⋮----
/// @dev Index for flag that pauses chain whitelist modifications when set
⋮----
// Immutables
⋮----
/// @notice The AllocationManager contract for EigenLayer
⋮----
/// @notice The KeyRegistrar contract for EigenLayer
⋮----
// Mutatables
⋮----
/// GENERATION RESERVATIONS
⋮----
/// @notice Mapping of generation reservations for operator sets
⋮----
/// @dev Mapping from operator set key to operator table calculator for active reservations
⋮----
/// @dev Mapping from operator set key to operator set configuration
⋮----
/// CHAIN WHITELISTING
⋮----
/// @dev Map of whitelisted chain IDs to operator table updaters
⋮----
/// @notice Table update cadence for all chains
⋮----
// Construction
⋮----
/// @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
````

## File: src/contracts/multichain/ECDSACertificateVerifier.sol
````
// SPDX-License-Identifier: BUSL-1.1
⋮----
import "@openzeppelin-upgrades/contracts/proxy/utils/Initializable.sol";
import "@openzeppelin/contracts/utils/cryptography/ECDSA.sol";
⋮----
import {OperatorSet} from "../libraries/OperatorSetLib.sol";
import "../mixins/SignatureUtilsMixin.sol";
import "./ECDSACertificateVerifierStorage.sol";
⋮----
/// @title ECDSACertificateVerifier
/// @notice Verifies ECDSA certificates across multiple operator sets
/// @dev Implements ECDSA signature verification with operator information caching
contract ECDSACertificateVerifier is Initializable, ECDSACertificateVerifierStorage, SignatureUtilsMixin {
⋮----
/// @notice Restricts access to the operator table updater
modifier onlyTableUpdater() {
⋮----
/// @notice Constructor for the certificate verifier
/// @dev Disables initializers to prevent implementation initialization
/// @param _operatorTableUpdater Address authorized to update operator tables
/// @param _version The version string for the SignatureUtilsMixin
⋮----
///
///                         EXTERNAL FUNCTIONS
⋮----
///@inheritdoc IECDSACertificateVerifier
function updateOperatorTable(
⋮----
// Validate that the new timestamp is greater than the latest reference timestamp
⋮----
// Store the number of operators
⋮----
// Store each operator info in the indexed mapping
⋮----
///                         INTERNAL FUNCTIONS
⋮----
/// @notice Internal function to verify a certificate
/// @param cert The certificate to verify
/// @return totalSignedStakeWeights The total amount of stake that signed the certificate for each stake type
/// @return signers The addresses that signed the certificate
function _verifyECDSACertificate(
⋮----
// Assert that reference timestamp is not stale
⋮----
// Assert that the reference timestamp exists
⋮----
// Assert that the root that corresponds to the reference timestamp is not disabled
⋮----
// Compute the EIP-712 digest for signature recovery
⋮----
// Parse the signatures
⋮----
// Verify that signers are operators and add their weights to the signed stakes
⋮----
/// @notice Parse signatures from the concatenated signature bytes
/// @param signableDigest The signable digest that was signed
/// @param signatures The concatenated signatures
/// @return signers Array of addresses that signed the message
/// @dev Signatures must be ordered by signer address (ascending)
/// @dev This does not support smart contract based signatures for multichain
function _parseSignatures(
⋮----
// Each ECDSA signature is 65 bytes: r (32 bytes) + s (32 bytes) + v (1 byte)
⋮----
// Recover the signer
⋮----
// Check that signatures are ordered by signer address
⋮----
/// @notice Process the signers and add their weights to the signed stakes
/// @param operatorSetKey The key of the operator set
/// @param referenceTimestamp The reference timestamp of the certificate
/// @param signers The signers of the certificate
/// @param numStakeTypes The number of stake types
/// @return totalSignedStakeWeights The total stake weight that has been signed for each stake type
function _processSigners(
⋮----
// Process each recovered signer
⋮----
// Check if this signer is an operator
⋮----
// If not an operator, the certificate is invalid
⋮----
// Add this operator's weights to the signed stakes
⋮----
///                         VIEW FUNCTIONS
⋮----
///@inheritdoc IBaseCertificateVerifier
function getOperatorSetOwner(
⋮----
function maxOperatorTableStaleness(
⋮----
function latestReferenceTimestamp(
⋮----
function isReferenceTimestampSet(
⋮----
/// @inheritdoc IBaseCertificateVerifier
/// @dev This function requires the reference timestamp to be set
function getTotalStakeWeights(
⋮----
// All weights are expected to be same length, so 0 index is used
⋮----
function getOperatorCount(
⋮----
function verifyCertificate(
⋮----
function verifyCertificateProportion(
⋮----
function verifyCertificateNominal(
⋮----
/// @inheritdoc IECDSACertificateVerifier
function getOperatorInfos(
⋮----
function getOperatorInfo(
⋮----
function domainSeparator() public view override(IECDSACertificateVerifier, SignatureUtilsMixin) returns (bytes32) {
⋮----
function calculateCertificateDigestBytes(
⋮----
function calculateCertificateDigest(
````

## File: src/contracts/multichain/ECDSACertificateVerifierStorage.sol
````
// SPDX-License-Identifier: BUSL-1.1
⋮----
import "../interfaces/IOperatorTableUpdater.sol";
import "../interfaces/IECDSACertificateVerifier.sol";
import "../interfaces/IBaseCertificateVerifier.sol";
⋮----
abstract contract ECDSACertificateVerifierStorage is IECDSACertificateVerifier {
// Constants
⋮----
/// @dev Basis point unit denominator for division
⋮----
/// @dev EIP-712 type hash for certificate verification
⋮----
/// @dev The EIP-712 domain type hash used for computing the domain separator without chainId
⋮----
// Immutables
⋮----
/// @dev The address that can update operator tables
⋮----
// Mutatables
⋮----
/// @dev Mapping from operatorSet key to owner address
⋮----
/// @dev Mapping from operatorSet key to maximum staleness period
⋮----
/// @dev Mapping from operatorSet key to latest reference timestamp
⋮----
/// @dev Mapping from referenceTimestamp to the number of operators
⋮----
/// @dev Mapping from operatorSetKey to referenceTimestamp to operatorInfos
⋮----
/// @dev Mapping from operatorSetKey to referenceTimestamp to whether it has been updated
⋮----
// Construction
⋮----
/// @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
````

## File: src/contracts/multichain/OperatorTableUpdater.sol
````
// SPDX-License-Identifier: BUSL-1.1
⋮----
import "@openzeppelin-upgrades/contracts/proxy/utils/Initializable.sol";
import "@openzeppelin-upgrades/contracts/access/OwnableUpgradeable.sol";
import "@openzeppelin-upgrades/contracts/security/ReentrancyGuardUpgradeable.sol";
⋮----
import "../libraries/Merkle.sol";
import "../permissions/Pausable.sol";
import "../mixins/LeafCalculatorMixin.sol";
import "./OperatorTableUpdaterStorage.sol";
⋮----
contract OperatorTableUpdater is
⋮----
///
///                         INITIALIZING FUNCTIONS
⋮----
/// @notice Initializes the OperatorTableUpdater
/// @param _owner The owner of the OperatorTableUpdater
/// @param initialPausedStatus The initial paused status of the OperatorTableUpdater
/// @param _initialGenerator The operatorSet which certifies against global roots
/// @param _globalRootConfirmationThreshold The threshold, in bps, for a global root to be signed off on and updated
/// @param generatorInfo The operatorSetInfo for the Generator
/// @dev We also update the operator table for the Generator, to begin signing off on global roots
/// @dev We set the `_latestReferenceTimestamp` to the current timestamp, so that only *new* roots can be confirmed
function initialize(
⋮----
// Set the `operatorSetConfig` for the `Generator`
⋮----
// The generator's global table root is the `GENERATOR_GLOBAL_TABLE_ROOT`.
// The constant is used to enable the call to `confirmGlobalTableRoot` to pass since the `BN254CertificateVerifier` expects the `Generator` to have a valid root associated with it.
⋮----
// Set the `latestReferenceTimestamp` so that only *new* roots can be confirmed
⋮----
///                         ACTIONS
⋮----
/// @inheritdoc IOperatorTableUpdater
function confirmGlobalTableRoot(
⋮----
// Table roots can only be updated for current or past timestamps and after the latest reference timestamp
⋮----
// Verify certificate by using the stake proportion thresholds
⋮----
// Update the global table root & reference timestamps
⋮----
function updateOperatorTable(
⋮----
// Check that the `globalTableRoot` is not disabled
⋮----
// Check that the `operatorSet` is not the `Generator`
⋮----
// Silently return if the `referenceTimestamp` has already been updated for the `operatorSet`
// We do this to avoid race conditions with the offchain transport of the operator table
⋮----
// Check that the `referenceTimestamp` is greater than the latest reference timestamp
⋮----
// Check that the `globalTableRoot` matches the `referenceTimestamp`
⋮----
// Verify the operator table update
⋮----
// Update the operator table
⋮----
///                         SETTERS
⋮----
function setGlobalRootConfirmationThreshold(
⋮----
function disableRoot(
⋮----
// Check that the root already exists and is not disabled
⋮----
// Check that the root is not the generator's global table root
⋮----
function updateGenerator(
⋮----
///                         GETTERS
⋮----
function getGlobalTableRootByTimestamp(
⋮----
function getCurrentGlobalTableRoot() external view returns (bytes32) {
⋮----
function getGenerator() external view returns (OperatorSet memory) {
⋮----
function getCertificateVerifier(
⋮----
function getLatestReferenceTimestamp() external view returns (uint32) {
⋮----
function getLatestReferenceBlockNumber() external view returns (uint32) {
⋮----
function getReferenceBlockNumberByTimestamp(
⋮----
function getReferenceTimestampByBlockNumber(
⋮----
function getGlobalTableUpdateMessageHash(
⋮----
function getGeneratorReferenceTimestamp() external view returns (uint32) {
⋮----
function getGeneratorConfig() external view returns (OperatorSetConfig memory) {
⋮----
function isRootValid(
⋮----
function isRootValidByTimestamp(
⋮----
function getGlobalTableUpdateSignableDigest(
⋮----
///                         INTERNAL HELPERS
⋮----
/// @notice Verifies that the operator table update is valid by checking the `proof` against a `globalTableRoot`
/// @param globalTableRoot The global table root of the operator table update
/// @param operatorSetIndex The index of the operator set in the operator table
/// @param proof The proof of the operator table update
/// @param operatorSetLeafHash The leaf hash of the operator set
/// @dev Reverts if there does not exist a `globalTableRoot` for the given `referenceTimestamp`
function _verifyMerkleInclusion(
⋮----
// Verify inclusion of the operatorSet and operatorSetLeaf in the merkle tree
⋮----
/// @notice Sets the global root confirmation threshold
/// @param bps The threshold, in bps, for a global root to be signed off on and updated
function _setGlobalRootConfirmationThreshold(
⋮----
/// @notice Updates the `Generator` to a new operatorSet
/// @param generator The operatorSet which certifies against global roots
/// @param generatorInfo The operatorSetInfo for the generator
/// @dev We have a separate function for updating this operatorSet since it's not transported and updated
///      in the same way as the other operatorSets
/// @dev Only callable by the owner of the contract
/// @dev Uses GENERATOR_GLOBAL_TABLE_ROOT constant to break circular dependency for certificate verification
/// @dev We ensure that there are no collisions with other reference timestamps because we expect the generator to have an initial reference timestamp of 0
/// @dev The `_latestReferenceTimestamp` is not updated since this root is ONLY used for the `Generator`
/// @dev The `_referenceBlockNumber` and `_referenceTimestamps` mappings are not updated since they are only used for introspection for official operatorSets
function _updateGenerator(
⋮----
// Set the generator
⋮----
// Get the latest reference timestamp for the Generator
⋮----
// Update the operator table for the Generator
⋮----
/// @notice Gets the operator table info from a bytes array
/// @param operatorTable The bytes containing the operator table
/// @return operatorSet The operator set
/// @return curveType The curve type
/// @return operatorSetInfo The operator set info
/// @return operatorTableInfo The operator table info. This is encoded as a bytes array, and its value is dependent on the curve type, see `_getBN254OperatorInfo` and `_getECDSAOperatorInfo`
function _decodeOperatorTableBytes(
⋮----
/// @notice Gets the BN254 operator set info from a bytes array
/// @param BN254OperatorSetInfoBytes The bytes containing the operator set info
/// @return operatorSetInfo The BN254 operator set info
function _getBN254OperatorInfo(
⋮----
/// @notice Gets the ECDSA operator set info from a bytes array
/// @param ECDSAOperatorInfoBytes The bytes containing the operator table info
/// @return operatorSetInfo The ECDSA operator set info
function _getECDSAOperatorInfo(
````

## File: src/contracts/multichain/OperatorTableUpdaterStorage.sol
````
// SPDX-License-Identifier: BUSL-1.1
⋮----
import "../interfaces/IOperatorTableUpdater.sol";
import "../interfaces/IBN254CertificateVerifier.sol";
import "../interfaces/IECDSACertificateVerifier.sol";
⋮----
abstract contract OperatorTableUpdaterStorage is IOperatorTableUpdater {
// Constants
⋮----
/// @notice Index for flag that pauses calling `updateGlobalTableRoot`
⋮----
/// @notice Index for flag that pauses calling `updateOperatorTable`
⋮----
// OPERATOR_TABLE_LEAF_SALT is now inherited from LeafCalculatorMixin
⋮----
/// @notice The maximum BPS value
⋮----
/// @notice Dummy initial global table root to break circular dependency for certificate verification
⋮----
/// @notice The reference timestamp for the generator
⋮----
/// @notice The `maxStalenessPeriods` for the generator
/// @dev This is set to 0 to allow certificates to always be valid, regardless of the `referenceTimestamp`
⋮----
// Immutable Storage
⋮----
/// @notice The BN254 certificate verifier
⋮----
/// @notice The ECDSA certificate verifier
⋮----
// Mutable Storage
⋮----
/// @notice The threshold, in bps, for a global root to be signed off on and updated
⋮----
/// @notice The latest reference timestamp
⋮----
/// @notice The operatorSet which certifies against global roots
⋮----
/// @notice The global table roots by timestamp
⋮----
/// @notice Mapping from latest reference timestamp to reference block number
⋮----
/// @notice Mapping from reference block number to reference timestamp
⋮----
/// @notice Mapping from global table root to validity status
⋮----
/// @notice The operatorSetConfig for the generator
/// @dev The `maxStalenessPeriod` is set to `GENERATOR_MAX_STALENESS_PERIOD` to allow certificates to always be valid, regardless of the `referenceTimestamp`
/// @dev The `owner` is set to the address of the `OperatorTableUpdater`
⋮----
// Constructor
⋮----
/// @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
````

## File: src/contracts/permissions/KeyRegistrar.sol
````
// SPDX-License-Identifier: BUSL-1.1
⋮----
import "@openzeppelin/contracts/utils/cryptography/ECDSA.sol";
import "../libraries/BN254.sol";
import "../libraries/BN254SignatureVerifier.sol";
import "../mixins/PermissionControllerMixin.sol";
import "../mixins/SignatureUtilsMixin.sol";
import "../interfaces/IPermissionController.sol";
import "../interfaces/IAllocationManager.sol";
import "../interfaces/IKeyRegistrar.sol";
import "../libraries/OperatorSetLib.sol";
import "./KeyRegistrarStorage.sol";
⋮----
/// @title KeyRegistrar
/// @notice A core singleton contract that manages operator keys for different AVSs with global key uniqueness
/// @dev Provides registration and deregistration of keys with support for aggregate keys
///      Keys must be unique globally across all AVSs and operator sets
///      Operators call functions directly to manage their own keys
///      Aggregate keys are updated via callback from AVSRegistrar on registration and deregistration
contract KeyRegistrar is KeyRegistrarStorage, PermissionControllerMixin, SignatureUtilsMixin {
⋮----
// EIP-712 type hashes
⋮----
/// @dev Constructor for the KeyRegistrar contract
/// @param _permissionController The permission controller contract
/// @param _allocationManager The allocation manager contract
/// @param _version The version string for the contract
⋮----
/// @inheritdoc IKeyRegistrar
function configureOperatorSet(
⋮----
// Prevent overwriting existing configurations
⋮----
function registerKey(
⋮----
// Check if the operator is already registered to the operatorSet
⋮----
// Register key based on curve type - both now require signature verification
⋮----
function deregisterKey(
⋮----
// Operators can only deregister if they are not slashable for this operator set
⋮----
// Clear key info
⋮----
///
///                         INTERNAL FUNCTIONS
⋮----
/// @notice Validates and registers an ECDSA address with EIP-712 signature verification
/// @param operatorSet The operator set to register the key for
/// @param operator Address of the operator
/// @param keyData The ECDSA address encoded as bytes (20 bytes)
/// @param signature EIP-712 signature over the registration message
/// @dev Validates address format, verifies signature ownership, and ensures global uniqueness
function _registerECDSAKey(
⋮----
// Validate ECDSA address format
⋮----
// Decode address from bytes
⋮----
// Calculate key hash using the address
⋮----
// Check global uniqueness
⋮----
// Get the signable digest for the ECDSA key registration message
⋮----
// Store key data
⋮----
/// @notice Validates and registers a BN254 public key with proper signature verification
⋮----
/// @param keyData The BN254 public key bytes (G1 and G2 components)
/// @param signature Signature proving key ownership
/// @dev Validates keypair, verifies signature using hash-to-G1, and ensures global uniqueness
function _registerBN254Key(
⋮----
// Decode BN254 G1 and G2 points from the keyData bytes
⋮----
// Validate G1 point
⋮----
// Construct BN254 G2 point from coordinates
⋮----
// Create EIP-712 compliant message hash
⋮----
// Decode signature from bytes to G1 point
⋮----
// Verify signature
⋮----
// Calculate key hash and check global uniqueness
⋮----
/// @notice Internal helper to store key data and update global registry
/// @param operatorSet The operator set
/// @param operator The operator address
/// @param pubkey The public key data
/// @param keyHash The key hash
function _storeKeyData(
⋮----
// Mark the key hash as spent
⋮----
// Store the operator for the key hash
⋮----
/// @notice Internal helper to get key hash for pubkey data using consistent hashing
⋮----
/// @param curveType The curve type (ECDSA or BN254)
/// @return keyHash The key hash
function _getKeyHashForKeyData(
⋮----
///                         VIEW FUNCTIONS
⋮----
function isRegistered(
⋮----
function getOperatorSetCurveType(
⋮----
function getBN254Key(
⋮----
// Validate operator set curve type
⋮----
// Create default values for an empty key
⋮----
function getECDSAKey(
⋮----
return keyInfo.keyData; // Returns the 20-byte address as bytes
⋮----
function getECDSAAddress(
⋮----
function isKeyGloballyRegistered(
⋮----
function getKeyHash(
⋮----
function getOperatorFromSigningKey(
⋮----
// We opt to not use _getKeyHashForKeyData here because it expects the G1 and G2 key encoded together for BN254
⋮----
/// We cannot use _getKeyHashForKeyData here because it expects the G1 and G2 key encoded together
⋮----
function getECDSAKeyRegistrationMessageHash(
⋮----
function getBN254KeyRegistrationMessageHash(
⋮----
function encodeBN254KeyData(
````

## File: src/contracts/permissions/KeyRegistrarStorage.sol
````
// SPDX-License-Identifier: BUSL-1.1
⋮----
import "../interfaces/IAllocationManager.sol";
import "../interfaces/IKeyRegistrar.sol";
⋮----
abstract contract KeyRegistrarStorage is IKeyRegistrar {
// Immutables
⋮----
/// @dev Reference to the AllocationManager contract
⋮----
// Mutatables
⋮----
/// @dev Maps (operatorSetKey, operator) to their key info
⋮----
/// @dev Maps operatorSetKey to the key type
⋮----
/// @dev Global mapping of key hash to spent status - enforces global uniqueness
⋮----
/// @dev Mapping from (keyHash) to the operator
⋮----
// Construction
⋮----
/// @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
````

## File: src/contracts/permissions/Pausable.sol
````
// SPDX-License-Identifier: BUSL-1.1
⋮----
import "../interfaces/IPausable.sol";
⋮----
/// @title Adds pausability to a contract, with pausing & unpausing controlled by the `pauser` and `unpauser` of a PauserRegistry contract.
/// @author Layr Labs, Inc.
/// @notice Terms of Service: https://docs.eigenlayer.xyz/overview/terms-of-service
/// @notice Contracts that inherit from this contract may define their own `pause` and `unpause` (and/or related) functions.
/// These functions should be permissioned as "onlyPauser" which defers to a `PauserRegistry` for determining access control.
/// @dev Pausability is implemented using a uint256, which allows up to 256 different single bit-flags; each bit can potentially pause different functionality.
/// Inspiration for this was taken from the NearBridge design here https://etherscan.io/address/0x3FEFc5A4B1c02f21cBc8D3613643ba0635b9a873#code.
/// For the `pause` and `unpause` functions we've implemented, if you pause, you can only flip (any number of) switches to on/1 (aka "paused"), and if you unpause,
/// you can only flip (any number of) switches to off/0 (aka "paused").
/// If you want a pauseXYZ function that just flips a single bit / "pausing flag", it will:
/// 1) 'bit-wise and' (aka `&`) a flag with the current paused state (as a uint256)
/// 2) update the paused state to this new value
/// @dev We note as well that we have chosen to identify flags by their *bit index* as opposed to their numerical value, so, e.g. defining `DEPOSITS_PAUSED = 3`
/// indicates specifically that if the *third bit* of `_paused` is flipped -- i.e. it is a '1' -- then deposits should be paused
abstract contract Pausable is IPausable {
/// Constants
⋮----
/// @notice Address of the `PauserRegistry` contract that this contract defers to for determining access control (for pausing).
⋮----
/// Storage
⋮----
/// @dev Do not remove, deprecated storage.
⋮----
/// @dev Returns a bitmap representing the paused status of the contract.
⋮----
/// Modifiers
⋮----
/// @dev Thrown if the caller is not a valid pauser according to the pauser registry.
modifier onlyPauser() {
⋮----
/// @dev Thrown if the caller is not a valid unpauser according to the pauser registry.
modifier onlyUnpauser() {
⋮----
/// @dev Thrown if the contract is paused, i.e. if any of the bits in `_paused` is flipped to 1.
modifier whenNotPaused() {
⋮----
/// @dev Thrown if the `indexed`th bit of `_paused` is 1, i.e. if the `index`th pause switch is flipped.
modifier onlyWhenNotPaused(
⋮----
function _checkOnlyPauser() internal view {
⋮----
function _checkOnlyUnpauser() internal view {
⋮----
function _checkOnlyWhenNotPaused() internal view {
⋮----
function _checkOnlyWhenNotPaused(
⋮----
/// Construction
⋮----
/// @inheritdoc IPausable
function pause(
⋮----
// verify that the `newPausedStatus` does not *unflip* any bits (i.e. doesn't unpause anything, all 1 bits remain)
⋮----
function pauseAll() external onlyPauser {
⋮----
function unpause(
⋮----
// verify that the `newPausedStatus` does not *flip* any bits (i.e. doesn't pause anything, all 0 bits remain)
⋮----
function paused() public view virtual returns (uint256) {
⋮----
function paused(
⋮----
/// @dev Internal helper for setting the paused status, and emitting the corresponding event.
function _setPausedStatus(
⋮----
/// @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
````

## File: src/contracts/permissions/PauserRegistry.sol
````
// SPDX-License-Identifier: BUSL-1.1
⋮----
import "../interfaces/IPauserRegistry.sol";
⋮----
/// @title Defines pauser & unpauser roles + modifiers to be used elsewhere.
/// @author Layr Labs, Inc.
/// @notice Terms of Service: https://docs.eigenlayer.xyz/overview/terms-of-service
contract PauserRegistry is IPauserRegistry {
/// @notice Mapping of addresses to whether they hold the pauser role.
⋮----
/// @notice Unique address that holds the unpauser role. Capable of changing *both* the pauser and unpauser addresses.
⋮----
modifier onlyUnpauser() {
⋮----
/// @notice Sets new pauser - only callable by unpauser, as the unpauser is expected to be kept more secure, e.g. being a multisig with a higher threshold
/// @param newPauser Address to be added/removed as pauser
/// @param canPause Whether the address should be added or removed as pauser
function setIsPauser(
⋮----
/// @notice Sets new unpauser - only callable by unpauser, as the unpauser is expected to be kept more secure, e.g. being a multisig with a higher threshold
function setUnpauser(
⋮----
function _setIsPauser(
⋮----
function _setUnpauser(
````

## File: src/contracts/permissions/PermissionController.sol
````
// SPDX-License-Identifier: BUSL-1.1
⋮----
import "@openzeppelin-upgrades/contracts/proxy/utils/Initializable.sol";
import "./PermissionControllerStorage.sol";
⋮----
contract PermissionController is Initializable, PermissionControllerStorage {
⋮----
modifier onlyAdmin(
⋮----
///
///                         INITIALIZING FUNCTIONS
⋮----
///                         EXTERNAL FUNCTIONS
⋮----
/// @inheritdoc IPermissionController
function addPendingAdmin(
⋮----
// Revert if the admin is already set
⋮----
// Add the admin to the account's pending admins
// If the admin is already pending, the add will fail
⋮----
function removePendingAdmin(
⋮----
// Remove the admin from the account's pending admins
// Revert if the admin is not pending
⋮----
function acceptAdmin(
⋮----
// Remove the admin from the pending list
⋮----
// Add the admin to the account's admins
// Not wrapped in a require since it must be the case the admin is not one
⋮----
function removeAdmin(
⋮----
// Remove the admin from the account's admins
// If the admin is not set, the remove will fail
⋮----
function setAppointee(
⋮----
// Add the appointee to the account's permissions
⋮----
function removeAppointee(
⋮----
// Remove the appointee from the account's permissions
⋮----
///                         INTERNAL FUNCTIONS
⋮----
/// @dev Encodes the target and selector into a single bytes32 values
/// @dev Encoded Format: [160 bits target][32 bits selector][64 bits padding],
function _encodeTargetSelector(
⋮----
// Reserve 96 bits for the target
⋮----
// Reserve 32 bits for the selector
⋮----
// Combine the target and selector
⋮----
/// @dev Decodes the target and selector from a single bytes32 value
⋮----
function _decodeTargetSelector(
⋮----
// The target is in the upper 160 bits of the targetSelector
⋮----
// The selector is in the lower 32 bits after the padding is removed
⋮----
///                         VIEW FUNCTIONS
⋮----
function isAdmin(
⋮----
// If the account does not have an admin, the caller must be the account
⋮----
// If the account has an admin, the caller must be an admin
⋮----
function isPendingAdmin(
⋮----
function getAdmins(
⋮----
function getPendingAdmins(
⋮----
function canCall(
⋮----
function getAppointeePermissions(
⋮----
function getAppointees(
````

## File: src/contracts/permissions/PermissionControllerStorage.sol
````
// SPDX-License-Identifier: BUSL-1.1
⋮----
import "@openzeppelin/contracts/utils/structs/EnumerableSet.sol";
⋮----
import "../interfaces/IPermissionController.sol";
⋮----
abstract contract PermissionControllerStorage is IPermissionController {
⋮----
/// @notice The pending admins of the account
⋮----
/// @notice The admins of the account
⋮----
/// @notice Mapping from an appointee to the list of encoded target & selectors
⋮----
/// @notice Mapping from encoded target & selector to the list of appointees
⋮----
/// @notice Mapping from an account to its permission
⋮----
/// @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
````

## File: src/contracts/pods/EigenPod.sol
````
// SPDX-License-Identifier: BUSL-1.1
⋮----
import "@openzeppelin-upgrades/contracts/proxy/utils/Initializable.sol";
import "@openzeppelin-upgrades/contracts/security/ReentrancyGuardUpgradeable.sol";
import "@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol";
⋮----
import "../libraries/BeaconChainProofs.sol";
⋮----
import "../interfaces/IETHPOSDeposit.sol";
import "../interfaces/IEigenPodManager.sol";
import "../interfaces/IPausable.sol";
⋮----
import "./EigenPodPausingConstants.sol";
import "./EigenPodStorage.sol";
⋮----
/// @title The implementation contract used for restaking beacon chain ETH on EigenLayer
/// @author Layr Labs, Inc.
/// @notice Terms of Service: https://docs.eigenlayer.xyz/overview/terms-of-service
/// @notice This EigenPod Beacon Proxy implementation adheres to the current Deneb consensus specs
/// @dev Note that all beacon chain balances are stored as gwei within the beacon chain datastructures. We choose
///   to account balances in terms of gwei in the EigenPod contract and convert to wei when making calls to other contracts
contract EigenPod is Initializable, ReentrancyGuardUpgradeable, EigenPodPausingConstants, EigenPodStorage {
⋮----
///
///                            CONSTANTS / IMMUTABLES
⋮----
/// @notice The beacon chain stores balances in Gwei, rather than wei. This value is used to convert between the two
⋮----
/// @notice The address of the EIP-4788 beacon block root oracle
/// (See https://eips.ethereum.org/EIPS/eip-4788)
⋮----
/// @notice The address of the EIP-7002 withdrawal request predeploy
/// (See https://eips.ethereum.org/EIPS/eip-7002)
⋮----
/// @notice The address of the EIP-7251 consolidation request predeploy
/// (See https://eips.ethereum.org/EIPS/eip-7251)
⋮----
/// @notice The length of the EIP-4788 beacon block root ring buffer
⋮----
/// @notice The beacon chain deposit contract
⋮----
/// @notice The single EigenPodManager for EigenLayer
⋮----
///                                  MODIFIERS
⋮----
/// @notice Callable only by the EigenPodManager
modifier onlyEigenPodManager() {
⋮----
/// @notice Callable only by the pod's owner
modifier onlyEigenPodOwner() {
⋮----
/// @notice Callable only by the pod's owner or proof submitter
modifier onlyOwnerOrProofSubmitter() {
⋮----
/// @notice Based on 'Pausable' code, but uses the storage of the EigenPodManager instead of this contract. This construction
/// is necessary for enabling pausing all EigenPods at the same time (due to EigenPods being Beacon Proxies).
/// Modifier throws if the `indexed`th bit of `_paused` in the EigenPodManager is 1, i.e. if the `index`th pause switch is flipped.
modifier onlyWhenNotPaused(
⋮----
///                               CONSTRUCTOR / INIT
⋮----
/// @inheritdoc IEigenPod
function initialize(
⋮----
///                                 EXTERNAL METHODS
⋮----
/// @notice payable fallback function used to receive ETH sent directly to the pod
⋮----
function startCheckpoint(
⋮----
function verifyCheckpointProofs(
⋮----
// Verify `balanceContainerProof` against `beaconBlockRoot`
⋮----
// Process each checkpoint proof submitted
⋮----
// Validator must be in the ACTIVE state to be provable during a checkpoint.
// Validators become ACTIVE when initially proven via verifyWithdrawalCredentials
// Validators become WITHDRAWN when a checkpoint proof shows they have 0 balance
⋮----
// Ensure we aren't proving a validator twice for the same checkpoint. This will fail if:
// - validator submitted twice during this checkpoint
// - validator withdrawal credentials verified after checkpoint starts, then submitted
//   as a checkpoint proof
⋮----
// Process a checkpoint proof for a validator and update its balance.
//
// If the proof shows the validator has a balance of 0, they are marked `WITHDRAWN`.
// The assumption is that if this is the case, any withdrawn ETH was already in
// the pod when `startCheckpoint` was originally called.
⋮----
// Record the updated validator in state
⋮----
// Update the checkpoint and the total amount attributed to exited validators
⋮----
function verifyWithdrawalCredentials(
⋮----
// Calling this method using a `beaconTimestamp` <= `currentCheckpointTimestamp` would allow
// a newly-verified validator to be submitted to `verifyCheckpointProofs`, making progress
// on an existing checkpoint.
⋮----
// For sanity, we want to ensure that a newly-verified validator cannot be proven against state
// that has already been checkpointed. This check makes the state transitions easier to reason about.
⋮----
// Verify passed-in `beaconStateRoot` against the beacon block root
// forgefmt: disable-next-item
⋮----
// Update the EigenPodManager on this pod's new balance
⋮----
prevRestakedBalanceWei: 0, // only used for checkpoint balance updates
⋮----
function verifyStaleBalance(
⋮----
// Validator must be eligible for a staleness proof. Generally, this condition
// ensures that the staleness proof is newer than the last time we got an update
// on this validator.
⋮----
// Note: It is possible for `validatorInfo.lastCheckpointedAt` to be 0 if
// a validator's withdrawal credentials are verified when no checkpoint has
// ever been completed in this pod. Technically, this would mean that `beaconTimestamp`
// can be any valid EIP-4788 timestamp - because any nonzero value satisfies the
// require below.
⋮----
// However, in practice, if the only update we've seen from a validator is their
// `verifyWithdrawalCredentials` proof, any valid `verifyStaleBalance` proof is
// necessarily newer. This is because when a validator is initially slashed, their
// exit epoch is set. And because `verifyWithdrawalCredentials` rejects validators
// that have initiated exits, we know that if we're seeing a proof where the validator
// is slashed that it MUST be newer than the `verifyWithdrawalCredentials` proof
// (regardless of the relationship between `beaconTimestamp` and `lastCheckpointedAt`).
⋮----
// Validator must be checkpoint-able
⋮----
// Validator must be slashed on the beacon chain
⋮----
// Verify Validator container proof against `beaconStateRoot`
⋮----
// Validator verified to be stale - start a checkpoint
⋮----
function requestConsolidation(
⋮----
// Ensure target has verified withdrawal credentials pointed at this pod
⋮----
// Call the predeploy
⋮----
// Emit event depending on whether this is a switch to 0x02, or a regular consolidation
⋮----
// Refund remainder of msg.value
⋮----
function requestWithdrawal(
⋮----
// Ensure validator has verified withdrawal credentials pointed at this pod
⋮----
// Emit event depending on whether the request is a full exit or a partial withdrawal
⋮----
function recoverTokens(
⋮----
function setProofSubmitter(
⋮----
function stake(
⋮----
// stake on ethpos
⋮----
function withdrawRestakedBeaconChainETH(
⋮----
// transfer ETH from pod to `recipient` directly
⋮----
///                             INTERNAL FUNCTIONS
⋮----
/// @notice internal function that proves an individual validator's withdrawal credentials
/// @param validatorIndex is the index of the validator being proven
/// @param validatorFieldsProof is the bytes that prove the ETH validator's  withdrawal credentials against a beacon chain state root
/// @param validatorFields are the fields of the "Validator Container", refer to consensus specs
function _verifyWithdrawalCredentials(
⋮----
// Withdrawal credential proofs should only be processed for "INACTIVE" validators
⋮----
// Validator should be active on the beacon chain, or in the process of activating.
// This implies the validator has reached the minimum effective balance required
// to become active on the beacon chain.
⋮----
// This check is important because the Pectra upgrade will move any validators that
// do NOT have an activation epoch to a "pending deposit queue," temporarily resetting
// their current and effective balances to 0. This balance can be restored if a deposit
// is made to bring the validator's balance above the minimum activation balance.
// (See https://github.com/ethereum/consensus-specs/blob/dev/specs/electra/fork.md#upgrading-the-state)
⋮----
// In the context of EigenLayer slashing, this temporary reset would allow pod shares
// to temporarily decrease, then be restored later. This would effectively prevent these
// shares from being slashable on EigenLayer for a short period of time.
⋮----
// Validator should not already be in the process of exiting. This is an important property
// this method needs to enforce to ensure a validator cannot be already-exited by the time
// its withdrawal credentials are verified.
⋮----
// Note that when a validator initiates an exit, two values are set:
// - exit_epoch
// - withdrawable_epoch
⋮----
// The latter of these two values describes an epoch after which the validator's ETH MIGHT
// have been exited to the EigenPod, depending on the state of the beacon chain withdrawal
// queue.
⋮----
// Requiring that a validator has not initiated exit by the time the EigenPod sees their
// withdrawal credentials guarantees that the validator has not fully exited at this point.
⋮----
// This is because:
// - the earliest beacon chain slot allowed for withdrawal credential proofs is the earliest
//   slot available in the EIP-4788 oracle, which keeps the last 8192 slots.
// - when initiating an exit, a validator's earliest possible withdrawable_epoch is equal to
//   1 + MAX_SEED_LOOKAHEAD + MIN_VALIDATOR_WITHDRAWABILITY_DELAY == 261 epochs (8352 slots).
⋮----
// (See https://eth2book.info/capella/part3/helper/mutators/#initiate_validator_exit)
⋮----
// Ensure the validator's withdrawal credentials are pointed at this pod
⋮----
// Get the validator's effective balance. Note that this method uses effective balance, while
// `verifyCheckpointProofs` uses current balance. Effective balance is updated per-epoch - so it's
// less accurate, but is good enough for verifying withdrawal credentials.
⋮----
// Verify passed-in validatorFields against verified beaconStateRoot:
⋮----
// Account for validator in future checkpoints. Note that if this pod has never started a
// checkpoint before, `lastCheckpointedAt` will be zero here. This is fine because the main
// purpose of `lastCheckpointedAt` is to enforce that newly-verified validators are not
// eligible to progress already-existing checkpoints - however in this case, no checkpoints exist.
⋮----
// Proofs complete - create the validator in state
⋮----
// Add the validator's balance to the checkpoint's previous beacon balance
// Note that even if this checkpoint is not active, the next one will include
// the validator's restaked balance during the checkpoint process
⋮----
function _verifyCheckpointProof(
⋮----
// Verify validator balance against `balanceContainerRoot`
⋮----
// Calculate change in the validator's balance since the last proof
⋮----
// If the validator's new balance is 0, mark them withdrawn
⋮----
// If we reach this point, `balanceDeltaGwei` should always be negative,
// so this should be a safe conversion
⋮----
/// @dev Initiate a checkpoint proof by snapshotting both the pod's ETH balance and the
/// current block's parent block root. After providing a checkpoint proof for each of the
/// pod's ACTIVE validators, the pod's ETH balance is awarded shares and can be withdrawn.
/// @dev ACTIVE validators are validators with verified withdrawal credentials (See
/// `verifyWithdrawalCredentials` for details)
/// @dev If the pod does not have any ACTIVE validators, the checkpoint is automatically
/// finalized.
/// @dev Once started, a checkpoint MUST be completed! It is not possible to start a
/// checkpoint if the existing one is incomplete.
/// @param revertIfNoBalance If the available ETH balance for checkpointing is 0 and this is
/// true, this method will revert
function _startCheckpoint(
⋮----
// Prevent a checkpoint being completable twice in the same block. This prevents an edge case
// where the second checkpoint would not be completable.
⋮----
// This is because the validators checkpointed in the first checkpoint would have a `lastCheckpointedAt`
// value equal to the second checkpoint, causing their proofs to get skipped in `verifyCheckpointProofs`
⋮----
// Snapshot pod balance at the start of the checkpoint, subtracting pod balance that has
// previously been credited with shares. Once the checkpoint is finalized, `podBalanceGwei`
// will be added to the total validator balance delta and credited as shares.
⋮----
// Note: On finalization, `podBalanceGwei` is added to `restakedExecutionLayerGwei`
// to denote that it has been credited with shares. Because this value is denominated in gwei,
// `podBalanceGwei` is also converted to a gwei amount here. This means that any sub-gwei amounts
// sent to the pod are not credited with shares and are therefore not withdrawable.
// This can be addressed by topping up a pod's balance to a value divisible by 1 gwei.
⋮----
// If the caller doesn't want a "0 balance" checkpoint, revert
⋮----
// Create checkpoint using the previous block's root for proofs, and the current
// `activeValidatorCount` as the number of checkpoint proofs needed to finalize
// the checkpoint.
⋮----
// Place checkpoint in storage. If `proofsRemaining` is 0, the checkpoint
// is automatically finalized.
⋮----
/// @dev Finish progress on a checkpoint and store it in state.
/// @dev If the checkpoint has no proofs remaining, it is finalized:
/// - a share delta is calculated and sent to the `EigenPodManager`
/// - the checkpointed `podBalanceGwei` is added to `restakedExecutionLayerGwei`
/// - `lastCheckpointTimestamp` is updated
/// - `currentCheckpointTimestamp` is set to zero
function _updateCheckpoint(
⋮----
// Calculate the previous total restaked balance and change in restaked balance
// Note: due to how these values are calculated, a negative `balanceDeltaGwei`
// should NEVER be greater in magnitude than `prevRestakedBalanceGwei`
⋮----
// And native ETH when the checkpoint was started is now considered restaked.
// Add it to `restakedExecutionLayerGwei`, which allows it to be withdrawn via
// the `DelegationManager` withdrawal queue.
⋮----
// Finalize the checkpoint by resetting `currentCheckpointTimestamp`.
⋮----
// Convert shares and delta to wei
⋮----
// Update pod owner's shares
⋮----
function _podWithdrawalCredentials() internal view returns (bytes memory) {
⋮----
function _podCompoundingWithdrawalCredentials() internal view returns (bytes memory) {
⋮----
///@notice Calculates the pubkey hash of a validator's pubkey as per SSZ spec
function _calcPubkeyHash(
⋮----
/// @dev Returns the current fee required to query either the EIP-7002 or EIP-7251 predeploy
function _getFee(
⋮----
/// @notice Returns the PROOF_TYPE depending on the `proofTimestamp` in relation to the fork timestamp.
function _getProofVersion(
⋮----
/// Get the timestamp of the Pectra fork, read from the `EigenPodManager`
/// This returns the timestamp of the first non-missed slot at or after the Pectra hard fork
⋮----
/// We check if the proofTimestamp is <= pectraForkTimestamp because a `proofTimestamp` at the `pectraForkTimestamp`
/// is considered to be Pre-Pectra given the EIP-4788 oracle returns the parent block.
⋮----
///                         VIEW FUNCTIONS
⋮----
function withdrawableRestakedExecutionLayerGwei() external view returns (uint64) {
⋮----
function validatorPubkeyHashToInfo(
⋮----
function validatorPubkeyToInfo(
⋮----
function validatorStatus(
⋮----
function currentCheckpoint() public view returns (Checkpoint memory) {
⋮----
function getParentBlockRoot(
⋮----
function getConsolidationRequestFee() public view returns (uint256) {
⋮----
function getWithdrawalRequestFee() public view returns (uint256) {
````

## File: src/contracts/pods/EigenPodManager.sol
````
// SPDX-License-Identifier: BUSL-1.1
⋮----
import "@openzeppelin/contracts/utils/Create2.sol";
import "@openzeppelin/contracts/utils/math/SafeCast.sol";
import "@openzeppelin-upgrades/contracts/proxy/utils/Initializable.sol";
import "@openzeppelin-upgrades/contracts/access/OwnableUpgradeable.sol";
import "@openzeppelin-upgrades/contracts/security/ReentrancyGuardUpgradeable.sol";
⋮----
import "../libraries/SlashingLib.sol";
import "../permissions/Pausable.sol";
import "./EigenPodPausingConstants.sol";
import "./EigenPodManagerStorage.sol";
⋮----
/// @title The contract used for creating and managing EigenPods
/// @author Layr Labs, Inc.
/// @notice Terms of Service: https://docs.eigenlayer.xyz/overview/terms-of-service
/// @notice The main functionalities are:
/// - creating EigenPods
/// - staking for new validators on EigenPods
/// - keeping track of the restaked balances of all EigenPod owners
/// - withdrawing eth when withdrawals are completed
contract EigenPodManager is
⋮----
modifier onlyEigenPod(
⋮----
modifier onlyDelegationManager() {
⋮----
modifier onlyProofTimestampSetter() {
⋮----
function initialize(
⋮----
/// @inheritdoc IEigenPodManager
function createPod() external onlyWhenNotPaused(PAUSED_NEW_EIGENPODS) nonReentrant returns (address) {
⋮----
// deploy a pod if the sender doesn't have one already
⋮----
function stake(
⋮----
//deploy a pod if the sender doesn't have one already
⋮----
function recordBeaconChainETHBalanceUpdate(
⋮----
// Negative shares only exist in certain cases where, prior to the slashing release, negative balance
// deltas were reported after a pod owner queued a withdrawal for all their shares.
//
// The new system treats negative balance deltas differently, decreasing the pod owner's slashing factor
// proportional to the decrease. This check was added to ensure the new system does not need to handle
// negative shares - instead, stakers will need to go complete any existing withdrawals before their pod
// can process a balance update.
⋮----
// Shares are only added to the pod owner's balance when `balanceDeltaWei` > 0. When a pod reports
// a negative balance delta, the pod owner's beacon chain slashing factor is decreased, devaluing
// their shares. If the delta is zero, then no action needs to be taken.
⋮----
// Update operator shares
⋮----
/// @notice Used by the DelegationManager to remove a pod owner's deposit shares when they enter the withdrawal queue.
/// Simply decreases the `podOwner`'s shares by `shares`, down to a minimum of zero.
/// @dev This function reverts if it would result in `podOwnerDepositShares[podOwner]` being less than zero, i.e. it is forbidden for this function to
/// result in the `podOwner` incurring a "share deficit". This behavior prevents a Staker from queuing a withdrawal which improperly removes excessive
/// shares from the operator to whom the staker is delegated.
/// @dev The delegation manager validates that the podOwner is not address(0)
/// @return updatedShares the staker's deposit shares after decrement
function removeDepositShares(
⋮----
/// @notice Increases the `podOwner`'s shares by `shares`, paying off negative shares if needed.
/// Used by the DelegationManager to award a pod owner shares on exiting the withdrawal queue
/// @return existingDepositShares the pod owner's shares prior to any additions. Returns 0 if negative
/// @return addedShares the number of shares added to the staker's balance above 0. This means that if,
/// after shares are added, the staker's balance is non-positive, this will return 0.
function addShares(
⋮----
/// @notice Used by the DelegationManager to complete a withdrawal, sending tokens to the pod owner
/// @dev Prioritizes decreasing the podOwner's share deficit, if they have one
/// @dev This function assumes that `removeShares` has already been called by the delegationManager, hence why
///      we do not need to update the podOwnerDepositShares if `currentpodOwnerDepositShares` is positive
function withdrawSharesAsTokens(
⋮----
// proportional to the decrease. This legacy codepath handles completion of withdrawals queued before
// the slashing release.
⋮----
// Get rid of the whole deficit and withdraw any remaining shares
⋮----
// Get rid of as much deficit as possible and don't withdraw any shares
⋮----
// Withdraw ETH from EigenPod
⋮----
/// @inheritdoc IShareManager
function increaseBurnOrRedistributableShares(
⋮----
/// @notice Sets the address that can set proof timestamps
function setProofTimestampSetter(
⋮----
/// @notice Sets the pectra fork timestamp
function setPectraForkTimestamp(
⋮----
// INTERNAL FUNCTIONS
⋮----
function _deployPod() internal returns (IEigenPod) {
⋮----
// create the pod
⋮----
// set the beacon address to the eigenPodBeacon and initialize it
⋮----
// store the pod in the mapping
⋮----
/// @dev Adds the shares to the staker's balance, returning their current/added shares
/// NOTE: if the staker ends with a non-positive balance, this returns (0, 0)
/// @return prevDepositShares the shares the staker had before any were added
/// @return addedShares the shares added to the staker's balance
function _addShares(
⋮----
// If we haven't added enough shares to go positive, return (0, 0)
⋮----
// If we have gone from negative to positive shares, return (0, positive delta)
⋮----
// Else, return true previous shares and added shares
⋮----
/// @dev Calculates the proportion a pod owner's restaked balance has decreased, and
/// reduces their beacon slashing factor accordingly.
/// Note: `balanceDecreasedWei` is assumed to be less than `prevRestakedBalanceWei`
function _reduceSlashingFactor(
⋮----
// newBeaconSlashingFactor is less than prevBeaconSlashingFactor because
// newRestakedBalanceWei < prevRestakedBalanceWei
⋮----
// VIEW FUNCTIONS
⋮----
function getPod(
⋮----
// if pod does not exist already, calculate what its address *will be* once it is deployed
⋮----
bytes32(uint256(uint160(podOwner))), //salt
keccak256(abi.encodePacked(beaconProxyBytecode, abi.encode(eigenPodBeacon, ""))) //bytecode
⋮----
function hasPod(
⋮----
/// @notice Returns the current shares of `user` in `strategy`
/// @dev strategy must be beaconChainETHStrategy
/// @dev returns 0 if the user has negative shares
function stakerDepositShares(
⋮----
function beaconChainSlashingFactor(
````

## File: src/contracts/pods/EigenPodManagerStorage.sol
````
// SPDX-License-Identifier: BUSL-1.1
⋮----
import "@openzeppelin/contracts/proxy/beacon/IBeacon.sol";
⋮----
import "../interfaces/IStrategy.sol";
import "../interfaces/IEigenPodManager.sol";
import "../interfaces/IStrategyManager.sol";
import "../interfaces/IDelegationManager.sol";
import "../interfaces/IETHPOSDeposit.sol";
import "../interfaces/IEigenPod.sol";
⋮----
abstract contract EigenPodManagerStorage is IEigenPodManager {
///
///                            CONSTANTS / IMMUTABLES
⋮----
/// @notice The ETH2 Deposit Contract
⋮----
/// @notice Beacon proxy to which the EigenPods point
⋮----
/// @notice EigenLayer's DelegationManager contract
⋮----
/// @notice Stored code of type(BeaconProxy).creationCode
/// @dev Maintained as a constant to solve an edge case - changes to OpenZeppelin's BeaconProxy code should not cause
/// addresses of EigenPods that are pre-computed with Create2 to change, even upon upgrading this contract, changing compiler version, etc.
⋮----
// @notice Internal constant used in calculations, since the beacon chain stores balances in Gwei rather than wei
⋮----
/// @notice Canonical, virtual beacon chain ETH strategy
⋮----
///                                STATE VARIABLES
⋮----
/// @notice [DEPRECATED] Previously used to query beacon block roots. We now use eip-4788 directly
⋮----
/// @notice Pod owner to deployed EigenPod address
⋮----
// BEGIN STORAGE VARIABLES ADDED AFTER FIRST TESTNET DEPLOYMENT -- DO NOT SUGGEST REORDERING TO CONVENTIONAL ORDER
/// @notice The number of EigenPods that have been deployed
⋮----
/// @notice [DEPRECATED] Was initially used to limit growth early on but there is no longer
/// a maximum number of EigenPods that can be deployed.
⋮----
// BEGIN STORAGE VARIABLES ADDED AFTER MAINNET DEPLOYMENT -- DO NOT SUGGEST REORDERING TO CONVENTIONAL ORDER
/// @notice mapping from pod owner to the deposit shares they have in the virtual beacon chain ETH strategy
⋮----
/// @dev When an EigenPod registers a balance increase, deposit shares are increased. When registering a balance
/// decrease, however, deposit shares are NOT decreased. Instead, the pod owner's beacon chain slashing factor
/// is decreased proportional to the balance decrease. This impacts the number of shares that will be withdrawn
/// when the deposit shares are queued for withdrawal in the DelegationManager.
⋮----
/// Note that prior to the slashing release, deposit shares were decreased when balance decreases occurred.
/// In certain cases, a combination of queueing a withdrawal plus registering a balance decrease could result
/// in a staker having negative deposit shares in this mapping. This negative value would be corrected when the
/// staker completes a withdrawal (as tokens or as shares).
⋮----
/// With the slashing release, negative shares are no longer possible. However, a staker can still have negative
/// shares if they met the conditions for them before the slashing release. If this is the case, that staker
/// should complete any outstanding queued withdrawal in the DelegationManager ("as shares"). This will correct
/// the negative share count and allow the staker to continue using their pod as normal.
⋮----
/// @notice Returns the slashing factor applied to the `staker` for the `beaconChainETHStrategy`
/// Note: this value starts at 1 WAD (1e18) for all stakers, and is updated when a staker's pod registers
/// a balance decrease.
⋮----
/// @notice Returns the amount of `shares` that have been slashed on EigenLayer but not burned yet.
⋮----
/// @notice The address that can set proof timestamps
⋮----
/// @notice The timestamp of the Pectra proof
⋮----
/// @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
````

## File: src/contracts/pods/EigenPodPausingConstants.sol
````
// SPDX-License-Identifier: BUSL-1.1
⋮----
/// @title Constants shared between 'EigenPod' and 'EigenPodManager' contracts.
/// @author Layr Labs, Inc.
/// @notice Terms of Service: https://docs.eigenlayer.xyz/overview/terms-of-service
abstract contract EigenPodPausingConstants {
/// @notice Index for flag that pauses creation of new EigenPods when set. See EigenPodManager code for details.
⋮----
// Deprecated
// uint8 internal constant PAUSED_WITHDRAW_RESTAKED_ETH = 1;
⋮----
/// @notice Index for flag that pauses the deposit related functions *of the EigenPods* when set. see EigenPod code for details.
⋮----
// uint8 internal constant PAUSED_EIGENPODS_VERIFY_BALANCE_UPDATE = 3;
⋮----
// uint8 internal constant PAUSED_EIGENPODS_VERIFY_WITHDRAWAL = 4;
⋮----
/// @notice Pausability for EigenPod's "accidental transfer" withdrawal methods
⋮----
/// @notice Index for flag that pauses the `verifyCheckpointProofs` function *of the EigenPods* when set. see EigenPod code for details.
````

## File: src/contracts/pods/EigenPodStorage.sol
````
// SPDX-License-Identifier: BUSL-1.1
⋮----
import "../interfaces/IEigenPod.sol";
⋮----
abstract contract EigenPodStorage is IEigenPod {
/// @notice The owner of this EigenPod
⋮----
/// @notice DEPRECATED: previously used to track the time when restaking was activated
⋮----
/// @notice the amount of execution layer ETH in this contract that is staked in EigenLayer (i.e. withdrawn from the Beacon Chain but not from EigenLayer),
⋮----
/// @notice DEPRECATED: previously used to track whether a pod had activated restaking
⋮----
/// @notice DEPRECATED: previously tracked withdrawals proven per validator
⋮----
/// @notice This is a mapping that tracks a validator's information by their pubkey hash
⋮----
/// @notice DEPRECATED: previously used to track ETH sent to the fallback function
⋮----
/// @notice DEPRECATED: previously used to track claimed partial withdrawals
⋮----
/// @notice Number of validators with proven withdrawal credentials, who do not have proven full withdrawals
⋮----
/// @notice The timestamp of the last checkpoint finalized
⋮----
/// @notice The timestamp of the currently-active checkpoint. Will be 0 if there is not active checkpoint
⋮----
/// @notice For each checkpoint, the total balance attributed to exited validators, in gwei
///
/// NOTE that the values added to this mapping are NOT guaranteed to capture the entirety of a validator's
/// exit - rather, they capture the total change in a validator's balance when a checkpoint shows their
/// balance change from nonzero to zero. While a change from nonzero to zero DOES guarantee that a validator
/// has been fully exited, it is possible that the magnitude of this change does not capture what is
/// typically thought of as a "full exit."
⋮----
/// Example A: (deposits)
/// 1. Consider a validator was last checkpointed at 32 ETH before exiting. Once the exit has been processed,
/// it is expected that the validator's exited balance is calculated to be `32 ETH`.
/// 2. However, before `startCheckpoint` is called, a deposit is made to the validator for 1 ETH. The beacon
/// chain will automatically withdraw this ETH, but not until the withdrawal sweep passes over the validator
/// again. Until this occurs, the validator's current balance (used for checkpointing) is 1 ETH.
/// 3. If `startCheckpoint` is called at this point, the balance delta calculated for this validator will be
/// `-31 ETH`, and because the validator has a nonzero balance, it is not marked WITHDRAWN.
/// 4. After the exit is processed by the beacon chain, a subsequent `startCheckpoint` and checkpoint proof
/// will calculate a balance delta of `-1 ETH` and attribute a 1 ETH exit to the validator.
⋮----
/// Example B: (consolidation)
/// 1. Consider 2 validators (a and b), each last checkpointed at 32 ETH.
/// 2. EigenPod.requestConsolidation is called, requesting a consolidation of b -> a
/// 3. When the beacon chain processes this consolidation, b's entire balance is transferred to a, and
///    b is left with 0 balance.
/// 4. Post-consolidation, start+completeCheckpoint will show validator a now has 64 ETH, and validator b has 0 ETH.
///    b's state is set to WITHDRAWN, and `checkpointBalanceExitedGwei` will show 32 ETH, even though this balance
///    did not exit the beacon chain.
⋮----
/// Unfortunately, these edge cases can't be fully accounted for within an EigenPod. Please keep in mind that this
/// mapping is intended to be an approximation, and ensure your offchain tooling can account for these edge cases
/// before relying on the value for important operations.
⋮----
/// Additional edge cases this mapping does not cover:
/// - If a validator is slashed, their balance exited will reflect their original balance rather than the slashed amount
/// - The final partial withdrawal for an exited validator will be likely be included in this mapping.
///   i.e. if a validator was last checkpointed at 32.1 ETH before exiting, the next checkpoint will calculate their
///   "exited" amount to be 32.1 ETH rather than 32 ETH.
⋮----
/// @notice The current checkpoint, if there is one active
⋮----
/// @notice An address with permissions to call `startCheckpoint` and `verifyWithdrawalCredentials`, set
/// by the podOwner. This role exists to allow a podOwner to designate a hot wallet that can call
/// these methods, allowing the podOwner to remain a cold wallet that is only used to manage funds.
/// @dev If this address is NOT set, only the podOwner can call `startCheckpoint` and `verifyWithdrawalCredentials`
⋮----
/// @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
````

## File: src/contracts/strategies/DurationVaultStrategy.sol
````
// SPDX-License-Identifier: BUSL-1.1
⋮----
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 {
⋮----
/// @notice Delegation manager reference used to register the vault as an operator.
⋮----
/// @notice Allocation manager reference used to register/allocate operator sets.
⋮----
/// @notice Rewards coordinator reference used to configure operator splits.
⋮----
/// @notice Strategy factory reference used to check token blacklist status.
⋮----
/// @dev Restricts function access to the vault administrator.
modifier onlyVaultAdmin() {
⋮----
/// @dev Restricts function access to the vault arbitrator.
modifier 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.
⋮----
/// @notice Initializes the vault configuration.
/// @param config The vault configuration containing admin, duration, caps, and operator set info.
function initialize(
⋮----
/// @notice Locks the vault, preventing new deposits and withdrawals until maturity.
function lock() external override onlyVaultAdmin {
⋮----
// Verify this strategy is supported by the operator set before allocating.
⋮----
/// @notice Marks the vault as matured once the configured duration elapses. Callable by anyone.
function markMatured() external override {
⋮----
/// @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 {
⋮----
/// @notice Updates the metadata URI describing the vault.
function updateMetadataURI(
⋮----
/// @notice Updates the delegation approver used for operator delegation approvals.
function updateDelegationApprover(
⋮----
/// @notice Updates the operator metadata URI emitted by the DelegationManager.
function updateOperatorMetadataURI(
⋮----
/// @notice Sets the claimer for operator rewards accrued to the vault.
function setRewardsClaimer(
⋮----
/// @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(
⋮----
/// @notice Allows the unpauser to update TVL limits, mirroring `StrategyBaseTVLLimits`.
function setTVLLimits(
⋮----
// Keep vault config changes constrained to the deposits window.
⋮----
/// @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) {
⋮----
/// @inheritdoc IDurationVaultStrategy
function unlockTimestamp() public view override returns (uint32) {
⋮----
function isLocked() public view override returns (bool) {
⋮----
function isMatured() public view override returns (bool) {
⋮----
function state() public view override returns (VaultState) {
⋮----
function stakeCap() external view override returns (uint256) {
⋮----
function depositsOpen() public view override returns (bool) {
⋮----
function withdrawalsOpen() public view override returns (bool) {
⋮----
/// @inheritdoc IStrategy
function beforeAddShares(
⋮----
// Enforce per-deposit cap using the minted shares as proxy for underlying.
⋮----
// Enforce total cap using operatorShares (active, non-queued shares).
// At this point, operatorShares hasn't been updated yet, so we add the new shares.
⋮----
function beforeRemoveShares(
⋮----
// Queuing withdrawals is blocked during ALLOCATIONS. Withdrawals queued during
// DEPOSITS can complete during ALLOCATIONS since they were queued before lock.
⋮----
/// @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(
⋮----
function operatorIntegrationConfigured() public pure override returns (bool) {
⋮----
function operatorSetInfo() external view override returns (address avs, uint32 operatorSetId) {
⋮----
function operatorSetRegistered() public view override returns (bool) {
⋮----
/// @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) {
⋮----
function explanation() external pure virtual override(IStrategy, StrategyBase) returns (string memory) {
⋮----
/// @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(
⋮----
// Set allocation delay strictly greater than withdrawal delay to protect pre-lock queued withdrawals.
⋮----
// apply allocation delay at registration
⋮----
// 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.
⋮----
/// @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.
⋮----
/// @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) {
⋮----
// If an allocation modification is pending, wait until it clears.
⋮----
// 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.
⋮----
/// @notice Attempts to deregister the vault from its configured operator set.
⋮----
function _deregisterFromOperatorSet() internal returns (bool) {
⋮----
/// @notice Best-effort cleanup after maturity, with retry tracking.
function _attemptOperatorCleanup() internal {
````

## File: src/contracts/strategies/DurationVaultStrategyStorage.sol
````
// SPDX-License-Identifier: BUSL-1.1
⋮----
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.
⋮----
/// @notice Maximum allowable duration (approximately 2 years).
⋮----
/// @notice Address empowered to configure and lock the vault.
⋮----
/// @notice Address empowered to advance the vault to withdrawals early (after lock, before duration elapses).
⋮----
/// @notice The enforced lock duration once `lock` is called.
⋮----
/// @notice Timestamp when the vault was locked. Zero indicates the vault is not yet locked.
⋮----
/// @notice Timestamp when the vault unlocks (set at lock time).
⋮----
/// @notice Timestamp when the vault was marked as matured (purely informational).
⋮----
/// @notice Tracks the lifecycle of the vault (deposits -> allocations -> withdrawals).
⋮----
/// @notice Optional metadata URI describing the vault configuration.
⋮----
/// @notice Stored operator set metadata for integration with the allocation manager.
⋮----
/// @notice The maximum deposit (in underlyingToken) that this strategy will accept per deposit.
⋮----
/// @notice The maximum deposits (in underlyingToken) that this strategy will hold.
⋮----
/// @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.
````

## File: src/contracts/strategies/EigenStrategy.sol
````
// SPDX-License-Identifier: BUSL-1.1
⋮----
// NOTE: Mainnet uses the OpenZeppelin v4.9.0 contracts, but this imports the 4.7.1 version. This will be changed after an upgrade.
⋮----
import "@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol";
import "../interfaces/IStrategyManager.sol";
import "../strategies/StrategyBase.sol";
import "../interfaces/IEigen.sol";
⋮----
/// @title Eigen Strategy implementation of `IStrategy` interface, designed to be inherited from by more complex strategies.
/// @author Layr Labs, Inc.
/// @notice Terms of Service: https://docs.eigenlayer.xyz/overview/terms-of-service
/// @dev Note that this EigenStrategy contract is designed to be compatible with both bEIGEN and EIGEN tokens. It functions exactly the same
/// as the `StrategyBase` contract if bEIGEN were the underlying token, but also allows for depositing and withdrawing EIGEN tokens. This is
/// achieved by unwrapping EIGEN into bEIGEN upon deposit, and wrapping bEIGEN into EIGEN upon withdrawal. Deposits and withdrawals with bEIGEN
/// does not perform and wrapping or unwrapping.
/// @notice This contract functions similarly to an ERC4626 vault, only without issuing a token.
/// To mitigate against the common "inflation attack" vector, we have chosen to use the 'virtual shares' mitigation route,
/// similar to [OpenZeppelin](https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/token/ERC20/extensions/ERC4626.sol).
/// We acknowledge that this mitigation has the known downside of the virtual shares causing some losses to users, which are pronounced
/// particularly in the case of the share exchange rate changing significantly, either positively or negatively.
/// For a fairly thorough discussion of this issue and our chosen mitigation strategy, we recommend reading through
/// [this thread](https://github.com/OpenZeppelin/openzeppelin-contracts/issues/3706) on the OpenZeppelin repo.
/// We specifically use a share offset of `SHARES_OFFSET` and a balance offset of `BALANCE_OFFSET`.
contract EigenStrategy is StrategyBase {
⋮----
/// @notice EIGEN can be deposited into this strategy, where it is unwrapped into bEIGEN and staked in
/// this strategy contract. EIGEN can also be withdrawn by withdrawing bEIGEN from this strategy, and
/// then wrapping it back into EIGEN.
⋮----
/// @notice Since this contract is designed to be initializable, the constructor simply sets `strategyManager`, the only immutable variable.
⋮----
function initialize(
⋮----
/// @notice This function hook is called in EigenStrategy.deposit() and is overridden here to
/// allow for depositing of either EIGEN or bEIGEN tokens. If token is bEIGEN aka the underlyingToken,
/// then the contract functions exactly the same as the StrategyBase contract and the deposit is calculated into shares.
/// If token is EIGEN, then the EIGEN is first 1-1 unwrapped into bEIGEN and the deposit shares are calculated as normal.
/// @param token token to be deposited, can be either EIGEN or bEIGEN. If EIGEN, then is unwrapped into bEIGEN
/// @param amount deposit amount
function _beforeDeposit(
⋮----
// unwrap EIGEN into bEIGEN assuming a 1-1 unwrapping amount
// the strategy will then hold `amount` of bEIGEN
⋮----
/// @notice This function hook is called in EigenStrategy.withdraw() before withdrawn shares are calculated and is
/// overridden here to allow for withdrawing shares either into EIGEN or bEIGEN tokens. If wrapping bEIGEN into EIGEN is needed,
/// it is performed in _afterWithdrawal(). This hook just checks the token parameter is either EIGEN or bEIGEN.
/// @param token token to be withdrawn, can be either EIGEN or bEIGEN. If EIGEN, then bEIGEN is wrapped into EIGEN
function _beforeWithdrawal(
address, /*recipient*/
⋮----
uint256 /*amountShares*/
⋮----
/// @notice This function hook is called in EigenStrategy.withdraw() after withdrawn shares are calculated and is
/// overridden here to allow for withdrawing shares either into EIGEN or bEIGEN tokens. If token is bEIGEN aka the underlyingToken,
/// then the contract functions exactly the same as the StrategyBase contract and transfers out bEIGEN to the recipient.
/// If token is EIGEN, then bEIGEN is first 1-1 wrapped into EIGEN and the strategy transfers out the EIGEN to the recipient.
/// @param recipient recipient of the withdrawal
⋮----
/// @param amountToSend amount of tokens to transfer
function _afterWithdrawal(
⋮----
// wrap bEIGEN into EIGEN assuming a 1-1 wrapping amount
// the strategy will then hold `amountToSend` of EIGEN
⋮----
// Whether the withdrawal specified EIGEN or bEIGEN, the strategy
// holds the correct balance and can transfer to the recipient here
⋮----
/// @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
````

## File: src/contracts/strategies/StrategyBase.sol
````
// SPDX-License-Identifier: BUSL-1.1
⋮----
import "../interfaces/IStrategyManager.sol";
import "../permissions/Pausable.sol";
import "@openzeppelin/contracts/token/ERC20/IERC20.sol";
import "@openzeppelin/contracts/token/ERC20/extensions/IERC20Metadata.sol";
import "@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol";
import "@openzeppelin-upgrades/contracts/proxy/utils/Initializable.sol";
⋮----
/// @title Base implementation of `IStrategy` interface, designed to be inherited from by more complex strategies.
/// @author Layr Labs, Inc.
/// @notice Terms of Service: https://docs.eigenlayer.xyz/overview/terms-of-service
/// @notice Simple, basic, "do-nothing" Strategy that holds a single underlying token and returns it on withdrawals.
/// Implements minimal versions of the IStrategy functions, this contract is designed to be inherited by
/// more complex strategies, which can then override its functions as necessary.
/// @dev Note that some functions have their mutability restricted; developers inheriting from this contract cannot broaden
/// the mutability without modifying this contract itself.
/// @dev This contract is expressly *not* intended for use with 'fee-on-transfer'-type tokens.
/// Setting the `underlyingToken` to be a fee-on-transfer token may result in improper accounting.
/// @notice This contract functions similarly to an ERC4626 vault, only without issuing a token.
/// To mitigate against the common "inflation attack" vector, we have chosen to use the 'virtual shares' mitigation route,
/// similar to [OpenZeppelin](https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/token/ERC20/extensions/ERC4626.sol).
/// We acknowledge that this mitigation has the known downside of the virtual shares causing some losses to users, which are pronounced
/// particularly in the case of the share exchange rate changing significantly, either positively or negatively.
/// For a fairly thorough discussion of this issue and our chosen mitigation strategy, we recommend reading through
/// [this thread](https://github.com/OpenZeppelin/openzeppelin-contracts/issues/3706) on the OpenZeppelin repo.
/// We specifically use a share offset of `SHARES_OFFSET` and a balance offset of `BALANCE_OFFSET`.
contract StrategyBase is Initializable, Pausable, IStrategy {
⋮----
/// @notice virtual shares used as part of the mitigation of the common 'share inflation' attack vector.
/// Constant value chosen to reasonably reduce attempted share inflation by the first depositor, while still
/// incurring reasonably small losses to depositors
⋮----
/// @notice virtual balance used as part of the mitigation of the common 'share inflation' attack vector
⋮----
/// @notice The maximum total shares for a given strategy
/// @dev This constant prevents overflow in offchain services for rewards
⋮----
/// @notice EigenLayer's StrategyManager contract
⋮----
/// @notice The underlying token for shares in this Strategy
⋮----
/// @notice The total number of extant shares in this Strategy
⋮----
/// @notice Simply checks that the `msg.sender` is the `strategyManager`, which is an address stored immutably at construction.
modifier onlyStrategyManager() {
⋮----
/// @notice Since this contract is designed to be initializable, the constructor simply sets `strategyManager`, the only immutable variable.
⋮----
function initialize(
⋮----
/// @notice Sets the `underlyingToken` and `pauserRegistry` for the strategy.
function _initializeStrategyBase(
⋮----
/// @notice Used to deposit tokens into this Strategy
/// @param token is the ERC20 token being deposited
/// @param amount is the amount of token being deposited
/// @dev This function is only callable by the strategyManager contract. It is invoked inside of the strategyManager's
/// `depositIntoStrategy` function, and individual share balances are recorded in the strategyManager as well.
/// @dev Note that the assumption is made that `amount` of `token` has already been transferred directly to this contract
/// (as performed in the StrategyManager's deposit functions). In particular, setting the `underlyingToken` of this contract
/// to be a fee-on-transfer token will break the assumption that the amount this contract *received* of the token is equal to
/// the amount that was input when the transfer was performed (i.e. the amount transferred 'out' of the depositor's balance).
/// @dev Note that any validation of `token` is done inside `_beforeDeposit`. This can be overridden if needed.
/// @return newShares is the number of new shares issued at the current exchange ratio.
function deposit(
⋮----
// Run pre-deposit hook
⋮----
// copy `totalShares` value to memory, prior to any change
⋮----
/// @notice calculation of newShares *mirrors* `underlyingToShares(amount)`, but is different since the balance of `underlyingToken`
/// has already been increased due to the `strategyManager` transferring tokens to this strategy prior to calling this function
// account for virtual shares and balance
⋮----
// calculate the prior virtual balance to account for the tokens that were already transferred to this contract
⋮----
// extra check for correctness / against edge case where share rate can be massively inflated as a 'griefing' sort of attack
⋮----
// update total share amount to account for deposit
⋮----
// emit exchange rate
⋮----
/// @notice Used to withdraw tokens from this Strategy, to the `recipient`'s address
/// @param recipient is the address to receive the withdrawn funds
/// @param token is the ERC20 token being transferred out
/// @param amountShares is the amount of shares being withdrawn
⋮----
/// other functions, and individual share balances are recorded in the strategyManager as well.
/// @dev Note that any validation of `token` is done inside `_beforeWithdrawal`. This can be overridden if needed.
function withdraw(
⋮----
// call hook to allow for any pre-withdrawal logic
⋮----
/// @notice calculation of amountOut *mirrors* `sharesToUnderlying(amountShares)`, but is different since the `totalShares` has already
/// been decremented. Specifically, notice how we use `priorTotalShares` here instead of `totalShares`.
⋮----
// calculate ratio based on virtual shares and balance, being careful to multiply before dividing
⋮----
// Decrease the `totalShares` value to reflect the withdrawal
⋮----
/// @notice Hook invoked by the StrategyManager before adding deposit shares for a staker.
function beforeAddShares(
address, // staker
uint256 // shares
⋮----
/// @notice Hook invoked by the StrategyManager before removing deposit shares for a staker.
function beforeRemoveShares(
⋮----
/// @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(
⋮----
uint256 // amount
⋮----
/// @notice Called in the external `withdraw` function, before any logic is executed.  Expected to be overridden if strategies want such logic.
/// @param token The token being withdrawn
function _beforeWithdrawal(
address, // recipient
⋮----
uint256 // amountShares
⋮----
/// @notice Transfers tokens to the recipient after a withdrawal is processed
/// @dev Called in the external `withdraw` function after all logic is executed
/// @param recipient The destination of the tokens
/// @param token The ERC20 being transferred
/// @param amountToSend The amount of `token` to transfer
function _afterWithdrawal(
⋮----
/// @inheritdoc IStrategy
function explanation() external pure virtual override returns (string memory) {
⋮----
function sharesToUnderlyingView(
⋮----
function sharesToUnderlying(
⋮----
function underlyingToSharesView(
⋮----
function underlyingToShares(
⋮----
function userUnderlyingView(
⋮----
function userUnderlying(
⋮----
function shares(
⋮----
/// @notice Internal function used to fetch this contract's current balance of `underlyingToken`.
// slither-disable-next-line dead-code
function _tokenBalance() internal view virtual returns (uint256) {
⋮----
/// @notice Internal function used to emit the exchange rate of the strategy in wad (18 decimals)
/// @dev Tokens that do not have 18 decimals must have offchain services scale the exchange rate down to proper magnitude
function _emitExchangeRate(
⋮----
// Emit asset over shares ratio.
⋮----
/// @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
````

## File: src/contracts/strategies/StrategyBaseTVLLimits.sol
````
// SPDX-License-Identifier: BUSL-1.1
⋮----
import "./StrategyBase.sol";
⋮----
/// @title A Strategy implementation inheriting from `StrategyBase` that limits the total amount of deposits it will accept.
/// @dev Note that this implementation still converts between any amount of shares or underlying tokens in its view functions;
/// these functions purposefully do not take the TVL limit into account.
/// @author Layr Labs, Inc.
/// @notice Terms of Service: https://docs.eigenlayer.xyz/overview/terms-of-service
contract StrategyBaseTVLLimits is StrategyBase {
/// The maximum deposit (in underlyingToken) that this strategy will accept per deposit
⋮----
/// The maximum deposits (in underlyingToken) that this strategy will hold
⋮----
/// @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);
⋮----
// solhint-disable-next-line no-empty-blocks
⋮----
function initialize(
⋮----
/// @notice Sets the maximum deposits (in underlyingToken) that this strategy will hold and accept per deposit
/// @param newMaxTotalDeposits The new maximum deposits
/// @dev Callable only by the unpauser of this contract
/// @dev We note that there is a potential race condition between a call to this function that lowers either or both of these limits and call(s)
/// to `deposit`, that may result in some calls to `deposit` reverting.
function setTVLLimits(
⋮----
/// @notice Simple getter function that returns the current values of `maxPerDeposit` and `maxTotalDeposits`.
function getTVLLimits() external view returns (uint256, uint256) {
⋮----
/// @notice Internal setter for TVL limits
function _setTVLLimits(
⋮----
/// @notice Called in the external `deposit` function, before any logic is executed. Makes sure that deposits don't exceed configured maximum.
/// @dev Unused token param is the token being deposited. This is already checked in the `deposit` function.
/// @dev Note that the `maxTotalDeposits` is purely checked against the current `_tokenBalance()`, since by this point in the deposit flow, the
/// tokens should have already been transferred to this Strategy by the StrategyManager
/// @dev We note as well that this makes it possible for various race conditions to occur:
/// a) multiple simultaneous calls to `deposit` may result in some of these calls reverting due to `maxTotalDeposits` being reached.
/// b) transferring funds directly to this Strategy (although not generally in someone's economic self interest) in order to reach `maxTotalDeposits`
/// is a route by which someone can cause calls to `deposit` to revert.
/// c) increases in the token balance of this contract through other effects – including token rebasing – may cause similar issues to (a) and (b).
/// @param amount The amount of `token` being deposited
function _beforeDeposit(
⋮----
/// @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
````

## File: src/contracts/strategies/StrategyFactory.sol
````
// SPDX-License-Identifier: BUSL-1.1
⋮----
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
///        and automatically adding them to the StrategyWhitelist in EigenLayer.
/// @author Layr Labs, Inc.
/// @notice Terms of Service: https://docs.eigenlayer.xyz/overview/terms-of-service
/// @dev This may not be compatible with non-standard ERC20 tokens. Caution is warranted.
contract StrategyFactory is StrategyFactoryStorage, OwnableUpgradeable, Pausable {
⋮----
/// @notice EigenLayer's StrategyManager contract
⋮----
/// @notice Upgradeable beacon used for baseline strategies deployed by this contract.
⋮----
/// @notice Upgradeable beacon used for duration vault strategies deployed by this contract.
⋮----
/// @notice Since this contract is designed to be initializable, the constructor simply sets the immutable variables.
⋮----
function initialize(
⋮----
/// @notice Deploy a new StrategyBase contract for the ERC20 token, using a beacon proxy
/// @dev A strategy contract must not yet exist for the token.
/// @dev Immense caution is warranted for non-standard ERC20 tokens, particularly "reentrant" tokens
/// like those that conform to ERC777.
function deployNewStrategy(
⋮----
/// @notice Owner-only function to prevent strategies from being created for given tokens.
/// @param tokens An array of token addresses to blacklist.
function blacklistTokens(
⋮----
// If someone has already deployed a strategy for this token, add it
// to the list of strategies to remove from the StrategyManager whitelist
⋮----
// Manually adjust length to remove unused entries
// New length == removeIdx
⋮----
/// @notice Owner-only function to pass through a call to `StrategyManager.addStrategiesToDepositWhitelist`
function whitelistStrategies(
⋮----
/// @notice Deploys a new duration vault strategy backed by the configured beacon.
function deployDurationVaultStrategy(
⋮----
/// @notice Owner-only function to pass through a call to `StrategyManager.removeStrategiesFromDepositWhitelist`
function removeStrategiesFromWhitelist(
⋮----
function _setStrategyForToken(
⋮----
/// @inheritdoc IStrategyFactory
function getDurationVaults(
⋮----
// NOTE: Consider using the public durationVaultsByToken mapping directly
// for on-chain integrations to avoid potential OOG issues with large arrays.
⋮----
function _registerDurationVault(
⋮----
function _emitDurationVaultDeployed(
````

## File: src/contracts/strategies/StrategyFactoryStorage.sol
````
// SPDX-License-Identifier: BUSL-1.1
⋮----
import "../interfaces/IStrategyFactory.sol";
⋮----
/// @title Storage for the StrategyFactory contract.
/// @author Layr Labs, Inc.
/// @notice Terms of Service: https://docs.eigenlayer.xyz/overview/terms-of-service
abstract contract StrategyFactoryStorage is IStrategyFactory {
/// @dev Deprecated: strategyBeacon is now immutable in StrategyFactory.
/// Slot preserved for storage layout compatibility with existing proxies.
⋮----
/// @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
/// These strategies MIGHT not be whitelisted in the StrategyManager,
/// though deployNewStrategy does whitelist by default.
/// These strategies MIGHT not be the only strategy for the underlying token
/// as additional strategies can be whitelisted by the owner of the factory.
⋮----
/// @notice Mapping token => Whether or not a strategy can be deployed for the token
⋮----
/// @notice Mapping token => all duration vault strategies deployed for the token.
⋮----
/// @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
/// Storage slots used: __deprecated_strategyBeacon (1) + deployedStrategies (1) + isBlacklisted (1) +
/// durationVaultsByToken (1) = 4 slots. Gap: 51 - 4 = 47.
````

## File: src/contracts/token/BackingEigen.sol
````
// SPDX-License-Identifier: BUSL-1.1
⋮----
import "@openzeppelin/contracts/token/ERC20/IERC20.sol";
import "@openzeppelin-upgrades/contracts/token/ERC20/extensions/ERC20VotesUpgradeable.sol";
import "@openzeppelin-upgrades/contracts/access/OwnableUpgradeable.sol";
⋮----
contract BackingEigen is OwnableUpgradeable, ERC20VotesUpgradeable {
/// CONSTANTS & IMMUTABLES
/// @notice the address of the wrapped Eigen token EIGEN
⋮----
/// STORAGE
/// @notice the timestamp after which transfer restrictions are disabled
⋮----
/// @notice mapping of addresses that are allowed to transfer tokens to any address
⋮----
/// @notice mapping of addresses that are allowed to receive tokens from any address
⋮----
// @notice whether or not an address is allowed to mint new bEIGEN tokens
⋮----
/// @notice event emitted when the allowedFrom status of an address is set
event SetAllowedFrom(address indexed from, bool isAllowedFrom);
/// @notice event emitted when the allowedTo status of an address is set
event SetAllowedTo(address indexed to, bool isAllowedTo);
/// @notice event emitted when the transfer restrictions are disabled
event TransferRestrictionsDisabled();
/// @notice event emitted when the EIGEN token is backed
event Backed();
// @notice event emitted when the `isMinter` mapping is modified
event IsMinterModified(address indexed minterAddress, bool newStatus);
⋮----
// @notice Allows the contract owner to modify an entry in the `isMinter` mapping.
function setIsMinter(
⋮----
/// @notice Allows any privileged address to mint `amount` new tokens to the address `to`.
/// @dev Callable only by an address that has `isMinter` set to true.
function mint(
⋮----
/// @dev Destroys `amount` tokens from the caller.
///
/// See {ERC20-_burn}.
function burn(
⋮----
/// @notice An initializer function that sets initial values for the contract's state variables.
function initialize(
⋮----
// set transfer restrictions to be disabled at type(uint256).max to be set down later
⋮----
// the EIGEN contract should be allowed to transfer tokens to any address for unwrapping
// likewise, anyone should be able to transfer bEIGEN to EIGEN for wrapping
⋮----
// Mint the entire supply of EIGEN - this is a one-time event that
// ensures bEIGEN fully backs EIGEN.
⋮----
/// EXTERNAL FUNCTIONS
⋮----
/// @notice This function allows the owner to set the allowedFrom status of an address
/// @param from the address whose allowedFrom status is being set
/// @param isAllowedFrom the new allowedFrom status
function setAllowedFrom(
⋮----
/// @notice This function allows the owner to set the allowedTo status of an address
/// @param to the address whose allowedTo status is being set
/// @param isAllowedTo the new allowedTo status
function setAllowedTo(
⋮----
/// @notice Allows the owner to disable transfer restrictions
function disableTransferRestrictions() external onlyOwner {
⋮----
/// VIEW FUNCTIONS
⋮----
/// @dev Clock used for flagging checkpoints. Has been overridden to implement timestamp based
/// checkpoints (and voting).
function clock() public view override returns (uint48) {
⋮----
/// @dev Machine-readable description of the clock as specified in EIP-6372.
/// 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() public pure override returns (string memory) {
⋮----
/// INTERNAL FUNCTIONS
⋮----
function _setAllowedFrom(
⋮----
function _setAllowedTo(
⋮----
/// @notice Overrides the beforeTokenTransfer function to enforce transfer restrictions
/// @param from the address tokens are being transferred from
/// @param to the address tokens are being transferred to
/// @param amount the amount of tokens being transferred
function _beforeTokenTransfer(
⋮----
// if transfer restrictions are enabled
⋮----
// if both from and to are not whitelisted
````

## File: src/contracts/token/Eigen.sol
````
// SPDX-License-Identifier: BUSL-1.1
⋮----
import "@openzeppelin/contracts/token/ERC20/IERC20.sol";
import "@openzeppelin-upgrades/contracts/token/ERC20/extensions/ERC20VotesUpgradeable.sol";
import "@openzeppelin-upgrades/contracts/access/OwnableUpgradeable.sol";
⋮----
import "../mixins/SemVerMixin.sol";
⋮----
contract Eigen is OwnableUpgradeable, ERC20VotesUpgradeable, SemVerMixin {
/// CONSTANTS & IMMUTABLES
/// @notice the address of the backing Eigen token bEIGEN
⋮----
/// STORAGE
/// @notice mapping of minter addresses to the timestamp after which they are allowed to mint
⋮----
/// @notice mapping of minter addresses to the amount of tokens they are allowed to mint
⋮----
/// @notice the timestamp after which transfer restrictions are disabled
⋮----
/// @notice mapping of addresses that are allowed to transfer tokens to any address
⋮----
/// @notice mapping of addresses that are allowed to receive tokens from any address
⋮----
/// @notice event emitted when the allowedFrom status of an address is set
event SetAllowedFrom(address indexed from, bool isAllowedFrom);
/// @notice event emitted when the allowedTo status of an address is set
event SetAllowedTo(address indexed to, bool isAllowedTo);
/// @notice event emitted when a minter mints
event Mint(address indexed minter, uint256 amount);
/// @notice event emitted when the transfer restrictions disabled
event TransferRestrictionsDisabled();
⋮----
/// EVENTS
/// @notice Emitted when bEIGEN tokens are wrapped into EIGEN
event TokenWrapped(address indexed account, uint256 amount);
/// @notice Emitted when EIGEN tokens are unwrapped into bEIGEN
event TokenUnwrapped(address indexed account, uint256 amount);
⋮----
/// @notice An initializer function that sets initial values for the contract's state variables.
/// @param minters the addresses that are allowed to mint
/// @param mintingAllowances the amount of tokens that each minter is allowed to mint
function initialize(
⋮----
// set minting allowances for each minter
⋮----
// allow each minter to transfer tokens
⋮----
// set transfer restrictions to be disabled at type(uint256).max to be set down later
⋮----
/// @notice This function allows the owner to set the allowedFrom status of an address
/// @param from the address whose allowedFrom status is being set
/// @param isAllowedFrom the new allowedFrom status
function setAllowedFrom(
⋮----
/// @notice This function allows the owner to set the allowedTo status of an address
/// @param to the address whose allowedTo status is being set
/// @param isAllowedTo the new allowedTo status
function setAllowedTo(
⋮----
/// @notice Allows the owner to disable transfer restrictions
function disableTransferRestrictions() external onlyOwner {
⋮----
/// @notice This function allows minter to mint tokens
function mint() external {
⋮----
/// @notice This function allows bEIGEN holders to wrap their tokens into Eigen
function wrap(
⋮----
/// @notice This function allows Eigen holders to unwrap their tokens into bEIGEN
function unwrap(
⋮----
/// @notice Allows the sender to transfer tokens to multiple addresses in a single transaction
function multisend(
⋮----
/// @notice Overrides the beforeTokenTransfer function to enforce transfer restrictions
/// @param from the address tokens are being transferred from
/// @param to the address tokens are being transferred to
/// @param amount the amount of tokens being transferred
function _beforeTokenTransfer(
⋮----
// if transfer restrictions are enabled
⋮----
// if both from and to are not whitelisted
⋮----
/// @notice Overridden to return the total bEIGEN supply instead.
/// @dev The issued supply of EIGEN should match the bEIGEN balance of this contract,
/// less any bEIGEN tokens that were sent directly to the contract (rather than being wrapped)
function totalSupply() public view override returns (uint256) {
⋮----
/// @dev Clock used for flagging checkpoints. Has been overridden to implement timestamp based
/// checkpoints (and voting).
function clock() public view override returns (uint48) {
⋮----
/// @dev Machine-readable description of the clock as specified in EIP-6372.
/// 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() public pure override returns (string memory) {
````

## File: src/test/harnesses/AllocationManagerHarness.sol
````
// SPDX-License-Identifier: BUSL-1.1
⋮----
import "../../contracts/core/AllocationManager.sol";
import "forge-std/Test.sol";
import "../TestConstants.sol";
⋮----
contract AllocationManagerHarness is AllocationManager {
⋮----
function deallocationQueueAtIndex(address operator, IStrategy strategy, uint index) external view returns (bytes32) {
⋮----
function setSlasherToZero(OperatorSet memory operatorSet) external {
⋮----
/// @notice Returns the raw SlasherParams struct from storage for testing purposes.
/// @dev This bypasses the in-memory application of pending slasher that getSlasher() does.
function getSlasherParams(OperatorSet memory operatorSet) external view returns (SlasherParams memory) {
⋮----
/// @notice Returns the raw AllocationDelayInfo struct from storage for testing purposes.
/// @dev This bypasses the in-memory application of pending delay that getAllocationDelay() does.
function getAllocationDelayInfoRaw(address operator) external view returns (AllocationDelayInfo memory) {
````

## File: src/test/harnesses/DelegationManagerHarness.sol
````
// SPDX-License-Identifier: BUSL-1.1
⋮----
import "../../contracts/core/DelegationManager.sol";
import "forge-std/Test.sol";
import "../TestConstants.sol";
⋮----
contract DelegationManagerHarness is DelegationManager {
⋮----
function getSlashingFactor(address staker, IStrategy strategy, uint64 operatorMaxMagnitude) external view returns (uint) {
⋮----
function getSlashingFactors(address staker, address operator, IStrategy[] memory strategies) external view returns (uint[] memory) {
⋮----
function getSlashingFactorsAtBlock(address staker, address operator, IStrategy[] memory strategies, uint32 blockNumber)
````

## File: src/test/harnesses/EigenHarness.sol
````
// SPDX-License-Identifier: UNLICENSED
⋮----
import "../../contracts/token/Eigen.sol";
import "../TestConstants.sol";
⋮----
contract EigenHarness is Eigen {
⋮----
/// expose internal mint function
function mint(address to, uint amount) public {
⋮----
/// @notice This function allows the owner to set the allowedFrom status of an address
/// @param from the address whose allowedFrom status is being set
/// @param isAllowedFrom the new allowedFrom status
/// @dev this function is callable by anoyone in the harness
function setAllowedFromPermissionless(address from, bool isAllowedFrom) external {
⋮----
function setTransferRestrictionsDisabledAfterToMax() external {
⋮----
function transferOwnershipPermissionless(address newOwner) external {
````

## File: src/test/harnesses/EigenPodHarness.sol
````
// SPDX-License-Identifier: BUSL-1.1
⋮----
import "../../contracts/pods/EigenPod.sol";
import "forge-std/Test.sol";
⋮----
contract EigenPodHarness is EigenPod {
⋮----
function getActiveValidatorCount() public view returns (uint) {
⋮----
function setActiveValidatorCount(uint _count) public {
⋮----
function verifyWithdrawalCredentials(
⋮----
function setValidatorStatus(bytes32 pkhash, VALIDATOR_STATUS status) public {
⋮----
function setValidatorRestakedBalance(bytes32 pkhash, uint64 restakedBalanceGwei) public {
````

## File: src/test/harnesses/EigenPodManagerWrapper.sol
````
// SPDX-License-Identifier: BUSL-1.1
⋮----
import "../../contracts/pods/EigenPodManager.sol";
⋮----
///@notice This contract exposes a manual setter for podShares in order to initialize podShares as negative
contract EigenPodManagerWrapper is EigenPodManager {
⋮----
function setPodOwnerShares(address owner, IEigenPod pod) external {
⋮----
function setPodOwnerShares(address owner, int shares) external {
⋮----
function setBeaconChainSlashingFactor(address podOwner, uint64 slashingFactor) external {
````

## File: src/test/harnesses/PausableHarness.sol
````
// SPDX-License-Identifier: BUSL-1.1
⋮----
import "../../contracts/permissions/Pausable.sol";
⋮----
// wrapper around the Pausable contract that exposes the internal `_setPausedStatus` function.
contract PausableHarness is Pausable {
⋮----
function initializePauser(uint initPausedStatus) external {
````

## File: src/test/integration/deprecatedInterfaces/mainnet/BeaconChainProofs.sol
````
// SPDX-License-Identifier: BUSL-1.1
⋮----
import "src/contracts/libraries/Merkle.sol";
import "src/contracts/libraries/Endian.sol";
⋮----
// DEPRECATED BeaconChainProofs at commit hash https://github.com/Layr-Labs/eigenlayer-contracts/tree/0139d6213927c0a7812578899ddd3dda58051928
//Utility library for parsing and PHASE0 beacon chain block headers
//SSZ Spec: https://github.com/ethereum/consensus-specs/blob/dev/ssz/simple-serialize.md#merkleization
//BeaconBlockHeader Spec: https://github.com/ethereum/consensus-specs/blob/dev/specs/phase0/beacon-chain.md#beaconblockheader
//BeaconState Spec: https://github.com/ethereum/consensus-specs/blob/dev/specs/phase0/beacon-chain.md#beaconstate
⋮----
// constants are the number of fields and the heights of the different merkle trees used in merkleizing beacon chain containers
⋮----
// HISTORICAL_ROOTS_LIMIT	 = 2**24, so tree height is 24
⋮----
// HISTORICAL_BATCH is root of state_roots and block_root, so number of leaves =  2^1
⋮----
// SLOTS_PER_HISTORICAL_ROOT = 2**13, so tree height is 13
⋮----
// tree height for hash tree of an individual withdrawal container
⋮----
//refer to the eigenlayer-cli proof library.  Despite being the same dimensions as the validator tree, the balance tree is merkleized differently
⋮----
// MAX_WITHDRAWALS_PER_PAYLOAD = 2**4, making tree height = 4
⋮----
//in beacon block body
⋮----
// in beacon block header
⋮----
// in beacon state
⋮----
// in validator
⋮----
// in execution payload header
⋮----
//in execution payload
⋮----
// in withdrawal
⋮----
//In historicalBatch
⋮----
//Misc Constants
⋮----
///
/// @notice This function is parses the balanceRoot to get the uint64 balance of a validator.  During merkleization of the
/// beacon state balance tree, four uint64 values (making 32 bytes) are grouped together and treated as a single leaf in the merkle tree. Thus the
/// validatorIndex mod 4 is used to determine which of the four uint64 values to extract from the balanceRoot.
/// @param validatorIndex is the index of the validator being proven for.
/// @param balanceRoot is the combination of 4 validator balances being proven for.
/// @return The validator's balance, in Gwei
function getBalanceFromBalanceRoot(uint40 validatorIndex, bytes32 balanceRoot) internal pure returns (uint64) {
⋮----
/// @notice This function verifies merkle proofs of the fields of a certain validator against a beacon chain state root
/// @param validatorIndex the index of the proven validator
/// @param beaconStateRoot is the beacon chain state root to be proven against.
/// @param proof is the data used in proving the validator's fields
/// @param validatorFields the claimed fields of the validator
function verifyValidatorFields(uint40 validatorIndex, bytes32 beaconStateRoot, bytes calldata proof, bytes32[] calldata validatorFields)
⋮----
/// Note: the length of the validator merkle proof is BeaconChainProofs.VALIDATOR_TREE_HEIGHT + 1.
/// There is an additional layer added by hashing the root with the length of the validator list
⋮----
// merkleize the validatorFields to get the leaf to prove
⋮----
// verify the proof of the validatorRoot against the beaconStateRoot
⋮----
/// @notice This function verifies merkle proofs of the balance of a certain validator against a beacon chain state root
⋮----
/// @param proof is the proof of the balance against the beacon chain state root
/// @param balanceRoot is the serialized balance used to prove the balance of the validator (refer to `getBalanceFromBalanceRoot` above for detailed explanation)
function verifyValidatorBalance(uint40 validatorIndex, bytes32 beaconStateRoot, bytes calldata proof, bytes32 balanceRoot)
⋮----
/// the beacon state's balance list is a list of uint64 values, and these are grouped together in 4s when merkleized.
/// Therefore, the index of the balance of a validator is validatorIndex/4
⋮----
/// @notice This function verifies the slot and the withdrawal fields for a given withdrawal
⋮----
/// @param proofs is the provided set of merkle proofs
/// @param withdrawalFields is the serialized withdrawal container to be proven
function verifyWithdrawalProofs(bytes32 beaconStateRoot, WithdrawalProofs calldata proofs, bytes32[] calldata withdrawalFields)
⋮----
// verify the block header proof length
⋮----
/// Computes the block_header_index relative to the beaconStateRoot.  It concatenates the indexes of all the
/// intermediate root indexes from the bottom of the sub trees (the block header container) to the top of the tree
⋮----
// Verify the blockHeaderRoot against the beaconStateRoot
⋮----
//Next we verify the slot against the blockHeaderRoot
⋮----
// Next we verify the executionPayloadRoot against the blockHeaderRoot
⋮----
// Next we verify the blockNumberRoot against the executionPayload root
⋮----
/// Next we verify the withdrawal fields against the blockHeaderRoot:
/// First we compute the withdrawal_index relative to the blockHeaderRoot by concatenating the indexes of all the
/// intermediate root indexes from the bottom of the sub trees (the withdrawal container) to the top, the blockHeaderRoot.
/// Then we calculate merkleize the withdrawalFields container to calculate the the withdrawalRoot.
/// Finally we verify the withdrawalRoot against the executionPayloadRoot.
````

## File: src/test/integration/deprecatedInterfaces/mainnet/IAllocationManager.sol
````
// SPDX-License-Identifier: BUSL-1.1
⋮----
import "src/contracts/interfaces/IStrategy.sol";
⋮----
/// @notice Interface of the allocationManager prior to redistribution.
/// @dev The interface remains the exact same, except `SlashOperator` does not return the slashID or shares
/// @dev This interface is the minimal possibl interface needed for the redistribution upgrade test
interface IAllocationManager_PreRedistribution {
/// @notice Struct containing parameters to slashing
/// @param operator the address to slash
/// @param operatorSetId the ID of the operatorSet the operator is being slashed on behalf of
/// @param strategies the set of strategies to slash
/// @param wadsToSlash the parts in 1e18 to slash, this will be proportional to the operator's
/// slashable stake allocation for the operatorSet
/// @param description the description of the slashing provided by the AVS for legibility
⋮----
/// @notice Called by an AVS to slash an operator in a given operator set. The operator must be registered
/// and have slashable stake allocated to the operator set.
///
/// @param avs The AVS address initiating the slash.
/// @param params The slashing parameters, containing:
///  - operator: The operator to slash.
///  - operatorSetId: The ID of the operator set the operator is being slashed from.
///  - strategies: Array of strategies to slash allocations from (must be in ascending order).
///  - wadsToSlash: Array of proportions to slash from each strategy (must be between 0 and 1e18).
///  - description: Description of why the operator was slashed.
⋮----
/// @dev For each strategy:
///      1. Reduces the operator's current allocation magnitude by wadToSlash proportion.
///      2. Reduces the strategy's max and encumbered magnitudes proportionally.
///      3. If there is a pending deallocation, reduces it proportionally.
///      4. Updates the operator's shares in the DelegationManager.
⋮----
/// @dev Small slashing amounts may not result in actual token burns due to
///      rounding, which will result in small amounts of tokens locked in the contract
///      rather than fully burning through the burn mechanism.
function slashOperator(address avs, SlashingParams calldata params) external;
````

## File: src/test/integration/deprecatedInterfaces/mainnet/IBeaconChainOracle.sol
````
// SPDX-License-Identifier: BUSL-1.1
⋮----
/// @notice DEPRECATED INTERFACE at commit hash https://github.com/Layr-Labs/eigenlayer-contracts/tree/0139d6213927c0a7812578899ddd3dda58051928
/// @title Interface for the BeaconStateOracle contract.
/// @author Layr Labs, Inc.
/// @notice Terms of Service: https://docs.eigenlayer.xyz/overview/terms-of-service
interface IBeaconChainOracle_DeprecatedM1 {
/// @notice Largest blockNumber that has been confirmed by the oracle.
function latestConfirmedOracleBlockNumber() external view returns (uint64);
/// @notice Mapping: Beacon Chain blockNumber => the Beacon Chain state root at the specified blockNumber.
/// @dev This will return `bytes32(0)` if the state root at the specified blockNumber is not yet confirmed.
function beaconStateRootAtBlockNumber(uint64 blockNumber) external view returns (bytes32);
⋮----
/// @notice Mapping: address => whether or not the address is in the set of oracle signers.
function isOracleSigner(address _oracleSigner) external view returns (bool);
⋮----
/// @notice Mapping: Beacon Chain blockNumber => oracle signer address => whether or not the oracle signer has voted on the state root at the blockNumber.
function hasVoted(uint64 blockNumber, address oracleSigner) external view returns (bool);
⋮----
/// @notice Mapping: Beacon Chain blockNumber => state root => total number of oracle signer votes for the state root at the blockNumber.
function stateRootVotes(uint64 blockNumber, bytes32 stateRoot) external view returns (uint);
⋮----
/// @notice Total number of members of the set of oracle signers.
function totalOracleSigners() external view returns (uint);
⋮----
/// @notice Number of oracle signers that must vote for a state root in order for the state root to be confirmed.
/// Adjustable by this contract's owner through use of the `setThreshold` function.
/// @dev We note that there is an edge case -- when the threshold is adjusted downward, if a state root already has enough votes to meet the *new* threshold,
/// the state root must still receive one additional vote from an oracle signer to be confirmed. This behavior is intended, to minimize unexpected root confirmations.
function threshold() external view returns (uint);
⋮----
/// @notice Owner-only function used to modify the value of the `threshold` variable.
/// @param _threshold Desired new value for the `threshold` variable. Function will revert if this is set to zero.
function setThreshold(uint _threshold) external;
⋮----
/// @notice Owner-only function used to add a signer to the set of oracle signers.
/// @param _oracleSigners Array of address to be added to the set.
/// @dev Function will have no effect on the i-th input address if `_oracleSigners[i]`is already in the set of oracle signers.
function addOracleSigners(address[] memory _oracleSigners) external;
⋮----
/// @notice Owner-only function used to remove a signer from the set of oracle signers.
/// @param _oracleSigners Array of address to be removed from the set.
/// @dev Function will have no effect on the i-th input address if `_oracleSigners[i]`is already not in the set of oracle signers.
function removeOracleSigners(address[] memory _oracleSigners) external;
⋮----
/// @notice Called by a member of the set of oracle signers to assert that the Beacon Chain state root is `stateRoot` at `blockNumber`.
/// @dev The state root will be finalized once the total number of votes *for this exact state root at this exact blockNumber* meets the `threshold` value.
/// @param blockNumber The Beacon Chain blockNumber of interest.
/// @param stateRoot The Beacon Chain state root that the caller asserts was the correct root, at the specified `blockNumber`.
function voteForBeaconChainStateRoot(uint64 blockNumber, bytes32 stateRoot) external;
````

## File: src/test/integration/deprecatedInterfaces/mainnet/IDelayedWithdrawalRouter.sol
````
// SPDX-License-Identifier: BUSL-1.1
⋮----
/// @notice DEPRECATED INTERFACE at commit hash https://github.com/Layr-Labs/eigenlayer-contracts/tree/0139d6213927c0a7812578899ddd3dda58051928
interface IDelayedWithdrawalRouter_DeprecatedM1 {
// struct used to pack data into a single storage slot
⋮----
// struct used to store a single users delayedWithdrawal data
⋮----
/// @notice Creates an delayed withdrawal for `msg.value` to the `recipient`.
/// @dev Only callable by the `podOwner`'s EigenPod contract.
function createDelayedWithdrawal(address podOwner, address recipient) external payable;
⋮----
/// @notice Called in order to withdraw delayed withdrawals made to the `recipient` that have passed the `withdrawalDelayBlocks` period.
/// @param recipient The address to claim delayedWithdrawals for.
/// @param maxNumberOfWithdrawalsToClaim Used to limit the maximum number of withdrawals to loop through claiming.
function claimDelayedWithdrawals(address recipient, uint maxNumberOfWithdrawalsToClaim) external;
⋮----
/// @notice Called in order to withdraw delayed withdrawals made to the caller that have passed the `withdrawalDelayBlocks` period.
⋮----
function claimDelayedWithdrawals(uint maxNumberOfWithdrawalsToClaim) external;
⋮----
/// @notice Owner-only function for modifying the value of the `withdrawalDelayBlocks` variable.
function setWithdrawalDelayBlocks(uint newValue) external;
⋮----
/// @notice Getter function for the mapping `_userWithdrawals`
function userWithdrawals(address user) external view returns (UserDelayedWithdrawals memory);
⋮----
/// @notice Getter function to get all delayedWithdrawals of the `user`
function getUserDelayedWithdrawals(address user) external view returns (DelayedWithdrawal[] memory);
⋮----
/// @notice Getter function to get all delayedWithdrawals that are currently claimable by the `user`
function getClaimableUserDelayedWithdrawals(address user) external view returns (DelayedWithdrawal[] memory);
⋮----
/// @notice Getter function for fetching the delayedWithdrawal at the `index`th entry from the `_userWithdrawals[user].delayedWithdrawals` array
function userDelayedWithdrawalByIndex(address user, uint index) external view returns (DelayedWithdrawal memory);
⋮----
/// @notice Getter function for fetching the length of the delayedWithdrawals array of a specific user
function userWithdrawalsLength(address user) external view returns (uint);
⋮----
/// @notice Convenience function for checking whether or not the delayedWithdrawal at the `index`th entry from the `_userWithdrawals[user].delayedWithdrawals` array is currently claimable
function canClaimDelayedWithdrawal(address user, uint index) external view returns (bool);
⋮----
/// @notice Delay enforced by this contract for completing any delayedWithdrawal. Measured in blocks, and adjustable by this contract's owner,
/// up to a maximum of `MAX_WITHDRAWAL_DELAY_BLOCKS`. Minimum value is 0 (i.e. no delay enforced).
function withdrawalDelayBlocks() external view returns (uint);
````

## File: src/test/integration/deprecatedInterfaces/mainnet/IDelegationManager.sol
````
// SPDX-License-Identifier: BUSL-1.1
⋮----
import "src/contracts/interfaces/IStrategy.sol";
import "src/contracts/interfaces/IPausable.sol";
import "src/contracts/interfaces/ISignatureUtilsMixin.sol";
⋮----
/// @notice M2 DEPRECATED INTERFACE at commit hash https://github.com/Layr-Labs/eigenlayer-contracts/tree/426f461c59b4f0e16f8becdffd747075edcaded8
/// @title Interface for delegation & withdrawal of funds in EigenLayer.
/// @author Layr Labs, Inc.
/// @notice Terms of Service: https://docs.eigenlayer.xyz/overview/terms-of-service
interface IDelegationManager_DeprecatedM2 is IPausable, ISignatureUtilsMixin {
// @notice Struct used for storing information about a single operator who has registered with EigenLayer
⋮----
/// @notice DEPRECATED -- this field is no longer used, payments are handled in PaymentCoordinator.sol
⋮----
/// @notice Address to verify signatures when a staker wishes to delegate to the operator, as well as controlling "forced undelegations".
/// @dev Signature verification follows these rules:
/// 1) If this address is left as address(0), then any staker will be free to delegate to the operator, i.e. no signature verification will be performed.
/// 2) If this address is an EOA (i.e. it has no code), then we follow standard ECDSA signature verification for delegations to the operator.
/// 3) If this address is a contract (i.e. it has code) then we forward a call to the contract and verify that it returns the correct EIP-1271 "magic value".
⋮----
/// @notice A minimum delay -- measured in blocks -- enforced between:
/// 1) the operator signalling their intent to register for a service, via calling `Slasher.optIntoSlashing`
/// and
/// 2) the operator completing registration for the service, via the service ultimately calling `Slasher.recordFirstStakeUpdate`
/// @dev note that for a specific operator, this value *cannot decrease*, i.e. if the operator wishes to modify their OperatorDetails,
/// then they are only allowed to either increase this value or keep it the same.
⋮----
/// @notice Abstract struct used in calculating an EIP712 signature for a staker to approve that they (the staker themselves) delegate to a specific operator.
/// @dev Used in computing the `STAKER_DELEGATION_TYPEHASH` and as a reference in the computation of the stakerDigestHash in the `delegateToBySignature` function.
⋮----
// the staker who is delegating
⋮----
// the operator being delegated to
⋮----
// the staker's nonce
⋮----
// the expiration timestamp (UTC) of the signature
⋮----
/// @notice Abstract struct used in calculating an EIP712 signature for an operator's delegationApprover to approve that a specific staker delegate to the operator.
/// @dev Used in computing the `DELEGATION_APPROVAL_TYPEHASH` and as a reference in the computation of the approverDigestHash in the `_delegate` function.
⋮----
// the operator's provided salt
⋮----
/// Struct type used to specify an existing queued withdrawal. Rather than storing the entire struct, only a hash is stored.
/// In functions that operate on existing queued withdrawals -- e.g. completeQueuedWithdrawal`, the data is resubmitted and the hash of the submitted
/// data is computed by `calculateWithdrawalRoot` and checked against the stored hash in order to confirm the integrity of the submitted data.
⋮----
// The address that originated the Withdrawal
⋮----
// The address that the staker was delegated to at the time that the Withdrawal was created
⋮----
// The address that can complete the Withdrawal + will receive funds when completing the withdrawal
⋮----
// Nonce used to guarantee that otherwise identical withdrawals have unique hashes
⋮----
// Block number when the Withdrawal was created
⋮----
// Array of strategies that the Withdrawal contains
⋮----
// Array containing the amount of shares in each Strategy in the `strategies` array
⋮----
// Array of strategies that the QueuedWithdrawal contains
⋮----
// The address of the withdrawer
⋮----
/// @notice Registers the caller as an operator in EigenLayer.
/// @param registeringOperatorDetails is the `OperatorDetails` for the operator.
/// @param metadataURI is a URI for the operator's metadata, i.e. a link providing more details on the operator.
///
/// @dev Once an operator is registered, they cannot 'deregister' as an operator, and they will forever be considered "delegated to themself".
/// @dev This function will revert if the caller is already delegated to an operator.
/// @dev Note that the `metadataURI` is *never stored * and is only emitted in the `OperatorMetadataURIUpdated` event
function registerAsOperator(OperatorDetails calldata registeringOperatorDetails, string calldata metadataURI) external;
⋮----
/// @notice Updates an operator's stored `OperatorDetails`.
/// @param newOperatorDetails is the updated `OperatorDetails` for the operator, to replace their current OperatorDetails`.
⋮----
/// @dev The caller must have previously registered as an operator in EigenLayer.
function modifyOperatorDetails(OperatorDetails calldata newOperatorDetails) external;
⋮----
/// @notice Called by an operator to emit an `OperatorMetadataURIUpdated` event indicating the information has updated.
/// @param metadataURI The URI for metadata associated with an operator
⋮----
function updateOperatorMetadataURI(string calldata metadataURI) external;
⋮----
/// @notice Caller delegates their stake to an operator.
/// @param operator The account (`msg.sender`) is delegating its assets to for use in serving applications built on EigenLayer.
/// @param approverSignatureAndExpiry Verifies the operator approves of this delegation
/// @param approverSalt A unique single use value tied to an individual signature.
/// @dev The approverSignatureAndExpiry is used in the event that:
///          1) the operator's `delegationApprover` address is set to a non-zero value.
///                  AND
///          2) neither the operator nor their `delegationApprover` is the `msg.sender`, since in the event that the operator
///             or their delegationApprover is the `msg.sender`, then approval is assumed.
/// @dev In the event that `approverSignatureAndExpiry` is not checked, its content is ignored entirely; it's recommended to use an empty input
/// in this case to save on complexity + gas costs
function delegateTo(address operator, SignatureWithExpiry memory approverSignatureAndExpiry, bytes32 approverSalt) external;
⋮----
/// @notice Caller delegates a staker's stake to an operator with valid signatures from both parties.
/// @param staker The account delegating stake to an `operator` account
/// @param operator The account (`staker`) is delegating its assets to for use in serving applications built on EigenLayer.
/// @param stakerSignatureAndExpiry Signed data from the staker authorizing delegating stake to an operator
/// @param approverSignatureAndExpiry is a parameter that will be used for verifying that the operator approves of this delegation action in the event that:
/// @param approverSalt Is a salt used to help guarantee signature uniqueness. Each salt can only be used once by a given approver.
⋮----
/// @dev If `staker` is an EOA, then `stakerSignature` is verified to be a valid ECDSA stakerSignature from `staker`, indicating their intention for this action.
/// @dev If `staker` is a contract, then `stakerSignature` will be checked according to EIP-1271.
/// @dev the operator's `delegationApprover` address is set to a non-zero value.
/// @dev neither the operator nor their `delegationApprover` is the `msg.sender`, since in the event that the operator or their delegationApprover
/// is the `msg.sender`, then approval is assumed.
/// @dev This function will revert if the current `block.timestamp` is equal to or exceeds the expiry
/// @dev In the case that `approverSignatureAndExpiry` is not checked, its content is ignored entirely; it's recommended to use an empty input
⋮----
function delegateToBySignature(
⋮----
/// @notice Undelegates the staker from the operator who they are delegated to. Puts the staker into the "undelegation limbo" mode of the EigenPodManager
/// and queues a withdrawal of all of the staker's shares in the StrategyManager (to the staker), if necessary.
/// @param staker The account to be undelegated.
/// @return withdrawalRoot The root of the newly queued withdrawal, if a withdrawal was queued. Otherwise just bytes32(0).
⋮----
/// @dev Reverts if the `staker` is also an operator, since operators are not allowed to undelegate from themselves.
/// @dev Reverts if the caller is not the staker, nor the operator who the staker is delegated to, nor the operator's specified "delegationApprover"
/// @dev Reverts if the `staker` is already undelegated.
function undelegate(address staker) external returns (bytes32[] memory withdrawalRoot);
⋮----
/// Allows a staker to withdraw some shares. Withdrawn shares/strategies are immediately removed
/// from the staker. If the staker is delegated, withdrawn shares/strategies are also removed from
/// their operator.
⋮----
/// All withdrawn shares/strategies are placed in a queue and can be fully withdrawn after a delay.
function queueWithdrawals(QueuedWithdrawalParams[] calldata queuedWithdrawalParams) external returns (bytes32[] memory);
⋮----
/// @notice Used to complete the specified `withdrawal`. The caller must match `withdrawal.withdrawer`
/// @param withdrawal The Withdrawal to complete.
/// @param tokens Array in which the i-th entry specifies the `token` input to the 'withdraw' function of the i-th Strategy in the `withdrawal.strategies` array.
/// This input can be provided with zero length if `receiveAsTokens` is set to 'false' (since in that case, this input will be unused)
/// @param middlewareTimesIndex is the index in the operator that the staker who triggered the withdrawal was delegated to's middleware times array
/// @param receiveAsTokens If true, the shares specified in the withdrawal will be withdrawn from the specified strategies themselves
/// and sent to the caller, through calls to `withdrawal.strategies[i].withdraw`. If false, then the shares in the specified strategies
/// will simply be transferred to the caller directly.
/// @dev middlewareTimesIndex is unused, but will be used in the Slasher eventually
/// @dev beaconChainETHStrategy shares are non-transferrable, so if `receiveAsTokens = false` and `withdrawal.withdrawer != withdrawal.staker`, note that
/// any beaconChainETHStrategy shares in the `withdrawal` will be _returned to the staker_, rather than transferred to the withdrawer, unlike shares in
/// any other strategies, which will be transferred to the withdrawer.
function completeQueuedWithdrawal(
⋮----
/// @notice Array-ified version of `completeQueuedWithdrawal`.
/// Used to complete the specified `withdrawals`. The function caller must match `withdrawals[...].withdrawer`
/// @param withdrawals The Withdrawals to complete.
/// @param tokens Array of tokens for each Withdrawal. See `completeQueuedWithdrawal` for the usage of a single array.
/// @param middlewareTimesIndexes One index to reference per Withdrawal. See `completeQueuedWithdrawal` for the usage of a single index.
/// @param receiveAsTokens Whether or not to complete each withdrawal as tokens. See `completeQueuedWithdrawal` for the usage of a single boolean.
/// @dev See `completeQueuedWithdrawal` for relevant dev tags
function completeQueuedWithdrawals(
⋮----
/// @notice Increases a staker's delegated share balance in a strategy.
/// @param staker The address to increase the delegated shares for their operator.
/// @param strategy The strategy in which to increase the delegated shares.
/// @param shares The number of shares to increase.
⋮----
/// @dev *If the staker is actively delegated*, then increases the `staker`'s delegated shares in `strategy` by `shares`. Otherwise does nothing.
/// @dev Callable only by the StrategyManager or EigenPodManager.
function increaseDelegatedShares(address staker, IStrategy strategy, uint shares) external;
⋮----
/// @notice Decreases a staker's delegated share balance in a strategy.
⋮----
/// @param strategy The strategy in which to decrease the delegated shares.
/// @param shares The number of shares to decrease.
⋮----
/// @dev *If the staker is actively delegated*, then decreases the `staker`'s delegated shares in `strategy` by `shares`. Otherwise does nothing.
⋮----
function decreaseDelegatedShares(address staker, IStrategy strategy, uint shares) external;
⋮----
/// @notice Owner-only function for modifying the value of the `minWithdrawalDelayBlocks` variable.
/// @param newMinWithdrawalDelayBlocks new value of `minWithdrawalDelayBlocks`.
function setMinWithdrawalDelayBlocks(uint newMinWithdrawalDelayBlocks) external;
⋮----
/// @notice Called by owner to set the minimum withdrawal delay blocks for each passed in strategy
/// Note that the min number of blocks to complete a withdrawal of a strategy is
/// MAX(minWithdrawalDelayBlocks, strategyWithdrawalDelayBlocks[strategy])
/// @param strategies The strategies to set the minimum withdrawal delay blocks for
/// @param withdrawalDelayBlocks The minimum withdrawal delay blocks to set for each strategy
function setStrategyWithdrawalDelayBlocks(IStrategy[] calldata strategies, uint[] calldata withdrawalDelayBlocks) external;
⋮----
/// @notice returns the address of the operator that `staker` is delegated to.
/// @notice Mapping: staker => operator whom the staker is currently delegated to.
/// @dev Note that returning address(0) indicates that the staker is not actively delegated to any operator.
function delegatedTo(address staker) external view returns (address);
⋮----
/// @notice Returns the OperatorDetails struct associated with an `operator`.
function operatorDetails(address operator) external view returns (OperatorDetails memory);
⋮----
/// @notice Returns the delegationApprover account for an operator
function delegationApprover(address operator) external view returns (address);
⋮----
/// @notice Returns the stakerOptOutWindowBlocks for an operator
function stakerOptOutWindowBlocks(address operator) external view returns (uint);
⋮----
/// @notice Given array of strategies, returns array of shares for the operator
function getOperatorShares(address operator, IStrategy[] memory strategies) external view returns (uint[] memory);
⋮----
/// @notice Given a list of strategies, return the minimum number of blocks that must pass to withdraw
/// from all the inputted strategies. Return value is >= minWithdrawalDelayBlocks as this is the global min withdrawal delay.
/// @param strategies The strategies to check withdrawal delays for
function getWithdrawalDelay(IStrategy[] calldata strategies) external view returns (uint);
⋮----
/// @notice returns the total number of shares in `strategy` that are delegated to `operator`.
/// @notice Mapping: operator => strategy => total number of shares in the strategy delegated to the operator.
/// @dev By design, the following invariant should hold for each Strategy:
/// (operator's shares in delegation manager) = sum (shares above zero of all stakers delegated to operator)
/// = sum (delegateable shares of all stakers delegated to the operator)
function operatorShares(address operator, IStrategy strategy) external view returns (uint);
⋮----
/// @notice Returns the number of actively-delegatable shares a staker has across all strategies.
/// @dev Returns two empty arrays in the case that the Staker has no actively-delegateable shares.
function getDelegatableShares(address staker) external view returns (IStrategy[] memory, uint[] memory);
⋮----
/// @notice Returns 'true' if `staker` *is* actively delegated, and 'false' otherwise.
function isDelegated(address staker) external view returns (bool);
⋮----
/// @notice Returns true is an operator has previously registered for delegation.
function isOperator(address operator) external view returns (bool);
⋮----
/// @notice Mapping: staker => number of signed delegation nonces (used in `delegateToBySignature`) from the staker that the contract has already checked
function stakerNonce(address staker) external view returns (uint);
⋮----
/// @notice Mapping: delegationApprover => 32-byte salt => whether or not the salt has already been used by the delegationApprover.
/// @dev Salts are used in the `delegateTo` and `delegateToBySignature` functions. Note that these functions only process the delegationApprover's
/// signature + the provided salt if the operator being delegated to has specified a nonzero address as their `delegationApprover`.
function delegationApproverSaltIsSpent(address _delegationApprover, bytes32 salt) external view returns (bool);
⋮----
/// @notice Minimum delay enforced by this contract for completing queued withdrawals. Measured in blocks, and adjustable by this contract's owner,
/// up to a maximum of `MAX_WITHDRAWAL_DELAY_BLOCKS`. Minimum value is 0 (i.e. no delay enforced).
/// Note that strategies each have a separate withdrawal delay, which can be greater than this value. So the minimum number of blocks that must pass
/// to withdraw a strategy is MAX(minWithdrawalDelayBlocks, strategyWithdrawalDelayBlocks[strategy])
function minWithdrawalDelayBlocks() external view returns (uint);
⋮----
/// @notice Minimum delay enforced by this contract per Strategy for completing queued withdrawals. Measured in blocks, and adjustable by this contract's owner,
⋮----
function strategyWithdrawalDelayBlocks(IStrategy strategy) external view returns (uint);
⋮----
/// @notice return address of the beaconChainETHStrategy
function beaconChainETHStrategy() external view returns (IStrategy);
⋮----
/// @notice Calculates the digestHash for a `staker` to sign to delegate to an `operator`
/// @param staker The signing staker
/// @param operator The operator who is being delegated to
/// @param expiry The desired expiry time of the staker's signature
function calculateCurrentStakerDelegationDigestHash(address staker, address operator, uint expiry) external view returns (bytes32);
⋮----
/// @notice Calculates the digest hash to be signed and used in the `delegateToBySignature` function
⋮----
/// @param _stakerNonce The nonce of the staker. In practice we use the staker's current nonce, stored at `stakerNonce[staker]`
⋮----
function calculateStakerDelegationDigestHash(address staker, uint _stakerNonce, address operator, uint expiry)
⋮----
/// @notice Calculates the digest hash to be signed by the operator's delegationApprove and used in the `delegateTo` and `delegateToBySignature` functions.
/// @param staker The account delegating their stake
/// @param operator The account receiving delegated stake
/// @param _delegationApprover the operator's `delegationApprover` who will be signing the delegationHash (in general)
/// @param approverSalt A unique and single use value associated with the approver signature.
/// @param expiry Time after which the approver's signature becomes invalid
function calculateDelegationApprovalDigestHash(
⋮----
/// @notice The EIP-712 typehash for the contract's domain
function DOMAIN_TYPEHASH() external view returns (bytes32);
⋮----
/// @notice The EIP-712 typehash for the StakerDelegation struct used by the contract
function STAKER_DELEGATION_TYPEHASH() external view returns (bytes32);
⋮----
/// @notice The EIP-712 typehash for the DelegationApproval struct used by the contract
function DELEGATION_APPROVAL_TYPEHASH() external view returns (bytes32);
⋮----
/// @notice Getter function for the current EIP-712 domain separator for this contract.
⋮----
/// @dev The domain separator will change in the event of a fork that changes the ChainID.
/// @dev By introducing a domain separator the DApp developers are guaranteed that there can be no signature collision.
/// for more detailed information please read EIP-712.
function domainSeparator() external view returns (bytes32);
⋮----
/// @notice Mapping: staker => cumulative number of queued withdrawals they have ever initiated.
/// @dev This only increments (doesn't decrement), and is used to help ensure that otherwise identical withdrawals have unique hashes.
function cumulativeWithdrawalsQueued(address staker) external view returns (uint);
⋮----
/// @notice Returns the keccak256 hash of `withdrawal`.
function calculateWithdrawalRoot(Withdrawal memory withdrawal) external pure returns (bytes32);
````

## File: src/test/integration/deprecatedInterfaces/mainnet/IEigenPod.sol
````
// SPDX-License-Identifier: BUSL-1.1
⋮----
import "./BeaconChainProofs.sol";
import "./IEigenPodManager.sol";
⋮----
/// @notice M2 DEPRECATED INTERFACE at commit hash https://github.com/Layr-Labs/eigenlayer-contracts/tree/426f461c59b4f0e16f8becdffd747075edcaded8
/// @title The implementation contract used for restaking beacon chain ETH on EigenLayer
/// @author Layr Labs, Inc.
/// @notice Terms of Service: https://docs.eigenlayer.xyz/overview/terms-of-service
interface IEigenPod_DeprecatedM2 {
///
///                                STRUCTS / ENUMS
⋮----
INACTIVE, // doesnt exist
ACTIVE, // staked on ethpos and withdrawal credentials are pointed to the EigenPod
WITHDRAWN // withdrawn from the Beacon Chain
⋮----
// index of the validator in the beacon chain
⋮----
// amount of beacon chain ETH restaked on EigenLayer in gwei
⋮----
//timestamp of the validator's most recent balance update
⋮----
// status of the validator
⋮----
///                       EXTERNAL STATE-CHANGING METHODS
⋮----
/// @notice Used to initialize the pointers to contracts crucial to the pod's functionality, in beacon proxy construction from EigenPodManager
function initialize(address owner) external;
⋮----
/// @notice Called by EigenPodManager when the owner wants to create another ETH validator.
function stake(bytes calldata pubkey, bytes calldata signature, bytes32 depositDataRoot) external payable;
⋮----
/// @notice Transfers `amountWei` in ether from this contract to the specified `recipient` address
/// @notice Called by EigenPodManager to withdrawBeaconChainETH that has been added to the EigenPod's balance due to a withdrawal from the beacon chain.
/// @dev The podOwner must have already proved sufficient withdrawals, so that this pod's `withdrawableRestakedExecutionLayerGwei` exceeds the
/// `amountWei` input (when converted to GWEI).
/// @dev Reverts if `amountWei` is not a whole Gwei amount
function withdrawRestakedBeaconChainETH(address recipient, uint amount) external;
⋮----
/// @dev Create a checkpoint used to prove this pod's active validator set. Checkpoints are completed
/// by submitting one checkpoint proof per ACTIVE validator. During the checkpoint process, the total
/// change in ACTIVE validator balance is tracked, and any validators with 0 balance are marked `WITHDRAWN`.
/// @dev Once finalized, the pod owner is awarded shares corresponding to:
/// - the total change in their ACTIVE validator balances
/// - any ETH in the pod not already awarded shares
/// @dev A checkpoint cannot be created if the pod already has an outstanding checkpoint. If
/// this is the case, the pod owner MUST complete the existing checkpoint before starting a new one.
/// @param revertIfNoBalance Forces a revert if the pod ETH balance is 0. This allows the pod owner
/// to prevent accidentally starting a checkpoint that will not increase their shares
function startCheckpoint(bool revertIfNoBalance) external;
⋮----
/// @dev Progress the current checkpoint towards completion by submitting one or more validator
/// checkpoint proofs. Anyone can call this method to submit proofs towards the current checkpoint.
/// For each validator proven, the current checkpoint's `proofsRemaining` decreases.
/// @dev If the checkpoint's `proofsRemaining` reaches 0, the checkpoint is finalized.
/// (see `_updateCheckpoint` for more details)
/// @dev This method can only be called when there is a currently-active checkpoint.
/// @param balanceContainerProof proves the beacon's current balance container root against a checkpoint's `beaconBlockRoot`
/// @param proofs Proofs for one or more validator current balances against the `balanceContainerRoot`
function verifyCheckpointProofs(
⋮----
/// @dev Verify one or more validators have their withdrawal credentials pointed at this EigenPod, and award
/// shares based on their effective balance. Proven validators are marked `ACTIVE` within the EigenPod, and
/// future checkpoint proofs will need to include them.
/// @dev Withdrawal credential proofs MUST NOT be older than `currentCheckpointTimestamp`.
/// @dev Validators proven via this method MUST NOT have an exit epoch set already.
/// @param beaconTimestamp the beacon chain timestamp sent to the 4788 oracle contract. Corresponds
/// to the parent beacon block root against which the proof is verified.
/// @param stateRootProof proves a beacon state root against a beacon block root
/// @param validatorIndices a list of validator indices being proven
/// @param validatorFieldsProofs proofs of each validator's `validatorFields` against the beacon state root
/// @param validatorFields the fields of the beacon chain "Validator" container. See consensus specs for
/// details: https://github.com/ethereum/consensus-specs/blob/dev/specs/phase0/beacon-chain.md#validator
function verifyWithdrawalCredentials(
⋮----
/// @dev Prove that one of this pod's active validators was slashed on the beacon chain. A successful
/// staleness proof allows the caller to start a checkpoint.
⋮----
/// @dev Note that in order to start a checkpoint, any existing checkpoint must already be completed!
/// (See `_startCheckpoint` for details)
⋮----
/// @dev Note that this method allows anyone to start a checkpoint as soon as a slashing occurs on the beacon
/// chain. This is intended to make it easier to external watchers to keep a pod's balance up to date.
⋮----
/// @dev Note too that beacon chain slashings are not instant. There is a delay between the initial slashing event
/// and the validator's final exit back to the execution layer. During this time, the validator's balance may or
/// may not drop further due to a correlation penalty. This method allows proof of a slashed validator
/// to initiate a checkpoint for as long as the validator remains on the beacon chain. Once the validator
/// has exited and been checkpointed at 0 balance, they are no longer "checkpoint-able" and cannot be proven
/// "stale" via this method.
/// See https://eth2book.info/capella/part3/transition/epoch/#slashings for more info.
⋮----
/// @param proof the fields of the beacon chain "Validator" container, along with a merkle proof against
/// the beacon state root. See the consensus specs for more details:
/// https://github.com/ethereum/consensus-specs/blob/dev/specs/phase0/beacon-chain.md#validator
⋮----
/// @dev Staleness conditions:
/// - Validator's last checkpoint is older than `beaconTimestamp`
/// - Validator MUST be in `ACTIVE` status in the pod
/// - Validator MUST be slashed on the beacon chain
function verifyStaleBalance(
⋮----
/// @notice called by owner of a pod to remove any ERC20s deposited in the pod
function recoverTokens(IERC20[] memory tokenList, uint[] memory amountsToWithdraw, address recipient) external;
⋮----
/// @notice Allows the owner of a pod to update the proof submitter, a permissioned
/// address that can call `startCheckpoint` and `verifyWithdrawalCredentials`.
/// @dev Note that EITHER the podOwner OR proofSubmitter can access these methods,
/// so it's fine to set your proofSubmitter to 0 if you want the podOwner to be the
/// only address that can call these methods.
/// @param newProofSubmitter The new proof submitter address. If set to 0, only the
/// pod owner will be able to call `startCheckpoint` and `verifyWithdrawalCredentials`
function setProofSubmitter(address newProofSubmitter) external;
⋮----
///                                VIEW METHODS
⋮----
/// @notice An address with permissions to call `startCheckpoint` and `verifyWithdrawalCredentials`, set
/// by the podOwner. This role exists to allow a podOwner to designate a hot wallet that can call
/// these methods, allowing the podOwner to remain a cold wallet that is only used to manage funds.
/// @dev If this address is NOT set, only the podOwner can call `startCheckpoint` and `verifyWithdrawalCredentials`
function proofSubmitter() external view returns (address);
⋮----
/// @notice the amount of execution layer ETH in this contract that is staked in EigenLayer (i.e. withdrawn from beaconchain but not EigenLayer),
function withdrawableRestakedExecutionLayerGwei() external view returns (uint64);
⋮----
/// @notice The single EigenPodManager for EigenLayer
function eigenPodManager() external view returns (IEigenPodManager);
⋮----
/// @notice The owner of this EigenPod
function podOwner() external view returns (address);
⋮----
/// @notice Returns the validatorInfo struct for the provided pubkeyHash
function validatorPubkeyHashToInfo(bytes32 validatorPubkeyHash) external view returns (ValidatorInfo memory);
⋮----
/// @notice Returns the validatorInfo struct for the provided pubkey
function validatorPubkeyToInfo(bytes calldata validatorPubkey) external view returns (ValidatorInfo memory);
⋮----
/// @notice This returns the status of a given validator
function validatorStatus(bytes32 pubkeyHash) external view returns (VALIDATOR_STATUS);
⋮----
/// @notice This returns the status of a given validator pubkey
function validatorStatus(bytes calldata validatorPubkey) external view returns (VALIDATOR_STATUS);
⋮----
/// @notice Number of validators with proven withdrawal credentials, who do not have proven full withdrawals
function activeValidatorCount() external view returns (uint);
⋮----
/// @notice The timestamp of the last checkpoint finalized
function lastCheckpointTimestamp() external view returns (uint64);
⋮----
/// @notice The timestamp of the currently-active checkpoint. Will be 0 if there is not active checkpoint
function currentCheckpointTimestamp() external view returns (uint64);
⋮----
/// @notice Returns the currently-active checkpoint
function currentCheckpoint() external view returns (Checkpoint memory);
⋮----
/// @notice For each checkpoint, the total balance attributed to exited validators, in gwei
⋮----
/// NOTE that the values added to this mapping are NOT guaranteed to capture the entirety of a validator's
/// exit - rather, they capture the total change in a validator's balance when a checkpoint shows their
/// balance change from nonzero to zero. While a change from nonzero to zero DOES guarantee that a validator
/// has been fully exited, it is possible that the magnitude of this change does not capture what is
/// typically thought of as a "full exit."
⋮----
/// For example:
/// 1. Consider a validator was last checkpointed at 32 ETH before exiting. Once the exit has been processed,
/// it is expected that the validator's exited balance is calculated to be `32 ETH`.
/// 2. However, before `startCheckpoint` is called, a deposit is made to the validator for 1 ETH. The beacon
/// chain will automatically withdraw this ETH, but not until the withdrawal sweep passes over the validator
/// again. Until this occurs, the validator's current balance (used for checkpointing) is 1 ETH.
/// 3. If `startCheckpoint` is called at this point, the balance delta calculated for this validator will be
/// `-31 ETH`, and because the validator has a nonzero balance, it is not marked WITHDRAWN.
/// 4. After the exit is processed by the beacon chain, a subsequent `startCheckpoint` and checkpoint proof
/// will calculate a balance delta of `-1 ETH` and attribute a 1 ETH exit to the validator.
⋮----
/// If this edge case impacts your usecase, it should be possible to mitigate this by monitoring for deposits
/// to your exited validators, and waiting to call `startCheckpoint` until those deposits have been automatically
/// exited.
⋮----
/// Additional edge cases this mapping does not cover:
/// - If a validator is slashed, their balance exited will reflect their original balance rather than the slashed amount
/// - The final partial withdrawal for an exited validator will be likely be included in this mapping.
///   i.e. if a validator was last checkpointed at 32.1 ETH before exiting, the next checkpoint will calculate their
///   "exited" amount to be 32.1 ETH rather than 32 ETH.
function checkpointBalanceExitedGwei(uint64) external view returns (uint64);
⋮----
/// @notice Query the 4788 oracle to get the parent block root of the slot with the given `timestamp`
/// @param timestamp of the block for which the parent block root will be returned. MUST correspond
/// to an existing slot within the last 24 hours. If the slot at `timestamp` was skipped, this method
/// will revert.
function getParentBlockRoot(uint64 timestamp) external view returns (bytes32);
⋮----
/// @notice DEPRECATED INTERFACE at commit hash https://github.com/Layr-Labs/eigenlayer-contracts/tree/0139d6213927c0a7812578899ddd3dda58051928
⋮----
/// @notice The main functionalities are:
/// - creating new ETH validators with their withdrawal credentials pointed to this contract
/// - proving from beacon chain state roots that withdrawal credentials are pointed to this contract
/// - proving from beacon chain state roots the balances of ETH validators with their withdrawal credentials
///   pointed to this contract
/// - updating aggregate balances in the EigenPodManager
/// - withdrawing eth when withdrawals are initiated
/// @dev Note that all beacon chain balances are stored as gwei within the beacon chain datastructures. We choose
///   to account balances in terms of gwei in the EigenPod contract and convert to wei when making calls to other contracts
⋮----
interface IEigenPod_DeprecatedM1 {
⋮----
OVERCOMMITTED, // proven to be overcommitted to EigenLayer
⋮----
// this struct keeps track of PartialWithdrawalClaims
⋮----
// block at which the PartialWithdrawalClaim was created
⋮----
// last block (inclusive) in which the PartialWithdrawalClaim can be fraudproofed
⋮----
// amount of ETH -- in Gwei -- to be withdrawn until completion of this claim
⋮----
/// @notice The amount of eth, in gwei, that is restaked per validator
function REQUIRED_BALANCE_GWEI() external view returns (uint64);
⋮----
/// @notice The amount of eth, in wei, that is restaked per validator
function REQUIRED_BALANCE_WEI() external view returns (uint);
⋮----
/// @notice this is a mapping of validator indices to a Validator struct containing pertinent info about the validator
function validatorStatus(uint40 validatorIndex) external view returns (VALIDATOR_STATUS);
⋮----
function restakedExecutionLayerGwei() external view returns (uint64);
⋮----
/// @dev Called during withdrawal or slashing.
/// @dev Note that this function is marked as non-reentrant to prevent the recipient calling back into it
⋮----
function eigenPodManager() external view returns (IEigenPodManager_DeprecatedM1);
⋮----
/// @notice an indicator of whether or not the podOwner has ever "fully restaked" by successfully calling `verifyCorrectWithdrawalCredentials`.
function hasRestaked() external view returns (bool);
⋮----
/// @notice block number of the most recent withdrawal
function mostRecentWithdrawalBlockNumber() external view returns (uint64);
⋮----
///@notice mapping that tracks proven partial withdrawals
function provenPartialWithdrawal(uint40 validatorIndex, uint64 slot) external view returns (bool);
⋮----
/// @notice This function verifies that the withdrawal credentials of the podOwner are pointed to
/// this contract. It also verifies the current (not effective) balance  of the validator.  It verifies the provided proof of the ETH validator against the beacon chain state
/// root, marks the validator as 'active' in EigenLayer, and credits the restaked ETH in Eigenlayer.
/// @param oracleBlockNumber is the Beacon Chain blockNumber whose state root the `proof` will be proven against.
/// @param validatorIndex is the index of the validator being proven, refer to consensus specs
/// @param proofs is the bytes that prove the ETH validator's balance and withdrawal credentials against a beacon chain state root
/// @param validatorFields are the fields of the "Validator Container", refer to consensus specs
/// for details: https://github.com/ethereum/consensus-specs/blob/dev/specs/phase0/beacon-chain.md#validator
function verifyWithdrawalCredentialsAndBalance(
⋮----
/// @notice This function records an overcommitment of stake to EigenLayer on behalf of a certain ETH validator.
///         If successful, the overcommitted balance is penalized (available for withdrawal whenever the pod's balance allows).
///         The ETH validator's shares in the enshrined beaconChainETH strategy are also removed from the StrategyManager and undelegated.
/// @param oracleBlockNumber The oracleBlockNumber whose state root the `proof` will be proven against.
///        Must be within `VERIFY_OVERCOMMITTED_WINDOW_BLOCKS` of the current block.
⋮----
/// @param proofs is the proof of the validator's balance and validatorFields in the balance tree and the balanceRoot to prove for
/// @param beaconChainETHStrategyIndex is the index of the beaconChainETHStrategy for the pod owner for the callback to
///                                    the StrategyManager in case it must be removed from the list of the podOwners strategies
⋮----
/// @dev For more details on the Beacon Chain spec, see: https://github.com/ethereum/consensus-specs/blob/dev/specs/phase0/beacon-chain.md#validator
function verifyOvercommittedStake(
⋮----
/// @notice This function records a full withdrawal on behalf of one of the Ethereum validators for this EigenPod
/// @param withdrawalProofs is the information needed to check the veracity of the block number and withdrawal being proven
/// @param validatorFieldsProof is the proof of the validator's fields in the validator tree
/// @param withdrawalFields are the fields of the withdrawal being proven
/// @param validatorFields are the fields of the validator being proven
⋮----
///        the EigenPodManager to the StrategyManager in case it must be removed from the podOwner's list of strategies
function verifyAndProcessWithdrawal(
⋮----
/// @notice Called by the pod owner to withdraw the balance of the pod when `hasRestaked` is set to false
function withdrawBeforeRestaking() external;
````

## File: src/test/integration/deprecatedInterfaces/mainnet/IEigenPodManager.sol
````
// SPDX-License-Identifier: BUSL-1.1
⋮----
import "./IStrategyManager.sol";
import "./IEigenPod.sol";
import "./IBeaconChainOracle.sol";
import "src/contracts/interfaces/IPausable.sol";
⋮----
/// @notice M2 DEPRECATED INTERFACE at commit hash https://github.com/Layr-Labs/eigenlayer-contracts/tree/426f461c59b4f0e16f8becdffd747075edcaded8
/// @title Interface for factory that creates and manages solo staking pods that have their withdrawal credentials pointed to EigenLayer.
/// @author Layr Labs, Inc.
/// @notice Terms of Service: https://docs.eigenlayer.xyz/overview/terms-of-service
interface IEigenPodManager_DeprecatedM2 is IPausable {
/// @notice Creates an EigenPod for the sender.
/// @dev Function will revert if the `msg.sender` already has an EigenPod.
/// @dev Returns EigenPod address
function createPod() external returns (address);
⋮----
/// @notice Stakes for a new beacon chain validator on the sender's EigenPod.
/// Also creates an EigenPod for the sender if they don't have one already.
/// @param pubkey The 48 bytes public key of the beacon chain validator.
/// @param signature The validator's signature of the deposit data.
/// @param depositDataRoot The root/hash of the deposit data for the validator's deposit.
function stake(bytes calldata pubkey, bytes calldata signature, bytes32 depositDataRoot) external payable;
⋮----
/// @notice Changes the `podOwner`'s shares by `sharesDelta` and performs a call to the DelegationManager
/// to ensure that delegated shares are also tracked correctly
/// @param podOwner is the pod owner whose balance is being updated.
/// @param sharesDelta is the change in podOwner's beaconChainETHStrategy shares
/// @dev Callable only by the podOwner's EigenPod contract.
/// @dev Reverts if `sharesDelta` is not a whole Gwei amount
function recordBeaconChainETHBalanceUpdate(address podOwner, int sharesDelta) external;
⋮----
/// @notice Returns the address of the `podOwner`'s EigenPod if it has been deployed.
function ownerToPod(address podOwner) external view returns (IEigenPod);
⋮----
/// @notice Returns the address of the `podOwner`'s EigenPod (whether it is deployed yet or not).
function getPod(address podOwner) external view returns (IEigenPod);
⋮----
/// @notice The ETH2 Deposit Contract
function ethPOS() external view returns (IETHPOSDeposit);
⋮----
/// @notice Beacon proxy to which the EigenPods point
function eigenPodBeacon() external view returns (IBeacon);
⋮----
/// @notice EigenLayer's StrategyManager contract
function strategyManager() external view returns (IStrategyManager);
⋮----
/// @notice Returns 'true' if the `podOwner` has created an EigenPod, and 'false' otherwise.
function hasPod(address podOwner) external view returns (bool);
⋮----
/// @notice Returns the number of EigenPods that have been created
function numPods() external view returns (uint);
⋮----
/// @notice Mapping from Pod owner owner to the number of shares they have in the virtual beacon chain ETH strategy.
/// @dev The share amount can become negative. This is necessary to accommodate the fact that a pod owner's virtual beacon chain ETH shares can
/// decrease between the pod owner queuing and completing a withdrawal.
/// When the pod owner's shares would otherwise increase, this "deficit" is decreased first _instead_.
/// Likewise, when a withdrawal is completed, this "deficit" is decreased and the withdrawal amount is decreased; We can think of this
/// as the withdrawal "paying off the deficit".
function podOwnerShares(address podOwner) external view returns (int);
⋮----
/// @notice returns canonical, virtual beaconChainETH strategy
function beaconChainETHStrategy() external view returns (IStrategy);
⋮----
/// @notice Used by the DelegationManager to remove a pod owner's shares while they're in the withdrawal queue.
/// Simply decreases the `podOwner`'s shares by `shares`, down to a minimum of zero.
/// @dev This function reverts if it would result in `podOwnerShares[podOwner]` being less than zero, i.e. it is forbidden for this function to
/// result in the `podOwner` incurring a "share deficit". This behavior prevents a Staker from queuing a withdrawal which improperly removes excessive
/// shares from the operator to whom the staker is delegated.
/// @dev Reverts if `shares` is not a whole Gwei amount
function removeShares(address podOwner, uint shares) external;
⋮----
/// @notice Increases the `podOwner`'s shares by `shares`, paying off deficit if possible.
/// Used by the DelegationManager to award a pod owner shares on exiting the withdrawal queue
/// @dev Returns the number of shares added to `podOwnerShares[podOwner]` above zero, which will be less than the `shares` input
/// in the event that the podOwner has an existing shares deficit (i.e. `podOwnerShares[podOwner]` starts below zero)
⋮----
function addShares(address podOwner, uint shares) external returns (uint);
⋮----
/// @notice Used by the DelegationManager to complete a withdrawal, sending tokens to some destination address
/// @dev Prioritizes decreasing the podOwner's share deficit, if they have one
⋮----
function withdrawSharesAsTokens(address podOwner, address destination, uint shares) external;
⋮----
/// @notice DEPRECATED INTERFACE at commit hash https://github.com/Layr-Labs/eigenlayer-contracts/tree/0139d6213927c0a7812578899ddd3dda58051928
⋮----
interface IEigenPodManager_DeprecatedM1 is IPausable {
⋮----
function createPod() external;
⋮----
/// @notice Deposits/Restakes beacon chain ETH in EigenLayer on behalf of the owner of an EigenPod.
/// @param podOwner The owner of the pod whose balance must be deposited.
/// @param amount The amount of ETH to 'deposit' (i.e. be credited to the podOwner).
⋮----
function restakeBeaconChainETH(address podOwner, uint amount) external;
⋮----
/// @notice Removes beacon chain ETH from EigenLayer on behalf of the owner of an EigenPod, when the
///         balance of a validator is lower than how much stake they have committed to EigenLayer
/// @param podOwner The owner of the pod whose balance must be removed.
/// @param beaconChainETHStrategyIndex is the index of the beaconChainETHStrategy for the pod owner for the callback to
///                                    the StrategyManager in case it must be removed from the list of the podOwner's strategies
/// @param amount The amount of ETH to remove.
⋮----
function recordOvercommittedBeaconChainETH(address podOwner, uint beaconChainETHStrategyIndex, uint amount) external;
⋮----
/// @notice Withdraws ETH from an EigenPod. The ETH must have first been withdrawn from the beacon chain.
/// @param podOwner The owner of the pod whose balance must be withdrawn.
/// @param recipient The recipient of the withdrawn ETH.
/// @param amount The amount of ETH to withdraw.
/// @dev Callable only by the StrategyManager contract.
function withdrawRestakedBeaconChainETH(address podOwner, address recipient, uint amount) external;
⋮----
/// @notice Updates the oracle contract that provides the beacon chain state root
/// @param newBeaconChainOracle is the new oracle contract being pointed to
/// @dev Callable only by the owner of this contract (i.e. governance)
function updateBeaconChainOracle(IBeaconChainOracle_DeprecatedM1 newBeaconChainOracle) external;
⋮----
function ownerToPod(address podOwner) external view returns (IEigenPod_DeprecatedM1);
⋮----
function getPod(address podOwner) external view returns (IEigenPod_DeprecatedM1);
⋮----
/// @notice Oracle contract that provides updates to the beacon chain's state
function beaconChainOracle() external view returns (IBeaconChainOracle_DeprecatedM1);
⋮----
/// @notice Returns the Beacon Chain state root at `blockNumber`. Reverts if the Beacon Chain state root at `blockNumber` has not yet been finalized.
function getBeaconChainStateRoot(uint64 blockNumber) external view returns (bytes32);
⋮----
function strategyManager() external view returns (IStrategyManager_DeprecatedM1);
````

## File: src/test/integration/deprecatedInterfaces/mainnet/IStrategyManager.sol
````
// SPDX-License-Identifier: BUSL-1.1
⋮----
import "src/contracts/interfaces/IStrategy.sol";
import "src/contracts/interfaces/IDelegationManager.sol";
import "src/contracts/interfaces/IEigenPodManager.sol";
⋮----
/// @notice M2 DEPRECATED INTERFACE at commit hash https://github.com/Layr-Labs/eigenlayer-contracts/tree/426f461c59b4f0e16f8becdffd747075edcaded8
/// @title Interface for the primary entrypoint for funds into EigenLayer.
/// @author Layr Labs, Inc.
/// @notice Terms of Service: https://docs.eigenlayer.xyz/overview/terms-of-service
/// @notice See the `StrategyManager` contract itself for implementation details.
interface IStrategyManager_DeprecatedM2 {
/// @notice Deposits `amount` of `token` into the specified `strategy`, with the resultant shares credited to `msg.sender`
/// @param strategy is the specified strategy where deposit is to be made,
/// @param token is the denomination in which the deposit is to be made,
/// @param amount is the amount of token to be deposited in the strategy by the staker
/// @return shares The amount of new shares in the `strategy` created as part of the action.
/// @dev The `msg.sender` must have previously approved this contract to transfer at least `amount` of `token` on their behalf.
/// @dev Cannot be called by an address that is 'frozen' (this function will revert if the `msg.sender` is frozen).
///
/// WARNING: Depositing tokens that allow reentrancy (eg. ERC-777) into a strategy is not recommended.  This can lead to attack vectors
///          where the token balance and corresponding strategy shares are not in sync upon reentrancy.
function depositIntoStrategy(IStrategy strategy, IERC20 token, uint amount) external returns (uint shares);
⋮----
/// @notice Used for depositing an asset into the specified strategy with the resultant shares credited to `staker`,
/// who must sign off on the action.
/// Note that the assets are transferred out/from the `msg.sender`, not from the `staker`; this function is explicitly designed
/// purely to help one address deposit 'for' another.
⋮----
/// @param staker the staker that the deposited assets will be credited to
/// @param expiry the timestamp at which the signature expires
/// @param signature is a valid signature from the `staker`. either an ECDSA signature if the `staker` is an EOA, or data to forward
/// following EIP-1271 if the `staker` is a contract
⋮----
/// @dev A signature is required for this function to eliminate the possibility of griefing attacks, specifically those
/// targeting stakers who may be attempting to undelegate.
/// @dev Cannot be called if thirdPartyTransfersForbidden is set to true for this strategy
⋮----
///  WARNING: Depositing tokens that allow reentrancy (eg. ERC-777) into a strategy is not recommended.  This can lead to attack vectors
///          where the token balance and corresponding strategy shares are not in sync upon reentrancy
function depositIntoStrategyWithSignature(
⋮----
/// @notice Used by the DelegationManager to remove a Staker's shares from a particular strategy when entering the withdrawal queue
function removeShares(address staker, IStrategy strategy, uint shares) external;
⋮----
/// @notice Used by the DelegationManager to award a Staker some shares that have passed through the withdrawal queue
function addShares(address staker, IERC20 token, IStrategy strategy, uint shares) external;
⋮----
/// @notice Used by the DelegationManager to convert withdrawn shares to tokens and send them to a recipient
function withdrawSharesAsTokens(address recipient, IStrategy strategy, uint shares, IERC20 token) external;
⋮----
/// @notice Returns the current shares of `user` in `strategy`
function stakerStrategyShares(address user, IStrategy strategy) external view returns (uint shares);
⋮----
/// @notice Get all details on the staker's deposits and corresponding shares
/// @param staker The staker of interest, whose deposits this function will fetch
/// @return (staker's strategies, shares in these strategies)
function getDeposits(address staker) external view returns (IStrategy[] memory, uint[] memory);
⋮----
/// @notice Simple getter function that returns `stakerStrategyList[staker].length`.
function stakerStrategyListLength(address staker) external view returns (uint);
⋮----
/// @notice Owner-only function that adds the provided Strategies to the 'whitelist' of strategies that stakers can deposit into
/// @param strategiesToWhitelist Strategies that will be added to the `strategyIsWhitelistedForDeposit` mapping (if they aren't in it already)
/// @param thirdPartyTransfersForbiddenValues bool values to set `thirdPartyTransfersForbidden` to for each strategy
function addStrategiesToDepositWhitelist(IStrategy[] calldata strategiesToWhitelist, bool[] calldata thirdPartyTransfersForbiddenValues)
⋮----
/// @notice Owner-only function that removes the provided Strategies from the 'whitelist' of strategies that stakers can deposit into
/// @param strategiesToRemoveFromWhitelist Strategies that will be removed to the `strategyIsWhitelistedForDeposit` mapping (if they are in it)
function removeStrategiesFromDepositWhitelist(IStrategy[] calldata strategiesToRemoveFromWhitelist) external;
⋮----
/// If true for a strategy, a user cannot depositIntoStrategyWithSignature into that strategy for another staker
/// and also when performing DelegationManager.queueWithdrawals, a staker can only withdraw to themselves.
/// Defaulted to false for all existing strategies.
/// @param strategy The strategy to set `thirdPartyTransfersForbidden` value to
/// @param value bool value to set `thirdPartyTransfersForbidden` to
function setThirdPartyTransfersForbidden(IStrategy strategy, bool value) external;
⋮----
/// @notice Returns the single, central Delegation contract of EigenLayer
function delegation() external view returns (IDelegationManager);
⋮----
/// @notice Returns the EigenPodManager contract of EigenLayer
function eigenPodManager() external view returns (IEigenPodManager);
⋮----
/// @notice Returns the address of the `strategyWhitelister`
function strategyWhitelister() external view returns (address);
⋮----
/// @notice Returns bool for whether or not `strategy` is whitelisted for deposit
function strategyIsWhitelistedForDeposit(IStrategy strategy) external view returns (bool);
⋮----
/// @notice Owner-only function to change the `strategyWhitelister` address.
/// @param newStrategyWhitelister new address for the `strategyWhitelister`.
function setStrategyWhitelister(address newStrategyWhitelister) external;
⋮----
/// @notice Returns bool for whether or not `strategy` enables credit transfers. i.e enabling
/// depositIntoStrategyWithSignature calls or queueing withdrawals to a different address than the staker.
function thirdPartyTransfersForbidden(IStrategy strategy) external view returns (bool);
⋮----
/// @notice Getter function for the current EIP-712 domain separator for this contract.
/// @dev The domain separator will change in the event of a fork that changes the ChainID.
function domainSeparator() external view returns (bytes32);
⋮----
/// VIEW FUNCTIONS FOR PUBLIC VARIABLES, NOT IN ORIGINAL INTERFACE
function nonces(address user) external view returns (uint);
⋮----
function DEPOSIT_TYPEHASH() external view returns (bytes32);
⋮----
/// @notice M1 DEPRECATED INTERFACE at commit hash https://github.com/Layr-Labs/eigenlayer-contracts/tree/0139d6213927c0a7812578899ddd3dda58051928
⋮----
interface IStrategyManager_DeprecatedM1 {
// packed struct for queued withdrawals; helps deal with stack-too-deep errors
⋮----
/// Struct type used to specify an existing queued withdrawal. Rather than storing the entire struct, only a hash is stored.
/// In functions that operate on existing queued withdrawals -- e.g. `startQueuedWithdrawalWaitingPeriod` or `completeQueuedWithdrawal`,
/// the data is resubmitted and the hash of the submitted data is computed by `calculateWithdrawalRoot` and checked against the
/// stored hash in order to confirm the integrity of the submitted data.
⋮----
/// @param amount is the amount of token to be deposited in the strategy by the depositor
⋮----
/// @notice Deposits `amount` of beaconchain ETH into this contract on behalf of `staker`
/// @param staker is the entity that is restaking in eigenlayer,
/// @param amount is the amount of beaconchain ETH being restaked,
/// @dev Only callable by EigenPodManager.
function depositBeaconChainETH(address staker, uint amount) external;
⋮----
/// @notice Records an overcommitment event on behalf of a staker. The staker's beaconChainETH shares are decremented by `amount`.
/// @param overcommittedPodOwner is the pod owner to be slashed
/// @param beaconChainETHStrategyIndex is the index of the beaconChainETHStrategy in case it must be removed,
/// @param amount is the amount to decrement the slashedAddress's beaconChainETHStrategy shares
⋮----
function recordOvercommittedBeaconChainETH(address overcommittedPodOwner, uint beaconChainETHStrategyIndex, uint amount) external;
⋮----
/// @dev Cannot be called on behalf of a staker that is 'frozen' (this function will revert if the `staker` is frozen).
⋮----
function stakerDepositShares(address user, IStrategy strategy) external view returns (uint shares);
⋮----
/// @notice Get all details on the depositor's deposits and corresponding shares
/// @return (depositor's strategies, shares in these strategies)
function getDeposits(address depositor) external view returns (IStrategy[] memory, uint[] memory);
⋮----
/// @notice Called by a staker to queue a withdrawal of the given amount of `shares` from each of the respective given `strategies`.
/// @dev Stakers will complete their withdrawal by calling the 'completeQueuedWithdrawal' function.
/// User shares are decreased in this function, but the total number of shares in each strategy remains the same.
/// The total number of shares is decremented in the 'completeQueuedWithdrawal' function instead, which is where
/// the funds are actually sent to the user through use of the strategies' 'withdrawal' function. This ensures
/// that the value per share reported by each strategy will remain consistent, and that the shares will continue
/// to accrue gains during the enforced withdrawal waiting period.
/// @param strategyIndexes is a list of the indices in `stakerStrategyList[msg.sender]` that correspond to the strategies
/// for which `msg.sender` is withdrawing 100% of their shares
/// @param strategies The Strategies to withdraw from
/// @param shares The amount of shares to withdraw from each of the respective Strategies in the `strategies` array
/// @param withdrawer The address that can complete the withdrawal and will receive any withdrawn funds or shares upon completing the withdrawal
/// @param undelegateIfPossible If this param is marked as 'true' *and the withdrawal will result in `msg.sender` having no shares in any Strategy,*
/// then this function will also make an internal call to `undelegate(msg.sender)` to undelegate the `msg.sender`.
/// @return The 'withdrawalRoot' of the newly created Queued Withdrawal
/// @dev Strategies are removed from `stakerStrategyList` by swapping the last entry with the entry to be removed, then
/// popping off the last entry in `stakerStrategyList`. The simplest way to calculate the correct `strategyIndexes` to input
/// is to order the strategies *for which `msg.sender` is withdrawing 100% of their shares* from highest index in
/// `stakerStrategyList` to lowest index
/// @dev Note that if the withdrawal includes shares in the enshrined 'beaconChainETH' strategy, then it must *only* include shares in this strategy, and
/// `withdrawer` must match the caller's address. The first condition is because slashing of queued withdrawals cannot be guaranteed
/// for Beacon Chain ETH (since we cannot trigger a withdrawal from the beacon chain through a smart contract) and the second condition is because shares in
/// the enshrined 'beaconChainETH' strategy technically represent non-fungible positions (deposits to the Beacon Chain, each pointed at a specific EigenPod).
function queueWithdrawal(
⋮----
/// @notice Used to complete the specified `queuedWithdrawal`. The function caller must match `queuedWithdrawal.withdrawer`
/// @param queuedWithdrawal The QueuedWithdrawal to complete.
/// @param tokens Array in which the i-th entry specifies the `token` input to the 'withdraw' function of the i-th Strategy in the `strategies` array
/// of the `queuedWithdrawal`. This input can be provided with zero length if `receiveAsTokens` is set to 'false' (since in that case, this input will be unused)
/// @param middlewareTimesIndex is the index in the operator that the staker who triggered the withdrawal was delegated to's middleware times array
/// @param receiveAsTokens If true, the shares specified in the queued withdrawal will be withdrawn from the specified strategies themselves
/// and sent to the caller, through calls to `queuedWithdrawal.strategies[i].withdraw`. If false, then the shares in the specified strategies
/// will simply be transferred to the caller directly.
/// @dev middlewareTimesIndex should be calculated off chain before calling this function by finding the first index that satisfies `slasher.canWithdraw`
function completeQueuedWithdrawal(
⋮----
/// @notice Used to complete the specified `queuedWithdrawals`. The function caller must match `queuedWithdrawals[...].withdrawer`
/// @param queuedWithdrawals The QueuedWithdrawals to complete.
/// @param tokens Array of tokens for each QueuedWithdrawal. See `completeQueuedWithdrawal` for the usage of a single array.
/// @param middlewareTimesIndexes One index to reference per QueuedWithdrawal. See `completeQueuedWithdrawal` for the usage of a single index.
⋮----
/// @dev Array-ified version of `completeQueuedWithdrawal`
⋮----
function completeQueuedWithdrawals(
⋮----
/// @notice Slashes the shares of a 'frozen' operator (or a staker delegated to one)
/// @param slashedAddress is the frozen address that is having its shares slashed
/// @param recipient is the address that will receive the slashed funds, which could e.g. be a harmed party themself,
/// or a MerkleDistributor-type contract that further sub-divides the slashed funds.
/// @param strategies Strategies to slash
/// @param shareAmounts The amount of shares to slash in each of the provided `strategies`
/// @param tokens The tokens to use as input to the `withdraw` function of each of the provided `strategies`
⋮----
/// @param recipient The slashed funds are withdrawn as tokens to this address.
/// @dev strategies are removed from `stakerStrategyList` by swapping the last entry with the entry to be removed, then
⋮----
function slashShares(
⋮----
/// @notice Slashes an existing queued withdrawal that was created by a 'frozen' operator (or a staker delegated to one)
/// @param recipient The funds in the slashed withdrawal are withdrawn as tokens to this address.
/// @param queuedWithdrawal The previously queued withdrawal to be slashed
/// @param tokens Array in which the i-th entry specifies the `token` input to the 'withdraw' function of the i-th Strategy in the `strategies`
/// array of the `queuedWithdrawal`.
/// @param indicesToSkip Optional input parameter -- indices in the `strategies` array to skip (i.e. not call the 'withdraw' function on). This input exists
/// so that, e.g., if the slashed QueuedWithdrawal contains a malicious strategy in the `strategies` array which always reverts on calls to its 'withdraw' function,
/// then the malicious strategy can be skipped (with the shares in effect "burned"), while the non-malicious strategies are still called as normal.
function slashQueuedWithdrawal(
⋮----
/// @notice Returns the keccak256 hash of `queuedWithdrawal`.
function calculateWithdrawalRoot(QueuedWithdrawal memory queuedWithdrawal) external pure returns (bytes32);
⋮----
function addStrategiesToDepositWhitelist(IStrategy[] calldata strategiesToWhitelist) external;
⋮----
/// @notice returns the enshrined, virtual 'beaconChainETH' Strategy
function beaconChainETHStrategy() external view returns (IStrategy);
⋮----
/// @notice Returns the number of blocks that must pass between the time a withdrawal is queued and the time it can be completed
function withdrawalDelayBlocks() external view returns (uint);
⋮----
function withdrawalRootPending(bytes32 withdrawalRoot) external view returns (bool);
⋮----
function numWithdrawalsQueued(address staker) external view returns (uint);
````

## File: src/test/integration/mocks/BeaconChainMock_Deneb.t.sol
````
// SPDX-License-Identifier: BUSL-1.1
⋮----
import "src/test/integration/mocks/BeaconChainMock.t.sol";
import "src/test/integration/mocks/LibProofGen.t.sol";
⋮----
/// @notice A backwards-compatible BeaconChain Mock that updates containers & proofs from Deneb to Pectra
contract BeaconChainMock_DenebForkable is BeaconChainMock {
⋮----
// Denotes whether the beacon chain has been forked to Pectra
⋮----
// The timestamp of the Pectra hard fork
⋮----
function NAME() public pure override returns (string memory) {
⋮----
/// @dev Always return 32 ETH in gwei
function _getMaxEffectiveBalanceGwei(Validator storage v) internal view override returns (uint64) {
⋮----
/// @notice Forks the beacon chain to Pectra
/// @dev Test battery should warp to the fork timestamp after calling this method
function forkToPectra(uint64 _pectraForkTimestamp) public {
````

## File: src/test/integration/mocks/BeaconChainMock.t.sol
````
// SPDX-License-Identifier: BUSL-1.1
⋮----
import "forge-std/Test.sol";
⋮----
import "src/contracts/libraries/BeaconChainProofs.sol";
import "src/contracts/libraries/Merkle.sol";
import "src/contracts/pods/EigenPodManager.sol";
⋮----
import "src/test/mocks/ETHDepositMock.sol";
import "src/test/integration/mocks/EIP_4788_Oracle_Mock.t.sol";
import "src/test/integration/mocks/EIP_7002_Mock.t.sol";
import "src/test/integration/mocks/EIP_7251_Mock.t.sol";
import "src/test/integration/mocks/LibValidator.t.sol";
import "src/test/integration/mocks/LibProofGen.t.sol";
import "src/test/utils/Logger.t.sol";
⋮----
// Min/max balances for valdiators
// see https://github.com/ethereum/consensus-specs/blob/dev/specs/electra/beacon-chain.md#gwei-values
⋮----
/// @notice A Pectra Beacon Chain Mock Contract. For testing upgrades, use BeaconChainMock_Upgradeable
/// @notice This mock assumed the following
/// @notice A Semi-Compatible Pectra Beacon Chain Mock Contract. For Testing Upgrades to Pectra use BeaconChainMock_Upgradeable
/// @dev This mock assumes the following:
/// - Ceiling is Max EB, at which sweeps will be triggered
/// - No support for consolidations or any execution layer triggerable actions (exits, partial withdrawals)
contract BeaconChainMock is Logger {
⋮----
/// @dev The type of slash to apply to a validator
⋮----
Minor, // `MINOR_SLASH_AMOUNT_GWEI`
Half, // Half of the validator's balance
Full // The validator's entire balance
⋮----
// Rewards given to each validator during epoch processing
⋮----
// Used to call predeploys as the system
⋮----
/// Canonical beacon chain predeploy addresses
⋮----
/// BeaconState containers, used for proofgen:
/// https://eth2book.info/capella/part3/containers/state/#beaconstate
⋮----
// Validator container, references every validator created so far
⋮----
// Current balance container, keeps a balance for every validator
//
// Since balances are stored in groups of 4, it's easier to make
// this a mapping rather than an array. If it were an array, its
// length would be validators.length / 4;
⋮----
/// Generated proofs for each block timestamp:
⋮----
// Maps block.timestamp -> calculated beacon block roots
⋮----
// Keeps track of the index of the last validator we've seen during epoch processing
⋮----
// Create mock 4788 oracle
⋮----
function NAME() public pure virtual override returns (string memory) {
⋮----
///
///                                 EXTERNAL METHODS
⋮----
/// @dev Creates a new validator by:
/// - Creating the validator container
/// - Setting their current/effective balance
/// - Assigning them a new, unique index
function newValidator(bytes memory withdrawalCreds) public payable returns (uint40) {
⋮----
// These checks mimic the checks made in the beacon chain deposit contract
⋮----
// We sanity-check them here because this contract sorta acts like the
// deposit contract and this ensures we only create validators that could
// exist IRL
⋮----
// Create new validator and return its unique index
⋮----
/// @dev Initiate an exit by:
/// - Updating the validator's exit epoch
/// - Decreasing current balance to 0
/// - Withdrawing the balance to the validator's withdrawal credentials
/// NOTE that the validator's effective balance is unchanged until advanceEpoch is called
/// @return exitedBalanceGwei The balance exited to the withdrawal address
⋮----
/// This partially mimics the beacon chain's behavior, which is:
/// 1. when an exit is initiated, the validator's exit/withdrawable epochs are immediately set
/// 2. in a future slot (as part of the withdrawal queue), the validator's current balance is set to 0
///    - at the end of this slot, the eth is withdrawn to the withdrawal credentials
/// 3. when the epoch finalizes, the validator's effective balance is updated
⋮----
/// Because this mock beacon chain doesn't implement a withdrawal queue or per-slot processing,
/// `exitValidator` combines steps 1 and 2 into this method.
⋮----
/// TODO we may need to advance a slot here to maintain the properties we want in startCheckpoint
function exitValidator(uint40 validatorIndex) public returns (uint64 exitedBalanceGwei) {
⋮----
// Update validator.exitEpoch
⋮----
// Set current balance to 0
⋮----
// Send current balance to pod
⋮----
function slashValidators(uint40[] memory _validators, SlashType _slashType) public returns (uint64 slashedBalanceGwei) {
⋮----
// Mark slashed and initiate validator exit
⋮----
// Calculate slash amount
⋮----
// Decrease current balance (effective balance updated during epoch processing)
⋮----
function slashValidators(uint40[] memory _validators, uint64 _slashAmountGwei) public {
⋮----
modifier onEpoch() {
⋮----
/// @dev Move forward one epoch on the beacon chain, taking care of important epoch processing:
/// - Award ALL validators CONSENSUS_REWARD_AMOUNT
/// - Process any pending partial withdrawals (new in Pectra)
/// - Withdraw any balance over Max EB
/// - Withdraw any balance for exited validators
/// - Effective balances updated (NOTE: we do not use hysteresis!)
/// - Move time forward one epoch
/// - State root calculated and credential/balance proofs generated for all validators
/// - Send state root to 4788 oracle
⋮----
/// Note:
/// - DOES generate consensus rewards for ALL non-exited validators
/// - DOES withdraw in excess of Max EB / if validator is exited
function advanceEpoch() public onEpoch {
⋮----
/// @dev Like `advanceEpoch`, but does NOT generate consensus rewards for validators.
/// This amount is added to each validator's current balance before effective balances
/// are updated.
⋮----
/// - does NOT generate consensus rewards
⋮----
function advanceEpoch_NoRewards() public onEpoch {
⋮----
/// @dev Like `advanceEpoch`, but explicitly does NOT withdraw if balances
/// are over Max EB. This exists to support tests that check share increases solely
/// due to beacon chain balance changes.
⋮----
/// - does NOT withdraw in excess of Max EB
/// - does NOT withdraw if validator is exited
function advanceEpoch_NoWithdraw() public onEpoch {
⋮----
function advanceEpoch_NoWithdrawNoRewards() public onEpoch {
⋮----
/// @dev Iterate over all validators. If the validator is still active,
/// add CONSENSUS_REWARD_AMOUNT_GWEI to its current balance
function _generateRewards() internal {
⋮----
if (v.isDummy) continue; // don't process dummy validators
⋮----
// If validator has not initiated exit, add rewards to their current balance
⋮----
/// @dev Handle consolidation requests
function _process_EIP_7521_Requests() internal {
// Call EIP-7521 predeploy and dequeue any consolidation requests
⋮----
// The beacon chain performs a lot of validation on requests. We do most of
// the same checks here, and log and requests we skip for debugging.
⋮----
// Handle switch to 0x02 request
⋮----
// The beacon chain would queue excess balance here as a "pending deposit", but
// we don't follow the spec that closely.
⋮----
// Mark source validator exited
⋮----
// Transfer balance from source to target
// Note the beacon chain would cap this transfer to the effective balance,
// and withdraw the rest. Our effective balances aren't using hysteresis, so
// we approximate this behavior by withdrawing anything over 32 ETH.
⋮----
// Withdraw excess balance
⋮----
/// @dev Handle pending partial withdrawals AND withdraw excess validator balance
function _process_EIP_7002_Requests() internal {
// Call EIP-7002 predeploy and dequeue any withdrawal requests
⋮----
// TODO - swap to internal method
⋮----
// Partial withdrawal - only withdraw down to 32 ETH
⋮----
function _logSkip(string memory reason) internal {
⋮----
/// @dev Iterate over all validators. If the validator:
/// - has > than Max EB current balance
/// - is exited
/// - has a pending partial withdrawal
⋮----
/// ... withdraw the appropriate amount to the validator's withdrawal credentials
function _processWithdrawals() internal {
⋮----
// If the validator has nothing to withdraw, continue
⋮----
// Process full withdrawal for exited validator
⋮----
// If the validator has a pending withdrawal request, withdraw (but do not go below 32 eth)
// Note that these reqs are only fulfilled for 0x02 validators (this is enforced elsewhere)
⋮----
// Set pending to 0
⋮----
// Withdraw any amount above the max effective balance:
// - For 0x01 validators, this is 32 ETH
// - For 0x02 validators, this is 2048 ETH
⋮----
// Send ETH to withdrawal address
⋮----
// Update validator's current balance
⋮----
function _updateCurrentEpoch() internal {
⋮----
function _advanceEpoch() internal virtual {
⋮----
// Update effective balances for each validator
⋮----
// Get current balance and trim anything over MAX EB
⋮----
// console.log("   Building beacon state trees...".dim());
⋮----
// Log total number of validators and number being processed for the first time
⋮----
// generate an empty root if we don't have any validators
⋮----
// console.log("-- no validators; added empty block root");
⋮----
// Push new block root to oracle
⋮----
///                             INTERNAL FUNCTIONS
⋮----
function _createValidator(bytes memory withdrawalCreds, uint64 balanceGwei) internal returns (uint40) {
⋮----
// HACK to make balance proofs work. Every 4 validators we create
// a dummy validator with empty withdrawal credentials and a unique
// balance value. This ensures that each balanceRoot is unique, which
// allows our efficient beacon state builder to work.
⋮----
// For more details on this hack see _buildMerkleTree
⋮----
function _currentBalanceGwei(uint40 validatorIndex) internal view returns (uint64) {
⋮----
function currentEpoch() public view returns (uint64) {
⋮----
/// @dev Returns the validator's exit epoch
function exitEpoch(uint40 validatorIndex) public view returns (uint64) {
⋮----
function totalEffectiveBalanceGwei(uint40[] memory validatorIndices) public view returns (uint64) {
⋮----
function totalEffectiveBalanceWei(uint40[] memory validatorIndices) public view returns (uint) {
⋮----
/// @dev Returns the validator's effective balance, in gwei
function effectiveBalance(uint40 validatorIndex) public view returns (uint64) {
⋮----
/// @dev Returns the validator's current balance, in gwei
function currentBalance(uint40 validatorIndex) public view returns (uint64) {
⋮----
function getBalanceRoot(uint40 validatorIndex) public view returns (bytes32) {
⋮----
function _getBalanceRootIndex(uint40 validatorIndex) internal pure returns (uint40) {
⋮----
/// @dev Update the validator's current balance
function _setCurrentBalance(uint40 validatorIndex, uint64 newBalanceGwei) internal {
⋮----
/// From EigenPod.sol
function _nextEpochStartTimestamp(uint64 epoch) internal view returns (uint64) {
⋮----
function _calcValProofIndex(uint40 validatorIndex) internal pure returns (uint) {
⋮----
function _calcBalanceProofIndex(uint40 balanceRootIndex) internal pure returns (uint) {
⋮----
/// @dev Opposite of BeaconChainProofs.getBalanceAtIndex, calculates a new balance
/// root by updating the balance at validatorIndex
/// @return The new, updated balance root
function _calcBalanceRoot(bytes32 balanceRoot, uint40 validatorIndex, uint64 newBalanceGwei) internal pure returns (bytes32) {
// Clear out old balance
⋮----
// Convert validator balance to little endian and shift to correct position
⋮----
///                               VIEW METHODS
⋮----
function getCredentialProofs(uint40[] memory _validators) public view returns (CredentialProofs memory) {
// If we have not advanced an epoch since a validator was created, no proofs have been
// generated for that validator. We check this here and revert early so we don't return
// empty proofs.
⋮----
// Get proofs for each validator
⋮----
function getCheckpointProofs(uint40[] memory _validators, uint64 timestamp) public view returns (CheckpointProofs memory) {
⋮----
function getStaleBalanceProofs(uint40 validatorIndex) public view returns (StaleBalanceProofs memory) {
⋮----
function balanceOfGwei(uint40 validatorIndex) public view returns (uint64) {
⋮----
function _getMaxEffectiveBalanceGwei(Validator storage v) internal view virtual returns (uint64) {
⋮----
function hasCompoundingCreds(uint40 validatorIndex) public view returns (bool) {
⋮----
function pubkeyHash(uint40 validatorIndex) public view returns (bytes32) {
⋮----
function pubkey(uint40 validatorIndex) public pure returns (bytes memory) {
⋮----
function getPubkeyHashes(uint40[] memory _validators) public view returns (bytes32[] memory) {
⋮----
function isActive(uint40 validatorIndex) public view returns (bool) {
````

## File: src/test/integration/mocks/EIP_4788_Oracle_Mock.t.sol
````
// SPDX-License-Identifier: BUSL-1.1
⋮----
contract EIP_4788_Oracle_Mock {
⋮----
function timestampToBlockRoot(uint timestamp) public view returns (bytes32) {
⋮----
function setBlockRoot(uint64 timestamp, bytes32 blockRoot) public {
````

## File: src/test/integration/mocks/EIP_7002_Mock.t.sol
````
// SPDX-License-Identifier: BUSL-1.1
⋮----
contract EIP_7002_Mock {
⋮----
///
///                            "PUBLIC" METHODS
⋮----
function _doAddRequest() internal {
⋮----
calldatacopy(24, 48, 8) // copy uint64 amountGwei to memory[0]
⋮----
function _doGetFee() internal view {
⋮----
/// (see https://eips.ethereum.org/EIPS/eip-7002#system-call)
function _doReadRequests() internal {
⋮----
///                            PRIVATE METHODS
⋮----
function _dequeueWithdrawalRequests() internal returns (WithdrawalReq[] memory reqs) {
⋮----
// The actual spec caps this to MAX_WITHDRAWAL_REQUESTS_PER_BLOCK, but that's not super useful for tests
⋮----
function _updateExcessWithdrawalRequests() internal {
⋮----
function _resetWithdrawalRequestCount() internal {
⋮----
function _getFee() private view returns (uint) {
⋮----
/// (see https://eips.ethereum.org/EIPS/eip-7002#fee-calculation)
function _fakeExponential(uint factor, uint numerator, uint denominator) private pure returns (uint) {
````

## File: src/test/integration/mocks/EIP_7251_Mock.t.sol
````
// SPDX-License-Identifier: BUSL-1.1
⋮----
contract EIP_7251_Mock {
⋮----
///
///                            "PUBLIC" METHODS
⋮----
function _doAddRequest() internal {
⋮----
function _doGetFee() internal view {
⋮----
/// (see https://eips.ethereum.org/EIPS/eip-7251#system-call)
function _doReadRequests() internal {
⋮----
///                            PRIVATE METHODS
⋮----
function _dequeueConsolidationRequests() internal returns (ConsolidationReq[] memory reqs) {
⋮----
// The actual spec caps this to MAX_CONSOLIDATION_REQUESTS_PER_BLOCK, but that's not super useful for tests
⋮----
function _updateExcessConsolidationRequests() internal {
⋮----
function _resetConsolidationRequestCount() internal {
⋮----
function _getFee() private view returns (uint) {
⋮----
/// (see https://eips.ethereum.org/EIPS/eip-7251#fee-calculation)
function _fakeExponential(uint factor, uint numerator, uint denominator) private pure returns (uint) {
````

## File: src/test/integration/mocks/LibProofGen.t.sol
````
// SPDX-License-Identifier: BUSL-1.1
⋮----
import "forge-std/Test.sol";
⋮----
import "src/contracts/libraries/BeaconChainProofs.sol";
import "src/contracts/libraries/Merkle.sol";
⋮----
import "src/test/integration/mocks/LibValidator.t.sol";
⋮----
///
///              CONSTANTS AND CONFIG
⋮----
function config() internal view returns (Config storage) {
⋮----
/// @dev Dencun-specific config
/// See (https://eth2book.info/capella/part3/containers/state/#beaconstate)
function useDencun() internal {
⋮----
/// @dev Pectra-specific config
/// See (see https://github.com/ethereum/consensus-specs/blob/dev/specs/electra/beacon-chain.md#beaconstate)
function usePectra() internal {
⋮----
///             PROOFGEN: MAIN METHOD
⋮----
/// @dev This method is how our mock beacon chain provides EigenPods with valid proofs of beacon state.
⋮----
/// INPUT: the beacon state for the current timestamp (validators and balances)
/// OUTPUT: the beacon block root calculated from the input. The mock beacon chain will inject this root
/// into the EIP-4788 beacon block root oracle, as EigenPods query this oracle during proof verification.
⋮----
/// Proofs against the beacon block root are also generated and stored in StateProofs; these proofs can
/// be fetched before calling an EigenPod method.
⋮----
/// This process is broken into 2 steps:
⋮----
/// 1. The merkle tree builder builds 4 merkle trees, one for each beacon state object we care about:
⋮----
///         beaconBlockRoot
///                |                              (beacon block tree)
///         beaconStateRoot
///        /               \                      (beacon state tree)
/// validatorContainerRoot, balanceContainerRoot
///          |                       |            (balances tree)
///          |              individual balances
///          |                                    (validators tree)
/// individual validators
⋮----
/// Since the full beacon state is quite large, the merkle tree builder uses some hacks to generate
/// only as much of the tree as we need for our tests. See `build` for details.
⋮----
/// 2. Once the merkle trees are built, we pre-generate proofs for EigenPod methods.
function generate(StateProofs storage p, Validator[] memory validators, mapping(uint40 => bytes32) storage balances)
⋮----
// Build merkle tree for validators
⋮----
// Build merkle tree for current balances
⋮----
// Build merkle tree for BeaconState
⋮----
// Build merkle tree for BeaconBlock
⋮----
// Pre-generate proofs for EigenPod methods
⋮----
///              MERKLE TREE BUILDER
⋮----
/// @dev Builds a merkle tree in storage using the given leaves and height
/// -- if the leaves given are not complete (i.e. the depth should have more leaves),
///    a pre-calculated zero-node is used to complete the tree.
/// -- each pair of nodes is stored in `siblings`, and their parent in `parents`.
///    These mappings are used to build proofs for any individual leaf
/// @return root the root of the merkle tree
⋮----
/// HACK: this sibling/parent method of tree construction relies on all passed-in leaves
/// being unique, so that we don't overwrite siblings/parents. This is simple for trees
/// like the validator tree, as each leaf is a validator's unique validatorFields.
/// However, for the balances tree, the leaves may not be distinct. To get around this,
/// BeaconChainMock._createValidator adds "dummy" validators every 4 validators created,
/// with a unique balance value. This ensures each balance root is unique.
function build(Tree storage tree, bytes32[] memory leaves, uint height) internal returns (bytes32 root) {
⋮----
// Hash each pair of nodes in this level of the tree
⋮----
// Get left leaf
⋮----
// Calculate right leaf
⋮----
// Hash left and right
⋮----
// Record results, used to generate individual proofs later:
// Record left and right as siblings
⋮----
// Record the result as the parent of left and right
⋮----
// Move up one level
⋮----
/// @dev Fetch unique filler node for given depth
function _getFillerNode(uint depth) internal view returns (bytes32) {
⋮----
///              PROOF GENERATION
⋮----
/// @dev Generate global proof of beaconStateRoot -> beaconBlockRoot
/// Used in verifyWithdrawalCredentials and verifyStaleBalance
function genStateRootProof(StateProofs storage p, bytes32 beaconStateRoot) internal {
⋮----
// proof[j] = sibling;
⋮----
/// @dev Generate global proof of balanceContainerRoot -> beaconStateRoot -> beaconBlockRoot
/// Used in verifyCheckpointProofs
function genBalanceContainerProof(StateProofs storage p, bytes32 balanceContainerRoot) internal {
⋮----
/// @dev Generate per-validator proofs of their validator -> validatorsRoot
⋮----
function genCredentialProofs(StateProofs storage p, Validator[] memory validators) internal {
⋮----
// Calculate credential proofs for each validator
⋮----
// Validator fields leaf -> validator container root
⋮----
// Validator container root -> beacon state root
⋮----
/// @dev Generate per-balance root proofs of each balance root -> balanceContainerRoot
⋮----
function genBalanceProofs(StateProofs storage p, bytes32[] memory balanceLeaves) internal {
⋮----
// Calculate current balance proofs for each balance root
⋮----
// Balance root leaf -> balances container root
⋮----
///              MERKLE LEAVES GETTERS
⋮----
/// @dev Get the leaves of the beacon block tree
function _getBeaconBlockLeaves(bytes32 beaconStateRoot) internal view returns (bytes32[] memory) {
⋮----
// Pre-populate leaves with dummy values so sibling/parent tracking is correct
⋮----
// Place beaconStateRoot into tree
⋮----
/// @dev Get the leaves of the beacon state tree
function _getBeaconStateLeaves(bytes32 validatorsRoot, bytes32 balancesRoot) internal view returns (bytes32[] memory) {
⋮----
// Place validatorsRoot and balancesRoot into tree
⋮----
/// @dev Get the leaves of the validators merkle tree
function _getValidatorLeaves(Validator[] memory validators) internal pure returns (bytes32[] memory) {
⋮----
// Place each validator's validatorFields into tree
⋮----
/// @dev Get the leaves of the balances merkle tree
function _getBalanceLeaves(mapping(uint40 => bytes32) storage balances, uint numValidators) internal view returns (bytes32[] memory) {
// Each balance leaf is shared by 4 validators. This uses div_ceil
// to calculate the number of balance leaves
⋮----
// Place each validator's current balance into tree
````

## File: src/test/integration/mocks/LibValidator.t.sol
````
// SPDX-License-Identifier: BUSL-1.1
⋮----
import "forge-std/Test.sol";
⋮----
import "src/contracts/libraries/BeaconChainProofs.sol";
⋮----
// cumulative unprocessed withdraw requests
⋮----
/// @dev Generates a faux-pubkey from a uint40 validator index
function toPubkey(uint40 index) internal pure returns (bytes memory pubkey) {
⋮----
/// @dev Converts a validator pubkey to the index it uses in BeaconChainMock
/// NOTE this assumes a valid size pubkey
function toIndex(bytes memory pubkey) internal pure returns (uint40 validatorIndex) {
⋮----
/// @dev Computes a pubkey hash from a validator's pubkey
⋮----
function pubkeyHash(bytes memory pubkey) internal pure returns (bytes32) {
⋮----
function getValidatorFields(Validator memory self) internal pure returns (bytes32[] memory fields) {
⋮----
/// @dev Returns whether the validator is considered "active" at the given epoch
function isActiveAt(Validator memory self, uint64 epoch) internal pure returns (bool) {
⋮----
/// @dev Returns true if the validator has initiated exit
function isExiting(Validator memory self) internal pure returns (bool) {
⋮----
/// @dev Returns the withdrawal address of the validator
/// NOTE this assumes the validator has 0x01 or 0x02 withdrawal credentials
function withdrawalAddress(Validator memory self) internal pure returns (address addr) {
⋮----
/// @dev Returns true if the validator does not have 0x01/0x02 withdrawal credentials
function hasBLSWC(Validator memory self) internal pure returns (bool) {
⋮----
/// @dev Returns true IFF the validator has 0x02 withdrawal credentials
function hasCompoundingWC(Validator memory self) internal pure returns (bool) {
⋮----
/// @dev Opposite of Endian.fromLittleEndianUint64
function toLittleEndianUint64(uint64 num) internal pure returns (bytes32) {
⋮----
// Rearrange the bytes from big-endian to little-endian format
⋮----
// Shift the little-endian bytes to the end of the bytes32 value
````

## File: src/test/integration/tests/eigenpod/FullySlashed_EigenPod.t.sol
````
// SPDX-License-Identifier: BUSL-1.1
⋮----
import "src/test/integration/IntegrationChecks.t.sol";
⋮----
contract Integration_FullySlashedEigenpod_Base is IntegrationCheckUtils {
⋮----
function _init() internal virtual override {
⋮----
// Deposit staker
⋮----
// Slash all validators fully
⋮----
beaconChain.advanceEpoch_NoRewards(); // Withdraw slashed validators to pod
⋮----
contract Integration_FullySlashedEigenpod_Checkpointed is Integration_FullySlashedEigenpod_Base {
function _init() internal override {
⋮----
// Start & complete a checkpoint
⋮----
function testFuzz_fullSlash_Delegate(uint24 _rand) public rand(_rand) {
⋮----
// Delegate to an operator - should succeed given that delegation only checks the operator's slashing factor
⋮----
function testFuzz_fullSlash_Revert_Redeposit(uint24 _rand) public rand(_rand) {
// Start a new validator & verify withdrawal credentials
⋮----
// We should revert on verifyWithdrawalCredentials since the staker's slashing factor is 0
⋮----
function testFuzz_fullSlash_registerStakerAsOperator_Revert_Redeposit(uint24 _rand) public rand(_rand) {
// Register staker as operator
⋮----
function testFuzz_fullSlash_registerStakerAsOperator_delegate_undelegate_completeAsShares(uint24 _rand) public rand(_rand) {
⋮----
// Initialize new staker
⋮----
// Delegate to an operator who has now become a staker, this should succeed as slashed operator's BCSF should not affect the staker
⋮----
// Register as operator and undelegate - the equivalent of redelegating to yourself
⋮----
// Complete withdrawals as shares
⋮----
contract Integration_FullySlashedEigenpod_NotCheckpointed is Integration_FullySlashedEigenpod_Base {
/// @dev Adding funds prior to checkpointing allows the pod to not be "bricked"
function testFuzz_proveValidator_checkpoint_queue_completeAsTokens(uint24 _rand) public rand(_rand) {
// Deal ETH to staker
⋮----
// Checkpoint slashed EigenPod
⋮----
// Queue Full Withdrawal
⋮----
// Complete withdrawal as tokens
⋮----
function testFuzz_depositMinimumAmount_checkpoint(uint24 _rand) public rand(_rand) {
// Deal ETH to staker, minimum amount to be checkpointed
⋮----
// Randomly deal 1 less than minimum amount to be checkpointed such that the pod is bricked
⋮----
// Send ETH to pod
⋮----
// BCSF is asserted to be zero here
````

## File: src/test/integration/tests/eigenpod/Pectra_Features.t.sol
````
// SPDX-License-Identifier: BUSL-1.1
⋮----
import "src/test/integration/IntegrationChecks.t.sol";
⋮----
contract Integration_Pectra_Features_Base is IntegrationCheckUtils {
⋮----
function _init() internal virtual override {
⋮----
function testFuzz_consolidate(uint24 _r) public rand(_r) {
⋮----
// Deal ETH and start 0x01 validators
⋮----
function testFuzz_partialWithdrawals(uint24 _r) public rand(_r) {
⋮----
// Deal ETH and start 0x02 validators
⋮----
// Create partial withdrawal requests for each validator, down to 32 ETH
````

## File: src/test/integration/tests/eigenpod/Register_Allocate_Slash_VerifyWC_.t.sol
````
// SPDX-License-Identifier: BUSL-1.1
⋮----
import "src/test/integration/mocks/BeaconChainMock.t.sol";
import "src/test/integration/IntegrationChecks.t.sol";
⋮----
/// @notice Testing the rounding behavior when operator magnitude is initially 1
contract Integration_Register_Allocate_Slash_VerifyWC is IntegrationCheckUtils {
⋮----
// uint[] initTokenBalances;
⋮----
/// 1. Create an operatorSet and register the operator allocating all magnitude
/// 2. slash operator to 1 magnitude remaining
/// 3. delegate staker to operator
/// 4. deposit (verify withdrawal credentials)
function _init() internal override {
⋮----
// 1. Create an operator set and register an operator
⋮----
// Allocate all magnitude to the operator set
⋮----
// 2. Fully slash operator
⋮----
// 3. Delegate to an operator
⋮----
// delegate staker without any depositShares in beaconChainETHStrategy yet
⋮----
// 4. deposit/verify withdrawal credentials
⋮----
/// Test sequence following _init()
/// 4. slash validators on beacon chain (start/complete checkpoint)
/// 5. queue withdrawal
/// 6. complete withdrawal
/// Given the operator has 1 magnitude remaining, the being slashed on the beacon chain
/// and calculating a non-WAD BCSF, their slashing factor should be rounded down to 0. Resulting in
/// the staker having 0 withdrawable shares.
function test_slashBC_startCompleteCP_queue_complete(uint24 _r) public rand(_r) {
// 4. slash validators on beacon chain (start/complete checkpoint)
⋮----
// ensure non zero amount slashed gwei so that we can test rounding down behavior
⋮----
// start and complete checkpoint
⋮----
// 5. queue withdrawal
⋮----
depositShares: withdrawShares, // amount of deposit shares to withdraw
withdrawableShares: 0.toArrayU256(), // amount of withdrawable shares is 0 due to slashing factor being 0
⋮----
// Operator's maxMagnitude is 1 and staker was slashed to non-WAD BCSF. Therefore
// staker should have been rounded down to 0
⋮----
// 6. complete withdrawal
// only strategy is beaconChainETHStrategy
⋮----
/// 4. fully slash operator on opSet again to 0 magnitude
/// 5. undelegate
/// 6. redeposit (start/complete checkpoint)
/// This is testing when an operator is fully slashed with 0 magnitude, the staker can still undelegate
/// and "redeposit" to Eigenlayer.
function test_slash_undelegate_redeposit(uint24 _r) public rand(_r) {
// 4. AVS slashes operator again to 0 magnitude and fully slashed
⋮----
// 5. undelegate results in 0 delegated shares removed since operator has 0 magnitude and staker is fully slashed too
⋮----
// 6. redeposit (start/complete checkpoint or verifyWC)
⋮----
// Verify WC
⋮----
// Start/complete CP
⋮----
/// 6. complete withdrawals as shares(although amount 0 from fully slashed operator)
/// 7. redeposit (start/complete checkpoint)
/// This is testing when an operator is fully slashed with 0 magnitude, the staker can still undelegate,
/// complete withdrawals as shares(0 shares though), and redeposit to Eigenlayer.
function test_slash_undelegate_completeAsShares_startCompleteCP(uint24 _r) public rand(_r) {
⋮----
// 6. complete withdrawals as shares(although amount 0 from fully slashed operator)
⋮----
// 7. redeposit (start/complete checkpoint)
⋮----
/// 6. complete withdrawals as tokens(although amount 0 from fully slashed operator)
/// 7. redeposit (start new validators and verifywc)
⋮----
/// complete withdrawals as tokens(0 tokens though), and redeposit to Eigenlayer.
function test_slash_undelegate_completeAsTokens_verifyWC(uint24 _r) public rand(_r) {
⋮----
// 6. complete withdrawals as tokens(although amount 0 from fully slashed operator)
// This also exits validators on the beacon chain
⋮----
// 7. deposit/verify withdrawal credentials
// randomly startup 1-10 validators
⋮----
/// 4. queue withdrawal
/// 5. complete withdrawal as tokens
/// This is testing a staker can queue a withdrawal and complete as tokens even
/// though the operator has 1 maxMagnitude
function test_queueAllShares_completeAsTokens(uint24 _r) public rand(_r) {
// 4. queue withdrawal
// ( , uint[] memory withdrawShares) = _randWithdrawal(strategies, initDepositShares);
⋮----
// 5. complete withdrawal as tokens
// - exits validators
// - advances epoch
// - starts/completes checkpoint
````

## File: src/test/integration/tests/eigenpod/SlashBC_OneBCSF.t.sol
````
// SPDX-License-Identifier: BUSL-1.1
⋮----
import "src/test/integration/mocks/BeaconChainMock.t.sol";
import "src/test/integration/IntegrationChecks.t.sol";
import "src/test/harnesses/EigenPodManagerWrapper.sol";
⋮----
/// @notice Testing the rounding behavior when beacon chain slashing factor is initially 1
contract Integration_SlashBC_OneBCSF is IntegrationCheckUtils {
⋮----
/// Shared setup:
/// 1. Update the EPM implementation to manually set the beaconChainSlashingFactor to 1
/// Note: Slashing the EigenPod enough (in units of gwei) to reduce the beaconChainSlashingFactor to 1 without
/// rounding down to 0 in a single slash even with increased MaxEB to 2048 is not possible and would require several
/// iterations of slashing to do so. Using a harness to set the beaconChainSlashingFactor to 1 is the easiest way for this test.
/// 2. create a new staker, operator, and avs
/// 3. start validators and verify withdrawal credentials
function _init() internal override {
// 1. etch a new implementation to set staker's beaconChainSlashingFactor to 1
⋮----
// 2. create a new staker, operator, and avs
⋮----
// 3. start validators and verify withdrawal credentials
⋮----
/// @notice Test that a staker can still verify WC, start/complete CP even if the operator has 1 magnitude remaining
function test_verifyWC_startCompleteCP(uint24 _r) public rand(_r) {
// 4. start validators and verify withdrawal credentials
⋮----
// 5. start/complete checkpoint
⋮----
// 6. Assert BCSF is still 1
⋮----
/// @notice Test that a staker is slashed to 0 BCSF from a minor slash and that they can't deposit more shares
/// from their EigenPod (either through verifyWC or start/complete CP)
function test_slashFullyBC_revert_deposit(uint24 _r) public rand(_r) {
// 4. slash validators on beacon chain (start/complete checkpoint)
⋮----
// BCSF should be 0 now
⋮----
// 5. deposit expecting revert (randomly pick to verifyWC, start/complete CP)
⋮----
// Verify WC
⋮----
// Start/complete CP
// Ensure that not all validators were slashed so that some rewards can be generated when
// we advance epoch
⋮----
/// @notice Test that a staker with 1 maxMagnitude and 1 BCSF has slashingFactor rounded down to 0
/// and further deposits are not possible
/// Test sequence following _init()
/// 4. Create an operator set and register an operator
/// 5. slash operator to 1 magnitude remaining
/// 6. delegate to operator
/// 7. deposit expecting revert (randomly pick to verifyWC, start/complete CP)
function test_slashAVS_delegate_revert_startCompleteCP(uint24 _r) public rand(_r) {
// 4. Create an operator set and register an operator
⋮----
// Allocate all magnitude to the operator set
⋮----
// 5. slash operator to 1 magnitude remaining
⋮----
// assert operator has 1 magnitude remaining
⋮----
// 6. delegate to operator
⋮----
// 7. deposit expecting revert (randomly pick to verifyWC, start/complete CP)
````

## File: src/test/integration/tests/eigenpod/Slashed_Eigenpod_BC.t.sol
````
// SPDX-License-Identifier: BUSL-1.1
⋮----
import "src/test/integration/IntegrationChecks.t.sol";
⋮----
contract Integration_SlashedEigenpod_BC is IntegrationCheckUtils {
⋮----
function _init() internal virtual override {
⋮----
tokens = _getUnderlyingTokens(strategies); // Should only return ETH
⋮----
// Deposit staker
⋮----
//Slash on Beacon chain
⋮----
// Checkpoint post slash
⋮----
function testFuzz_delegateSlashedStaker_dsfWad(uint24 _random) public rand(_random) {
⋮----
// Delegate to an operator
⋮----
// Undelegate from an operator
⋮----
// Complete withdrawal as shares
// Fast forward to when we can complete the withdrawal
⋮----
function testFuzz_delegateSlashedStaker_dsfNonWad(uint24 _random) public rand(_random) {
//Additional deposit on beacon chain so dsf is nonwad
⋮----
function testFuzz_delegateSlashedStaker_slashedOperator(uint24 _random) public rand(_random) {
⋮----
//randomize additional deposit to eigenpod
⋮----
// Create an operator set and register an operator.
⋮----
// Allocate to operator set
⋮----
//Slash operator before delegation
⋮----
function testFuzz_delegateSlashedStaker_redelegate_complete(uint24 _random) public rand(_random) {
⋮----
function testFuzz_delegateSlashedStaker_slashedOperator_withdrawAllShares_complete(uint24 _random) public rand(_random) {
⋮----
// Slash operator before delegation
⋮----
// Withdraw all shares
⋮----
function testFuzz_redeposit_queue_completeAsTokens(uint24 _random) public rand(_random) {
// Prove an additional validator
⋮----
// Queue withdrawal for all tokens
⋮----
// Complete withdrawal as tokens
⋮----
function testFuzz_redeposit_queue_completeAsShares(uint24 _random) public rand(_random) {
⋮----
// Queue withdrawal for all
⋮----
function testFuzz_verifyAdditionalValidator_delegateSlashedStaker(uint24 _random) public rand(_random) {
// Create operatorSet
⋮----
// Allocate to operatorSet
⋮----
check_Base_IncrAlloc_State(operator, allocateParams); // No increase in allocated stake since staker not delegated
⋮----
// Register to opSet
⋮----
// Slash operator - should have non-WAD magnitude
⋮----
// Verify additional validator
⋮----
// Delegate to operator
uint[] memory initDepositShares = _getStakerDepositShares(staker, strategies); // Deposit shares increased after verifying validator
⋮----
/// @notice This is not considered dual slashing since the operator is pre-slashed
contract Integration_SlashedOperator_SlashedEigenpod_Base is IntegrationCheckUtils {
⋮----
// 1. Deposit Into Strategies
⋮----
// 2. Create an operator set and register an operator.
⋮----
// Steps 3-4-5
// 3. Allocate to operatorSet
// 4. Register to opSet
// 5. Slash operator
⋮----
/// @dev Assumes operatorSet has been initialized with relevant strategies for staker
function _giveOperatorNonWadMagnitude(User _operator) internal returns (AllocateParams memory _allocateParams) {
⋮----
check_Base_IncrAlloc_State(_operator, _allocateParams); // No increase in allocated stake since staker not delegated
⋮----
// Slash operator
⋮----
contract Integration_SlashedOperator_SlashedEigenpod is Integration_SlashedOperator_SlashedEigenpod_Base {
⋮----
// 1-5
⋮----
// 6. Slash on BC
⋮----
// 7. Delegate to operator
⋮----
// 8. Verify Additional Validator
⋮----
initDepositShares = _getStakerDepositShares(staker, strategies); // Deposit shares increased after verifying validator
⋮----
function testFuzz_slashOnBC_delegate_verifyValidator_undelegate_completeAsTokens(uint24 _random) public rand(_random) {
// 9. Undelegate
⋮----
// 10. Complete withdrawal as tokens
⋮----
function testFuzz_slashOnBC_delegate_verifyValidator_undelegate_completeAsShares(uint24 _random) public rand(_random) {
⋮----
// 10. Complete withdrawal as shares
⋮----
function testFuzz_slashOnBC_delegate_verifyValidator_redelegate_completeAsTokens(uint24 _random) public rand(_random) {
// Create new operator
⋮----
// Randomly give the operator a non-WAD magnitude
⋮----
// 9. Redelegate
⋮----
function testFuzz_slashOnBC_delegate_verifyValidator_redelegate_completeAsShares(uint24 _random) public rand(_random) {
⋮----
contract Integration_Redelegate_SlashOperator_SlashEigenpod is Integration_SlashedOperator_SlashedEigenpod_Base {
⋮----
// 1-5.
⋮----
// 6. Delegate staker
⋮----
// 7. Create new operator & randomly give it a non-WAD magnitude
⋮----
// 8. Redelegate
⋮----
// 9. Slash original operator
⋮----
// 10. Slash on BC
⋮----
function testFuzz_delegate_redelegate_slashAVS_slashBC_verifyValidator_completeAsShares(uint24 _random) public rand(_random) {
// Populate withdrawal array
⋮----
// 11. Verify additional validator
⋮----
// 12. Complete withdrawal as shares
⋮----
function testFuzz_delegate_redelegate_slashAVS_slashBC_verifyValidator_completeAsTokens(uint24 _random) public rand(_random) {
⋮----
// 12. Complete withdrawal as tokens
⋮----
function testFuzz_delegate_redelegate_slashAVS_slashBC_completeAsShares_verifyValidator(uint24 _random) public rand(_random) {
⋮----
// 11. Complete withdrawal as shares
⋮----
// 12. Verify additional validator
⋮----
function testFuzz_delegate_redelegate_slashAVS_slashBC_completeAsTokens_verifyValidator(uint24 _random) public rand(_random) {
⋮----
// 11. Complete withdrawal as tokens
⋮----
contract Integration_SlashedEigenpod_BC_HalfSlash is IntegrationCheckUtils {
⋮----
function _init() internal override {
⋮----
// 1. Deposit staker
⋮----
// 2. Slash on Beacon chain
⋮----
// 3. Checkpoint post slash
⋮----
/// @notice Test sets up an EigenPod which has a non-WAD BCSF. After queue withdrawing all depositShares
/// which sets it to 0, they can then complete checkpoints repeatedly with 0 shares increase to increase the staker DSF each time
function test_completeCP_withNoAddedShares(uint24 _rand) public rand(_rand) {
// 4. queue withdraw all depositShares having it set to 0
⋮----
// 5. advance epoch no rewards
// start/complete cp repeatedly with 0 shares increase to increase the staker DSF each time
⋮----
// Staker deposit shares should be 0 from queue withdrawing all depositShares
// therefore the depositScalingFactor should also be reset WAD
⋮----
// 6. deposit: can either verify wc or start/complete cp or complete the withdrawals as shares
⋮----
// 7. delegateTo an operator
⋮----
// End state: staker and operator have much higher inflated withdrawable and delegated shares respectively
// The staker's withdrawable shares should be <= from withdrawable shares before (should be equal but could be less due to rounding)
````

## File: src/test/integration/tests/eigenpod/VerifyWC_StartCP_CompleteCP.t.sol
````
// SPDX-License-Identifier: BUSL-1.1
⋮----
import "src/test/integration/IntegrationChecks.t.sol";
import "src/test/integration/users/User.t.sol";
⋮----
contract Integration_VerifyWC_StartCP_CompleteCP is IntegrationCheckUtils {
function _init() internal override {
⋮----
function test_GasMetering() public rand(0) {
⋮----
// Deal user 20 full stakers worth of ETH
⋮----
// check_VerifyWC_State(staker, validators, beaconBalanceWei);
⋮----
// check pod balances have increased
⋮----
// check_StartCheckpoint_State(staker);
⋮----
// check_CompleteCheckpoint_State(staker);
// revert();
⋮----
///
///                    VERIFY -> START -> COMPLETE CHECKPOINT
///                             (TIMING VARIANTS)
⋮----
/// 1. Verify validators' withdrawal credentials
/// 2. start a checkpoint
/// 3. complete a checkpoint
/// => no change in shares between 1 and 3
function test_VerifyWC_StartCP_CompleteCP(uint24 _rand) public rand(_rand) {
⋮----
/// 2. Verify validators' withdrawal credentials again
/// => This should fail
function test_VerifyWC_VerifyWC_Fails(uint24 _rand) public rand(_rand) {
⋮----
/// 3. start a checkpoint again
⋮----
function test_VerifyWC_StartCP_StartCP_Fails(uint24 _rand) public rand(_rand) {
⋮----
/// 4. start a checkpoint without advancing a block
/// => this should fail
function test_VerifyWC_StartCP_CompleteCP_StartCP_Fails(uint24 _rand) public rand(_rand) {
⋮----
/// -- move forward 1 or more epochs
⋮----
function test_VerifyWC_Advance_StartCP_CompleteCP(uint24 _rand) public rand(_rand) {
⋮----
// Advance epoch without generating consensus rewards
⋮----
function test_VerifyWC_StartCP_Advance_CompleteCP(uint24 _rand) public rand(_rand) {
⋮----
///                          (EXIT TO POD VARIANTS)
⋮----
/// -- Fully exit validators before verifying withdrawal credentials
⋮----
function test_ExitValidators_VerifyWC_Fails(uint24 _rand) public rand(_rand) {
⋮----
// We use the beacon chain mock directly instead of the user contract since the
// user contract uses the precompile to exit validators. The pod expects validators
// to be proven to use the precompile.
⋮----
/// -- fully exit validators to pod
⋮----
function test_VerifyWC_ExitValidators_StartCP_CompleteCP(uint24 _rand) public rand(_rand) {
⋮----
// Fully exit one or more validators and advance epoch without generating rewards
⋮----
/// -- move forward an epoch
/// 4. start a checkpoint
/// 5. complete a checkpoint
/// => exited balance should be reflected in 4 and 5
function test_VerifyWC_StartCP_ExitValidators_CompleteCP(uint24 _rand) public rand(_rand) {
⋮----
///                          (SLASH TO POD VARIANTS)
⋮----
/// -- get slashed on beacon chain
/// 1. Try to verify validators' withdrawal credentials
⋮----
function test_SlashToPod_VerifyWC_Fails(uint24 _rand) public rand(_rand) {
⋮----
// Advance epoch, withdrawing slashed validators to pod
⋮----
/// -- get slashed on beacon chain; exit to pod
⋮----
/// => after 3, shares should decrease by slashed amount
function test_VerifyWC_SlashToPod_StartCP_CompleteCP(uint24 _rand) public rand(_rand) {
⋮----
// Advance epoch without generating rewards
⋮----
/// => slashed balance should be reflected in 4 and 5
function test_VerifyWC_StartCP_SlashToPod_CompleteCP(uint24 _rand) public rand(_rand) {
⋮----
/// 2. slash validators
/// 3. start a checkpoint
/// 4. verify withdrawal credentials for another validator while checkpoint in progress
⋮----
/// => Increase in shares between 1 and 4 should reflect the new validator, less the slashed amount
function test_VerifyWC_Slash_StartCP_VerifyWC_CompleteCP(uint24 _rand) public rand(_rand) {
⋮----
// Slash validators
⋮----
// Start a checkpoint
⋮----
// Start a new validator & verify withdrawal credentials
⋮----
///                    VERIFY -> PROVE STALE BALANCE -> COMPLETE CHECKPOINT
⋮----
function test_VerifyWC_SlashToPod_VerifyStale_CompleteCP(uint24 _rand) public rand(_rand) {
⋮----
/// -- get slashed on beacon chain; do not exit to pod
⋮----
function test_VerifyWC_SlashToCL_VerifyStale_CompleteCP_SlashAgain(uint24 _rand) public rand(_rand) {
⋮----
// Slash validators but do not process exits to pod
⋮----
// Slash validators again but do not process exits to pod
⋮----
function test_VerifyWC_StartCP_SlashToPod_CompleteCP_VerifyStale(uint24 _rand) public rand(_rand) {
⋮----
///                          (EARN ON CL VARIANTS)
⋮----
/// -- earn rewards on beacon chain (not withdrawn to pod)
⋮----
/// => after 3, shares increase by rewards earned on beacon chain
function test_EarnOnBeacon_VerifyWC_StartCP_CompleteCP(uint24 _rand) public rand(_rand) {
⋮----
// Advance epoch and generate consensus rewards, but don't withdraw to pod
⋮----
/// "Expected effective balance increase gwei":
// For verifyWithdrawalCredentials, we expect beacon chain rewards to be reflected in effective balance
// for any validator NOT at max effective balance.
⋮----
/// "Expected current balance increase gwei":
// For checkpointing, we expect additional beacon chain rewards to be reflected in current balance
// for any validator at max effective balance
⋮----
function test_VerifyWC_EarnOnBeacon_StartCP_CompleteCP(uint24 _rand) public rand(_rand) {
⋮----
function test_VerifyWC_StartCP_EarnOnBeacon_CompleteCP(uint24 _rand) public rand(_rand) {
⋮----
///                          (EARN TO POD VARIANTS)
⋮----
/// -- earn rewards on beacon chain (withdrawn to pod)
⋮----
/// => after 3, shares increase by rewards withdrawn to pod
function test_EarnToPod_VerifyWC_StartCP_CompleteCP(uint24 _rand) public rand(_rand) {
⋮----
// Advance epoch, generating consensus rewards and withdrawing anything over MaxEB
⋮----
// The validators < MaxEB will have their rewards proven in the checkpoint
// The validators == MaxEB will have their rewards proven in verifyWC
⋮----
function test_VerifyWC_EarnToPod_StartCP_CompleteCP(uint24 _rand) public rand(_rand) {
⋮----
// Advance epoch, generating consensus rewards and withdrawing anything over Max EB (2048 ETH)
⋮----
function test_VerifyWC_StartCP_EarnToPod_CompleteCP(uint24 _rand) public rand(_rand) {
⋮----
// Advance epoch, generating consensus rewards and withdrawing anything over 2048 ETH
⋮----
// `pod.balance == gweiSent + remainderSent
⋮----
///                          (NATIVE ETH VARIANTS)
⋮----
/// -- Pod receives native ETH via fallback
/// 1. start a checkpoint
/// => checkpoint should auto-complete, awarding shares for ETH in pod
function test_NativeETH_StartCP(uint24 _rand) public rand(_rand) {
⋮----
// Send a random amount of ETH to staker's fallback
⋮----
// Move forward an epoch so we generate a state root that can be queried in startCheckpoint
⋮----
// should behave identically to partial withdrawals captured by the "earn to pod" variants
⋮----
/// => after 3, shares should account for native ETH
function test_NativeETH_VerifyWC_StartCP_CompleteCP(uint24 _rand) public rand(_rand) {
⋮----
// check that `pod.balance == restakedExecutionLayerGwei + remainderSent
⋮----
function test_VerifyWC_NativeETH_StartCP_CompleteCP(uint24 _rand) public rand(_rand) {
⋮----
function test_VerifyWC_StartCP_NativeETH_CompleteCP(uint24 _rand) public rand(_rand) {
⋮----
// ... if we didn't have any partial withdrawals!
````

## File: src/test/integration/tests/upgrade/AllocationManagerUpgrade.t.sol
````
// SPDX-License-Identifier: BUSL-1.1
⋮----
import "src/test/integration/UpgradeTest.t.sol";
import {OperatorSet} from "src/contracts/libraries/OperatorSetLib.sol";
⋮----
contract Integration_Upgrade_AllocationManager is UpgradeTest {
⋮----
// Storage state snapshots
⋮----
// Storage variables that should persist across upgrades
⋮----
/// Shared setup:
///
/// 1. Generate staker with assets, operator, and AVS
/// 2. Staker deposits assets and delegates to operator
/// 3. AVS creates an operator set containing the strategies held by the staker
/// 4. Operator registers for the operator set
/// 5. Operator allocates to the operator set
/// 6. Roll blocks to complete allocation
function _init() internal override {
// 1. Create entities
⋮----
// 2. Staker deposits into EigenLayer
⋮----
// 3. Staker delegates to operator
⋮----
// 4. AVS creates an operator set containing the strategies held by the staker
⋮----
// 5. Operator registers for the operator set
⋮----
// 6. Operator allocates to the operator set
⋮----
// 7. Roll blocks to complete allocation
⋮----
function testFuzz_query_upgrade_compare(uint24 r) public rand(r) {
⋮----
function _captureAllocationManagerState() internal view returns (AllocationManagerState memory state) {
// Capture storage variables that should persist across upgrades
⋮----
// Only query strategy-related data if we have at least one strategy
⋮----
// Only query allocation data if we have at least one strategy
⋮----
function _verifyStorageStateConsistency(AllocationManagerState memory preUpgrade, AllocationManagerState memory postUpgrade) internal {
// Verify storage variables that should persist across upgrades
⋮----
// Verify array lengths
⋮----
// Verify allocation struct
⋮----
// Verify array contents (if arrays have elements)
````

## File: src/test/integration/tests/upgrade/README.md
````markdown
## Upgrade Tests

This folder contains specific tests we want to conduct to determine upgrade compatibility. Tests in this folder are only run if the `forktest` profile is selected, e.g:

`env FOUNDRY_PROFILE=forktest forge t --mc Upgrade`

#### How to Write

Upgrade tests inherit from the `UpgradeTest` mixin, which imports everything you need for a standard integration test. A standard integration test automatically upgrades all contracts to the latest repo contracts, even when forking from mainnet.

In contrast, the `UpgradeTest` mixin ensures that (when a test begins) the contracts we're working with are _not upgraded_. This allows the test writer to perform some initial setup actions before calling `_upgradeEigenLayerContracts()`, after which we can check that the upgrade correctly handles pre-upgrade state.

#### Example

Say we want to check that withdrawals initiated before the slashing upgrade are completable after the slashing upgrade. This example test shows how:

```solidity
contract Integration_Upgrade_Complete_PreSlashing_Withdrawal is UpgradeTest {
    
    function testFuzz_deposit_queue_upgrade_completeAsShares(uint24 _random) public rand(_random) {
        /// Pre-upgrade:
        /// 1. Create staker with some assets
        /// 2. Staker deposits into EigenLayer
        /// 3. Staker queues a withdrawal
        (User staker, IStrategy[] memory strategies, uint[] memory tokenBalances) = _newRandomStaker();
        User operator = User(payable(0));

        staker.depositIntoEigenlayer(strategies, tokenBalances);
        uint[] memory shares = _calculateExpectedShares(strategies, tokenBalances);
        IDelegationManagerTypes.Withdrawal[] memory withdrawals = staker.queueWithdrawals(strategies, shares);

        /// Upgrade to slashing contracts
        _upgradeEigenLayerContracts();

        // Complete pre-slashing withdrawals as shares
        _rollBlocksForCompleteWithdrawals(withdrawals);
        for (uint i = 0; i < withdrawals.length; i++) {
            staker.completeWithdrawalAsShares(withdrawals[i]);
            check_Withdrawal_AsShares_State(staker, operator, withdrawals[i], strategies, shares);
        }
    }
}
```

**Note** how the initial staker actions are NOT followed by `check_X_State` methods. This is because, before calling `_upgradeEigenLayerContracts`, the test is being run on old contracts. Adding invariant checks to old state transitions is not the point of this test and would add a lot of maintenance overhead.

**Note** that tests for previous upgrades should be removed if you need to write an upgrade for a new fork block.
````

## File: src/test/integration/tests/upgrade/SlasherMigration.t.sol
````
// SPDX-License-Identifier: BUSL-1.1
⋮----
import "src/test/integration/UpgradeTest.t.sol";
⋮----
contract Integration_Upgrade_SlasherMigration_Base is UpgradeTest {
⋮----
IERC20[] tokens; // underlying token for each strategy
⋮----
// List of all avss/operatorSets to be created, these do not have any stakers/operators/allocations, except for the first one
⋮----
/// Shared setup:
///
/// 1. Generate staker, operator, and AVS
/// 2. Staker deposits and delegates to operator
/// 3. AVS creates an operator set containing the strategies held by the staker
/// 4. Operator allocates to operator set
/// 5. Operator registers for operator set
/// 6. Create 6 more avss/operatorSets
⋮----
function _init() internal override {
⋮----
// 1. Deposit Into Strategies
⋮----
// 2. Delegate to an operator
⋮----
// 3. Create an operator set with strategies and register an operator.
⋮----
// Roll forward to after the allocation delay completes. We need to roll forward since the deploy version on mainnet
// still has to wait a `ALLOCATION_CONFIGURATION_DELAY` to allocate slashable stake.
⋮----
// 4. Operator allocates to operator set
⋮----
// 5. Operator registers for operator set
⋮----
// 6. Create 5 more avss/operatorSets (pre-upgrade)
⋮----
contract Integration_Upgrade_SlasherMigration is Integration_Upgrade_SlasherMigration_Base {
function testFuzz_upgrade_migrate(uint24 r) public rand(r) {
// 1. Upgrade contracts
⋮----
// Expect all slashers are 0 prior to migration
⋮----
// 2. Migrate slashers
⋮----
// Check that the slashers are set to the AVS
⋮----
function testFuzz_setAppointee_upgrade_migrate(uint24 r) public rand(r) {
// 1. Set appointee for the slasher for the first operatorSet
⋮----
// 2. Upgrade contracts
⋮----
// 3. Migrate slashers
⋮----
// Check the slashers are properly set
⋮----
function testFuzz_upgrade_migrate_updateSlasher_slash(uint24 r) public rand(r) {
⋮----
// 3. Update the slasher
⋮----
// 4. Slash the operator
````

## File: src/test/integration/tests/upgrade/StrategyManagerHooksUpgrade.t.sol
````
// SPDX-License-Identifier: BUSL-1.1
⋮----
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
⋮----
/// Upgrade to new contracts (with beforeAddShares/beforeRemoveShares hooks)
⋮----
/// Post-upgrade:
/// Queue withdrawal (tests beforeRemoveShares hook)
⋮----
/// Complete withdrawal as shares (tests beforeAddShares hook)
⋮----
/// Verify staker has their shares back
⋮----
// Beacon chain ETH shares are tracked in EigenPodManager, not StrategyManager
⋮----
/// @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) {
⋮----
/// Upgrade to new contracts
⋮----
/// Complete withdrawal as tokens
⋮----
// Record token balances before completing withdrawals
⋮----
// Get balances after completing withdrawals
⋮----
/// Verify staker has no shares and got tokens back
⋮----
// Verify token balance increased (skip beacon chain ETH which has different mechanics)
⋮----
/// @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) {
⋮----
/// 3. Queue withdrawal
⋮----
/// Complete withdrawal as shares (tests beforeAddShares hook for pre-upgrade queued withdrawal)
````

## File: src/test/integration/tests/upgrade/ZeroRegistrationDelay.t.sol
````
// SPDX-License-Identifier: BUSL-1.1
⋮----
import "src/test/integration/UpgradeTest.t.sol";
⋮----
contract Integration_Upgrade_ZeroRegistrationDelay is UpgradeTest {
⋮----
function _init() internal override {
⋮----
function testFuzz_register_upgrade_registerNew(uint24 r) public rand(r) {
// 1. Register operator
⋮----
// The delay should not be set since we adjusted `_newRandomOperator` to roll forward only 1 block after registration
⋮----
// 2. Upgrade contracts
⋮----
// 3. Register new operator
⋮----
// The delay should be set immediately
⋮----
// The delay for operator1 should still not be set
⋮----
// 4. Assert that operator2 is set after the configuration delay
````

## File: src/test/integration/tests/ALM_Multi.t.sol
````
// SPDX-License-Identifier: BUSL-1.1
⋮----
import "src/test/integration/IntegrationChecks.t.sol";
⋮----
contract Integration_ALM_Multi is IntegrationCheckUtils {
⋮----
/// iteration idx -> list of operators in each state
⋮----
/// operator -> list of strategies they have delegated assets in
⋮----
/// Last modifyAllocations params made by the operator
⋮----
function _init() internal virtual override {
⋮----
// 1. Deposit into strategies
⋮----
// 2. Delegate to operator
⋮----
// Add operator to NONE state for the 0th iteration
⋮----
// TODO: FIX THIS OR REPLACE (SUPER FLAKEY)
/// Reduce fuzz runs because this test is thiccc:
///
/// forge-config: default.fuzz.runs = 3
/// forge-config: forktest.fuzz.runs = 3
function test_Multi(uint24 _r) public rand(_r) {
⋮----
// Do 20 iterations
⋮----
// Ensure all pending actions are completed for the next iteration
⋮----
/// @dev NONE operators can:
/// [REGISTER, INCR_ALLOC, INCR_ALLOC_FULL]
function _dispatchNone(uint iter) internal {
// Fetch all NONE operators from previous iteration
⋮----
// Get operator and allocated strategies
⋮----
// Get action
⋮----
// Process action
⋮----
/// @dev REGISTERED operators can:
/// [DEREGISTER, INCR_ALLOC, INCR_ALLOC_FULL]
function _dispatchRegistered(uint iter) internal {
// Fetch all REGISTERED operators from previous iteration
⋮----
// Get operator
⋮----
// check_FullyAllocated_State(operator, operatorSet, params.strategies); TODO
⋮----
/// @dev ALLOCATED operators can:
/// [REGISTER, INCR_ALLOC, INCR_ALLOC_FULL, DECR_ALLOC, DECR_ALLOC_FULL]
function _dispatchAllocated(uint iter) internal {
// Fetch all ALLOCATED operators from previous iteration
⋮----
// check_FullyAllocated_State(operator); TODO
⋮----
// check_FullyDeallocated_State(operator); TODO
⋮----
/// @dev FULLY_ALLOCATED operators can:
/// [REGISTER, DECR_ALLOC, DECR_ALLOC_FULL]
function _dispatchFullyAllocated(uint iter) internal {
// Fetch all FULLY_ALLOCATED operators from previous iteration
⋮----
/// @dev REG_ALLOC operators can:
/// [DEREGISTER, INCR_ALLOC, INCR_ALLOC_FULL, DECR_ALLOC, DECR_ALLOC_FULL]
function _dispatchRegAlloc(uint iter) internal {
// Fetch all REG_ALLOC operators from previous iteration
⋮----
/// @dev REG_FULLY_ALLOC operators can:
/// [DEREGISTER, DECR_ALLOC, DECR_ALLOC_FULL]
function _dispatchRegFullyAlloc(uint iter) internal {
// Fetch all REG_FULLY_ALLOC operators from previous iteration
````

## File: src/test/integration/tests/ALM_RegisterAndModify.t.sol
````
// SPDX-License-Identifier: BUSL-1.1
⋮----
import "src/test/integration/IntegrationChecks.t.sol";
⋮----
contract Integration_ALMBase is IntegrationCheckUtils {
⋮----
/// Shared setup:
///
/// 1. Generate staker with deposited assets, operator, and AVS
/// 2. Deposit asssets and delegate to operator
/// 3. AVS creates an operator set containing the strategies held by the staker
function _init() internal virtual override {
⋮----
// 1. Deposit Into Strategies
⋮----
// 2. Delegate to an operator
⋮----
// 3. Create an operator set containing the strategies held by the staker
⋮----
contract Integration_InitRegistered is Integration_ALMBase {
/// @dev Integration test variants that start with the operator being registered
/// for the operator set
⋮----
// Register for operator set before allocating to any strategies
⋮----
function testFuzz_allocate_deallocate_deregister(uint24 _r) public rand(_r) {
// 1. Allocate to the operator set
⋮----
// 2. Roll to the allocation's effect block
⋮----
// 3. Deallocate fully from the operator set
⋮----
// 4. Deregister from operator set
⋮----
// 5. Check the operator is fully deallocated after the deallocation delay
⋮----
function testFuzz_allocate_deallocate_waitDeallocate_deregister(uint24 _r) public rand(_r) {
⋮----
// 4. Check the operator is fully deallocated after the deallocation delay
⋮----
// 5. Deregister from operator set
⋮----
function testFuzz_deregister_waitDeregister_allocate_deallocate(uint24 _r) public rand(_r) {
// 1. Deregister from operator set
⋮----
// 2. Wait for deallocation delay. Operator is no longer slashable
⋮----
// 3. Allocate to operator set
⋮----
// 3. Wait for allocation delay
⋮----
// 4. Deallocate operator from operator set
⋮----
function testFuzz_deregister_allocate_waitAllocate_deallocate(uint24 _r) public rand(_r) {
⋮----
// 2. Before deregistration is complete, allocate to operator set
// The operator should be slashable after the allocation delay
⋮----
// 3. Wait for allocation delay. Operator remains slashable
⋮----
function testFuzz_deregister_allocate_waitDeregister_deallocate(uint24 _r) public rand(_r) {
⋮----
// 3. Wait for deallocation delay so operator is no longer slashable
⋮----
// 4. Instant-deallocate operator from operator set
⋮----
contract Integration_InitAllocated is Integration_ALMBase {
/// @dev Integration test variants that start with the operator being allocated
⋮----
// Allocate fully to operator set
⋮----
function testFuzz_register_deallocate_deregister(uint24 _r) public rand(_r) {
// 1. Register for the operator set
⋮----
// 5. Roll forward to the deallocation's effect block and check the operator is fully deallocated
⋮----
function testFuzz_waitAllocation_register_deallocate(uint24 _r) public rand(_r) {
⋮----
// 1. Register for the operator set. The allocation immediately becomes slashable
⋮----
// 2. Deallocate fully from the operator set
⋮----
// 3. Roll forward to the deallocation's effect block and check the operator is fully deallocated
````

## File: src/test/integration/tests/CrosschainDeployLib.t.sol
````
// SPDX-License-Identifier: BUSL-1.1
⋮----
import "forge-std/Test.sol";
import "script/releases/CrosschainDeployLib.sol";
import "src/test/integration/IntegrationDeployer.t.sol";
⋮----
/// @notice Sanity check for the crosschain deploy lib
/// @dev We use the integration testing suite as it has RPC urls in our CI
contract Integration_CrosschainDeployLibTest_Testnet is IntegrationDeployer {
// Addresses, taken from zeus
⋮----
address hoodiExpectedProxyContract = 0xB99CC53e8db7018f557606C2a5B066527bF96b26; // Using type(TaskMailbox).name as name
⋮----
// Forks
⋮----
function setUp() public virtual override {
// Skip if we're not on a fork test profile
⋮----
/// @dev We test hoodi and mainnet in same function due to flakiness of `vm.setEnv`
function test_contracts_hoodi() public {
// Hoodi Fork
⋮----
// Deploy empty contract and proxy contract
⋮----
// Mainnet fork
⋮----
function test_address_prediction() public {
// Get on mainnet fork
⋮----
// Empty Contract
⋮----
// Proxy Contract
// Recreate the creationCode, because using vm.setEnv() is flaky in multiple functions in the same test contract
````

## File: src/test/integration/tests/Delegate_Deposit_Queue_Complete.t.sol
````
// SPDX-License-Identifier: BUSL-1.1
⋮----
import "src/test/integration/IntegrationChecks.t.sol";
import "src/test/integration/users/User.t.sol";
⋮----
contract Integration_Delegate_Deposit_Queue_Complete is IntegrationCheckUtils {
function testFuzz_delegate_deposit_queue_completeAsShares(uint24 _random) public rand(_random) {
// Create a staker and an operator with a nonzero balance and corresponding strategies
⋮----
// 1. Delegate to operator
⋮----
check_Delegation_State(staker, operator, strategies, new uint[](strategies.length)); // Initial shares are zero
⋮----
// 2. Deposit into strategy
⋮----
// Check that the deposit increased operator shares the staker is delegated to
⋮----
// 3. Queue Withdrawal
⋮----
// 4. Complete Queued Withdrawal
⋮----
function testFuzz_delegate_deposit_queue_completeAsTokens(uint24 _random) public rand(_random) {
````

## File: src/test/integration/tests/Deposit_Delegate_Allocate_Slash_Queue_Redeposit.t.sol
````
// SPDX-License-Identifier: BUSL-1.1
⋮----
import "src/test/integration/IntegrationChecks.t.sol";
import "src/test/integration/users/User.t.sol";
⋮----
contract Integration_Deposit_Delegate_Allocate_Slash_Queue_Redeposit is IntegrationCheckUtils {
⋮----
function _init() internal override {
⋮----
//user.depositIntoEigenlayer uses all ETH balance for a pod, so we deal back staker's
//starting ETH to replicate partial deposit state
⋮----
// 1. Deposit Into Strategies
⋮----
//dealing back ETH
⋮----
// 2. Delegate to operator
⋮----
// Create operator set and register operator
⋮----
// 3. Allocate to operator set
⋮----
function testFuzz_fullSlash_undelegate_complete_redeposit(uint24 _random) public rand(_random) {
// 4. Fully slash operator
⋮----
// 5. Undelegate from an operator
⋮----
// 6. Complete withdrawal. Staker should receive 0 shares/tokens after a full slash
⋮----
// 7. Redeposit
⋮----
function testFuzz_undelegate_fullSlash_complete_redeposit(uint24 _random) public rand(_random) {
// 4. Undelegate from an operator
⋮----
// 5. Fully slash operator
⋮----
function testFuzz_depositFull_fullSlash_undelegate_completeAsShares(uint24 _random) public rand(_random) {
⋮----
// 4. Fully slash random proper subset of operators strategies
⋮----
// add deposit shares to initDepositShares
⋮----
// 6. Complete withdrawal as shares
// Fast forward to when we can complete the withdrawal
⋮----
function testFuzz_deposit_delegate_allocate_partialSlash_redeposit_queue_complete(uint24 r) public rand(r) {
// Partially slash operator
⋮----
// Redeposit remaining tokens
⋮----
// Queue withdrawal
⋮----
// Complete withdrawal
⋮----
function testFuzz_deposit_delegate_undelegate_partialSlash_complete(uint24 r) public rand(r) {
// Undelegate from operator
⋮----
function testFuzz_deposit_delegate_deallocate_partialSlash_queue_complete(uint24 r) public rand(r) {
// Deallocate from operator set
⋮----
function testFuzz_deposit_delegate_deregister_partialSlash_queue_complete(uint24 r) public rand(r) {
// Deregister operator from operator set
⋮----
function testFuzz_delegate_zeroShares_partialSlash_deposit_undelegate_complete(uint24 r) public rand(r) {
// Create a new staker with 0 shares
⋮----
// Delegate to operator (with 0 shares)
⋮----
// Deposit tokens
⋮----
// Undelegate
⋮----
function testFuzz_deposit_delegate_allocate_partialSlash_deallocate(uint24 r) public rand(r) {
⋮----
function testFuzz_fullSlash_undelegate_redeposit_complete(uint24 _random) public rand(_random) {
⋮----
// 6. Redeposit
⋮----
// 7. Complete withdrawal. Staker should receive 0 shares/tokens after a full slash
⋮----
// Final state checks
⋮----
function testFuzz_fullSlash_redelegate_redeposit_complete(uint24 _random) public rand(_random) {
````

## File: src/test/integration/tests/Deposit_Delegate_Queue_Complete.t.sol
````
// SPDX-License-Identifier: BUSL-1.1
⋮----
import "src/test/integration/IntegrationChecks.t.sol";
import "src/test/integration/users/User.t.sol";
⋮----
contract Integration_Deposit_Delegate_Queue_Complete is IntegrationCheckUtils {
///
///                             FULL WITHDRAWALS
⋮----
// TODO: fix test
/// Generates a random staker and operator. The staker:
/// 1. deposits all assets into strategies
/// 2. delegates to an operator
/// 3. queues a withdrawal for a ALL shares
/// 4. completes the queued withdrawal as tokens
function testFuzz_deposit_delegate_queue_completeAsTokens(uint24 _random) public rand(_random) {
/// 0. Create an operator and a staker with:
// - some nonzero underlying token balances
// - corresponding to a random subset of valid strategies (StrategyManager and/or EigenPodManager)
//
// ... check that the staker has no delegatable shares and isn't currently delegated
⋮----
// 1. Deposit Into Strategies
⋮----
// 2. Delegate to an operator
⋮----
// 3. Queue Withdrawals
⋮----
// 4. Complete withdrawal
// Fast forward to when we can complete the withdrawal
⋮----
// Check final state:
⋮----
/// 4. completes the queued withdrawal as shares
function testFuzz_deposit_delegate_queue_completeAsShares(uint24 _random) public rand(_random) {
⋮----
///                           RANDOM WITHDRAWALS
⋮----
/// 3. queues a withdrawal for a random subset of shares
⋮----
function testFuzz_deposit_delegate_queueRand_completeAsTokens(uint24 _random) public rand(_random) {
⋮----
// Randomly select one or more assets to withdraw
⋮----
// 4. Complete withdrawals
⋮----
function testFuzz_deposit_delegate_queueRand_completeAsShares(uint24 _random) public rand(_random) {
⋮----
///                            UNHAPPY PATH TESTS
⋮----
/// --- registers as an operator
⋮----
/// ... we check that the final step fails
function testFuzz_deposit_delegate_revert_alreadyDelegated(uint24 _random) public rand(_random) {
⋮----
/// 0. Create a staker and operator
⋮----
// 2. Register staker as an operator
⋮----
// 3. Attempt to delegate to an operator
//    This should fail as the staker is already delegated to themselves.
````

## File: src/test/integration/tests/Deposit_Delegate_Redelegate_Complete.t.sol
````
// SPDX-License-Identifier: BUSL-1.1
⋮----
import "src/test/integration/users/User.t.sol";
import "src/test/integration/IntegrationChecks.t.sol";
⋮----
contract Integration_Deposit_Delegate_Redelegate_Complete is IntegrationCheckUtils {
⋮----
/// Randomly generates a user with different held assets. Then:
/// 1. deposit into strategy
/// 2. delegate to an operator
/// 3. undelegates from the operator
/// 4. complete queued withdrawal as shares
/// 5. delegate to a new operator
/// 5. queueWithdrawal
/// 7. complete their queued withdrawal as tokens
function testFuzz_deposit_delegate_reDelegate_completeAsTokens(uint24 _random) public rand(_random) {
/// 0. Create an operator and a staker with:
// - some nonzero underlying token balances
// - corresponding to a random number of strategies
//
// ... check that the staker has no deleagatable shares and isn't delegated
⋮----
//delegatable shares equals deposit shares here because no bc slashing
⋮----
/// 1. Deposit Into Strategies
⋮----
// 2. Delegate to an operator
⋮----
// 3. Undelegate from an operator
⋮----
// 4. Complete withdrawal as shares
// Fast forward to when we can complete the withdrawal
⋮----
// 5. Delegate to a new operator
⋮----
// 6. Queue Withdrawal
⋮----
// 7. Complete withdrawal
⋮----
// Complete withdrawals
⋮----
function testFuzz_deposit_delegate_reDelegate_completeAsShares(uint24 _random) public rand(_random) {
⋮----
// Complete all but last withdrawal as tokens
⋮----
// Complete last withdrawal as shares
⋮----
function testFuzz_deposit_delegate_reDelegate_depositAfterRedelegate(uint24 _random) public rand(_random) {
_configAssetTypes(HOLDS_LST); // not holding ETH since we can only deposit 32 ETH multiples
⋮----
// Divide shares by 2 in new array to do deposits after redelegate
⋮----
// 6. Deposit into Strategies
⋮----
// 7. Queue Withdrawal
⋮----
// 8. Complete withdrawal
⋮----
function testFuzz_deposit_delegate_reDelegate_depositBeforeRedelegate(uint24 _random) public rand(_random) {
⋮----
// 5. Deposit into Strategies
⋮----
// 6. Delegate to a new operator
⋮----
function testFuzz_deposit_delegate_undelegate_withdrawAsTokens_reDelegate_completeAsTokens(uint24 _random) public rand(_random) {
/// 0. Create operators and a staker
⋮----
// 4. Complete withdrawal as tokens
⋮----
//5. Deposit into Strategies
⋮----
// 8. Complete withdrawal as shares
⋮----
// Complete withdrawals as tokens
⋮----
function testFuzz_deposit_delegate_undelegate_withdrawAsTokens_reDelegate_completeAsShares(uint24 _random) public rand(_random) {
⋮----
// 4. Complete withdrawal as Tokens
⋮----
// Complete withdrawals as shares
````

## File: src/test/integration/tests/Deposit_Delegate_Undelegate_Complete.t.sol
````
// SPDX-License-Identifier: BUSL-1.1
⋮----
import "src/test/integration/users/User.t.sol";
import "src/test/integration/IntegrationChecks.t.sol";
⋮----
contract Integration_Deposit_Delegate_Undelegate_Complete is IntegrationCheckUtils {
/// Randomly generates a user with different held assets. Then:
/// 1. deposit into strategy
/// 2. delegate to an operator
/// 3. undelegates from the operator
/// 4. complete their queued withdrawal as tokens
function testFuzz_deposit_undelegate_completeAsTokens(uint24 _random) public rand(_random) {
/// 0. Create an operator and a staker with:
// - some nonzero underlying token balances
// - corresponding to a random number of strategies
//
// ... check that the staker has no deleagatable shares and isn't delegated
⋮----
//delegatable shares equals deposit shares here because no bc slashing
⋮----
/// 1. Deposit Into Strategies
⋮----
// 2. Delegate to an operator
⋮----
// 3. Undelegate from an operator
⋮----
// 4. Complete withdrawal
// Fast forward to when we can complete the withdrawal
⋮----
// Complete withdrawal
⋮----
// Check Final State
⋮----
/// 4. complete their queued withdrawal as shares
function testFuzz_deposit_undelegate_completeAsShares(uint24 _random) public rand(_random) {
⋮----
// Check final state:
⋮----
function testFuzz_deposit_delegate_forceUndelegate_completeAsTokens(uint24 _random) public rand(_random) {
⋮----
// 3. Force undelegate
⋮----
function testFuzz_deposit_delegate_forceUndelegate_completeAsShares(uint24 _random) public rand(_random) {
⋮----
function testFuzz_deposit_delegate_undelegate_completeAsTokens_Max_Strategies(uint24 _random) public rand(_random) {
````

## File: src/test/integration/tests/Deposit_Delegate_UpdateBalance.t.sol
````
// SPDX-License-Identifier: BUSL-1.1
⋮----
import "src/test/integration/IntegrationChecks.t.sol";
import "src/test/integration/users/User.t.sol";
⋮----
contract Integration_Deposit_Delegate_UpdateBalance is IntegrationCheckUtils {
// TODO: fix for slashing
/// Generates a random stake and operator. The staker:
/// 1. deposits all assets into strategies
/// 2. delegates to an operator
/// 3. queues a withdrawal for a ALL shares
/// 4. updates their balance randomly
/// 5. completes the queued withdrawal as tokens
// function testFuzz_deposit_delegate_updateBalance_completeAsTokens(uint24 _random) public {
//     _configRand({
//         _randomSeed: _random,
//         _assetTypes: HOLDS_ETH, // HOLDS_LST | HOLDS_ETH | HOLDS_ALL,
//         _userTypes: DEFAULT //| ALT_METHODS
//     });
//     /// 0. Create an operator and staker with some underlying assets
//     (
//         User staker,
//         IStrategy[] memory strategies,
//         uint[] memory tokenBalances
//     ) = _newRandomStaker();
//     (User operator, ,) = _newRandomOperator();
//     // Upgrade contracts if forkType is not local
//     _upgradeEigenLayerContracts();
//     uint[] memory shares = _calculateExpectedShares(strategies, tokenBalances);
//     assert_HasNoDelegatableShares(staker, "staker should not have delegatable shares before depositing");
//     assertFalse(delegationManager.isDelegated(address(staker)), "staker should not be delegated");
//     /// 1. Deposit into strategies
//     staker.depositIntoEigenlayer(strategies, tokenBalances);
//     check_Deposit_State(staker, strategies, shares);
//     /// 2. Delegate to an operator
//     staker.delegateTo(operator);
//     check_Delegation_State(staker, operator, strategies, shares);
//     /// 3. Queue withdrawals for ALL shares
//     Withdrawal[] memory withdrawals = staker.queueWithdrawals(strategies, shares);
//     bytes32[] memory withdrawalRoots = _getWithdrawalHashes(withdrawals);
//     check_QueuedWithdrawal_State(staker, operator, strategies, shares, withdrawals, withdrawalRoots);
//     // Generate a random balance update:
//     // - For LSTs, the tokenDelta is positive tokens minted to the staker
//     // - For ETH, the tokenDelta is a positive or negative change in beacon chain balance
⋮----
//         int[] memory tokenDeltas,
//         int[] memory stakerShareDeltas,
//         int[] memory operatorShareDeltas
//     ) = _randBalanceUpdate(staker, strategies);
//     // 4. Update LST balance by depositing, and beacon balance by submitting a proof
//     staker.updateBalances(strategies, tokenDeltas);
//     assert_Snap_Delta_StakerShares(staker, strategies, stakerShareDeltas, "staker should have applied deltas correctly");
//     assert_Snap_Delta_OperatorShares(operator, strategies, operatorShareDeltas, "operator should have applied deltas correctly");
//     console.log("withdrawble: ", staker.pod().withdrawableRestakedExecutionLayerGwei());
//     // Fast forward to when we can complete the withdrawal
//     _rollBlocksForCompleteWithdrawals(withdrawals);
//     // 5. Complete queued withdrawals as tokens
//     staker.completeWithdrawalsAsTokens(withdrawals);
//     assertEq(address(operator), delegationManager.delegatedTo(address(staker)), "staker should still be delegated to operator");
//     assert_NoWithdrawalsPending(withdrawalRoots, "all withdrawals should be removed from pending");
//     assert_Snap_Unchanged_TokenBalances(operator, "operator token balances should not have changed");
//     assert_Snap_Unchanged_OperatorShares(operator, "operator shares should not have changed");
// }
````

## File: src/test/integration/tests/Deposit_Queue_Complete.t.sol
````
// SPDX-License-Identifier: BUSL-1.1
⋮----
import "src/test/integration/users/User.t.sol";
import "src/test/integration/IntegrationChecks.t.sol";
⋮----
contract Integration_Deposit_QueueWithdrawal_Complete is IntegrationCheckUtils {
/// Randomly generates a user with different held assets. Then:
/// 1. deposit into strategy
/// 2. queueWithdrawal
/// 3. completeQueuedWithdrawal"
function testFuzz_deposit_queueWithdrawal_completeAsTokens(uint24 _random) public rand(_random) {
// Create a staker with a nonzero balance and corresponding strategies
⋮----
// 1. Deposit into strategy
⋮----
// Ensure staker is not delegated to anyone post deposit
⋮----
// 2. Queue Withdrawal
⋮----
// 3. Complete Queued Withdrawal
⋮----
// Ensure staker is still not delegated to anyone post withdrawal completion
⋮----
function testFuzz_deposit_queueWithdrawal_completeAsShares(uint24 _random) public rand(_random) {
⋮----
/// @notice Regression test to ensure that depositSharesToRemove is not allowed to overflow. Previously
/// this vulnerability would allow a staker to queue a withdrawal overflowing amount of deposit shares to withdraw
/// resulting them in inflating their existing deposit shares. They could then inflate an operators delegated shares as much as they wanted.
function testFuzz_deposit_revertOverflow_queueWithdrawal(uint24 _random) public rand(_random) {
⋮----
// Deposit staker by verifying withdrawal credentials
⋮----
// Queue withdrawal for depositSharesToRemove that overflows
````

## File: src/test/integration/tests/Deposit_Register_QueueWithdrawal_Complete.t.sol
````
// SPDX-License-Identifier: BUSL-1.1
⋮----
import "src/test/integration/users/User.t.sol";
import "src/test/integration/IntegrationChecks.t.sol";
⋮----
contract Integration_Deposit_Register_QueueWithdrawal_Complete is IntegrationCheckUtils {
function testFuzz_deposit_registerOperator_queueWithdrawal_completeAsShares(uint24 _random) public rand(_random) {
// Create a staker with a nonzero balance and corresponding strategies
⋮----
// 1. Staker deposits into strategy
⋮----
// 2. Staker registers as an operator
⋮----
// 3. Queue Withdrawal
⋮----
// 4. Complete Queued Withdrawal as Shares
⋮----
function testFuzz_deposit_registerOperator_queueWithdrawal_completeAsTokens(uint24 _random) public rand(_random) {
⋮----
// 4. Complete Queued Withdrawal as Tokens
````

## File: src/test/integration/tests/DualSlashing.t.sol
````
// SPDX-License-Identifier: BUSL-1.1
⋮----
import "src/test/integration/IntegrationChecks.t.sol";
⋮----
/// @notice Tests where we slash native eth on the Beacon Chain and by an OperatorSet
contract Integration_DualSlashing_Base is IntegrationCheckUtils {
⋮----
function _init() internal virtual override {
⋮----
// Create staker, operator, and avs
⋮----
// 1. Deposit into strategies
⋮----
// 2. Delegate staker to operator
⋮----
// 3. Create an operator set containing the strategies held by the staker
⋮----
// 4. Register operator to AVS
⋮----
// 5. Allocate to the operator set
⋮----
contract Integration_DualSlashing_BeaconChainFirst is Integration_DualSlashing_Base {
function testFuzz_bcSlash_checkpoint_avsSlash(uint24 _random) public rand(_random) {
// 6. Slash staker on BC
⋮----
// 7. Checkpoint
⋮----
// 8. Slash operator by AVS
⋮----
contract Integration_DualSlashing_AVSFirst is Integration_DualSlashing_Base {
⋮----
// 6. Slash operator by AVS
⋮----
/// @dev Validates behavior of "restaking", i.e. that the funds can be slashed twice
function testFuzz_avsSlash_bcSlash_checkpoint(uint24 _random) public rand(_random) {
// 7. Slash Staker on BC
⋮----
// 8. Checkpoint
⋮----
/// @notice Because the validator is proven prior to the BC slash, the system applies the new balance
///         to the BC and AVS slash combined
function testFuzz_avsSlash_verifyValidator_bcSlash_checkpoint(uint24 _random) public rand(_random) {
// 7. Verify Validator
⋮----
// 8. Slash first validators on BC
⋮----
// 9. Checkpoint
⋮----
/// @dev Same as above, but validator is proven after BC slash (this ordering doesn't matter to EL)
function testFuzz_avsSlash_bcSlash_verifyValidator_checkpoint(uint24 _random) public rand(_random) {
⋮----
// 8. Verify Validator
⋮----
/// @notice The validator proven should not be affected by the BC or AVS slashes
function testFuzz_avsSlash_bcSlash_checkpoint_verifyValidator(uint24 _rand) public rand(_rand) {
⋮----
// 9. Verify Validator
⋮----
/// @notice The balance increase results in the pods not processing the beacon slash as a slash, given
///         that the checkpoint had a positive delta
function testFuzz_avsSlash_bcSlash_balanceIncrease_checkpoint(uint24 _rand) public rand(_rand) {
⋮----
// 8. Send 32 ETH to pod, some random amount of ETH, greater than the amount slashed
⋮----
/// @notice The balance increase occurs after the slashings are processed, so it should be unaffected by the slashings
function testFuzz_avsSlash_bcSlash_checkpoint_balanceIncrease(uint24 _rand) public rand(_rand) {
⋮----
// 9. Send 32 ETH to pod, some random amount of ETH, greater than the amount slashed
⋮----
// 10. Checkpoint. This should immediately complete as there are no more active validators
⋮----
contract Integration_DualSlashing_FullSlashes is Integration_DualSlashing_Base {
⋮----
// Either Fully Slash on AVS or BC, ordering does not matter
⋮----
// 6. Slash operator by AVS fully
⋮----
/// 7. Fully slash on BC
⋮----
// 6. Slash operator by BC fully
⋮----
// 7. Slash operator by AVS fully
⋮----
function testFuzz_fullDualSlash_undelegate_verifyValidator_checkpoint_exitEverything(uint24 _random) public rand(_random) {
// 8. Undelegate staker, so we don't revert when verifying a validator
⋮----
// 9. Verify validator
⋮----
// 10. Checkpoint
⋮----
// Withdrawable shares should decrease by a factor of the BCSF
⋮----
// 11. Exit remaining validators & checkpoint
// Exit validators directly on beacon chain
⋮----
// 12. Complete first set of withdrawals
⋮----
// 13. Queue withdrawal for all remaining shares
⋮----
// 14. Complete second set of withdrawals
⋮----
// Sanity check that balance locked in pod and depositShares are 0
⋮----
function testFuzz_fullDualSlash_redeposit_revertCheckpoint(uint24 _random) public rand(_random) {
// 8. Deposit ETH into pod, doesn't matter how large it is, we'll still revert
⋮----
// 9. Checkpoint. This should revert as the slashing factor is 0
⋮----
function testFuzz_fullDualSlash_checkpoint(uint24 _random) public rand(_random) {
````

## File: src/test/integration/tests/DurationVaultIntegration.t.sol
````
// SPDX-License-Identifier: BUSL-1.1
⋮----
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 {
⋮----
function test_durationVault_deposit_requires_delegation() public {
⋮----
function test_durationVault_queue_blocked_after_lock_but_completion_allowed_if_queued_before() public {
⋮----
// Queue before lock succeeds (partial amount to leave shares for revert check).
⋮----
// Lock blocks new queues.
⋮----
// Pre-lock queued withdrawal can complete during ALLOCATIONS.
⋮----
function test_durationVault_allocation_delay_exceeds_withdrawal_delay_for_queued_withdrawals() public {
⋮----
// Queue full withdrawal before lock.
⋮----
// Lock the vault; allocation delay is set to minWithdrawalDelayBlocks()+1 inside lock().
⋮----
// Fetch allocation; the effectBlock should be in the future due to allocation delay config.
⋮----
// Advance to just before allocation takes effect but after withdrawal delay.
⋮----
// Roll to min(withdrawalDelay, allocationDelay - 1) to complete before activation.
⋮----
cheats.warp(block.timestamp + 1); // keep timestamps monotonic
⋮----
// Ensure allocation still pending (defensive).
⋮----
// Complete withdrawal successfully before allocation becomes slashable.
⋮----
function test_durationVault_queued_withdrawals_reduce_effective_tvl_cap() public {
⋮----
// First deposit.
⋮----
// Queue most of the stake; this reduces slashable TVL counted toward the cap.
⋮----
// With the first deposit queued, slashable TVL is ~0, so multiple deposits up to the cap succeed.
⋮----
// Next deposit would exceed the stake cap once queued stake is excluded.
⋮----
// Complete the queued withdrawal to recover the first deposit.
⋮----
function test_durationVaultLifecycle_flow_deposit_lock_mature() public {
⋮----
// Queue withdrawal prior to lock.
⋮----
// Ensure allocation becomes effective before maturity so deallocation won't hit pending modification.
⋮----
// Cannot deposit once locked.
⋮----
// Mature the vault and allow withdrawals.
⋮----
// Advance past deallocation delay to ensure slashability cleared.
⋮----
function test_durationVault_arbitrator_can_advance_to_withdrawals_early() public {
⋮----
// Arbitrator cannot advance before lock.
⋮----
// Non-arbitrator cannot advance.
⋮----
// Arbitrator can advance after lock but before duration elapses.
⋮----
// Withdrawals should actually be possible in this early-advance path.
⋮----
// markMatured should be a noop after the state has already transitioned.
⋮----
function test_durationVault_operatorIntegrationAndMetadataUpdate() public {
⋮----
function test_durationVault_TVLLimits_enforced_and_frozen_after_lock() public {
⋮----
// Deposit within limits.
⋮----
// Hitting total cap reverts.
⋮----
function test_durationVault_rewards_claim_while_locked() public {
⋮----
// Prepare reward token and fund RewardsCoordinator.
⋮----
// Allow this test to submit roots.
⋮----
// Build single-earner, single-token merkle claim.
⋮----
// Advance time past the activation delay so the root becomes claimable.
⋮----
function test_durationVault_slashing_routes_to_insurance_and_blocks_after_maturity() public {
⋮----
// Move past allocation delay so allocation is active when slashing.
⋮----
// Mature the vault and advance beyond slashable window.
⋮----
function test_durationVault_slashing_affectsQueuedWithdrawalsAndPaysInsurance() public {
⋮----
// Queued withdrawals remove shares from the operator, so expect zero redistribution.
⋮----
function _deployDurationVault(address insuranceRecipient) internal returns (DurationVaultContext memory ctx) {
⋮----
function _durationStrategyArray(IDurationVaultStrategy vault) internal pure returns (IStrategy[] memory arr) {
⋮----
function _singleAmountArray(uint amount) internal pure returns (uint[] memory arr) {
⋮----
function _delegateToVault(User staker, IDurationVaultStrategy vault) internal {
⋮----
function _randomInsuranceRecipient() internal view returns (address) {
⋮----
function _buildSingleLeafClaim(address earner, IERC20 token, uint amount)
````

## File: src/test/integration/tests/EmissionsController_ReentrancyGrief.t.sol
````
// SPDX-License-Identifier: BUSL-1.1
⋮----
// 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();
````

## File: src/test/integration/tests/EmissionsController.t.sol
````
// SPDX-License-Identifier: BUSL-1.1
⋮----
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 {
⋮----
function _init() internal virtual override {
⋮----
// Get incentive council address
⋮----
// Enable emissions controller as rewards submitter
⋮----
// Create AVS and operator for operator set distributions
⋮----
function _genEvenlyDistributedWeights(uint numWeights, uint16 totalWeight) internal returns (uint16[] memory weights) {
⋮----
// Distribute remainder across first few weights
⋮----
function _genRandParams() internal returns (uint64 startEpoch, uint16 totalWeight, uint numDistributions) {
⋮----
// 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)
⋮----
contract Integration_EmissionsController_E2E is Integration_EmissionsController_Base {
/// -----------------------------------------------------------------------
/// ALL BEFORE emissions start
⋮----
function testFuzz_addDists_pressButton_noneProcessed(uint24 r) public rand(r) {
⋮----
// 1. Add distributions
⋮----
// 2. Press button (should revert `EmissionsNotStarted()`)
⋮----
function testFuzz_addDists_updateDists_pressButton_noneProcessed(uint24 r) public rand(r) {
⋮----
// 2. Update distributions
⋮----
// 3. Press button
⋮----
function testFuzz_addDists_pressButton_noneProcessed_sweep_noneSwept(uint24 r) public rand(r) {
⋮----
// 2. Press button
⋮----
// 3. Sweep
⋮----
function testFuzz_addDists_updateDists_pressButton_noneProcessed_sweep_noneSwept(uint24 r) public rand(r) {
⋮----
// 4. Sweep
⋮----
function testFuzz_addDists_sweep_noneSwept(uint24 r) public rand(r) {
⋮----
// 2. Sweep
⋮----
function testFuzz_addDists_updateDists_sweep_noneSwept(uint24 r) public rand(r) {
⋮----
/// BEFORE → AFTER transition (add before, then something after)
⋮----
function testFuzz_addDists_warp_pressButton(uint24 r) public rand(r) {
⋮----
// 2. Warp to start epoch
⋮----
// 4. Press button again (should revert).
⋮----
function testFuzz_addDists_updateDists_warp_pressButton(uint24 r) public rand(r) {
⋮----
// 3. Warp to start epoch
⋮----
// 4. Press button
⋮----
function testFuzz_addDists_warp_pressButton_sweep(uint24 r) public rand(r) {
⋮----
// 5. Press button again (should revert).
⋮----
function testFuzz_addDists_updateDists_warp_pressButton_sweep(uint24 r) public rand(r) {
⋮----
// 5. Sweep
⋮----
// 6. Press button again (should revert).
⋮----
function testFuzz_addDists_warp_updateDists_pressButton(uint24 r) public rand(r) {
⋮----
// 3. Update distributions
⋮----
function testFuzz_addDists_warp_updateDists_pressButton_sweep(uint24 r) public rand(r) {
⋮----
/// Invariants for pressButton
⋮----
/// @dev Assert that all distributions succeed given valid inputs.
function testFuzz_addDists_pressButton_allDistributionTypes(uint24 r) public rand(r) {
⋮----
// 1. Add distributions with all types
⋮----
// 3. Press button - should process all distributions
⋮----
/// @dev Assert that the function skips disabled distributions.
function testFuzz_addDists_pressButton_skipsDisabledDistributions(uint24 r) public rand(r) {
⋮----
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)
⋮----
uint numToDisable = _randUint({min: 1, max: numDistributions - 1}); // At least 1 disabled, at least 1 enabled
⋮----
types[i] = DistributionType(uint8(_randUint({min: 1, max: 5}))); // Non-disabled types
⋮----
// 1. Add distributions (all enabled)
⋮----
// 2. Update some distributions to disabled
⋮----
// Note: Disabling distributions doesn't change totalWeight - it just affects processing
⋮----
// 4. Press button - should only process non-disabled distributions
⋮----
/// @dev Assert that the function skips distributions that have not started yet.
function testFuzz_addDists_pressButton_skipsNotYetStartedDistributions(uint24 r) public rand(r) {
⋮----
startEpoch = uint64(_randUint({min: 2, max: 2**12 - 1})); // Ensure startEpoch > 0
⋮----
// Generate random distribution types (non-disabled)
⋮----
// 1. Add distributions with staggered start epochs
⋮----
// Manually update some distributions to have later start epochs
⋮----
distributions[i].startEpoch = startEpoch + 1; // Start one epoch later
⋮----
// 2. Warp to start epoch (some distributions haven't started yet)
⋮----
// 3. Press button - should only process distributions that have started
⋮----
/// @dev Assert that the function skips distributions that have ended.
function testFuzz_addDists_pressButton_skipsEndedDistributions(uint24 r) public rand(r) {
⋮----
startEpoch = uint64(_randUint({min: 1, max: 100})); // Keep epochs reasonable
⋮----
// 1. Add distributions (all have totalEpochs = 1 by default, meaning they end after first epoch)
⋮----
// Update some distributions to have totalEpochs = 0 (infinite, so they DON'T end)
// The rest keep totalEpochs = 1 (end after startEpoch)
⋮----
distributions[i].totalEpochs = 0; // Infinite - will be active in all epochs
⋮----
// 2. Warp to the first epoch where time-limited distributions are active
⋮----
// 3. Press button - all distributions should be processed
⋮----
// 4. Verify button is not pressable (all distributions processed for this epoch)
⋮----
// 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
⋮----
// 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
⋮----
/// @dev Assert that the function skips distributions with zero weight.
function testFuzz_addDists_pressButton_skipsZeroWeightDistributions(uint24 r) public rand(r) {
⋮----
// Update some distributions to have zero weight
⋮----
// Recalculate expected totalWeight after zero-weight updates
⋮----
// 3. Press button - should skip zero-weight distributions
// Note: Zero-weight distributions don't emit DistributionProcessed events
⋮----
/// @dev Assert that the function processes zero distributions when length is zero.
function testFuzz_addDists_pressButtonLengthZero_NoneProcessed(uint24 r) public rand(r) {
⋮----
// 3. Press button with length 0 - should process zero distributions
⋮----
// 4. Button should still be pressable since distributions remain
⋮----
/// 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) {
⋮----
// 1. Warp to start epoch (no distributions added)
⋮----
// 2. When there are no distributions, pressButton should revert with AllDistributionsProcessed
// because totalProcessable = 0 and totalProcessed = 0 (i.e., all 0 distributions are "processed")
⋮----
// 3. Sweep - since pressButton was never successfully called, no emissions were minted,
// so sweep should return false (nothing to sweep)
````

## File: src/test/integration/tests/FullySlashed_Operator.t.sol
````
// SPDX-License-Identifier: BUSL-1.1
⋮----
import "src/test/integration/IntegrationChecks.t.sol";
⋮----
contract Integration_FullySlashed_Operator is IntegrationCheckUtils {
⋮----
function _init() internal virtual override {
⋮----
// 1) Register operator for operator set.
⋮----
// 2) Operator allocates to operator set.
⋮----
// 3) Roll forward to complete allocation.
⋮----
// 4) Operator is full slashed.
⋮----
function testFuzz_register_allocate_fullSlash_deposit_delegate(uint24 r) public rand(r) {
// 5) Staker deposits into strategies.
⋮----
// 6) Staker delegates to operator who is fully slashed, should fail.
⋮----
function testFuzz_register_allocate_fullSlash_delegate_deposit(uint24 r) public rand(r) {
// 5) Staker delegates to operator who is fully slashed.
⋮----
// NOTE: We didn't use check_Delegation_State as it leads to division by zero.
⋮----
// 6) Staker deposits into strategies, should fail.
⋮----
function testFuzz_register_allocate_fullSlash_delegate_redelegate_deposit(uint24 r) public rand(r) {
// 5) Staker delegates to operator who is fully slashed
⋮----
// 6) Staker redelegates to new operator.
⋮----
// 7) Staker deposits into strategies.
````

## File: src/test/integration/tests/HighDSF_Multiple_Deposits.t.sol
````
// SPDX-License-Identifier: BUSL-1.1
⋮----
import "src/test/integration/IntegrationChecks.t.sol";
⋮----
/// @notice Testing the rounding behavior when the DSF is high and there are multiple deposits
contract Integration_HighDSF_Multiple_Deposits is IntegrationCheckUtils {
⋮----
IERC20[] tokens; // underlying token for each strategy
⋮----
/// Shared setup:
/// 1. create a new staker, operator, and avs
/// 2. create an operator set and register an operator, allocate all magnitude to the operator set
/// 3. slash operator to 1 magnitude remaining
/// 4. delegate to operator
function _init() internal override {
// 1. create a new staker, operator, and avs
⋮----
// 2. Create an operator set and register an operator, allocate all magnitude to the operator set
⋮----
// 3. slash operator to 1 magnitude remaining
⋮----
// 4. delegate to operator
⋮----
/// @notice Test setup with a staker with slashingFactor of 1 (maxMagnitude = 1)
/// with repeat deposits to increase the DSF. Limiting number of fuzzed runs to speed up tests since this
/// for loops several times.
/// forge-config: default.fuzz.runs = 10
function test_multiple_deposits(uint24 _r) public rand(_r) {
// deposit initial assets into strategies
⋮----
// Repeat the deposit 50 times
// Gas intensive so we pause gas metering for this loop
⋮----
// Check that the DSF is still bounded without overflow
⋮----
// theoretical upper bound on DSF is 1e74
````

## File: src/test/integration/tests/Multichain_Full_Flow.t.sol
````
// SPDX-License-Identifier: BUSL-1.1
⋮----
import "../MultichainIntegrationChecks.t.sol";
⋮----
/// @title Multichain_Full_Flow
/// @notice Integration tests for multichain functionality
/// @dev Tests the complete flow: key registration -> table calculation ->
///      transport simulation -> table update -> certificate verification
contract Integration_Multichain_Full_Flow_BN254 is MultichainIntegrationCheckUtils {
⋮----
function setUp() public override {
⋮----
// Setup test environment
⋮----
// Configure operator set for BN254 curve
⋮----
// Register operator keys and generate operator table
⋮----
/// @notice Test complete BN254 multichain happy path flow
/// @dev Covers key registration, table generation, cross-chain transport simulation,
///      table updates, and certificate verification
function test_BN254_MultichainStandard() external {
⋮----
// Simulate cross-chain transport
⋮----
// Update operator table on destination chain using recent timestamp to avoid staleness
⋮----
// Generate and verify certificate
⋮----
// Validate certificate verification
⋮----
/// @notice Test BN254 multichain flow with proportional verification
/// @dev Test case 3: Verify BN254 certificate with proportional thresholds
function test_BN254_MultichainStandard_ProportionalVerification() external {
⋮----
// Update operator table on destination chain
⋮----
// Generate certificate
⋮----
// First verify with regular method
⋮----
// Test proportional verification with 60% threshold
⋮----
proportionalThresholds[0] = 6000; // 60% in basis points
proportionalThresholds[1] = 6000; // 60% in basis points
⋮----
// Test with higher threshold that should still pass (80%)
proportionalThresholds[0] = 8000; // 80%
proportionalThresholds[1] = 8000; // 80%
⋮----
// Test with very high threshold that should still pass (99%)
proportionalThresholds[0] = 9900; // 99%
proportionalThresholds[1] = 9900; // 99%
⋮----
/// @notice Test BN254 multichain flow with nominal verification
/// @dev Test case 4: Verify BN254 certificate with nominal thresholds
function test_BN254_MultichainStandard_NominalVerification() external {
⋮----
// First verify with regular method to get signed stakes
⋮----
// Test nominal verification with thresholds below signed stakes (should pass)
⋮----
// Test with thresholds equal to signed stakes (should pass)
⋮----
// Test with thresholds above signed stakes (should fail)
⋮----
contract Integration_Multichain_Full_Flow_ECDSA is MultichainIntegrationCheckUtils {
⋮----
/// @notice Test complete ECDSA multichain happy path flow
⋮----
function test_ECDSA_MultichainStandard() external {
⋮----
// Configure operator set for ECDSA curve
````

## File: src/test/integration/tests/Multichain_Generation_Reservation_Removal.t.sol
````
// SPDX-License-Identifier: BUSL-1.1
⋮----
import "../MultichainIntegrationChecks.t.sol";
⋮----
/// @title Multichain_Generation_Reservation_Removal
/// @notice Integration tests for generation reservation removal functionality
/// @dev Tests the behavior when generation reservations are removed and tables can no longer be transported
contract Integration_Multichain_Generation_Reservation_Removal is MultichainIntegrationCheckUtils {
⋮----
/// @notice Test that tables cannot be transported after removing generation reservation
/// @dev Test case 2: Verify that after removing generation reservation, tables are not transported
function test_RemoveGenerationReservation_TablesNotTransported() external {
⋮----
// Setup test environment with staker having nonzero shares
⋮----
// Create staker with shares
⋮----
// Deposit tokens to get nonzero shares
⋮----
// Create operator and register
⋮----
// Delegate staker to operator
⋮----
// Create and configure operator set
⋮----
// Configure operator set for BN254 curve (randomly choose BN254 for this test)
⋮----
// Setup AVS and chains
⋮----
// Register operator key
⋮----
// Operator allocation (simulate allocation to the operator set)
// This would typically involve AllocationManager operations
⋮----
// Create generation reservation
⋮----
// Verify generation reservation exists
⋮----
// Test that we can generate operator table bytes before removal
⋮----
// Generate operator table and transport it successfully
⋮----
// Remove generation reservation
vm.prank(address(this)); // AVS owner removes the reservation
⋮----
// Verify generation reservation no longer exists
⋮----
// Try to generate operator table bytes after removal - this should fail
// because the operator table calculator and config have been deleted
⋮----
// Verify that operator set config and calculator are cleared
````

## File: src/test/integration/tests/Multichain_Timing_Tests.t.sol
````
// SPDX-License-Identifier: BUSL-1.1
⋮----
import "../MultichainIntegrationChecks.t.sol";
⋮----
/// @title Multichain_Timing_Tests
/// @notice Integration tests for multichain timing constraints and edge cases
/// @dev Tests the temporal behavior of global table root confirmations and operator table updates
contract Integration_Multichain_Timing_Tests_Base is MultichainIntegrationCheckUtils {
⋮----
function setUp() public virtual override {
⋮----
// Warp time to avoid stale reference timestamp
⋮----
// Setup test environment
⋮----
/// @notice Helper function to confirm global table root and update BN254 table with custom staleness period
function _confirmGlobalTableRootAndUpdateBN254WithStaleness(
⋮----
// Create the operator table data for transport with custom staleness period
⋮----
// Create global table root containing the operator table
⋮----
// Update the global table root with confirmation
⋮----
// Update the operator table using the confirmed global root
uint32 operatorSetIndex = 0; // Single leaf in merkle tree
bytes memory proof = new bytes(0); // Empty proof for single leaf
⋮----
/// @notice Helper function to confirm global table root and update ECDSA table with custom staleness period
function _confirmGlobalTableRootAndUpdateECDSAWithStaleness(
⋮----
/// @notice Helper function to post a new global root
function _postNewGlobalRoot(
⋮----
ICrossChainRegistryTypes.OperatorSetConfig({owner: address(this), maxStalenessPeriod: 3700}), // Change this value so the root is different
⋮----
// Update global root with new timestamp
⋮----
/// @notice Helper function to test stale table transport
function _testStaleTableTransport(
⋮----
// Create operator table data with stale timestamp
⋮----
// Use the currently valid global table root (not a fresh one)
⋮----
// This should revert with TableUpdateForPastTimestamp error
// because the timestamp is stale, even though the global root is valid
⋮----
contract Integration_Multichain_Timing_Tests_GlobalTableRoot is Integration_Multichain_Timing_Tests_Base {
// BN254 operator info - using BN254 for posting
⋮----
function setUp() public override {
⋮----
// Configure operator set for BN254 curve
⋮----
// Register operator keys and generate operator table
⋮----
/// @notice Test that posting a root with the same reference timestamp as the latest reverts
///
function test_PostRoot_SameLatestReferenceTimestamp_Reverts() external {
⋮----
// Post initial root successfully
⋮----
// Get the latest reference timestamp from the OperatorTableUpdater
⋮----
// Verify that the latest timestamp matches what we posted
⋮----
// Try to post another root with the same timestamp - this should noop
⋮----
// Generate certificate for global root confirmation
⋮----
firstReferenceTimestamp, // Same timestamp as before
⋮----
// This should revert with GlobalTableRootStale error
⋮----
/// @notice Test that posting a root right after the latest reference timestamp succeeds
/// @dev This tests the boundary condition where timestamp = latestReferenceTimestamp + 1
function test_PostRoot_RightAfterLatestReferenceTimestamp_Succeeds() external {
⋮----
// Post another root with timestamp = latestReferenceTimestamp + 1
⋮----
// This should succeed
⋮----
// Verify that the latest reference timestamp has been updated
⋮----
/// @notice Test that transporting tables with a stale reference timestamp reverts
/// @dev This tests that operator table updates must have timestamps > latest for that operator set
function test_TransportTables_StaleReferenceTimestamp_Reverts() external {
⋮----
// Post initial root and transport tables successfully
⋮----
// Get the latest reference timestamp for this operator set from the certificate verifier
⋮----
// Verify that the operator set timestamp matches what we posted
⋮----
// Post a new global root with a later timestamp
⋮----
// Try to transport tables with a stale reference timestamp (older than operatorSetLatestTimestamp)
uint32 staleTimestamp = operatorSetLatestTimestamp - 100; // Older than current operator set timestamp
⋮----
// Verify that the operator set timestamp hasn't changed
⋮----
/// @notice Test that transporting tables right after updating the latest reference timestamp succeeds
/// @dev This tests that table transport works immediately after the global table root is updated
function test_TransportTables_RightAfterLatestReferenceTimestamp_Succeeds() external {
⋮----
// Verify that global and operator set reference timestamps are correct
⋮----
// Post a new global root with timestamp = latestReferenceTimestamp + 1
⋮----
// Immediately transport the table with the new timestamp (should succeed)
uint32 transportTimestamp = newGlobalTimestamp; // Same timestamp as global root
⋮----
// Transport should succeed since timestamp matches the global root timestamp
⋮----
// Verify that the operator set timestamp was updated correctly
⋮----
contract Integration_Multichain_Timing_Tests_BN254 is Integration_Multichain_Timing_Tests_Base {
// BN254 operator info
⋮----
/// @notice Test that verifying BN254 certificate after staleness period expires reverts
/// @dev This tests that certificates become invalid after the maxStalenessPeriod
function test_VerifyBN254Certificate_AfterStalenessPeriod_Reverts() external {
⋮----
// Set a short staleness period for testing (1 hour)
⋮----
// Generate certificate with the reference timestamp
⋮----
// Verify certificate works initially
⋮----
// Jump forward past the staleness period
⋮----
// Verify certificate should now revert due to staleness
⋮----
/// @notice Test that verifying BN254 certificate right at staleness period boundary succeeds
/// @dev This tests the exact boundary condition where block.timestamp = referenceTimestamp + maxStalenessPeriod
function test_VerifyBN254Certificate_RightOnStalenessPeriod_Succeeds() external {
⋮----
// Set a staleness period for testing (1 hour)
⋮----
// Jump forward to exactly the staleness boundary (referenceTimestamp + stalenessPeriod)
⋮----
// Verify certificate should still succeed at the boundary
⋮----
/// @notice Test complex scenario: verify after staleness -> revert -> update staleness period -> verify again -> pass (BN254)
/// @dev This tests the complete staleness period update flow for BN254
function test_BN254Certificate_StalenessUpdate_ComplexFlow() external {
⋮----
// Set initial short staleness period (1 hour)
⋮----
// Jump forward past the initial staleness period
⋮----
// Verify certificate should revert due to staleness
⋮----
// Update the staleness period to be longer (2 hours from original reference timestamp)
⋮----
// Generate new certificate with the new reference timestamp
⋮----
// Verify new certificate should work with updated staleness period
⋮----
// Verify that the staleness period was actually updated
⋮----
contract Integration_Multichain_Timing_Tests_ECDSA is Integration_Multichain_Timing_Tests_Base {
// ECDSA operator info
⋮----
// Configure operator set for ECDSA curve
⋮----
/// @notice Test that verifying ECDSA certificate after staleness period expires reverts
/// @dev This tests that ECDSA certificates become invalid after the maxStalenessPeriod
function test_VerifyECDSACertificate_AfterStalenessPeriod_Reverts() external {
⋮----
/// @notice Test that verifying ECDSA certificate right at staleness period boundary succeeds
/// @dev This tests the exact boundary condition for ECDSA certificates
function test_VerifyECDSACertificate_RightOnStalenessPeriod_Succeeds() external {
⋮----
// Jump forward to exactly the staleness boundary
⋮----
/// @notice Test complex scenario: verify after staleness -> revert -> update staleness period -> verify again -> pass (ECDSA)
/// @dev This tests the complete staleness period update flow for ECDSA
function test_ECDSACertificate_StalenessUpdate_ComplexFlow() external {
````

## File: src/test/integration/tests/Slashed_Eigenpod_AVS.t.sol
````
// SPDX-License-Identifier: BUSL-1.1
⋮----
import "src/test/integration/IntegrationChecks.t.sol";
⋮----
contract Integration_SlashedEigenpod_AVS_Base is IntegrationCheckUtils {
⋮----
function _init() internal virtual override {
⋮----
// 1. Deposit Into Strategies
⋮----
// 2. Delegate to an operator
⋮----
// 3. Create an operator set and register an operator.
⋮----
// 4. Register for operator set
⋮----
// 5. Allocate to operator set
⋮----
contract Integration_SlashedEigenpod_AVS_Checkpoint is Integration_SlashedEigenpod_AVS_Base {
function _init() internal override {
⋮----
// 6. Slash
⋮----
/// @dev Asserts that the DSF isn't updated after a slash & checkpoint with 0 balance
function testFuzz_deposit_delegate_allocate_slash_checkpointZeroBalance(uint24 _rand) public rand(_rand) {
// 7. Start & complete checkpoint
⋮----
contract Integration_SlashedEigenpod_AVS_Withdraw is Integration_SlashedEigenpod_AVS_Base {
⋮----
// Slash or queue a withdrawal in a random order
⋮----
// Slash -> Queue Withdrawal
// 7. Slash
⋮----
// 8. Queue Withdrawal for all shares.
⋮----
// Queue Withdrawal -> Slash
// 7. Queue Withdrawal for all shares
⋮----
// 8. Slash
⋮----
/// @dev Asserts that the DSF isn't updated after a slash/queue and a checkpoint with 0 balance.
/// @dev The staker should subsequently not be able to inflate their withdrawable shares
function testFuzz_deposit_delegate_allocate_slashAndQueue_checkpoint_redeposit(uint24 _rand) public rand(_rand) {
// 9.  Start & complete checkpoint.
⋮----
// 10. Redeposit
⋮----
/// @dev Asserts that the staker cannot inflate withdrawable shares after redepositing
function testFuzz_deposit_delegate_allocate_slashAndQueue_completeAsTokens_redeposit(uint24 _rand) public rand(_rand) {
⋮----
// 9. Complete withdrawal as tokens
⋮----
/// @dev Asserts that the staker cannot inflate withdrawable shares after checkpointing & completing as shares
function testFuzz_deposit_delegate_allocate_slashAndQueue_checkPoint_completeAsShares(uint24 _rand) public rand(_rand) {
⋮----
// 9.  Start & complete checkpoint, since the next step does not.
⋮----
// 10. Complete withdrawal as shares. Deposit scaling factor is doubled because operator was slashed by half.
````

## File: src/test/integration/tests/SlashingWithdrawals.t.sol
````
// SPDX-License-Identifier: BUSL-1.1
⋮----
import "src/test/integration/IntegrationChecks.t.sol";
⋮----
contract Integration_ALMSlashBase is IntegrationCheckUtils {
⋮----
IERC20[] tokens; // underlying token for each strategy
⋮----
/// Shared setup:
///
/// 1. Generate staker, operator, and AVS
/// 2. Staker deposits and delegates to operator
/// 3. AVS creates an operator set containing the strategies held by the staker
/// 4. Operator allocates to operator set
/// 5. Operator registers for operator set
/// NOTE: Steps 4 and 5 are done in random order, as these should not have an outcome on the test
function _init() internal virtual override {
⋮----
// 1. Deposit Into Strategies
⋮----
// 2. Delegate to an operator
⋮----
// 3. Create an operator set and register an operator.
⋮----
// randomly choose between:
// register -> allocate / allocate -> register
⋮----
// register -> allocate
⋮----
// allocate -> register
⋮----
contract Integration_SlashThenWithdraw is Integration_ALMSlashBase {
⋮----
/// Init: Registered operator gets slashed one or more times for a random magnitude
/// - Second operator (for redelegation) may or may not be slashed
⋮----
/// Tests: Operator is slashed one or more times, then staker withdraws in different ways
function _init() internal override {
⋮----
/// Create second operator set with the same strategies as the first
/// Create a second operator. Register and allocate to operatorSetB
/// Also create a second staker with the same assets as the first,
/// delegated to operatorB. This is to give operatorB initial assets that can
/// be checked via invariants.
⋮----
// Create operatorB
⋮----
// Create stakerB, deposit, and delegate to operatorB
⋮----
// Create operatorSetB
⋮----
// Register and allocate fully to operatorSetB
⋮----
/// Slash first operator one or more times
/// Each slash is for 1 to 99%
⋮----
// TODO - staker variant?
// assert_Snap_Unchanged_Staker_DepositShares(staker, "staker deposit shares should be unchanged after slashing");
// assert_Snap_StakerWithdrawableShares_AfterSlash(staker, allocateParams, slashParams, "staker deposit shares should be slashed");
⋮----
/// Optionally do a single slash for the second operator
/// This is to test redelegation where the new operator has already been slashed
⋮----
function testFuzz_undelegate_completeAsTokens(uint24 _r) public rand(_r) {
/// Undelegate from operatorA
⋮----
/// Complete withdrawal as tokens
⋮----
function testFuzz_redelegate_completeAsTokens(uint24 _r) public rand(_r) {
/// Redelegate to operatorB
⋮----
function testFuzz_queueFull_completeAsTokens(uint24 _r) public rand(_r) {
// Queue a withdrawal for all shares
⋮----
// Complete withdrawal as tokens
⋮----
function testFuzz_undelegate_completeAsShares(uint24 _r) public rand(_r) {
// Undelegate from operatorA
⋮----
// Complete withdrawal as shares
⋮----
function testFuzz_redelegate_completeAsShares(uint24 _r) public rand(_r) {
// Redelegate to operatorB
⋮----
function testFuzz_queueFull_completeAsShares(uint24 _r) public rand(_r) {
⋮----
contract Integration_QueueWithdrawalThenSlash is Integration_ALMSlashBase {
function testFuzz_queue_slash_completeAsTokens(uint24 _r) public rand(_r) {
// 4. Queue withdrawal
⋮----
// 5. Slash operator
⋮----
// TODO - staker variants?
⋮----
// 6. Complete withdrawal
⋮----
// Check Final State
// check_FullyWithdrawn_State(staker, ..., ); TODO
⋮----
function testFuzz_queue_slash_completeAsShares(uint24 _r) public rand(_r) {
⋮----
// 4. Complete withdrawal
// Fast forward to when we can complete the withdrawal
⋮----
// Check final state:
⋮----
contract Integration_DeallocateThenSlash is Integration_ALMSlashBase {
function testFuzz_deallocate_slash_queue_completeAsTokens(uint24 _r) public rand(_r) {
// 4. Deallocate all.
⋮----
// 6. Queue withdrawals
⋮----
// 7. Complete withdrawal
⋮----
function testFuzz_deregister_slash(uint24 _r) public rand(_r) {
// 4. Deregister.
````

## File: src/test/integration/tests/Timing.t.sol
````
// SPDX-License-Identifier: BUSL-1.1
⋮----
import "src/test/integration/tests/SlashingWithdrawals.t.sol";
⋮----
/// @notice These tests check for specific withdrawal correctness around timing
/// @dev These tests assume the following:
/// - The staker has a positive balance in all given strategies
/// - The staker has no pending withdrawals
/// - The staker is delegated to the operator
contract Integration_WithdrawalTiming is Integration_ALMSlashBase {
///////////////////////////////
/// WITHDRAWAL TIMING TESTS ///
⋮----
/// @notice Test that a slash works correctly just before a _partial_ withdrawal is completed
function testFuzz_queuePartialWithdrawal_slashBeforeWithdrawalDelay_completeAsTokens(uint24 _r) public rand(_r) {
⋮----
/// 0. Calculate partial withdrawal amounts
⋮----
// Note: 2 is specifically chosen as the minimum divisor to ensure that the withdrawal is partial but 10 as
// the maximum divisor is more arbitrary
⋮----
/// 1. Queue withdrawal
⋮----
// Validate correctly queued withdrawals
⋮----
/// 2. Move time forward to _just before_ withdrawal block
// Expected behavior: Withdrawals are still pending and cannot be completed, but slashes can still be performed
⋮----
// Verify that the withdrawals are _still_ slashable
⋮----
/// 3. Slash operator
⋮----
// Verify that the slash was performed correctly
⋮----
/// 4. Move time forward to withdrawal block
⋮----
// Verify that the withdrawals are _no longer_ slashable
⋮----
/// 5. Complete withdrawals
// Note: expectedTokens must be recalculated because the withdrawable shares have changed due to the slash
⋮----
// Verify that the withdrawals were completed correctly
⋮----
/// 6. Check final state
⋮----
// Assert that all strategies have some shares remaining
⋮----
/// @notice Test that a slash works correctly just before a _total_ withdrawal is completed
function testFuzz_queueTotalWithdrawal_slashBeforeWithdrawalDelay_completeAsTokens(uint24 _r) public rand(_r) {
⋮----
/// @notice Test that a staker can still complete a partial withdrawal even after a slash has been performed
function testFuzz_queuePartialWithdrawal_slashAfterWithdrawalDelay_completeAsTokens(uint24 _r) public rand(_r) {
⋮----
// Note: 2 is specifically chosen as the minimum divisor to ensure that the withdrawal is partial
// but 10 as the maximum divisor is more arbitrary
⋮----
/// 2. Move time forward to _just after_ withdrawal block
// Expected behavior: Withdrawals are no longer slashable, so slashes no longer affect the staker
⋮----
/// 4. Complete withdrawals
⋮----
/// 5. Check final state
⋮----
/// @notice Test that a staker is unaffected by a slash after the withdrawal delay has passed
function testFuzz_queueTotalWithdrawal_slashAfterWithdrawalDelay_completeAsTokens(uint24 _r) public rand(_r) {
⋮----
/// 2. Move time forward to withdrawal block
⋮----
/// @notice These tests check for specific deallocation correctness around timing
⋮----
/// - The operator is registered and allocated to the operator set
contract Integration_OperatorDeallocationTiming is Integration_ALMSlashBase {
//////////////////////////////////////////
/// OPERATOR DEALLOCATION TIMING TESTS ///
⋮----
function testFuzz_deallocateFully_slashBeforeDelay(uint24 _r) public rand(_r) {
/// 1. Deallocate
⋮----
// Validate the deallocation
⋮----
/// 2. Move time forward to _just before_ deallocation delay
// Expected behavior: Deallocation delay is not yet passed, so slashes can still be performed
⋮----
// Verify that the operator is _still_ slashable
⋮----
function testFuzz_deallocateFully_slashAfterDelay(uint24 _r) public rand(_r) {
⋮----
/// 2. Move time forward to deallocation delay
⋮----
// Verify that the operator is fully deallocated.
// Note: even though the operator is technically still slashable, a slash is effectively useless as the
// operator is no longer allocated.
⋮----
// Verify that the slash has no impact on the operator
// Note: emptySlashParams remains uninitialized, as the slash _should not_ impact the operator.
⋮----
contract Integration_OperatorDeregistrationTiming is Integration_ALMSlashBase {
////////////////////////////////////////////
/// OPERATOR DEREGISTRATION TIMING TESTS ///
⋮----
function testFuzz_deregister_slashBeforeDelay(uint24 _r) public rand(_r) {
/// 1. Deregister
⋮----
// Validate the deregistration
⋮----
/// 2. Move time forward to _just before_ deregistration delay
// Expected behavior: Deregistration delay is not yet passed, so slashes can still be performed
⋮----
function testFuzz_deregister_slashAfterDelay(uint24 _r) public rand(_r) {
⋮----
/// 2. Move time forward to deregistration delay
⋮----
// Verify that the operator is _no longer_ slashable
⋮----
// Note: Unlike the deallocation case, the operator is no longer registered, so a slash will revert entirely.
⋮----
/// @notice These tests check for specific allocation correctness around timing
/// @dev These tests inherit from IntegrationCheckUtils instead of Integration_ALMSlashBase because they require a
/// different initialization -- specifically, the allocation must be performed within the tests. As such, there are no
/// assumptions and many state variables are declared below.
contract Integration_OperatorAllocationTiming is IntegrationCheckUtils {
⋮----
////////////////////////////////////////
/// OPERATOR ALLOCATION TIMING TESTS ///
⋮----
function _init() internal virtual override {
/// 0. Instantiate relevant objects
⋮----
/// 1. Deposit into strategies
⋮----
// Validate the deposits
⋮----
/// 2. Delegate to an operator
⋮----
// Validate the delegation
⋮----
/// 3. Create an operator set and register an operator.
⋮----
// Validate that the operator set was correctly created
⋮----
function testFuzz_register_allocate_slashBeforeDelay(uint24 _r) public rand(_r) {
/// 1. Create and register operator
⋮----
// Validate registration
⋮----
/// 2. Allocate
⋮----
// Validate the allocation
⋮----
/// 3. Move time forward to _just before_ allocation delay
⋮----
rollBackward(1); // make sure that allocation delay is not yet passed
⋮----
/// 4. Slash operator
// Note: This slash does not revert as the operator, even though it is not allocated, is
// still registered. However, since there is no allocation, the slash has no material effect.
⋮----
function testFuzz_allocate_register_slashBeforeDelay(uint24 _r) public rand(_r) {
/// 1. Allocate
⋮----
/// 2. Create and register operator
⋮----
// Validate the registration
⋮----
function testFuzz_register_allocate_slashAfterDelay(uint24 _r) public rand(_r) {
⋮----
/// 3. Move time forward to after the allocation delay completes
⋮----
function testFuzz_allocate_register_slashAfterDelay(uint24 _r) public rand(_r) {
````

## File: src/test/integration/users/AVS.t.sol
````
// SPDX-License-Identifier: BUSL-1.1
⋮----
import "forge-std/Test.sol";
⋮----
import "src/contracts/interfaces/IAllocationManager.sol";
import "src/contracts/interfaces/IPermissionController.sol";
import "src/contracts/interfaces/IStrategyFactory.sol";
⋮----
import "src/test/mocks/ERC20Mock.sol";
import "src/test/integration/users/User.t.sol";
import "src/test/integration/TimeMachine.t.sol";
import "src/test/utils/Logger.t.sol";
⋮----
import "src/test/utils/ArrayLib.sol";
import "src/contracts/interfaces/IAVSRegistrar.sol";
import "src/test/integration/deprecatedInterfaces/mainnet/IAllocationManager.sol";
⋮----
interface IAVSDeployer {
function delegationManager() external view returns (IDelegationManager);
function allocationManager() external view returns (IAllocationManager);
function strategyManager() external view returns (IStrategyManager);
function strategyFactory() external view returns (IStrategyFactory);
function permissionController() external view returns (IPermissionController);
function timeMachine() external view returns (TimeMachine);
function keyRegistrar() external view returns (IKeyRegistrar);
⋮----
contract AVS is Logger, IAllocationManagerTypes, IAVSRegistrar {
⋮----
// TODO: fix later for same reason as User.t.sol
⋮----
modifier createSnapshot() virtual {
⋮----
function NAME() public view override returns (string memory) {
⋮----
function supportsAVS(address) external pure override returns (bool) {
⋮----
/// -----------------------------------------------------------------------
/// AllocationManager
⋮----
function updateAVSMetadataURI(string memory uri) public createSnapshot {
⋮----
function createOperatorSets(IStrategy[][] memory strategies) public createSnapshot returns (OperatorSet[] memory operatorSets) {
⋮----
function createOperatorSets_v1(IStrategy[][] memory strategies) public createSnapshot returns (OperatorSet[] memory operatorSets) {
⋮----
function createRedistributingOperatorSets(IStrategy[][] memory strategies, address[] memory redistributionRecipients)
⋮----
function createOperatorSet(IStrategy[] memory strategies) public createSnapshot returns (OperatorSet memory operatorSet) {
⋮----
/// @dev Creates an operator set with the *soon to be deprecated* `createOperatorSets` method without a slasher
/// @dev This method is only used by the slasher migration test
function createOperatorSet_v1(IStrategy[] memory strategies) public createSnapshot returns (OperatorSet memory operatorSet) {
⋮----
function createRedistributingOperatorSet(IStrategy[] memory strategies, address redistributionRecipient)
⋮----
function configureOperatorSet(OperatorSet memory operatorSet, IKeyRegistrarTypes.CurveType curveType) public createSnapshot {
⋮----
function slashOperator(SlashingParams memory params) public createSnapshot returns (uint slashId, uint[] memory shares) {
⋮----
/// @notice Slash operator prior to redistribution.
/// @dev This is ONLY used by the redistribution upgrade test.
function slashOperator_PreRedistribution(SlashingParams memory params) public createSnapshot {
⋮----
function slashOperator(User operator, uint32 operatorSetId, IStrategy[] memory strategies, uint[] memory wadsToSlash)
⋮----
function clearBurnOrRedistributableShares(OperatorSet memory operatorSet, uint slashId) public createSnapshot {
⋮----
function clearBurnOrRedistributableSharesByStrategy(OperatorSet memory operatorSet, uint slashId, IStrategy strategy)
⋮----
function deregisterFromOperatorSets(User operator, uint32[] memory operatorSetIds) public createSnapshot {
⋮----
function setAVSRegistrar(IAVSRegistrar registrar) public createSnapshot {
⋮----
function addStrategiesToOperatorSet(uint32 operatorSetId, IStrategy[] memory strategies) public createSnapshot {
⋮----
function removeStrategiesFromOperatorSet(uint32 operatorSetId, IStrategy[] memory strategies) public createSnapshot {
⋮----
function updateSlasher(uint32 operatorSetId, address slasher) public createSnapshot {
⋮----
function addAppointee(address appointee, address target, bytes4 selector) public createSnapshot {
⋮----
/// IAVSRegistrar
⋮----
function registerOperator(address operator, address avsIdentifier, uint32[] calldata operatorSetIds, bytes calldata data)
⋮----
function deregisterOperator(address operator, address avsIdentifier, uint32[] calldata operatorSetIds) external override {}
⋮----
/// Internal Helpers
⋮----
// function allocationManager public view returns (AllocationManager) {
//     return AllocationManager(address(delegationManager.allocationManager));
// }
⋮----
// function permissionController public view returns (PermissionController) {
//     return PermissionController(address(delegationManager.permissionController));
⋮----
function _tryPrankAppointee(address target, bytes4 selector) internal {
⋮----
function _tryPrankAppointee_AllocationManager(bytes4 selector) internal {
⋮----
function _formatActor(address actor) internal view returns (string memory) {
````

## File: src/test/integration/users/IncentiveCouncil.t.sol
````
// SPDX-License-Identifier: BUSL-1.1
⋮----
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 {
⋮----
modifier createSnapshot() {
⋮----
function NAME() public view override returns (string memory) {
⋮----
function _randomStrategiesAndMultipliers(IStrategy[] memory strategies)
⋮----
// For all strategies except the last, randomly assign multiplier
// ensuring we leave enough for remaining strategies (at least 1 per strategy)
⋮----
uint minMultiplierNeeded = remainingStrategies; // Reserve at least 1 for each remaining strategy
⋮----
// Ensure max is at least min (1) to avoid underflow
⋮----
// Last strategy gets all remaining multiplier
⋮----
function _randomOperatorSet(OperatorSet[] memory operatorSets) internal returns (OperatorSet memory operatorSet) {
⋮----
function _randomDistributionType(bool allowDisabled) internal returns (DistributionType distributionType) {
⋮----
function addDistributions(
⋮----
// Generate random distribution types
⋮----
function addDistributionsWithTypes(
⋮----
function _addDistributionsInternal(
⋮----
// For all distributions except the last, randomly assign weight
// ensuring we leave enough for remaining distributions (at least 1 per distribution)
⋮----
uint minWeightNeeded = remainingDistributions; // Reserve at least 1 for each remaining dist
⋮----
// Last distribution gets all remaining weight
⋮----
function updateDistributions(uint[] memory distributionIds, Distribution[] memory distributions, uint16[] memory weights)
⋮----
// 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
⋮----
// First pass: decrease weights
⋮----
// Second pass: increase or keep same weights
⋮----
/// @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) {
⋮----
/// @dev Calls emissionsController.sweep.
function sweep() public createSnapshot returns (bool swept) {
⋮----
/// @dev Warps the chain to a random timestamp within an epoch.
/// @param epoch The epoch to warp to.
function warpToEpoch(uint epoch) public createSnapshot {
⋮----
uint randomExcess = vm.randomUint({min: 0, max: epochLength - 1}); // random time wtihin the epoch
````

## File: src/test/integration/users/User.t.sol
````
// SPDX-License-Identifier: BUSL-1.1
⋮----
import "forge-std/Test.sol";
⋮----
import "src/contracts/core/AllocationManager.sol";
import "src/contracts/core/DelegationManager.sol";
import "src/contracts/permissions/PermissionController.sol";
import "src/contracts/core/StrategyManager.sol";
import "src/contracts/pods/EigenPodManager.sol";
import "src/contracts/pods/EigenPod.sol";
⋮----
import "src/test/integration/TypeImporter.t.sol";
import "src/contracts/permissions/KeyRegistrar.sol";
import "src/contracts/libraries/BN254.sol";
import "src/contracts/mixins/SignatureUtilsMixin.sol";
⋮----
import "src/test/integration/TimeMachine.t.sol";
import "src/test/integration/mocks/BeaconChainMock.t.sol";
import "src/test/utils/Logger.t.sol";
import "src/test/utils/ArrayLib.sol";
⋮----
interface IUserDeployer {
function allocationManager() external view returns (IAllocationManager);
function delegationManager() external view returns (DelegationManager);
function permissionController() external view returns (PermissionController);
function strategyManager() external view returns (StrategyManager);
function eigenPodManager() external view returns (EigenPodManager);
function timeMachine() external view returns (TimeMachine);
function beaconChain() external view returns (BeaconChainMock);
function keyRegistrar() external view returns (KeyRegistrar);
⋮----
contract User is Logger, TypeImporter {
⋮----
// TODO: fix this and view function getters. These are newly added contracts so these are initially
// 0 addresses for fork tests. To work around this, we read these addresses directly off the delegationManager
// from its immutable addresses. This is a temporary solution until we can figure out a better way to handle this.
// AllocationManager allocationManager;
// PermissionController permissionController;
⋮----
// User's EigenPod and each of their validator indices within that pod
⋮----
// TODO uncommented for reason above
// allocationManager = deployer.allocationManager();
// permissionController = deployer.permissionController();
⋮----
modifier createSnapshot() virtual {
⋮----
function NAME() public view override returns (string memory) {
⋮----
/// -----------------------------------------------------------------------
/// Allocation Manager Methods
⋮----
/// @dev Allocates randomly across the operator set's strategies with a sum of `magnitudeSum`.
/// NOTE: Calling more than once will lead to deallocations...
function modifyAllocations(AllocateParams memory params) public virtual createSnapshot {
⋮----
function deallocateAll(OperatorSet memory operatorSet) public virtual returns (AllocateParams memory) {
⋮----
function registerForOperatorSets(OperatorSet[] memory operatorSets) public virtual createSnapshot {
⋮----
function registerForOperatorSet(OperatorSet memory operatorSet) public virtual createSnapshot {
⋮----
function deregisterFromOperatorSet(OperatorSet memory operatorSet) public virtual createSnapshot {
⋮----
function registerBN254Key(OperatorSet memory operatorSet, BN254.G1Point memory g1Key, BN254.G2Point memory g2Key, uint privKey)
⋮----
function registerECDSAKey(OperatorSet memory operatorSet, address pubKey, uint privKey) public virtual createSnapshot {
⋮----
function setAllocationDelay(uint32 delay) public virtual createSnapshot {
⋮----
/// Delegation Manager Methods
⋮----
function registerAsOperator() public virtual createSnapshot {
⋮----
/// @dev Delegate to the operator without a signature
function delegateTo(User operator) public virtual createSnapshot {
⋮----
/// @dev Undelegate from operator
function undelegate() public virtual createSnapshot returns (Withdrawal[] memory) {
⋮----
/// @dev Redelegate to a new operator
function redelegate(User newOperator) public virtual createSnapshot returns (Withdrawal[] memory) {
⋮----
/// @dev Force undelegate staker
function forceUndelegate(User staker) public virtual createSnapshot returns (Withdrawal[] memory) {
⋮----
/// @dev Queues a single withdrawal for every share and strategy pair
function queueWithdrawals(IStrategy[] memory strategies, uint[] memory depositShares)
⋮----
// Create queueWithdrawals params
⋮----
// Create Withdrawal struct using same info
⋮----
// Basic sanity check - we do all other checks outside this file
⋮----
function completeWithdrawalsAsTokens(Withdrawal[] memory withdrawals) public virtual createSnapshot returns (IERC20[][] memory tokens) {
⋮----
function completeWithdrawalAsTokens(Withdrawal memory withdrawal) public virtual createSnapshot returns (IERC20[] memory) {
⋮----
function completeWithdrawalsAsShares(Withdrawal[] memory withdrawals) public virtual createSnapshot returns (IERC20[][] memory tokens) {
⋮----
function completeWithdrawalAsShares(Withdrawal memory withdrawal) public virtual createSnapshot returns (IERC20[] memory) {
⋮----
/// Beacon Chain Methods
⋮----
/// @dev Uses any ETH held by the User to start 0x01 or 0x02 validators on the beacon chain
/// @return A list of created validator indices
/// @return The amount of wei sent to the beacon chain
/// @return The number of validators that have the MaxEB
/// Note: If the user does not have enough ETH to start a validator, this method reverts
/// Note: This method also advances one epoch forward on the beacon chain, so that
/// withdrawal credential proofs are generated for each validator.
function startValidators() public virtual createSnapshot returns (uint40[] memory, uint64, uint) {
⋮----
/// @dev Starts a specified number of 0x01 validators for 32 ETH each on the beacon chain
/// @param count The number of validators to start
/// @return newValidators A list of created validator indices
/// @return totalBalanceGwei The amount of gwei sent to the beacon chain
function startETH1Validators(uint8 count)
⋮----
/// @dev Starts a specified number of 0x02 validators for 2048 ETH each on the beacon chain
⋮----
function startCompoundingValidators(uint8 count)
⋮----
function exitValidators(uint40[] memory _validators) public virtual createSnapshot returns (uint64 exitedBalanceGwei) {
⋮----
/// @dev Helper storage to calculate max consolidations
/// - We push an element to this array every time we call maxConsolidation. This is just
///   to ensure we have "fresh" storage to use as a helper.
⋮----
/// @dev Determines the maximally-compact consolidation for the given validators
/// - Requests the consolidation via EigenPod.requestConsolidation
/// - Advances beacon chain state so the consolidations are processed
/// @return newValidators the remaining active validators after consolidation
/// @return consolidated the now-inactive validators who were consolidated into newValidators
function maxConsolidation(uint40[] memory _validators)
⋮----
// Get helper storage space to track what validators we've consolidated, and what requests we'll make
⋮----
// Select the next target validator. If they're already a source/target, skip.
⋮----
// If the target validator does not have 0x02 credentials, add a switch request
⋮----
// Add as many source validators as we can without going over 2048 ETH
⋮----
// Select the next source validator. If they're already a source/target, skip.
⋮----
// Skip if this would push the target's balance above 2048 ETH
⋮----
// Add consolidation
⋮----
// Advance beacon chain
⋮----
/// @dev Creates EIP-7002 withdrawal requests for each validator, requesting withdrawals down to 32 ETH
function withdrawExcess(uint40[] memory _validators) public virtual createSnapshot returns (uint64 amountWithdrawnGwei) {
⋮----
// Despite looking like this will result in a full withdrawal, the beacon chain
// only performs a full withdrawal if amountGwei == 0. This is just a lazy way
// to request "withdraw anything above 32 ETH."
⋮----
// amountToWithdraw: any balance above 32 ETH
⋮----
// Request withdrawals via pod
⋮----
/// Eigenpod Methods
⋮----
function verifyWithdrawalCredentials(uint40[] memory _validators) public virtual createSnapshot {
⋮----
function startCheckpoint() public virtual createSnapshot {
⋮----
function completeCheckpoint() public virtual createSnapshot {
⋮----
function verifyStaleBalance(uint40 validatorIndex) public virtual createSnapshot {
⋮----
/// Strategy Methods
⋮----
/// @dev For each strategy/token balance, call the relevant deposit method
function depositIntoEigenlayer(IStrategy[] memory strategies, uint[] memory tokenBalances) public virtual createSnapshot {
⋮----
function updateBalances(IStrategy[] memory strategies, int[] memory tokenDeltas) public virtual createSnapshot {
⋮----
// If any balance update has occurred, a checkpoint will pick it up
⋮----
/// View Methods
⋮----
function allocationManager() public view returns (IAllocationManager) {
⋮----
function permissionController() public view returns (PermissionController) {
⋮----
function getSlashingFactor(IStrategy strategy) public view returns (uint) {
⋮----
/// Internal Methods
⋮----
function _completeQueuedWithdrawal(Withdrawal memory withdrawal, bool receiveAsTokens) internal virtual returns (IERC20[] memory) {
⋮----
// If we're withdrawing native ETH as tokens && do not have negative shares
// stop ALL validators and complete a checkpoint
⋮----
function _createPod() internal virtual {
⋮----
/// @dev Starts a 32 ETH validator with 0x01 withdrawal credentials
/// - Reverts if the user does not hold sufficient balance
/// @return the new validator index
function _startETH1Validator() internal returns (uint40) {
⋮----
/// @dev Starts a validator with 0x02 withdrawal credentials at the specified balance
⋮----
/// - Reverts if the balance is < 32 eth (or > 2048 eth)
⋮----
function _startCompoundingValidator(uint balanceWei) internal returns (uint40) {
⋮----
/// @dev Uses any ETH held by the User to start validators on the beacon chain
/// @dev Creates validators between 32 and 2048 ETH
⋮----
/// @return The amount of gwei sent to the beacon chain
⋮----
function _startValidators() internal virtual returns (uint40[] memory, uint64, uint) {
⋮----
// Get maximum possible number of validators. Add 1 to account for a validator with < 32 ETH
⋮----
// Create validators between 32 and 2048 ETH until we can't create more
⋮----
// Generate random validator balance between 32 and 2048 ETH
uint validatorEth = uint(keccak256(abi.encodePacked(block.timestamp, balanceWei, numValidators))) % 64 + 1; // 1-64 multiplier
validatorEth *= 32 ether; // Results in 32-2048 ETH
⋮----
// If we don't have enough ETH for the random amount, use remaining balance
// as long as it's >= 32 ETH
⋮----
// Create the validator
⋮----
// Track validators with max effective balance
// - For 0x01 validators, this is 32 ETH
// - For 0x02 validators, this is 2048 ETH
⋮----
// If we still have at least 1 ETH left over, we can create another (non-full) validator
// Note that in the mock beacon chain this validator will generate rewards like any other.
// The main point is to ensure pods are able to handle validators that have less than 32 ETH
⋮----
// Resize the array to actual number of validators created
⋮----
// Advance forward one epoch and generate withdrawal and balance proofs for each validator
⋮----
function _exitValidators(uint40[] memory _validators) internal returns (uint64 exitedBalanceGwei) {
⋮----
// Send withdrawal requests to pod
⋮----
function _startCheckpoint() internal {
⋮----
function _completeCheckpoint() internal {
⋮----
function _verifyWithdrawalCredentials(uint40[] memory _validators) internal {
⋮----
/// @dev Revert, passing through an error message
function _revert(bytes memory err) internal pure {
⋮----
function _podWithdrawalCredentials() internal view returns (bytes memory) {
⋮----
function _podCompoundingWithdrawalCredentials() internal view returns (bytes memory) {
⋮----
function _getSlashingFactor(address staker, IStrategy strategy) internal view returns (uint) {
⋮----
/// @notice Gets the expected withdrawals to be created when the staker is undelegated via a call to `DelegationManager.undelegate()`
/// @notice Assumes staker and withdrawer are the same and that all strategies and shares are withdrawn
function _getExpectedWithdrawalStructsForStaker(address staker) internal view returns (Withdrawal[] memory expectedWithdrawals) {
⋮----
function getCheckpointableValidators() public view returns (uint40[] memory) {
⋮----
// Manually update length
⋮----
function getActiveValidators() public view returns (uint40[] memory) {
⋮----
function _tryPrankAppointee(address target, bytes4 selector) internal {
⋮----
function _tryPrankAppointee_AllocationManager(bytes4 selector) internal {
⋮----
function _tryPrankAppointee_DelegationManager(bytes4 selector) internal {
⋮----
/// @notice A user contract that calls nonstandard methods (like xBySignature methods)
contract User_AltMethods is User {
⋮----
function depositIntoEigenlayer(IStrategy[] memory strategies, uint[] memory tokenBalances) public override createSnapshot {
⋮----
// Approve token
⋮----
// Get signature
⋮----
bytes memory signature = bytes(abi.encodePacked(digestHash)); // dummy sig data
⋮----
// Mark hash as signed
⋮----
// Deposit
⋮----
// Mark hash as used
⋮----
function isValidSignature(bytes32 hash, bytes memory) external view returns (bytes4) {
````

## File: src/test/integration/IntegrationBase.t.sol
````
// SPDX-License-Identifier: BUSL-1.1
⋮----
import "forge-std/Test.sol";
⋮----
import "@openzeppelin/contracts/token/ERC20/extensions/IERC20Metadata.sol";
import "@openzeppelin/contracts/utils/Strings.sol";
⋮----
import "src/contracts/libraries/BeaconChainProofs.sol";
import "src/contracts/libraries/SlashingLib.sol";
⋮----
import "src/test/integration/TypeImporter.t.sol";
import "src/test/integration/IntegrationDeployer.t.sol";
import "src/test/integration/TimeMachine.t.sol";
import "src/test/integration/users/User.t.sol";
⋮----
abstract contract IntegrationBase is IntegrationDeployer, TypeImporter {
⋮----
// Lists of operators created before the m2 (not slashing) upgrade
//
// When we call _upgradeEigenLayerContracts, we iterate over
// these lists and migrate perform the standard migration actions
// for each user
⋮----
/// Gen/Init methods:
⋮----
/// @dev Create a new user according to configured random variants.
/// This user is ready to deposit into some strategies and has some underlying token balances
function _newRandomStaker() internal returns (User, IStrategy[] memory, uint[] memory) {
⋮----
/// Given a list of strategies, creates a new user with random token balances in each underlying token
function _newStaker(IStrategy[] memory strategies) internal returns (User, uint[] memory) {
⋮----
/// @dev Creates a blank slate user with no assets
function _newEmptyStaker() internal returns (User) {
⋮----
/// @dev Create a new operator according to configured random variants.
/// This user will immediately deposit their randomized assets into eigenlayer.
function _newRandomOperator() internal returns (User, IStrategy[] memory, uint[] memory) {
/// TODO: Allow operators to have ETH
⋮----
/// Operators are created with all assets already deposited
⋮----
/// Registration flow is the same pre and post redistribution upgrade
⋮----
/// @dev Creates a new operator with no assets
function _newRandomOperator_NoAssets() internal returns (User) {
⋮----
/// @dev Name a newly-created staker ("staker1", "staker2", ...)
function _getStakerName() private returns (string memory) {
⋮----
/// @dev Name a newly-created operator ("operator1", "operator2", ...)
function _getOperatorName() private returns (string memory) {
⋮----
function _newRandomAVS() internal returns (AVS avs, OperatorSet[] memory operatorSets) {
⋮----
/// @dev Creates a new AVS with the *soon to be deprecated* `createOperatorSets` method without a slasher
/// @dev This method is only used by the slasher migration test
function _newRandomAVS_v1CreateSet() internal returns (AVS avs, OperatorSet[] memory operatorSets) {
⋮----
function _newRandomAVS_WithBN254() internal returns (AVS avs, OperatorSet[] memory operatorSets) {
⋮----
function _newRandomAVS_WithECDSA() internal returns (AVS avs, OperatorSet[] memory operatorSets) {
⋮----
/// @dev Send a random amount of ETH (up to 10 gwei) to the destination via `call`,
/// triggering its fallback function. Sends a gwei-divisible amount as well as a
/// non-gwei-divisible amount.
///
/// Total sent == `gweiSent + remainderSent`
function _sendRandomETH(address destination) internal returns (uint64 gweiSent, uint remainderSent) {
⋮----
/// @dev Choose a random subset of validators (selects AT LEAST ONE)
function _choose(uint40[] memory validators) internal returns (uint40[] memory) {
⋮----
// if bit set, add validator
⋮----
// Manually update length of result
⋮----
function _getTokenName(IERC20 token) internal view returns (string memory) {
⋮----
///                             COMMON ASSERTIONS
⋮----
function assert_HasNoDelegatableShares(User user, string memory err) internal view {
⋮----
function assert_HasUnderlyingTokenBalances(User user, IStrategy[] memory strategies, uint[] memory expectedBalances, string memory err)
⋮----
function assert_HasUnderlyingTokenBalance(User user, IStrategy strategy, uint expectedBalance, string memory err) internal view {
⋮----
function assert_HasNoUnderlyingTokenBalance(User user, IStrategy[] memory strategies, string memory err) internal view {
⋮----
function assert_HasExpectedShares(User user, IStrategy[] memory strategies, uint[] memory expectedShares, string memory err)
⋮----
/// @dev Check that all the staker's deposit shares have been removed
function assert_RemovedAll_Staker_DepositShares(User user, IStrategy[] memory strategies, string memory err) internal view {
⋮----
/// @dev Check that all the staker's withdrawable shares have been removed
function assert_RemovedAll_Staker_WithdrawableShares(User staker, IStrategy[] memory strategies, string memory err) internal view {
⋮----
// For each strategy, check all shares have been withdrawn
⋮----
function assert_HasOperatorShares(User user, IStrategy[] memory strategies, uint[] memory expectedShares, string memory err)
⋮----
/// @dev Asserts that ALL of the `withdrawalRoots` is in `delegationManager.pendingWithdrawals`
function assert_AllWithdrawalsPending(bytes32[] memory withdrawalRoots, string memory err) internal view {
⋮----
/// @dev Asserts that NONE of the `withdrawalRoots` is in `delegationManager.pendingWithdrawals`
function assert_NoWithdrawalsPending(bytes32[] memory withdrawalRoots, string memory err) internal view {
⋮----
/// @dev Asserts that the hash of each withdrawal corresponds to the provided withdrawal root
function assert_WithdrawalPending(bytes32 withdrawalRoot, string memory err) internal view {
⋮----
function assert_WithdrawalNotPending(bytes32 withdrawalRoot, string memory err) internal view {
⋮----
function assert_ValidWithdrawalHashes(Withdrawal[] memory withdrawals, bytes32[] memory withdrawalRoots, string memory err)
⋮----
function assert_ValidWithdrawalHash(Withdrawal memory withdrawal, bytes32 withdrawalRoot, string memory err) internal view {
⋮----
function assert_StakerStrategyListEmpty(User staker, string memory err) internal view {
⋮----
function assert_StrategyNotInStakerStrategyList(User staker, IStrategy strategy, string memory err) internal view {
// BEACONCHAIN_ETH_STRAT is not in the staker's strategy list
⋮----
function assert_StrategiesInStakerStrategyList(User staker, IStrategy[] memory strategies, string memory err) internal view {
⋮----
function assert_StrategyInStakerStrategyList(User staker, IStrategy strategy, string memory err) internal view {
⋮----
function assert_PodBalance_Eq(User staker, uint expectedBalance, string memory err) internal view {
⋮----
function assert_ProofsRemainingEqualsActive(User staker, string memory err) internal view {
⋮----
function assert_CheckpointPodBalance(User staker, uint64 expectedPodBalanceGwei, string memory err) internal view {
⋮----
function assert_MaxEqualsAllocatablePlusEncumbered(User operator, string memory err) internal view {
⋮----
function assert_CurMinSlashableEqualsMinAllocated(
⋮----
function assert_MaxMagsEqualMaxMagsAtCurrentBlock(User operator, IStrategy[] memory strategies, string memory err) internal view {
⋮----
function assert_CurrentMagnitude(User operator, AllocateParams memory params, string memory err) internal view {
⋮----
function assert_NoPendingModification(User operator, OperatorSet memory operatorSet, IStrategy[] memory strategies, string memory err)
⋮----
function assert_HasPendingIncrease(User operator, AllocateParams memory params, string memory err) internal view {
⋮----
function assert_HasPendingDecrease(User operator, AllocateParams memory params, string memory err) internal view {
⋮----
function assert_IsRegistered(User operator, OperatorSet memory operatorSet, string memory err) internal view {
⋮----
function assert_IsSlashable(User operator, OperatorSet memory operatorSet, string memory err) internal view {
⋮----
function assert_NotSlashable(User operator, OperatorSet memory operatorSet, string memory err) internal view {
⋮----
function assert_IsAllocatedToSet(User operator, OperatorSet memory operatorSet, string memory err) internal view {
⋮----
function assert_IsNotAllocated(User operator, OperatorSet memory operatorSet, string memory err) internal view {
⋮----
function assert_IsAllocatedToSetStrats(User operator, OperatorSet memory operatorSet, IStrategy[] memory strategies, string memory err)
⋮----
function assert_HasAllocatedStake(User operator, AllocateParams memory params, string memory err) internal view {
⋮----
function assert_HasSlashableStake(User operator, AllocateParams memory params, string memory err) internal view {
⋮----
function assert_NoSlashableStake(User operator, OperatorSet memory operatorSet, string memory err) internal view {
⋮----
function assert_DSF_WAD(User staker, IStrategy[] memory strategies, string memory err) internal view {
⋮----
function assert_Zero_BCSF(User staker, string memory err) internal view {
⋮----
function assert_BCSF_WAD(User staker, string memory err) internal view {
⋮----
function assert_ActiveValidatorCount(User staker, uint expectedCount, string memory err) internal view {
⋮----
function assert_withdrawableSharesDecreasedByAtLeast(
⋮----
function assert_DepositShares_GTE_WithdrawableShares(User staker, IStrategy[] memory strategies, string memory err) internal view {
⋮----
function assert_Zero_WithdrawableShares(User staker, IStrategy strategy, string memory err) internal view {
⋮----
///                             SNAPSHOT ASSERTIONS
///                    TIME TRAVELERS ONLY BEYOND THIS POINT
⋮----
///                      SNAPSHOT ASSERTIONS: ALLOCATIONS
⋮----
function assert_Snap_Became_Registered(User operator, OperatorSet memory operatorSet, string memory err) internal {
⋮----
function assert_Snap_Became_Deregistered(User operator, OperatorSet memory operatorSet, string memory err) internal {
⋮----
function assert_Snap_Unchanged_Registration(User operator, OperatorSet memory operatorSet, string memory err) internal {
⋮----
function assert_Snap_Became_Slashable(User operator, OperatorSet memory operatorSet, string memory err) internal {
⋮----
function assert_Snap_Remains_Slashable(User operator, OperatorSet memory operatorSet, string memory err) internal {
⋮----
function assert_Snap_Unchanged_Slashability(User operator, OperatorSet memory operatorSet, string memory err) internal {
⋮----
function assert_Snap_Unchanged_AllocatedStrats(User operator, OperatorSet memory operatorSet, string memory err) internal {
⋮----
function assert_Snap_Removed_AllocatedStrats(
⋮----
function assert_Snap_Unchanged_StrategyAllocations(
⋮----
function assert_Snap_Added_AllocatedSet(User operator, OperatorSet memory operatorSet, string memory err) internal {
⋮----
function assert_Snap_Unchanged_AllocatedSets(User operator, string memory err) internal {
⋮----
function assert_Snap_Removed_AllocatedSet(User operator, OperatorSet memory operatorSet, string memory err) internal {
⋮----
function assert_Snap_Added_RegisteredSet(User operator, OperatorSet memory operatorSet, string memory err) internal {
⋮----
function assert_Snap_Removed_RegisteredSet(User operator, OperatorSet memory operatorSet, string memory err) internal {
⋮----
function assert_Snap_Unchanged_RegisteredSet(User operator, string memory err) internal {
⋮----
function assert_Snap_Added_MemberOfSet(User operator, OperatorSet memory operatorSet, string memory err) internal {
⋮----
function assert_Snap_Removed_MemberOfSet(User operator, OperatorSet memory operatorSet, string memory err) internal {
⋮----
function assert_Snap_Unchanged_MemberOfSet(OperatorSet memory operatorSet, string memory err) internal {
⋮----
function assert_Snap_StakeBecameSlashable(
⋮----
function assert_Snap_StakeBecomeUnslashable(
⋮----
function assert_Snap_Added_SlashableStake(
⋮----
function assert_Snap_Unchanged_SlashableStake(
⋮----
function assert_Snap_Removed_SlashableStake(
⋮----
function assert_Snap_Slashed_SlashableStake(
⋮----
// Slashing doesn't occur if the operator has no slashable magnitude
// This prevents a div by 0 when calculating expected slashed
⋮----
//@dev requires slashparams strategies to be same as withdrawal strategies
// meant to be used in check_base_slashing_state
function assert_Snap_Decreased_SlashableSharesInQueue(
⋮----
function assert_Snap_Increased_SlashableSharesInQueue(User operator, Withdrawal[] memory withdrawals, string memory err) internal {
⋮----
function assert_Snap_StakeBecameAllocated(
⋮----
function assert_Snap_StakeBecameDeallocated(
⋮----
function assert_Snap_Unchanged_AllocatedStake(
⋮----
function assert_Snap_Slashed_AllocatedStake(
⋮----
function assert_Snap_Added_EncumberedMagnitude(
⋮----
function assert_Snap_Unchanged_EncumberedMagnitude(User operator, IStrategy[] memory strategies, string memory err) internal {
⋮----
function assert_Snap_Removed_EncumberedMagnitude(
⋮----
function assert_Snap_Slashed_EncumberedMagnitude(User operator, SlashingParams memory params, string memory err) internal {
⋮----
function assert_Snap_Added_AllocatableMagnitude(
⋮----
function assert_Snap_Unchanged_AllocatableMagnitude(User operator, IStrategy[] memory strategies, string memory err) internal {
⋮----
function assert_Snap_Removed_AllocatableMagnitude(
⋮----
function assert_Snap_Allocated_Magnitude(User operator, IStrategy[] memory strategies, string memory err) internal {
⋮----
/// Check:
/// allocatable increased
/// encumbered decreased
⋮----
function assert_Snap_Deallocated_Magnitude(User operator, IStrategy[] memory strategies, string memory err) internal {
⋮----
function assert_Snap_Set_CurrentMagnitude(User operator, AllocateParams memory params, string memory err) internal {
⋮----
/// Prev allocation.currentMagnitude should NOT equal newly-set magnitude
/// Cur allocation.currentMagnitude SHOULD
⋮----
function assert_Snap_Slashed_Allocation(User operator, OperatorSet memory operatorSet, SlashingParams memory params, string memory err)
⋮----
function assert_Snap_Unchanged_MaxMagnitude(User operator, IStrategy[] memory strategies, string memory err) internal {
⋮----
function assert_Snap_Slashed_MaxMagnitude(
⋮----
function assert_Snap_Allocations_Slashed(
⋮----
// Check Allocations
⋮----
// If (isDeallocation) ...
⋮----
// Check Magnitudes
⋮----
function assert_Snap_StakerWithdrawableShares_AfterSlash(
⋮----
function assert_Snap_OperatorSetRegistered(OperatorSet memory operatorSet, string memory err) internal {
⋮----
///                 SNAPSHOT ASSERTIONS: BEACON CHAIN AND AVS SLASHING
⋮----
/// @dev Same as `assert_Snap_StakerWithdrawableShares_AfterSlash`
/// @dev but when a BC slash occurs before an AVS slash
/// @dev There is additional rounding error when a BC and AVS slash occur together
function assert_Snap_StakerWithdrawableShares_AfterBCSlash_AVSSlash(
⋮----
/// @dev Validates behavior of "restaking", i.e. that the funds can be slashed twice
function assert_Snap_StakerWithdrawableShares_AfterAVSSlash_BCSlash(
⋮----
// 1. The slashing factor and withdrawable shares should decrease by a factor of the BCSF
// We use assertApproxEq on shares since intermediate division on calculation of slashing factor introduces some additional rounding error
⋮----
/// 2. The delta in shares is given by:
/// (depositShares * operatorMag) - (depositShares * operatorMag * BCSF)
///  = depositShares * operatorMag * (1 - BCSF)
⋮----
/// 3. The attributable avs slashed shares should decrease by a factor of the BCSF
/// Attributable avs slashed shares = originalWithdrawableShares - bcSlashedShares - curShares
/// Where bcSlashedShares = originalWithdrawableShares * (1 - BCSF)
⋮----
/// @dev Validates behavior of "restaking", i.e. that the funds can be slashed twice. Also validates
///      the edge case where a validator is proven prior to the BC slash.
/// @dev These bounds are based off of rounding when avs and bc slashing occur together
function assert_Snap_StakerWithdrawableShares_AVSSlash_ValidatorProven_BCSlash(
⋮----
// 1. The withdrawable shares should decrease by a factor of the BCSF
⋮----
/// (originalWithdrawableShares * operatorMag) + extraValidatorShares - (depositShares * operatorMag * BCSF * dsf)
⋮----
/// Attributable avs slashed shares = depositShares - bcSlashedShares - curShars
/// Where bcSlashedShares = depositShares * (1 - BCSF)
⋮----
// TODO: slashable stake
⋮----
///                     SNAPSHOT ASSERTIONS: OPERATOR SHARES
⋮----
/// @dev Check that the operator has `addedShares` additional operator shares
// for each strategy since the last snapshot
function assert_Snap_Added_OperatorShares(User operator, IStrategy[] memory strategies, uint[] memory addedShares, string memory err)
⋮----
// Use timewarp to get previous operator shares
⋮----
// For each strategy, check (prev + added == cur)
⋮----
/// @dev Check that the operator has `removedShares` fewer operator shares
/// for each strategy since the last snapshot
function assert_Snap_Removed_OperatorShares(
⋮----
// For each strategy, check (prev - removed == cur)
⋮----
/// @dev Check that the operator's shares in ALL strategies have not changed
/// since the last snapshot
function assert_Snap_Unchanged_OperatorShares(User operator, string memory err) internal {
⋮----
// For each strategy, check (prev == cur)
⋮----
function assert_Snap_Delta_OperatorShares(User operator, IStrategy[] memory strategies, int[] memory shareDeltas, string memory err)
⋮----
function assert_Snap_Slashed_OperatorShares(User operator, SlashingParams memory params, string memory err) internal {
⋮----
function assert_Snap_Increased_BurnableShares(
⋮----
// Not factoring in slashable shares in queue here, because that gets more complex (TODO)
⋮----
///                         SNAPSHOT ASSERTIONS: STAKER SHARES
⋮----
/// @dev Check that the staker has `addedShares` additional deposit shares
⋮----
function assert_Snap_Added_Staker_DepositShares(
⋮----
// Use timewarp to get previous staker shares
⋮----
function assert_Snap_Added_Staker_DepositShares(User staker, IStrategy strat, uint addedShares, string memory err) internal {
⋮----
/// @dev Check that the staker has `removedShares` fewer delegatable shares
⋮----
function assert_Snap_Removed_Staker_DepositShares(
⋮----
function assert_Snap_Removed_Staker_DepositShares(User staker, IStrategy strat, uint removedShares, string memory err) internal {
⋮----
/// @dev Check that the staker's delegatable shares in ALL strategies have not changed
⋮----
function assert_Snap_Unchanged_Staker_DepositShares(User staker, string memory err) internal {
⋮----
/// @dev Check that the staker's withdrawable shares have increased by `addedShares`
function assert_Snap_Added_Staker_WithdrawableShares(
⋮----
/// @dev This is currently used by dual slashing tests
/// TODO: potentially bound better
function assert_Snap_Added_Staker_WithdrawableShares_AtLeast(
⋮----
/// @dev Check that the staker's withdrawable shares have decreased by `removedShares`
function assert_Snap_Removed_Staker_WithdrawableShares(
⋮----
function assert_Snap_Removed_Staker_WithdrawableShares(User staker, IStrategy strat, uint removedShares, string memory err) internal {
⋮----
function assert_Snap_Unchanged_Staker_WithdrawableShares(User staker, IStrategy[] memory strategies, string memory err) internal {
⋮----
/// @dev Check that the staker's withdrawable shares have changed by the expected amount
function assert_Snap_Expected_Staker_WithdrawableShares_Delegation(
⋮----
// For each strategy, check expected == current
⋮----
function assert_Snap_Expected_Staker_WithdrawableShares_Deposit(
⋮----
/// @dev Check that the staker's withdrawable shares have decreased by at least `removedShares`
/// @dev Used to handle overslashing of beacon chain
function assert_Snap_Removed_Staker_WithdrawableShares_AtLeast(
⋮----
// Assert that the decrease in withdrawable shares is at least as much as the removed shares
// Checking for expected rounding down behavior
⋮----
/// @dev Used to handle overslashing of beacon chain with AVS slashings
⋮----
// For each strategy, check diff between (prev-removed) and curr is at most 1 gwei
⋮----
function assert_Snap_Removed_Staker_WithdrawableShares_AtLeast(User staker, IStrategy strat, uint removedShares, string memory err)
⋮----
function assert_Snap_Delta_StakerShares(User staker, IStrategy[] memory strategies, int[] memory shareDeltas, string memory err)
⋮----
function assert_Snap_Unchanged_DSF(User staker, IStrategy[] memory strategies, string memory err) internal {
⋮----
function assert_Snap_Increased_DSF(User staker, IStrategy[] memory strategies, string memory err) internal {
⋮----
function assert_Snap_WithinErrorBounds_DSF(User staker, IStrategy[] memory strategies, string memory err) internal {
⋮----
/// @dev Used to assert that the DSF is either increased or unchanged, depending on the slashing factor, on a deposit
function assert_Snap_DSF_State_Deposit(User staker, IStrategy[] memory strategies, string memory err) internal {
⋮----
// If there was never a slashing, no need to normalize
⋮----
assertEq(prevDSFs[i], curDSFs[i], err); // No slashing, so DSF is unchanged
assertEq(curDSFs[i], WAD, err); // DSF should have always been WAD
⋮----
// If there was a slashing, and we deposit, normalize
⋮----
// If the DSF and slashing factor are already normalized against each other from a previous deposit (prevWithdrawableFactor very close to WAD)
// and there have been no subsequent slashings, DSF "should" stay the same, but recomputing decreases it slightly due to
// fixed point arithmetic rounding. Outer if is to prevent int underflow errors.
⋮----
assertGt(curDSFs[i], prevDSFs[i], err); // Slashing, so DSF is increased
⋮----
/// @dev When completing withdrawals as shares, we must also handle the case where a staker completes a withdrawal for 0 shares
function assert_Snap_DSF_State_WithdrawalAsShares(User staker, IStrategy[] memory strategies, string memory err) internal {
⋮----
// If there was a slashing, but we complete a withdrawal for 0 shares, no need to normalize
⋮----
// If the staker has a slashingFactor of 0, any withdrawal as shares won't change the DSF
⋮----
// If there was a slashing and we complete a withdrawal for non-zero shares, normalize the DSF
⋮----
/// @dev On a delegation, the DSF should be increased if the operator magnitude is non-WAD
function assert_Snap_DSF_State_Delegation(
⋮----
// If you are delegating with 0 shares, no need to normalize
// If there was never an operator slashing, no need to normalize
⋮----
// If we are not a beaconChainStrategy, we should also have a DSF of WAD
// We exclude BEACONCHAIN_ETH_STRAT because it could have had a non-WAD DSF from BC slashings
⋮----
// If there was an operator slashing, and delegating with non-zero shares, normalize
⋮----
assert_Snap_Increased_DSF(staker, stratArray, err); // Slashing, so DSF is increased
⋮----
///                     SNAPSHOT ASSERTIONS: STRATEGY SHARES
⋮----
function assert_Snap_Removed_StrategyShares(IStrategy[] memory strategies, uint[] memory removedShares, string memory err) internal {
⋮----
// Use timewarp to get previous strategy shares
⋮----
// Ignore BeaconChainETH strategy since it doesn't keep track of global strategy shares
⋮----
function assert_Snap_Unchanged_StrategyShares(IStrategy[] memory strategies, string memory err) internal {
⋮----
function assert_SlashableStake_Decrease_BCSlash(User staker) internal {
⋮----
///                   SNAPSHOT ASSERTIONS: UNDERLYING TOKEN
⋮----
/// @dev Check that the staker has `addedTokens` additional underlying tokens
// since the last snapshot
function assert_Snap_Added_TokenBalances(User staker, IERC20[] memory tokens, uint[] memory addedTokens, string memory err) internal {
⋮----
// Use timewarp to get previous token balances
⋮----
/// @dev Check that the staker has `removedTokens` fewer underlying tokens
⋮----
function assert_Snap_Removed_TokenBalances(User staker, IStrategy[] memory strategies, uint[] memory removedTokens, string memory err)
⋮----
/// @dev Check that the staker's underlying token balance for ALL tokens have
/// not changed since the last snapshot
function assert_Snap_Unchanged_TokenBalances(User staker, string memory err) internal {
⋮----
///                   SNAPSHOT ASSERTIONS: QUEUED WITHDRAWALS
⋮----
function assert_Snap_Added_QueuedWithdrawals(User staker, Withdrawal[] memory withdrawals, string memory err) internal {
⋮----
// Use timewarp to get previous cumulative withdrawals
⋮----
function assert_Snap_Added_QueuedWithdrawal(
⋮----
/*withdrawal*/
⋮----
///                      SNAPSHOT ASSERTIONS: EIGENPODS
⋮----
function assert_Snap_Added_ActiveValidatorCount(User staker, uint addedValidators, string memory err) internal {
⋮----
function assert_Snap_Removed_ActiveValidatorCount(User staker, uint exitedValidators, string memory err) internal {
⋮----
function assert_Snap_Unchanged_ActiveValidatorCount(User staker, string memory err) internal {
⋮----
function assert_Snap_Added_ActiveValidators(User staker, uint40[] memory addedValidators, string memory err) internal {
⋮----
function assert_Snap_Removed_ActiveValidators(User staker, uint40[] memory exitedValidators, string memory err) internal {
⋮----
function assert_Snap_Created_Checkpoint(User staker, string memory err) internal {
⋮----
function assert_Snap_Removed_Checkpoint(User staker, string memory err) internal {
⋮----
function assert_Snap_Unchanged_Checkpoint(User staker, string memory err) internal {
⋮----
function assert_Snap_Unchanged_CheckpointBlockRoot(User staker, string memory err) internal {
⋮----
function assert_Snap_Updated_LastCheckpoint(User staker, string memory err) internal {
// Sorry for the confusing naming... the pod variable is called `lastCheckpointTimestamp`
⋮----
function assert_Snap_Added_PodBalanceToWithdrawable(User staker, string memory err) internal {
⋮----
function assert_Snap_Added_WithdrawableGwei(User staker, uint64 addedGwei, string memory err) internal {
⋮----
function assert_Snap_Unchanged_WithdrawableGwei(User staker, string memory err) internal {
⋮----
function assert_Snap_Added_BalanceExitedGwei(User staker, uint64 addedGwei, string memory err) internal {
⋮----
// If we just finalized a checkpoint, that's the timestamp we want to use
// to look up checkpoint balances exited
⋮----
function assert_Snap_Decreased_BCSF(User staker, string memory err) internal {
⋮----
function assert_Snap_Unchanged_BCSF(User staker, string memory err) internal {
⋮----
///                             UTILITY METHODS
⋮----
/// @dev Fetches the opreator's allocation delay; asserts that it is set
function _getExistingAllocationDelay(User operator) internal view returns (uint32) {
⋮----
/// @dev Generate params to allocate all available magnitude to each strategy in the operator set
function _genAllocation_AllAvailable(User operator, OperatorSet memory operatorSet)
⋮----
function _genAllocation_AllAvailable(User operator, OperatorSet memory operatorSet, IStrategy[] memory strategies)
⋮----
/// @dev Gen params to allocate half of available magnitude to each strategy in the operator set
/// returns the params to complete this allocation
function _genAllocation_HalfAvailable(User operator, OperatorSet memory operatorSet)
⋮----
function _genAllocation_HalfAvailable(User operator, OperatorSet memory operatorSet, IStrategy[] memory strategies)
⋮----
/// @dev Generate params to allocate a random portion of available magnitude to each strategy
/// in the operator set. All strategies will have a nonzero allocation, and the minimum allocation
/// will be 10% of available magnitude
function _genAllocation_Rand(User operator, OperatorSet memory operatorSet) internal returns (AllocateParams memory params) {
⋮----
// minimum of 10%, maximum of 100%. increments of 10%.
⋮----
/// @dev Generates params for a half deallocation from all strategies the operator is allocated to in the operator set
function _genDeallocation_HalfRemaining(User operator, OperatorSet memory operatorSet)
⋮----
function _genDeallocation_HalfRemaining(User operator, OperatorSet memory operatorSet, IStrategy[] memory strategies)
⋮----
/// @dev Generates params for a full deallocation from all strategies the operator is allocated to in the operator set
function _genDeallocation_Full(User operator, OperatorSet memory operatorSet) internal view returns (AllocateParams memory params) {
⋮----
function _genDeallocation_Full(User, OperatorSet memory operatorSet, IStrategy[] memory strategies)
⋮----
/// Generate random slashing between 1 and 99%
function _genSlashing_Rand(User operator, OperatorSet memory operatorSet) internal returns (SlashingParams memory params) {
⋮----
/// 1% * rand(1, 99)
⋮----
function _genSlashing_Half(User operator, OperatorSet memory operatorSet) internal returns (SlashingParams memory params) {
⋮----
// slash 50%
⋮----
function _genSlashing_Full(User operator, OperatorSet memory operatorSet) internal returns (SlashingParams memory params) {
⋮----
// slash 100%
⋮----
function _genSlashing_SingleStrategy(User operator, OperatorSet memory operatorSet, IStrategy strategy)
⋮----
function _genSlashing_Custom(User operator, OperatorSet memory operatorSet, uint wadsToSlash)
⋮----
function _randWadToSlash() internal returns (uint) {
⋮----
function _strategiesAndWadsForFullSlash(OperatorSet memory operatorSet)
⋮----
// Get list of all strategies in an operator set.
⋮----
function _strategiesAndWadsForRandFullSlash(OperatorSet memory operatorSet)
⋮----
// Randomly select a subset of strategies to slash.
⋮----
// Update length of strategies array.
⋮----
// Fully slash each selected strategy
⋮----
function _randMagnitudes(uint64 sum, uint len) internal returns (uint64[] memory magnitudes) {
⋮----
function _maxMagnitudes(OperatorSet memory operatorSet, User operator) internal view returns (uint64[] memory magnitudes) {
⋮----
function _randWithdrawal(IStrategy[] memory strategies, uint[] memory shares) internal returns (IStrategy[] memory, uint[] memory) {
⋮----
// For native eth, withdraw a random amount of gwei (at least 1)
⋮----
// For LSTs, withdraw a random amount of shares (at least 1)
⋮----
/// Helpful getters:
function _randSlashType() internal returns (BeaconChainMock.SlashType) {
⋮----
function _randBalanceUpdate(User staker, IStrategy[] memory strategies) internal returns (int[] memory, int[] memory, int[] memory) {
⋮----
// For native ETH, we're either going to slash the staker's validators,
// or award them consensus rewards. In either case, the magnitude of
// the balance update depends on the staker's active validator count
⋮----
// For LSTs, mint a random token amount
⋮----
function _calcNativeETHOperatorShareDelta(User staker, int shareDelta) internal view returns (int) {
// TODO: Maybe we update parent method to have an M2 and Slashing version?
⋮----
// if the shares started negative and stayed negative, then there cannot have been an increase in delegateable shares
⋮----
// if the shares started negative and became positive, then the increase in delegateable shares is the ending share amount
⋮----
// if the shares started positive and became negative, then the decrease in delegateable shares is the starting share amount
⋮----
// if the shares started positive and stayed positive, then the change in delegateable shares
// is the difference between starting and ending amounts
⋮----
function _calculateExpectedShares(Withdrawal memory withdrawal) internal view returns (uint[] memory) {
⋮----
/// @dev For some strategies/underlying token balances, calculate the expected shares received
/// from depositing all tokens
function _calculateExpectedShares(IStrategy[] memory strategies, uint[] memory tokenBalances) internal returns (uint[] memory) {
⋮----
function _calculateExpectedTokens(IStrategy[] memory strategies, uint[] memory shares) internal returns (uint[] memory) {
⋮----
// We round down expected tokens to the nearest gwei
⋮----
function _getWithdrawalHashes(Withdrawal[] memory withdrawals) internal view returns (bytes32[] memory) {
⋮----
/// @dev Converts a list of strategies to underlying tokens
function _getUnderlyingTokens(IStrategy[] memory strategies) internal view returns (IERC20[] memory) {
⋮----
modifier timewarp() {
⋮----
/// @dev Rolls forward by the minimum withdrawal delay blocks.
function _rollBlocksForCompleteWithdrawals(Withdrawal[] memory withdrawals) internal {
⋮----
function _rollForward_AllocationConfigurationDelay() internal {
⋮----
function _rollForward_AllocationDelay(User operator) internal {
⋮----
function _rollBackward_AllocationDelay(User operator) internal {
⋮----
function _rollForward_DeallocationDelay() internal {
⋮----
function _rollBackward_DeallocationDelay() internal {
⋮----
/// @dev Rolls forward by the default allocation delay blocks.
function _rollBlocksForCompleteAllocation(User operator, OperatorSet memory operatorSet, IStrategy[] memory strategies) internal {
⋮----
function _rollBlocksForCompleteAllocation(User operator, OperatorSet[] memory operatorSets, IStrategy[] memory strategies) internal {
⋮----
/// @dev Uses timewarp modifier to get the operator set strategy allocations at the last snapshot.
function _getPrevAllocations(User operator, OperatorSet memory operatorSet, IStrategy[] memory strategies)
⋮----
/// @dev Looks up each strategy for an operator set and returns a list of operator allocations.
function _getAllocations(User operator, OperatorSet memory operatorSet, IStrategy[] memory strategies)
⋮----
function _getPrevAllocatedStrats(User operator, OperatorSet memory operatorSet) internal timewarp returns (IStrategy[] memory) {
⋮----
function _getAllocatedStrats(User operator, OperatorSet memory operatorSet) internal view returns (IStrategy[] memory) {
⋮----
function _getPrevAllocatedSets(User operator) internal timewarp returns (OperatorSet[] memory) {
⋮----
function _getAllocatedSets(User operator) internal view returns (OperatorSet[] memory) {
⋮----
function _getPrevRegisteredSets(User operator) internal timewarp returns (OperatorSet[] memory) {
⋮----
function _getRegisteredSets(User operator) internal view returns (OperatorSet[] memory) {
⋮----
function _getPrevMembers(OperatorSet memory operatorSet) internal timewarp returns (address[] memory) {
⋮----
function _getMembers(OperatorSet memory operatorSet) internal view returns (address[] memory) {
⋮----
function _getPrevMagnitudes(User operator, IStrategy[] memory strategies) internal timewarp returns (Magnitudes[] memory) {
⋮----
function _getMagnitudes(User operator, IStrategy[] memory strategies) internal view returns (Magnitudes[] memory magnitudes) {
⋮----
function _getMaxMagnitudes(User operator, IStrategy[] memory strategies) internal view returns (uint64[] memory) {
⋮----
function _getMaxMagnitudes(User operator, IStrategy[] memory strategies, uint32 blockNum) internal view returns (uint64[] memory) {
⋮----
function _getPrevMinSlashableStake(User operator, OperatorSet memory operatorSet, IStrategy[] memory strategies)
⋮----
function _getPrevMinSlashableStake(address operator, OperatorSet memory operatorSet, IStrategy[] memory strategies)
⋮----
function _getMinSlashableStake(User operator, OperatorSet memory operatorSet, IStrategy[] memory strategies)
⋮----
function _getMinSlashableStake(address operator, OperatorSet memory operatorSet, IStrategy[] memory strategies)
⋮----
function _getPrevAllocatedStake(User operator, OperatorSet memory operatorSet, IStrategy[] memory strategies)
⋮----
function _getAllocatedStake(User operator, OperatorSet memory operatorSet, IStrategy[] memory strategies)
⋮----
function _getStrategyAllocations(User operator, IStrategy strategy)
⋮----
function _getStrategyAllocations(address operator, IStrategy strategy)
⋮----
function _getPrevOperatorSetRegistered(OperatorSet memory operatorSet) internal timewarp returns (bool) {
⋮----
function _getOperatorSetRegistered(OperatorSet memory operatorSet) internal view returns (bool) {
⋮----
function _getPrevIsSlashable(User operator, OperatorSet memory operatorSet) internal timewarp returns (bool) {
⋮----
function _getIsSlashable(User operator, OperatorSet memory operatorSet) internal view returns (bool) {
⋮----
function _getPrevIsMemberOfSet(User operator, OperatorSet memory operatorSet) internal timewarp returns (bool) {
⋮----
function _getIsMemberOfSet(User operator, OperatorSet memory operatorSet) internal view returns (bool) {
⋮----
function _getPrevBurnOrRedistributableShares(OperatorSet memory operatorSet, uint slashId, IStrategy strategy)
⋮----
function _getBurnOrRedistributableShares(OperatorSet memory operatorSet, uint slashId, IStrategy strategy)
⋮----
function _getPrevSlashableSharesInQueue(User operator, IStrategy[] memory strategies) internal timewarp returns (uint[] memory) {
⋮----
function _getSlashableSharesInQueue(User operator, IStrategy[] memory strategies) internal view returns (uint[] memory) {
⋮----
/// @dev Uses timewarp modifier to get operator shares at the last snapshot
function _getPrevOperatorShares(User operator, IStrategy[] memory strategies) internal timewarp returns (uint[] memory) {
⋮----
/// @dev Looks up each strategy and returns a list of the operator's shares
function _getOperatorShares(User operator, IStrategy[] memory strategies) internal view returns (uint[] memory) {
⋮----
/// @dev Uses timewarp modifier to get staker shares at the last snapshot
function _getPrevStakerDepositShares(User staker, IStrategy[] memory strategies) internal timewarp returns (uint[] memory) {
⋮----
/// @dev Looks up each strategy and returns a list of the staker's shares
function _getStakerDepositShares(User staker, IStrategy[] memory strategies) internal view returns (uint[] memory) {
⋮----
// This method should only be used for tests that handle positive
// balances. Negative balances are an edge case that require
// the own tests and helper methods.
⋮----
function _getPrevStakerDepositSharesInt(User staker, IStrategy[] memory strategies) internal timewarp returns (int[] memory) {
⋮----
function _getStakerDepositSharesInt(User staker, IStrategy[] memory strategies) internal view returns (int[] memory) {
⋮----
function _getStakerStrategyList(User staker) internal view returns (IStrategy[] memory) {
⋮----
function _getPrevStakerWithdrawableShares(User staker, IStrategy[] memory strategies) internal timewarp returns (uint[] memory) {
⋮----
function _getStakerWithdrawableShares(User staker, IStrategy[] memory strategies) internal view returns (uint[] memory) {
⋮----
function _calcWithdrawable(User staker, IStrategy[] memory strategies, uint[] memory depositSharesToWithdraw)
⋮----
/// @dev Uses timewarp modifier to get staker beacon chain scaling factor at the last snapshot
function _getPrevBeaconChainSlashingFactor(User staker) internal timewarp returns (uint64) {
⋮----
/// @dev Looks up the staker's beacon chain scaling factor
function _getBeaconChainSlashingFactor(User staker) internal view returns (uint64) {
⋮----
function _getPrevCumulativeWithdrawals(User staker) internal timewarp returns (uint) {
⋮----
function _getCumulativeWithdrawals(User staker) internal view returns (uint) {
⋮----
function _getPrevTokenBalances(User staker, IERC20[] memory tokens) internal timewarp returns (uint[] memory) {
⋮----
function _getTokenBalances(User staker, IERC20[] memory tokens) internal view returns (uint[] memory) {
⋮----
function _getPrevTotalStrategyShares(IStrategy[] memory strategies) internal timewarp returns (uint[] memory) {
⋮----
function _getTotalStrategyShares(IStrategy[] memory strategies) internal view returns (uint[] memory) {
⋮----
// BeaconChainETH strategy doesn't keep track of global strategy shares, so we ignore
⋮----
function _getDepositScalingFactors(User staker, IStrategy[] memory strategies) internal view returns (uint[] memory) {
⋮----
function _getDepositScalingFactor(User staker, IStrategy strategy) internal view returns (uint) {
⋮----
function _getPrevDepositScalingFactors(User staker, IStrategy[] memory strategies) internal timewarp returns (uint[] memory) {
⋮----
function _getExpectedDSFUndelegate(User staker) internal view returns (uint expectedDepositScalingFactor) {
⋮----
function _getExpectedDSFDeposit(User staker, User operator, IStrategy strategy)
⋮----
function _getExpectedWithdrawableSharesUndelegate(User staker, IStrategy[] memory strategies, uint[] memory shares)
⋮----
function _getExpectedDSFsDelegate(User staker, User operator, IStrategy[] memory strategies) internal returns (uint[] memory) {
⋮----
function _getExpectedWithdrawableSharesDelegate(User staker, User operator, IStrategy[] memory strategies, uint[] memory depositShares)
⋮----
function _getExpectedWithdrawableSharesDeposit(User staker, User operator, IStrategy strategy, uint depositShares)
⋮----
function _getSlashingFactor(User staker, IStrategy strategy) internal view returns (uint) {
⋮----
function _getPrevSlashingFactor(User staker, IStrategy strategy) internal timewarp returns (uint) {
⋮----
function _getSlashingFactors(User staker, IStrategy[] memory strategies) internal view returns (uint[] memory) {
⋮----
function _getPrevSlashingFactors(User staker, IStrategy[] memory strategies) internal timewarp returns (uint[] memory) {
⋮----
function _getPrevWithdrawableShares(User staker, IStrategy[] memory strategies) internal timewarp returns (uint[] memory) {
⋮----
function _getWithdrawableShares(User staker, IStrategy[] memory strategies) internal view returns (uint[] memory withdrawableShares) {
⋮----
function _getWithdrawableShares(User staker, IStrategy strategy) internal view returns (uint withdrawableShares) {
⋮----
/// @dev Assumes that the staker has one withdrawal queued
function _getWithdrawableSharesAfterCompletion(User staker) internal view returns (uint[] memory withdrawableShares) {
⋮----
function _getActiveValidatorCount(User staker) internal view returns (uint) {
⋮----
function _getPrevActiveValidatorCount(User staker) internal timewarp returns (uint) {
⋮----
function _getValidatorStatuses(User staker, bytes32[] memory pubkeyHashes) internal view returns (VALIDATOR_STATUS[] memory) {
⋮----
function _getPrevValidatorStatuses(User staker, bytes32[] memory pubkeyHashes) internal timewarp returns (VALIDATOR_STATUS[] memory) {
⋮----
function _getProofsRemaining(User staker) internal view returns (uint) {
⋮----
function _getPrevProofsRemaining(User staker) internal timewarp returns (uint) {
⋮----
function _getCheckpointBlockRoot(User staker) internal view returns (bytes32) {
⋮----
function _getPrevCheckpointBlockRoot(User staker) internal timewarp returns (bytes32) {
⋮----
function _getCheckpointTimestamp(User staker) internal view returns (uint64) {
⋮----
function _getPrevCheckpointTimestamp(User staker) internal timewarp returns (uint64) {
⋮----
function _getLastCheckpointTimestamp(User staker) internal view returns (uint64) {
⋮----
function _getPrevLastCheckpointTimestamp(User staker) internal timewarp returns (uint64) {
⋮----
function _getWithdrawableRestakedGwei(User staker) internal view returns (uint64) {
⋮----
function _getPrevWithdrawableRestakedGwei(User staker) internal timewarp returns (uint64) {
⋮----
function _getCheckpointPodBalanceGwei(User staker) internal view returns (uint64) {
⋮----
function _getPrevCheckpointPodBalanceGwei(User staker) internal timewarp returns (uint64) {
⋮----
function _getCheckpointBalanceExited(User staker, uint64 checkpointTimestamp) internal view returns (uint64) {
⋮----
function _getPrevCheckpointBalanceExited(User staker, uint64 checkpointTimestamp) internal timewarp returns (uint64) {
⋮----
function _getQueuedWithdrawals(User staker) internal view returns (Withdrawal[] memory) {
⋮----
///                         EMISSIONS CONTROLLER HELPERS
⋮----
function _getTotalProcessableDistributions() internal view returns (uint) {
⋮----
function _getPrevTotalProcessableDistributions() internal timewarp returns (uint) {
⋮----
function _getEmissionsControllerEigenBalance() internal view returns (uint) {
⋮----
function _getPrevEmissionsControllerEigenBalance() internal timewarp returns (uint) {
⋮----
function _getIncentiveCouncilEigenBalance(address incentiveCouncil) internal view returns (uint) {
⋮----
function _getPrevIncentiveCouncilEigenBalance(address incentiveCouncil) internal timewarp returns (uint) {
⋮----
function _getTotalWeight() internal view returns (uint16) {
⋮----
function _getPrevTotalWeight() internal timewarp returns (uint16) {
⋮----
function _getCurrentEpoch() internal view returns (uint) {
⋮----
function _getPrevCurrentEpoch() internal timewarp returns (uint) {
⋮----
function _getDistribution(uint distributionId) internal view returns (IEmissionsControllerTypes.Distribution memory) {
⋮----
function _getPrevDistribution(uint distributionId) internal timewarp returns (IEmissionsControllerTypes.Distribution memory) {
⋮----
function _getIsButtonPressable() internal view returns (bool) {
⋮----
function _getPrevIsButtonPressable() internal timewarp returns (bool) {
⋮----
// ========================================
// 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)
⋮----
/// @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]
⋮----
// Read the packed slot
⋮----
// 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)
⋮----
/// @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) {
⋮----
// After emissions start: _distributions.length = totalProcessable + totalAdded
⋮----
function _getPrevTotalDistributions() internal timewarp returns (uint) {
⋮----
function _getEpochTotalAdded(uint epoch) internal view returns (uint) {
⋮----
function _getEpochTotalProcessed(uint epoch) internal view returns (uint) {
⋮----
function _getPrevEpochTotalProcessed(uint epoch) internal timewarp returns (uint) {
⋮----
function _getEpochMinted(uint epoch) internal view returns (bool) {
⋮----
function _getPrevEpochMinted(uint epoch) internal timewarp returns (bool) {
⋮----
/// Assertions
⋮----
function assert_Snap_Added_TotalProcessableDistributions(uint added, string memory err) internal {
⋮----
function assert_Snap_Unchanged_TotalProcessableDistributions(string memory err) internal {
⋮----
function assert_Snap_Added_EmissionsController_EigenBalance(uint added, string memory err) internal {
⋮----
function assert_Snap_Removed_EmissionsController_EigenBalance(uint removed, string memory err) internal {
⋮----
function assert_Snap_Unchanged_EmissionsController_EigenBalance(string memory err) internal {
⋮----
function assert_Snap_Added_IncentiveCouncil_EigenBalance(address incentiveCouncil, uint added, string memory err) internal {
⋮----
function assert_Snap_Unchanged_IncentiveCouncil_EigenBalance(address incentiveCouncil, string memory err) internal {
⋮----
function assert_Snap_Added_TotalWeight(uint added, string memory err) internal {
⋮----
function assert_Snap_Updated_TotalWeight(uint64 expected, string memory err) internal {
⋮----
function assert_Snap_Unchanged_TotalWeight(string memory err) internal {
⋮----
function assert_Snap_Created_Distribution(uint distributionId, string memory err) internal {
⋮----
function assert_Snap_Updated_Distribution(
⋮----
function assert_Snap_ButtonPressed(string memory err) internal {
⋮----
// 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)
⋮----
function assert_Snap_Unchanged_CurrentEpoch(string memory err) internal {
⋮----
function assert_Snap_Updated_CurrentEpoch(uint expected, string memory err) internal {
⋮----
function assert_Snap_Added_TotalDistributions(uint added, string memory err) internal {
⋮----
function assert_Snap_Unchanged_TotalDistributions(string memory err) internal {
⋮----
function assert_Snap_Unchanged_ButtonPressability(string memory err) internal {
⋮----
function assert_TotalWeight_LTE_MaxWeight(string memory err) internal view {
⋮----
function assert_Snap_Updated_EpochTotalProcessed(uint epoch, uint expected, string memory err) internal {
⋮----
function assert_Snap_Increased_EpochTotalProcessed(uint epoch, string memory err) internal {
⋮----
function assert_Snap_EpochMinted(uint epoch, bool expected, string memory err) internal {
⋮----
function assert_Distribution_StoredCorrectly(
⋮----
function assert_Distributions_Match_Expected(
````

## File: src/test/integration/IntegrationChecks.t.sol
````
// SPDX-License-Identifier: BUSL-1.1
⋮----
import "src/test/integration/IntegrationBase.t.sol";
import "src/test/integration/users/User.t.sol";
⋮----
/// @notice Contract that provides utility functions to reuse common test blocks & checks
contract IntegrationCheckUtils is IntegrationBase {
⋮----
///
///                              EIGENPOD CHECKS
⋮----
function check_VerifyWC_State(User staker, uint40[] memory validators, uint64 beaconBalanceGwei) internal {
⋮----
// TODO: fix this
// assert_Snap_Added_Staker_WithdrawableShares(staker, BEACONCHAIN_ETH_STRAT.toArray(), beaconBalanceWei.toArrayU256(), "staker should have added withdrawable shares to beacon chain strat");
⋮----
function check_StartCheckpoint_State(User staker) internal {
⋮----
function check_StartCheckpoint_WithPodBalance_State(User staker, uint64 expectedPodBalanceGwei) internal {
⋮----
function check_StartCheckpoint_NoValidators_State(User staker, uint64 sharesAddedGwei) internal {
⋮----
function check_CompleteCheckpoint_State(User staker) internal {
⋮----
function check_CompleteCheckpoint_EarnOnBeacon_State(User staker, uint64 beaconBalanceAdded) internal {
⋮----
function check_CompleteCheckpoint_WithPodBalance_State(User staker, uint64 expectedPodBalanceGwei) internal {
⋮----
/// @dev Common checks for all slashing states, irrespective of validator exits
function check_CompleteCheckpoint_WithSlashing_State_Base(User staker) internal {
⋮----
function check_CompleteCheckpoint_WithSlashing_Exits_State_Base(User staker, uint40[] memory slashedValidators) internal {
⋮----
// Validator exits
⋮----
// System Vars
⋮----
/// @dev Includes validator exits
function check_CompleteCheckpoint_WithSlashing_State(User staker, uint40[] memory slashedValidators, uint64 slashedAmountGwei)
⋮----
// Prove withdrawable shares decrease
⋮----
/// @dev Same as above, but BCSF must be zero on a full slash
function check_CompleteCheckpoint_FullySlashed_State(User staker, uint40[] memory slashedValidators, uint64 slashedAmountGwei)
⋮----
function check_CompleteCheckpoint_WithSlashing_HandleRoundDown_State(
⋮----
/// @notice Used for edge cases where rounding behaviors of magnitudes close to 1 are tested.
/// Normal
function check_CompleteCheckPoint_WithSlashing_LowMagnitude_State(User staker, uint64 slashedAmountGwei) internal {
⋮----
function check_CompleteCheckpoint_WithCLSlashing_State(User staker, uint64 slashedAmountGwei) internal {
⋮----
function check_CompleteCheckpoint_WithCLSlashing_HandleRoundDown_State(User staker, uint64 slashedAmountGwei) internal {
⋮----
function check_CompleteCheckpoint_WithExits_State(User staker, uint40[] memory exitedValidators, uint64 exitedBalanceGwei) internal {
⋮----
function check_CompleteCheckpoint_WithConsolidations_State(User staker, uint40[] memory consolidatedValidators) internal {
⋮----
function check_CompleteCheckpoint_ZeroBalanceDelta_State(User staker) internal {
⋮----
///                           LST/DELEGATION CHECKS
⋮----
function check_Deposit_State(User staker, IStrategy[] memory strategies, uint[] memory shares) internal {
/// Deposit into strategies:
// For each of the assets held by the staker (either StrategyManager or EigenPodManager),
// the staker calls the relevant deposit function, depositing all held assets.
//
// ... check that all underlying tokens were transferred to the correct destination
//     and that the staker now has the expected amount of delegated shares in each strategy
⋮----
function check_Deposit_State_PartialDeposit(
⋮----
// the staker calls the relevant deposit function, depositing some subset of held assets
⋮----
// ... check that some underlying tokens were transferred to the correct destination
⋮----
function check_Delegation_State(User staker, User operator, IStrategy[] memory strategies, uint[] memory depositShares) internal {
/// Delegate to an operator:
⋮----
// ... check that the staker is now delegated to the operator, and that the operator
//     was awarded the staker shares
⋮----
function check_Added_SlashableStake(User operator, IStrategy[] memory strategies) internal {
⋮----
function check_QueuedWithdrawal_State(
⋮----
// The staker will queue one or more withdrawals for the selected strategies and shares
⋮----
// ... check that each withdrawal was successfully enqueued, that the returned roots
//     match the hashes of each withdrawal, and that the staker and operator have
//     reduced shares.
⋮----
/// @dev Basic queued withdrawal checks if the staker is not delegated, should be called by the above function only
function _check_QueuedWithdrawal_State_NotDelegated(
⋮----
// Check that the dsf is either reset to wad or unchanged
⋮----
// For a full withdrawal, the dsf should be reset to wad & the staker strategy list should not contain the strategy
⋮----
// For a partial withdrawal, the dsf should not be changed & the strategy should still be in the staker strategy list
⋮----
function check_Decreased_SlashableStake(User operator, uint[] memory withdrawableShares, IStrategy[] memory strategies) internal {
⋮----
function check_Undelegate_State(
⋮----
/// Undelegate from an operator
⋮----
// ... check that the staker is undelegated, all strategies from which the staker is deposited are unqueued,
//     that the returned root matches the hashes for each strategy and share amounts, and that the staker
//     and operator have reduced shares
⋮----
function check_Redelegate_State(
⋮----
/// Redelegate to a new operator
⋮----
// ... check that the staker is delegated to new operator, all strategies from which the staker is deposited are unqueued,
⋮----
/// @notice Overloaded function to check the state after a withdrawal as tokens, accepting a non-user type for the operator.
/// @param staker The staker who completed the withdrawal.
/// @param operator The operator address, which can be a non-user type like address(0).
/// @param withdrawal The details of the withdrawal that was completed.
/// @param strategies The strategies from which the withdrawal was made.
/// @param shares The number of shares involved in the withdrawal.
/// @param tokens The tokens received after the withdrawal.
/// @param expectedTokens The expected tokens to be received after the withdrawal.
function check_Withdrawal_AsTokens_State(
⋮----
// Common checks
⋮----
// Checks specific to an operator that the Staker has delegated to
⋮----
function check_Withdrawal_AsShares_State(
⋮----
// Common checks applicable to both user and non-user operator types
⋮----
// Additional checks or handling for the non-user operator scenario
⋮----
/// @notice Difference from above is that operator shares do not increase since staker is not delegated
function check_Withdrawal_AsShares_Undelegated_State(
⋮----
/// Complete withdrawal(s):
// The staker will complete the withdrawal as shares
⋮----
// ... check that the withdrawal is not pending, that the token balances of the staker and operator are unchanged,
//     that the withdrawer received the expected shares, and that that the total shares of each o
//     strategy withdrawn remains unchanged
⋮----
function check_Withdrawal_AsShares_Redelegated_State(
⋮----
///                             ALM - BASIC INVARIANTS
⋮----
/// @dev Run a method as if the user's allocation delay had passed
/// When done, reset block number so other tests are not affected
modifier activateAllocation(User operator) {
⋮----
/// @dev Run a method as if the deallocation delay has passed
⋮----
modifier activateDeallocation() {
⋮----
/// @dev Run a method ONLY IF the operator has a nonzero activation delay
modifier skipIfInstantAlloc(User operator) {
/// Note: if the ALM says the allocation delay is "not set", this will revert
⋮----
/// @dev Check global max magnitude invariants - these should ALWAYS hold
function check_MaxMag_Invariants(User operator) internal view {
⋮----
/// @dev Check that the last call to modifyAllocations resulted in a non-pending modification
function check_ActiveModification_State(User operator, AllocateParams memory params) internal view {
⋮----
function check_IsSlashable_State(User operator, OperatorSet memory operatorSet, IStrategy[] memory strategies) internal view {
⋮----
function check_NotSlashable_State(User operator, OperatorSet memory operatorSet) internal view {
⋮----
///                              ALM - REGISTRATION
⋮----
/// @dev Basic invariants that should hold after EVERY call to `registerForOperatorSets`
/// NOTE: These are only slightly modified from check_Base_Deregistration_State
/// If you add invariants here, consider adding them there (and vice-versa)
function check_Base_Registration_State(User operator, OperatorSet memory operatorSet) internal {
⋮----
// Registration SHOULD register the operator, making them slashable and adding them as a member of the set
⋮----
// Registration should NOT change anything about magnitude, allocations, or allocated sets
⋮----
/// @dev Check invariants for registerForOperatorSets given a set of strategies
/// for which NO allocation exists (currentMag/pendingDiff are 0)
/// @param unallocated For the given operatorSet, a list of strategies for which NO allocation exists
function check_Registration_State_NoAllocation(User operator, OperatorSet memory operatorSet, IStrategy[] memory unallocated) internal {
⋮----
/// The operator is NOT allocated, ensure their slashable stake and magnitudes are unchanged
⋮----
/// @dev Check invariants for registerForOperatorSets AFTER a prior allocation becomes active
/// @param active allocation params to the last call to modifyAllocations
⋮----
/// ASSUMES:
/// - the effect block for `params` has already passed
/// - params.newMagnitudes does NOT contain any `0` entries
function check_Registration_State_ActiveAllocation(User operator, AllocateParams memory active) internal {
⋮----
/// Basic registerForOperatorSets invariants
⋮----
/// Given an active allocation, check that the allocation is reflected in state
⋮----
/// Check that additional stake just became slashable
⋮----
/// @dev Check registration invariants. Assumes the operator has a PENDING allocation
/// to the set, but that the allocation's effect block has not yet been reached
function check_Registration_State_PendingAllocation(User operator, AllocateParams memory params) internal {
⋮----
/// Skip pending checks if operator has no allocation delay
⋮----
///                              ALM - DEREGISTRATION
⋮----
/// @dev Basic invariants that should hold after EVERY call to `deregisterFromOperatorSets`
/// NOTE: These are only slightly modified from check_Base_Registration_State
⋮----
function check_Base_Deregistration_State(User operator, OperatorSet memory operatorSet) internal {
⋮----
// Deregistration SHOULD remove the operator as a member of the set
⋮----
// Deregistration should NOT change slashability, magnitude, allocations, or allocated sets
⋮----
function check_Deregistration_State_NoAllocation(User operator, OperatorSet memory operatorSet) internal {
⋮----
function check_Deregistration_State_ActiveAllocation(User operator, OperatorSet memory operatorSet) internal {
⋮----
function check_Deregistration_State_PendingAllocation(User operator, OperatorSet memory operatorSet) internal {
⋮----
///                             ALM - INCREASE ALLOCATION
⋮----
/// @dev Basic invariants that should hold after all calls to `modifyAllocations`
/// where the input `params` represent an _increase_ in magnitude
function check_Base_IncrAlloc_State(User operator, AllocateParams memory params) internal {
⋮----
// Increasing Allocation should NOT change operator set registration, max magnitude
⋮----
// Increasing Allocation SHOULD consume magnitude and mark the operator as being allocated to the set
⋮----
/// @dev Invariants for modifyAllocations. Use when:
/// - operator is NOT slashable for this operator set
/// - last call to modifyAllocations created an INCREASE in allocation
function check_IncrAlloc_State_NotSlashable(User operator, AllocateParams memory params) internal {
⋮----
/// Run checks on pending allocation, if the operator has a nonzero delay
⋮----
/// Run checks on active allocation
⋮----
/// @dev Invariants for modifyAllocations. Used when:
⋮----
/// - effectBlock for the increase HAS NOT been reached
function check_IncrAlloc_State_NotSlashable_Pending(User operator, AllocateParams memory params) private skipIfInstantAlloc(operator) {
// Validate operator allocation is pending
⋮----
// Should not have allocated magnitude
⋮----
/// - effectBlock for the increase HAS been reached
function check_IncrAlloc_State_NotSlashable_Active(User operator, AllocateParams memory params) private activateAllocation(operator) {
// Validate allocation is active
⋮----
// SHOULD set current magnitude and increase allocated stake
⋮----
// Should NOT change slashable stake
⋮----
/// - operator IS slashable for this operator set
⋮----
function check_IncrAlloc_State_Slashable(User operator, AllocateParams memory params) internal {
⋮----
/// - operator has no delegated shares/stake so their slashable stake remains UNCHANGED
function check_IncrAlloc_State_Slashable_NoDelegatedStake(User operator, AllocateParams memory params) internal {
⋮----
// Validate operator has no pending modification and has increased allocation
⋮----
function check_IncrAlloc_State_Slashable_Pending(User operator, AllocateParams memory params) private skipIfInstantAlloc(operator) {
⋮----
// Validate operator has pending allocation and unchanged allocated/slashable stake
⋮----
function check_IncrAlloc_State_Slashable_Active(User operator, AllocateParams memory params) private activateAllocation(operator) {
// Validate operator does not have a pending modification, and has expected slashable stake
⋮----
// SHOULD set current magnitude and increase slashable/allocated stake
⋮----
function check_IncrAlloc_State_Slashable_Active_NoDelegatedStake(User operator, AllocateParams memory params)
⋮----
///                             ALM - DECREASE ALLOCATION
⋮----
/// where the input `params` represent a decrease in magnitude
function check_Base_DecrAlloc_State(User operator, AllocateParams memory params) internal {
⋮----
// Decreasing Allocation should NOT change operator set registration, max magnitude
⋮----
function check_DecrAlloc_State_NotSlashable(User operator, AllocateParams memory params) internal {
⋮----
// SHOULD set current magnitude and decrease allocated stake
⋮----
function check_DecrAlloc_State_Slashable(User operator, AllocateParams memory params) internal {
⋮----
// Run checks on pending deallocation
⋮----
// Run checks on active deallocation
⋮----
function check_DecrAlloc_State_Slashable_Pending(User operator, AllocateParams memory params) private {
// Validate deallocation is pending
⋮----
// Should NOT have changed allocated magnitude or stake
⋮----
function check_DecrAlloc_State_Slashable_Active(User operator, AllocateParams memory params) private activateDeallocation {
⋮----
function check_FullyDeallocated_State(User operator, AllocateParams memory allocateParams, AllocateParams memory deallocateParams)
⋮----
// TODO - broken; do we want to fix this?
// assert_Snap_Removed_AllocatedSet(operator, operatorSet, "should have removed operator set from allocated sets");
⋮----
// Any instant deallocation
⋮----
///                             ALM - SLASHING
⋮----
function check_Base_Slashing_State(User operator, AllocateParams memory allocateParams, SlashingParams memory slashParams, uint slashId)
⋮----
// Slashing SHOULD change max magnitude and current allocation
⋮----
// Slashing SHOULD NOT change allocatable magnitude, registration, and slashability status
⋮----
// assert_Snap_Unchanged_AllocatedSets(operator, "should not have updated allocated sets");
// assert_Snap_Unchanged_AllocatedStrats(operator, operatorSet, "should not have updated allocated strategies");
⋮----
function check_Base_Slashing_State(
⋮----
/// Slashing invariants when the operator has been fully slashed for every strategy in the operator set
function check_FullySlashed_State(User operator, AllocateParams memory allocateParams, SlashingParams memory slashParams, uint slashId)
⋮----
///                             DUAL SLASHING CHECKS
⋮----
function check_CompleteCheckpoint_AfterAVSSlash_BCSlash(
⋮----
// From the original shares to the BC slash (AVS slash in between), the shares should have decreased by at least the BC slash amount
⋮----
// Calculate the withdrawable shares
⋮----
function check_CompleteCheckpoint_AfterAVSSlash_ValidatorProven_BCSlash(
⋮----
// Checkpoint State
⋮----
/// @dev Assumes the eth deposit was greater than the amount slashed
function check_CompleteCheckpoint_AfterAVSSlash_ETHDeposit_BCSlash(
⋮----
// Checkpoint State - can't use base check since a BC balance decrease isn't occurring
⋮----
// Share check.
// DSF and deposit shares should increase because our deposit amount is larger than the slash amount
⋮----
function check_CompleteCheckpoint_FullDualSlashes(
⋮----
// Assert no withdrawable shares
⋮----
/// -----------------------------------------------------------------------
/// EMISSIONS CONTROLLER CHECKS
⋮----
function check_addDists_State(
⋮----
// === Input Validation ===
⋮----
// === State Invariants ===
⋮----
// 1. Check that total weight was updated correctly.
⋮----
// 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.
⋮----
// 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%).
totalWeightAdded += distribution.weight; // Check after the loop.
⋮----
// 2d) Check that the rewards submissions array is not empty for non-Manual distributions.
⋮----
// 2c) Check that the total weight was updated correctly.
⋮----
// 4. Check that the total distributions were increased by the number of additions.
⋮----
function check_updateDists_State(
⋮----
// 1. Check that total weight was updated correctly (old weights removed, new weights added).
⋮----
// 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%).
⋮----
// 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.
⋮----
// 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) Already checked above after the loop (total weight check).
⋮----
// 2c) Check that the total weight does not exceed the maximum total weight.
⋮----
// 5. Check that the total distributions were unchanged (update doesn't add/remove, just modifies).
⋮----
function check_sweep_State(
⋮----
// When sweep occurred:
// 1. EmissionsController balance should be 0 or near-0 (all EIGEN swept)
⋮----
// 2. IncentiveCouncil balance increased by swept amount
// Note: We don't know exact amount without tracking prev balance, but it should have increased
⋮----
// 3. Button must not be pressable (sweep only works when button not pressable)
⋮----
// When sweep did NOT occur (button was pressable or no balance):
// 1. EmissionsController balance unchanged
⋮----
// 2. IncentiveCouncil balance unchanged
⋮----
// === Invariants that hold regardless of sweep ===
⋮----
// 4. Total weight unchanged (sweep doesn't modify distributions)
⋮----
// 5. Total distributions unchanged
⋮----
// 6. Total processable unchanged
⋮----
// 7. Current epoch unchanged (sweep doesn't advance time)
⋮----
// 8. Button pressability unchanged (sweep doesn't process distributions)
⋮----
// 9. All distributions remain unchanged
⋮----
function check_pressButton_State(
⋮----
// 1. Button must have been pressable before (otherwise pressButton should revert)
⋮----
// 2. Current epoch unchanged (pressing button doesn't advance epochs)
⋮----
// 3. Total weight unchanged (processing doesn't modify distributions)
⋮----
// 4. Total distributions unchanged (processing doesn't add/remove distributions)
⋮----
// 5. Total processable unchanged (same epoch, so calculation is same)
⋮----
// 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)
⋮----
// 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
⋮----
// 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
⋮----
// 9. Button pressability: if all distributions processed, button becomes not pressable
⋮----
// 10. All distributions remain stored correctly (processing doesn't modify distribution structs)
⋮----
// 11. Processed count should not exceed total processable
⋮----
function check_warpToEpoch_State(uint epoch) internal {
// === Primary State Verification ===
⋮----
// 1. Current epoch matches target epoch
⋮----
// 2. Block timestamp is within the target epoch's range
⋮----
// 3. Total weight unchanged (time warp doesn't modify distributions)
⋮----
// 4. Total distributions unchanged (time warp doesn't add/remove distributions)
⋮----
// 5. EmissionsController EIGEN balance unchanged (time warp doesn't mint/transfer)
⋮----
// 6. IncentiveCouncil balance 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
⋮----
// 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
⋮----
// 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
⋮----
// Before emissions start
⋮----
// After emissions start
````

## File: src/test/integration/IntegrationDeployer.t.sol
````
// SPDX-License-Identifier: BUSL-1.1
⋮----
// Imports
import "@openzeppelin/contracts/token/ERC20/presets/ERC20PresetFixedSupply.sol";
import "@openzeppelin/contracts/proxy/transparent/ProxyAdmin.sol";
import "@openzeppelin/contracts/proxy/transparent/TransparentUpgradeableProxy.sol";
import "@openzeppelin/contracts/proxy/beacon/IBeacon.sol";
import "@openzeppelin/contracts/proxy/beacon/UpgradeableBeacon.sol";
import "forge-std/Test.sol";
⋮----
import "src/contracts/core/DelegationManager.sol";
import "src/contracts/core/AllocationManager.sol";
import "src/contracts/core/AllocationManagerView.sol";
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";
import "src/contracts/permissions/PermissionController.sol";
⋮----
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";
⋮----
import "script/utils/ExistingDeploymentParser.sol";
⋮----
abstract contract IntegrationDeployer is ExistingDeploymentParser {
⋮----
// Fork ids for specific fork tests
⋮----
uint mainnetForkBlock = 23_634_615; // Post Redistribution Upgrade
⋮----
// Beacon chain genesis time when running locally
// Multiple of 12 for sanity's sake
⋮----
uint64 BEACON_GENESIS_TIME; // set after forkType is decided
⋮----
// Beacon chain deposit contract. The BeaconChainMock contract etchs ETHPOSDepositMock code here.
⋮----
uint32 INITIAL_GLOBAL_DELAY_BLOCKS = 4 days / 12 seconds; // 4 days in blocks
⋮----
// Lists of strategies used in the system
//
// When we select random user assets, we use the `assetType` to determine
// which of these lists to select user assets from.
⋮----
IStrategy[] ethStrats; // only has one strat tbh
IStrategy[] allStrats; // just a combination of the above 2 lists
IERC20[] allTokens; // `allStrats`, but contains all of the underlying tokens instead
⋮----
// If a token is in this mapping, then we will ignore this LST as it causes issues with reading balanceOf
⋮----
// Mock Contracts to deploy
⋮----
// Admin Addresses
⋮----
// Randomness state vars
⋮----
// After calling `_configRand`, these are the allowed "variants" on users that will
// be returned from `_randUser`.
⋮----
// Set only once in setUp, if FORK_MAINNET env is set
⋮----
/// @dev used to configure randomness and default user/asset types
///
/// Tests that want alternate user/asset types can still use this modifier,
/// and then configure user/asset types individually using the methods:
/// _configAssetTypes(...)
/// _configUserTypes(...)
⋮----
/// (Alternatively, this modifier can be overwritten)
modifier rand(uint24 r) virtual {
⋮----
// Used to create shared setups between tests
⋮----
// Use current contracts by default. Upgrade tests are only run with mainnet fork tests
// using the `UpgradeTest.t.sol` mixin.
⋮----
function NAME() public view virtual override returns (string memory) {
⋮----
/// @dev Anyone who wants to test using this contract in a separate repo via submodules may have to
/// override this function to set the correct paths for the deployment info files.
⋮----
/// This setUp function will account for specific --fork-url flags and deploy/upgrade contracts accordingly.
/// Note that forkIds are also created so you can make explicit fork tests using cheats.selectFork(forkId)
function setUp() public virtual {
⋮----
/// @dev Used to create shared setup between tests. This method is called
/// when the `rand` modifier is run, before a test starts
function _init() internal virtual {
⋮----
/// env FOUNDRY_PROFILE=forktest forge t --mc Integration
⋮----
/// Running foundry like this will trigger the fork test profile,
/// lowering fuzz runs and using a remote RPC to test against mainnet state
function isForktest() public view returns (bool) {
⋮----
/// Deploy EigenLayer locally
function _setUpLocal() public virtual noTracing {
⋮----
// Deploy ProxyAdmin
⋮----
// Deploy PauserRegistry
⋮----
// Deploy mocks
⋮----
// Deploy EIGEN and bEIGEN token proxies (handle circular dependency)
⋮----
// Deploy token implementations
⋮----
// Upgrade token proxies to implementations
⋮----
// Initialize tokens (cast to concrete types to access initialize)
⋮----
// Matching parameters to testnet
⋮----
// EmissionsController parameters (set after GENESIS_REWARDS_TIMESTAMP)
EMISSIONS_CONTROLLER_INFLATION_RATE = 2.3e24; // 2.3M EIGEN per epoch
⋮----
// Ensure start time is aligned to day boundaries (divisible by calculation interval)
⋮----
// 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
⋮----
// Deploy and configure strategies and tokens
⋮----
// Deploy half of the strategies using the factory.
⋮----
// Create time machine and beacon chain. Set block time to beacon chain genesis time and starting block number
⋮----
// Set the `pectraForkTimestamp` on the EigenPodManager. Use pectra state
⋮----
/// Parse existing contracts from mainnet
function _setUpMainnet() public virtual noTracing {
⋮----
// These are not yet deployed on mainnet, so we need to set them for testing
⋮----
// For fork tests, set start time relative to current block time to avoid past epoch issues
⋮----
// Add deployed strategies to lstStrats and allStrats
⋮----
// Add to lstStrats and allStrats
⋮----
// Create time machine and mock beacon chain
⋮----
// Since we haven't done the slashing upgrade on mainnet yet, upgrade mainnet contracts
// prior to test. `isUpgraded` is true by default, but is set to false in `UpgradeTest.t.sol`
⋮----
function _upgradeMainnetContracts() public virtual {
// First, deploy the new contracts as empty contracts
⋮----
// Deploy durationVaultBeacon and transfer ownership to executorMultisig
// so it can be upgraded uniformly with other beacons in _upgradeProxies()
⋮----
// Deploy new implementation contracts and upgrade all proxies to point to them
_deployProxies(); // deploy proxies (if undeployed)
⋮----
// Initialize EmissionsController if it's a new proxy
// Use try-catch in case it's already initialized
⋮----
// Grant EmissionsController permission to mint bEIGEN tokens
⋮----
// Disable transfer restrictions for EIGEN token (use try-catch in case already disabled)
⋮----
function _deployProxies() public {
⋮----
// allocationManagerView is deployed as a standalone implementation (not a proxy) in _deployImplementations()
⋮----
// multichain
⋮----
/// Deploy an implementation contract for each contract in the system
function _deployImplementations() public {
// Deploy AllocationManagerView as a standalone implementation (not a proxy)
⋮----
// Beacon implementations
⋮----
// Pre-longtail StrategyBaseTVLLimits implementation
// TODO - need to update ExistingDeploymentParser
⋮----
function _upgradeProxies() public noTracing {
// DelegationManager
⋮----
// StrategyManager
⋮----
// EigenPodManager
⋮----
// RewardsCoordinator
⋮----
// AVSDirectory
⋮----
// AllocationManager
⋮----
// PermissionController
⋮----
// StrategyFactory
⋮----
// EigenPod beacon
⋮----
// StrategyBase Beacon
⋮----
// DurationVault Beacon
⋮----
// Upgrade All deployed strategy contracts to new base strategy
⋮----
// Upgrade existing strategy
⋮----
// Key Registrar
⋮----
// EmissionsController
⋮----
function _initializeProxies() public noTracing {
⋮----
// Grant EmissionsController permission to mint bEIGEN tokens (only for local tests)
⋮----
// Disable transfer restrictions for EIGEN token
⋮----
/// @dev Deploy a strategy and its underlying token, push to global lists of tokens/strategies, and whitelist
/// strategy in strategyManager
function _newStrategyAndToken(string memory tokenName, string memory tokenSymbol, uint initialSupply, address owner, bool useFactory)
⋮----
// Whitelist strategy
⋮----
function _configRand(uint24 _randomSeed, uint _assetTypes, uint _userTypes) private noTracing {
// Using uint24 for the seed type so that if a test fails, it's easier
// to manually use the seed to replay the same test.
⋮----
// Convert flag bitmaps to bytes of set bits for easy use with _randUint
⋮----
function _configAssetTypes(uint _assetTypes) internal {
⋮----
function _configAssetAmounts(uint _maxUniqueAssetsHeld) internal {
⋮----
function _configUserTypes(uint _userTypes) internal {
⋮----
/// @dev Create a new User with a random config using the range defined in `_configRand`
⋮----
/// Assets are pulled from `strategies` based on a random staker/operator `assetType`
function _randUser(string memory name) internal noTracing returns (User, IStrategy[] memory, uint[] memory) {
// Deploy new User contract
⋮----
// For the specific asset selection we made, get a random assortment of strategies
// and deal the user some corresponding underlying token balances
⋮----
function _randUser(string memory name, IStrategy[] memory strategies) internal noTracing returns (User, uint[] memory) {
⋮----
// Deal the user some corresponding underlying token balances
⋮----
/// @dev Create a new user without native ETH. See _randUser above for standard usage
function _randUser_NoETH(string memory name) internal noTracing returns (User, IStrategy[] memory, uint[] memory) {
⋮----
// Pick the user's asset distribution, removing "native ETH" as an option
// I'm sorry if this eventually leads to a bug that's really hard to track down
⋮----
/// @dev Creates a new user without any assets
function _randUser_NoAssets(string memory name) internal noTracing returns (User) {
⋮----
function _genRandUser(string memory name, uint userType) internal returns (User user) {
// Create User contract based on userType:
⋮----
// User will use nonstandard methods like `depositIntoStrategyWithSignature`
⋮----
// Leaving this if statement for future upgraded users
⋮----
function _genRandAVS(string memory name) internal returns (AVS avs) {
⋮----
/// Given an assetType, select strategies the user will be dealt assets in
function _selectRandAssets(uint assetType) internal noTracing returns (IStrategy[] memory) {
⋮----
/// Select only ETH
⋮----
/// Select multiple LSTs, and maybe add ETH:
⋮----
// Select number of assets:
// HOLDS_LST can hold at most all LSTs. HOLDS_ALL and HOLDS_MAX also hold ETH.
// Clamp number of assets to maxUniqueAssetsHeld (guaranteed to be at least 1)
⋮----
// allStrats[0] is the beaconChainETHStrategy
⋮----
/// Given an input list of strategies, deal random underlying token amounts to a user
function _dealRandAmounts(User user, IStrategy[] memory strategies) internal noTracing returns (uint[] memory) {
⋮----
// Award the user with a random amount of ETH
// This guarantees a multiple of 32 ETH (at least 1, up to/incl 2080)
⋮----
/// Given an array of strategies and an array of amounts, deal the amounts to the user
function _dealAmounts(User user, IStrategy[] memory strategies, uint[] memory amounts) internal noTracing {
⋮----
/// @dev Uses `random` to return a random uint, with a range given by `min` and `max` (inclusive)
/// @return `min` <= result <= `max`
function _randUint(uint min, uint max) internal returns (uint) {
⋮----
// calculate the number of bits needed for the range
⋮----
// create a mask for the required number of bits
// and extract the value from the hash
⋮----
// in case value is out of range, wrap around or retry
⋮----
// Hash `random` with itself so the next value we generate is different
⋮----
function _randBool() internal returns (bool) {
⋮----
function _randAssetType() internal returns (uint) {
⋮----
function _randUserType() internal returns (uint) {
⋮----
function _randomStrategies() internal returns (IStrategy[][] memory strategies) {
⋮----
// Modify the length of the array in memory (thus ignoring remaining elements).
⋮----
/// @dev Converts a bitmap into an array of bytes
/// @dev Each byte in the input is processed as indicating a single bit to flip in the bitmap
function _bitmapToBytes(uint bitmap) internal pure returns (bytes memory bytesArray) {
⋮----
// Mask for i-th bit
⋮----
// If the i-th bit is flipped, add a byte to the return array
⋮----
function _hash(string memory x) internal pure returns (bytes32) {
⋮----
function _hash(uint x) internal pure returns (bytes32) {
````

## File: src/test/integration/MultichainIntegrationBase.t.sol
````
// SPDX-License-Identifier: BUSL-1.1
⋮----
import "src/test/integration/IntegrationBase.t.sol";
import "src/contracts/multichain/BN254CertificateVerifier.sol";
import "src/contracts/multichain/ECDSACertificateVerifier.sol";
import "src/contracts/multichain/OperatorTableUpdater.sol";
import "src/contracts/multichain/CrossChainRegistry.sol";
import "src/contracts/permissions/KeyRegistrar.sol";
import "src/test/mocks/OperatorTableCalculatorMock.sol";
import "src/contracts/libraries/BN254.sol";
import "src/contracts/libraries/Merkle.sol";
import "src/contracts/interfaces/IOperatorTableCalculator.sol";
import "src/contracts/interfaces/IBN254CertificateVerifier.sol";
import "src/contracts/interfaces/IECDSACertificateVerifier.sol";
import "src/contracts/interfaces/IKeyRegistrar.sol";
import "src/contracts/interfaces/ICrossChainRegistry.sol";
import "src/contracts/interfaces/IAllocationManager.sol";
import "src/contracts/interfaces/IOperatorTableUpdater.sol";
import "@openzeppelin/contracts/proxy/transparent/TransparentUpgradeableProxy.sol";
⋮----
/// @title MultichainIntegrationBase
/// @notice Base contract for multichain integration tests
/// @dev Provides deployment, setup, and utility methods for multichain contracts
abstract contract MultichainIntegrationBase is IntegrationBase {
⋮----
// Multichain contracts
⋮----
// Test constants
⋮----
uint constant CHAIN_ID_DESTINATION = 42_161; // Arbitrum
⋮----
uint32 constant DEFAULT_QUORUM_THRESHOLD = 6667; // 66.67%
⋮----
// Operator key generation helpers
⋮----
// ECDSA private keys for testing
⋮----
/// Deployment and Setup Methods
⋮----
/// @notice Deploy all multichain contracts
function _deployContracts() internal {
// The base contracts are already deployed by IntegrationDeployer
// We just need to deploy the multichain-specific contracts
⋮----
/// @notice Deploy multichain-specific contracts
function _deployMultichainContracts() internal {
// Deploy OperatorTableCalculatorMock
⋮----
// Deploy CrossChainRegistry with required dependencies
⋮----
// Initialize CrossChainRegistry
⋮----
address(this), // owner
1 hours, // initialTableUpdateCadence (1 hour = 3600 seconds)
0 // initialPausedStatus
⋮----
// Deploy OperatorTableUpdater (placeholder addresses for certificate verifiers initially)
⋮----
// Deploy BN254CertificateVerifier
⋮----
// Deploy ECDSACertificateVerifier
⋮----
// Now deploy new OperatorTableUpdater with correct certificate verifier addresses
⋮----
// Upgrade the proxy to use the new implementation with correct addresses
⋮----
// Create a real BN254OperatorSetInfo using a single operator
uint aggSignerPrivKey = 69; // Global root confirmer private key
⋮----
// Generate G1 public key using scalar multiplication
⋮----
// Create real operator info array
⋮----
// Operator info
⋮----
operatorWeights[0] = 10_000; // Weight
⋮----
// Create merkle tree of real operator infos
⋮----
// Calculate total weights
⋮----
// Compute the initial global table root containing the global root confirmer set
⋮----
// Create a simple merkle tree with just the global root confirmer set
⋮----
// Initialize OperatorTableUpdater with correct parameter order
⋮----
0, // initialPausedStatus
generator, // generator
6600, // globalRootConfirmationThreshold (66%)
initialOperatorSetInfo // generatorInfo
⋮----
function _setupMultichainContracts() internal {
⋮----
// Register this test contract as an AVS (needed for AllocationManager.createOperatorSets)
⋮----
/// User and Operator Helper Methods
⋮----
// Operator set IDs for different curve types (each operator set supports only one curve type)
⋮----
// Known valid private keys from unit tests (with corresponding G2 points)
⋮----
/// @dev Create a new operator with BN254 key registered
function _newOperatorWithBN254Key(string memory name) internal returns (User operator, BN254.G1Point memory pubkey) {
⋮----
// Use known valid BN254 private key
⋮----
// Register BN254 key
⋮----
/// @dev Create a new operator with ECDSA key registered
function _newOperatorWithECDSAKey(string memory name) internal returns (User operator, address pubkey) {
⋮----
// Generate unique ECDSA keypair
⋮----
// Register ECDSA key
⋮----
/// @dev Register a BN254 key for an operator using the real KeyRegistrar
function _registerBN254Key(User operator, BN254.G1Point memory pubkey, uint privateKey) internal {
// Create operator set for BN254 testing
⋮----
// Configure the operator set for BN254 curve type (only once)
⋮----
// Configuration successful
⋮----
// Already configured, which is fine
⋮----
// Get the corresponding G2 point for this private key
⋮----
// G2 point for private key 69
⋮----
// G2 point for private key 123
⋮----
// Encode the key data
⋮----
// Generate BN254 signature
⋮----
// Register the key directly with KeyRegistrar
⋮----
/// @dev Register an ECDSA key for an operator using the real KeyRegistrar
function _registerECDSAKey(User operator, address pubkey, uint privateKey) internal {
// Create operator set for ECDSA testing
⋮----
// Configure the operator set for ECDSA curve type (only once)
⋮----
// Generate ECDSA signature
⋮----
/// Table Generation and Transport Simulation
⋮----
/// @notice Generate BN254 operator table for testing
function _generateBN254OperatorTable(OperatorSet memory operatorSet, User[] memory operators)
⋮----
// Create operator infos array
⋮----
// Aggregate public key (sum of all operator public keys)
⋮----
// Total weights for each weight type
⋮----
// Get operator's registered BN254 key
⋮----
// Create mock weights for testing
⋮----
weights[0] = 1000 + i * 100; // First weight type
weights[1] = 2000 + i * 200; // Second weight type
⋮----
// Add to aggregate public key
⋮----
// Add to total weights
⋮----
// Create merkle tree of operator infos
⋮----
/// @notice Generate ECDSA operator table for testing
function _generateECDSAOperatorTable(OperatorSet memory operatorSet, User[] memory operators)
⋮----
// Get operator's registered ECDSA key
⋮----
/// @dev Simulate transport of operator table to destination chain
function _simulateTableTransport(uint sourceChainId, uint destinationChainId, uint generationId) internal {
⋮----
// In a real implementation, this would involve cross-chain messaging
// For testing, we just log the simulation
⋮----
/// Certificate Generation and Verification Helpers
⋮----
/// @notice Generate BN254 certificate for testing
function _generateBN254Certificate(
⋮----
// For testing, assume all operators are signers (no non-signers)
// This simplifies the certificate generation
⋮----
// Calculate aggregate signature
⋮----
// Use appropriate G2 public key based on the signing private key
⋮----
// Default to private key 69
⋮----
// Compute EIP-712 signable digest for BN254 certificate
⋮----
// Generate signatures for each operator over the digest
⋮----
// No non-signers in this test scenario
⋮----
/// @notice Generate ECDSA certificate for testing
function _generateECDSACertificate(
⋮----
// Use the contract's digest calculation (same as unit tests)
⋮----
// Collect signers and their private keys
⋮----
// Get signer addresses and create signatures (same pattern as unit tests)
⋮----
// Sort signers and signatures by address (ascending) - exact unit test pattern
⋮----
// Swap addresses
⋮----
// Swap signatures
⋮----
// Concatenate signatures in sorted order (same as unit tests)
⋮----
/// Cross-Chain Registry Helpers
⋮----
/// @dev Create a generation reservation using the real CrossChainRegistry
function _createGenerationReservation(uint chainId, uint generationId, User operator, uint32 operatorSetId) internal {
// Reference the operator set for the specific curve type
⋮----
// Check if operator set exists, if not create it
⋮----
strategies: new IStrategy[](0) // Empty strategies for now
⋮----
// Create chain IDs array
⋮----
// First, whitelist the chain ID (as owner)
⋮----
// Check if generation reservation already exists
⋮----
// Create operator set config
⋮----
maxStalenessPeriod: 86_400 // 1 day
⋮----
// Create generation reservation
⋮----
/// @dev Update operator table in the certificate verifier after transport
function _updateOperatorTableBN254(
⋮----
// Call the real updateOperatorTable function
// Note: We need to prank as the OperatorTableUpdater since only it can call this function
⋮----
function _updateOperatorTableECDSA(
⋮----
/// Utility Methods
⋮----
/// @dev Calculate hash of BN254 operator table
function _hashBN254Table(IOperatorTableCalculatorTypes.BN254OperatorSetInfo memory operatorSetInfo) internal pure returns (bytes32) {
⋮----
/// @dev Calculate hash of ECDSA operator table
function _hashECDSATable(IOperatorTableCalculatorTypes.ECDSAOperatorInfo[] memory operatorInfos) internal pure returns (bytes32) {
⋮----
/// @dev Create test message hash
function _createTestMessageHash(string memory message) internal pure returns (bytes32) {
⋮----
/// @dev Roll forward blocks to simulate time passage
function _rollForwardBlocks(uint blocks) internal {
⋮----
/// @dev Roll forward time to simulate time passage
function _rollForwardTime(uint seconds_) internal {
⋮----
/// HELPER FUNCTIONS FOR MULTICHAIN TESTS
⋮----
/// @dev Create and configure test operator set
function _createTestOperatorSet(uint32 operatorSetId) internal {
⋮----
/// @dev Setup AVS registration and chain whitelist
function _setupAVSAndChains() internal {
// Register as AVS
⋮----
// Whitelist chain IDs for cross-chain operations
⋮----
chainIDs[0] = 1; // Source chain
chainIDs[1] = 137; // Destination chain
⋮----
/// @dev Create generation reservation for operator set
function _createGenerationReservation(OperatorSet memory operatorSet) internal {
⋮----
/// @dev Register BN254 keys for operators in operator set
function _registerBN254Keys(OperatorSet memory operatorSet) internal returns (User[] memory operators) {
⋮----
/// @dev Register ECDSA keys for operators in operator set
function _registerECDSAKeys(OperatorSet memory operatorSet) internal returns (User[] memory operators) {
⋮----
/// @dev Register single BN254 key for operator
function _registerSingleBN254Key(User operator, OperatorSet memory operatorSet, uint privKey) internal {
// Generate G1 point and get corresponding G2 point
⋮----
// Encode key data for registration
⋮----
// Generate registration signature
⋮----
// Register key with KeyRegistrar
⋮----
/// @dev Register single ECDSA key for operator
function _registerSingleECDSAKey(User operator, OperatorSet memory operatorSet, uint privKey) internal {
// Generate ECDSA key pair
⋮----
/// @dev Update global table root and BN254 operator table
function _confirmGlobalTableRootAndUpdateBN254(
⋮----
// Create the operator table data for transport
⋮----
// Create global table root containing the operator table
⋮----
// Update the global table root with confirmation
⋮----
// Update the operator table using the confirmed global root
uint32 operatorSetIndex = 0; // Single leaf in merkle tree
bytes memory proof = new bytes(0); // Empty proof for single leaf
⋮----
/// @dev Update global table root and ECDSA operator table
function _confirmGlobalTableRootAndUpdateECDSA(
⋮----
/// @dev Updates the global table root with certificate verification
function _updateGlobalTableRoot(bytes32 globalTableRoot, uint32 confirmationTimestamp) internal {
⋮----
// Get the actual global root confirmer set from the OperatorTableUpdater
⋮----
// Get the global root confirmer set's reference timestamp (from initialization)
⋮----
// Use the proper message hash from the OperatorTableUpdater
⋮----
// Create certificate for global table root confirmation using the correct timestamp
⋮----
// Verify certificate to confirm global table root
⋮----
/// @dev Generate BN254 certificate for global root confirmation
function _generateGlobalRootConfirmationCertificate(
⋮----
uint aggSignerPrivKey = 69; // Private key for global root confirmer
⋮----
// Build message hash and signable digest; signature must be over the digest
⋮----
// Use the hardcoded G2 aggregate public key for private key 69
⋮----
/// PRIVATE KEY HELPERS
function _getBN254PrivateKeys() internal pure returns (uint[] memory) {
⋮----
keys[0] = 123; // Main test operator key
⋮----
function _getECDSAPrivateKeys() internal pure returns (uint[] memory) {
⋮----
function _getGlobalRootConfirmerPrivateKeys() internal pure returns (uint[] memory) {
⋮----
keys[0] = 69; // Global root confirmer key (avoids collision with main test)
⋮----
function _getBN254G2Point(uint privKey) internal pure returns (BN254.G2Point memory g2Point) {
⋮----
/// Initialization Override
function setUp() public virtual override {
⋮----
// Initialize userTypes and assetTypes arrays to avoid underflow in random functions
````

## File: src/test/integration/MultichainIntegrationChecks.t.sol
````
// SPDX-License-Identifier: BUSL-1.1
⋮----
import "src/test/integration/MultichainIntegrationBase.t.sol";
import "src/contracts/interfaces/IBN254CertificateVerifier.sol";
import "src/contracts/interfaces/IECDSACertificateVerifier.sol";
import "src/contracts/interfaces/ICrossChainRegistry.sol";
import "src/contracts/interfaces/IAllocationManager.sol";
import "src/contracts/interfaces/IKeyRegistrar.sol";
import "src/contracts/interfaces/IOperatorTableUpdater.sol";
import "src/contracts/libraries/BN254.sol";
import "src/contracts/libraries/Merkle.sol";
⋮----
/// @notice Contract that provides utility functions to reuse common test blocks & checks for multichain functionality
contract MultichainIntegrationCheckUtils is MultichainIntegrationBase {
⋮----
///
///                              CERTIFICATE VERIFICATION CHECKS
⋮----
function check_BN254Certificate_Basic_State(
⋮----
function check_BN254Certificate_ProportionalVerification_State(
⋮----
function check_BN254Certificate_NominalVerification_State(
⋮----
function check_ECDSACertificate_Basic_State(
⋮----
///                              GENERATION RESERVATION CHECKS
⋮----
function check_GenerationReservation_Exists_State(OperatorSet memory operatorSet) internal {
⋮----
function check_GenerationReservation_NotExists_State(OperatorSet memory operatorSet) internal {
⋮----
function check_OperatorTableBytes_Generation_State(OperatorSet memory operatorSet, bool shouldSucceed) internal {
⋮----
function check_OperatorSetConfig_Cleared_State(OperatorSet memory operatorSet) internal {
⋮----
///                              TIMESTAMP AND TIMING CHECKS
⋮----
function check_LatestReferenceTimestamp_Updated_State(uint32 expectedTimestamp) internal {
⋮----
function check_OperatorSetLatestTimestamp_State(OperatorSet memory operatorSet, uint32 expectedTimestamp) internal {
⋮----
function check_ECDSAOperatorSetLatestTimestamp_State(OperatorSet memory operatorSet, uint32 expectedTimestamp) internal {
⋮----
///                              GLOBAL TABLE ROOT CHECKS
⋮----
function check_GlobalTableRoot_PostSameTimestamp_Reverts(
⋮----
function check_GlobalTableRoot_PostSuccess_State(
⋮----
function check_TableTransport_StaleTimestamp_Reverts(uint32 staleTimestamp, bytes32 validGlobalTableRoot, bytes memory operatorTable)
⋮----
function check_TableTransport_StaleTimestamp_Reverts(
⋮----
///                              COMPLETE FLOW CHECKS
⋮----
function check_BN254MultichainFlow_Complete_State(
⋮----
// Verify certificate works
⋮----
// Verify timestamp is correctly set
⋮----
// Verify certificate works and return signed stakes
⋮----
function check_ECDSAMultichainFlow_Complete_State(
⋮----
// Verify certificate works and return signed stakes and signers
⋮----
///                              CERTIFICATE GENERATION HELPERS
⋮----
function check_CertificateGeneration_BN254_State(
⋮----
// Basic validation that certificate was generated correctly
⋮----
// BN254 signature is a G1Point, so check that it's not the zero point
⋮----
function check_CertificateGeneration_ECDSA_State(
⋮----
///                              GRANULAR VALIDATION HELPERS
⋮----
function check_SignedStakes_MinimumThresholds(uint[] memory signedStakes, uint[] memory minimumThresholds, string memory context)
⋮----
function check_SignedStakes_ExactValues(uint[] memory signedStakes, uint[] memory expectedValues, string memory context) internal pure {
⋮----
function check_SignedStakes_ProportionalToTotal(
⋮----
function check_Signers_ValidAddresses(address[] memory signers, string memory context) internal pure {
⋮----
function check_Signers_ExpectedAddresses(address[] memory signers, address[] memory expectedSigners, string memory context)
⋮----
function check_Signers_MinimumCount(address[] memory signers, uint minimumCount, string memory context) internal pure {
⋮----
///                              TRANSPORT AND UPDATE CHECKS
⋮----
function check_TableTransport_Success_State(OperatorSet memory operatorSet, uint32 referenceTimestamp, bytes32 expectedGlobalTableRoot)
⋮----
// Verify that the global table root was updated correctly
⋮----
// Verify that the latest reference timestamp was updated
⋮----
function check_OperatorSetRegistration_State(OperatorSet memory operatorSet, IKeyRegistrarTypes.CurveType expectedCurveType)
⋮----
///                              KEY REGISTRATION CHECKS
⋮----
function check_BN254KeyRegistration_State(User operator, OperatorSet memory operatorSet, BN254.G1Point memory expectedPubkey)
⋮----
function check_ECDSAKeyRegistration_State(User operator, OperatorSet memory operatorSet, address expectedPubkey) internal view {
⋮----
///                              STALENESS PERIOD CHECKS
⋮----
function check_BN254Certificate_PostStaleness_Reverts(
⋮----
function check_ECDSACertificate_PostStaleness_Reverts(
⋮----
function check_BN254Certificate_AtStalenessBoundary_Succeeds(
⋮----
// Should succeed at the exact boundary
⋮----
function check_ECDSACertificate_AtStalenessBoundary_Succeeds(
⋮----
function check_BN254StalenessPeriod_Updated_State(OperatorSet memory operatorSet, uint32 expectedStalenessPeriod) internal view {
⋮----
function check_ECDSAStalenessPeriod_Updated_State(OperatorSet memory operatorSet, uint32 expectedStalenessPeriod) internal view {
⋮----
function check_Certificate_WithinStalenessPeriod_Succeeds(
⋮----
function check_StalenessUpdate_CompleteFlow_State(
⋮----
// Verify that the new staleness period is different from the initial one
⋮----
///                              TIME MANIPULATION HELPERS
⋮----
function check_TimeAdvance_PostStaleness_State(uint32 referenceTimestamp, uint32 stalenessPeriod, uint expectedBlockTimestamp)
⋮----
function check_TimeAdvance_AtBoundary_State(uint32 referenceTimestamp, uint32 stalenessPeriod) internal view {
⋮----
///                              COMBINED VALIDATION HELPERS
⋮----
function check_StalenessScenario_Complete_State(
⋮----
// Check timing
⋮----
// Check staleness period configuration
````

## File: src/test/integration/README.md
````markdown
## EigenLayer Core Integration Testing

### What the Hell?

Good question.

This folder contains the integration framework and tests for Eigenlayer core, which orchestrates the deployment of all EigenLayer core contracts to fuzz high-level user flows across multiple user and asset types, and supports time-travelling state lookups to quickly compare past and present states (please try to avoid preventing your own birth).

**If you want to know how to run the tests**:

* Local: `forge t --mc Integration`
* Mainnet fork tests: `env FOUNDRY_PROFILE=forktest forge t --mc Integration`

Note that for mainnet fork tests, you'll need to set the `RPC_MAINNET` environment variable to your RPC provider of choice!

**If you want to know where the tests are**, take a look at `/tests`. We're doing one test contract per top-level flow, and defining multiple test functions for variants on that flow. 

e.g. if you're testing the flow "deposit into strategies -> delegate to operator -> queue withdrawal -> complete withdrawal", that's it's own test contract. For variants where withdrawals are completed "as tokens" vs "as shares," those are their own functions inside that contract.

Looking at the current tests is a good place to start.

**If you want to know how we're fuzzing these flows**, take a look at how we're using the `_configRand` method at the start of each test, which accepts bitmaps for the types of users and assets you want to spawn during the test.

During the test, the config passed into `_configRand` will randomly generate only the values you configure:
* `assetTypes` affect the assets granted to Users when they are first created. You can use this to ensure your flows and assertions work when users are holding only LSTs, native ETH, or some combination.
* `userTypes` affect the actual `User` contract being deployed. The `DEFAULT` flag deploys the base `User` contract, while `ALT_METHODS` deploys a version that derives from the same contract, but overrides some methods to use "functionWithSignature" and other variants.

Here's an example:

```solidity
function testFuzz_deposit_delegate_EXAMPLE(uint24 _random) public {   
    // When new Users are created, they will choose a random configuration from these params.
    // `_randomSeed` will be the starting seed for all random lookups.
    _configRand({
        _randomSeed: _random,
        _assetTypes: HOLDS_LST,
        _userTypes: DEFAULT | ALT_METHODS
    });

    // Because of the `assetTypes` flags above, this will create two Users for our test,
    // each of which holds some random assortment of LSTs.
    (
        User staker,
        IStrategy[] memory strategies, 
        uint[] memory tokenBalances
    ) = _newRandomStaker();
    (User operator, ,) = _newRandomOperator();

    // Because of the `userTypes` flags above, this user might be using either:
    // - `strategyManager.depositIntoStrategy`
    // - `strategyManager.depositIntoStrategyWithSignature`
    staker.depositIntoEigenlayer(strategies, tokenBalances);
    // assertions go here
}
```

### `print` Library Overview

The `print` library provides utilities for structured and stylized logging to streamline debugging in EigenLayer contracts. It includes helpers for common tasks such as logging user actions, integration test details. The library works in conjunction with the `Logger` abstract contract, which must be inherited by contracts that use `print`.

NOTE: `print` is intended to be used in conjunction with `console.log`.

```solidity
import "src/test/utils/Logger.t.sol";

// The `User` contract inherits `Logger` to enable `print` functionalities.
contract User is Logger {
    string public _name;

    constructor(string memory name) {
        _name = name;
    }

    function NAME() public override view returns (string memory) {
        return _name;
    }

    function vote(User who, uint256 votes) public {
        print.method(
            "vote", 
            string.concat(
                "{who: ", who.NAME_COLORED(), 
                ", votes: ", votes.asWad(), 
            "}"
            )
        );
    }
}

User alice = User("Alice");
User bob = User("Bob");

// Will emit a log equal to: `console.log("Alice.vote({who: Bob, votes: 1.0 (wad)})");`
alice.vote(bob, 1 ether);
```

**If you want to know about the time travel**, there's a few things to note:

The main feature we're using is foundry's `cheats.snapshotState()` and `cheats.revertToState(snapshot)` to zip around in time. You can look at the [Cheatcodes Reference](https://book.getfoundry.sh/cheatcodes/#cheatcodes-interface) to get some idea, but the docs aren't actually correct. The best thing to do is look through our tests and see how it's being used. If you see an assertion called `assert_Snap_...`, that's using the `TimeMachine` under the hood. 

Speaking of, the `TimeMachine` is a global contract that controls the time, fate, and destiny of all who use it.
* `Users` use the `TimeMachine` to snapshot chain state *before* every action they perform. (see the [`User.createSnapshot`](https://github.com/layr-labs/eigenlayer-contracts/blob/c5193f7bff00903a4323be2a1500cbf7137a83e9/src/test/integration/User.t.sol#L43-L46) modifier).
* `IntegrationBase` uses a `timewarp` modifier to quickly fetch state "from before the last user action". These are leveraged within various `assert_Snap_XYZ` methods to allow the test to quickly compare previous and current values. ([example assertion method](https://github.com/layr-labs/eigenlayer-contracts/blob/c99e847709852d7246c73b7d72d44bba368b760e/src/test/integration/IntegrationBase.t.sol#L146-L148))

This means that tests can perform user actions with very little setup or "reading prior state", and perform all the important assertions after each action. For example:

```solidity
function testFuzz_deposit_delegate_EXAMPLE(uint24 _random) public {   
    // ... test setup goes above here
    
    // This snapshots state before the deposit.
    staker.depositIntoEigenlayer(strategies, tokenBalances);
    // This checks the staker's shares from before `depositIntoEigenlayer`, and compares
    // them to their shares after `depositIntoEigenlayer`.
    assert_Snap_AddedStakerShares(staker, strategies, expectedShares, "failed to award staker shares");

    // This snapshots state before delegating.
    staker.delegateTo(operator);
    // This checks the operator's `operatorShares` before the staker delegated to them, and
    // compares those shares to the `operatorShares` after the staker delegated.
    assert_Snap_AddedOperatorShares(operator, strategies, expectedShares, "failed to award operator shares");
}
```

### Additional Important Concepts

* Most testing logic and checks are performed at the test level. `IntegrationBase` has primarily helpers and a few sanity checks, but the current structure exists to make it clear what's being tested by reading the test itself.
* Minimal logic/assertions/cheats used in User contract. These are for carrying out user behaviors, only. Exception:
    * User methods snapshot state before performing actions
* Top-level error messages are passed into helper assert methods so that it's always clear where an error came from
* User contract should have an interface as similar as possible to the contract interfaces, so it feels like calling an EigenLayer method rather than some weird abstraction. Exceptions for things like:
    * `user.depositIntoEigenLayer(strats, tokenBalances)` - because this deposits all strategies/shares and may touch either Smgr or Emgr

### What needs to be done?

* Suggest or PR cleanup if you have ideas. Currently, the `IntegrationDeployer` contract is pretty messy.
* Coordinate in Slack to pick out some user flows to write tests for!

#### Reduce RPC spam for fork tests

Currently our mainnet fork tests spam whatever RPC we use. We can improve this in the future - apparently the meta is:

> Use an anvil node to fork the network, you can write a script to make some changes to the forked network for setup etc, then fork your local node in your test.
> Effectively you just setup an anvil node with the command
`anvil -f RPC_URL `
You can use `anvil -h` for more info on what it can do.

> Then in your test you use the vm.createSelectFork command in your setup with the argument to point to your local anvil node which is basically a copy of the rpc you set it up as. 
>  If you want to do some setup before running your tests you can write a script file and broadcast the setup transactions to your local anvil node (make sure to use one of the private keys anvil gives you)
````

## File: src/test/integration/TimeMachine.t.sol
````
// SPDX-License-Identifier: BUSL-1.1
⋮----
import "forge-std/Test.sol";
import "src/test/utils/Logger.t.sol";
⋮----
contract TimeMachine is Test, Logger {
⋮----
function NAME() public view virtual override returns (string memory) {
⋮----
/// -----------------------------------------------------------------------
/// Setters
⋮----
function createSnapshot() public returns (uint snapshot) {
⋮----
function travelToLast() public returns (uint currentSnapshot) {
// Safety check to make sure createSnapshot is called before attempting
// to warp so we don't accidentally prevent our own births.
⋮----
// print.method("travelToLast", cheats.toString(last));
⋮----
function travel(uint snapshot) public {
// print.method("travel", cheats.toString(snapshot));
⋮----
/// Getters
⋮----
function lastSnapshot() public view returns (uint) {
⋮----
function pastExists() public view returns (bool) {
````

## File: src/test/integration/TypeImporter.t.sol
````
// SPDX-License-Identifier: BUSL-1.1
⋮----
import "src/contracts/interfaces/IAllocationManager.sol";
import "src/contracts/interfaces/IAVSDirectory.sol";
import "src/contracts/interfaces/IDelegationManager.sol";
import "src/contracts/interfaces/IEigenPod.sol";
import "src/contracts/interfaces/IEigenPodManager.sol";
import "src/contracts/interfaces/IStrategyManager.sol";
⋮----
/// @dev A master interface contract that imports types defined in our
/// contract interfaces so they can be used without needing to refer to
/// the interface, e.g:
///
/// `AllocateParams memory params;`
/// vs
/// `IAllocationManagerTypes.AllocateParams memory params;`
interface TypeImporter is IAllocationManagerTypes, IAVSDirectoryTypes, IDelegationManagerTypes, IEigenPodManagerTypes, IEigenPodTypes {}
````

## File: src/test/integration/UpgradeTest.t.sol
````
// SPDX-License-Identifier: BUSL-1.1
⋮----
import "src/test/integration/IntegrationDeployer.t.sol";
import "src/test/integration/IntegrationChecks.t.sol";
⋮----
abstract contract UpgradeTest is IntegrationCheckUtils {
/// Only run upgrade tests on mainnet forks
function setUp() public virtual override {
⋮----
/// Deploy current implementation contracts and upgrade existing proxies
function _upgradeEigenLayerContracts() public virtual {
````

## File: src/test/mocks/AllocationManagerMock.sol
````
// SPDX-License-Identifier: BUSL-1.1
⋮----
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";
⋮----
contract AllocationManagerMock is Test {
⋮----
function setRevertModifyAllocations(bool shouldRevert) external {
⋮----
function setRevertDeregisterFromOperatorSets(bool shouldRevert) external {
⋮----
function getSlashCount(OperatorSet memory operatorSet) external view returns (uint) {
⋮----
function setSlashCount(OperatorSet memory operatorSet, uint slashCount) external {
⋮----
function getRedistributionRecipient(OperatorSet memory operatorSet) external view returns (address recipient) {
⋮----
function setRedistributionRecipient(OperatorSet memory operatorSet, address recipient) external {
⋮----
function isRedistributingOperatorSet(OperatorSet memory operatorSet) external view returns (bool) {
⋮----
function setIsOperatorSet(OperatorSet memory operatorSet, bool boolean) external {
⋮----
function isOperatorSet(OperatorSet memory operatorSet) external view returns (bool) {
⋮----
function isMemberOfOperatorSet(address operator, OperatorSet memory operatorSet) external view returns (bool) {
⋮----
function setMaxMagnitudes(address operator, IStrategy[] calldata strategies, uint64[] calldata maxMagnitudes) external {
⋮----
function setMaxMagnitude(address operator, IStrategy strategy, uint64 maxMagnitude) public {
⋮----
function getMaxMagnitude(address operator, IStrategy strategy) external view returns (uint64) {
⋮----
function getMaxMagnitudes(address operator, IStrategy[] calldata strategies) external view returns (uint64[] memory) {
⋮----
function getMaxMagnitudesAtBlock(address operator, IStrategy[] calldata strategies, uint32 blockNumber)
⋮----
function setAVSSetCount(address avs, uint numSets) external {
⋮----
function setAVSRegistrar(address avs, address avsRegistrar) external {
⋮----
function getAVSRegistrar(address avs) external view returns (address) {
⋮----
function getMembers(OperatorSet memory operatorSet) external view returns (address[] memory) {
⋮----
function setMembersInOperatorSet(OperatorSet memory operatorSet, address[] memory members) external {
⋮----
function setStrategiesInOperatorSet(OperatorSet memory operatorSet, IStrategy[] memory strategies) external {
⋮----
function getStrategiesInOperatorSet(OperatorSet memory operatorSet) external view returns (IStrategy[] memory) {
⋮----
function setMinimumSlashableStake(
⋮----
function getMinimumSlashableStake(
⋮----
IStrategy[] memory strategies /*uint32 futureBlock*/
⋮----
function isOperatorSlashable(address operator, OperatorSet memory operatorSet) external view returns (bool) {
⋮----
function setIsOperatorSlashable(address operator, OperatorSet memory operatorSet, bool isSlashable) external {
⋮----
function registerForOperatorSets(address operator, IAllocationManager.RegisterParams calldata params) external {
⋮----
function lastRegisterForOperatorSetsCall() external view returns (RegisterCall memory) {
⋮----
function modifyAllocations(address operator, IAllocationManager.AllocateParams[] calldata params) external {
⋮----
// Persist allocations so `getAllocation` can return meaningful values.
⋮----
function lastModifyAllocationsCall() external view returns (AllocateCall memory) {
⋮----
function deregisterFromOperatorSets(IAllocationManager.DeregisterParams calldata params) external {
⋮----
function lastDeregisterFromOperatorSetsCall() external view returns (DeregisterCall memory) {
⋮----
function getAllocation(address operator, OperatorSet memory operatorSet, IStrategy strategy)
````

## File: src/test/mocks/AVSDirectoryMock.sol
````
// SPDX-License-Identifier: BUSL-1.1
⋮----
import "forge-std/Test.sol";
import "src/contracts/interfaces/IAVSDirectory.sol";
import "src/contracts/libraries/OperatorSetLib.sol";
⋮----
contract AVSDirectoryMock is Test {
````

## File: src/test/mocks/AVSTaskHookReentrantAttacker.sol
````
// SPDX-License-Identifier: BUSL-1.1
⋮----
import {IBN254CertificateVerifierTypes} from "src/contracts/interfaces/IBN254CertificateVerifier.sol";
import {OperatorSet} from "src/contracts/libraries/OperatorSetLib.sol";
import {BN254} from "src/contracts/libraries/BN254.sol";
⋮----
import {TaskMailbox} from "src/contracts/avs/task/TaskMailbox.sol";
import {ITaskMailboxTypes} from "src/contracts/interfaces/ITaskMailbox.sol";
import {IAVSTaskHook} from "src/contracts/interfaces/IAVSTaskHook.sol";
⋮----
/// @title AVSTaskHookReentrantAttacker
/// @notice Mock contract for testing reentrancy protection in AVSTaskHook
contract AVSTaskHookReentrantAttacker is IAVSTaskHook, ITaskMailboxTypes {
⋮----
// Store attack parameters individually to avoid memory/storage issues
⋮----
function setAttackParams(
⋮----
IBN254CertificateVerifierTypes.BN254Certificate memory, // unused but kept for interface compatibility
⋮----
// Store TaskParams fields individually
⋮----
function validatePreTaskCreation(address, TaskParams memory) external view {}
⋮----
function handlePostTaskCreation(bytes32) external override {
⋮----
// Reconstruct TaskParams for the attack
⋮----
// Try to reenter createTask
⋮----
// Reconstruct certificate for the attack
⋮----
// Try to reenter submitResult
⋮----
function validatePreTaskResultSubmission(address, bytes32, bytes memory, bytes memory) external view {}
⋮----
function handlePostTaskResultSubmission(address, bytes32) external {
⋮----
function calculateTaskFee(ITaskMailboxTypes.TaskParams memory) external pure returns (uint96) {
````

## File: src/test/mocks/BackingEigenMock.sol
````
// SPDX-License-Identifier: BUSL-1.1
⋮----
import "forge-std/Test.sol";
import "@openzeppelin/contracts/token/ERC20/ERC20.sol";
⋮----
contract BackingEigenMock is Test, ERC20 {
⋮----
function mint(address to, uint amount) external {
````

## File: src/test/mocks/BN254CertificateVerifierMock.sol
````
// SPDX-License-Identifier: BUSL-1.1
⋮----
import "forge-std/Test.sol";
import "src/contracts/interfaces/ICrossChainRegistry.sol";
import "src/contracts/libraries/OperatorSetLib.sol";
import "src/contracts/interfaces/IBN254CertificateVerifier.sol";
import "src/contracts/interfaces/IOperatorTableUpdater.sol";
import "src/contracts/interfaces/IBaseCertificateVerifier.sol";
⋮----
contract BN254CertificateVerifierMock is Test, IBN254CertificateVerifierTypes, ICrossChainRegistryTypes, IBaseCertificateVerifierErrors {
⋮----
// Mock operator table updater for testing
⋮----
function setOperatorTableUpdater(IOperatorTableUpdater _operatorTableUpdater) public {
⋮----
function setIsValidCertificate(BN254Certificate memory certificate, bool isValid) public {
⋮----
function updateOperatorTable(
⋮----
function verifyCertificateProportion(
⋮----
// Always validate certificate timestamp like the real contract does
⋮----
function setLatestReferenceTimestamp(OperatorSet memory operatorSet, uint32 referenceTimestamp) public {
⋮----
function latestReferenceTimestamp(OperatorSet memory operatorSet) external view returns (uint32) {
⋮----
function setIsReferenceTimestampSet(OperatorSet memory operatorSet, uint32 referenceTimestamp, bool isSet) public {
⋮----
function isReferenceTimestampSet(OperatorSet memory operatorSet, uint32 referenceTimestamp) external view returns (bool) {
⋮----
/// @notice Validates certificate timestamp against staleness requirements
/// @param operatorSetKey The operator set key
/// @param referenceTimestamp The reference timestamp to validate
function _validateCertificateTimestamp(bytes32 operatorSetKey, uint32 referenceTimestamp) internal view {
⋮----
// Assert that the root that corresponds to the reference timestamp is not disabled
⋮----
/// @notice Public function to validate certificate timestamp (for testing)
/// @param operatorSet The operator set
⋮----
function validateCertificateTimestamp(OperatorSet memory operatorSet, uint32 referenceTimestamp) external view {
⋮----
function getLatestReferenceTimestamp(OperatorSet memory operatorSet) external view returns (uint32) {
⋮----
function getOperatorSetOwner(OperatorSet memory operatorSet) external view returns (address) {
⋮----
function getMaxStalenessPeriod(OperatorSet memory operatorSet) external view returns (uint32) {
⋮----
function getOperatorSetInfos(OperatorSet memory operatorSet, uint32 referenceTimestamp)
````

## File: src/test/mocks/CrossChainRegistryMock.sol
````
// SPDX-License-Identifier: BUSL-1.1
⋮----
import "forge-std/Test.sol";
⋮----
import "src/contracts/multichain/CrossChainRegistry.sol";
⋮----
contract CrossChainRegistryMock is Test, ICrossChainRegistryTypes {
````

## File: src/test/mocks/DelegationManagerMock.sol
````
// SPDX-License-Identifier: BUSL-1.1
⋮----
import "forge-std/Test.sol";
⋮----
import "src/contracts/interfaces/IDelegationManager.sol";
import "src/contracts/interfaces/IStrategyManager.sol";
import "src/contracts/libraries/SlashingLib.sol";
⋮----
contract DelegationManagerMock is Test {
⋮----
function getDelegatableShares(address staker) external view returns (IStrategy[] memory, uint[] memory) {}
⋮----
function setMinWithdrawalDelayBlocks(uint32 newMinWithdrawalDelayBlocks) external {
⋮----
function minWithdrawalDelayBlocks() external view returns (uint32) {
⋮----
function setStrategyWithdrawalDelayBlocks(IStrategy[] calldata strategies, uint[] calldata withdrawalDelayBlocks) external {}
⋮----
function setIsOperator(address operator, bool _isOperatorReturnValue) external {
⋮----
function slashOperatorShares(
⋮----
/// operatorSet
uint, /*slashId*/
⋮----
/// @notice returns the total number of shares in `strategy` that are delegated to `operator`.
function setOperatorShares(address operator, IStrategy strategy, uint shares) external {
⋮----
function setOperatorsShares(address operator, IStrategy[] memory strategies, uint shares) external {
⋮----
function delegateTo(
⋮----
ISignatureUtilsMixinTypes.SignatureWithExpiry memory, /*approverSignatureAndExpiry*/
bytes32 /*approverSalt*/
⋮----
function registerAsOperator(address delegationApprover, uint32 allocationDelay, string calldata metadataURI) external {
⋮----
function modifyOperatorDetails(address operator, address newDelegationApprover) external {
⋮----
function updateOperatorMetadataURI(address operator, string calldata metadataURI) external {
⋮----
function lastRegisterAsOperatorCall() external view returns (RegisterAsOperatorCall memory) {
⋮----
function lastModifyOperatorDetailsCall() external view returns (ModifyOperatorDetailsCall memory) {
⋮----
function lastUpdateOperatorMetadataURICall() external view returns (UpdateOperatorMetadataURICall memory) {
⋮----
function undelegate(address staker) external returns (bytes32[] memory withdrawalRoot) {
⋮----
function getOperatorShares(address operator, IStrategy[] memory strategies) external view returns (uint[] memory) {
⋮----
function getOperatorsShares(address[] memory operators, IStrategy[] memory strategies) external view returns (uint[][] memory) {
⋮----
function operatorDetails(address operator) external pure returns (IDelegationManagerTypes.OperatorDetails memory) {
⋮----
function isDelegated(address staker) external view returns (bool) {
⋮----
// onlyDelegationManager functions in StrategyManager
function addShares(IStrategyManager strategyManager, address staker, IStrategy strategy, uint shares) external {
⋮----
function removeDepositShares(IStrategyManager strategyManager, address staker, IStrategy strategy, uint shares) external {
⋮----
function withdrawSharesAsTokens(IStrategyManager strategyManager, address recipient, IStrategy strategy, uint shares, IERC20 token)
````

## File: src/test/mocks/Dummy.sol
````
// SPDX-License-Identifier: BUSL-1.1
⋮----
contract EmptyContract {
function foo() public pure returns (uint) {
````

## File: src/test/mocks/ECDSACertificateVerifierMock.sol
````
// SPDX-License-Identifier: BUSL-1.1
⋮----
import "forge-std/Test.sol";
import "src/contracts/libraries/OperatorSetLib.sol";
import "src/contracts/interfaces/IECDSACertificateVerifier.sol";
⋮----
contract ECDSACertificateVerifierMock is Test, IECDSACertificateVerifierTypes {
⋮----
function setIsValidCertificate(ECDSACertificate memory certificate, bool isValid) public {
⋮----
function setLatestReferenceTimestamp(OperatorSet memory operatorSet, uint32 referenceTimestamp) public {
⋮----
function latestReferenceTimestamp(OperatorSet memory operatorSet) external view returns (uint32) {
⋮----
function setIsReferenceTimestampSet(OperatorSet memory operatorSet, uint32 referenceTimestamp, bool isSet) public {
⋮----
function isReferenceTimestampSet(OperatorSet memory operatorSet, uint32 referenceTimestamp) external view returns (bool) {
````

## File: src/test/mocks/EigenMock.sol
````
// SPDX-License-Identifier: BUSL-1.1
⋮----
import "forge-std/Test.sol";
import "@openzeppelin/contracts/token/ERC20/ERC20.sol";
import "./BackingEigenMock.sol";
⋮----
contract EigenMock is Test, ERC20 {
⋮----
function wrap(uint amount) external {
````

## File: src/test/mocks/EigenPodManagerMock.sol
````
// SPDX-License-Identifier: BUSL-1.1
⋮----
import "forge-std/Test.sol";
import "../../contracts/interfaces/IStrategy.sol";
import "../../contracts/permissions/Pausable.sol";
⋮----
contract EigenPodManagerMock is Test, Pausable {
⋮----
function podOwnerShares(address podOwner) external view returns (int) {
⋮----
function stakerDepositShares(address user, address) public view returns (uint depositShares) {
⋮----
function setPodOwnerShares(address podOwner, int shares) external {
⋮----
function addShares(address podOwner, IStrategy, uint shares) external returns (uint, uint) {
⋮----
function removeDepositShares(
⋮----
IStrategy, // strategy
⋮----
function denebForkTimestamp() external pure returns (uint64) {
⋮----
function withdrawSharesAsTokens(
⋮----
/// strategy
⋮----
/// token
⋮----
function setBeaconChainSlashingFactor(address staker, uint64 bcsf) external {
⋮----
function beaconChainSlashingFactor(address staker) external view returns (uint64) {
⋮----
function setPectraForkTimestamp(uint64 _pectraForkTimestamp) external {
````

## File: src/test/mocks/EigenPodMock.sol
````
// SPDX-License-Identifier: BUSL-1.1
⋮----
import "forge-std/Test.sol";
import "../../contracts/interfaces/IEigenPod.sol";
import "../../contracts/mixins/SemVerMixin.sol";
⋮----
contract EigenPodMock is IEigenPod, SemVerMixin, Test {
⋮----
/// @notice the amount of execution layer ETH in this contract that is staked in EigenLayer (i.e. withdrawn from beaconchain but not EigenLayer),
function withdrawableRestakedExecutionLayerGwei() external view returns (uint64) {}
⋮----
/// @notice Used to initialize the pointers to contracts crucial to the pod's functionality, in beacon proxy construction from EigenPodManager
function initialize(address owner) external {}
⋮----
/// @notice Called by EigenPodManager when the owner wants to create another ETH validator.
function stake(bytes calldata pubkey, bytes calldata signature, bytes32 depositDataRoot) external payable {}
⋮----
/// @notice Transfers `amountWei` in ether from this contract to the specified `recipient` address
/// @notice Called by EigenPodManager to withdrawBeaconChainETH that has been added to the EigenPod's balance due to a withdrawal from the beacon chain.
/// @dev Called during withdrawal or slashing.
/// @dev Note that this function is marked as non-reentrant to prevent the recipient calling back into it
function withdrawRestakedBeaconChainETH(address recipient, uint amount) external {}
⋮----
/// @notice The single EigenPodManager for EigenLayer
function eigenPodManager() external view returns (IEigenPodManager) {}
⋮----
/// @notice The owner of this EigenPod
function podOwner() external view returns (address) {}
⋮----
/// @notice Returns the validatorInfo struct for the provided pubkeyHash
function validatorPubkeyHashToInfo(bytes32 validatorPubkeyHash) external view returns (ValidatorInfo memory) {}
⋮----
/// @notice This returns the status of a given validator
function validatorStatus(bytes32 pubkeyHash) external view returns (VALIDATOR_STATUS) {}
⋮----
/// @notice Number of validators with proven withdrawal credentials, who do not have proven full withdrawals
function activeValidatorCount() external view returns (uint) {}
⋮----
/// @notice The timestamp of the last checkpoint finalized
function lastCheckpointTimestamp() external view returns (uint64) {}
⋮----
/// @notice The timestamp of the currently-active checkpoint. Will be 0 if there is not active checkpoint
function currentCheckpointTimestamp() external view returns (uint64) {}
⋮----
/// @notice Returns the currently-active checkpoint
function currentCheckpoint() external view returns (Checkpoint memory) {}
⋮----
function checkpointBalanceExitedGwei(uint64) external view returns (uint64) {}
⋮----
function startCheckpoint(bool revertIfNoBalance) external {}
⋮----
function verifyCheckpointProofs(
⋮----
function verifyStaleBalance(
⋮----
function verifyWithdrawalCredentials(
⋮----
function requestConsolidation(ConsolidationRequest[] calldata) external payable {}
function requestWithdrawal(WithdrawalRequest[] calldata) external payable {}
⋮----
/// @notice called by owner of a pod to remove any ERC20s deposited in the pod
function recoverTokens(IERC20[] memory tokenList, uint[] memory amountsToWithdraw, address recipient) external {}
⋮----
function setProofSubmitter(address newProofSubmitter) external {}
⋮----
function proofSubmitter() external view returns (address) {}
⋮----
function validatorStatus(bytes calldata pubkey) external view returns (VALIDATOR_STATUS) {}
function validatorPubkeyToInfo(bytes calldata validatorPubkey) external view returns (ValidatorInfo memory) {}
⋮----
/// @notice Query the 4788 oracle to get the parent block root of the slot with the given `timestamp`
/// @param timestamp of the block for which the parent block root will be returned. MUST correspond
/// to an existing slot within the last 24 hours. If the slot at `timestamp` was skipped, this method
/// will revert.
function getParentBlockRoot(uint64 timestamp) external view returns (bytes32) {}
⋮----
function getPectraForkTimestamp() external view returns (uint64) {}
⋮----
function getConsolidationRequestFee() external view returns (uint) {}
function getWithdrawalRequestFee() external view returns (uint) {}
````

## File: src/test/mocks/EmptyContract.sol
````
// SPDX-License-Identifier: BUSL-1.1
⋮----
contract EmptyContract {
function foo() public pure returns (uint) {
````

## File: src/test/mocks/ERC20_OneWeiFeeOnTransfer.sol
````
// SPDX-License-Identifier: MIT
⋮----
// copy-pasted OZ code with _balances mapping made *internal* instead of private
⋮----
// OpenZeppelin Contracts v4.4.1 (utils/Context.sol)
⋮----
// pragma solidity ^0.8.0;
⋮----
/// @dev Provides information about the current execution context, including the
/// sender of the transaction and its data. While these are generally available
/// via msg.sender and msg.data, they should not be accessed in such a direct
/// manner, since when dealing with meta-transactions the account sending and
/// paying for execution may not be the actual sender (as far as an application
/// is concerned).
///
/// This contract is only required for intermediate, library-like contracts.
abstract contract OpenZeppelin_Context {
function _msgSender() internal view virtual returns (address) {
⋮----
function _msgData() internal view virtual returns (bytes calldata) {
⋮----
// OpenZeppelin Contracts (last updated v4.6.0) (token/ERC20/IERC20.sol)
⋮----
/// @dev Interface of the ERC20 standard as defined in the EIP.
interface OpenZeppelin_IERC20 {
/// @dev Emitted when `value` tokens are moved from one account (`from`) to
/// another (`to`).
⋮----
/// Note that `value` may be zero.
event Transfer(address indexed from, address indexed to, uint value);
⋮----
/// @dev Emitted when the allowance of a `spender` for an `owner` is set by
/// a call to {approve}. `value` is the new allowance.
event Approval(address indexed owner, address indexed spender, uint value);
⋮----
/// @dev Returns the amount of tokens in existence.
function totalSupply() external view returns (uint);
⋮----
/// @dev Returns the amount of tokens owned by `account`.
function balanceOf(address account) external view returns (uint);
⋮----
/// @dev Moves `amount` tokens from the caller's account to `to`.
⋮----
/// Returns a boolean value indicating whether the operation succeeded.
⋮----
/// Emits a {Transfer} event.
function transfer(address to, uint amount) external returns (bool);
⋮----
/// @dev Returns the remaining number of tokens that `spender` will be
/// allowed to spend on behalf of `owner` through {transferFrom}. This is
/// zero by default.
⋮----
/// This value changes when {approve} or {transferFrom} are called.
function allowance(address owner, address spender) external view returns (uint);
⋮----
/// @dev Sets `amount` as the allowance of `spender` over the caller's tokens.
⋮----
/// IMPORTANT: Beware that changing an allowance with this method brings the risk
/// that someone may use both the old and the new allowance by unfortunate
/// transaction ordering. One possible solution to mitigate this race
/// condition is to first reduce the spender's allowance to 0 and set the
/// desired value afterwards:
/// https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729
⋮----
/// Emits an {Approval} event.
function approve(address spender, uint amount) external returns (bool);
⋮----
/// @dev Moves `amount` tokens from `from` to `to` using the
/// allowance mechanism. `amount` is then deducted from the caller's
/// allowance.
⋮----
function transferFrom(address from, address to, uint amount) external returns (bool);
⋮----
// OpenZeppelin Contracts v4.4.1 (token/ERC20/extensions/IERC20Metadata.sol)
⋮----
// import "../IERC20.sol";
⋮----
/// @dev Interface for the optional metadata functions from the ERC20 standard.
⋮----
/// _Available since v4.1._
interface OpenZeppelin_IERC20Metadata is OpenZeppelin_IERC20 {
/// @dev Returns the name of the token.
function name() external view returns (string memory);
⋮----
/// @dev Returns the symbol of the token.
function symbol() external view returns (string memory);
⋮----
/// @dev Returns the decimals places of the token.
function decimals() external view returns (uint8);
⋮----
// OpenZeppelin Contracts (last updated v4.8.0) (token/ERC20/ERC20.sol)
⋮----
// import "./IERC20.sol";
// import "./extensions/IERC20Metadata.sol";
// import "../../utils/Context.sol";
⋮----
/// @dev Implementation of the {IERC20} interface.
⋮----
/// This implementation is agnostic to the way tokens are created. This means
/// that a supply mechanism has to be added in a derived contract using {_mint}.
/// For a generic mechanism see {ERC20PresetMinterPauser}.
⋮----
/// TIP: For a detailed writeup see our guide
/// https://forum.openzeppelin.com/t/how-to-implement-erc20-supply-mechanisms/226[How
/// to implement supply mechanisms].
⋮----
/// The default value of {decimals} is 18. To change this, you should override
/// this function so it returns a different value.
⋮----
/// We have followed general OpenZeppelin Contracts guidelines: functions revert
/// instead returning `false` on failure. This behavior is nonetheless
/// conventional and does not conflict with the expectations of ERC20
/// applications.
⋮----
/// Additionally, an {Approval} event is emitted on calls to {transferFrom}.
/// This allows applications to reconstruct the allowance for all accounts just
/// by listening to said events. Other implementations of the EIP may not emit
/// these events, as it isn't required by the specification.
⋮----
/// Finally, the non-standard {decreaseAllowance} and {increaseAllowance}
/// functions have been added to mitigate the well-known issues around setting
/// allowances. See {IERC20-approve}.
contract OpenZeppelin_ERC20 is OpenZeppelin_Context, OpenZeppelin_IERC20, OpenZeppelin_IERC20Metadata {
⋮----
/// @dev Sets the values for {name} and {symbol}.
⋮----
/// All two of these values are immutable: they can only be set once during
/// construction.
⋮----
function name() public view virtual override returns (string memory) {
⋮----
/// @dev Returns the symbol of the token, usually a shorter version of the
/// name.
function symbol() public view virtual override returns (string memory) {
⋮----
/// @dev Returns the number of decimals used to get its user representation.
/// For example, if `decimals` equals `2`, a balance of `505` tokens should
/// be displayed to a user as `5.05` (`505 / 10 ** 2`).
⋮----
/// Tokens usually opt for a value of 18, imitating the relationship between
/// Ether and Wei. This is the default value returned by this function, unless
/// it's overridden.
⋮----
/// NOTE: This information is only used for _display_ purposes: it in
/// no way affects any of the arithmetic of the contract, including
/// {IERC20-balanceOf} and {IERC20-transfer}.
function decimals() public view virtual override returns (uint8) {
⋮----
/// @dev See {IERC20-totalSupply}.
function totalSupply() public view virtual override returns (uint) {
⋮----
/// @dev See {IERC20-balanceOf}.
function balanceOf(address account) public view virtual override returns (uint) {
⋮----
/// @dev See {IERC20-transfer}.
⋮----
/// Requirements:
⋮----
/// - `to` cannot be the zero address.
/// - the caller must have a balance of at least `amount`.
function transfer(address to, uint amount) public virtual override returns (bool) {
⋮----
/// @dev See {IERC20-allowance}.
function allowance(address owner, address spender) public view virtual override returns (uint) {
⋮----
/// @dev See {IERC20-approve}.
⋮----
/// NOTE: If `amount` is the maximum `uint256`, the allowance is not updated on
/// `transferFrom`. This is semantically equivalent to an infinite approval.
⋮----
/// - `spender` cannot be the zero address.
function approve(address spender, uint amount) public virtual override returns (bool) {
⋮----
/// @dev See {IERC20-transferFrom}.
⋮----
/// Emits an {Approval} event indicating the updated allowance. This is not
/// required by the EIP. See the note at the beginning of {ERC20}.
⋮----
/// NOTE: Does not update the allowance if the current allowance
/// is the maximum `uint256`.
⋮----
/// - `from` and `to` cannot be the zero address.
/// - `from` must have a balance of at least `amount`.
/// - the caller must have allowance for ``from``'s tokens of at least
/// `amount`.
function transferFrom(address from, address to, uint amount) public virtual override returns (bool) {
⋮----
/// @dev Atomically increases the allowance granted to `spender` by the caller.
⋮----
/// This is an alternative to {approve} that can be used as a mitigation for
/// problems described in {IERC20-approve}.
⋮----
/// Emits an {Approval} event indicating the updated allowance.
⋮----
function increaseAllowance(address spender, uint addedValue) public virtual returns (bool) {
⋮----
/// @dev Atomically decreases the allowance granted to `spender` by the caller.
⋮----
/// - `spender` must have allowance for the caller of at least
/// `subtractedValue`.
function decreaseAllowance(address spender, uint subtractedValue) public virtual returns (bool) {
⋮----
/// @dev Moves `amount` of tokens from `from` to `to`.
⋮----
/// This internal function is equivalent to {transfer}, and can be used to
/// e.g. implement automatic token fees, slashing mechanisms, etc.
⋮----
/// - `from` cannot be the zero address.
⋮----
function _transfer(address from, address to, uint amount) internal virtual {
⋮----
// Overflow not possible: the sum of all balances is capped by totalSupply, and the sum is preserved by
// decrementing then incrementing.
⋮----
/// @dev Creates `amount` tokens and assigns them to `account`, increasing
/// the total supply.
⋮----
/// Emits a {Transfer} event with `from` set to the zero address.
⋮----
/// - `account` cannot be the zero address.
function _mint(address account, uint amount) internal virtual {
⋮----
// Overflow not possible: balance + amount is at most totalSupply + amount, which is checked above.
⋮----
/// @dev Destroys `amount` tokens from `account`, reducing the
/// total supply.
⋮----
/// Emits a {Transfer} event with `to` set to the zero address.
⋮----
/// - `account` must have at least `amount` tokens.
function _burn(address account, uint amount) internal virtual {
⋮----
// Overflow not possible: amount <= accountBalance <= totalSupply.
⋮----
/// @dev Sets `amount` as the allowance of `spender` over the `owner` s tokens.
⋮----
/// This internal function is equivalent to `approve`, and can be used to
/// e.g. set automatic allowances for certain subsystems, etc.
⋮----
/// - `owner` cannot be the zero address.
⋮----
function _approve(address owner, address spender, uint amount) internal virtual {
⋮----
/// @dev Updates `owner` s allowance for `spender` based on spent `amount`.
⋮----
/// Does not update the allowance amount in case of infinite allowance.
/// Revert if not enough allowance is available.
⋮----
/// Might emit an {Approval} event.
function _spendAllowance(address owner, address spender, uint amount) internal virtual {
⋮----
/// @dev Hook that is called before any transfer of tokens. This includes
/// minting and burning.
⋮----
/// Calling conditions:
⋮----
/// - when `from` and `to` are both non-zero, `amount` of ``from``'s tokens
/// will be transferred to `to`.
/// - when `from` is zero, `amount` tokens will be minted for `to`.
/// - when `to` is zero, `amount` of ``from``'s tokens will be burned.
/// - `from` and `to` are never both zero.
⋮----
/// To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].
function _beforeTokenTransfer(address from, address to, uint amount) internal virtual {}
⋮----
/// @dev Hook that is called after any transfer of tokens. This includes
⋮----
/// has been transferred to `to`.
/// - when `from` is zero, `amount` tokens have been minted for `to`.
/// - when `to` is zero, `amount` of ``from``'s tokens have been burned.
⋮----
function _afterTokenTransfer(address from, address to, uint amount) internal virtual {}
⋮----
// OpenZeppelin Contracts (last updated v4.5.0) (token/ERC20/extensions/ERC20Burnable.sol)
⋮----
// import "../ERC20.sol";
// import "../../../utils/Context.sol";
⋮----
/// @dev Extension of {ERC20} that allows token holders to destroy both their own
/// tokens and those that they have an allowance for, in a way that can be
/// recognized off-chain (via event analysis).
abstract contract OpenZeppelin_ERC20Burnable is OpenZeppelin_Context, OpenZeppelin_ERC20 {
/// @dev Destroys `amount` tokens from the caller.
⋮----
/// See {ERC20-_burn}.
function burn(uint amount) public virtual {
⋮----
/// @dev Destroys `amount` tokens from `account`, deducting from the caller's
⋮----
/// See {ERC20-_burn} and {ERC20-allowance}.
⋮----
/// - the caller must have allowance for ``accounts``'s tokens of at least
⋮----
function burnFrom(address account, uint amount) public virtual {
⋮----
// OpenZeppelin Contracts (last updated v4.5.0) (token/ERC20/presets/ERC20PresetFixedSupply.sol)
⋮----
// import "../extensions/ERC20Burnable.sol";
⋮----
/// @dev {ERC20} token, including:
⋮----
///  - Preminted initial supply
///  - Ability for holders to burn (destroy) their tokens
///  - No access control mechanism (for minting/pausing) and hence no governance
⋮----
/// This contract uses {ERC20Burnable} to include burn capabilities - head to
/// its documentation for details.
⋮----
/// _Available since v3.4._
⋮----
/// _Deprecated in favor of https://wizard.openzeppelin.com/[Contracts Wizard]._
contract OpenZeppelin_ERC20PresetFixedSupply is OpenZeppelin_ERC20Burnable {
/// @dev Mints `initialSupply` amount of token and transfers them to `owner`.
⋮----
/// See {ERC20-constructor}.
⋮----
// actual mock code
contract ERC20_OneWeiFeeOnTransfer is OpenZeppelin_ERC20PresetFixedSupply {
⋮----
function _transfer(address from, address to, uint amount) internal virtual override {
````

## File: src/test/mocks/ERC20_SetTransferReverting_Mock.sol
````
// SPDX-License-Identifier: BUSL-1.1
⋮----
import "@openzeppelin/contracts/token/ERC20/presets/ERC20PresetFixedSupply.sol";
⋮----
contract ERC20_SetTransferReverting_Mock is ERC20PresetFixedSupply {
⋮----
function setTransfersRevert(bool _transfersRevert) public {
⋮----
function _beforeTokenTransfer(address, address, uint) internal view override {
⋮----
// revert without message
⋮----
// revert("ERC20_SetTransferReverting_Mock._beforeTokenTransfer: transfersRevert set");
````

## File: src/test/mocks/ERC20Mock.sol
````
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.8.0) (token/ERC20/ERC20.sol)
⋮----
import "@openzeppelin/contracts/interfaces/IERC20.sol";
import "@openzeppelin/contracts/utils/Context.sol";
⋮----
/// @dev Implementation of the {IERC20} interface.
///
/// This implementation is agnostic to the way tokens are created. This means
/// that a supply mechanism has to be added in a derived contract using {_mint}.
/// For a generic mechanism see {ERC20PresetMinterPauser}.
⋮----
/// TIP: For a detailed writeup see our guide
/// https://forum.openzeppelin.com/t/how-to-implement-erc20-supply-mechanisms/226[How
/// to implement supply mechanisms].
⋮----
/// The default value of {decimals} is 18. To change this, you should override
/// this function so it returns a different value.
⋮----
/// We have followed general OpenZeppelin Contracts guidelines: functions revert
/// instead returning `false` on failure. This behavior is nonetheless
/// conventional and does not conflict with the expectations of ERC20
/// applications.
⋮----
/// Additionally, an {Approval} event is emitted on calls to {transferFrom}.
/// This allows applications to reconstruct the allowance for all accounts just
/// by listening to said events. Other implementations of the EIP may not emit
/// these events, as it isn't required by the specification.
⋮----
/// Finally, the non-standard {decreaseAllowance} and {increaseAllowance}
/// functions have been added to mitigate the well-known issues around setting
/// allowances. See {IERC20-approve}.
contract ERC20Mock is Context, IERC20 {
⋮----
/// @dev Returns the decimals places of the token.
function decimals() external pure returns (uint8) {
⋮----
/// @dev See {IERC20-totalSupply}.
function totalSupply() public view virtual override returns (uint) {
⋮----
/// @dev See {IERC20-balanceOf}.
function balanceOf(address account) public view virtual override returns (uint) {
⋮----
/// @dev See {IERC20-transfer}.
⋮----
/// Requirements:
⋮----
/// - `to` cannot be the zero address.
/// - the caller must have a balance of at least `amount`.
function transfer(address to, uint amount) public virtual override returns (bool) {
⋮----
/// @dev See {IERC20-allowance}.
function allowance(address owner, address spender) public view virtual override returns (uint) {
⋮----
function mint(
⋮----
/*to*/
⋮----
/// @dev See {IERC20-approve}.
⋮----
/// NOTE: If `amount` is the maximum `uint256`, the allowance is not updated on
/// `transferFrom`. This is semantically equivalent to an infinite approval.
⋮----
/// - `spender` cannot be the zero address.
function approve(
⋮----
/*spender*/
uint /*amount*/
⋮----
/// @dev See {IERC20-transferFrom}.
⋮----
/// Emits an {Approval} event indicating the updated allowance. This is not
/// required by the EIP. See the note at the beginning of {ERC20}.
⋮----
/// NOTE: Does not update the allowance if the current allowance
/// is the maximum `uint256`.
⋮----
/// - `from` and `to` cannot be the zero address.
/// - `from` must have a balance of at least `amount`.
/// - the caller must have allowance for ``from``'s tokens of at least
/// `amount`.
function transferFrom(address from, address to, uint amount) public virtual override returns (bool) {
⋮----
/// @dev Moves `amount` of tokens from `from` to `to`.
⋮----
/// This internal function is equivalent to {transfer}, and can be used to
/// e.g. implement automatic token fees, slashing mechanisms, etc.
⋮----
/// Emits a {Transfer} event.
⋮----
/// - `from` cannot be the zero address.
⋮----
function _transfer(address from, address to, uint amount) internal virtual {
⋮----
// Overflow not possible: the sum of all balances is capped by totalSupply, and the sum is preserved by
// decrementing then incrementing.
⋮----
/// @dev Creates `amount` tokens and assigns them to `account`, increasing
/// the total supply.
⋮----
/// Emits a {Transfer} event with `from` set to the zero address.
⋮----
/// - `account` cannot be the zero address.
function _mint(address account, uint amount) internal virtual {
⋮----
// Overflow not possible: balance + amount is at most totalSupply + amount, which is checked above.
⋮----
/// @dev Destroys `amount` tokens from `account`, reducing the
/// total supply.
⋮----
/// Emits a {Transfer} event with `to` set to the zero address.
⋮----
/// - `account` must have at least `amount` tokens.
function _burn(address account, uint amount) internal virtual {
⋮----
// Overflow not possible: amount <= accountBalance <= totalSupply.
⋮----
/// @dev Sets `amount` as the allowance of `spender` over the `owner` s tokens.
⋮----
/// This internal function is equivalent to `approve`, and can be used to
/// e.g. set automatic allowances for certain subsystems, etc.
⋮----
/// Emits an {Approval} event.
⋮----
/// - `owner` cannot be the zero address.
⋮----
function _approve(address owner, address spender, uint amount) internal virtual {
⋮----
/// @dev Updates `owner` s allowance for `spender` based on spent `amount`.
⋮----
/// Does not update the allowance amount in case of infinite allowance.
/// Revert if not enough allowance is available.
⋮----
/// Might emit an {Approval} event.
function _spendAllowance(address owner, address spender, uint amount) internal virtual {
⋮----
/// @dev Hook that is called before any transfer of tokens. This includes
/// minting and burning.
⋮----
/// Calling conditions:
⋮----
/// - when `from` and `to` are both non-zero, `amount` of ``from``'s tokens
/// will be transferred to `to`.
/// - when `from` is zero, `amount` tokens will be minted for `to`.
/// - when `to` is zero, `amount` of ``from``'s tokens will be burned.
/// - `from` and `to` are never both zero.
⋮----
/// To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].
function _beforeTokenTransfer(address from, address to, uint amount) internal virtual {}
⋮----
/// @dev Hook that is called after any transfer of tokens. This includes
⋮----
/// has been transferred to `to`.
/// - when `from` is zero, `amount` tokens have been minted for `to`.
/// - when `to` is zero, `amount` of ``from``'s tokens have been burned.
⋮----
function _afterTokenTransfer(address from, address to, uint amount) internal virtual {}
````

## File: src/test/mocks/ETHDepositMock.sol
````
// SPDX-License-Identifier: BUSL-1.1
⋮----
import "../../contracts/interfaces/IETHPOSDeposit.sol";
⋮----
contract ETHPOSDepositMock is IETHPOSDeposit {
function deposit(bytes calldata pubkey, bytes calldata withdrawal_credentials, bytes calldata signature, bytes32 deposit_data_root)
⋮----
function get_deposit_root() external pure returns (bytes32) {
⋮----
/// @notice Query the current deposit count.
/// @return The deposit count encoded as a little endian 64-bit number.
function get_deposit_count() external pure returns (bytes memory) {
````

## File: src/test/mocks/LiquidStakingToken.sol
````
// SPDX-License-Identifier: BUSL-1.1
// modified version of https://github.com/itstargetconfirmed/wrapped-ether/blob/master/contracts/WETH.sol
⋮----
import "@openzeppelin/contracts/token/ERC20/ERC20.sol";
⋮----
/// @notice An implementation of Wrapped Ether.
/// @author Anderson Singh.
⋮----
contract WETH is ERC20 {
⋮----
/// @dev mint tokens for sender based on amount of ether sent.
function deposit() public payable {
⋮----
/// @dev withdraw ether based on requested amount and user balance.
function withdraw(uint _amount) external {
````

## File: src/test/mocks/MockAVSRegistrar.sol
````
// SPDX-License-Identifier: BUSL-1.1
⋮----
contract MockAVSRegistrar {
function supportsAVS(
address /*avs*/
````

## File: src/test/mocks/MockAVSTaskHook.sol
````
// SPDX-License-Identifier: BUSL-1.1
⋮----
import {IAVSTaskHook} from "src/contracts/interfaces/IAVSTaskHook.sol";
import {ITaskMailboxTypes} from "src/contracts/interfaces/ITaskMailbox.sol";
⋮----
contract MockAVSTaskHook is IAVSTaskHook {
⋮----
function setDefaultFee(uint96 _fee) external {
⋮----
function validatePreTaskCreation(
⋮----
/*caller*/
ITaskMailboxTypes.TaskParams memory /*taskParams*/
⋮----
//TODO: Implement
⋮----
function handlePostTaskCreation(
bytes32 /*taskHash*/
⋮----
function validatePreTaskResultSubmission(
⋮----
/*taskHash*/
⋮----
/*cert*/
bytes memory /*result*/
⋮----
function handlePostTaskResultSubmission(
⋮----
function calculateTaskFee(
````

## File: src/test/mocks/MockBN254CertificateVerifier.sol
````
// SPDX-License-Identifier: BUSL-1.1
⋮----
import {IBN254CertificateVerifier} from "src/contracts/interfaces/IBN254CertificateVerifier.sol";
import {IOperatorTableCalculatorTypes} from "src/contracts/interfaces/IOperatorTableCalculator.sol";
import {OperatorSet} from "src/contracts/libraries/OperatorSetLib.sol";
import {BN254} from "src/contracts/libraries/BN254.sol";
⋮----
contract MockBN254CertificateVerifier is IBN254CertificateVerifier {
// Mapping to store operator set owners for testing
⋮----
// Configurable values for testing
⋮----
uint32 private _maxOperatorTableStaleness = 86_400; // Default value
⋮----
function setOperatorSetOwner(OperatorSet memory operatorSet, address owner) external {
⋮----
function setLatestReferenceTimestamp(uint32 timestamp) external {
⋮----
function setMaxOperatorTableStaleness(uint32 staleness) external {
⋮----
function updateOperatorTable(
OperatorSet calldata, /*operatorSet*/
uint32, /*referenceTimestamp*/
IOperatorTableCalculatorTypes.BN254OperatorSetInfo memory, /*operatorSetInfo*/
OperatorSetConfig calldata /*operatorSetConfig*/
⋮----
function verifyCertificate(
⋮----
/*operatorSet*/
BN254Certificate memory /*cert*/
⋮----
function verifyCertificateProportion(
OperatorSet memory, /*operatorSet*/
BN254Certificate memory, /*cert*/
uint16[] memory /*totalStakeProportionThresholds*/
⋮----
function verifyCertificateNominal(
⋮----
uint[] memory /*totalStakeNominalThresholds*/
⋮----
// Implement IBaseCertificateVerifier required functions
function operatorTableUpdater(
OperatorSet memory /*operatorSet*/
⋮----
function getLatestReferenceTimestamp(
⋮----
function getOperatorSetOwner(OperatorSet memory operatorSet) external view returns (address) {
// Return the configured owner, or the AVS address by default
⋮----
function latestReferenceTimestamp(
⋮----
function maxOperatorTableStaleness(
⋮----
function trySignatureVerification(
bytes32, /*msgHash*/
BN254.G1Point memory, /*aggPubkey*/
BN254.G2Point memory, /*apkG2*/
BN254.G1Point memory /*signature*/
⋮----
function getNonsignerOperatorInfo(
⋮----
/*referenceTimestamp*/
uint /*operatorIndex*/
⋮----
function isNonsignerCached(
⋮----
function getOperatorSetInfo(
⋮----
uint32 /*referenceTimestamp*/
⋮----
function isReferenceTimestampSet(OperatorSet memory, uint32) external pure returns (bool) {
⋮----
function getTotalStakeWeights(
⋮----
function getOperatorCount(
⋮----
function calculateCertificateDigest(uint32 referenceTimestamp, bytes32 messageHash) external pure returns (bytes32) {
````

## File: src/test/mocks/MockBN254CertificateVerifierFailure.sol
````
// SPDX-License-Identifier: BUSL-1.1
⋮----
import {IBN254CertificateVerifier} from "src/contracts/interfaces/IBN254CertificateVerifier.sol";
import {IOperatorTableCalculatorTypes} from "src/contracts/interfaces/IOperatorTableCalculator.sol";
import {OperatorSet} from "src/contracts/libraries/OperatorSetLib.sol";
import {BN254} from "src/contracts/libraries/BN254.sol";
⋮----
/// @title MockBN254CertificateVerifierFailure
/// @notice Mock BN254 certificate verifier that always fails verification
/// @dev Used for testing certificate verification failure scenarios
contract MockBN254CertificateVerifierFailure is IBN254CertificateVerifier {
// Mapping to store operator set owners for testing
⋮----
function setOperatorSetOwner(OperatorSet memory operatorSet, address owner) external {
⋮----
function updateOperatorTable(
OperatorSet calldata, /*operatorSet*/
uint32, /*referenceTimestamp*/
IOperatorTableCalculatorTypes.BN254OperatorSetInfo memory, /*operatorSetInfo*/
OperatorSetConfig calldata /*operatorSetConfig*/
⋮----
function verifyCertificate(
⋮----
/*operatorSet*/
BN254Certificate memory /*cert*/
⋮----
function verifyCertificateProportion(
OperatorSet memory, /*operatorSet*/
BN254Certificate memory, /*cert*/
uint16[] memory /*totalStakeProportionThresholds*/
⋮----
return false; // Always fail
⋮----
function verifyCertificateNominal(
⋮----
uint[] memory /*totalStakeNominalThresholds*/
⋮----
// Implement IBaseCertificateVerifier required functions
function operatorTableUpdater(
OperatorSet memory /*operatorSet*/
⋮----
function getLatestReferenceTimestamp(
⋮----
function getOperatorSetOwner(OperatorSet memory operatorSet) external view returns (address) {
// Return the configured owner, or the AVS address by default
⋮----
function latestReferenceTimestamp(
⋮----
function maxOperatorTableStaleness(
⋮----
function trySignatureVerification(
bytes32, /*msgHash*/
BN254.G1Point memory, /*aggPubkey*/
BN254.G2Point memory, /*apkG2*/
BN254.G1Point memory /*signature*/
⋮----
return (true, false); // Pairing succeeds but signature is invalid
⋮----
function getNonsignerOperatorInfo(
⋮----
/*referenceTimestamp*/
uint /*operatorIndex*/
⋮----
function isNonsignerCached(
⋮----
function getOperatorSetInfo(
⋮----
uint32 /*referenceTimestamp*/
⋮----
function isReferenceTimestampSet(OperatorSet memory, uint32) external pure returns (bool) {
⋮----
function getTotalStakeWeights(
⋮----
function getOperatorCount(
⋮----
function calculateCertificateDigest(uint32 referenceTimestamp, bytes32 messageHash) external pure returns (bytes32) {
````

## File: src/test/mocks/MockDecimals.sol
````
// SPDX-License-Identifier: BUSL-1.1
⋮----
contract MockDecimals {
function decimals() public pure returns (uint8) {
````

## File: src/test/mocks/MockECDSACertificateVerifier.sol
````
// SPDX-License-Identifier: BUSL-1.1
⋮----
import {IECDSACertificateVerifier} from "src/contracts/interfaces/IECDSACertificateVerifier.sol";
import {OperatorSet} from "src/contracts/libraries/OperatorSetLib.sol";
⋮----
contract MockECDSACertificateVerifier is IECDSACertificateVerifier {
// Mapping to store operator set owners for testing
⋮----
// Configurable values for testing
⋮----
uint32 private _maxOperatorTableStaleness = 86_400; // Default value
⋮----
function setOperatorSetOwner(OperatorSet memory operatorSet, address owner) external {
⋮----
function setLatestReferenceTimestamp(uint32 timestamp) external {
⋮----
function setMaxOperatorTableStaleness(uint32 staleness) external {
⋮----
function updateOperatorTable(
OperatorSet calldata, /*operatorSet*/
uint32, /*referenceTimestamp*/
ECDSAOperatorInfo[] calldata, /*operatorInfos*/
OperatorSetConfig calldata /*operatorSetConfig*/
⋮----
function verifyCertificate(
⋮----
/*operatorSet*/
ECDSACertificate memory /*cert*/
⋮----
function verifyCertificateProportion(
⋮----
ECDSACertificate memory, /*cert*/
uint16[] memory /*totalStakeProportionThresholds*/
⋮----
function verifyCertificateNominal(
⋮----
uint[] memory /*totalStakeNominalThresholds*/
⋮----
// Implement IBaseCertificateVerifier required functions
function operatorTableUpdater(
OperatorSet memory /*operatorSet*/
⋮----
function getLatestReferenceTimestamp(
⋮----
function getOperatorSetOwner(OperatorSet memory operatorSet) external view returns (address) {
// Return the configured owner, or the AVS address by default
⋮----
function latestReferenceTimestamp(
⋮----
function maxOperatorTableStaleness(
⋮----
function getCachedSignerList(
⋮----
uint32 /*referenceTimestamp*/
⋮----
function getOperatorInfos(
⋮----
function getOperatorInfo(
⋮----
/*referenceTimestamp*/
uint /*operatorIndex*/
⋮----
function getOperatorCount(
⋮----
function getTotalStakes(
⋮----
function domainSeparator() external pure returns (bytes32) {
⋮----
function calculateCertificateDigest(uint32 referenceTimestamp, bytes32 messageHash) external pure returns (bytes32) {
⋮----
function getTotalStakeWeights(OperatorSet calldata, uint32) external pure returns (uint[] memory) {
⋮----
function calculateCertificateDigestBytes(uint32, bytes32) external pure returns (bytes memory) {
⋮----
function isReferenceTimestampSet(OperatorSet memory, uint32) external pure returns (bool) {
````

## File: src/test/mocks/MockECDSACertificateVerifierFailure.sol
````
// SPDX-License-Identifier: BUSL-1.1
⋮----
import {IECDSACertificateVerifier} from "src/contracts/interfaces/IECDSACertificateVerifier.sol";
import {OperatorSet} from "src/contracts/libraries/OperatorSetLib.sol";
⋮----
contract MockECDSACertificateVerifierFailure is IECDSACertificateVerifier {
// Mapping to store operator set owners for testing
⋮----
function setOperatorSetOwner(OperatorSet memory operatorSet, address owner) external {
⋮----
function updateOperatorTable(
OperatorSet calldata, /*operatorSet*/
uint32, /*referenceTimestamp*/
ECDSAOperatorInfo[] calldata, /*operatorInfos*/
OperatorSetConfig calldata /*operatorSetConfig*/
⋮----
function verifyCertificate(
⋮----
/*operatorSet*/
ECDSACertificate memory /*cert*/
⋮----
function verifyCertificateProportion(
⋮----
ECDSACertificate memory, /*cert*/
uint16[] memory /*totalStakeProportionThresholds*/
⋮----
return (false, new address[](0)); // Always fail
⋮----
function verifyCertificateNominal(
⋮----
uint[] memory /*totalStakeNominalThresholds*/
⋮----
// Implement IBaseCertificateVerifier required functions
function operatorTableUpdater(
OperatorSet memory /*operatorSet*/
⋮----
function getLatestReferenceTimestamp(
⋮----
function getOperatorSetOwner(OperatorSet memory operatorSet) external view returns (address) {
// Return the configured owner, or the AVS address by default
⋮----
function latestReferenceTimestamp(
⋮----
function maxOperatorTableStaleness(
⋮----
function getCachedSignerList(
⋮----
uint32 /*referenceTimestamp*/
⋮----
function getOperatorInfos(
⋮----
function getOperatorInfo(
⋮----
/*referenceTimestamp*/
uint /*operatorIndex*/
⋮----
function getOperatorCount(
⋮----
function getTotalStakes(
⋮----
function domainSeparator() external pure returns (bytes32) {
⋮----
function calculateCertificateDigest(uint32 referenceTimestamp, bytes32 messageHash) external pure returns (bytes32) {
⋮----
function getTotalStakeWeights(OperatorSet calldata, uint32) external pure returns (uint[] memory) {
⋮----
function calculateCertificateDigestBytes(uint32, bytes32) external pure returns (bytes memory) {
⋮----
function isReferenceTimestampSet(OperatorSet memory, uint32) external pure returns (bool) {
````

## File: src/test/mocks/MockERC20.sol
````
// SPDX-License-Identifier: MIT
⋮----
/// @notice This is a mock contract of the ERC20 standard for testing purposes only, it SHOULD NOT be used in production.
/// @dev Forked from: https://github.com/transmissions11/solmate/blob/0384dbaaa4fcb5715738a9254a7c0a4cb62cf458/src/tokens/ERC20.sol
contract MockERC20 {
/// @dev Emitted when `value` tokens are moved from one account (`from`) to another (`to`).
event Transfer(address indexed from, address indexed to, uint value);
⋮----
/// @dev Emitted when the allowance of a `spender` for an `owner` is set, where `value`
/// is the new allowance.
event Approval(address indexed owner, address indexed spender, uint value);
⋮----
/*//////////////////////////////////////////////////////////////
                            METADATA STORAGE
    //////////////////////////////////////////////////////////////*/
⋮----
function name() external view returns (string memory) {
⋮----
function symbol() external view returns (string memory) {
⋮----
function decimals() external view returns (uint8) {
⋮----
/*//////////////////////////////////////////////////////////////
                              ERC20 STORAGE
    //////////////////////////////////////////////////////////////*/
⋮----
function totalSupply() external view returns (uint) {
⋮----
function balanceOf(address owner) external view returns (uint) {
⋮----
function allowance(address owner, address spender) external view returns (uint) {
⋮----
/*//////////////////////////////////////////////////////////////
                            EIP-2612 STORAGE
    //////////////////////////////////////////////////////////////*/
⋮----
/*//////////////////////////////////////////////////////////////
                               INITIALIZE
    //////////////////////////////////////////////////////////////*/
⋮----
/// @dev A bool to track whether the contract has been initialized.
⋮----
/// @dev To hide constructor warnings across solc versions due to different constructor visibility requirements and
/// syntaxes, we add an initialization function that can be called only once.
function initialize(string memory name_, string memory symbol_, uint8 decimals_) public {
⋮----
/*//////////////////////////////////////////////////////////////
                               ERC20 LOGIC
    //////////////////////////////////////////////////////////////*/
⋮----
function approve(address spender, uint amount) public virtual returns (bool) {
⋮----
function transfer(address to, uint amount) public virtual returns (bool) {
⋮----
function transferFrom(address from, address to, uint amount) public virtual returns (bool) {
uint allowed = _allowance[from][msg.sender]; // Saves gas for limited approvals.
⋮----
/*//////////////////////////////////////////////////////////////
                             EIP-2612 LOGIC
    //////////////////////////////////////////////////////////////*/
⋮----
function permit(address owner, address spender, uint value, uint deadline, uint8 v, bytes32 r, bytes32 s) public virtual {
⋮----
function DOMAIN_SEPARATOR() public view virtual returns (bytes32) {
⋮----
function computeDomainSeparator() internal view virtual returns (bytes32) {
⋮----
/*//////////////////////////////////////////////////////////////
                        INTERNAL MINT/BURN LOGIC
    //////////////////////////////////////////////////////////////*/
⋮----
function _mint(address to, uint amount) internal virtual {
⋮----
function _burn(address from, uint amount) internal virtual {
⋮----
/*//////////////////////////////////////////////////////////////
                        INTERNAL SAFE MATH LOGIC
    //////////////////////////////////////////////////////////////*/
⋮----
function _add(uint a, uint b) internal pure returns (uint) {
⋮----
function _sub(uint a, uint b) internal pure returns (uint) {
⋮----
/*//////////////////////////////////////////////////////////////
                                HELPERS
    //////////////////////////////////////////////////////////////*/
⋮----
// We use this complex approach of `_viewChainId` and `_pureChainId` to ensure there are no
// compiler warnings when accessing chain ID in any solidity version supported by forge-std. We
// can't simply access the chain ID in a normal view or pure function because the solc View Pure
// Checker changed `chainid` from pure to view in 0.8.0.
function _viewChainId() private view returns (uint chainId) {
// Assembly required since `block.chainid` was introduced in 0.8.0.
⋮----
address(this); // Silence warnings in older Solc versions.
⋮----
function _pureChainId() private pure returns (uint chainId) {
````

## File: src/test/mocks/MockSimpleERC20.sol
````
// SPDX-License-Identifier: BUSL-1.1
⋮----
import {ERC20} from "@openzeppelin/contracts/token/ERC20/ERC20.sol";
⋮----
/// @title MockSimpleERC20
/// @notice Mock ERC20 token for testing
/// @dev Simple ERC20 implementation with mint function for testing
contract MockSimpleERC20 is ERC20 {
⋮----
function mint(address to, uint amount) public {
````

## File: src/test/mocks/OperatorTableCalculatorMock.sol
````
// SPDX-License-Identifier: BUSL-1.1
⋮----
import "src/contracts/interfaces/IOperatorTableCalculator.sol";
import "src/contracts/libraries/OperatorSetLib.sol";
⋮----
contract OperatorTableCalculatorMock is IOperatorTableCalculator {
⋮----
function calculateOperatorTableBytes(OperatorSet memory operatorSet) external view returns (bytes memory) {
⋮----
function setOperatorTableBytes(OperatorSet memory operatorSet, bytes memory operatorTableBytes) external {
⋮----
function getOperatorSetWeights(OperatorSet calldata operatorSet)
⋮----
function getOperatorWeights(OperatorSet calldata operatorSet, address operator) external view returns (uint[] memory weights) {
⋮----
// Helper functions for testing
function setOperators(OperatorSet memory operatorSet, address[] memory operators) external {
⋮----
function setOperatorWeight(OperatorSet memory operatorSet, address operator, uint weight) external {
````

## File: src/test/mocks/OperatorTableUpdaterMock.sol
````
// SPDX-License-Identifier: BUSL-1.1
⋮----
import "forge-std/Test.sol";
import "src/contracts/interfaces/IOperatorTableUpdater.sol";
⋮----
contract OperatorTableUpdaterMock is Test {
⋮----
function isRootValidByTimestamp(uint32 referenceTimestamp) external view returns (bool) {
// If the root is invalid, return false
⋮----
function invalidateRoot(uint32 referenceTimestamp) external {
````

## File: src/test/mocks/OwnableMock.sol
````
// SPDX-License-Identifier: BUSL-1.1
⋮----
import "@openzeppelin/contracts/access/Ownable.sol";
⋮----
contract OwnableMock is Ownable {}
````

## File: src/test/mocks/Reenterer.sol
````
// SPDX-License-Identifier: MIT
// contract is *modified* from Seaport's test file: https://github.com/ProjectOpenSea/seaport/blob/891b5d4f52b58eb7030597fbb22dca67fd86c4c8/contracts/test/Reenterer.sol
⋮----
import "forge-std/Test.sol";
⋮----
contract Reenterer is Test {
⋮----
event Reentered(bytes returnData);
⋮----
function prepare(address targetToUse, uint msgValueToUse, bytes memory callDataToUse) external {
⋮----
// added function that allows writing to `expectedRevertData`
function prepare(address targetToUse, uint msgValueToUse, bytes memory callDataToUse, bytes memory expectedRevertDataToUse) external {
⋮----
// added function that allows writing to `dataToReturn`
function prepareReturnData(bytes memory returnDataToUse) external {
⋮----
// added expectrevert logic
⋮----
// added dataToReturn logic
⋮----
// added fallback function that is a copy of the `receive` function
⋮----
// added expectRevert logic
````

## File: src/test/mocks/Reverter.sol
````
// SPDX-License-Identifier: BUSL-1.1
⋮----
contract Reverter {
⋮----
contract ReverterWithDecimals is Reverter {
function decimals() external pure returns (uint8) {
````

## File: src/test/mocks/RewardsCoordinatorMock.sol
````
// SPDX-License-Identifier: BUSL-1.1
⋮----
import "forge-std/Test.sol";
⋮----
import "src/contracts/interfaces/IRewardsCoordinator.sol";
import "src/contracts/libraries/OperatorSetLib.sol";
⋮----
contract RewardsCoordinatorMock is Test {
⋮----
function setOperatorAVSSplit(address operator, address avs, uint16 split) external {
⋮----
function setOperatorSetSplit(address operator, OperatorSet calldata operatorSet, uint16 split) external {
⋮----
function setClaimerFor(address earner, address claimer) external {
⋮----
function lastSetOperatorAVSSplitCall() external view returns (SetOperatorAVSSplitCall memory) {
⋮----
function lastSetOperatorSetSplitCall() external view returns (SetOperatorSetSplitCall memory) {
⋮----
function lastSetClaimerForCall() external view returns (SetClaimerForCall memory) {
````

## File: src/test/mocks/StrategyFactoryMock.sol
````
// SPDX-License-Identifier: BUSL-1.1
⋮----
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 {
⋮----
function setIsBlacklisted(IERC20 token, bool blacklisted) external {
````

## File: src/test/mocks/StrategyManagerMock.sol
````
// SPDX-License-Identifier: BUSL-1.1
⋮----
import "forge-std/Test.sol";
⋮----
import "../../contracts/interfaces/IDelegationManager.sol";
import "../../contracts/interfaces/IStrategy.sol";
⋮----
contract StrategyManagerMock is Test {
⋮----
/// @notice Mapping staker => strategy => shares withdrawn after a withdrawal has been completed
⋮----
/// @notice Mapping: staker => cumulative number of queued withdrawals they have ever initiated. only increments (doesn't decrement)
⋮----
/// @notice Mock the burn or redistributable count
⋮----
/// @notice mocks the return value of getDeposits
/// @param staker staker whose deposits are being mocked
/// @param _strategiesToReturn strategies to return in getDeposits
/// @param _sharesToReturn shares to return in getDeposits
function setDeposits(address staker, IStrategy[] calldata _strategiesToReturn, uint[] calldata _sharesToReturn) external {
⋮----
/// @notice Adds deposit to the staker's deposits. Note that this function does not check if the staker
/// has already deposited for the strategy.
function addDeposit(address staker, IStrategy strategy, uint shares) external {
⋮----
/// @notice Get all details on the staker's deposits and corresponding shares
/// @return (staker's strategies, shares in these strategies)
function getDeposits(address staker) external view returns (IStrategy[] memory, uint[] memory) {
⋮----
function stakerDepositShares(address staker, IStrategy strategy) public view returns (uint) {
⋮----
/// @notice Simple getter function that returns `stakerStrategyList[staker].length`.
function stakerStrategyListLength(
address /*staker*/
⋮----
function setStakerStrategyListLengthReturnValue(uint valueToSet) public {
⋮----
function setStrategyWhitelist(IStrategy strategy, bool value) external {
⋮----
function addStrategiesToDepositWhitelist(IStrategy[] calldata strategiesToWhitelist) external {
⋮----
function removeDepositShares(address staker, IStrategy strategy, uint sharesToRemove) external returns (uint) {
⋮----
function removeStrategiesFromDepositWhitelist(
IStrategy[] calldata /*strategiesToRemoveFromWhitelist*/
⋮----
function withdrawSharesAsTokens(
⋮----
address, // token
⋮----
function addShares(address staker, IStrategy strategy, uint addedShares) external returns (uint, uint) {
// Increase the staker's shares
⋮----
function clearBurnOrRedistributableShares(OperatorSet calldata operatorSet, uint slashId) external returns (address[] memory) {}
⋮----
function clearBurnOrRedistributableSharesByStrategy(OperatorSet calldata operatorSet, uint slashId, IStrategy strategy)
⋮----
function getBurnOrRedistributableCount(OperatorSet calldata operatorSet, uint slashId) external view returns (uint) {
⋮----
function setBurnOrRedistributableCount(uint count) external {
⋮----
function _getStrategyIndex(address staker, IStrategy strategy) internal view returns (uint) {
⋮----
function setDelegationManager(IDelegationManager _delegation) external {
````

## File: src/test/test-data/rewardsCoordinator/processClaim_Preprod_Test.json
````json
{
  "Root": "0x5e3227269ddcd5ddc7bc76ef42243a16166e86f9adab6183ee49b9875f2c7002",
  "RootIndex": 0,
  "EarnerIndex": 1,
  "EarnerTreeProof": "0x468cfb9f23175803c35daccc788454e82e192aa69bd770b26861dbe1fb42336d44b3fc6ad9da7ba33382006677e1808659ccd50c35705233f0fedca7b34c0e07d8894c83317a23b1f54108d86045843d34a127d92fb262452a636d0d40b577e1",
  "EarnerLeaf": {
    "Earner": "0x2222aac0c980cc029624b7ff55b88bc6f63c538f",
    "EarnerTokenRoot": "0x987aa019b1caf3fb0eaf02ebc1b8ce46840aee48d94ee21a2753045805ae38a8"
  },
  "LeafIndices": [
    0
  ],
  "TokenTreeProofs": [
    "0x"
  ],
  "TokenLeaves": [
    {
      "Token": "0x94373a4919b3240d86ea41593d5eba789fef3848",
      "CumulativeEarnings": 1003827094673442500
    }
  ],
  "TokenTreeProofsNum": 1,
  "TokenLeavesNum": 1
}
````

## File: src/test/test-data/rewardsCoordinator/processClaimProofs_MaxEarnerAndLeafIndices.json
````json
{
  "Root": "0x37550707c80f3d8907c467999730e52127ab89be3f17a5017a3f1ffb73a1445f",
  "RootIndex": 0,
  "EarnerIndex": 7,
  "EarnerTreeProof": "0x4bf5e16eaabbc36964f1e1639808669420f55d60e51adb7e9695b77145c479fd6777be59643947bb24d78e69d6605bf369c515b479f3a8967dd68a97c5bb4a4a262b28002eeb6cbbffb7e79e5741bf2be189a6073440a62fabcd8af4dbda94e3",
  "EarnerLeaf": {
    "Earner": "0x25a1b7322f9796b26a4bec125913b34c292b28d6",
    "EarnerTokenRoot": "0xf8e7e20b32aae1d818dcb593b98982841e9a0ed12c161ad603e3ee3948746cba"
  },
  "LeafIndices": [
    7
  ],
  "TokenTreeProofs": [
    "0x3cd04e8fc6f23812c570fe12292a30bb9e105e00f5913ac4b4938f23e65d8d10e6b1403d58c9d5450952e7d96c81305dad9fb966e8a27d3a42058e3958a0d30033148e91b455542d05deb81b8305b672e742cd3145f7022a0089bad2e6af9173"
  ],
  "TokenLeaves": [
    {
      "Token": "0x7fbfdd1dfd80730385aee232cc9f79b8ae12a654",
      "CumulativeEarnings": 3000000000000000000
    }
  ],
  "TokenTreeProofsNum": 1,
  "TokenLeavesNum": 1
}
````

## File: src/test/test-data/rewardsCoordinator/processClaimProofs_Root1.json
````json
{
  "Root": "0xc5d6bb1073f9040366851b5971493165893558f1cdc0b0046b6703baa85cddfc",
  "RootIndex": 0,
  "EarnerIndex": 3,
  "EarnerTreeProof": "0x04da796e892869089dfdaae7269c8eb12548f6aa3774a747322b65c42d1ca0050d38d6d5e7e9e65ba24c275fcc0f0c377d8fb6ed089770d849c39a1829d1edf27e78a529aa8f867a3777f97541a23fb1844d6ae24c3b8ca1cc981510e5d08bda",
  "EarnerLeaf": {
    "Earner": "0xf2288d736d27c1584ebf7be5f52f9e4d47251aee",
    "EarnerTokenRoot": "0xa81e82a39e6da197c3c83b8b1343eb7e8a969db52d4bfc424fd04d60350d76e3"
  },
  "LeafIndices": [
    0,
    1,
    2,
    3,
    4,
    5
  ],
  "TokenTreeProofs": [
    "0x6166682a9a29283a51a1c1575de82334227cc45b1ce686973039a44eb9a6b008e3e64bd80597510ac0b737fc645f15801cc3835b279412e1a09ba66d50c2aa82e3f64b05b0f9ee23e853d9c134984c27b5b58d14b70c4dacea9a5e40600e17a3",
    "0x167f18d55815451f979244946b7eb2ce019c323a9e02fba1b2e05e19a27b91b5e3e64bd80597510ac0b737fc645f15801cc3835b279412e1a09ba66d50c2aa82e3f64b05b0f9ee23e853d9c134984c27b5b58d14b70c4dacea9a5e40600e17a3",
    "0x2faa07574e263370227b938c72ca18ae40edf215067ce325ebfc36f11b1f19484923b477146618e0f36993536e7bbec8ef5346613df2fb9d53caf8d9365b4c68e3f64b05b0f9ee23e853d9c134984c27b5b58d14b70c4dacea9a5e40600e17a3",
    "0x4dccc729db7b3ad40fc9acfe257d45196427285382332a4bc6704e1ae42785474923b477146618e0f36993536e7bbec8ef5346613df2fb9d53caf8d9365b4c68e3f64b05b0f9ee23e853d9c134984c27b5b58d14b70c4dacea9a5e40600e17a3",
    "0x1e9348730aee854752d72b32f4eed96ad80093807b53f3a07068536ce96d0e9aad3228b676f7d3cd4284a5443f17f1962b36e491b30a40b2405849e597ba5fb51ab784a49394ced1b194ec2cac2163a6a5a0108e31a2510f82162f3d41b79962",
    "0x7a570fedf4656f3240f44fb4771c946ea688c554f82e204778b792013b29ded3ad3228b676f7d3cd4284a5443f17f1962b36e491b30a40b2405849e597ba5fb51ab784a49394ced1b194ec2cac2163a6a5a0108e31a2510f82162f3d41b79962"
  ],
  "TokenLeaves": [
    {
      "Token": "0x1006dd1b8c3d0ef53489bed27577c75299f71473",
      "CumulativeEarnings": 1000000000000000000
    },
    {
      "Token": "0x11a4b85eab283c98d27c8ae64469224d55ed1894",
      "CumulativeEarnings": 400000000000000000
    },
    {
      "Token": "0x43afffbe0afacdabe9ce7dbc4f07407a2b788a84",
      "CumulativeEarnings": 30000000000000000000
    },
    {
      "Token": "0x748a3ed7e6b04239150d7ebe12d7aef3e3994a23",
      "CumulativeEarnings": 250000000000
    },
    {
      "Token": "0xd275b23e0a5b68ae251b0dc4c81104cba36e7cd6",
      "CumulativeEarnings": 884300000000000000
    },
    {
      "Token": "0xec562acb9e470de27dca2495950660fa9fbd85f8",
      "CumulativeEarnings": 42000000000000
    }
  ],
  "TokenTreeProofsNum": 6,
  "TokenLeavesNum": 6
}
````

## File: src/test/test-data/rewardsCoordinator/processClaimProofs_Root2.json
````json
{
  "Root": "0x4d58d15093f392176c29504b94be56fb4969cf100083b6e8d3c79373f2d25974",
  "RootIndex": 0,
  "EarnerIndex": 3,
  "EarnerTreeProof": "0xa9ed93ecba6058bc5cfab91319b40d344e7c829fb40eb26208e2898cb90071ed3bcd0aa5a1fbb1782053d35aaec2c6203ff53f6d6493100bafbf9506c7a3edf2bbcc90923e3f236d88ec22330aa91f3f50c425bc56ad3ff9707c72dcf853e206",
  "EarnerLeaf": {
    "Earner": "0xf2288d736d27c1584ebf7be5f52f9e4d47251aee",
    "EarnerTokenRoot": "0x6eeac100b8cd705b92cda3015844005d918e118a3c7ba20046b6523cdc203d48"
  },
  "LeafIndices": [
    0,
    1,
    2,
    3,
    4,
    5
  ],
  "TokenTreeProofs": [
    "0x57898ab69c4024d674e8c18eea33fef5cd76c5b01e0f93ef168c602298f7b27ee2b46f44bc74268bc383609078e0217a0ea21d6a658975171f5233c1cd3133c0797252a751b45d9f15ef34a230f200a1c8bb69cdbbfb1fead4a3fd0f792fda58",
    "0x97a04c80233ddc54eccd67a57f442c63c8f741079f41d95dd6242e275dcbe871e2b46f44bc74268bc383609078e0217a0ea21d6a658975171f5233c1cd3133c0797252a751b45d9f15ef34a230f200a1c8bb69cdbbfb1fead4a3fd0f792fda58",
    "0xb0f239391b892c4b6f4ce0fea0a15de171f977f6798713e540b3493b93b557ffb9cf5ff8530c7a7932e4349c3c4d0172466b77e791a4e8bb1523fdb57c1fe96a797252a751b45d9f15ef34a230f200a1c8bb69cdbbfb1fead4a3fd0f792fda58",
    "0x71a2384092132151928d8a13f599e52ad0aebe5587aa1cac9199d782c08847e2b9cf5ff8530c7a7932e4349c3c4d0172466b77e791a4e8bb1523fdb57c1fe96a797252a751b45d9f15ef34a230f200a1c8bb69cdbbfb1fead4a3fd0f792fda58",
    "0xf8b6a59d2da40bb3c9a9fed1f77336c45e3550f34b8bcb76fa64adcf6d9a409dad3228b676f7d3cd4284a5443f17f1962b36e491b30a40b2405849e597ba5fb508231e83c23fa7d9b9a2820a400601f21f946161a3817010724592cf53cf4ad9",
    "0x87fa7a4daeedebd0069679c39d095a21293b412f6f9fdae3398b454160703e3bad3228b676f7d3cd4284a5443f17f1962b36e491b30a40b2405849e597ba5fb508231e83c23fa7d9b9a2820a400601f21f946161a3817010724592cf53cf4ad9"
  ],
  "TokenLeaves": [
    {
      "Token": "0x1006dd1b8c3d0ef53489bed27577c75299f71473",
      "CumulativeEarnings": 1630000000000000000
    },
    {
      "Token": "0x11a4b85eab283c98d27c8ae64469224d55ed1894",
      "CumulativeEarnings": 780000000000000000
    },
    {
      "Token": "0x43afffbe0afacdabe9ce7dbc4f07407a2b788a84",
      "CumulativeEarnings": 37800000000000000000
    },
    {
      "Token": "0x748a3ed7e6b04239150d7ebe12d7aef3e3994a23",
      "CumulativeEarnings": 5050000000000
    },
    {
      "Token": "0xd275b23e0a5b68ae251b0dc4c81104cba36e7cd6",
      "CumulativeEarnings": 2284300000000000000
    },
    {
      "Token": "0xec562acb9e470de27dca2495950660fa9fbd85f8",
      "CumulativeEarnings": 886400000000000
    }
  ],
  "TokenTreeProofsNum": 6,
  "TokenLeavesNum": 6
}
````

## File: src/test/test-data/rewardsCoordinator/processClaimProofs_Root3.json
````json
{
  "Root": "0x53d76498642862250c1caa8b14df55642d977200467a3dfce62e6da30b4820c6",
  "RootIndex": 0,
  "EarnerIndex": 3,
  "EarnerTreeProof": "0xecd8c0e6d2d221742f8025acd6f1f0a5ff8482fe8f1cb135439e346df6fd56acce4f8a04a8bcb37dcbc11cb6984ba73cfa4da51dd037f7be27c257cf0605673b38d2f9a729da60cd7c3c2b7ff53bebfdef61de0871518eb36654368ac584b6b8",
  "EarnerLeaf": {
    "Earner": "0xf2288d736d27c1584ebf7be5f52f9e4d47251aee",
    "EarnerTokenRoot": "0x36c11c299ad4a8b95a795d6afc1f5f958b9d1a1ea5cc13ea2fc59b6ccd4b6ee4"
  },
  "LeafIndices": [
    0,
    1,
    2,
    3,
    4,
    5
  ],
  "TokenTreeProofs": [
    "0xfcf8546a323ba4d4bcfbdb5930b3bede1e93ec4bdd8d1372ed84db3126df143fb306484eeaece55c5cd8db0ce3f3a77f4aa6fa5150b95db06b9c1cec4825aae157a8dfba810f55acf97f229426649e26f6fe58886e1edcb404535334da43d92d",
    "0xde4e83fd8b6b5e44f72fd511cd1a9ce6704f16378e5ca20c15f4d52efe27aa57b306484eeaece55c5cd8db0ce3f3a77f4aa6fa5150b95db06b9c1cec4825aae157a8dfba810f55acf97f229426649e26f6fe58886e1edcb404535334da43d92d",
    "0x67f846894f21973d7db36e6b363141b291b2f0f57bfc4b9a74b4f5335c0d068a17aac423247fab5821f643830b49570dfdecd0f30a9ae24ff5fd59bd4e9e8a4e57a8dfba810f55acf97f229426649e26f6fe58886e1edcb404535334da43d92d",
    "0xc27217da67ce7b0418f5c8bef4ceeefe04c5561ddd73ab9750798d8f981d981d17aac423247fab5821f643830b49570dfdecd0f30a9ae24ff5fd59bd4e9e8a4e57a8dfba810f55acf97f229426649e26f6fe58886e1edcb404535334da43d92d",
    "0xd084816ad70c189dbfa8be4e6b1f912edb6fe3b39ba1c19c4ed16d91b84f903dad3228b676f7d3cd4284a5443f17f1962b36e491b30a40b2405849e597ba5fb550d72c280c9bd978b5ef45c3647daa2ab564342c473cb977f35b053706ed19d1",
    "0x2bec75e7737677b586943a2292393137cad6617ac248d249d220afb3bf31f4dcad3228b676f7d3cd4284a5443f17f1962b36e491b30a40b2405849e597ba5fb550d72c280c9bd978b5ef45c3647daa2ab564342c473cb977f35b053706ed19d1"
  ],
  "TokenLeaves": [
    {
      "Token": "0x1006dd1b8c3d0ef53489bed27577c75299f71473",
      "CumulativeEarnings": 3500000000000000000
    },
    {
      "Token": "0x11a4b85eab283c98d27c8ae64469224d55ed1894",
      "CumulativeEarnings": 1240000000000000000
    },
    {
      "Token": "0x43afffbe0afacdabe9ce7dbc4f07407a2b788a84",
      "CumulativeEarnings": 56800000000000000000
    },
    {
      "Token": "0x748a3ed7e6b04239150d7ebe12d7aef3e3994a23",
      "CumulativeEarnings": 8900000000000
    },
    {
      "Token": "0xd275b23e0a5b68ae251b0dc4c81104cba36e7cd6",
      "CumulativeEarnings": 4343000000000000000
    },
    {
      "Token": "0xec562acb9e470de27dca2495950660fa9fbd85f8",
      "CumulativeEarnings": 1064000000000000
    }
  ],
  "TokenTreeProofsNum": 6,
  "TokenLeavesNum": 6
}
````

## File: src/test/test-data/rewardsCoordinator/processClaimProofs_SingleEarnerLeaf.json
````json
{
  "Root": "0xd4aa4d1bdb95eb78f061238d587609407301a05bd952334ad6b5e8ca60bb347e",
  "RootIndex": 0,
  "EarnerIndex": 0,
  "EarnerTreeProof": "0x",
  "EarnerLeaf": {
    "Earner": "0x0d6ba28b9919cfcdb6b233469cc5ce30b979e08e",
    "EarnerTokenRoot": "0x12104ce9deb6e62ef479656476be1da6d71905234252cf9a5c9733e6cb115d77"
  },
  "LeafIndices": [
    0,
    2,
    3
  ],
  "TokenTreeProofs": [
    "0xf027f6a1f6522a5ede64f16448001378272bcc3b4d9b2660f241ea87d4cafc880d5fa8201813790dcfddb37966811813117ab78db2cce941c8b1d1f3888cccca6271c73f26f5e492cc990b25f85410beaf6f04958410162dc16eb5e3ce4791ce",
    "0x9ae7a20b0f244cb25a1c18339432139587ecc0058130e9ebb10a98049981395d5bef23d3c6b22f7b1265e30a68e83b675394ea57b7fa150f5ecc07bae7e3b88d6271c73f26f5e492cc990b25f85410beaf6f04958410162dc16eb5e3ce4791ce",
    "0x31335a07ff9047e08d712967b2ef1720f8682cb696d9df15902602b0c5eebdde5bef23d3c6b22f7b1265e30a68e83b675394ea57b7fa150f5ecc07bae7e3b88d6271c73f26f5e492cc990b25f85410beaf6f04958410162dc16eb5e3ce4791ce"
  ],
  "TokenLeaves": [
    {
      "Token": "0x1006dd1b8c3d0ef53489bed27577c75299f71473",
      "CumulativeEarnings": 1000000000000000000
    },
    {
      "Token": "0x43afffbe0afacdabe9ce7dbc4f07407a2b788a84",
      "CumulativeEarnings": 3000000000000000000
    },
    {
      "Token": "0x748a3ed7e6b04239150d7ebe12d7aef3e3994a23",
      "CumulativeEarnings": 1000000000000000000
    }
  ],
  "TokenTreeProofsNum": 3,
  "TokenLeavesNum": 3
}
````

## File: src/test/test-data/rewardsCoordinator/processClaimProofs_SingleTokenLeaf.json
````json
{
  "Root": "0x86867b737e68a56280554c0447ac6b43ba1cb68f4a46d1d9a0ecb919f912959b",
  "RootIndex": 0,
  "EarnerIndex": 3,
  "EarnerTreeProof": "0x04da796e892869089dfdaae7269c8eb12548f6aa3774a747322b65c42d1ca0050d38d6d5e7e9e65ba24c275fcc0f0c377d8fb6ed089770d849c39a1829d1edf27e78a529aa8f867a3777f97541a23fb1844d6ae24c3b8ca1cc981510e5d08bda",
  "EarnerLeaf": {
    "Earner": "0xf2288d736d27c1584ebf7be5f52f9e4d47251aee",
    "EarnerTokenRoot": "0x167f18d55815451f979244946b7eb2ce019c323a9e02fba1b2e05e19a27b91b5"
  },
  "LeafIndices": [
    0
  ],
  "TokenTreeProofs": [
    "0x"
  ],
  "TokenLeaves": [
    {
      "Token": "0x1006dd1b8c3d0ef53489bed27577c75299f71473",
      "CumulativeEarnings": 1000000000000000000
    }
  ],
  "TokenTreeProofsNum": 1,
  "TokenLeavesNum": 1
}
````

## File: src/test/test-data/slashedProofs/balanceUpdateProof_notOvercommitted_61511_incrementedBlockBy100.json
````json
{
    "validatorIndex": 61511,
    "beaconStateRoot": "0xe9537d65c51eb2c5b09330a10eacac64dce5a1c5298e455dd8705aef2a2a0c90",
    "slotRoot": "0x4733030000000000000000000000000000000000000000000000000000000000",
    "balanceRoot": "0x000000000000000043b2983307000000b9d8243007000000e5015b7307000000",
    "latestBlockHeaderRoot": "0x44e54c4f1192d7cceaea02be1f3e680b480ff3474e004aaa5c78a8e1543f0d54",
    "slotProof": [
        "0x79610ba1d515acf1fc35d9aa230071dfac431ccd2d2d54109df6930baa9e6417",
        "0x074b37317c897ad7f622e4f3a783a129f8bf1fb60fb0e96dff12f47bc76ed504",
        "0x98515b0e3e59aaf4758c87e5b204c884f7ab9e874ae1063ebb00b16ae3c4a30d",
        "0x5024e63e2e208d43769955eeeeb3db9dfed9b2d65e965ace30a60096dbeccede",
        "0x8ce2046003484702394d963638c95fb59d0f32da8e2060a33918836be89ff074"
    ],
    "ValidatorBalanceProof": [
        "0x000000000000000068d059730700000000000000000000000000000000000000",
        "0x7f5d365ccd831acbbbda52bca33268dd3153d69d29602a4f1b27c28838dd2ccf",
        "0xa8556dd2b415efe9ea077acd637059f02112fe070e26e29bd56a1c1a281f3edb",
        "0x11e8a9a28b280f0ea331f9f34a963aa493087147001ab12812df39f82258000f",
        "0x128ef0eb187fb5343e67b9d4c60826cb3ccba55f32169d4d5d0e203e0abf51c8",
        "0x8de5b7a778b0cc4f3cc5fcfdfe00a2a7b326c6096300fc7a2e132fe7328003a9",
        "0x9050635d2238a7ddd92f956cb6c444805881635901510604a2ccb2c6d709455d",
        "0xda56d579f6cecdf3ea6a31550aaba7f1233b07f58db6730ecdd0c929ed445f53",
        "0x4a7aadbb3b9721060adbe14ce124730853dc8ddadb8fe1608c0784f1ef35e262",
        "0xce105221b70ce96b926af197858c7f703f78f6f772565e49a977426e3622d527",
        "0xa73aa71c2dcc22d07a4d636bea5e207b0610206bd095d1715ea8cf394aeca03d",
        "0x482c8b89f16d57347c143f3e9102b63c4e56d0ef11f7fc68a498407b845ff1ae",
        "0xef9636e6ce536e011368ef2950aa56b8c2551af78c65e6076a16ff34ae984530",
        "0x38f4e0d211be2dc4aff4f85c215f042369f2ac780831369a2287eacb6d30104d",
        "0xb58d900f5e182e3c50ef74969ea16c7726c549757cc23523c369587da7293784",
        "0xd49a7502ffcfb0340b1d7885688500ca308161a7f96b62df9d083b71fcc8f2bb",
        "0x8fe6b1689256c0d385f42f5bbe2027a22c1996e110ba97c171d3e5948de92beb",
        "0x8d0d63c39ebade8509e0ae3c9c3876fb5fa112be18f905ecacfecb92057603ab",
        "0x95eec8b2e541cad4e91de38385f2e046619f54496c2382cb6cacd5b98c26f5a4",
        "0xf893e908917775b62bff23294dbbe3a1cd8e6cc1c35b4801887b646a6f81f17f",
        "0xcddba7b592e3133393c16194fac7431abf2f5485ed711db282183c819e08ebaa",
        "0x8a8d7fe3af8caa085a7639a832001457dfb9128a8061142ad0335629ff23ff9c",
        "0xfeb3c337d7a51a6fbf00b9e34c52e1c9195c969bd4e7a0bfd51d5c5bed9c1167",
        "0xe71f0aa83cc32edfbefa9f4d3e0174ca85182eec9f3a09f6a6c0df6377a510d7",
        "0x31206fa80a50bb6abe29085058f16212212a60eec8f049fecb92d8c8e0a84bc0",
        "0x21352bfecbeddde993839f614c3dac0a3ee37543f9b412b16199dc158e23b544",
        "0x619e312724bb6d7c3153ed9de791d764a366b389af13c58bf8a8d90481a46765",
        "0x7cdd2986268250628d0c10e385c58c6191e6fbe05191bcc04f133f2cea72c1c4",
        "0x848930bd7ba8cac54661072113fb278869e07bb8587f91392933374d017bcbe1",
        "0x8869ff2c22b28cc10510d9853292803328be4fb0e80495e8bb8d271f5b889636",
        "0xb5fe28e79f1b850f8658246ce9b6a1e7b49fc06db7143e8fe0b4f2b0c5523a5c",
        "0x985e929f70af28d0bdd1a90a808f977f597c7c778c489e98d3bd8910d31ac0f7",
        "0xc6f67e02e6e4e1bdefb994c6098953f34636ba2b6ca20a4721d2b26a886722ff",
        "0x1c9a7e5ff1cf48b4ad1582d3f4e4a1004f3b20d8c5a2b71387a4254ad933ebc5",
        "0x2f075ae229646b6f6aed19a5e372cf295081401eb893ff599b3f9acc0c0d3e7d",
        "0x328921deb59612076801e8cd61592107b5c67c79b846595cc6320c395b46362c",
        "0xbfb909fdb236ad2411b4e4883810a074b840464689986c3f8a8091827e17c327",
        "0x55d8fb3687ba3ba49f342c77f5a1f89bec83d811446e1a467139213d640b6a74",
        "0x1ff9000000000000000000000000000000000000000000000000000000000000",
        "0xe3a4221e582bef1ce66e057107d2423d8a4af2ceef50973ab5c5b9a2c1fba14b",
        "0x64b4054633cff8782678efebd075563f7eb509431378ec880a8280c897e13190",
        "0xbdabb1a249ef55a056128614d113e85bb6f6899e7169050dcc88407406f0ace0",
        "0x234714ee1e90e736bbabeec9d26875e76b86300d657304aa762e5f5a05d57f55",
        "0x8ce2046003484702394d963638c95fb59d0f32da8e2060a33918836be89ff074"
    ],
    "ValidatorFields": [
        "0x15c3c57049dbbd86d6a6cb7cd7637512c5c0ba23b582e3e9b5a9bd71e2fb6146",
        "0x01000000000000000000000049c486e3f4303bc11c02f952fe5b08d0ab22d443",
        "0xe5015b7307000000000000000000000000000000000000000000000000000000",
        "0x0100000000000000000000000000000000000000000000000000000000000000",
        "0x6502000000000000000000000000000000000000000000000000000000000000",
        "0x6c02000000000000000000000000000000000000000000000000000000000000",
        "0x0908000000000000000000000000000000000000000000000000000000000000",
        "0x0428000000000000000000000000000000000000000000000000000000000000"
    ],
    "LatestBlockHeaderProof": [
        "0x8c0d5a3b8b10a624d22494560f6a657d2ef8513f4e05e3d1a9b4e51589ccb3d6",
        "0x4e70fb71e677e500e00ca1234f5e540aaffa0df03c12a0f92f921e76845187b3",
        "0x5a6544be083c70c87ff98d129a5bf434d62c73999c25230c2bff2f2e2d555b21",
        "0x5024e63e2e208d43769955eeeeb3db9dfed9b2d65e965ace30a60096dbeccede",
        "0x8ce2046003484702394d963638c95fb59d0f32da8e2060a33918836be89ff074"
    ],
    "WithdrawalCredentialProof": [
        "0x71bd8878bd97df4ceb7c6b5132d8b6745a6780262d5a0fa9dcb0d6f5c98115e7",
        "0x27e6e87163079873e4a956e687e2f5f852775c6c69cc1646d59ff9de87ffdfec",
        "0x7d3ec7b5b0603ec79644358dbeea0613df717f2e90271efeee665c25f99806a9",
        "0x198cf23e2a594f99cc6fb0bd71728ae43f64d3aeecbbbd73b42e7f9d91ab112b",
        "0x1a2ae162dcb33b34412a1b76d296d043b6e4a092ac17a31ff688f125a71efc5c",
        "0x22b7f97d9cf16bb59b5bd032833bc428eba10283db93184e3e8f58e840376c4a",
        "0x2d7294482a48d1fa33db6d09459c5ef98c5b4f063f1d8abb2968f6ff2553cea1",
        "0x3cf02972a98b6349570d638662c6c359fd67d51da4ebb84c78a616bf57031be3",
        "0x91efbc4e73550db8404d9df7819c1a93474a2dac866fe503936751f9c8aa52ce",
        "0x5e4d2fde7fd736c48b6d997064515f12c5b870573f822571d575ad9ec4330d37",
        "0x65cdebb1d68f7e5f9f4b367cf30b781ffc2c630afd87821d98dcdf31f8216147",
        "0x7d35223de45ed1780d9c5fa6d8c4f777b819433c3e585a41d1ebfcb33de180f8",
        "0xa248de567404ec7a47f3c27b498c2b9e6318d2de870b0e076a4689ccd32f4713",
        "0xf00f90e9671a1decbdf18b1ad2247fd9192f1be793818c2c303ee607f43876f0",
        "0xe5ae53bbdf410ecdecbbf58c7b3a4f9ee0885535ef95a3d5a34b69b32da31c07",
        "0x04c321478671bf8864f28399bfd02a4d534ed2d35a402ae97b5a223483bbaebd",
        "0x8fe6b1689256c0d385f42f5bbe2027a22c1996e110ba97c171d3e5948de92beb",
        "0x8d0d63c39ebade8509e0ae3c9c3876fb5fa112be18f905ecacfecb92057603ab",
        "0x95eec8b2e541cad4e91de38385f2e046619f54496c2382cb6cacd5b98c26f5a4",
        "0xf893e908917775b62bff23294dbbe3a1cd8e6cc1c35b4801887b646a6f81f17f",
        "0xcddba7b592e3133393c16194fac7431abf2f5485ed711db282183c819e08ebaa",
        "0x8a8d7fe3af8caa085a7639a832001457dfb9128a8061142ad0335629ff23ff9c",
        "0xfeb3c337d7a51a6fbf00b9e34c52e1c9195c969bd4e7a0bfd51d5c5bed9c1167",
        "0xe71f0aa83cc32edfbefa9f4d3e0174ca85182eec9f3a09f6a6c0df6377a510d7",
        "0x31206fa80a50bb6abe29085058f16212212a60eec8f049fecb92d8c8e0a84bc0",
        "0x21352bfecbeddde993839f614c3dac0a3ee37543f9b412b16199dc158e23b544",
        "0x619e312724bb6d7c3153ed9de791d764a366b389af13c58bf8a8d90481a46765",
        "0x7cdd2986268250628d0c10e385c58c6191e6fbe05191bcc04f133f2cea72c1c4",
        "0x848930bd7ba8cac54661072113fb278869e07bb8587f91392933374d017bcbe1",
        "0x8869ff2c22b28cc10510d9853292803328be4fb0e80495e8bb8d271f5b889636",
        "0xb5fe28e79f1b850f8658246ce9b6a1e7b49fc06db7143e8fe0b4f2b0c5523a5c",
        "0x985e929f70af28d0bdd1a90a808f977f597c7c778c489e98d3bd8910d31ac0f7",
        "0xc6f67e02e6e4e1bdefb994c6098953f34636ba2b6ca20a4721d2b26a886722ff",
        "0x1c9a7e5ff1cf48b4ad1582d3f4e4a1004f3b20d8c5a2b71387a4254ad933ebc5",
        "0x2f075ae229646b6f6aed19a5e372cf295081401eb893ff599b3f9acc0c0d3e7d",
        "0x328921deb59612076801e8cd61592107b5c67c79b846595cc6320c395b46362c",
        "0xbfb909fdb236ad2411b4e4883810a074b840464689986c3f8a8091827e17c327",
        "0x55d8fb3687ba3ba49f342c77f5a1f89bec83d811446e1a467139213d640b6a74",
        "0xf7210d4f8e7e1039790e7bf4efa207555a10a6db1dd4b95da313aaa88b88fe76",
        "0xad21b516cbc645ffe34ab5de1c8aef8cd4e7f8d2b51e8e1456adc7563cda206f",
        "0x1ff9000000000000000000000000000000000000000000000000000000000000",
        "0x7c0b000000000000000000000000000000000000000000000000000000000000",
        "0x23453ac8b60d1e35c7b111a0a5a5fb5621007fc454a17d5099d4290c99d7cf5b",
        "0x3626feb0eee255fd0fb5296d2984a905827a482a26234a8632e810d2355eeeaf",
        "0x234714ee1e90e736bbabeec9d26875e76b86300d657304aa762e5f5a05d57f55",
        "0x8ce2046003484702394d963638c95fb59d0f32da8e2060a33918836be89ff074"
    ]
}
````

## File: src/test/test-data/slashedProofs/balanceUpdateProof_notOvercommitted_61511.json
````json
{
    "validatorIndex": 61511,
    "beaconStateRoot": "0x4ee7c0f1277c3675d938680918b5b495ba5a9825ded9f007aa8a820548240520",
    "slotRoot": "0xe332030000000000000000000000000000000000000000000000000000000000",
    "balanceRoot": "0x000000000000000043b2983307000000b9d8243007000000e5015b7307000000",
    "latestBlockHeaderRoot": "0x44e54c4f1192d7cceaea02be1f3e680b480ff3474e004aaa5c78a8e1543f0d54",
    "slotProof": [
        "0x79610ba1d515acf1fc35d9aa230071dfac431ccd2d2d54109df6930baa9e6417",
        "0x074b37317c897ad7f622e4f3a783a129f8bf1fb60fb0e96dff12f47bc76ed504",
        "0x98515b0e3e59aaf4758c87e5b204c884f7ab9e874ae1063ebb00b16ae3c4a30d",
        "0x5024e63e2e208d43769955eeeeb3db9dfed9b2d65e965ace30a60096dbeccede",
        "0x8ce2046003484702394d963638c95fb59d0f32da8e2060a33918836be89ff074"
    ],
    "ValidatorBalanceProof": [
        "0x000000000000000068d059730700000000000000000000000000000000000000",
        "0x7f5d365ccd831acbbbda52bca33268dd3153d69d29602a4f1b27c28838dd2ccf",
        "0xa8556dd2b415efe9ea077acd637059f02112fe070e26e29bd56a1c1a281f3edb",
        "0x11e8a9a28b280f0ea331f9f34a963aa493087147001ab12812df39f82258000f",
        "0x128ef0eb187fb5343e67b9d4c60826cb3ccba55f32169d4d5d0e203e0abf51c8",
        "0x8de5b7a778b0cc4f3cc5fcfdfe00a2a7b326c6096300fc7a2e132fe7328003a9",
        "0x9050635d2238a7ddd92f956cb6c444805881635901510604a2ccb2c6d709455d",
        "0xda56d579f6cecdf3ea6a31550aaba7f1233b07f58db6730ecdd0c929ed445f53",
        "0x4a7aadbb3b9721060adbe14ce124730853dc8ddadb8fe1608c0784f1ef35e262",
        "0xce105221b70ce96b926af197858c7f703f78f6f772565e49a977426e3622d527",
        "0xa73aa71c2dcc22d07a4d636bea5e207b0610206bd095d1715ea8cf394aeca03d",
        "0x482c8b89f16d57347c143f3e9102b63c4e56d0ef11f7fc68a498407b845ff1ae",
        "0xef9636e6ce536e011368ef2950aa56b8c2551af78c65e6076a16ff34ae984530",
        "0x38f4e0d211be2dc4aff4f85c215f042369f2ac780831369a2287eacb6d30104d",
        "0xb58d900f5e182e3c50ef74969ea16c7726c549757cc23523c369587da7293784",
        "0xd49a7502ffcfb0340b1d7885688500ca308161a7f96b62df9d083b71fcc8f2bb",
        "0x8fe6b1689256c0d385f42f5bbe2027a22c1996e110ba97c171d3e5948de92beb",
        "0x8d0d63c39ebade8509e0ae3c9c3876fb5fa112be18f905ecacfecb92057603ab",
        "0x95eec8b2e541cad4e91de38385f2e046619f54496c2382cb6cacd5b98c26f5a4",
        "0xf893e908917775b62bff23294dbbe3a1cd8e6cc1c35b4801887b646a6f81f17f",
        "0xcddba7b592e3133393c16194fac7431abf2f5485ed711db282183c819e08ebaa",
        "0x8a8d7fe3af8caa085a7639a832001457dfb9128a8061142ad0335629ff23ff9c",
        "0xfeb3c337d7a51a6fbf00b9e34c52e1c9195c969bd4e7a0bfd51d5c5bed9c1167",
        "0xe71f0aa83cc32edfbefa9f4d3e0174ca85182eec9f3a09f6a6c0df6377a510d7",
        "0x31206fa80a50bb6abe29085058f16212212a60eec8f049fecb92d8c8e0a84bc0",
        "0x21352bfecbeddde993839f614c3dac0a3ee37543f9b412b16199dc158e23b544",
        "0x619e312724bb6d7c3153ed9de791d764a366b389af13c58bf8a8d90481a46765",
        "0x7cdd2986268250628d0c10e385c58c6191e6fbe05191bcc04f133f2cea72c1c4",
        "0x848930bd7ba8cac54661072113fb278869e07bb8587f91392933374d017bcbe1",
        "0x8869ff2c22b28cc10510d9853292803328be4fb0e80495e8bb8d271f5b889636",
        "0xb5fe28e79f1b850f8658246ce9b6a1e7b49fc06db7143e8fe0b4f2b0c5523a5c",
        "0x985e929f70af28d0bdd1a90a808f977f597c7c778c489e98d3bd8910d31ac0f7",
        "0xc6f67e02e6e4e1bdefb994c6098953f34636ba2b6ca20a4721d2b26a886722ff",
        "0x1c9a7e5ff1cf48b4ad1582d3f4e4a1004f3b20d8c5a2b71387a4254ad933ebc5",
        "0x2f075ae229646b6f6aed19a5e372cf295081401eb893ff599b3f9acc0c0d3e7d",
        "0x328921deb59612076801e8cd61592107b5c67c79b846595cc6320c395b46362c",
        "0xbfb909fdb236ad2411b4e4883810a074b840464689986c3f8a8091827e17c327",
        "0x55d8fb3687ba3ba49f342c77f5a1f89bec83d811446e1a467139213d640b6a74",
        "0x1ff9000000000000000000000000000000000000000000000000000000000000",
        "0xe3a4221e582bef1ce66e057107d2423d8a4af2ceef50973ab5c5b9a2c1fba14b",
        "0x64b4054633cff8782678efebd075563f7eb509431378ec880a8280c897e13190",
        "0xbdabb1a249ef55a056128614d113e85bb6f6899e7169050dcc88407406f0ace0",
        "0x4092a1ba83f037b714a1d8ce4cbdcbeacc0b4af46535d35327f824c2aa0f6bc6",
        "0x8ce2046003484702394d963638c95fb59d0f32da8e2060a33918836be89ff074"
    ],
    "ValidatorFields": [
        "0x15c3c57049dbbd86d6a6cb7cd7637512c5c0ba23b582e3e9b5a9bd71e2fb6146",
        "0x01000000000000000000000049c486e3f4303bc11c02f952fe5b08d0ab22d443",
        "0xe5015b7307000000000000000000000000000000000000000000000000000000",
        "0x0100000000000000000000000000000000000000000000000000000000000000",
        "0x6502000000000000000000000000000000000000000000000000000000000000",
        "0x6c02000000000000000000000000000000000000000000000000000000000000",
        "0x0908000000000000000000000000000000000000000000000000000000000000",
        "0x0428000000000000000000000000000000000000000000000000000000000000"
    ],
    "LatestBlockHeaderProof": [
        "0x8c0d5a3b8b10a624d22494560f6a657d2ef8513f4e05e3d1a9b4e51589ccb3d6",
        "0x4e70fb71e677e500e00ca1234f5e540aaffa0df03c12a0f92f921e76845187b3",
        "0xb416255e46f0d0233446299dc4a66f39b045b05aefa97591acc98d9b043d4aa5",
        "0x5024e63e2e208d43769955eeeeb3db9dfed9b2d65e965ace30a60096dbeccede",
        "0x8ce2046003484702394d963638c95fb59d0f32da8e2060a33918836be89ff074"
    ],
    "WithdrawalCredentialProof": [
        "0x71bd8878bd97df4ceb7c6b5132d8b6745a6780262d5a0fa9dcb0d6f5c98115e7",
        "0x27e6e87163079873e4a956e687e2f5f852775c6c69cc1646d59ff9de87ffdfec",
        "0x7d3ec7b5b0603ec79644358dbeea0613df717f2e90271efeee665c25f99806a9",
        "0x198cf23e2a594f99cc6fb0bd71728ae43f64d3aeecbbbd73b42e7f9d91ab112b",
        "0x1a2ae162dcb33b34412a1b76d296d043b6e4a092ac17a31ff688f125a71efc5c",
        "0x22b7f97d9cf16bb59b5bd032833bc428eba10283db93184e3e8f58e840376c4a",
        "0x2d7294482a48d1fa33db6d09459c5ef98c5b4f063f1d8abb2968f6ff2553cea1",
        "0x3cf02972a98b6349570d638662c6c359fd67d51da4ebb84c78a616bf57031be3",
        "0x91efbc4e73550db8404d9df7819c1a93474a2dac866fe503936751f9c8aa52ce",
        "0x5e4d2fde7fd736c48b6d997064515f12c5b870573f822571d575ad9ec4330d37",
        "0x65cdebb1d68f7e5f9f4b367cf30b781ffc2c630afd87821d98dcdf31f8216147",
        "0x7d35223de45ed1780d9c5fa6d8c4f777b819433c3e585a41d1ebfcb33de180f8",
        "0xa248de567404ec7a47f3c27b498c2b9e6318d2de870b0e076a4689ccd32f4713",
        "0xf00f90e9671a1decbdf18b1ad2247fd9192f1be793818c2c303ee607f43876f0",
        "0xe5ae53bbdf410ecdecbbf58c7b3a4f9ee0885535ef95a3d5a34b69b32da31c07",
        "0x04c321478671bf8864f28399bfd02a4d534ed2d35a402ae97b5a223483bbaebd",
        "0x8fe6b1689256c0d385f42f5bbe2027a22c1996e110ba97c171d3e5948de92beb",
        "0x8d0d63c39ebade8509e0ae3c9c3876fb5fa112be18f905ecacfecb92057603ab",
        "0x95eec8b2e541cad4e91de38385f2e046619f54496c2382cb6cacd5b98c26f5a4",
        "0xf893e908917775b62bff23294dbbe3a1cd8e6cc1c35b4801887b646a6f81f17f",
        "0xcddba7b592e3133393c16194fac7431abf2f5485ed711db282183c819e08ebaa",
        "0x8a8d7fe3af8caa085a7639a832001457dfb9128a8061142ad0335629ff23ff9c",
        "0xfeb3c337d7a51a6fbf00b9e34c52e1c9195c969bd4e7a0bfd51d5c5bed9c1167",
        "0xe71f0aa83cc32edfbefa9f4d3e0174ca85182eec9f3a09f6a6c0df6377a510d7",
        "0x31206fa80a50bb6abe29085058f16212212a60eec8f049fecb92d8c8e0a84bc0",
        "0x21352bfecbeddde993839f614c3dac0a3ee37543f9b412b16199dc158e23b544",
        "0x619e312724bb6d7c3153ed9de791d764a366b389af13c58bf8a8d90481a46765",
        "0x7cdd2986268250628d0c10e385c58c6191e6fbe05191bcc04f133f2cea72c1c4",
        "0x848930bd7ba8cac54661072113fb278869e07bb8587f91392933374d017bcbe1",
        "0x8869ff2c22b28cc10510d9853292803328be4fb0e80495e8bb8d271f5b889636",
        "0xb5fe28e79f1b850f8658246ce9b6a1e7b49fc06db7143e8fe0b4f2b0c5523a5c",
        "0x985e929f70af28d0bdd1a90a808f977f597c7c778c489e98d3bd8910d31ac0f7",
        "0xc6f67e02e6e4e1bdefb994c6098953f34636ba2b6ca20a4721d2b26a886722ff",
        "0x1c9a7e5ff1cf48b4ad1582d3f4e4a1004f3b20d8c5a2b71387a4254ad933ebc5",
        "0x2f075ae229646b6f6aed19a5e372cf295081401eb893ff599b3f9acc0c0d3e7d",
        "0x328921deb59612076801e8cd61592107b5c67c79b846595cc6320c395b46362c",
        "0xbfb909fdb236ad2411b4e4883810a074b840464689986c3f8a8091827e17c327",
        "0x55d8fb3687ba3ba49f342c77f5a1f89bec83d811446e1a467139213d640b6a74",
        "0xf7210d4f8e7e1039790e7bf4efa207555a10a6db1dd4b95da313aaa88b88fe76",
        "0xad21b516cbc645ffe34ab5de1c8aef8cd4e7f8d2b51e8e1456adc7563cda206f",
        "0x1ff9000000000000000000000000000000000000000000000000000000000000",
        "0x7c0b000000000000000000000000000000000000000000000000000000000000",
        "0x23453ac8b60d1e35c7b111a0a5a5fb5621007fc454a17d5099d4290c99d7cf5b",
        "0x3626feb0eee255fd0fb5296d2984a905827a482a26234a8632e810d2355eeeaf",
        "0x4092a1ba83f037b714a1d8ce4cbdcbeacc0b4af46535d35327f824c2aa0f6bc6",
        "0x8ce2046003484702394d963638c95fb59d0f32da8e2060a33918836be89ff074"
    ]
}
````

## File: src/test/test-data/slashedProofs/balanceUpdateProof_Overcommitted_61511.json
````json
{
    "validatorIndex": 61511,
    "beaconStateRoot": "0xedfa8c363b420fd244477dc823f58f33f5d431f78cdbb7faac607597b5efad94",
    "slotRoot": "0xe332030000000000000000000000000000000000000000000000000000000000",
    "balanceRoot": "0x000000000000000043b2983307000000b9d82430070000006c0cec3007000000",
    "latestBlockHeaderRoot": "0x44e54c4f1192d7cceaea02be1f3e680b480ff3474e004aaa5c78a8e1543f0d54",
    "slotProof": [
        "0x79610ba1d515acf1fc35d9aa230071dfac431ccd2d2d54109df6930baa9e6417",
        "0x074b37317c897ad7f622e4f3a783a129f8bf1fb60fb0e96dff12f47bc76ed504",
        "0x98515b0e3e59aaf4758c87e5b204c884f7ab9e874ae1063ebb00b16ae3c4a30d",
        "0xaa07ea4616f5ee64aae9543c79e7370b2f9cdd82f0b94525cd7bab13d88b5cd7",
        "0x8ce2046003484702394d963638c95fb59d0f32da8e2060a33918836be89ff074"
    ],
    "ValidatorBalanceProof": [
        "0x000000000000000068d059730700000000000000000000000000000000000000",
        "0x7f5d365ccd831acbbbda52bca33268dd3153d69d29602a4f1b27c28838dd2ccf",
        "0xa8556dd2b415efe9ea077acd637059f02112fe070e26e29bd56a1c1a281f3edb",
        "0x11e8a9a28b280f0ea331f9f34a963aa493087147001ab12812df39f82258000f",
        "0x128ef0eb187fb5343e67b9d4c60826cb3ccba55f32169d4d5d0e203e0abf51c8",
        "0x8de5b7a778b0cc4f3cc5fcfdfe00a2a7b326c6096300fc7a2e132fe7328003a9",
        "0x9050635d2238a7ddd92f956cb6c444805881635901510604a2ccb2c6d709455d",
        "0xda56d579f6cecdf3ea6a31550aaba7f1233b07f58db6730ecdd0c929ed445f53",
        "0x4a7aadbb3b9721060adbe14ce124730853dc8ddadb8fe1608c0784f1ef35e262",
        "0xce105221b70ce96b926af197858c7f703f78f6f772565e49a977426e3622d527",
        "0xa73aa71c2dcc22d07a4d636bea5e207b0610206bd095d1715ea8cf394aeca03d",
        "0x482c8b89f16d57347c143f3e9102b63c4e56d0ef11f7fc68a498407b845ff1ae",
        "0xef9636e6ce536e011368ef2950aa56b8c2551af78c65e6076a16ff34ae984530",
        "0x38f4e0d211be2dc4aff4f85c215f042369f2ac780831369a2287eacb6d30104d",
        "0xb58d900f5e182e3c50ef74969ea16c7726c549757cc23523c369587da7293784",
        "0xd49a7502ffcfb0340b1d7885688500ca308161a7f96b62df9d083b71fcc8f2bb",
        "0x8fe6b1689256c0d385f42f5bbe2027a22c1996e110ba97c171d3e5948de92beb",
        "0x8d0d63c39ebade8509e0ae3c9c3876fb5fa112be18f905ecacfecb92057603ab",
        "0x95eec8b2e541cad4e91de38385f2e046619f54496c2382cb6cacd5b98c26f5a4",
        "0xf893e908917775b62bff23294dbbe3a1cd8e6cc1c35b4801887b646a6f81f17f",
        "0xcddba7b592e3133393c16194fac7431abf2f5485ed711db282183c819e08ebaa",
        "0x8a8d7fe3af8caa085a7639a832001457dfb9128a8061142ad0335629ff23ff9c",
        "0xfeb3c337d7a51a6fbf00b9e34c52e1c9195c969bd4e7a0bfd51d5c5bed9c1167",
        "0xe71f0aa83cc32edfbefa9f4d3e0174ca85182eec9f3a09f6a6c0df6377a510d7",
        "0x31206fa80a50bb6abe29085058f16212212a60eec8f049fecb92d8c8e0a84bc0",
        "0x21352bfecbeddde993839f614c3dac0a3ee37543f9b412b16199dc158e23b544",
        "0x619e312724bb6d7c3153ed9de791d764a366b389af13c58bf8a8d90481a46765",
        "0x7cdd2986268250628d0c10e385c58c6191e6fbe05191bcc04f133f2cea72c1c4",
        "0x848930bd7ba8cac54661072113fb278869e07bb8587f91392933374d017bcbe1",
        "0x8869ff2c22b28cc10510d9853292803328be4fb0e80495e8bb8d271f5b889636",
        "0xb5fe28e79f1b850f8658246ce9b6a1e7b49fc06db7143e8fe0b4f2b0c5523a5c",
        "0x985e929f70af28d0bdd1a90a808f977f597c7c778c489e98d3bd8910d31ac0f7",
        "0xc6f67e02e6e4e1bdefb994c6098953f34636ba2b6ca20a4721d2b26a886722ff",
        "0x1c9a7e5ff1cf48b4ad1582d3f4e4a1004f3b20d8c5a2b71387a4254ad933ebc5",
        "0x2f075ae229646b6f6aed19a5e372cf295081401eb893ff599b3f9acc0c0d3e7d",
        "0x328921deb59612076801e8cd61592107b5c67c79b846595cc6320c395b46362c",
        "0xbfb909fdb236ad2411b4e4883810a074b840464689986c3f8a8091827e17c327",
        "0x55d8fb3687ba3ba49f342c77f5a1f89bec83d811446e1a467139213d640b6a74",
        "0x1ff9000000000000000000000000000000000000000000000000000000000000",
        "0xe3a4221e582bef1ce66e057107d2423d8a4af2ceef50973ab5c5b9a2c1fba14b",
        "0x64b4054633cff8782678efebd075563f7eb509431378ec880a8280c897e13190",
        "0x86d33e3372cac6ef0ff823dc3a3ea92e02ea2bee1600549bdda5a914875a6e10",
        "0x4092a1ba83f037b714a1d8ce4cbdcbeacc0b4af46535d35327f824c2aa0f6bc6",
        "0x8ce2046003484702394d963638c95fb59d0f32da8e2060a33918836be89ff074"
    ],
    "ValidatorFields": [
        "0x15c3c57049dbbd86d6a6cb7cd7637512c5c0ba23b582e3e9b5a9bd71e2fb6146",
        "0x01000000000000000000000049c486e3f4303bc11c02f952fe5b08d0ab22d443",
        "0x0076be3707000000000000000000000000000000000000000000000000000000",
        "0x0100000000000000000000000000000000000000000000000000000000000000",
        "0x6502000000000000000000000000000000000000000000000000000000000000",
        "0x6c02000000000000000000000000000000000000000000000000000000000000",
        "0x0908000000000000000000000000000000000000000000000000000000000000",
        "0x0428000000000000000000000000000000000000000000000000000000000000"
    ],
    "LatestBlockHeaderProof": [
        "0x8c0d5a3b8b10a624d22494560f6a657d2ef8513f4e05e3d1a9b4e51589ccb3d6",
        "0x4e70fb71e677e500e00ca1234f5e540aaffa0df03c12a0f92f921e76845187b3",
        "0xb416255e46f0d0233446299dc4a66f39b045b05aefa97591acc98d9b043d4aa5",
        "0xaa07ea4616f5ee64aae9543c79e7370b2f9cdd82f0b94525cd7bab13d88b5cd7",
        "0x8ce2046003484702394d963638c95fb59d0f32da8e2060a33918836be89ff074"
    ],
    "WithdrawalCredentialProof": [
        "0x71bd8878bd97df4ceb7c6b5132d8b6745a6780262d5a0fa9dcb0d6f5c98115e7",
        "0x27e6e87163079873e4a956e687e2f5f852775c6c69cc1646d59ff9de87ffdfec",
        "0x7d3ec7b5b0603ec79644358dbeea0613df717f2e90271efeee665c25f99806a9",
        "0x198cf23e2a594f99cc6fb0bd71728ae43f64d3aeecbbbd73b42e7f9d91ab112b",
        "0x1a2ae162dcb33b34412a1b76d296d043b6e4a092ac17a31ff688f125a71efc5c",
        "0x22b7f97d9cf16bb59b5bd032833bc428eba10283db93184e3e8f58e840376c4a",
        "0x2d7294482a48d1fa33db6d09459c5ef98c5b4f063f1d8abb2968f6ff2553cea1",
        "0x3cf02972a98b6349570d638662c6c359fd67d51da4ebb84c78a616bf57031be3",
        "0x91efbc4e73550db8404d9df7819c1a93474a2dac866fe503936751f9c8aa52ce",
        "0x5e4d2fde7fd736c48b6d997064515f12c5b870573f822571d575ad9ec4330d37",
        "0x65cdebb1d68f7e5f9f4b367cf30b781ffc2c630afd87821d98dcdf31f8216147",
        "0x7d35223de45ed1780d9c5fa6d8c4f777b819433c3e585a41d1ebfcb33de180f8",
        "0xa248de567404ec7a47f3c27b498c2b9e6318d2de870b0e076a4689ccd32f4713",
        "0xf00f90e9671a1decbdf18b1ad2247fd9192f1be793818c2c303ee607f43876f0",
        "0xe5ae53bbdf410ecdecbbf58c7b3a4f9ee0885535ef95a3d5a34b69b32da31c07",
        "0x04c321478671bf8864f28399bfd02a4d534ed2d35a402ae97b5a223483bbaebd",
        "0x8fe6b1689256c0d385f42f5bbe2027a22c1996e110ba97c171d3e5948de92beb",
        "0x8d0d63c39ebade8509e0ae3c9c3876fb5fa112be18f905ecacfecb92057603ab",
        "0x95eec8b2e541cad4e91de38385f2e046619f54496c2382cb6cacd5b98c26f5a4",
        "0xf893e908917775b62bff23294dbbe3a1cd8e6cc1c35b4801887b646a6f81f17f",
        "0xcddba7b592e3133393c16194fac7431abf2f5485ed711db282183c819e08ebaa",
        "0x8a8d7fe3af8caa085a7639a832001457dfb9128a8061142ad0335629ff23ff9c",
        "0xfeb3c337d7a51a6fbf00b9e34c52e1c9195c969bd4e7a0bfd51d5c5bed9c1167",
        "0xe71f0aa83cc32edfbefa9f4d3e0174ca85182eec9f3a09f6a6c0df6377a510d7",
        "0x31206fa80a50bb6abe29085058f16212212a60eec8f049fecb92d8c8e0a84bc0",
        "0x21352bfecbeddde993839f614c3dac0a3ee37543f9b412b16199dc158e23b544",
        "0x619e312724bb6d7c3153ed9de791d764a366b389af13c58bf8a8d90481a46765",
        "0x7cdd2986268250628d0c10e385c58c6191e6fbe05191bcc04f133f2cea72c1c4",
        "0x848930bd7ba8cac54661072113fb278869e07bb8587f91392933374d017bcbe1",
        "0x8869ff2c22b28cc10510d9853292803328be4fb0e80495e8bb8d271f5b889636",
        "0xb5fe28e79f1b850f8658246ce9b6a1e7b49fc06db7143e8fe0b4f2b0c5523a5c",
        "0x985e929f70af28d0bdd1a90a808f977f597c7c778c489e98d3bd8910d31ac0f7",
        "0xc6f67e02e6e4e1bdefb994c6098953f34636ba2b6ca20a4721d2b26a886722ff",
        "0x1c9a7e5ff1cf48b4ad1582d3f4e4a1004f3b20d8c5a2b71387a4254ad933ebc5",
        "0x2f075ae229646b6f6aed19a5e372cf295081401eb893ff599b3f9acc0c0d3e7d",
        "0x328921deb59612076801e8cd61592107b5c67c79b846595cc6320c395b46362c",
        "0xbfb909fdb236ad2411b4e4883810a074b840464689986c3f8a8091827e17c327",
        "0x55d8fb3687ba3ba49f342c77f5a1f89bec83d811446e1a467139213d640b6a74",
        "0xf7210d4f8e7e1039790e7bf4efa207555a10a6db1dd4b95da313aaa88b88fe76",
        "0xad21b516cbc645ffe34ab5de1c8aef8cd4e7f8d2b51e8e1456adc7563cda206f",
        "0x1ff9000000000000000000000000000000000000000000000000000000000000",
        "0x7c0b000000000000000000000000000000000000000000000000000000000000",
        "0x23453ac8b60d1e35c7b111a0a5a5fb5621007fc454a17d5099d4290c99d7cf5b",
        "0x9225de1bd47ad6255b27cb59eaaeb7eabacb3cff9e7316ca06933559ef882b86",
        "0x4092a1ba83f037b714a1d8ce4cbdcbeacc0b4af46535d35327f824c2aa0f6bc6",
        "0x8ce2046003484702394d963638c95fb59d0f32da8e2060a33918836be89ff074"
    ]
}
````

## File: src/test/test-data/balanceUpdateProof_balance28ETH_302913.json
````json
{"validatorIndex":302913,"beaconStateRoot":"0x8276d4d448d27e7d41da771ca7729f7a25c01b5fcd1f18f9bd9632dc7fde1388","slotRoot":"0xfea7610000000000000000000000000000000000000000000000000000000000","balanceRoot":"0x6cba5d7307000000e5d9ef840600000008bd5d7307000000239e5d7307000000","latestBlockHeaderRoot":"0x56461a3931812e3341030121e7db0f298112576ac9e898c00f4f1338c2ad647e","ValidatorBalanceProof":["0x26805d73070000002aa55d7307000000218e5d730700000056d35d7307000000","0x24846a54724508d8394a9e30f819bc19fe6727745be4f19e1e3924b985b4b8e9","0x48fb4849c31d88b413f650c17bd55bb11fe38bcef5d234dba8532737ae78f776","0x0d7d38f90a04ef49d15ca10af0e818e227134e4b46c7b22dd10e149f2a2bc612","0xdd345235f28f92719c39c9a5042b91f814d535ae5df574c0f6cd38f77791fc2b","0x0855928643f4210d9d8d0986847674139be32ebf3db984b6d81f3ed136475b6d","0x28460d51c1ce75299f8c0dff8bca9f498fef0edc57c343bbd76592b3d6b984a3","0x068a141709053afb48698290176068f448867cba9c6ff10f986b1d02691f6e70","0x9f0958275fe6ea80b1825bcd11907d1076600719ce574ae2a609e51a975dde54","0xd43fbb18b30449f5c81148848fd6579b4f6cebfe66187bd1c36a293b22085fc2","0x7bf0aac502053da7dfd5356960db63ab48d3cc6ee5f36f41639eadacd34ac272","0x866e3b213d02f1cb86149c2472789ab9d7fb3fb52371a893dc8b6f8936ebd0c1","0xcec7cc4b82fb8dd889257128af3e4433700fcc0fb0505b431aa5f592111e785b","0xdd08667067baa43e2b41b793464a591a29643b5582c8fc9c2c045f984c5848d7","0x842ec80062a4f2f7e9d80ab408374ae42817acf5036aff40b3ade345ab196090","0xfe1ae22b8ba21fce84b25f5da3e37a91db49158b7025d6371d5a54c03adba125","0x8c039a81d68952077db2cc11713ae6f5a9ecc5ebe859c0612ff7215c0ccd7aba","0x5415d3199f1da31287d646d03c2691728396d87f7ef52c142596301e27a343ca","0x95eec8b2e541cad4e91de38385f2e046619f54496c2382cb6cacd5b98c26f5a4","0xf893e908917775b62bff23294dbbe3a1cd8e6cc1c35b4801887b646a6f81f17f","0xcddba7b592e3133393c16194fac7431abf2f5485ed711db282183c819e08ebaa","0x8a8d7fe3af8caa085a7639a832001457dfb9128a8061142ad0335629ff23ff9c","0xfeb3c337d7a51a6fbf00b9e34c52e1c9195c969bd4e7a0bfd51d5c5bed9c1167","0xe71f0aa83cc32edfbefa9f4d3e0174ca85182eec9f3a09f6a6c0df6377a510d7","0x31206fa80a50bb6abe29085058f16212212a60eec8f049fecb92d8c8e0a84bc0","0x21352bfecbeddde993839f614c3dac0a3ee37543f9b412b16199dc158e23b544","0x619e312724bb6d7c3153ed9de791d764a366b389af13c58bf8a8d90481a46765","0x7cdd2986268250628d0c10e385c58c6191e6fbe05191bcc04f133f2cea72c1c4","0x848930bd7ba8cac54661072113fb278869e07bb8587f91392933374d017bcbe1","0x8869ff2c22b28cc10510d9853292803328be4fb0e80495e8bb8d271f5b889636","0xb5fe28e79f1b850f8658246ce9b6a1e7b49fc06db7143e8fe0b4f2b0c5523a5c","0x985e929f70af28d0bdd1a90a808f977f597c7c778c489e98d3bd8910d31ac0f7","0xc6f67e02e6e4e1bdefb994c6098953f34636ba2b6ca20a4721d2b26a886722ff","0x1c9a7e5ff1cf48b4ad1582d3f4e4a1004f3b20d8c5a2b71387a4254ad933ebc5","0x2f075ae229646b6f6aed19a5e372cf295081401eb893ff599b3f9acc0c0d3e7d","0x328921deb59612076801e8cd61592107b5c67c79b846595cc6320c395b46362c","0xbfb909fdb236ad2411b4e4883810a074b840464689986c3f8a8091827e17c327","0x55d8fb3687ba3ba49f342c77f5a1f89bec83d811446e1a467139213d640b6a74","0x846b080000000000000000000000000000000000000000000000000000000000","0x7d46d32db9a97974916a2114aeffc11fc031a954b2110742267054a438055c1a","0x81e1234eb27473f180f890c98019ecb7655a3e58105c7182d8daf726d75aaf8d","0x275abf1ff862082807cafed8d0a318c27439ec7159d81c831ee2832b5d6b57f6","0x4715bf9a259680cd06827b30bddb27ad445506e9edeb72a3eab904d94dea816b","0x5ba049ff558dd0ff1eadf2cef346aac41b7059433f21925b345f1024af18057d"],"ValidatorFields":["0xe36689b7b39ee895a754ba878afac2aa5d83349143a8b23d371823dd9ed3435d","0x01000000000000000000000049c486e3f4303bc11c02f952fe5b08d0ab22d443","0xe5d9ef8406000000000000000000000000000000000000000000000000000000","0x0000000000000000000000000000000000000000000000000000000000000000","0xea65010000000000000000000000000000000000000000000000000000000000","0xf265010000000000000000000000000000000000000000000000000000000000","0xffffffffffffffff000000000000000000000000000000000000000000000000","0xffffffffffffffff000000000000000000000000000000000000000000000000"],"StateRootAgainstLatestBlockHeaderProof":["0x0000000000000000000000000000000000000000000000000000000000000000","0xf5a5fd42d16a20302798ef6ed309979b43003d2320d9f0e8ea9831a92759fb4b","0xdb56114e00fdd4c1f85c892bf35ac9a89289aaecb1ebd0a96cde606a748b5d71"],"WithdrawalCredentialProof":["0x9e06c3582190fe488eac3f9f6c95622742f9afe3e038b39d2ca97ba6d5d0de4e","0x3eb11a14af12d8558cc14493938ffa0a1c6155349699c2b9245e76344d9922ee","0x81c959aeae7524f4f1d2d3d930ba504cbe86330619a221c9e2d9fb315e32a4d1","0x9b9adf5d31a74f30ae86ce7f7a8bfe89d2bdf2bd799d0c6896174b4f15878bf1","0x17d22cd18156b4bcbefbcfa3ed820c14cc5af90cb7c02c373cc476bc947ba4ac","0x22c1a00da80f2c5c8a11fdd629af774b9dde698305735d63b19aed6a70310537","0x949da2d82acf86e064a7022c5d5e69528ad6d3dd5b9cdf7fb9b736f0d925fc38","0x1920215f3c8c349a04f6d29263f495416e58d85c885b7d356dd4d335427d2748","0x7f12746ac9a3cc418594ab2c25838fdaf9ef43050a12f38f0c25ad7f976d889a","0x451a649946a59a90f56035d1eccdfcaa99ac8bb74b87c403653bdc5bc0055e2c","0x00ab86a6644a7694fa7bc0da3a8730404ea7e26da981b169316f7acdbbe8c79b","0x0d500027bb8983acbec0993a3d063f5a1f4b9a5b5893016bc9eec28e5633867e","0x2ba5cbed64a0202199a181c8612a8c5dad2512ad0ec6aa7f0c079392e16008ee","0xab8576644897391ddc0773ac95d072de29d05982f39201a5e0630b81563e91e9","0xc6e90f3f46f28faea3476837d2ec58ad5fa171c1f04446f2aa40aa433523ec74","0xb86e491b234c25dc5fa17b43c11ef04a7b3e89f99b2bb7d8daf87ee6dc6f3ae3","0xdb41e006a5111a4f2620a004e207d2a63fc5324d7f528409e779a34066a9b67f","0xe2356c743f98d89213868108ad08074ca35f685077e487077cef8a55917736c6","0xf7552771443e29ebcc7a4aad87e308783559a0b4ff696a0e49f81fb2736fe528","0x3d3aabf6c36de4242fef4b6e49441c24451ccf0e8e184a33bece69d3e3d40ac3","0xcddba7b592e3133393c16194fac7431abf2f5485ed711db282183c819e08ebaa","0x8a8d7fe3af8caa085a7639a832001457dfb9128a8061142ad0335629ff23ff9c","0xfeb3c337d7a51a6fbf00b9e34c52e1c9195c969bd4e7a0bfd51d5c5bed9c1167","0xe71f0aa83cc32edfbefa9f4d3e0174ca85182eec9f3a09f6a6c0df6377a510d7","0x31206fa80a50bb6abe29085058f16212212a60eec8f049fecb92d8c8e0a84bc0","0x21352bfecbeddde993839f614c3dac0a3ee37543f9b412b16199dc158e23b544","0x619e312724bb6d7c3153ed9de791d764a366b389af13c58bf8a8d90481a46765","0x7cdd2986268250628d0c10e385c58c6191e6fbe05191bcc04f133f2cea72c1c4","0x848930bd7ba8cac54661072113fb278869e07bb8587f91392933374d017bcbe1","0x8869ff2c22b28cc10510d9853292803328be4fb0e80495e8bb8d271f5b889636","0xb5fe28e79f1b850f8658246ce9b6a1e7b49fc06db7143e8fe0b4f2b0c5523a5c","0x985e929f70af28d0bdd1a90a808f977f597c7c778c489e98d3bd8910d31ac0f7","0xc6f67e02e6e4e1bdefb994c6098953f34636ba2b6ca20a4721d2b26a886722ff","0x1c9a7e5ff1cf48b4ad1582d3f4e4a1004f3b20d8c5a2b71387a4254ad933ebc5","0x2f075ae229646b6f6aed19a5e372cf295081401eb893ff599b3f9acc0c0d3e7d","0x328921deb59612076801e8cd61592107b5c67c79b846595cc6320c395b46362c","0xbfb909fdb236ad2411b4e4883810a074b840464689986c3f8a8091827e17c327","0x55d8fb3687ba3ba49f342c77f5a1f89bec83d811446e1a467139213d640b6a74","0xf7210d4f8e7e1039790e7bf4efa207555a10a6db1dd4b95da313aaa88b88fe76","0xad21b516cbc645ffe34ab5de1c8aef8cd4e7f8d2b51e8e1456adc7563cda206f","0x846b080000000000000000000000000000000000000000000000000000000000","0x5a6c050000000000000000000000000000000000000000000000000000000000","0x47314ebc95c63f3fd909af6442ed250d823b2ee8a6e48d8167d4dfdab96c8b5e","0x9fade50f5a88a8f7a027b4e7fa019f2289075e38668e926f9909dfcd5bcb3574","0x4715bf9a259680cd06827b30bddb27ad445506e9edeb72a3eab904d94dea816b","0x5ba049ff558dd0ff1eadf2cef346aac41b7059433f21925b345f1024af18057d"]}
````

## File: src/test/test-data/balanceUpdateProof_notOverCommitted_302913_incrementedBlockBy100.json
````json
{"validatorIndex":302913,"beaconStateRoot":"0x5f137c26afeed8bb6385aa78e03242767f3b63e9b6bbe9f1e96190863100162f","slotRoot":"0x62a8610000000000000000000000000000000000000000000000000000000000","latestBlockHeaderRoot":"0xae005b0407313e551634dbaa1d746813eba6df508952e66184ab3616e14d63b8","ValidatorFields":["0xe36689b7b39ee895a754ba878afac2aa5d83349143a8b23d371823dd9ed3435d","0x01000000000000000000000049c486e3f4303bc11c02f952fe5b08d0ab22d443","0x0040597307000000000000000000000000000000000000000000000000000000","0x0000000000000000000000000000000000000000000000000000000000000000","0xea65010000000000000000000000000000000000000000000000000000000000","0xf265010000000000000000000000000000000000000000000000000000000000","0xffffffffffffffff000000000000000000000000000000000000000000000000","0xffffffffffffffff000000000000000000000000000000000000000000000000"],"StateRootAgainstLatestBlockHeaderProof":["0x0000000000000000000000000000000000000000000000000000000000000000","0xf5a5fd42d16a20302798ef6ed309979b43003d2320d9f0e8ea9831a92759fb4b","0xdb56114e00fdd4c1f85c892bf35ac9a89289aaecb1ebd0a96cde606a748b5d71"],"WithdrawalCredentialProof":["0x9e06c3582190fe488eac3f9f6c95622742f9afe3e038b39d2ca97ba6d5d0de4e","0x3eb11a14af12d8558cc14493938ffa0a1c6155349699c2b9245e76344d9922ee","0x81c959aeae7524f4f1d2d3d930ba504cbe86330619a221c9e2d9fb315e32a4d1","0x9b9adf5d31a74f30ae86ce7f7a8bfe89d2bdf2bd799d0c6896174b4f15878bf1","0x17d22cd18156b4bcbefbcfa3ed820c14cc5af90cb7c02c373cc476bc947ba4ac","0x22c1a00da80f2c5c8a11fdd629af774b9dde698305735d63b19aed6a70310537","0x949da2d82acf86e064a7022c5d5e69528ad6d3dd5b9cdf7fb9b736f0d925fc38","0x1920215f3c8c349a04f6d29263f495416e58d85c885b7d356dd4d335427d2748","0x7f12746ac9a3cc418594ab2c25838fdaf9ef43050a12f38f0c25ad7f976d889a","0x451a649946a59a90f56035d1eccdfcaa99ac8bb74b87c403653bdc5bc0055e2c","0x00ab86a6644a7694fa7bc0da3a8730404ea7e26da981b169316f7acdbbe8c79b","0x0d500027bb8983acbec0993a3d063f5a1f4b9a5b5893016bc9eec28e5633867e","0x2ba5cbed64a0202199a181c8612a8c5dad2512ad0ec6aa7f0c079392e16008ee","0xab8576644897391ddc0773ac95d072de29d05982f39201a5e0630b81563e91e9","0xc6e90f3f46f28faea3476837d2ec58ad5fa171c1f04446f2aa40aa433523ec74","0xb86e491b234c25dc5fa17b43c11ef04a7b3e89f99b2bb7d8daf87ee6dc6f3ae3","0xdb41e006a5111a4f2620a004e207d2a63fc5324d7f528409e779a34066a9b67f","0xe2356c743f98d89213868108ad08074ca35f685077e487077cef8a55917736c6","0xf7552771443e29ebcc7a4aad87e308783559a0b4ff696a0e49f81fb2736fe528","0x3d3aabf6c36de4242fef4b6e49441c24451ccf0e8e184a33bece69d3e3d40ac3","0xcddba7b592e3133393c16194fac7431abf2f5485ed711db282183c819e08ebaa","0x8a8d7fe3af8caa085a7639a832001457dfb9128a8061142ad0335629ff23ff9c","0xfeb3c337d7a51a6fbf00b9e34c52e1c9195c969bd4e7a0bfd51d5c5bed9c1167","0xe71f0aa83cc32edfbefa9f4d3e0174ca85182eec9f3a09f6a6c0df6377a510d7","0x31206fa80a50bb6abe29085058f16212212a60eec8f049fecb92d8c8e0a84bc0","0x21352bfecbeddde993839f614c3dac0a3ee37543f9b412b16199dc158e23b544","0x619e312724bb6d7c3153ed9de791d764a366b389af13c58bf8a8d90481a46765","0x7cdd2986268250628d0c10e385c58c6191e6fbe05191bcc04f133f2cea72c1c4","0x848930bd7ba8cac54661072113fb278869e07bb8587f91392933374d017bcbe1","0x8869ff2c22b28cc10510d9853292803328be4fb0e80495e8bb8d271f5b889636","0xb5fe28e79f1b850f8658246ce9b6a1e7b49fc06db7143e8fe0b4f2b0c5523a5c","0x985e929f70af28d0bdd1a90a808f977f597c7c778c489e98d3bd8910d31ac0f7","0xc6f67e02e6e4e1bdefb994c6098953f34636ba2b6ca20a4721d2b26a886722ff","0x1c9a7e5ff1cf48b4ad1582d3f4e4a1004f3b20d8c5a2b71387a4254ad933ebc5","0x2f075ae229646b6f6aed19a5e372cf295081401eb893ff599b3f9acc0c0d3e7d","0x328921deb59612076801e8cd61592107b5c67c79b846595cc6320c395b46362c","0xbfb909fdb236ad2411b4e4883810a074b840464689986c3f8a8091827e17c327","0x55d8fb3687ba3ba49f342c77f5a1f89bec83d811446e1a467139213d640b6a74","0xf7210d4f8e7e1039790e7bf4efa207555a10a6db1dd4b95da313aaa88b88fe76","0xad21b516cbc645ffe34ab5de1c8aef8cd4e7f8d2b51e8e1456adc7563cda206f","0x846b080000000000000000000000000000000000000000000000000000000000","0x5a6c050000000000000000000000000000000000000000000000000000000000","0x47314ebc95c63f3fd909af6442ed250d823b2ee8a6e48d8167d4dfdab96c8b5e","0xce3d1b002aa817e3718132b7ffe6cea677f81b1b3b690b8052732d8e1a70d06b","0x687a08449d00a14e3143183adb3f66082d1459ba7f7d1209df02d3bfaa539031","0x5ba049ff558dd0ff1eadf2cef346aac41b7059433f21925b345f1024af18057d"]}
````

## File: src/test/test-data/balanceUpdateProof_notOverCommitted_302913.json
````json
{
    "validatorIndex": 302913,
    "beaconStateRoot": "0x4fa780c32b4cf43ade769a51d738d889858c23197e4567ad537270220ab923e0",
    "slotRoot": "0xfea7610000000000000000000000000000000000000000000000000000000000",
    "latestBlockHeaderRoot": "0xdc501e6d6439fb13ee2020b4013374be51e35c58d611115a96856cbf71edaf73",
    "ValidatorFields": [
        "0xe36689b7b39ee895a754ba878afac2aa5d83349143a8b23d371823dd9ed3435d",
        "0x01000000000000000000000049c486e3f4303bc11c02f952fe5b08d0ab22d443",
        "0x0040597307000000000000000000000000000000000000000000000000000000",
        "0x0000000000000000000000000000000000000000000000000000000000000000",
        "0xea65010000000000000000000000000000000000000000000000000000000000",
        "0xf265010000000000000000000000000000000000000000000000000000000000",
        "0xffffffffffffffff000000000000000000000000000000000000000000000000",
        "0xffffffffffffffff000000000000000000000000000000000000000000000000"
    ],
    "StateRootAgainstLatestBlockHeaderProof": [
        "0x0000000000000000000000000000000000000000000000000000000000000000",
        "0xf5a5fd42d16a20302798ef6ed309979b43003d2320d9f0e8ea9831a92759fb4b",
        "0xdb56114e00fdd4c1f85c892bf35ac9a89289aaecb1ebd0a96cde606a748b5d71"
    ],
    "WithdrawalCredentialProof": [
        "0x9e06c3582190fe488eac3f9f6c95622742f9afe3e038b39d2ca97ba6d5d0de4e",
        "0x3eb11a14af12d8558cc14493938ffa0a1c6155349699c2b9245e76344d9922ee",
        "0x81c959aeae7524f4f1d2d3d930ba504cbe86330619a221c9e2d9fb315e32a4d1",
        "0x9b9adf5d31a74f30ae86ce7f7a8bfe89d2bdf2bd799d0c6896174b4f15878bf1",
        "0x17d22cd18156b4bcbefbcfa3ed820c14cc5af90cb7c02c373cc476bc947ba4ac",
        "0x22c1a00da80f2c5c8a11fdd629af774b9dde698305735d63b19aed6a70310537",
        "0x949da2d82acf86e064a7022c5d5e69528ad6d3dd5b9cdf7fb9b736f0d925fc38",
        "0x1920215f3c8c349a04f6d29263f495416e58d85c885b7d356dd4d335427d2748",
        "0x7f12746ac9a3cc418594ab2c25838fdaf9ef43050a12f38f0c25ad7f976d889a",
        "0x451a649946a59a90f56035d1eccdfcaa99ac8bb74b87c403653bdc5bc0055e2c",
        "0x00ab86a6644a7694fa7bc0da3a8730404ea7e26da981b169316f7acdbbe8c79b",
        "0x0d500027bb8983acbec0993a3d063f5a1f4b9a5b5893016bc9eec28e5633867e",
        "0x2ba5cbed64a0202199a181c8612a8c5dad2512ad0ec6aa7f0c079392e16008ee",
        "0xab8576644897391ddc0773ac95d072de29d05982f39201a5e0630b81563e91e9",
        "0xc6e90f3f46f28faea3476837d2ec58ad5fa171c1f04446f2aa40aa433523ec74",
        "0xb86e491b234c25dc5fa17b43c11ef04a7b3e89f99b2bb7d8daf87ee6dc6f3ae3",
        "0xdb41e006a5111a4f2620a004e207d2a63fc5324d7f528409e779a34066a9b67f",
        "0xe2356c743f98d89213868108ad08074ca35f685077e487077cef8a55917736c6",
        "0xf7552771443e29ebcc7a4aad87e308783559a0b4ff696a0e49f81fb2736fe528",
        "0x3d3aabf6c36de4242fef4b6e49441c24451ccf0e8e184a33bece69d3e3d40ac3",
        "0xcddba7b592e3133393c16194fac7431abf2f5485ed711db282183c819e08ebaa",
        "0x8a8d7fe3af8caa085a7639a832001457dfb9128a8061142ad0335629ff23ff9c",
        "0xfeb3c337d7a51a6fbf00b9e34c52e1c9195c969bd4e7a0bfd51d5c5bed9c1167",
        "0xe71f0aa83cc32edfbefa9f4d3e0174ca85182eec9f3a09f6a6c0df6377a510d7",
        "0x31206fa80a50bb6abe29085058f16212212a60eec8f049fecb92d8c8e0a84bc0",
        "0x21352bfecbeddde993839f614c3dac0a3ee37543f9b412b16199dc158e23b544",
        "0x619e312724bb6d7c3153ed9de791d764a366b389af13c58bf8a8d90481a46765",
        "0x7cdd2986268250628d0c10e385c58c6191e6fbe05191bcc04f133f2cea72c1c4",
        "0x848930bd7ba8cac54661072113fb278869e07bb8587f91392933374d017bcbe1",
        "0x8869ff2c22b28cc10510d9853292803328be4fb0e80495e8bb8d271f5b889636",
        "0xb5fe28e79f1b850f8658246ce9b6a1e7b49fc06db7143e8fe0b4f2b0c5523a5c",
        "0x985e929f70af28d0bdd1a90a808f977f597c7c778c489e98d3bd8910d31ac0f7",
        "0xc6f67e02e6e4e1bdefb994c6098953f34636ba2b6ca20a4721d2b26a886722ff",
        "0x1c9a7e5ff1cf48b4ad1582d3f4e4a1004f3b20d8c5a2b71387a4254ad933ebc5",
        "0x2f075ae229646b6f6aed19a5e372cf295081401eb893ff599b3f9acc0c0d3e7d",
        "0x328921deb59612076801e8cd61592107b5c67c79b846595cc6320c395b46362c",
        "0xbfb909fdb236ad2411b4e4883810a074b840464689986c3f8a8091827e17c327",
        "0x55d8fb3687ba3ba49f342c77f5a1f89bec83d811446e1a467139213d640b6a74",
        "0xf7210d4f8e7e1039790e7bf4efa207555a10a6db1dd4b95da313aaa88b88fe76",
        "0xad21b516cbc645ffe34ab5de1c8aef8cd4e7f8d2b51e8e1456adc7563cda206f",
        "0x846b080000000000000000000000000000000000000000000000000000000000",
        "0x5a6c050000000000000000000000000000000000000000000000000000000000",
        "0x47314ebc95c63f3fd909af6442ed250d823b2ee8a6e48d8167d4dfdab96c8b5e",
        "0xce3d1b002aa817e3718132b7ffe6cea677f81b1b3b690b8052732d8e1a70d06b",
        "0x4715bf9a259680cd06827b30bddb27ad445506e9edeb72a3eab904d94dea816b",
        "0x5ba049ff558dd0ff1eadf2cef346aac41b7059433f21925b345f1024af18057d"
    ]
}
````

## File: src/test/test-data/balanceUpdateProof_updated_to_0ETH_302913.json
````json
{
    "validatorIndex": 302913,
    "beaconStateRoot": "0xd6c32aa93c58fd5ca1f36246234878ec6b0c36b2c218d8bd2521b4c4f2f8cd23",
    "slotRoot": "0xfea7610000000000000000000000000000000000000000000000000000000000",
    "latestBlockHeaderRoot": "0xc8fd8d84d59b2fe5e331e72466e237ba5014d9f078b0d65271aa00d2689fec9b",
    "ValidatorFields": [
        "0xe36689b7b39ee895a754ba878afac2aa5d83349143a8b23d371823dd9ed3435d",
        "0x01000000000000000000000049c486e3f4303bc11c02f952fe5b08d0ab22d443",
        "0x0000000000000000000000000000000000000000000000000000000000000000",
        "0x0000000000000000000000000000000000000000000000000000000000000000",
        "0xea65010000000000000000000000000000000000000000000000000000000000",
        "0xf265010000000000000000000000000000000000000000000000000000000000",
        "0xffffffffffffffff000000000000000000000000000000000000000000000000",
        "0xffffffffffffffff000000000000000000000000000000000000000000000000"
    ],
    "StateRootAgainstLatestBlockHeaderProof": [
        "0x0000000000000000000000000000000000000000000000000000000000000000",
        "0xf5a5fd42d16a20302798ef6ed309979b43003d2320d9f0e8ea9831a92759fb4b",
        "0xdb56114e00fdd4c1f85c892bf35ac9a89289aaecb1ebd0a96cde606a748b5d71"
    ],
    "WithdrawalCredentialProof": [
        "0x9e06c3582190fe488eac3f9f6c95622742f9afe3e038b39d2ca97ba6d5d0de4e",
        "0x3eb11a14af12d8558cc14493938ffa0a1c6155349699c2b9245e76344d9922ee",
        "0x81c959aeae7524f4f1d2d3d930ba504cbe86330619a221c9e2d9fb315e32a4d1",
        "0x9b9adf5d31a74f30ae86ce7f7a8bfe89d2bdf2bd799d0c6896174b4f15878bf1",
        "0x17d22cd18156b4bcbefbcfa3ed820c14cc5af90cb7c02c373cc476bc947ba4ac",
        "0x22c1a00da80f2c5c8a11fdd629af774b9dde698305735d63b19aed6a70310537",
        "0x949da2d82acf86e064a7022c5d5e69528ad6d3dd5b9cdf7fb9b736f0d925fc38",
        "0x1920215f3c8c349a04f6d29263f495416e58d85c885b7d356dd4d335427d2748",
        "0x7f12746ac9a3cc418594ab2c25838fdaf9ef43050a12f38f0c25ad7f976d889a",
        "0x451a649946a59a90f56035d1eccdfcaa99ac8bb74b87c403653bdc5bc0055e2c",
        "0x00ab86a6644a7694fa7bc0da3a8730404ea7e26da981b169316f7acdbbe8c79b",
        "0x0d500027bb8983acbec0993a3d063f5a1f4b9a5b5893016bc9eec28e5633867e",
        "0x2ba5cbed64a0202199a181c8612a8c5dad2512ad0ec6aa7f0c079392e16008ee",
        "0xab8576644897391ddc0773ac95d072de29d05982f39201a5e0630b81563e91e9",
        "0xc6e90f3f46f28faea3476837d2ec58ad5fa171c1f04446f2aa40aa433523ec74",
        "0xb86e491b234c25dc5fa17b43c11ef04a7b3e89f99b2bb7d8daf87ee6dc6f3ae3",
        "0xdb41e006a5111a4f2620a004e207d2a63fc5324d7f528409e779a34066a9b67f",
        "0xe2356c743f98d89213868108ad08074ca35f685077e487077cef8a55917736c6",
        "0xf7552771443e29ebcc7a4aad87e308783559a0b4ff696a0e49f81fb2736fe528",
        "0x3d3aabf6c36de4242fef4b6e49441c24451ccf0e8e184a33bece69d3e3d40ac3",
        "0xcddba7b592e3133393c16194fac7431abf2f5485ed711db282183c819e08ebaa",
        "0x8a8d7fe3af8caa085a7639a832001457dfb9128a8061142ad0335629ff23ff9c",
        "0xfeb3c337d7a51a6fbf00b9e34c52e1c9195c969bd4e7a0bfd51d5c5bed9c1167",
        "0xe71f0aa83cc32edfbefa9f4d3e0174ca85182eec9f3a09f6a6c0df6377a510d7",
        "0x31206fa80a50bb6abe29085058f16212212a60eec8f049fecb92d8c8e0a84bc0",
        "0x21352bfecbeddde993839f614c3dac0a3ee37543f9b412b16199dc158e23b544",
        "0x619e312724bb6d7c3153ed9de791d764a366b389af13c58bf8a8d90481a46765",
        "0x7cdd2986268250628d0c10e385c58c6191e6fbe05191bcc04f133f2cea72c1c4",
        "0x848930bd7ba8cac54661072113fb278869e07bb8587f91392933374d017bcbe1",
        "0x8869ff2c22b28cc10510d9853292803328be4fb0e80495e8bb8d271f5b889636",
        "0xb5fe28e79f1b850f8658246ce9b6a1e7b49fc06db7143e8fe0b4f2b0c5523a5c",
        "0x985e929f70af28d0bdd1a90a808f977f597c7c778c489e98d3bd8910d31ac0f7",
        "0xc6f67e02e6e4e1bdefb994c6098953f34636ba2b6ca20a4721d2b26a886722ff",
        "0x1c9a7e5ff1cf48b4ad1582d3f4e4a1004f3b20d8c5a2b71387a4254ad933ebc5",
        "0x2f075ae229646b6f6aed19a5e372cf295081401eb893ff599b3f9acc0c0d3e7d",
        "0x328921deb59612076801e8cd61592107b5c67c79b846595cc6320c395b46362c",
        "0xbfb909fdb236ad2411b4e4883810a074b840464689986c3f8a8091827e17c327",
        "0x55d8fb3687ba3ba49f342c77f5a1f89bec83d811446e1a467139213d640b6a74",
        "0xf7210d4f8e7e1039790e7bf4efa207555a10a6db1dd4b95da313aaa88b88fe76",
        "0xad21b516cbc645ffe34ab5de1c8aef8cd4e7f8d2b51e8e1456adc7563cda206f",
        "0x846b080000000000000000000000000000000000000000000000000000000000",
        "0x5a6c050000000000000000000000000000000000000000000000000000000000",
        "0x47314ebc95c63f3fd909af6442ed250d823b2ee8a6e48d8167d4dfdab96c8b5e",
        "0xd740083592ddcf0930ad47cc8e7758d567c2dc63767624bda4d50cafcbfe7093",
        "0x4715bf9a259680cd06827b30bddb27ad445506e9edeb72a3eab904d94dea816b",
        "0x5ba049ff558dd0ff1eadf2cef346aac41b7059433f21925b345f1024af18057d"
    ]
}
````

## File: src/test/test-data/balanceUpdateProof_updated_to_30ETH_302913.json
````json
{"validatorIndex":302913,"beaconStateRoot":"0x9761c69195aeb853adc72f41b00232e0dccdfaaf5828bc1db56416eb1d4396df","slotRoot":"0xfea7610000000000000000000000000000000000000000000000000000000000","latestBlockHeaderRoot":"0xbc2f3b78cf1d4d5b47d6cc987864860035088de6316b4eb1ccbe8677f31e98e1","ValidatorFields":["0xe36689b7b39ee895a754ba878afac2aa5d83349143a8b23d371823dd9ed3435d","0x01000000000000000000000049c486e3f4303bc11c02f952fe5b08d0ab22d443","0xe56d25fc06000000000000000000000000000000000000000000000000000000","0x0000000000000000000000000000000000000000000000000000000000000000","0xea65010000000000000000000000000000000000000000000000000000000000","0xf265010000000000000000000000000000000000000000000000000000000000","0xffffffffffffffff000000000000000000000000000000000000000000000000","0xffffffffffffffff000000000000000000000000000000000000000000000000"],"StateRootAgainstLatestBlockHeaderProof":["0x0000000000000000000000000000000000000000000000000000000000000000","0xf5a5fd42d16a20302798ef6ed309979b43003d2320d9f0e8ea9831a92759fb4b","0xdb56114e00fdd4c1f85c892bf35ac9a89289aaecb1ebd0a96cde606a748b5d71"],"WithdrawalCredentialProof":["0x9e06c3582190fe488eac3f9f6c95622742f9afe3e038b39d2ca97ba6d5d0de4e","0x3eb11a14af12d8558cc14493938ffa0a1c6155349699c2b9245e76344d9922ee","0x81c959aeae7524f4f1d2d3d930ba504cbe86330619a221c9e2d9fb315e32a4d1","0x9b9adf5d31a74f30ae86ce7f7a8bfe89d2bdf2bd799d0c6896174b4f15878bf1","0x17d22cd18156b4bcbefbcfa3ed820c14cc5af90cb7c02c373cc476bc947ba4ac","0x22c1a00da80f2c5c8a11fdd629af774b9dde698305735d63b19aed6a70310537","0x949da2d82acf86e064a7022c5d5e69528ad6d3dd5b9cdf7fb9b736f0d925fc38","0x1920215f3c8c349a04f6d29263f495416e58d85c885b7d356dd4d335427d2748","0x7f12746ac9a3cc418594ab2c25838fdaf9ef43050a12f38f0c25ad7f976d889a","0x451a649946a59a90f56035d1eccdfcaa99ac8bb74b87c403653bdc5bc0055e2c","0x00ab86a6644a7694fa7bc0da3a8730404ea7e26da981b169316f7acdbbe8c79b","0x0d500027bb8983acbec0993a3d063f5a1f4b9a5b5893016bc9eec28e5633867e","0x2ba5cbed64a0202199a181c8612a8c5dad2512ad0ec6aa7f0c079392e16008ee","0xab8576644897391ddc0773ac95d072de29d05982f39201a5e0630b81563e91e9","0xc6e90f3f46f28faea3476837d2ec58ad5fa171c1f04446f2aa40aa433523ec74","0xb86e491b234c25dc5fa17b43c11ef04a7b3e89f99b2bb7d8daf87ee6dc6f3ae3","0xdb41e006a5111a4f2620a004e207d2a63fc5324d7f528409e779a34066a9b67f","0xe2356c743f98d89213868108ad08074ca35f685077e487077cef8a55917736c6","0xf7552771443e29ebcc7a4aad87e308783559a0b4ff696a0e49f81fb2736fe528","0x3d3aabf6c36de4242fef4b6e49441c24451ccf0e8e184a33bece69d3e3d40ac3","0xcddba7b592e3133393c16194fac7431abf2f5485ed711db282183c819e08ebaa","0x8a8d7fe3af8caa085a7639a832001457dfb9128a8061142ad0335629ff23ff9c","0xfeb3c337d7a51a6fbf00b9e34c52e1c9195c969bd4e7a0bfd51d5c5bed9c1167","0xe71f0aa83cc32edfbefa9f4d3e0174ca85182eec9f3a09f6a6c0df6377a510d7","0x31206fa80a50bb6abe29085058f16212212a60eec8f049fecb92d8c8e0a84bc0","0x21352bfecbeddde993839f614c3dac0a3ee37543f9b412b16199dc158e23b544","0x619e312724bb6d7c3153ed9de791d764a366b389af13c58bf8a8d90481a46765","0x7cdd2986268250628d0c10e385c58c6191e6fbe05191bcc04f133f2cea72c1c4","0x848930bd7ba8cac54661072113fb278869e07bb8587f91392933374d017bcbe1","0x8869ff2c22b28cc10510d9853292803328be4fb0e80495e8bb8d271f5b889636","0xb5fe28e79f1b850f8658246ce9b6a1e7b49fc06db7143e8fe0b4f2b0c5523a5c","0x985e929f70af28d0bdd1a90a808f977f597c7c778c489e98d3bd8910d31ac0f7","0xc6f67e02e6e4e1bdefb994c6098953f34636ba2b6ca20a4721d2b26a886722ff","0x1c9a7e5ff1cf48b4ad1582d3f4e4a1004f3b20d8c5a2b71387a4254ad933ebc5","0x2f075ae229646b6f6aed19a5e372cf295081401eb893ff599b3f9acc0c0d3e7d","0x328921deb59612076801e8cd61592107b5c67c79b846595cc6320c395b46362c","0xbfb909fdb236ad2411b4e4883810a074b840464689986c3f8a8091827e17c327","0x55d8fb3687ba3ba49f342c77f5a1f89bec83d811446e1a467139213d640b6a74","0xf7210d4f8e7e1039790e7bf4efa207555a10a6db1dd4b95da313aaa88b88fe76","0xad21b516cbc645ffe34ab5de1c8aef8cd4e7f8d2b51e8e1456adc7563cda206f","0x846b080000000000000000000000000000000000000000000000000000000000","0x5a6c050000000000000000000000000000000000000000000000000000000000","0x47314ebc95c63f3fd909af6442ed250d823b2ee8a6e48d8167d4dfdab96c8b5e","0x8efea8a7f00e6411ae6187a6d9a2c22ad033c0ad749ce0940e5bf2fd76ac35c7","0x4715bf9a259680cd06827b30bddb27ad445506e9edeb72a3eab904d94dea816b","0x5ba049ff558dd0ff1eadf2cef346aac41b7059433f21925b345f1024af18057d"]}
````

## File: src/test/test-data/fullWithdrawalCapellaAgainstDenebRoot.json
````json
{
    "slot": 6397852,
    "validatorIndex": 302913,
    "historicalSummaryIndex": 146,
    "withdrawalIndex": 0,
    "blockHeaderRootIndex": 8092,
    "beaconStateRoot": "0x426cc7e4b6a9be3a44e671c99eb62f27dd956d5db33aa8f05d07c3e8b05cb38f",
    "slotRoot": "0x9c9f610000000000000000000000000000000000000000000000000000000000",
    "timestampRoot": "0xb06fed6400000000000000000000000000000000000000000000000000000000",
    "blockHeaderRoot": "0x8b036996f94e940c80c5c692fd0e25467a5d55f1cf92b7808f92090fc7be1d17",
    "blockBodyRoot": "0x542df356d51eb305cff8282abe6909504b8c6d7bd4598b43aa7d54be13e44e9c",
    "executionPayloadRoot": "0xe628472355543b53917635e60c1f924f111f7a3cd58f2d947e8631b9d9924cb1",
    "latestBlockHeaderRoot": "0xb00368eaa2de6ca1e83d610be190a397668215a337837e1ad23241373d1c2dd0",
    "SlotProof": [
        "0x89c5010000000000000000000000000000000000000000000000000000000000",
        "0xab4a015ca78ff722e478d047b19650dc6fc92a4270c6cd34401523d3d6a1d9f2",
        "0xf4e65df697eb85f3ab176ac93b6ad4d96bd6b04bdddcc4f6c98f0fa94effc553"
    ],
    "WithdrawalProof": [
        "0xa3d843f57c18ee3dac0eb263e446fe5d0110059137807d3cae4a2e60ccca013f",
        "0x87441da495942a4af734cbca4dbcf0b96b2d83137ce595c9f29495aae6a8d99e",
        "0xae0dc609ecbfb26abc191227a76efb332aaea29725253756f2cad136ef5837a6",
        "0x765bcd075991ecad96203020d1576fdb9b45b41dad3b5adde11263ab9f6f56b8",
        "0x1000000000000000000000000000000000000000000000000000000000000000",
        "0x0000000000000000000000000000000000000000000000000000000000000000",
        "0x9d9b56c23faa6a8abf0a49105eb12bbdfdf198a9c6c616b8f24f6e91ad79de92",
        "0xac5e32ea973e990d191039e91c7d9fd9830599b8208675f159c3df128228e729",
        "0x38914949a92dc9e402aee96301b080f769f06d752a32acecaa0458cba66cf471"
    ],
    "ValidatorProof": [
        "0x9e06c3582190fe488eac3f9f6c95622742f9afe3e038b39d2ca97ba6d5d0de4e",
        "0x3eb11a14af12d8558cc14493938ffa0a1c6155349699c2b9245e76344d9922ee",
        "0x81c959aeae7524f4f1d2d3d930ba504cbe86330619a221c9e2d9fb315e32a4d1",
        "0x9b9adf5d31a74f30ae86ce7f7a8bfe89d2bdf2bd799d0c6896174b4f15878bf1",
        "0xdfe7aa4a49359b80e66fbdc8cbbf5d2014868aaf8dee25848f1b6494cb56231f",
        "0xeec50554b6994496920a265643520c78ff05beec8015c6432f72b0cac5af510c",
        "0x949da2d82acf86e064a7022c5d5e69528ad6d3dd5b9cdf7fb9b736f0d925fc38",
        "0x9c797e45839da75fea2190bf7a2735e68d8e4bd3cdbc82498491debb3acce128",
        "0x2c693b02fbff3f4f659bfb8414a9ba27bbfdc1baf65317f05a84a85552628bd6",
        "0x6f853a43c11ab3ac27f5ea8dd9e6dc825216114dee8e5db2306b97723048daaa",
        "0x620fe1c260fcea9fb7ca0b7cd64f88aa906c88a8efc136317d88483f8a99d5ae",
        "0xccfc09edfaa6bb8f9a1db781f1104b3aeb2a45799c898df57f3610b9ffc255de",
        "0x8c5a00d96b9eb727a5a4aec2fd6b9771cb0c5be3a8b5588aff54b2ee36792af2",
        "0x48fc48699053f4bd8f986f4216e2728f11e0d53ebeaf13bc9d287d2e099e7196",
        "0xac88ce300b12047d9131a651417b624f206b742080c28c347873a7706897b379",
        "0xe373b48074ce47d30b57509e85e905e42e8dbc869bb7c436553326a7a65e22ec",
        "0x358c6950cfb1fb035e1e2506bddf5a1dc1f87d699a464a7eb05b87ce699942ce",
        "0x040e77e06c4d45802b2093e445e56a1ed5d5afbd1c3393806b006b7f40a17148",
        "0xcfb3f924f2e8810a349041676060bbf55113cbc00270f778723dbac055c8ba2b",
        "0xa4b4bda96e8ae5a441b128b339ed3776f6105d24fcaa288cad2a3153e430a9ea",
        "0xcddba7b592e3133393c16194fac7431abf2f5485ed711db282183c819e08ebaa",
        "0x8a8d7fe3af8caa085a7639a832001457dfb9128a8061142ad0335629ff23ff9c",
        "0xfeb3c337d7a51a6fbf00b9e34c52e1c9195c969bd4e7a0bfd51d5c5bed9c1167",
        "0xe71f0aa83cc32edfbefa9f4d3e0174ca85182eec9f3a09f6a6c0df6377a510d7",
        "0x31206fa80a50bb6abe29085058f16212212a60eec8f049fecb92d8c8e0a84bc0",
        "0x21352bfecbeddde993839f614c3dac0a3ee37543f9b412b16199dc158e23b544",
        "0x619e312724bb6d7c3153ed9de791d764a366b389af13c58bf8a8d90481a46765",
        "0x7cdd2986268250628d0c10e385c58c6191e6fbe05191bcc04f133f2cea72c1c4",
        "0x848930bd7ba8cac54661072113fb278869e07bb8587f91392933374d017bcbe1",
        "0x8869ff2c22b28cc10510d9853292803328be4fb0e80495e8bb8d271f5b889636",
        "0xb5fe28e79f1b850f8658246ce9b6a1e7b49fc06db7143e8fe0b4f2b0c5523a5c",
        "0x985e929f70af28d0bdd1a90a808f977f597c7c778c489e98d3bd8910d31ac0f7",
        "0xc6f67e02e6e4e1bdefb994c6098953f34636ba2b6ca20a4721d2b26a886722ff",
        "0x1c9a7e5ff1cf48b4ad1582d3f4e4a1004f3b20d8c5a2b71387a4254ad933ebc5",
        "0x2f075ae229646b6f6aed19a5e372cf295081401eb893ff599b3f9acc0c0d3e7d",
        "0x328921deb59612076801e8cd61592107b5c67c79b846595cc6320c395b46362c",
        "0xbfb909fdb236ad2411b4e4883810a074b840464689986c3f8a8091827e17c327",
        "0x55d8fb3687ba3ba49f342c77f5a1f89bec83d811446e1a467139213d640b6a74",
        "0xf7210d4f8e7e1039790e7bf4efa207555a10a6db1dd4b95da313aaa88b88fe76",
        "0xad21b516cbc645ffe34ab5de1c8aef8cd4e7f8d2b51e8e1456adc7563cda206f",
        "0x0b430a0000000000000000000000000000000000000000000000000000000000",
        "0x3b4f070000000000000000000000000000000000000000000000000000000000",
        "0x7e71eb9ab70a9ac86179e04cc156a3a6efd5d49e864b1def60d045fe88ae53db",
        "0x042f04ac64635d44bd43c48c5504689a119901947ed7cfca6ce6f7171d29b696",
        "0x560c8c92a1425b1c928f582f64de643e17290760d4ecb242afb53b62d51ea918",
        "0xf426ceebf070d088972f46060f72b9fa35ebb90e8d18af341b698d359ab8366f"
    ],
    "TimestampProof": [
        "0x28a2c80000000000000000000000000000000000000000000000000000000000",
        "0xa749df3368741198702798435eea361b1b1946aa9456587a2be377c8472ea2df",
        "0xb1c03097a5a24f46cdb684df37e3ac0536a76428be1a6c6d6450378701ab1f3d",
        "0x38914949a92dc9e402aee96301b080f769f06d752a32acecaa0458cba66cf471"
    ],
    "ExecutionPayloadProof": [
        "0xb6a435ffd17014d1dad214ba466aaa7fba5aa247945d2c29fd53e90d554f4474",
        "0x336488033fe5f3ef4ccc12af07b9370b92e553e35ecb4a337a1b1c0e4afe1e0e",
        "0xdb56114e00fdd4c1f85c892bf35ac9a89289aaecb1ebd0a96cde606a748b5d71",
        "0x5ec9aaf0a3571602f4704d4471b9af564caf17e4d22a7c31017293cb95949053",
        "0x0000000000000000000000000000000000000000000000000000000000000000",
        "0xf5a5fd42d16a20302798ef6ed309979b43003d2320d9f0e8ea9831a92759fb4b",
        "0xc1f7cb289e44e9f711d7d7c05b67b84b8c6dd0394b688922a490cfd3fe216db1"
    ],
    "ValidatorFields": [
        "0xe36689b7b39ee895a754ba878afac2aa5d83349143a8b23d371823dd9ed3435d",
        "0x0100000000000000000000008e35f095545c56b07c942a4f3b055ef1ec4cb148",
        "0x0040597307000000000000000000000000000000000000000000000000000000",
        "0x0000000000000000000000000000000000000000000000000000000000000000",
        "0xea65010000000000000000000000000000000000000000000000000000000000",
        "0xf265010000000000000000000000000000000000000000000000000000000000",
        "0xffffffffffffffff000000000000000000000000000000000000000000000000",
        "0x0000000000000000000000000000000000000000000000000000000000000000"
    ],
    "WithdrawalFields": [
        "0x45cee50000000000000000000000000000000000000000000000000000000000",
        "0x419f040000000000000000000000000000000000000000000000000000000000",
        "0x59b0d71688da01057c08e4c1baa8faa629819c2a000000000000000000000000",
        "0xe5015b7307000000000000000000000000000000000000000000000000000000"
    ],
    "StateRootAgainstLatestBlockHeaderProof": [
        "0xc055061b6674f3bac542b141b441b476130d17dacc3e61d6ce01a6b8528f7de7",
        "0xfd8af94401badce5dd4588a22c605e197a51b17e696f761aed06819a98645f03",
        "0xdeb9a60cdd0908457ff962da3895ffcf1a1e479b633e3427ac9b1166e006c8f7"
    ],
    "HistoricalSummaryProof": [
        "0x96d85b451bb1df5314fd3fd3fa4caa3285796905bc8bba6eee5e3e1539cf2695",
        "0x354f5aaff1cde08c6b8a7ef8610abf62a0b50339d0dd26b0152699ebc2bdf785",
        "0xb8c4c9f1dec537f4c4652e6bf519bac768e85b2590b7683e392aab698b50d529",
        "0x1cae4e7facb6883024359eb1e9212d36e68a106a7733dc1c099017a74e5f465a",
        "0x616439c1379e10fc6ad2fa192a2e49c2d5a7155fdde95911f37fcfb75952fcb2",
        "0x9d95eefbaff153d6ad9050327e21a254750d80ff89315ab4056574275ce2a751",
        "0x20cdc9ec1006e8bc27ab3e0a9c88a8e14c8a9da2470f8eaf673ee67abcfd0342",
        "0x4bdcbe543f9ef7348855aac43d6b6286f9c0c7be53de8a1300bea1ba5ba0758e",
        "0xb6631640d626ea9523ae619a42633072614326cc9220462dffdeb63e804ef05f",
        "0xf19a76e33ca189a8682ece523c2afda138db575955b7af31a427c9b8adb41e15",
        "0x221b43ad87d7410624842cad296fc48360b5bf4e835f6ff610db736774d2f2d3",
        "0x297c51f4ff236db943bebeb35538e207c8de6330d26aa8138a9ca206f42154bf",
        "0x129a0644f33b9ee4e9a36a11dd59d1dedc64012fbb7a79263d07f82d647ffba8",
        "0x763794c2042b9c8381ac7c4d7f4d38b0abb38069b2810b522f87951f25d9d2be",
        "0x4ee09be5d00612fc8807752842f0839656107b50699330ecf09825466576a8e5",
        "0xee0639a2ada97368e8b3493f9d2141e16c3cd9fe54e13691bb7a2c376c56c7c8",
        "0xc9394eeb778485920ae0bc45a6f0e5f1b43f3aeadc24b24e7a655582aa87aede",
        "0xfc3f3efb849bf652aa632502c004af0f78dfe1a75902f33bbce3ca3d1cc3bfea",
        "0xba2bc704559c23541f0c9efa0b522454e8cd06cd504d0e45724709cf5672640f",
        "0x4644f74cc7fedf973ef015906df9ba97729b04395a70ff170bee8c40ffed8f0f",
        "0xb5202e0c2d48a246c5b45e30d3bf0a89f3d3ea5e4591db5ec39efc1ed1e0a2a2",
        "0xff857f4c17c9fb2e544e496685ebd8e2258c761e4636cfb031ba73a4430061c7",
        "0x72cf6a5869e83ea39846cc892946c8a5e6bf3191df19ae922664504e4cf38c6b",
        "0x506d86582d252405b840018792cad2bf1259f1ef5aa5f887e13cb2f0094f51e1",
        "0xffff0ad7e659772f9534c195c815efc4014ef1e1daed4404c06385d11192e92b",
        "0x6cf04127db05441cd833107a52be852868890e4317e6a02ab47683aa75964220",
        "0xb7d05f875f140027ef5118a2247bbb84ce8f2f0f1123623085daf7960c329f5f",
        "0xdf6af5f5bbdb6be9ef8aa618e4bf8073960867171e29676f8b284dea6a08a85e",
        "0xb58d900f5e182e3c50ef74969ea16c7726c549757cc23523c369587da7293784",
        "0xd49a7502ffcfb0340b1d7885688500ca308161a7f96b62df9d083b71fcc8f2bb",
        "0x8fe6b1689256c0d385f42f5bbe2027a22c1996e110ba97c171d3e5948de92beb",
        "0x8d0d63c39ebade8509e0ae3c9c3876fb5fa112be18f905ecacfecb92057603ab",
        "0x95eec8b2e541cad4e91de38385f2e046619f54496c2382cb6cacd5b98c26f5a4",
        "0xf893e908917775b62bff23294dbbe3a1cd8e6cc1c35b4801887b646a6f81f17f",
        "0xcddba7b592e3133393c16194fac7431abf2f5485ed711db282183c819e08ebaa",
        "0x8a8d7fe3af8caa085a7639a832001457dfb9128a8061142ad0335629ff23ff9c",
        "0xfeb3c337d7a51a6fbf00b9e34c52e1c9195c969bd4e7a0bfd51d5c5bed9c1167",
        "0xe71f0aa83cc32edfbefa9f4d3e0174ca85182eec9f3a09f6a6c0df6377a510d7",
        "0x1101000000000000000000000000000000000000000000000000000000000000",
        "0xcbe0080000000000000000000000000000000000000000000000000000000000",
        "0x8ff2572846d80ce4be83e1638164331c30cd7eadb3488f00ba2507c072929e3a",
        "0xdb56114e00fdd4c1f85c892bf35ac9a89289aaecb1ebd0a96cde606a748b5d71",
        "0xa6c60794743172c4a55a9fcee4a7832e5ef7b31aac1b9489b5baa1db78df5c60",
        "0x1c8017e95f68e52210618f3802699b49a2a13a40257e97b74ee864824a73a280"
    ]
}
````

## File: src/test/test-data/fullWithdrawalDeneb.json
````json
{
    "slot": 7421951,
    "validatorIndex": 0,
    "historicalSummaryIndex": 271,
    "withdrawalIndex": 0,
    "blockHeaderRootIndex": 8191,
    "beaconStateRoot": "0xaf91e832d495c6d0e877bdf61b2bb6614621addb789ab492ceff9eef1696a64b",
    "slotRoot": "0xff3f710000000000000000000000000000000000000000000000000000000000",
    "timestampRoot": "0x54f4a86500000000000000000000000000000000000000000000000000000000",
    "blockHeaderRoot": "0x68d267d7566c4829a1560fea6cce668f8fbf2e126e59e2556288bcbff92b64f2",
    "blockBodyRoot": "0x88a28082491645022ce8d6af49dca10325fc979d179d0135f0f7d0937fbbbfeb",
    "executionPayloadRoot": "0xc1f6b92b0e40c5cf43de8fe08f68434736dd9d42f7620436df40320f4eb65286",
    "latestBlockHeaderRoot": "0x5a35a89568f3323481764c70b1bad0880d4d0114f185e43a42c96a8e45fa2a0f",
    "SlotProof": [
        "0x8d6a010000000000000000000000000000000000000000000000000000000000",
        "0x0d4c303f43d35612a043d17114edde94bdc94ee369b761067bb85bd347c94c4c",
        "0x8dbd7ba3acb83e5e9a00d908e8d05e0dc99569d2135d24affc44e325b0f7911d"
    ],
    "WithdrawalProof": [
        "0x3effc719333b3a5052a34bd1ed124dce49445905dbe18af5aa947bfe25a94dd8",
        "0xf8470ba001831654956a6f12a8ffd6a1f1004e08557268d86477945cd3989531",
        "0x55f96eba696026f9d8389019bf3c2f61ab741f968c01744540b170a4fb0f25a4",
        "0x47ab534e81180bcf81d1ef541132b84826f1f34e2a0fde736a313a6ed5557459",
        "0x1000000000000000000000000000000000000000000000000000000000000000",
        "0x00000a0000000000000000000000000000000000000000000000000000000000",
        "0x5c1bb5d0e2afe397c9fb9e275aa97209ba4c01e13d181e66311b42aed62559f7",
        "0x058ad237cbc009d8b6f426aaa40709e508753fa90c6858e147e1c1066127dc69",
        "0x4750fb0e389da83ea89697969498c02f840a2b21c7ece905e0f284f7e5b179c4",
        "0xd2252e6aa60b6dbca15826f459db1e89ec584c2a2aa89bccd1715b9942633e00"
    ],
    "ValidatorProof": [
        "0x9e06c3582190fe488eac3f9f6c95622742f9afe3e038b39d2ca97ba6d5d0de4e",
        "0x3eb11a14af12d8558cc14493938ffa0a1c6155349699c2b9245e76344d9922ee",
        "0x81c959aeae7524f4f1d2d3d930ba504cbe86330619a221c9e2d9fb315e32a4d1",
        "0x9b9adf5d31a74f30ae86ce7f7a8bfe89d2bdf2bd799d0c6896174b4f15878bf1",
        "0xdfe7aa4a49359b80e66fbdc8cbbf5d2014868aaf8dee25848f1b6494cb56231f",
        "0xeec50554b6994496920a265643520c78ff05beec8015c6432f72b0cac5af510c",
        "0x949da2d82acf86e064a7022c5d5e69528ad6d3dd5b9cdf7fb9b736f0d925fc38",
        "0x9c797e45839da75fea2190bf7a2735e68d8e4bd3cdbc82498491debb3acce128",
        "0x2c693b02fbff3f4f659bfb8414a9ba27bbfdc1baf65317f05a84a85552628bd6",
        "0x6f853a43c11ab3ac27f5ea8dd9e6dc825216114dee8e5db2306b97723048daaa",
        "0x620fe1c260fcea9fb7ca0b7cd64f88aa906c88a8efc136317d88483f8a99d5ae",
        "0xccfc09edfaa6bb8f9a1db781f1104b3aeb2a45799c898df57f3610b9ffc255de",
        "0x8c5a00d96b9eb727a5a4aec2fd6b9771cb0c5be3a8b5588aff54b2ee36792af2",
        "0x48fc48699053f4bd8f986f4216e2728f11e0d53ebeaf13bc9d287d2e099e7196",
        "0xac88ce300b12047d9131a651417b624f206b742080c28c347873a7706897b379",
        "0xe373b48074ce47d30b57509e85e905e42e8dbc869bb7c436553326a7a65e22ec",
        "0x358c6950cfb1fb035e1e2506bddf5a1dc1f87d699a464a7eb05b87ce699942ce",
        "0x040e77e06c4d45802b2093e445e56a1ed5d5afbd1c3393806b006b7f40a17148",
        "0xcfb3f924f2e8810a349041676060bbf55113cbc00270f778723dbac055c8ba2b",
        "0xa4b4bda96e8ae5a441b128b339ed3776f6105d24fcaa288cad2a3153e430a9ea",
        "0xcddba7b592e3133393c16194fac7431abf2f5485ed711db282183c819e08ebaa",
        "0x8a8d7fe3af8caa085a7639a832001457dfb9128a8061142ad0335629ff23ff9c",
        "0xfeb3c337d7a51a6fbf00b9e34c52e1c9195c969bd4e7a0bfd51d5c5bed9c1167",
        "0xe71f0aa83cc32edfbefa9f4d3e0174ca85182eec9f3a09f6a6c0df6377a510d7",
        "0x31206fa80a50bb6abe29085058f16212212a60eec8f049fecb92d8c8e0a84bc0",
        "0x21352bfecbeddde993839f614c3dac0a3ee37543f9b412b16199dc158e23b544",
        "0x619e312724bb6d7c3153ed9de791d764a366b389af13c58bf8a8d90481a46765",
        "0x7cdd2986268250628d0c10e385c58c6191e6fbe05191bcc04f133f2cea72c1c4",
        "0x848930bd7ba8cac54661072113fb278869e07bb8587f91392933374d017bcbe1",
        "0x8869ff2c22b28cc10510d9853292803328be4fb0e80495e8bb8d271f5b889636",
        "0xb5fe28e79f1b850f8658246ce9b6a1e7b49fc06db7143e8fe0b4f2b0c5523a5c",
        "0x985e929f70af28d0bdd1a90a808f977f597c7c778c489e98d3bd8910d31ac0f7",
        "0xc6f67e02e6e4e1bdefb994c6098953f34636ba2b6ca20a4721d2b26a886722ff",
        "0x1c9a7e5ff1cf48b4ad1582d3f4e4a1004f3b20d8c5a2b71387a4254ad933ebc5",
        "0x2f075ae229646b6f6aed19a5e372cf295081401eb893ff599b3f9acc0c0d3e7d",
        "0x328921deb59612076801e8cd61592107b5c67c79b846595cc6320c395b46362c",
        "0xbfb909fdb236ad2411b4e4883810a074b840464689986c3f8a8091827e17c327",
        "0x55d8fb3687ba3ba49f342c77f5a1f89bec83d811446e1a467139213d640b6a74",
        "0xf7210d4f8e7e1039790e7bf4efa207555a10a6db1dd4b95da313aaa88b88fe76",
        "0xad21b516cbc645ffe34ab5de1c8aef8cd4e7f8d2b51e8e1456adc7563cda206f",
        "0x0b430a0000000000000000000000000000000000000000000000000000000000",
        "0x3b4f070000000000000000000000000000000000000000000000000000000000",
        "0x7e71eb9ab70a9ac86179e04cc156a3a6efd5d49e864b1def60d045fe88ae53db",
        "0x042f04ac64635d44bd43c48c5504689a119901947ed7cfca6ce6f7171d29b696",
        "0x560c8c92a1425b1c928f582f64de643e17290760d4ecb242afb53b62d51ea918",
        "0xfe7b7941293bb1a833e6be99db3175a8ab0af7e44f42d0c9dcdf34ae916db490"
    ],
    "TimestampProof": [
        "0x79958c0000000000000000000000000000000000000000000000000000000000",
        "0xb0949007c306f2de2257c598d935ca16be928532e866698c2561bf4cf1e08b6f",
        "0x11b7c6b7b01e2a21a682cf18e431dc78efa32300bfb5eba5374420f11cbcb751",
        "0x4750fb0e389da83ea89697969498c02f840a2b21c7ece905e0f284f7e5b179c4",
        "0xd2252e6aa60b6dbca15826f459db1e89ec584c2a2aa89bccd1715b9942633e00"
    ],
    "ExecutionPayloadProof": [
        "0xe5e633a5ba845ad1ede8be35fed9ea6d37e39d09061398190eac885703ff5cbd",
        "0x260336bbff9ef0540c4497ed3e946ba0ca2080b668a1bdcb033496e56c40d451",
        "0xdb56114e00fdd4c1f85c892bf35ac9a89289aaecb1ebd0a96cde606a748b5d71",
        "0xd2dc492d263b7c106c7a5012f6f2c138c28e1cd37962d49a30031c16964f6bb8",
        "0x0000000000000000000000000000000000000000000000000000000000000000",
        "0xf5a5fd42d16a20302798ef6ed309979b43003d2320d9f0e8ea9831a92759fb4b",
        "0x5c2aa56042580b615d81c829f006de5e7b2a21fc330119ddc7600a5a28692069"
    ],
    "ValidatorFields": [
        "0xe36689b7b39ee895a754ba878afac2aa5d83349143a8b23d371823dd9ed3435d",
        "0x0100000000000000000000008e35f095545c56b07c942a4f3b055ef1ec4cb148",
        "0x0040597307000000000000000000000000000000000000000000000000000000",
        "0x0000000000000000000000000000000000000000000000000000000000000000",
        "0xea65010000000000000000000000000000000000000000000000000000000000",
        "0xf265010000000000000000000000000000000000000000000000000000000000",
        "0xffffffffffffffff000000000000000000000000000000000000000000000000",
        "0x0000000000000000000000000000000000000000000000000000000000000000"
    ],
    "WithdrawalFields": [
        "0xe599a70100000000000000000000000000000000000000000000000000000000",
        "0x419f040000000000000000000000000000000000000000000000000000000000",
        "0xd982a5927741bfd9b8cf16234061d7a592ca2b1c000000000000000000000000",
        "0xe5015b7307000000000000000000000000000000000000000000000000000000"
    ],
    "StateRootAgainstLatestBlockHeaderProof": [
        "0xc055061b6674f3bac542b141b441b476130d17dacc3e61d6ce01a6b8528f7de7",
        "0xfd8af94401badce5dd4588a22c605e197a51b17e696f761aed06819a98645f03",
        "0xdeb9a60cdd0908457ff962da3895ffcf1a1e479b633e3427ac9b1166e006c8f7"
    ],
    "HistoricalSummaryProof": [
        "0x273d5cec9b06327f6b83f079e34df0678d905713326e4ac2fe3afe8b12d4af22",
        "0xf39c43458894e29168c729f714c66b3aef24d43ea37c46ece64f736fbcbcb1d1",
        "0xeca6748ed11dc62dbecc0eaca339af8929bfa9b962149257af7c30cb947ec642",
        "0x7cd5fc51dbcc6c6666c00e0ddda4f095f848c70fdc6fa378c5eb9b9108e59efd",
        "0xe6215943dc342defe9fb5c1474eb6f3ab3db8d1e04dd11707394cf026f0bf780",
        "0x650c78d820aad1d0b31b94e1d15c2e4998aeffd5e3399646809064042e4f923e",
        "0xefe753d3d111fa3603f090f5f08c2f12ae9324e8fbe2862162fc6c1587a5ab4b",
        "0x3e62b06efce16432b6495d9d7fb51f0c3c745036e0c77dc5fc78a70e54d64d93",
        "0x0aae9c557ef9a8c3d7b1dd2788f484b94a9cf04312cf274353e3c19d5beb8541",
        "0x6d716c0e4864c59df7bc3319eb4ccac269242e9a1634cf04d4c8df8f9b53f4da",
        "0x1eecd8c195eb8c158d0dd3e6d7303aee05cc9d9fdfe7c9135ac19453ee8d7bed",
        "0x93b6c13c69ea8e5c921ac4b895db6f8ebc66d3b01daff16a1658f2526eb79ed9",
        "0x4e0b3c661d827f71fca9f2fedc3a72d9e4907599577b7149123d5328afe091c9",
        "0xae456e2a1b0f20ebda87d9e3e7f87f7dcc0860aae65c53657a51f876b862f9a9",
        "0x3f8e2a5e35171009027df8b882d861e09d70a334a0db14b0f3c920fc6e4c4e23",
        "0x0cad2edea11734fc388afd6bc9b9125be12edd7e4df6f05e2fdc5a622c0138fb",
        "0x735f927c57108d1de8547c9d49ecdbf8661a481d6374ca6e25a103ea728b1916",
        "0xf9513c49e7d50b6311372f787ab3ec7a112e384115d340b0d9f74bccb3562c33",
        "0xd3573d59f23ed8018d754c166d987e60ac4018ed6a0c187e01439c10e449511f",
        "0x9efde052aa15429fae05bad4d0b1d7c64da64d03d7a1854a588c2cb8430c0d30",
        "0xd88ddfeed400a8755596b21942c1497e114c302e6118290f91e6772976041fa1",
        "0x87eb0ddba57e35f6d286673802a4af5975e22506c7cf4c64bb6be5ee11527f2c",
        "0x1ef5d0b4795711d6aaf89b6eb2e5ca1c8c729ad9acb5b58c2b700a857c3512a0",
        "0x506d86582d252405b840018792cad2bf1259f1ef5aa5f887e13cb2f0094f51e1",
        "0xffff0ad7e659772f9534c195c815efc4014ef1e1daed4404c06385d11192e92b",
        "0x6cf04127db05441cd833107a52be852868890e4317e6a02ab47683aa75964220",
        "0xb7d05f875f140027ef5118a2247bbb84ce8f2f0f1123623085daf7960c329f5f",
        "0xdf6af5f5bbdb6be9ef8aa618e4bf8073960867171e29676f8b284dea6a08a85e",
        "0xb58d900f5e182e3c50ef74969ea16c7726c549757cc23523c369587da7293784",
        "0xd49a7502ffcfb0340b1d7885688500ca308161a7f96b62df9d083b71fcc8f2bb",
        "0x8fe6b1689256c0d385f42f5bbe2027a22c1996e110ba97c171d3e5948de92beb",
        "0x8d0d63c39ebade8509e0ae3c9c3876fb5fa112be18f905ecacfecb92057603ab",
        "0x95eec8b2e541cad4e91de38385f2e046619f54496c2382cb6cacd5b98c26f5a4",
        "0xf893e908917775b62bff23294dbbe3a1cd8e6cc1c35b4801887b646a6f81f17f",
        "0xcddba7b592e3133393c16194fac7431abf2f5485ed711db282183c819e08ebaa",
        "0x8a8d7fe3af8caa085a7639a832001457dfb9128a8061142ad0335629ff23ff9c",
        "0xfeb3c337d7a51a6fbf00b9e34c52e1c9195c969bd4e7a0bfd51d5c5bed9c1167",
        "0xe71f0aa83cc32edfbefa9f4d3e0174ca85182eec9f3a09f6a6c0df6377a510d7",
        "0x1101000000000000000000000000000000000000000000000000000000000000",
        "0xcbe0080000000000000000000000000000000000000000000000000000000000",
        "0x8ff2572846d80ce4be83e1638164331c30cd7eadb3488f00ba2507c072929e3a",
        "0xdb56114e00fdd4c1f85c892bf35ac9a89289aaecb1ebd0a96cde606a748b5d71",
        "0xa6c60794743172c4a55a9fcee4a7832e5ef7b31aac1b9489b5baa1db78df5c60",
        "0x1c8017e95f68e52210618f3802699b49a2a13a40257e97b74ee864824a73a280"
    ]
}
````

## File: src/test/test-data/fullWithdrawalProof_Latest_1SlotAdvanced.json
````json
{
    "slot": 6397852,
    "validatorIndex": 0,
    "historicalSummaryIndex": 146,
    "withdrawalIndex": 0,
    "blockHeaderRootIndex": 8092,
    "beaconStateRoot": "0x347e794382bd27d071b471af5047a2d97f8080a0f029e1fb9e3a13665924cdd1",
    "slotRoot": "0x9c9f610000000000000000000000000000000000000000000000000000000000",
    "timestampRoot": "0xb16fed6400000000000000000000000000000000000000000000000000000000",
    "blockHeaderRoot": "0x8b44963e24101b8a5dadf759524d69084f142aaeded6e261e2ae4892c66e3bdf",
    "blockBodyRoot": "0x8538e5b68a113c7c2cefcbd7b08b23af8f098b03dd1cd40108be7a0bad39f7b4",
    "executionPayloadRoot": "0x126dc97fb335244643609b61b64ab8694f41a077cfadff97de390e9f708c80be",
    "latestBlockHeaderRoot": "0x6674590fc92d3ad53a128a56f1b189f6c4111d6bad8976b57fa5858e057f0e07",
    "SlotProof": [
        "0x89c5010000000000000000000000000000000000000000000000000000000000",
        "0xab4a015ca78ff722e478d047b19650dc6fc92a4270c6cd34401523d3d6a1d9f2",
        "0x3424c924845b7698ec1ee6a4350e03dc5a00dd32f1b2fb21c9d25e17ef61b64f"
    ],
    "WithdrawalProof": [
        "0xa3d843f57c18ee3dac0eb263e446fe5d0110059137807d3cae4a2e60ccca013f",
        "0x87441da495942a4af734cbca4dbcf0b96b2d83137ce595c9f29495aae6a8d99e",
        "0xae0dc609ecbfb26abc191227a76efb332aaea29725253756f2cad136ef5837a6",
        "0x765bcd075991ecad96203020d1576fdb9b45b41dad3b5adde11263ab9f6f56b8",
        "0x1000000000000000000000000000000000000000000000000000000000000000",
        "0x0000000000000000000000000000000000000000000000000000000000000000",
        "0x9d9b56c23faa6a8abf0a49105eb12bbdfdf198a9c6c616b8f24f6e91ad79de92",
        "0x232d0d58faceee6ed21f85527a6d6b54148bfabb0665e580fdd6ec862ab5cc56",
        "0x38914949a92dc9e402aee96301b080f769f06d752a32acecaa0458cba66cf471"
    ],
    "ValidatorProof": [
        "0x9e06c3582190fe488eac3f9f6c95622742f9afe3e038b39d2ca97ba6d5d0de4e",
        "0x3eb11a14af12d8558cc14493938ffa0a1c6155349699c2b9245e76344d9922ee",
        "0x81c959aeae7524f4f1d2d3d930ba504cbe86330619a221c9e2d9fb315e32a4d1",
        "0x9b9adf5d31a74f30ae86ce7f7a8bfe89d2bdf2bd799d0c6896174b4f15878bf1",
        "0x17d22cd18156b4bcbefbcfa3ed820c14cc5af90cb7c02c373cc476bc947ba4ac",
        "0x22c1a00da80f2c5c8a11fdd629af774b9dde698305735d63b19aed6a70310537",
        "0x949da2d82acf86e064a7022c5d5e69528ad6d3dd5b9cdf7fb9b736f0d925fc38",
        "0x1920215f3c8c349a04f6d29263f495416e58d85c885b7d356dd4d335427d2748",
        "0x7f12746ac9a3cc418594ab2c25838fdaf9ef43050a12f38f0c25ad7f976d889a",
        "0x451a649946a59a90f56035d1eccdfcaa99ac8bb74b87c403653bdc5bc0055e2c",
        "0x00ab86a6644a7694fa7bc0da3a8730404ea7e26da981b169316f7acdbbe8c79b",
        "0x0d500027bb8983acbec0993a3d063f5a1f4b9a5b5893016bc9eec28e5633867e",
        "0x2ba5cbed64a0202199a181c8612a8c5dad2512ad0ec6aa7f0c079392e16008ee",
        "0xab8576644897391ddc0773ac95d072de29d05982f39201a5e0630b81563e91e9",
        "0xc6e90f3f46f28faea3476837d2ec58ad5fa171c1f04446f2aa40aa433523ec74",
        "0xb86e491b234c25dc5fa17b43c11ef04a7b3e89f99b2bb7d8daf87ee6dc6f3ae3",
        "0xdb41e006a5111a4f2620a004e207d2a63fc5324d7f528409e779a34066a9b67f",
        "0xe2356c743f98d89213868108ad08074ca35f685077e487077cef8a55917736c6",
        "0xf7552771443e29ebcc7a4aad87e308783559a0b4ff696a0e49f81fb2736fe528",
        "0x3d3aabf6c36de4242fef4b6e49441c24451ccf0e8e184a33bece69d3e3d40ac3",
        "0xcddba7b592e3133393c16194fac7431abf2f5485ed711db282183c819e08ebaa",
        "0x8a8d7fe3af8caa085a7639a832001457dfb9128a8061142ad0335629ff23ff9c",
        "0xfeb3c337d7a51a6fbf00b9e34c52e1c9195c969bd4e7a0bfd51d5c5bed9c1167",
        "0xe71f0aa83cc32edfbefa9f4d3e0174ca85182eec9f3a09f6a6c0df6377a510d7",
        "0x31206fa80a50bb6abe29085058f16212212a60eec8f049fecb92d8c8e0a84bc0",
        "0x21352bfecbeddde993839f614c3dac0a3ee37543f9b412b16199dc158e23b544",
        "0x619e312724bb6d7c3153ed9de791d764a366b389af13c58bf8a8d90481a46765",
        "0x7cdd2986268250628d0c10e385c58c6191e6fbe05191bcc04f133f2cea72c1c4",
        "0x848930bd7ba8cac54661072113fb278869e07bb8587f91392933374d017bcbe1",
        "0x8869ff2c22b28cc10510d9853292803328be4fb0e80495e8bb8d271f5b889636",
        "0xb5fe28e79f1b850f8658246ce9b6a1e7b49fc06db7143e8fe0b4f2b0c5523a5c",
        "0x985e929f70af28d0bdd1a90a808f977f597c7c778c489e98d3bd8910d31ac0f7",
        "0xc6f67e02e6e4e1bdefb994c6098953f34636ba2b6ca20a4721d2b26a886722ff",
        "0x1c9a7e5ff1cf48b4ad1582d3f4e4a1004f3b20d8c5a2b71387a4254ad933ebc5",
        "0x2f075ae229646b6f6aed19a5e372cf295081401eb893ff599b3f9acc0c0d3e7d",
        "0x328921deb59612076801e8cd61592107b5c67c79b846595cc6320c395b46362c",
        "0xbfb909fdb236ad2411b4e4883810a074b840464689986c3f8a8091827e17c327",
        "0x55d8fb3687ba3ba49f342c77f5a1f89bec83d811446e1a467139213d640b6a74",
        "0xf7210d4f8e7e1039790e7bf4efa207555a10a6db1dd4b95da313aaa88b88fe76",
        "0xad21b516cbc645ffe34ab5de1c8aef8cd4e7f8d2b51e8e1456adc7563cda206f",
        "0x846b080000000000000000000000000000000000000000000000000000000000",
        "0x5a6c050000000000000000000000000000000000000000000000000000000000",
        "0x47314ebc95c63f3fd909af6442ed250d823b2ee8a6e48d8167d4dfdab96c8b5e",
        "0xce3d1b002aa817e3718132b7ffe6cea677f81b1b3b690b8052732d8e1a70d06b",
        "0x4715bf9a259680cd06827b30bddb27ad445506e9edeb72a3eab904d94dea816b",
        "0xce38745b03a4351bbea18f0aadd0001d1c4f1b23b250ed40204591910a77bae2"
    ],
    "TimestampProof": [
        "0x28a2c80000000000000000000000000000000000000000000000000000000000",
        "0xa749df3368741198702798435eea361b1b1946aa9456587a2be377c8472ea2df",
        "0xb1c03097a5a24f46cdb684df37e3ac0536a76428be1a6c6d6450378701ab1f3d",
        "0x38914949a92dc9e402aee96301b080f769f06d752a32acecaa0458cba66cf471"
    ],
    "ExecutionPayloadProof": [
        "0xb6a435ffd17014d1dad214ba466aaa7fba5aa247945d2c29fd53e90d554f4474",
        "0x336488033fe5f3ef4ccc12af07b9370b92e553e35ecb4a337a1b1c0e4afe1e0e",
        "0xdb56114e00fdd4c1f85c892bf35ac9a89289aaecb1ebd0a96cde606a748b5d71",
        "0x5ec9aaf0a3571602f4704d4471b9af564caf17e4d22a7c31017293cb95949053",
        "0x0000000000000000000000000000000000000000000000000000000000000000",
        "0xf5a5fd42d16a20302798ef6ed309979b43003d2320d9f0e8ea9831a92759fb4b",
        "0xc1f7cb289e44e9f711d7d7c05b67b84b8c6dd0394b688922a490cfd3fe216db1"
    ],
    "ValidatorFields": [
        "0xe36689b7b39ee895a754ba878afac2aa5d83349143a8b23d371823dd9ed3435d",
        "0x0100000000000000000000008e35f095545c56b07c942a4f3b055ef1ec4cb148",
        "0x0040597307000000000000000000000000000000000000000000000000000000",
        "0x0000000000000000000000000000000000000000000000000000000000000000",
        "0xea65010000000000000000000000000000000000000000000000000000000000",
        "0xf265010000000000000000000000000000000000000000000000000000000000",
        "0xffffffffffffffff000000000000000000000000000000000000000000000000",
        "0x0000000000000000000000000000000000000000000000000000000000000000"
    ],
    "WithdrawalFields": [
        "0x45cee50000000000000000000000000000000000000000000000000000000000",
        "0x419f040000000000000000000000000000000000000000000000000000000000",
        "0x59b0d71688da01057c08e4c1baa8faa629819c2a000000000000000000000000",
        "0xe5015b7307000000000000000000000000000000000000000000000000000000"
    ],
    "StateRootAgainstLatestBlockHeaderProof": [
        "0x0000000000000000000000000000000000000000000000000000000000000000",
        "0xf5a5fd42d16a20302798ef6ed309979b43003d2320d9f0e8ea9831a92759fb4b",
        "0xdb56114e00fdd4c1f85c892bf35ac9a89289aaecb1ebd0a96cde606a748b5d71"
    ],
    "HistoricalSummaryProof": [
        "0x050b5923fe2e470849a7d467e4cbed4803d3a46d516b84552567976960ff4ccc",
        "0x6ab9b5fc357c793cc5339398016c28ea21f0be4d56a68b554a29766dd312eeeb",
        "0xb8c4c9f1dec537f4c4652e6bf519bac768e85b2590b7683e392aab698b50d529",
        "0x1cae4e7facb6883024359eb1e9212d36e68a106a7733dc1c099017a74e5f465a",
        "0x616439c1379e10fc6ad2fa192a2e49c2d5a7155fdde95911f37fcfb75952fcb2",
        "0x301ab0d5d5ada4bd2e859658fc31743b5a502b26bc9b8b162e5a161e21218048",
        "0x9d2bc97fffd61659313009e67a4c729a10274f2af26914a53bc7af6717da211e",
        "0x4bdcbe543f9ef7348855aac43d6b6286f9c0c7be53de8a1300bea1ba5ba0758e",
        "0xb6631640d626ea9523ae619a42633072614326cc9220462dffdeb63e804ef05f",
        "0xf19a76e33ca189a8682ece523c2afda138db575955b7af31a427c9b8adb41e15",
        "0x221b43ad87d7410624842cad296fc48360b5bf4e835f6ff610db736774d2f2d3",
        "0x297c51f4ff236db943bebeb35538e207c8de6330d26aa8138a9ca206f42154bf",
        "0x129a0644f33b9ee4e9a36a11dd59d1dedc64012fbb7a79263d07f82d647ffba8",
        "0x763794c2042b9c8381ac7c4d7f4d38b0abb38069b2810b522f87951f25d9d2be",
        "0x0000000000000000000000000000000000000000000000000000000000000000",
        "0xee0639a2ada97368e8b3493f9d2141e16c3cd9fe54e13691bb7a2c376c56c7c8",
        "0xdb56114e00fdd4c1f85c892bf35ac9a89289aaecb1ebd0a96cde606a748b5d71",
        "0xc78009fdf07fc56a11f122370658a353aaa542ed63e44c4bc15ff4cd105ab33c",
        "0xba2bc704559c23541f0c9efa0b522454e8cd06cd504d0e45724709cf5672640f",
        "0x9efde052aa15429fae05bad4d0b1d7c64da64d03d7a1854a588c2cb8430c0d30",
        "0xd88ddfeed400a8755596b21942c1497e114c302e6118290f91e6772976041fa1",
        "0xff857f4c17c9fb2e544e496685ebd8e2258c761e4636cfb031ba73a4430061c7",
        "0x26846476fd5fc54a5d43385167c95144f2643f533cc85bb9d16b782f8d7db193",
        "0x506d86582d252405b840018792cad2bf1259f1ef5aa5f887e13cb2f0094f51e1",
        "0xffff0ad7e659772f9534c195c815efc4014ef1e1daed4404c06385d11192e92b",
        "0x6cf04127db05441cd833107a52be852868890e4317e6a02ab47683aa75964220",
        "0xb7d05f875f140027ef5118a2247bbb84ce8f2f0f1123623085daf7960c329f5f",
        "0xdf6af5f5bbdb6be9ef8aa618e4bf8073960867171e29676f8b284dea6a08a85e",
        "0xb58d900f5e182e3c50ef74969ea16c7726c549757cc23523c369587da7293784",
        "0xd49a7502ffcfb0340b1d7885688500ca308161a7f96b62df9d083b71fcc8f2bb",
        "0x8fe6b1689256c0d385f42f5bbe2027a22c1996e110ba97c171d3e5948de92beb",
        "0x8d0d63c39ebade8509e0ae3c9c3876fb5fa112be18f905ecacfecb92057603ab",
        "0x95eec8b2e541cad4e91de38385f2e046619f54496c2382cb6cacd5b98c26f5a4",
        "0xf893e908917775b62bff23294dbbe3a1cd8e6cc1c35b4801887b646a6f81f17f",
        "0xcddba7b592e3133393c16194fac7431abf2f5485ed711db282183c819e08ebaa",
        "0x8a8d7fe3af8caa085a7639a832001457dfb9128a8061142ad0335629ff23ff9c",
        "0xfeb3c337d7a51a6fbf00b9e34c52e1c9195c969bd4e7a0bfd51d5c5bed9c1167",
        "0xe71f0aa83cc32edfbefa9f4d3e0174ca85182eec9f3a09f6a6c0df6377a510d7",
        "0x9300000000000000000000000000000000000000000000000000000000000000",
        "0xd9ed050000000000000000000000000000000000000000000000000000000000",
        "0xd824a89a9d5dd329a069b394ddc6618c70ed784982061959ac77d58d48e9d7c8",
        "0xdb56114e00fdd4c1f85c892bf35ac9a89289aaecb1ebd0a96cde606a748b5d71",
        "0x8dc0b81ebe27fb91663a74713252d2eae5deb3b983374afc3c2d2f6b254128f1",
        "0x09c7a863a253b4163a10916db2781eb35f58c016f0a24b3331ed84af3822c341"
    ]
}
````

## File: src/test/test-data/fullWithdrawalProof_Latest_28ETH.json
````json
{"slot":6397852,"validatorIndex":302913,"historicalSummaryIndex":146,"withdrawalIndex":0,"blockHeaderRootIndex":8092,"beaconStateRoot":"0xc9bc855bfd67190b654dc87cfe6945cdafa1d8bba66c3c2e81748f98c0c0e95b","slotRoot":"0x9c9f610000000000000000000000000000000000000000000000000000000000","timestampRoot":"0xb06fed6400000000000000000000000000000000000000000000000000000000","blockHeaderRoot":"0xbd83e79a38e454ece98a2f9e661792047984889db19234d11143322522e444fb","blockBodyRoot":"0x3e5c78192898e4f24aeceb181e58e4c5f390059ff6eebf0cbee6a096969a59a8","executionPayloadRoot":"0x8478de9992c86ab2617576c4b32267a2de50fd2bd35c8481a3d4a1731c0d5fe4","latestBlockHeaderRoot":"0x9ce41a41052e65ec6a0b3b021dc2f6f98f6060f22d70ac92ade6bcc3d4acca54","SlotProof":["0x89c5010000000000000000000000000000000000000000000000000000000000","0xab4a015ca78ff722e478d047b19650dc6fc92a4270c6cd34401523d3d6a1d9f2","0x1dfeede5317301d17b8e3ea54e055bd0567240cc27f76af3adc823ad7f6b6833"],"WithdrawalProof":["0xa3d843f57c18ee3dac0eb263e446fe5d0110059137807d3cae4a2e60ccca013f","0x87441da495942a4af734cbca4dbcf0b96b2d83137ce595c9f29495aae6a8d99e","0xae0dc609ecbfb26abc191227a76efb332aaea29725253756f2cad136ef5837a6","0x765bcd075991ecad96203020d1576fdb9b45b41dad3b5adde11263ab9f6f56b8","0x1000000000000000000000000000000000000000000000000000000000000000","0x0000000000000000000000000000000000000000000000000000000000000000","0x9d9b56c23faa6a8abf0a49105eb12bbdfdf198a9c6c616b8f24f6e91ad79de92","0xac5e32ea973e990d191039e91c7d9fd9830599b8208675f159c3df128228e729","0x38914949a92dc9e402aee96301b080f769f06d752a32acecaa0458cba66cf471"],"ValidatorProof":["0x9e06c3582190fe488eac3f9f6c95622742f9afe3e038b39d2ca97ba6d5d0de4e","0x3eb11a14af12d8558cc14493938ffa0a1c6155349699c2b9245e76344d9922ee","0x81c959aeae7524f4f1d2d3d930ba504cbe86330619a221c9e2d9fb315e32a4d1","0x9b9adf5d31a74f30ae86ce7f7a8bfe89d2bdf2bd799d0c6896174b4f15878bf1","0x17d22cd18156b4bcbefbcfa3ed820c14cc5af90cb7c02c373cc476bc947ba4ac","0x22c1a00da80f2c5c8a11fdd629af774b9dde698305735d63b19aed6a70310537","0x949da2d82acf86e064a7022c5d5e69528ad6d3dd5b9cdf7fb9b736f0d925fc38","0x1920215f3c8c349a04f6d29263f495416e58d85c885b7d356dd4d335427d2748","0x7f12746ac9a3cc418594ab2c25838fdaf9ef43050a12f38f0c25ad7f976d889a","0x451a649946a59a90f56035d1eccdfcaa99ac8bb74b87c403653bdc5bc0055e2c","0x00ab86a6644a7694fa7bc0da3a8730404ea7e26da981b169316f7acdbbe8c79b","0x0d500027bb8983acbec0993a3d063f5a1f4b9a5b5893016bc9eec28e5633867e","0x2ba5cbed64a0202199a181c8612a8c5dad2512ad0ec6aa7f0c079392e16008ee","0xab8576644897391ddc0773ac95d072de29d05982f39201a5e0630b81563e91e9","0xc6e90f3f46f28faea3476837d2ec58ad5fa171c1f04446f2aa40aa433523ec74","0xb86e491b234c25dc5fa17b43c11ef04a7b3e89f99b2bb7d8daf87ee6dc6f3ae3","0xdb41e006a5111a4f2620a004e207d2a63fc5324d7f528409e779a34066a9b67f","0xe2356c743f98d89213868108ad08074ca35f685077e487077cef8a55917736c6","0xf7552771443e29ebcc7a4aad87e308783559a0b4ff696a0e49f81fb2736fe528","0x3d3aabf6c36de4242fef4b6e49441c24451ccf0e8e184a33bece69d3e3d40ac3","0xcddba7b592e3133393c16194fac7431abf2f5485ed711db282183c819e08ebaa","0x8a8d7fe3af8caa085a7639a832001457dfb9128a8061142ad0335629ff23ff9c","0xfeb3c337d7a51a6fbf00b9e34c52e1c9195c969bd4e7a0bfd51d5c5bed9c1167","0xe71f0aa83cc32edfbefa9f4d3e0174ca85182eec9f3a09f6a6c0df6377a510d7","0x31206fa80a50bb6abe29085058f16212212a60eec8f049fecb92d8c8e0a84bc0","0x21352bfecbeddde993839f614c3dac0a3ee37543f9b412b16199dc158e23b544","0x619e312724bb6d7c3153ed9de791d764a366b389af13c58bf8a8d90481a46765","0x7cdd2986268250628d0c10e385c58c6191e6fbe05191bcc04f133f2cea72c1c4","0x848930bd7ba8cac54661072113fb278869e07bb8587f91392933374d017bcbe1","0x8869ff2c22b28cc10510d9853292803328be4fb0e80495e8bb8d271f5b889636","0xb5fe28e79f1b850f8658246ce9b6a1e7b49fc06db7143e8fe0b4f2b0c5523a5c","0x985e929f70af28d0bdd1a90a808f977f597c7c778c489e98d3bd8910d31ac0f7","0xc6f67e02e6e4e1bdefb994c6098953f34636ba2b6ca20a4721d2b26a886722ff","0x1c9a7e5ff1cf48b4ad1582d3f4e4a1004f3b20d8c5a2b71387a4254ad933ebc5","0x2f075ae229646b6f6aed19a5e372cf295081401eb893ff599b3f9acc0c0d3e7d","0x328921deb59612076801e8cd61592107b5c67c79b846595cc6320c395b46362c","0xbfb909fdb236ad2411b4e4883810a074b840464689986c3f8a8091827e17c327","0x55d8fb3687ba3ba49f342c77f5a1f89bec83d811446e1a467139213d640b6a74","0xf7210d4f8e7e1039790e7bf4efa207555a10a6db1dd4b95da313aaa88b88fe76","0xad21b516cbc645ffe34ab5de1c8aef8cd4e7f8d2b51e8e1456adc7563cda206f","0x846b080000000000000000000000000000000000000000000000000000000000","0x5a6c050000000000000000000000000000000000000000000000000000000000","0x47314ebc95c63f3fd909af6442ed250d823b2ee8a6e48d8167d4dfdab96c8b5e","0xce3d1b002aa817e3718132b7ffe6cea677f81b1b3b690b8052732d8e1a70d06b","0x4715bf9a259680cd06827b30bddb27ad445506e9edeb72a3eab904d94dea816b","0xf91f8669ffcb2c5c46ef5c23e2fe3308154469b55494145b26ca111c173e1184"],"TimestampProof":["0x28a2c80000000000000000000000000000000000000000000000000000000000","0xa749df3368741198702798435eea361b1b1946aa9456587a2be377c8472ea2df","0x251a5e0b34e9eb58a44a231cfb3e817e3cf3f82cde755dc5fe94cbe36e146b5b","0x38914949a92dc9e402aee96301b080f769f06d752a32acecaa0458cba66cf471"],"ExecutionPayloadProof":["0xb6a435ffd17014d1dad214ba466aaa7fba5aa247945d2c29fd53e90d554f4474","0x336488033fe5f3ef4ccc12af07b9370b92e553e35ecb4a337a1b1c0e4afe1e0e","0xdb56114e00fdd4c1f85c892bf35ac9a89289aaecb1ebd0a96cde606a748b5d71","0x5ec9aaf0a3571602f4704d4471b9af564caf17e4d22a7c31017293cb95949053","0x0000000000000000000000000000000000000000000000000000000000000000","0xf5a5fd42d16a20302798ef6ed309979b43003d2320d9f0e8ea9831a92759fb4b","0xc1f7cb289e44e9f711d7d7c05b67b84b8c6dd0394b688922a490cfd3fe216db1"],"ValidatorFields":["0xe36689b7b39ee895a754ba878afac2aa5d83349143a8b23d371823dd9ed3435d","0x0100000000000000000000008e35f095545c56b07c942a4f3b055ef1ec4cb148","0x0040597307000000000000000000000000000000000000000000000000000000","0x0000000000000000000000000000000000000000000000000000000000000000","0xea65010000000000000000000000000000000000000000000000000000000000","0xf265010000000000000000000000000000000000000000000000000000000000","0xffffffffffffffff000000000000000000000000000000000000000000000000","0x0000000000000000000000000000000000000000000000000000000000000000"],"WithdrawalFields":["0x45cee50000000000000000000000000000000000000000000000000000000000","0x419f040000000000000000000000000000000000000000000000000000000000","0x59b0d71688da01057c08e4c1baa8faa629819c2a000000000000000000000000","0xe5d9ef8406000000000000000000000000000000000000000000000000000000"],"StateRootAgainstLatestBlockHeaderProof":["0x0000000000000000000000000000000000000000000000000000000000000000","0xf5a5fd42d16a20302798ef6ed309979b43003d2320d9f0e8ea9831a92759fb4b","0xdb56114e00fdd4c1f85c892bf35ac9a89289aaecb1ebd0a96cde606a748b5d71"],"HistoricalSummaryProof":["0x050b5923fe2e470849a7d467e4cbed4803d3a46d516b84552567976960ff4ccc","0x6ab9b5fc357c793cc5339398016c28ea21f0be4d56a68b554a29766dd312eeeb","0xb8c4c9f1dec537f4c4652e6bf519bac768e85b2590b7683e392aab698b50d529","0x1cae4e7facb6883024359eb1e9212d36e68a106a7733dc1c099017a74e5f465a","0x616439c1379e10fc6ad2fa192a2e49c2d5a7155fdde95911f37fcfb75952fcb2","0x301ab0d5d5ada4bd2e859658fc31743b5a502b26bc9b8b162e5a161e21218048","0x9d2bc97fffd61659313009e67a4c729a10274f2af26914a53bc7af6717da211e","0x4bdcbe543f9ef7348855aac43d6b6286f9c0c7be53de8a1300bea1ba5ba0758e","0xb6631640d626ea9523ae619a42633072614326cc9220462dffdeb63e804ef05f","0xf19a76e33ca189a8682ece523c2afda138db575955b7af31a427c9b8adb41e15","0x221b43ad87d7410624842cad296fc48360b5bf4e835f6ff610db736774d2f2d3","0x297c51f4ff236db943bebeb35538e207c8de6330d26aa8138a9ca206f42154bf","0x129a0644f33b9ee4e9a36a11dd59d1dedc64012fbb7a79263d07f82d647ffba8","0x763794c2042b9c8381ac7c4d7f4d38b0abb38069b2810b522f87951f25d9d2be","0x0000000000000000000000000000000000000000000000000000000000000000","0xee0639a2ada97368e8b3493f9d2141e16c3cd9fe54e13691bb7a2c376c56c7c8","0xdb56114e00fdd4c1f85c892bf35ac9a89289aaecb1ebd0a96cde606a748b5d71","0xc78009fdf07fc56a11f122370658a353aaa542ed63e44c4bc15ff4cd105ab33c","0xba2bc704559c23541f0c9efa0b522454e8cd06cd504d0e45724709cf5672640f","0x9efde052aa15429fae05bad4d0b1d7c64da64d03d7a1854a588c2cb8430c0d30","0xd88ddfeed400a8755596b21942c1497e114c302e6118290f91e6772976041fa1","0xff857f4c17c9fb2e544e496685ebd8e2258c761e4636cfb031ba73a4430061c7","0x26846476fd5fc54a5d43385167c95144f2643f533cc85bb9d16b782f8d7db193","0x506d86582d252405b840018792cad2bf1259f1ef5aa5f887e13cb2f0094f51e1","0xffff0ad7e659772f9534c195c815efc4014ef1e1daed4404c06385d11192e92b","0x6cf04127db05441cd833107a52be852868890e4317e6a02ab47683aa75964220","0xb7d05f875f140027ef5118a2247bbb84ce8f2f0f1123623085daf7960c329f5f","0xdf6af5f5bbdb6be9ef8aa618e4bf8073960867171e29676f8b284dea6a08a85e","0xb58d900f5e182e3c50ef74969ea16c7726c549757cc23523c369587da7293784","0xd49a7502ffcfb0340b1d7885688500ca308161a7f96b62df9d083b71fcc8f2bb","0x8fe6b1689256c0d385f42f5bbe2027a22c1996e110ba97c171d3e5948de92beb","0x8d0d63c39ebade8509e0ae3c9c3876fb5fa112be18f905ecacfecb92057603ab","0x95eec8b2e541cad4e91de38385f2e046619f54496c2382cb6cacd5b98c26f5a4","0xf893e908917775b62bff23294dbbe3a1cd8e6cc1c35b4801887b646a6f81f17f","0xcddba7b592e3133393c16194fac7431abf2f5485ed711db282183c819e08ebaa","0x8a8d7fe3af8caa085a7639a832001457dfb9128a8061142ad0335629ff23ff9c","0xfeb3c337d7a51a6fbf00b9e34c52e1c9195c969bd4e7a0bfd51d5c5bed9c1167","0xe71f0aa83cc32edfbefa9f4d3e0174ca85182eec9f3a09f6a6c0df6377a510d7","0x9300000000000000000000000000000000000000000000000000000000000000","0xd9ed050000000000000000000000000000000000000000000000000000000000","0xd824a89a9d5dd329a069b394ddc6618c70ed784982061959ac77d58d48e9d7c8","0xdb56114e00fdd4c1f85c892bf35ac9a89289aaecb1ebd0a96cde606a748b5d71","0x8dc0b81ebe27fb91663a74713252d2eae5deb3b983374afc3c2d2f6b254128f1","0x09c7a863a253b4163a10916db2781eb35f58c016f0a24b3331ed84af3822c341"]}
````

## File: src/test/test-data/fullWithdrawalProof_Latest.json
````json
{
    "slot": 6397852,
    "validatorIndex": 302913,
    "historicalSummaryIndex": 146,
    "withdrawalIndex": 0,
    "blockHeaderRootIndex": 8092,
    "beaconStateRoot": "0xe562b064fa5f17412bf13cd3b650f9d84b912f127c3f4c09879864d51a8b4daf",
    "slotRoot": "0x9c9f610000000000000000000000000000000000000000000000000000000000",
    "timestampRoot": "0xb06fed6400000000000000000000000000000000000000000000000000000000",
    "blockHeaderRoot": "0x8b036996f94e940c80c5c692fd0e25467a5d55f1cf92b7808f92090fc7be1d17",
    "executionPayloadRoot": "0xe628472355543b53917635e60c1f924f111f7a3cd58f2d947e8631b9d9924cb1",
    "latestBlockHeaderRoot": "0xa81fa0ec796b5f84e6435745245f6d24279a11a74e29666560355507c441332d",
    "SlotProof": [
        "0x89c5010000000000000000000000000000000000000000000000000000000000",
        "0xab4a015ca78ff722e478d047b19650dc6fc92a4270c6cd34401523d3d6a1d9f2",
        "0xf4e65df697eb85f3ab176ac93b6ad4d96bd6b04bdddcc4f6c98f0fa94effc553"
    ],
    "WithdrawalProof": [
        "0xa3d843f57c18ee3dac0eb263e446fe5d0110059137807d3cae4a2e60ccca013f",
        "0x87441da495942a4af734cbca4dbcf0b96b2d83137ce595c9f29495aae6a8d99e",
        "0xae0dc609ecbfb26abc191227a76efb332aaea29725253756f2cad136ef5837a6",
        "0x765bcd075991ecad96203020d1576fdb9b45b41dad3b5adde11263ab9f6f56b8",
        "0x1000000000000000000000000000000000000000000000000000000000000000",
        "0x0000000000000000000000000000000000000000000000000000000000000000",
        "0x9d9b56c23faa6a8abf0a49105eb12bbdfdf198a9c6c616b8f24f6e91ad79de92",
        "0xac5e32ea973e990d191039e91c7d9fd9830599b8208675f159c3df128228e729",
        "0x38914949a92dc9e402aee96301b080f769f06d752a32acecaa0458cba66cf471"
    ],
    "ValidatorProof": [
        "0x9e06c3582190fe488eac3f9f6c95622742f9afe3e038b39d2ca97ba6d5d0de4e",
        "0x3eb11a14af12d8558cc14493938ffa0a1c6155349699c2b9245e76344d9922ee",
        "0x81c959aeae7524f4f1d2d3d930ba504cbe86330619a221c9e2d9fb315e32a4d1",
        "0x9b9adf5d31a74f30ae86ce7f7a8bfe89d2bdf2bd799d0c6896174b4f15878bf1",
        "0x17d22cd18156b4bcbefbcfa3ed820c14cc5af90cb7c02c373cc476bc947ba4ac",
        "0x22c1a00da80f2c5c8a11fdd629af774b9dde698305735d63b19aed6a70310537",
        "0x949da2d82acf86e064a7022c5d5e69528ad6d3dd5b9cdf7fb9b736f0d925fc38",
        "0x1920215f3c8c349a04f6d29263f495416e58d85c885b7d356dd4d335427d2748",
        "0x7f12746ac9a3cc418594ab2c25838fdaf9ef43050a12f38f0c25ad7f976d889a",
        "0x451a649946a59a90f56035d1eccdfcaa99ac8bb74b87c403653bdc5bc0055e2c",
        "0x00ab86a6644a7694fa7bc0da3a8730404ea7e26da981b169316f7acdbbe8c79b",
        "0x0d500027bb8983acbec0993a3d063f5a1f4b9a5b5893016bc9eec28e5633867e",
        "0x2ba5cbed64a0202199a181c8612a8c5dad2512ad0ec6aa7f0c079392e16008ee",
        "0xab8576644897391ddc0773ac95d072de29d05982f39201a5e0630b81563e91e9",
        "0xc6e90f3f46f28faea3476837d2ec58ad5fa171c1f04446f2aa40aa433523ec74",
        "0xb86e491b234c25dc5fa17b43c11ef04a7b3e89f99b2bb7d8daf87ee6dc6f3ae3",
        "0xdb41e006a5111a4f2620a004e207d2a63fc5324d7f528409e779a34066a9b67f",
        "0xe2356c743f98d89213868108ad08074ca35f685077e487077cef8a55917736c6",
        "0xf7552771443e29ebcc7a4aad87e308783559a0b4ff696a0e49f81fb2736fe528",
        "0x3d3aabf6c36de4242fef4b6e49441c24451ccf0e8e184a33bece69d3e3d40ac3",
        "0xcddba7b592e3133393c16194fac7431abf2f5485ed711db282183c819e08ebaa",
        "0x8a8d7fe3af8caa085a7639a832001457dfb9128a8061142ad0335629ff23ff9c",
        "0xfeb3c337d7a51a6fbf00b9e34c52e1c9195c969bd4e7a0bfd51d5c5bed9c1167",
        "0xe71f0aa83cc32edfbefa9f4d3e0174ca85182eec9f3a09f6a6c0df6377a510d7",
        "0x31206fa80a50bb6abe29085058f16212212a60eec8f049fecb92d8c8e0a84bc0",
        "0x21352bfecbeddde993839f614c3dac0a3ee37543f9b412b16199dc158e23b544",
        "0x619e312724bb6d7c3153ed9de791d764a366b389af13c58bf8a8d90481a46765",
        "0x7cdd2986268250628d0c10e385c58c6191e6fbe05191bcc04f133f2cea72c1c4",
        "0x848930bd7ba8cac54661072113fb278869e07bb8587f91392933374d017bcbe1",
        "0x8869ff2c22b28cc10510d9853292803328be4fb0e80495e8bb8d271f5b889636",
        "0xb5fe28e79f1b850f8658246ce9b6a1e7b49fc06db7143e8fe0b4f2b0c5523a5c",
        "0x985e929f70af28d0bdd1a90a808f977f597c7c778c489e98d3bd8910d31ac0f7",
        "0xc6f67e02e6e4e1bdefb994c6098953f34636ba2b6ca20a4721d2b26a886722ff",
        "0x1c9a7e5ff1cf48b4ad1582d3f4e4a1004f3b20d8c5a2b71387a4254ad933ebc5",
        "0x2f075ae229646b6f6aed19a5e372cf295081401eb893ff599b3f9acc0c0d3e7d",
        "0x328921deb59612076801e8cd61592107b5c67c79b846595cc6320c395b46362c",
        "0xbfb909fdb236ad2411b4e4883810a074b840464689986c3f8a8091827e17c327",
        "0x55d8fb3687ba3ba49f342c77f5a1f89bec83d811446e1a467139213d640b6a74",
        "0xf7210d4f8e7e1039790e7bf4efa207555a10a6db1dd4b95da313aaa88b88fe76",
        "0xad21b516cbc645ffe34ab5de1c8aef8cd4e7f8d2b51e8e1456adc7563cda206f",
        "0x846b080000000000000000000000000000000000000000000000000000000000",
        "0x5a6c050000000000000000000000000000000000000000000000000000000000",
        "0x47314ebc95c63f3fd909af6442ed250d823b2ee8a6e48d8167d4dfdab96c8b5e",
        "0xce3d1b002aa817e3718132b7ffe6cea677f81b1b3b690b8052732d8e1a70d06b",
        "0x4715bf9a259680cd06827b30bddb27ad445506e9edeb72a3eab904d94dea816b",
        "0xba25997a12576cc460c39cfc6cc87d7dc215b237a0f3c4dc8cb7473125b2e138"
    ],
    "TimestampProof": [
        "0x28a2c80000000000000000000000000000000000000000000000000000000000",
        "0xa749df3368741198702798435eea361b1b1946aa9456587a2be377c8472ea2df",
        "0xb1c03097a5a24f46cdb684df37e3ac0536a76428be1a6c6d6450378701ab1f3d",
        "0x38914949a92dc9e402aee96301b080f769f06d752a32acecaa0458cba66cf471"
    ],
    "ExecutionPayloadProof": [
        "0xb6a435ffd17014d1dad214ba466aaa7fba5aa247945d2c29fd53e90d554f4474",
        "0x336488033fe5f3ef4ccc12af07b9370b92e553e35ecb4a337a1b1c0e4afe1e0e",
        "0xdb56114e00fdd4c1f85c892bf35ac9a89289aaecb1ebd0a96cde606a748b5d71",
        "0x5ec9aaf0a3571602f4704d4471b9af564caf17e4d22a7c31017293cb95949053",
        "0x0000000000000000000000000000000000000000000000000000000000000000",
        "0xf5a5fd42d16a20302798ef6ed309979b43003d2320d9f0e8ea9831a92759fb4b",
        "0xc1f7cb289e44e9f711d7d7c05b67b84b8c6dd0394b688922a490cfd3fe216db1"
    ],
    "ValidatorFields": [
        "0xe36689b7b39ee895a754ba878afac2aa5d83349143a8b23d371823dd9ed3435d",
        "0x0100000000000000000000008e35f095545c56b07c942a4f3b055ef1ec4cb148",
        "0x0040597307000000000000000000000000000000000000000000000000000000",
        "0x0000000000000000000000000000000000000000000000000000000000000000",
        "0xea65010000000000000000000000000000000000000000000000000000000000",
        "0xf265010000000000000000000000000000000000000000000000000000000000",
        "0xffffffffffffffff000000000000000000000000000000000000000000000000",
        "0x0000000000000000000000000000000000000000000000000000000000000000"
    ],
    "WithdrawalFields": [
        "0x45cee50000000000000000000000000000000000000000000000000000000000",
        "0x419f040000000000000000000000000000000000000000000000000000000000",
        "0x59b0d71688da01057c08e4c1baa8faa629819c2a000000000000000000000000",
        "0xe5015b7307000000000000000000000000000000000000000000000000000000"
    ],
    "StateRootAgainstLatestBlockHeaderProof": [
        "0x0000000000000000000000000000000000000000000000000000000000000000",
        "0xf5a5fd42d16a20302798ef6ed309979b43003d2320d9f0e8ea9831a92759fb4b",
        "0xdb56114e00fdd4c1f85c892bf35ac9a89289aaecb1ebd0a96cde606a748b5d71"
    ],
    "HistoricalSummaryProof": [
        "0x050b5923fe2e470849a7d467e4cbed4803d3a46d516b84552567976960ff4ccc",
        "0x6ab9b5fc357c793cc5339398016c28ea21f0be4d56a68b554a29766dd312eeeb",
        "0xb8c4c9f1dec537f4c4652e6bf519bac768e85b2590b7683e392aab698b50d529",
        "0x1cae4e7facb6883024359eb1e9212d36e68a106a7733dc1c099017a74e5f465a",
        "0x616439c1379e10fc6ad2fa192a2e49c2d5a7155fdde95911f37fcfb75952fcb2",
        "0x301ab0d5d5ada4bd2e859658fc31743b5a502b26bc9b8b162e5a161e21218048",
        "0x9d2bc97fffd61659313009e67a4c729a10274f2af26914a53bc7af6717da211e",
        "0x4bdcbe543f9ef7348855aac43d6b6286f9c0c7be53de8a1300bea1ba5ba0758e",
        "0xb6631640d626ea9523ae619a42633072614326cc9220462dffdeb63e804ef05f",
        "0xf19a76e33ca189a8682ece523c2afda138db575955b7af31a427c9b8adb41e15",
        "0x221b43ad87d7410624842cad296fc48360b5bf4e835f6ff610db736774d2f2d3",
        "0x297c51f4ff236db943bebeb35538e207c8de6330d26aa8138a9ca206f42154bf",
        "0x129a0644f33b9ee4e9a36a11dd59d1dedc64012fbb7a79263d07f82d647ffba8",
        "0x763794c2042b9c8381ac7c4d7f4d38b0abb38069b2810b522f87951f25d9d2be",
        "0x0000000000000000000000000000000000000000000000000000000000000000",
        "0xee0639a2ada97368e8b3493f9d2141e16c3cd9fe54e13691bb7a2c376c56c7c8",
        "0xdb56114e00fdd4c1f85c892bf35ac9a89289aaecb1ebd0a96cde606a748b5d71",
        "0xc78009fdf07fc56a11f122370658a353aaa542ed63e44c4bc15ff4cd105ab33c",
        "0xba2bc704559c23541f0c9efa0b522454e8cd06cd504d0e45724709cf5672640f",
        "0x9efde052aa15429fae05bad4d0b1d7c64da64d03d7a1854a588c2cb8430c0d30",
        "0xd88ddfeed400a8755596b21942c1497e114c302e6118290f91e6772976041fa1",
        "0xff857f4c17c9fb2e544e496685ebd8e2258c761e4636cfb031ba73a4430061c7",
        "0x26846476fd5fc54a5d43385167c95144f2643f533cc85bb9d16b782f8d7db193",
        "0x506d86582d252405b840018792cad2bf1259f1ef5aa5f887e13cb2f0094f51e1",
        "0xffff0ad7e659772f9534c195c815efc4014ef1e1daed4404c06385d11192e92b",
        "0x6cf04127db05441cd833107a52be852868890e4317e6a02ab47683aa75964220",
        "0xb7d05f875f140027ef5118a2247bbb84ce8f2f0f1123623085daf7960c329f5f",
        "0xdf6af5f5bbdb6be9ef8aa618e4bf8073960867171e29676f8b284dea6a08a85e",
        "0xb58d900f5e182e3c50ef74969ea16c7726c549757cc23523c369587da7293784",
        "0xd49a7502ffcfb0340b1d7885688500ca308161a7f96b62df9d083b71fcc8f2bb",
        "0x8fe6b1689256c0d385f42f5bbe2027a22c1996e110ba97c171d3e5948de92beb",
        "0x8d0d63c39ebade8509e0ae3c9c3876fb5fa112be18f905ecacfecb92057603ab",
        "0x95eec8b2e541cad4e91de38385f2e046619f54496c2382cb6cacd5b98c26f5a4",
        "0xf893e908917775b62bff23294dbbe3a1cd8e6cc1c35b4801887b646a6f81f17f",
        "0xcddba7b592e3133393c16194fac7431abf2f5485ed711db282183c819e08ebaa",
        "0x8a8d7fe3af8caa085a7639a832001457dfb9128a8061142ad0335629ff23ff9c",
        "0xfeb3c337d7a51a6fbf00b9e34c52e1c9195c969bd4e7a0bfd51d5c5bed9c1167",
        "0xe71f0aa83cc32edfbefa9f4d3e0174ca85182eec9f3a09f6a6c0df6377a510d7",
        "0x9300000000000000000000000000000000000000000000000000000000000000",
        "0xd9ed050000000000000000000000000000000000000000000000000000000000",
        "0xd824a89a9d5dd329a069b394ddc6618c70ed784982061959ac77d58d48e9d7c8",
        "0xdb56114e00fdd4c1f85c892bf35ac9a89289aaecb1ebd0a96cde606a748b5d71",
        "0x8dc0b81ebe27fb91663a74713252d2eae5deb3b983374afc3c2d2f6b254128f1",
        "0x09c7a863a253b4163a10916db2781eb35f58c016f0a24b3331ed84af3822c341"
    ]
}
````

## File: src/test/test-data/operators.json
````json
{
    "numOperators": 15,
    "operators": [
        {
            "Address": "0x364ea4241059a1880a289ccf6f3e730371e399c2",
            "SecretKey": "26538123046512735896321680912735809321651",
            "SField": "11819029207127053157019202363815717308230004305264870932201236865394129798528",
            "RPoint": {
                "X": "4151816577563894587001429602861434330710880584628236143409913584674951374486",
                "Y": "14755168631248666267406561486877346692276498564690931377857101897349212004983"
            },
            "PubkeyG1": {
                "X": "18260007818883133054078754218619977578772505796600400998181738095793040006897",
                "Y": "3432351341799135763167709827653955074218841517684851694584291831827675065899"
            },
            "PubkeyG2": {
                "X": {
                    "A0": "7873360006442301391509331169041141152067986239770361289399829888515098511089",
                    "A1": "4819287168576083437987399094513915926762558557241451705488044107651777333471"
                },
                "Y": {
                    "A0": "20134059591429338312012269666175785157377156721420899775744488735642013266015",
                    "A1": "5180163866630806529018451776671042574814236436776522234046604410442923698614"
                }
            }
        },
        {
            "Address": "0x435a2d0799fd5b4f6576d43ddedbfb21eeffd2ed",
            "SecretKey": "26538123046512735896321680912735809321652",
            "SField": "6841827072565597045205937795412322299165267769171326199068981979305129605253",
            "RPoint": {
                "X": "12076439550529905259390228862926613756534481189623148993240145246002590976299",
                "Y": "974155300103671376671957621510050067124810818694470470430352429136065997968"
            },
            "PubkeyG1": {
                "X": "20885635058167472198503803626695880018252841373181906566024991517994827983735",
                "Y": "11837569400448747146619236953090341530939723755586681794040848163257307322015"
            },
            "PubkeyG2": {
                "X": {
                    "A0": "3533647070879242563419359582151690893240073815886344269869120254242419508633",
                    "A1": "9536422671122585613677052246081291259644057320757694709671580313420208694081"
                },
                "Y": {
                    "A0": "12166486073145345231362662138062912830359628001285426518990520911876160470477",
                    "A1": "14962020261456080798629037722818062638639517674733500632912397408761625050802"
                }
            }
        },
        {
            "Address": "0x523e0a2d296e6bc969296a0541289077d2c43246",
            "SecretKey": "26538123046512735896321680912735809321653",
            "SField": "6251323578278497984001410170708026455838289583399486055694150917867937589622",
            "RPoint": {
                "X": "17659335174238407859449322441269022710538670095928217612186082625191038704952",
                "Y": "4030658631342963783788534863066598739941334059525264488801360888493204491332"
            },
            "PubkeyG1": {
                "X": "2470846831436625524441718675125184646728308675024947867896488186792002263384",
                "Y": "19398539713444487906856323737585450565673486119324566923739712072838048985181"
            },
            "PubkeyG2": {
                "X": {
                    "A0": "18996698705977687383601958641379064195173448823300612508806962257981430138470",
                    "A1": "11390594476086232146697028608851603084418668227205561974107759331535935107531"
                },
                "Y": {
                    "A0": "10549563568039161023384174670373065438958654243218116252293848148484855972510",
                    "A1": "8392609726364984764069457200587817879819857139319066962985233014328835122137"
                }
            }
        },
        {
            "Address": "0x618a412f2446921d3d942c8bf073000b97728f0f",
            "SecretKey": "26538123046512735896321680912735809321654",
            "SField": "12061860258274605985652162007024956030804911220114181564759813442108765736942",
            "RPoint": {
                "X": "7145152916403894254971893757626878750640430645346094737434568772482788991869",
                "Y": "5571984232385193687234211544970704499791824743626734155736946702800034693686"
            },
            "PubkeyG1": {
                "X": "12541368988415564232975583436986866293473603658145394466756402945376729450760",
                "Y": "8511301244073806918313939726706790376744658017957805706622009852760184010910"
            },
            "PubkeyG2": {
                "X": {
                    "A0": "12496796444461928801423998788871427472219126045995885876471223766691196263411",
                    "A1": "20900414356950550650632823116879453189806004631615934725359633772870431548864"
                },
                "Y": {
                    "A0": "1850282599163866918562002476972618618179924465313771842342246796868912815924",
                    "A1": "16267494054236543151546820684638619209010244733864385924658421853804576220788"
                }
            }
        },
        {
            "Address": "0x70130e87da895ef840a9f8c41c6ebf0e5b48e824",
            "SecretKey": "26538123046512735896321680912735809321655",
            "SField": "18246936953360371302513647065102080917080836724122762820676034131128284534276",
            "RPoint": {
                "X": "14485348008548227125800493276491803315994326328485845085024767746874209352205",
                "Y": "8354185564983387451413630826006944059627584517454500268893837380556264839426"
            },
            "PubkeyG1": {
                "X": "12250988429106632987382001675218698439738318866960678150521924430133077466824",
                "Y": "19721708441253375174926671177088389244933199376153285627796664290007532195052"
            },
            "PubkeyG2": {
                "X": {
                    "A0": "15382764368631216635417307340007437259725116431665265535534236291634253279005",
                    "A1": "551113638605800186370795409845956026924016364384585878450724593710757152783"
                },
                "Y": {
                    "A0": "15798745520528389465130300542056950632504309474787848602575280595042835040946",
                    "A1": "15121681895121404713757090493706231060528428365493560188175592305488154660061"
                }
            }
        },
        {
            "Address": "0x7290f60d6666d7be7a41de178216502342562996",
            "SecretKey": "26538123046512735896321680912735809321656",
            "SField": "18341272017139583935816150534955335402336824558387991233830658246285519689014",
            "RPoint": {
                "X": "18174419042266772640587019436747343741444240929289718199821728520031148396624",
                "Y": "12944489167977623909526722715453960134323253038442885147323841789720380485266"
            },
            "PubkeyG1": {
                "X": "21781696011906991536752467363456044926552139424863730238878701223169542126809",
                "Y": "12365056838489612884478362448314510672391017658276612399537174676963477032436"
            },
            "PubkeyG2": {
                "X": {
                    "A0": "7602713822854229266858239462850154602893490834036446886716499673780465081437",
                    "A1": "6755904671274545514612841103024355730484086518739594420309025281657878144069"
                },
                "Y": {
                    "A0": "19169973646980957540631709981893659820049084634788201359252419558688034251538",
                    "A1": "3617096885662895416635037761438216245027220053803903379077414864234110502059"
                }
            }
        },
        {
            "Address": "0x8d8e96b3bb658c5830aef90760f79e6a2a3bba41",
            "SecretKey": "26538123046512735896321680912735809321657",
            "SField": "12685816762097293544054119736761928362052971499853660676176419762479313483888",
            "RPoint": {
                "X": "1845886565323083117137480765392173031492903457678364169791939158881472188429",
                "Y": "13621394807982841470261073338436747381963203491878788814653645637014444568601"
            },
            "PubkeyG1": {
                "X": "3212013732044844428966711160610869391929177932647992063562413834101261373977",
                "Y": "15448314027915072279969465354772467136408027411697025021594849451692520530947"
            },
            "PubkeyG2": {
                "X": {
                    "A0": "19758878765410158466580323802894117259849215806855698140995410808900358199475",
                    "A1": "6427725156456990179277796366756163887223625521472017190816516318004039813324"
                },
                "Y": {
                    "A0": "20996191524580276458284414610581896434480007527247384059381015445157582556532",
                    "A1": "14948621227766242224388430084744009250457802204821770762677931043984889219820"
                }
            }
        },
        {
            "Address": "0xa71e43be339f9791235641f457c1ba2da86b9eb3",
            "SecretKey": "26538123046512735896321680912735809321658",
            "SField": "6042114504025969519448864857463886717993192687698758790871627541311475539318",
            "RPoint": {
                "X": "2992138105299859744840964524791160337229571931324293630805658245249757407389",
                "Y": "15694736019044294046047702836262370586371888280839741425891501314654607706201"
            },
            "PubkeyG1": {
                "X": "3667070400945503213289817934609709506016134089772708044008927730500827726299",
                "Y": "201965492781810222622603023497133228304861253112953784295749598350720860919"
            },
            "PubkeyG2": {
                "X": {
                    "A0": "18480475432118436773114589869805528330114616937670136874673576408735271448220",
                    "A1": "13748787029936230407330641361791178403853002576716058275674223802004495813919"
                },
                "Y": {
                    "A0": "9393505688889091760306178659573951040934743290746925629508348356081460722985",
                    "A1": "8911229656394169335558484911670452902836715586054327693497766770926601776864"
                }
            }
        },
        {
            "Address": "0xca9827a614f6c910c33f7668823f9d079515a6b2",
            "SecretKey": "26538123046512735896321680912735809321659",
            "SField": "4089036516179531739857184481801462737502679331172598056405360493929192933822",
            "RPoint": {
                "X": "11344456565890051191982811922569789285426097564838757420328232921661131972594",
                "Y": "5214697287561608797059987511134212052053543960787141328755773567687921715591"
            },
            "PubkeyG1": {
                "X": "10603532593425799461116428547718401984650331452231439217583617357908466102307",
                "Y": "9038166977605721429955182587619307974711670991162762169137768185433368026502"
            },
            "PubkeyG2": {
                "X": {
                    "A0": "2665943891698121544094051819956376909984132954889653928721123177413544545101",
                    "A1": "5067301718610021746809469955529953474259097833119436258748751618113087224295"
                },
                "Y": {
                    "A0": "14618865954382816111109898027326987227550002588645252687730089534591097604721",
                    "A1": "17668847581520475585017930293964643097348730464667967915604118496715335354459"
                }
            }
        },
        {
            "Address": "0xdda9a89ddf845c9ee5d2810e0833b4a71d66179d",
            "SecretKey": "265381230465127358963216809127358093216510",
            "SField": "3494626234115151042064050025070425206800280651375775826757871600988046500493",
            "RPoint": {
                "X": "2823775573240572793382269280921054559755380883233834426161454792596668870337",
                "Y": "2116482807847046775754020075448309148535809630987701014560424524130609194680"
            },
            "PubkeyG1": {
                "X": "9580940219508129828900474539321198495544615416706116943528153675304087866935",
                "Y": "19817948430483568579408524674460630359968264374260052173849319927990972424409"
            },
            "PubkeyG2": {
                "X": {
                    "A0": "14146902041950849992065142134350889699589625292784530382058790130731064171060",
                    "A1": "9643173139567873327873151464253356980578492901466026171946322545605998333728"
                },
                "Y": {
                    "A0": "14418997116441129782787372775003831815699951211438552978754436263436048789176",
                    "A1": "7555011997614448462339727638657930440787456831044184868102463346992814218544"
                }
            }
        },
        {
            "Address": "0xdde7a5dbb45d0f48d74d40772c2dda8acd89a304",
            "SecretKey": "265381230465127358963216809127358093216511",
            "SField": "19331236222084214974477469493395354532285940046992732403697375380156732141073",
            "RPoint": {
                "X": "18634736052925172105067492946541508040225080612748659668517401756117768987613",
                "Y": "5852722109239017950047732236711408776617783536462429224588732414658414009409"
            },
            "PubkeyG1": {
                "X": "3369815046108753886283376619953242018939084016540366266511463175341760902943",
                "Y": "17472522035733702939562892574753748100276735367509783930154400656979558647072"
            },
            "PubkeyG2": {
                "X": {
                    "A0": "12828974775248479668694052242644004695064721299497890085252948770085462880539",
                    "A1": "7272600703570139069540236030139742611695513123908572460354778844049179248665"
                },
                "Y": {
                    "A0": "6187997634621416381645973736825134854588734099638054268199535544372796244575",
                    "A1": "3168611351805563509285790274061051556477979031759511765104889273283967743401"
                }
            }
        },
        {
            "Address": "0xe3fe83a83f3c7dc625382f062c159809551c580b",
            "SecretKey": "265381230465127358963216809127358093216512",
            "SField": "5508482612796623641475745691306343682701589066262691055533968657240534344204",
            "RPoint": {
                "X": "21685944819341458246191809126376074155122173268146956524878025759785902438148",
                "Y": "14479737406316720196422920923227363552037206020376032776793814881581188057870"
            },
            "PubkeyG1": {
                "X": "8070743655895930899886894874393947088184525509008178391331533769906913292208",
                "Y": "6166041079211541340267466423045787629866667719971895616570343665150421540281"
            },
            "PubkeyG2": {
                "X": {
                    "A0": "2678990229866359665311344452542118509908675024979420599004546926969138331011",
                    "A1": "2049191090024360768595356041854174484396277833846595743282145840232552333594"
                },
                "Y": {
                    "A0": "3201866794780851807317614975829248389859676087140523014123159053900573945553",
                    "A1": "6264970183638030024425633356945995283617627028846078571269515762464600802251"
                }
            }
        },
        {
            "Address": "0x7e32bdd5ba50eb8d5e5bd7d3eef1e8bb7f0177f0",
            "SecretKey": "265381230465127358963216809127358093216513",
            "SField": "8232703131218555943214969386347851175399186201805966768750414520371803575150",
            "RPoint": {
                "X": "19242125080553338551396473264815502757575266047308561121276377861187981762008",
                "Y": "6218373850521459529400329711936878862028424392534186108921910846882020330028"
            },
            "PubkeyG1": {
                "X": "3330687773238963481566047234114671341321386178661830488834900006935732354709",
                "Y": "1586247746639542071922023676451514656089805747478597321110273768112339015566"
            },
            "PubkeyG2": {
                "X": {
                    "A0": "17613195447478151801754685924971955231494961653094677584006576833833181220337",
                    "A1": "8248149727711895523076824904570372119241450169122068550957488380013460422052"
                },
                "Y": {
                    "A0": "4921860114926042695859196707091513960894135032516354392120636579531786968732",
                    "A1": "6497674699404552189948059719808314151701318782389032881121361153353612847519"
                }
            }
        },
        {
            "Address": "0x90a89f27673e9b99001d25c5328ea7b248341aee",
            "SecretKey": "265381230465127358963216809127358093216514",
            "SField": "4235478359213410732582392105113225989686712574423827420889537931357288127804",
            "RPoint": {
                "X": "20654778647025427886329231590146081813406215959318690452465157767589910386387",
                "Y": "16434595237030862998502345611891947093280350242989172641995260786504200724952"
            },
            "PubkeyG1": {
                "X": "20354234858398388849816932240956270026965879865370684564771582015555136553997",
                "Y": "19793685024108212849441227006186442648468124186906966567382667532342323504884"
            },
            "PubkeyG2": {
                "X": {
                    "A0": "2406250413451469352424770691776336657864578839352351617783440321552775726788",
                    "A1": "17191001754715829242845993906554922262830769871842065626630924785145928353563"
                },
                "Y": {
                    "A0": "9681366579801251558910069516165884865963240333390287489273262916032696422128",
                    "A1": "16915387601971985830991163871960501726831560513559637189932888959407309364443"
                }
            }
        },
        {
            "Address": "0x8d26afa6847f837d05c1bad6e9f87c7ac1be1566",
            "SecretKey": "265381230465127358963216809127358093216515",
            "SField": "11035850218432072216042138989371348095984008884653111551948778896223502226130",
            "RPoint": {
                "X": "17221699912650368882632599262801462631856236460154101376095314228983311857640",
                "Y": "16920232814901492682413294000319977483527313089896426400855455024070752739456"
            },
            "PubkeyG1": {
                "X": "3168995773972892355858790410620399201792411842283506602925392425152373993765",
                "Y": "3166501588898491583880629288124229291720446936681364855672031758818970837581"
            },
            "PubkeyG2": {
                "X": {
                    "A0": "1061540865081686461127583443728867079739536618424919508446137160337220400469",
                    "A1": "14314019642545413347565949557134146221646346593211321744274793627527703796333"
                },
                "Y": {
                    "A0": "5285717062790019556696539193484956838225490023146378618961849297769407066983",
                    "A1": "14567857613796427090761122799009706481422522677880753883893727561643094726547"
                }
            }
        }
    ]
}
````

## File: src/test/test-data/owners.json
````json
{
    "numOwners": 10,
    "owners": [
        {
            "Address": "0x364ea4241059a1880a289ccf6f3e730371e399c2"
        },
        {
            "Address": "0x164dfa4241059a1880a289ccf6f3e730371e399c2"
        },
        {
            "Address": "0x264ea4241059a1880a289ccf6f3e730371e399c4"
        },
        {
            "Address": "0x464ea4241059a1880a289ccf6f3e730371e399c5"
        },
        {
            "Address": "0x564ea4241059a1880a289ccf6f3e730371e399c6"
        },
        {
            "Address": "0x864ea4241059a1880a289ccf6f3e730371e399c7"
        },
        {
            "Address": "0x344ea4241059a1880a289ccf6f3e730371e399c8"
        },
        {
            "Address": "0x304ea4241059a1880a289ccf6f3e730371e399c9"
        },
        {
            "Address": "0x364ea4241059a1880a289ccf6f3e730371e399d4"
        },
        {
            "Address": "0x364ea4241059a1880a289ccf6f3e730371e39955"
        }
    ]
}
````

## File: src/test/test-data/partialWithdrawalProof_Latest.json
````json
{
    "slot": 6397852,
    "validatorIndex": 302913,
    "historicalSummaryIndex": 146,
    "withdrawalIndex": 0,
    "blockHeaderRootIndex": 8092,
    "beaconStateRoot": "0xc4ea7f435356d2de29784712dc1fb5597d7d36ec705ddebcbef8bdc4cb4ecaf0",
    "slotRoot": "0x9c9f610000000000000000000000000000000000000000000000000000000000",
    "timestampRoot": "0xb06fed6400000000000000000000000000000000000000000000000000000000",
    "blockHeaderRoot": "0x8d9698a822c4f57d890f9465c046ae8799301ff01daca55fb2e8e347d547ec6d",
    "executionPayloadRoot": "0xf6e0315572785590a6ee69adab31e5c1e9879264aeead5b7762a384ae7d938d0",
    "latestBlockHeaderRoot": "0x34e6f6ae9370c1eacc38aad8c5a887983979b79a35c57f09570afd80a879fd69",
    "SlotProof": [
        "0x89c5010000000000000000000000000000000000000000000000000000000000",
        "0xab4a015ca78ff722e478d047b19650dc6fc92a4270c6cd34401523d3d6a1d9f2",
        "0xe01b2b111680b6b01268c23ee3d7d4d145e98809dd5894cc8d1944bdc19e346e"
    ],
    "WithdrawalProof": [
        "0xa3d843f57c18ee3dac0eb263e446fe5d0110059137807d3cae4a2e60ccca013f",
        "0x87441da495942a4af734cbca4dbcf0b96b2d83137ce595c9f29495aae6a8d99e",
        "0xae0dc609ecbfb26abc191227a76efb332aaea29725253756f2cad136ef5837a6",
        "0x765bcd075991ecad96203020d1576fdb9b45b41dad3b5adde11263ab9f6f56b8",
        "0x1000000000000000000000000000000000000000000000000000000000000000",
        "0x0000000000000000000000000000000000000000000000000000000000000000",
        "0x9d9b56c23faa6a8abf0a49105eb12bbdfdf198a9c6c616b8f24f6e91ad79de92",
        "0xac5e32ea973e990d191039e91c7d9fd9830599b8208675f159c3df128228e729",
        "0x38914949a92dc9e402aee96301b080f769f06d752a32acecaa0458cba66cf471"
    ],
    "ValidatorProof": [
        "0x9e06c3582190fe488eac3f9f6c95622742f9afe3e038b39d2ca97ba6d5d0de4e",
        "0x3eb11a14af12d8558cc14493938ffa0a1c6155349699c2b9245e76344d9922ee",
        "0x81c959aeae7524f4f1d2d3d930ba504cbe86330619a221c9e2d9fb315e32a4d1",
        "0x9b9adf5d31a74f30ae86ce7f7a8bfe89d2bdf2bd799d0c6896174b4f15878bf1",
        "0x17d22cd18156b4bcbefbcfa3ed820c14cc5af90cb7c02c373cc476bc947ba4ac",
        "0x22c1a00da80f2c5c8a11fdd629af774b9dde698305735d63b19aed6a70310537",
        "0x949da2d82acf86e064a7022c5d5e69528ad6d3dd5b9cdf7fb9b736f0d925fc38",
        "0x1920215f3c8c349a04f6d29263f495416e58d85c885b7d356dd4d335427d2748",
        "0x7f12746ac9a3cc418594ab2c25838fdaf9ef43050a12f38f0c25ad7f976d889a",
        "0x451a649946a59a90f56035d1eccdfcaa99ac8bb74b87c403653bdc5bc0055e2c",
        "0x00ab86a6644a7694fa7bc0da3a8730404ea7e26da981b169316f7acdbbe8c79b",
        "0x0d500027bb8983acbec0993a3d063f5a1f4b9a5b5893016bc9eec28e5633867e",
        "0x2ba5cbed64a0202199a181c8612a8c5dad2512ad0ec6aa7f0c079392e16008ee",
        "0xab8576644897391ddc0773ac95d072de29d05982f39201a5e0630b81563e91e9",
        "0xc6e90f3f46f28faea3476837d2ec58ad5fa171c1f04446f2aa40aa433523ec74",
        "0xb86e491b234c25dc5fa17b43c11ef04a7b3e89f99b2bb7d8daf87ee6dc6f3ae3",
        "0xdb41e006a5111a4f2620a004e207d2a63fc5324d7f528409e779a34066a9b67f",
        "0xe2356c743f98d89213868108ad08074ca35f685077e487077cef8a55917736c6",
        "0xf7552771443e29ebcc7a4aad87e308783559a0b4ff696a0e49f81fb2736fe528",
        "0x3d3aabf6c36de4242fef4b6e49441c24451ccf0e8e184a33bece69d3e3d40ac3",
        "0xcddba7b592e3133393c16194fac7431abf2f5485ed711db282183c819e08ebaa",
        "0x8a8d7fe3af8caa085a7639a832001457dfb9128a8061142ad0335629ff23ff9c",
        "0xfeb3c337d7a51a6fbf00b9e34c52e1c9195c969bd4e7a0bfd51d5c5bed9c1167",
        "0xe71f0aa83cc32edfbefa9f4d3e0174ca85182eec9f3a09f6a6c0df6377a510d7",
        "0x31206fa80a50bb6abe29085058f16212212a60eec8f049fecb92d8c8e0a84bc0",
        "0x21352bfecbeddde993839f614c3dac0a3ee37543f9b412b16199dc158e23b544",
        "0x619e312724bb6d7c3153ed9de791d764a366b389af13c58bf8a8d90481a46765",
        "0x7cdd2986268250628d0c10e385c58c6191e6fbe05191bcc04f133f2cea72c1c4",
        "0x848930bd7ba8cac54661072113fb278869e07bb8587f91392933374d017bcbe1",
        "0x8869ff2c22b28cc10510d9853292803328be4fb0e80495e8bb8d271f5b889636",
        "0xb5fe28e79f1b850f8658246ce9b6a1e7b49fc06db7143e8fe0b4f2b0c5523a5c",
        "0x985e929f70af28d0bdd1a90a808f977f597c7c778c489e98d3bd8910d31ac0f7",
        "0xc6f67e02e6e4e1bdefb994c6098953f34636ba2b6ca20a4721d2b26a886722ff",
        "0x1c9a7e5ff1cf48b4ad1582d3f4e4a1004f3b20d8c5a2b71387a4254ad933ebc5",
        "0x2f075ae229646b6f6aed19a5e372cf295081401eb893ff599b3f9acc0c0d3e7d",
        "0x328921deb59612076801e8cd61592107b5c67c79b846595cc6320c395b46362c",
        "0xbfb909fdb236ad2411b4e4883810a074b840464689986c3f8a8091827e17c327",
        "0x55d8fb3687ba3ba49f342c77f5a1f89bec83d811446e1a467139213d640b6a74",
        "0xf7210d4f8e7e1039790e7bf4efa207555a10a6db1dd4b95da313aaa88b88fe76",
        "0xad21b516cbc645ffe34ab5de1c8aef8cd4e7f8d2b51e8e1456adc7563cda206f",
        "0x846b080000000000000000000000000000000000000000000000000000000000",
        "0x5a6c050000000000000000000000000000000000000000000000000000000000",
        "0x47314ebc95c63f3fd909af6442ed250d823b2ee8a6e48d8167d4dfdab96c8b5e",
        "0xce3d1b002aa817e3718132b7ffe6cea677f81b1b3b690b8052732d8e1a70d06b",
        "0x4715bf9a259680cd06827b30bddb27ad445506e9edeb72a3eab904d94dea816b",
        "0x673e299c82563e700195d7d66981bdf521b9609a3b6d22be78f069b359e553e5"
    ],
    "TimestampProof": [
        "0x28a2c80000000000000000000000000000000000000000000000000000000000",
        "0xa749df3368741198702798435eea361b1b1946aa9456587a2be377c8472ea2df",
        "0x568268c732e7471701bcaedcae302de5fe87b60cf9e6518696719f9732078b97",
        "0x38914949a92dc9e402aee96301b080f769f06d752a32acecaa0458cba66cf471"
    ],
    "ExecutionPayloadProof": [
        "0xb6a435ffd17014d1dad214ba466aaa7fba5aa247945d2c29fd53e90d554f4474",
        "0x336488033fe5f3ef4ccc12af07b9370b92e553e35ecb4a337a1b1c0e4afe1e0e",
        "0xdb56114e00fdd4c1f85c892bf35ac9a89289aaecb1ebd0a96cde606a748b5d71",
        "0x5ec9aaf0a3571602f4704d4471b9af564caf17e4d22a7c31017293cb95949053",
        "0x0000000000000000000000000000000000000000000000000000000000000000",
        "0xf5a5fd42d16a20302798ef6ed309979b43003d2320d9f0e8ea9831a92759fb4b",
        "0xc1f7cb289e44e9f711d7d7c05b67b84b8c6dd0394b688922a490cfd3fe216db1"
    ],
    "ValidatorFields": [
        "0xe36689b7b39ee895a754ba878afac2aa5d83349143a8b23d371823dd9ed3435d",
        "0x0100000000000000000000008e35f095545c56b07c942a4f3b055ef1ec4cb148",
        "0x0040597307000000000000000000000000000000000000000000000000000000",
        "0x0000000000000000000000000000000000000000000000000000000000000000",
        "0xea65010000000000000000000000000000000000000000000000000000000000",
        "0xf265010000000000000000000000000000000000000000000000000000000000",
        "0xffffffffffffffff000000000000000000000000000000000000000000000000",
        "0xffffffffffffffff000000000000000000000000000000000000000000000000"
    ],
    "WithdrawalFields": [
        "0x45cee50000000000000000000000000000000000000000000000000000000000",
        "0x419f040000000000000000000000000000000000000000000000000000000000",
        "0x59b0d71688da01057c08e4c1baa8faa629819c2a000000000000000000000000",
        "0xbd56200000000000000000000000000000000000000000000000000000000000"
    ],
    "StateRootAgainstLatestBlockHeaderProof": [
        "0x0000000000000000000000000000000000000000000000000000000000000000",
        "0xf5a5fd42d16a20302798ef6ed309979b43003d2320d9f0e8ea9831a92759fb4b",
        "0xdb56114e00fdd4c1f85c892bf35ac9a89289aaecb1ebd0a96cde606a748b5d71"
    ],
    "HistoricalSummaryProof": [
        "0x050b5923fe2e470849a7d467e4cbed4803d3a46d516b84552567976960ff4ccc",
        "0x6ab9b5fc357c793cc5339398016c28ea21f0be4d56a68b554a29766dd312eeeb",
        "0xb8c4c9f1dec537f4c4652e6bf519bac768e85b2590b7683e392aab698b50d529",
        "0x1cae4e7facb6883024359eb1e9212d36e68a106a7733dc1c099017a74e5f465a",
        "0x616439c1379e10fc6ad2fa192a2e49c2d5a7155fdde95911f37fcfb75952fcb2",
        "0x301ab0d5d5ada4bd2e859658fc31743b5a502b26bc9b8b162e5a161e21218048",
        "0x9d2bc97fffd61659313009e67a4c729a10274f2af26914a53bc7af6717da211e",
        "0x4bdcbe543f9ef7348855aac43d6b6286f9c0c7be53de8a1300bea1ba5ba0758e",
        "0xb6631640d626ea9523ae619a42633072614326cc9220462dffdeb63e804ef05f",
        "0xf19a76e33ca189a8682ece523c2afda138db575955b7af31a427c9b8adb41e15",
        "0x221b43ad87d7410624842cad296fc48360b5bf4e835f6ff610db736774d2f2d3",
        "0x297c51f4ff236db943bebeb35538e207c8de6330d26aa8138a9ca206f42154bf",
        "0x129a0644f33b9ee4e9a36a11dd59d1dedc64012fbb7a79263d07f82d647ffba8",
        "0x763794c2042b9c8381ac7c4d7f4d38b0abb38069b2810b522f87951f25d9d2be",
        "0x0000000000000000000000000000000000000000000000000000000000000000",
        "0xee0639a2ada97368e8b3493f9d2141e16c3cd9fe54e13691bb7a2c376c56c7c8",
        "0xdb56114e00fdd4c1f85c892bf35ac9a89289aaecb1ebd0a96cde606a748b5d71",
        "0xc78009fdf07fc56a11f122370658a353aaa542ed63e44c4bc15ff4cd105ab33c",
        "0xba2bc704559c23541f0c9efa0b522454e8cd06cd504d0e45724709cf5672640f",
        "0x9efde052aa15429fae05bad4d0b1d7c64da64d03d7a1854a588c2cb8430c0d30",
        "0xd88ddfeed400a8755596b21942c1497e114c302e6118290f91e6772976041fa1",
        "0xff857f4c17c9fb2e544e496685ebd8e2258c761e4636cfb031ba73a4430061c7",
        "0x26846476fd5fc54a5d43385167c95144f2643f533cc85bb9d16b782f8d7db193",
        "0x506d86582d252405b840018792cad2bf1259f1ef5aa5f887e13cb2f0094f51e1",
        "0xffff0ad7e659772f9534c195c815efc4014ef1e1daed4404c06385d11192e92b",
        "0x6cf04127db05441cd833107a52be852868890e4317e6a02ab47683aa75964220",
        "0xb7d05f875f140027ef5118a2247bbb84ce8f2f0f1123623085daf7960c329f5f",
        "0xdf6af5f5bbdb6be9ef8aa618e4bf8073960867171e29676f8b284dea6a08a85e",
        "0xb58d900f5e182e3c50ef74969ea16c7726c549757cc23523c369587da7293784",
        "0xd49a7502ffcfb0340b1d7885688500ca308161a7f96b62df9d083b71fcc8f2bb",
        "0x8fe6b1689256c0d385f42f5bbe2027a22c1996e110ba97c171d3e5948de92beb",
        "0x8d0d63c39ebade8509e0ae3c9c3876fb5fa112be18f905ecacfecb92057603ab",
        "0x95eec8b2e541cad4e91de38385f2e046619f54496c2382cb6cacd5b98c26f5a4",
        "0xf893e908917775b62bff23294dbbe3a1cd8e6cc1c35b4801887b646a6f81f17f",
        "0xcddba7b592e3133393c16194fac7431abf2f5485ed711db282183c819e08ebaa",
        "0x8a8d7fe3af8caa085a7639a832001457dfb9128a8061142ad0335629ff23ff9c",
        "0xfeb3c337d7a51a6fbf00b9e34c52e1c9195c969bd4e7a0bfd51d5c5bed9c1167",
        "0xe71f0aa83cc32edfbefa9f4d3e0174ca85182eec9f3a09f6a6c0df6377a510d7",
        "0x9300000000000000000000000000000000000000000000000000000000000000",
        "0xd9ed050000000000000000000000000000000000000000000000000000000000",
        "0xd824a89a9d5dd329a069b394ddc6618c70ed784982061959ac77d58d48e9d7c8",
        "0xdb56114e00fdd4c1f85c892bf35ac9a89289aaecb1ebd0a96cde606a748b5d71",
        "0x8dc0b81ebe27fb91663a74713252d2eae5deb3b983374afc3c2d2f6b254128f1",
        "0xe237bc62b6b5269da5f4093c292d0f3bf2cf4d2eb93b4f366dba675c4df9cc62"
    ]
}
````

## File: src/test/test-data/reputedOwners.json
````json
{
    "numOwners": 10,
    "owners": [
        {
            "Address": "0x364ea4241059a1880a289ccf6f3e730371e399c2"
        },
        {
            "Address": "0x164dfa4241059a1880a289ccf6f3e730371e399c2"
        },
        {
            "Address": "0x264ea4241059a1880a289ccf6f3e730371e399c4"
        },
        {
            "Address": "0x464ea4241059a1880a289ccf6f3e730371e399c5"
        },
        {
            "Address": "0x564ea4241059a1880a289ccf6f3e730371e399c6"
        },
        {
            "Address": "0x864ea4241059a1880a289ccf6f3e730371e399c7"
        },
        {
            "Address": "0x344ea4241059a1880a289ccf6f3e730371e399c8"
        },
        {
            "Address": "0x304ea4241059a1880a289ccf6f3e730371e399c9"
        },
        {
            "Address": "0x364ea4241059a1880a289ccf6f3e730371e399d4"
        },
        {
            "Address": "0x364ea4241059a1880a289ccf6f3e730371e39955"
        }
    ]
}
````

## File: src/test/test-data/withdrawal_credential_proof_302913_30ETHBalance.json
````json
{"validatorIndex":302913,"beaconStateRoot":"0x9761c69195aeb853adc72f41b00232e0dccdfaaf5828bc1db56416eb1d4396df","balanceRoot":"0x6cba5d7307000000e56d25fc0600000008bd5d7307000000239e5d7307000000","latestBlockHeaderRoot":"0xbc2f3b78cf1d4d5b47d6cc987864860035088de6316b4eb1ccbe8677f31e98e1","ValidatorBalanceProof":["0x26805d73070000002aa55d7307000000218e5d730700000056d35d7307000000","0x24846a54724508d8394a9e30f819bc19fe6727745be4f19e1e3924b985b4b8e9","0x48fb4849c31d88b413f650c17bd55bb11fe38bcef5d234dba8532737ae78f776","0x0d7d38f90a04ef49d15ca10af0e818e227134e4b46c7b22dd10e149f2a2bc612","0xdd345235f28f92719c39c9a5042b91f814d535ae5df574c0f6cd38f77791fc2b","0x0855928643f4210d9d8d0986847674139be32ebf3db984b6d81f3ed136475b6d","0x28460d51c1ce75299f8c0dff8bca9f498fef0edc57c343bbd76592b3d6b984a3","0x068a141709053afb48698290176068f448867cba9c6ff10f986b1d02691f6e70","0x9f0958275fe6ea80b1825bcd11907d1076600719ce574ae2a609e51a975dde54","0xd43fbb18b30449f5c81148848fd6579b4f6cebfe66187bd1c36a293b22085fc2","0x7bf0aac502053da7dfd5356960db63ab48d3cc6ee5f36f41639eadacd34ac272","0x866e3b213d02f1cb86149c2472789ab9d7fb3fb52371a893dc8b6f8936ebd0c1","0xcec7cc4b82fb8dd889257128af3e4433700fcc0fb0505b431aa5f592111e785b","0xdd08667067baa43e2b41b793464a591a29643b5582c8fc9c2c045f984c5848d7","0x842ec80062a4f2f7e9d80ab408374ae42817acf5036aff40b3ade345ab196090","0xfe1ae22b8ba21fce84b25f5da3e37a91db49158b7025d6371d5a54c03adba125","0x8c039a81d68952077db2cc11713ae6f5a9ecc5ebe859c0612ff7215c0ccd7aba","0x5415d3199f1da31287d646d03c2691728396d87f7ef52c142596301e27a343ca","0x95eec8b2e541cad4e91de38385f2e046619f54496c2382cb6cacd5b98c26f5a4","0xf893e908917775b62bff23294dbbe3a1cd8e6cc1c35b4801887b646a6f81f17f","0xcddba7b592e3133393c16194fac7431abf2f5485ed711db282183c819e08ebaa","0x8a8d7fe3af8caa085a7639a832001457dfb9128a8061142ad0335629ff23ff9c","0xfeb3c337d7a51a6fbf00b9e34c52e1c9195c969bd4e7a0bfd51d5c5bed9c1167","0xe71f0aa83cc32edfbefa9f4d3e0174ca85182eec9f3a09f6a6c0df6377a510d7","0x31206fa80a50bb6abe29085058f16212212a60eec8f049fecb92d8c8e0a84bc0","0x21352bfecbeddde993839f614c3dac0a3ee37543f9b412b16199dc158e23b544","0x619e312724bb6d7c3153ed9de791d764a366b389af13c58bf8a8d90481a46765","0x7cdd2986268250628d0c10e385c58c6191e6fbe05191bcc04f133f2cea72c1c4","0x848930bd7ba8cac54661072113fb278869e07bb8587f91392933374d017bcbe1","0x8869ff2c22b28cc10510d9853292803328be4fb0e80495e8bb8d271f5b889636","0xb5fe28e79f1b850f8658246ce9b6a1e7b49fc06db7143e8fe0b4f2b0c5523a5c","0x985e929f70af28d0bdd1a90a808f977f597c7c778c489e98d3bd8910d31ac0f7","0xc6f67e02e6e4e1bdefb994c6098953f34636ba2b6ca20a4721d2b26a886722ff","0x1c9a7e5ff1cf48b4ad1582d3f4e4a1004f3b20d8c5a2b71387a4254ad933ebc5","0x2f075ae229646b6f6aed19a5e372cf295081401eb893ff599b3f9acc0c0d3e7d","0x328921deb59612076801e8cd61592107b5c67c79b846595cc6320c395b46362c","0xbfb909fdb236ad2411b4e4883810a074b840464689986c3f8a8091827e17c327","0x55d8fb3687ba3ba49f342c77f5a1f89bec83d811446e1a467139213d640b6a74","0x846b080000000000000000000000000000000000000000000000000000000000","0x7d46d32db9a97974916a2114aeffc11fc031a954b2110742267054a438055c1a","0x81e1234eb27473f180f890c98019ecb7655a3e58105c7182d8daf726d75aaf8d","0x738a1fb07361c872216ae655df9a1690d465e6698acd1c9230ebc3fd89412c69","0x4715bf9a259680cd06827b30bddb27ad445506e9edeb72a3eab904d94dea816b","0x5ba049ff558dd0ff1eadf2cef346aac41b7059433f21925b345f1024af18057d"],"WithdrawalCredentialProof":["0x9e06c3582190fe488eac3f9f6c95622742f9afe3e038b39d2ca97ba6d5d0de4e","0x3eb11a14af12d8558cc14493938ffa0a1c6155349699c2b9245e76344d9922ee","0x81c959aeae7524f4f1d2d3d930ba504cbe86330619a221c9e2d9fb315e32a4d1","0x9b9adf5d31a74f30ae86ce7f7a8bfe89d2bdf2bd799d0c6896174b4f15878bf1","0x17d22cd18156b4bcbefbcfa3ed820c14cc5af90cb7c02c373cc476bc947ba4ac","0x22c1a00da80f2c5c8a11fdd629af774b9dde698305735d63b19aed6a70310537","0x949da2d82acf86e064a7022c5d5e69528ad6d3dd5b9cdf7fb9b736f0d925fc38","0x1920215f3c8c349a04f6d29263f495416e58d85c885b7d356dd4d335427d2748","0x7f12746ac9a3cc418594ab2c25838fdaf9ef43050a12f38f0c25ad7f976d889a","0x451a649946a59a90f56035d1eccdfcaa99ac8bb74b87c403653bdc5bc0055e2c","0x00ab86a6644a7694fa7bc0da3a8730404ea7e26da981b169316f7acdbbe8c79b","0x0d500027bb8983acbec0993a3d063f5a1f4b9a5b5893016bc9eec28e5633867e","0x2ba5cbed64a0202199a181c8612a8c5dad2512ad0ec6aa7f0c079392e16008ee","0xab8576644897391ddc0773ac95d072de29d05982f39201a5e0630b81563e91e9","0xc6e90f3f46f28faea3476837d2ec58ad5fa171c1f04446f2aa40aa433523ec74","0xb86e491b234c25dc5fa17b43c11ef04a7b3e89f99b2bb7d8daf87ee6dc6f3ae3","0xdb41e006a5111a4f2620a004e207d2a63fc5324d7f528409e779a34066a9b67f","0xe2356c743f98d89213868108ad08074ca35f685077e487077cef8a55917736c6","0xf7552771443e29ebcc7a4aad87e308783559a0b4ff696a0e49f81fb2736fe528","0x3d3aabf6c36de4242fef4b6e49441c24451ccf0e8e184a33bece69d3e3d40ac3","0xcddba7b592e3133393c16194fac7431abf2f5485ed711db282183c819e08ebaa","0x8a8d7fe3af8caa085a7639a832001457dfb9128a8061142ad0335629ff23ff9c","0xfeb3c337d7a51a6fbf00b9e34c52e1c9195c969bd4e7a0bfd51d5c5bed9c1167","0xe71f0aa83cc32edfbefa9f4d3e0174ca85182eec9f3a09f6a6c0df6377a510d7","0x31206fa80a50bb6abe29085058f16212212a60eec8f049fecb92d8c8e0a84bc0","0x21352bfecbeddde993839f614c3dac0a3ee37543f9b412b16199dc158e23b544","0x619e312724bb6d7c3153ed9de791d764a366b389af13c58bf8a8d90481a46765","0x7cdd2986268250628d0c10e385c58c6191e6fbe05191bcc04f133f2cea72c1c4","0x848930bd7ba8cac54661072113fb278869e07bb8587f91392933374d017bcbe1","0x8869ff2c22b28cc10510d9853292803328be4fb0e80495e8bb8d271f5b889636","0xb5fe28e79f1b850f8658246ce9b6a1e7b49fc06db7143e8fe0b4f2b0c5523a5c","0x985e929f70af28d0bdd1a90a808f977f597c7c778c489e98d3bd8910d31ac0f7","0xc6f67e02e6e4e1bdefb994c6098953f34636ba2b6ca20a4721d2b26a886722ff","0x1c9a7e5ff1cf48b4ad1582d3f4e4a1004f3b20d8c5a2b71387a4254ad933ebc5","0x2f075ae229646b6f6aed19a5e372cf295081401eb893ff599b3f9acc0c0d3e7d","0x328921deb59612076801e8cd61592107b5c67c79b846595cc6320c395b46362c","0xbfb909fdb236ad2411b4e4883810a074b840464689986c3f8a8091827e17c327","0x55d8fb3687ba3ba49f342c77f5a1f89bec83d811446e1a467139213d640b6a74","0xf7210d4f8e7e1039790e7bf4efa207555a10a6db1dd4b95da313aaa88b88fe76","0xad21b516cbc645ffe34ab5de1c8aef8cd4e7f8d2b51e8e1456adc7563cda206f","0x846b080000000000000000000000000000000000000000000000000000000000","0x5a6c050000000000000000000000000000000000000000000000000000000000","0x47314ebc95c63f3fd909af6442ed250d823b2ee8a6e48d8167d4dfdab96c8b5e","0x8efea8a7f00e6411ae6187a6d9a2c22ad033c0ad749ce0940e5bf2fd76ac35c7","0x4715bf9a259680cd06827b30bddb27ad445506e9edeb72a3eab904d94dea816b","0x5ba049ff558dd0ff1eadf2cef346aac41b7059433f21925b345f1024af18057d"],"ValidatorFields":["0xe36689b7b39ee895a754ba878afac2aa5d83349143a8b23d371823dd9ed3435d","0x01000000000000000000000049c486e3f4303bc11c02f952fe5b08d0ab22d443","0xe56d25fc06000000000000000000000000000000000000000000000000000000","0x0000000000000000000000000000000000000000000000000000000000000000","0xea65010000000000000000000000000000000000000000000000000000000000","0xf265010000000000000000000000000000000000000000000000000000000000","0xffffffffffffffff000000000000000000000000000000000000000000000000","0xffffffffffffffff000000000000000000000000000000000000000000000000"],"StateRootAgainstLatestBlockHeaderProof":["0x0000000000000000000000000000000000000000000000000000000000000000","0xf5a5fd42d16a20302798ef6ed309979b43003d2320d9f0e8ea9831a92759fb4b","0xdb56114e00fdd4c1f85c892bf35ac9a89289aaecb1ebd0a96cde606a748b5d71"]}
````

## File: src/test/test-data/withdrawal_credential_proof_302913_exited.json
````json
{
    "validatorIndex": 302913,
    "beaconStateRoot": "0xd6c32aa93c58fd5ca1f36246234878ec6b0c36b2c218d8bd2521b4c4f2f8cd23",
    "balanceRoot": "0x6cba5d7307000000000000000000000008bd5d7307000000239e5d7307000000",
    "latestBlockHeaderRoot": "0xc8fd8d84d59b2fe5e331e72466e237ba5014d9f078b0d65271aa00d2689fec9b",
    "ValidatorBalanceProof": [
        "0x26805d73070000002aa55d7307000000218e5d730700000056d35d7307000000",
        "0x24846a54724508d8394a9e30f819bc19fe6727745be4f19e1e3924b985b4b8e9",
        "0x48fb4849c31d88b413f650c17bd55bb11fe38bcef5d234dba8532737ae78f776",
        "0x0d7d38f90a04ef49d15ca10af0e818e227134e4b46c7b22dd10e149f2a2bc612",
        "0xdd345235f28f92719c39c9a5042b91f814d535ae5df574c0f6cd38f77791fc2b",
        "0x0855928643f4210d9d8d0986847674139be32ebf3db984b6d81f3ed136475b6d",
        "0x28460d51c1ce75299f8c0dff8bca9f498fef0edc57c343bbd76592b3d6b984a3",
        "0x068a141709053afb48698290176068f448867cba9c6ff10f986b1d02691f6e70",
        "0x9f0958275fe6ea80b1825bcd11907d1076600719ce574ae2a609e51a975dde54",
        "0xd43fbb18b30449f5c81148848fd6579b4f6cebfe66187bd1c36a293b22085fc2",
        "0x7bf0aac502053da7dfd5356960db63ab48d3cc6ee5f36f41639eadacd34ac272",
        "0x866e3b213d02f1cb86149c2472789ab9d7fb3fb52371a893dc8b6f8936ebd0c1",
        "0xcec7cc4b82fb8dd889257128af3e4433700fcc0fb0505b431aa5f592111e785b",
        "0xdd08667067baa43e2b41b793464a591a29643b5582c8fc9c2c045f984c5848d7",
        "0x842ec80062a4f2f7e9d80ab408374ae42817acf5036aff40b3ade345ab196090",
        "0xfe1ae22b8ba21fce84b25f5da3e37a91db49158b7025d6371d5a54c03adba125",
        "0x8c039a81d68952077db2cc11713ae6f5a9ecc5ebe859c0612ff7215c0ccd7aba",
        "0x5415d3199f1da31287d646d03c2691728396d87f7ef52c142596301e27a343ca",
        "0x95eec8b2e541cad4e91de38385f2e046619f54496c2382cb6cacd5b98c26f5a4",
        "0xf893e908917775b62bff23294dbbe3a1cd8e6cc1c35b4801887b646a6f81f17f",
        "0xcddba7b592e3133393c16194fac7431abf2f5485ed711db282183c819e08ebaa",
        "0x8a8d7fe3af8caa085a7639a832001457dfb9128a8061142ad0335629ff23ff9c",
        "0xfeb3c337d7a51a6fbf00b9e34c52e1c9195c969bd4e7a0bfd51d5c5bed9c1167",
        "0xe71f0aa83cc32edfbefa9f4d3e0174ca85182eec9f3a09f6a6c0df6377a510d7",
        "0x31206fa80a50bb6abe29085058f16212212a60eec8f049fecb92d8c8e0a84bc0",
        "0x21352bfecbeddde993839f614c3dac0a3ee37543f9b412b16199dc158e23b544",
        "0x619e312724bb6d7c3153ed9de791d764a366b389af13c58bf8a8d90481a46765",
        "0x7cdd2986268250628d0c10e385c58c6191e6fbe05191bcc04f133f2cea72c1c4",
        "0x848930bd7ba8cac54661072113fb278869e07bb8587f91392933374d017bcbe1",
        "0x8869ff2c22b28cc10510d9853292803328be4fb0e80495e8bb8d271f5b889636",
        "0xb5fe28e79f1b850f8658246ce9b6a1e7b49fc06db7143e8fe0b4f2b0c5523a5c",
        "0x985e929f70af28d0bdd1a90a808f977f597c7c778c489e98d3bd8910d31ac0f7",
        "0xc6f67e02e6e4e1bdefb994c6098953f34636ba2b6ca20a4721d2b26a886722ff",
        "0x1c9a7e5ff1cf48b4ad1582d3f4e4a1004f3b20d8c5a2b71387a4254ad933ebc5",
        "0x2f075ae229646b6f6aed19a5e372cf295081401eb893ff599b3f9acc0c0d3e7d",
        "0x328921deb59612076801e8cd61592107b5c67c79b846595cc6320c395b46362c",
        "0xbfb909fdb236ad2411b4e4883810a074b840464689986c3f8a8091827e17c327",
        "0x55d8fb3687ba3ba49f342c77f5a1f89bec83d811446e1a467139213d640b6a74",
        "0x846b080000000000000000000000000000000000000000000000000000000000",
        "0x7d46d32db9a97974916a2114aeffc11fc031a954b2110742267054a438055c1a",
        "0x81e1234eb27473f180f890c98019ecb7655a3e58105c7182d8daf726d75aaf8d",
        "0xa015eda3f293610cf5763cc878497fe3fbdb20309c1ba004f384b467a11db327",
        "0x4715bf9a259680cd06827b30bddb27ad445506e9edeb72a3eab904d94dea816b",
        "0x5ba049ff558dd0ff1eadf2cef346aac41b7059433f21925b345f1024af18057d"
    ],
    "WithdrawalCredentialProof": [
        "0x9e06c3582190fe488eac3f9f6c95622742f9afe3e038b39d2ca97ba6d5d0de4e",
        "0x3eb11a14af12d8558cc14493938ffa0a1c6155349699c2b9245e76344d9922ee",
        "0x81c959aeae7524f4f1d2d3d930ba504cbe86330619a221c9e2d9fb315e32a4d1",
        "0x9b9adf5d31a74f30ae86ce7f7a8bfe89d2bdf2bd799d0c6896174b4f15878bf1",
        "0x17d22cd18156b4bcbefbcfa3ed820c14cc5af90cb7c02c373cc476bc947ba4ac",
        "0x22c1a00da80f2c5c8a11fdd629af774b9dde698305735d63b19aed6a70310537",
        "0x949da2d82acf86e064a7022c5d5e69528ad6d3dd5b9cdf7fb9b736f0d925fc38",
        "0x1920215f3c8c349a04f6d29263f495416e58d85c885b7d356dd4d335427d2748",
        "0x7f12746ac9a3cc418594ab2c25838fdaf9ef43050a12f38f0c25ad7f976d889a",
        "0x451a649946a59a90f56035d1eccdfcaa99ac8bb74b87c403653bdc5bc0055e2c",
        "0x00ab86a6644a7694fa7bc0da3a8730404ea7e26da981b169316f7acdbbe8c79b",
        "0x0d500027bb8983acbec0993a3d063f5a1f4b9a5b5893016bc9eec28e5633867e",
        "0x2ba5cbed64a0202199a181c8612a8c5dad2512ad0ec6aa7f0c079392e16008ee",
        "0xab8576644897391ddc0773ac95d072de29d05982f39201a5e0630b81563e91e9",
        "0xc6e90f3f46f28faea3476837d2ec58ad5fa171c1f04446f2aa40aa433523ec74",
        "0xb86e491b234c25dc5fa17b43c11ef04a7b3e89f99b2bb7d8daf87ee6dc6f3ae3",
        "0xdb41e006a5111a4f2620a004e207d2a63fc5324d7f528409e779a34066a9b67f",
        "0xe2356c743f98d89213868108ad08074ca35f685077e487077cef8a55917736c6",
        "0xf7552771443e29ebcc7a4aad87e308783559a0b4ff696a0e49f81fb2736fe528",
        "0x3d3aabf6c36de4242fef4b6e49441c24451ccf0e8e184a33bece69d3e3d40ac3",
        "0xcddba7b592e3133393c16194fac7431abf2f5485ed711db282183c819e08ebaa",
        "0x8a8d7fe3af8caa085a7639a832001457dfb9128a8061142ad0335629ff23ff9c",
        "0xfeb3c337d7a51a6fbf00b9e34c52e1c9195c969bd4e7a0bfd51d5c5bed9c1167",
        "0xe71f0aa83cc32edfbefa9f4d3e0174ca85182eec9f3a09f6a6c0df6377a510d7",
        "0x31206fa80a50bb6abe29085058f16212212a60eec8f049fecb92d8c8e0a84bc0",
        "0x21352bfecbeddde993839f614c3dac0a3ee37543f9b412b16199dc158e23b544",
        "0x619e312724bb6d7c3153ed9de791d764a366b389af13c58bf8a8d90481a46765",
        "0x7cdd2986268250628d0c10e385c58c6191e6fbe05191bcc04f133f2cea72c1c4",
        "0x848930bd7ba8cac54661072113fb278869e07bb8587f91392933374d017bcbe1",
        "0x8869ff2c22b28cc10510d9853292803328be4fb0e80495e8bb8d271f5b889636",
        "0xb5fe28e79f1b850f8658246ce9b6a1e7b49fc06db7143e8fe0b4f2b0c5523a5c",
        "0x985e929f70af28d0bdd1a90a808f977f597c7c778c489e98d3bd8910d31ac0f7",
        "0xc6f67e02e6e4e1bdefb994c6098953f34636ba2b6ca20a4721d2b26a886722ff",
        "0x1c9a7e5ff1cf48b4ad1582d3f4e4a1004f3b20d8c5a2b71387a4254ad933ebc5",
        "0x2f075ae229646b6f6aed19a5e372cf295081401eb893ff599b3f9acc0c0d3e7d",
        "0x328921deb59612076801e8cd61592107b5c67c79b846595cc6320c395b46362c",
        "0xbfb909fdb236ad2411b4e4883810a074b840464689986c3f8a8091827e17c327",
        "0x55d8fb3687ba3ba49f342c77f5a1f89bec83d811446e1a467139213d640b6a74",
        "0xf7210d4f8e7e1039790e7bf4efa207555a10a6db1dd4b95da313aaa88b88fe76",
        "0xad21b516cbc645ffe34ab5de1c8aef8cd4e7f8d2b51e8e1456adc7563cda206f",
        "0x846b080000000000000000000000000000000000000000000000000000000000",
        "0x5a6c050000000000000000000000000000000000000000000000000000000000",
        "0x47314ebc95c63f3fd909af6442ed250d823b2ee8a6e48d8167d4dfdab96c8b5e",
        "0xd740083592ddcf0930ad47cc8e7758d567c2dc63767624bda4d50cafcbfe7093",
        "0x4715bf9a259680cd06827b30bddb27ad445506e9edeb72a3eab904d94dea816b",
        "0x5ba049ff558dd0ff1eadf2cef346aac41b7059433f21925b345f1024af18057d"
    ],
    "ValidatorFields": [
        "0xe36689b7b39ee895a754ba878afac2aa5d83349143a8b23d371823dd9ed3435d",
        "0x01000000000000000000000049c486e3f4303bc11c02f952fe5b08d0ab22d443",
        "0x0000000000000000000000000000000000000000000000000000000000000000",
        "0x0000000000000000000000000000000000000000000000000000000000000000",
        "0xea65010000000000000000000000000000000000000000000000000000000000",
        "0xf265010000000000000000000000000000000000000000000000000000000000",
        "0xffffffffffffffff000000000000000000000000000000000000000000000000",
        "0xffffffffffffffff000000000000000000000000000000000000000000000000"
    ],
    "StateRootAgainstLatestBlockHeaderProof": [
        "0x0000000000000000000000000000000000000000000000000000000000000000",
        "0xf5a5fd42d16a20302798ef6ed309979b43003d2320d9f0e8ea9831a92759fb4b",
        "0xdb56114e00fdd4c1f85c892bf35ac9a89289aaecb1ebd0a96cde606a748b5d71"
    ]
}
````

## File: src/test/test-data/withdrawal_credential_proof_302913.json
````json
{
    "validatorIndex": 302913,
    "beaconStateRoot": "0x4678e21381463879490925e8911492b890c0ce7ba347cce57fd8d4e0bb27f04a",
    "balanceRoot": "0x6cba5d7307000000e5015b730700000008bd5d7307000000239e5d7307000000",
    "latestBlockHeaderRoot": "0x859816e76b0944c3110a31f26acc301718122e1acfe8fb161df9c0e684515593",
    "ValidatorBalanceProof": [
        "0x26805d73070000002aa55d7307000000218e5d730700000056d35d7307000000",
        "0x24846a54724508d8394a9e30f819bc19fe6727745be4f19e1e3924b985b4b8e9",
        "0x48fb4849c31d88b413f650c17bd55bb11fe38bcef5d234dba8532737ae78f776",
        "0x0d7d38f90a04ef49d15ca10af0e818e227134e4b46c7b22dd10e149f2a2bc612",
        "0xdd345235f28f92719c39c9a5042b91f814d535ae5df574c0f6cd38f77791fc2b",
        "0x0855928643f4210d9d8d0986847674139be32ebf3db984b6d81f3ed136475b6d",
        "0x28460d51c1ce75299f8c0dff8bca9f498fef0edc57c343bbd76592b3d6b984a3",
        "0x068a141709053afb48698290176068f448867cba9c6ff10f986b1d02691f6e70",
        "0x9f0958275fe6ea80b1825bcd11907d1076600719ce574ae2a609e51a975dde54",
        "0xd43fbb18b30449f5c81148848fd6579b4f6cebfe66187bd1c36a293b22085fc2",
        "0x7bf0aac502053da7dfd5356960db63ab48d3cc6ee5f36f41639eadacd34ac272",
        "0x866e3b213d02f1cb86149c2472789ab9d7fb3fb52371a893dc8b6f8936ebd0c1",
        "0xcec7cc4b82fb8dd889257128af3e4433700fcc0fb0505b431aa5f592111e785b",
        "0xdd08667067baa43e2b41b793464a591a29643b5582c8fc9c2c045f984c5848d7",
        "0x842ec80062a4f2f7e9d80ab408374ae42817acf5036aff40b3ade345ab196090",
        "0xfe1ae22b8ba21fce84b25f5da3e37a91db49158b7025d6371d5a54c03adba125",
        "0x8c039a81d68952077db2cc11713ae6f5a9ecc5ebe859c0612ff7215c0ccd7aba",
        "0x5415d3199f1da31287d646d03c2691728396d87f7ef52c142596301e27a343ca",
        "0x95eec8b2e541cad4e91de38385f2e046619f54496c2382cb6cacd5b98c26f5a4",
        "0xf893e908917775b62bff23294dbbe3a1cd8e6cc1c35b4801887b646a6f81f17f",
        "0xcddba7b592e3133393c16194fac7431abf2f5485ed711db282183c819e08ebaa",
        "0x8a8d7fe3af8caa085a7639a832001457dfb9128a8061142ad0335629ff23ff9c",
        "0xfeb3c337d7a51a6fbf00b9e34c52e1c9195c969bd4e7a0bfd51d5c5bed9c1167",
        "0xe71f0aa83cc32edfbefa9f4d3e0174ca85182eec9f3a09f6a6c0df6377a510d7",
        "0x31206fa80a50bb6abe29085058f16212212a60eec8f049fecb92d8c8e0a84bc0",
        "0x21352bfecbeddde993839f614c3dac0a3ee37543f9b412b16199dc158e23b544",
        "0x619e312724bb6d7c3153ed9de791d764a366b389af13c58bf8a8d90481a46765",
        "0x7cdd2986268250628d0c10e385c58c6191e6fbe05191bcc04f133f2cea72c1c4",
        "0x848930bd7ba8cac54661072113fb278869e07bb8587f91392933374d017bcbe1",
        "0x8869ff2c22b28cc10510d9853292803328be4fb0e80495e8bb8d271f5b889636",
        "0xb5fe28e79f1b850f8658246ce9b6a1e7b49fc06db7143e8fe0b4f2b0c5523a5c",
        "0x985e929f70af28d0bdd1a90a808f977f597c7c778c489e98d3bd8910d31ac0f7",
        "0xc6f67e02e6e4e1bdefb994c6098953f34636ba2b6ca20a4721d2b26a886722ff",
        "0x1c9a7e5ff1cf48b4ad1582d3f4e4a1004f3b20d8c5a2b71387a4254ad933ebc5",
        "0x2f075ae229646b6f6aed19a5e372cf295081401eb893ff599b3f9acc0c0d3e7d",
        "0x328921deb59612076801e8cd61592107b5c67c79b846595cc6320c395b46362c",
        "0xbfb909fdb236ad2411b4e4883810a074b840464689986c3f8a8091827e17c327",
        "0x55d8fb3687ba3ba49f342c77f5a1f89bec83d811446e1a467139213d640b6a74",
        "0x846b080000000000000000000000000000000000000000000000000000000000",
        "0x7d46d32db9a97974916a2114aeffc11fc031a954b2110742267054a438055c1a",
        "0x81e1234eb27473f180f890c98019ecb7655a3e58105c7182d8daf726d75aaf8d",
        "0xa158c9a519bf3c8d2296ebb6a2df54283c7014e7b84524da0574c95fe600a1fd",
        "0x4715bf9a259680cd06827b30bddb27ad445506e9edeb72a3eab904d94dea816b",
        "0x5ba049ff558dd0ff1eadf2cef346aac41b7059433f21925b345f1024af18057d"
    ],
    "WithdrawalCredentialProof": [
        "0x9e06c3582190fe488eac3f9f6c95622742f9afe3e038b39d2ca97ba6d5d0de4e",
        "0x3eb11a14af12d8558cc14493938ffa0a1c6155349699c2b9245e76344d9922ee",
        "0x81c959aeae7524f4f1d2d3d930ba504cbe86330619a221c9e2d9fb315e32a4d1",
        "0x9b9adf5d31a74f30ae86ce7f7a8bfe89d2bdf2bd799d0c6896174b4f15878bf1",
        "0x17d22cd18156b4bcbefbcfa3ed820c14cc5af90cb7c02c373cc476bc947ba4ac",
        "0x22c1a00da80f2c5c8a11fdd629af774b9dde698305735d63b19aed6a70310537",
        "0x949da2d82acf86e064a7022c5d5e69528ad6d3dd5b9cdf7fb9b736f0d925fc38",
        "0x1920215f3c8c349a04f6d29263f495416e58d85c885b7d356dd4d335427d2748",
        "0x7f12746ac9a3cc418594ab2c25838fdaf9ef43050a12f38f0c25ad7f976d889a",
        "0x451a649946a59a90f56035d1eccdfcaa99ac8bb74b87c403653bdc5bc0055e2c",
        "0x00ab86a6644a7694fa7bc0da3a8730404ea7e26da981b169316f7acdbbe8c79b",
        "0x0d500027bb8983acbec0993a3d063f5a1f4b9a5b5893016bc9eec28e5633867e",
        "0x2ba5cbed64a0202199a181c8612a8c5dad2512ad0ec6aa7f0c079392e16008ee",
        "0xab8576644897391ddc0773ac95d072de29d05982f39201a5e0630b81563e91e9",
        "0xc6e90f3f46f28faea3476837d2ec58ad5fa171c1f04446f2aa40aa433523ec74",
        "0xb86e491b234c25dc5fa17b43c11ef04a7b3e89f99b2bb7d8daf87ee6dc6f3ae3",
        "0xdb41e006a5111a4f2620a004e207d2a63fc5324d7f528409e779a34066a9b67f",
        "0xe2356c743f98d89213868108ad08074ca35f685077e487077cef8a55917736c6",
        "0xf7552771443e29ebcc7a4aad87e308783559a0b4ff696a0e49f81fb2736fe528",
        "0x3d3aabf6c36de4242fef4b6e49441c24451ccf0e8e184a33bece69d3e3d40ac3",
        "0xcddba7b592e3133393c16194fac7431abf2f5485ed711db282183c819e08ebaa",
        "0x8a8d7fe3af8caa085a7639a832001457dfb9128a8061142ad0335629ff23ff9c",
        "0xfeb3c337d7a51a6fbf00b9e34c52e1c9195c969bd4e7a0bfd51d5c5bed9c1167",
        "0xe71f0aa83cc32edfbefa9f4d3e0174ca85182eec9f3a09f6a6c0df6377a510d7",
        "0x31206fa80a50bb6abe29085058f16212212a60eec8f049fecb92d8c8e0a84bc0",
        "0x21352bfecbeddde993839f614c3dac0a3ee37543f9b412b16199dc158e23b544",
        "0x619e312724bb6d7c3153ed9de791d764a366b389af13c58bf8a8d90481a46765",
        "0x7cdd2986268250628d0c10e385c58c6191e6fbe05191bcc04f133f2cea72c1c4",
        "0x848930bd7ba8cac54661072113fb278869e07bb8587f91392933374d017bcbe1",
        "0x8869ff2c22b28cc10510d9853292803328be4fb0e80495e8bb8d271f5b889636",
        "0xb5fe28e79f1b850f8658246ce9b6a1e7b49fc06db7143e8fe0b4f2b0c5523a5c",
        "0x985e929f70af28d0bdd1a90a808f977f597c7c778c489e98d3bd8910d31ac0f7",
        "0xc6f67e02e6e4e1bdefb994c6098953f34636ba2b6ca20a4721d2b26a886722ff",
        "0x1c9a7e5ff1cf48b4ad1582d3f4e4a1004f3b20d8c5a2b71387a4254ad933ebc5",
        "0x2f075ae229646b6f6aed19a5e372cf295081401eb893ff599b3f9acc0c0d3e7d",
        "0x328921deb59612076801e8cd61592107b5c67c79b846595cc6320c395b46362c",
        "0xbfb909fdb236ad2411b4e4883810a074b840464689986c3f8a8091827e17c327",
        "0x55d8fb3687ba3ba49f342c77f5a1f89bec83d811446e1a467139213d640b6a74",
        "0xf7210d4f8e7e1039790e7bf4efa207555a10a6db1dd4b95da313aaa88b88fe76",
        "0xad21b516cbc645ffe34ab5de1c8aef8cd4e7f8d2b51e8e1456adc7563cda206f",
        "0x846b080000000000000000000000000000000000000000000000000000000000",
        "0x5a6c050000000000000000000000000000000000000000000000000000000000",
        "0x47314ebc95c63f3fd909af6442ed250d823b2ee8a6e48d8167d4dfdab96c8b5e",
        "0x3f918c09ea95d520538a81f767de0f1be3f30fc9d599805c68048ef5c23a85e2",
        "0x4715bf9a259680cd06827b30bddb27ad445506e9edeb72a3eab904d94dea816b",
        "0x5ba049ff558dd0ff1eadf2cef346aac41b7059433f21925b345f1024af18057d"
    ],
    "ValidatorFields": [
        "0xe36689b7b39ee895a754ba878afac2aa5d83349143a8b23d371823dd9ed3435d",
        "0x01000000000000000000000049c486e3f4303bc11c02f952fe5b08d0ab22d443",
        "0xe5015b7307000000000000000000000000000000000000000000000000000000",
        "0x0000000000000000000000000000000000000000000000000000000000000000",
        "0xea65010000000000000000000000000000000000000000000000000000000000",
        "0xf265010000000000000000000000000000000000000000000000000000000000",
        "0xffffffffffffffff000000000000000000000000000000000000000000000000",
        "0xffffffffffffffff000000000000000000000000000000000000000000000000"
    ],
    "StateRootAgainstLatestBlockHeaderProof": [
        "0x0000000000000000000000000000000000000000000000000000000000000000",
        "0xf5a5fd42d16a20302798ef6ed309979b43003d2320d9f0e8ea9831a92759fb4b",
        "0xdb56114e00fdd4c1f85c892bf35ac9a89289aaecb1ebd0a96cde606a748b5d71"
    ]
}
````

## File: src/test/test-data/withdrawal_credential_proof_510257.json
````json
{
    "validatorIndex": 510257,
    "beaconStateRoot": "0xffa8d20fba11c926a5b8d9ea4b0738c1fe22d1981177b39cd6a86ed3669702fe",
    "balanceRoot": "0x0000000000000000e5015b730700000000000000000000000000000000000000",
    "latestBlockHeaderRoot": "0x359b8fc7ea96256c42c38ec047e0052217c7889bbb46cf928fa75fbe2a718e0b",
    "ValidatorBalanceProof": [
        "0x0000000000000000000000000000000000000000000000000000000000000000",
        "0xf5a5fd42d16a20302798ef6ed309979b43003d2320d9f0e8ea9831a92759fb4b",
        "0x6dd4ffb4ca5aa522f9dbe4fc9a0e07d26c61f8d309590c36f6ba2f2e55144e3a",
        "0x46af8bc21a2d3401a9d413f03c93ecb0b29d5746307f71dc7118bad7dd46ca3f",
        "0x07b3dda614c6ceb1364c74c9128707e339167bc2875217db87c3169083e60937",
        "0x9efde052aa15429fae05bad4d0b1d7c64da64d03d7a1854a588c2cb8430c0d30",
        "0x0368e4efe7928a54c6ef32ec3447b168e69db5ab597f6f5d9ee09528a85e36cb",
        "0xd0073758e6864c0b3e519a78a765091a5b42652268f7c7146d3c6bdf33676601",
        "0xddc34931fd2c88c485af67a69b31fe118013f42b48ce81a349f47fb329b2b381",
        "0x8905afda3b52ca75fed67a6fd8342b2bf7bb1f3bfb8246b5b8730097ca547b1c",
        "0x9ac6965d7809be3640d5bae20323a5c726a181dd50f05406c547f2392ce3e25a",
        "0x2a397932c520e69909074a21d4e367678c47b34d5c132c0b868b51df7d4b0b53",
        "0xb896ba3596c19cb4f1b98b79fe8234299f164762055b7114968b480c4cb0f9bb",
        "0x36adfe560682ca3335a39ba90eb021c0daf74b32a908203bc66bc9d680819914",
        "0x5537955b317ce653fc15a7d7a8e0b4e2733d6e2f630f3404437751251aa51bea",
        "0x6dece44e9d5964318fd5c7b458afe405bbfbb2dc79eb12fe87e65d101da20eb5",
        "0x8c039a81d68952077db2cc11713ae6f5a9ecc5ebe859c0612ff7215c0ccd7aba",
        "0x5415d3199f1da31287d646d03c2691728396d87f7ef52c142596301e27a343ca",
        "0x95eec8b2e541cad4e91de38385f2e046619f54496c2382cb6cacd5b98c26f5a4",
        "0xf893e908917775b62bff23294dbbe3a1cd8e6cc1c35b4801887b646a6f81f17f",
        "0xcddba7b592e3133393c16194fac7431abf2f5485ed711db282183c819e08ebaa",
        "0x8a8d7fe3af8caa085a7639a832001457dfb9128a8061142ad0335629ff23ff9c",
        "0xfeb3c337d7a51a6fbf00b9e34c52e1c9195c969bd4e7a0bfd51d5c5bed9c1167",
        "0xe71f0aa83cc32edfbefa9f4d3e0174ca85182eec9f3a09f6a6c0df6377a510d7",
        "0x31206fa80a50bb6abe29085058f16212212a60eec8f049fecb92d8c8e0a84bc0",
        "0x21352bfecbeddde993839f614c3dac0a3ee37543f9b412b16199dc158e23b544",
        "0x619e312724bb6d7c3153ed9de791d764a366b389af13c58bf8a8d90481a46765",
        "0x7cdd2986268250628d0c10e385c58c6191e6fbe05191bcc04f133f2cea72c1c4",
        "0x848930bd7ba8cac54661072113fb278869e07bb8587f91392933374d017bcbe1",
        "0x8869ff2c22b28cc10510d9853292803328be4fb0e80495e8bb8d271f5b889636",
        "0xb5fe28e79f1b850f8658246ce9b6a1e7b49fc06db7143e8fe0b4f2b0c5523a5c",
        "0x985e929f70af28d0bdd1a90a808f977f597c7c778c489e98d3bd8910d31ac0f7",
        "0xc6f67e02e6e4e1bdefb994c6098953f34636ba2b6ca20a4721d2b26a886722ff",
        "0x1c9a7e5ff1cf48b4ad1582d3f4e4a1004f3b20d8c5a2b71387a4254ad933ebc5",
        "0x2f075ae229646b6f6aed19a5e372cf295081401eb893ff599b3f9acc0c0d3e7d",
        "0x328921deb59612076801e8cd61592107b5c67c79b846595cc6320c395b46362c",
        "0xbfb909fdb236ad2411b4e4883810a074b840464689986c3f8a8091827e17c327",
        "0x55d8fb3687ba3ba49f342c77f5a1f89bec83d811446e1a467139213d640b6a74",
        "0x846b080000000000000000000000000000000000000000000000000000000000",
        "0x7d46d32db9a97974916a2114aeffc11fc031a954b2110742267054a438055c1a",
        "0x81e1234eb27473f180f890c98019ecb7655a3e58105c7182d8daf726d75aaf8d",
        "0xa383de4eac63dd7869d3ef08c5aca0ed832a5fac0603bcc8b5db37297e617ec5",
        "0x4715bf9a259680cd06827b30bddb27ad445506e9edeb72a3eab904d94dea816b",
        "0x5ba049ff558dd0ff1eadf2cef346aac41b7059433f21925b345f1024af18057d"
    ],
    "WithdrawalCredentialProof": [
        "0x1a7c6cc33e5d44fd12622c350a89467af1dde63b878aada6d92122e7af62be18",
        "0xeb50c3b01c1ec2a90e7ac51a1472633125fb9cfa1c516dc3a10fa61d10d16726",
        "0x25da66081ff6b20267ab5cfb4301bc4935b03c09138a0ce56b9e6a476292a64f",
        "0xe73b742215086105ee3509e12da84334de7c522c8fcfbe0bd506ce9f037c49aa",
        "0x9951384987ef65d5135e31779d1752ca0a0a907b49f9c040d967b82eac01824a",
        "0x8f03ed90c033494704345311ee036253524e6a63d90de1320abe06a1dc097d6c",
        "0x3de8f72a828bf9a4e0105c96b705b983b6acf2a36d18f016089ce2ac2e912377",
        "0x96cad999eeb82a853ebc7b0240b613c4ad3dc1e4d24bf53820bc99a42fe1b323",
        "0x2d9c9feea67401140c6361f569491a9a34a67ac4579c48b27ae1f91692daa9ff",
        "0x55c251dcae98b63839b0986e3724c9840529b10af62f1256b2f124380008035d",
        "0xe3a61aed717bccf4def4d98d1e548e62bd6a1199d26b7fd90149738e2e91c82f",
        "0x265ae7041099b690f20ffe0ead1172a213740bf99c6dbd82d239a82ef0d5e97d",
        "0x2e5ac328c7b8dfd5f0be9ed5311a060a3daa85f0f2b9ac750981233bfc69c1b6",
        "0xd53273ba4b65d46cefdcf4042a55aba80a1d68bad67dffceb26c1074597e84c9",
        "0x1257580608fe43f8118c73bcb20bc4556e5034249fd68035b9a84e0e18c09010",
        "0x71d6e5c378dfd648434c3cd6426d35b5751ae595ff66e76de95b38f4e2c5c08d",
        "0xbce1ff41e2ec18651cd3dec46adefc600f19fc2237853cbcc9f9e8cba4767d65",
        "0xfb2b2dc8116aec79c89d6a3bf4631e1d34a531c81e24af8dca50652a39af0fa6",
        "0xf7552771443e29ebcc7a4aad87e308783559a0b4ff696a0e49f81fb2736fe528",
        "0x3d3aabf6c36de4242fef4b6e49441c24451ccf0e8e184a33bece69d3e3d40ac3",
        "0xcddba7b592e3133393c16194fac7431abf2f5485ed711db282183c819e08ebaa",
        "0x8a8d7fe3af8caa085a7639a832001457dfb9128a8061142ad0335629ff23ff9c",
        "0xfeb3c337d7a51a6fbf00b9e34c52e1c9195c969bd4e7a0bfd51d5c5bed9c1167",
        "0xe71f0aa83cc32edfbefa9f4d3e0174ca85182eec9f3a09f6a6c0df6377a510d7",
        "0x31206fa80a50bb6abe29085058f16212212a60eec8f049fecb92d8c8e0a84bc0",
        "0x21352bfecbeddde993839f614c3dac0a3ee37543f9b412b16199dc158e23b544",
        "0x619e312724bb6d7c3153ed9de791d764a366b389af13c58bf8a8d90481a46765",
        "0x7cdd2986268250628d0c10e385c58c6191e6fbe05191bcc04f133f2cea72c1c4",
        "0x848930bd7ba8cac54661072113fb278869e07bb8587f91392933374d017bcbe1",
        "0x8869ff2c22b28cc10510d9853292803328be4fb0e80495e8bb8d271f5b889636",
        "0xb5fe28e79f1b850f8658246ce9b6a1e7b49fc06db7143e8fe0b4f2b0c5523a5c",
        "0x985e929f70af28d0bdd1a90a808f977f597c7c778c489e98d3bd8910d31ac0f7",
        "0xc6f67e02e6e4e1bdefb994c6098953f34636ba2b6ca20a4721d2b26a886722ff",
        "0x1c9a7e5ff1cf48b4ad1582d3f4e4a1004f3b20d8c5a2b71387a4254ad933ebc5",
        "0x2f075ae229646b6f6aed19a5e372cf295081401eb893ff599b3f9acc0c0d3e7d",
        "0x328921deb59612076801e8cd61592107b5c67c79b846595cc6320c395b46362c",
        "0xbfb909fdb236ad2411b4e4883810a074b840464689986c3f8a8091827e17c327",
        "0x55d8fb3687ba3ba49f342c77f5a1f89bec83d811446e1a467139213d640b6a74",
        "0xf7210d4f8e7e1039790e7bf4efa207555a10a6db1dd4b95da313aaa88b88fe76",
        "0xad21b516cbc645ffe34ab5de1c8aef8cd4e7f8d2b51e8e1456adc7563cda206f",
        "0x846b080000000000000000000000000000000000000000000000000000000000",
        "0x5a6c050000000000000000000000000000000000000000000000000000000000",
        "0x47314ebc95c63f3fd909af6442ed250d823b2ee8a6e48d8167d4dfdab96c8b5e",
        "0xca8a23905f2088e7d8a9a6d631d265b45c2e839137ac66c86bf80456bbebddba",
        "0x4715bf9a259680cd06827b30bddb27ad445506e9edeb72a3eab904d94dea816b",
        "0x5ba049ff558dd0ff1eadf2cef346aac41b7059433f21925b345f1024af18057d"
    ],
    "ValidatorFields": [
        "0xcc3045318f8e5b6ec9441a54183cacde7f180509086f92868ba8942c92a79ca4",
        "0x01000000000000000000000049c486e3f4303bc11c02f952fe5b08d0ab22d443",
        "0xe5015b7307000000000000000000000000000000000000000000000000000000",
        "0x0000000000000000000000000000000000000000000000000000000000000000",
        "0x6cde020000000000000000000000000000000000000000000000000000000000",
        "0x74de020000000000000000000000000000000000000000000000000000000000",
        "0xf708030000000000000000000000000000000000000000000000000000000000",
        "0xf709030000000000000000000000000000000000000000000000000000000000"
    ],
    "StateRootAgainstLatestBlockHeaderProof": [
        "0x5e83fd9f12a10bd0aa14d9300f245cdc5ffaabec780453c1638eaf6177dd64f1",
        "0x336f092b490e7794f3f013536c0fb0b40195fff09689811c1a0887b3bfbc10ae",
        "0xde1c709ab0e3d3fb72c4e5805bb81fae2b2d55c5da32ed1c0b995e7b5793b930"
    ]
}
````

## File: src/test/test-data/withdrawalCredentialAndBalanceProof_61068.json
````json
{
    "validatorIndex": 61068,
    "beaconStateRoot": "0x9022cd2f5102866cce67dc86f3190719cbf0ff0aff080cab6e975bfa823cc04b",
    "balanceRoot": "0xe5015b7307000000e5015b7307000000e5015b7307000000e5015b7307000000",
    "latestBlockHeaderRoot": "0xb70c51b37b01fe8c02ab81152374651196b471a0ef71ffefe858ea2b19ea7d06",
    "ValidatorBalanceProof": [
        "0xe5015b73070000003972637307000000e5015b7307000000e5015b7307000000",
        "0x0e633cd1b96df1d8901b2a4499fdde621b96a8d34aac9a21048cb23cd26accb1",
        "0xe30fb84408d69db1528b91db81ae4cfa0af2e8c67db3ff3887f13df381909240",
        "0x718981def04d64a67b1d26315dfa303c92256ad272085a8b1e80a9df83474a9d",
        "0xf67e708bb7d3936a1997e5e5c68a386a22b4bfe1906f00e9a545f0334867fb97",
        "0x9a5c59195425b461a16df891952f6da6d37b05b9283117c414476e56e10def3a",
        "0x9f78503c130eefa10ab9e4a56b114add6b5f755fe736306e169af8be8f1a48ad",
        "0x78c3b05556e88eedf00401d25b1e320a2c2fbe8acc872dbab422fb1a8d44355a",
        "0xf7ae7fc6688d03a0b16b38010e3d30b80fcfcdbdc479e7ac663b77458f978fe9",
        "0x27bac8758154fa8ebcbfa158c2f85947738f8143ecebdf4fcb62eb03a8f2ae17",
        "0x08fd4f5d0a1221d230b03e76ba37ff155b87e73082e22d65022cd81854e1c40d",
        "0x42fe25019f71e593e06bdc1553d9b7e925aef3922863181029068f75c196d019",
        "0x73c806b68d570e08e2a113a93eeac34f71dbb2e99c6469a2172254e4fd3b239a",
        "0xb0ff98aa3c254d96da2ed42c3e951f47683679d980759e7f9e5dacd26c95dacb",
        "0xb58d900f5e182e3c50ef74969ea16c7726c549757cc23523c369587da7293784",
        "0xd49a7502ffcfb0340b1d7885688500ca308161a7f96b62df9d083b71fcc8f2bb",
        "0x8fe6b1689256c0d385f42f5bbe2027a22c1996e110ba97c171d3e5948de92beb",
        "0x8d0d63c39ebade8509e0ae3c9c3876fb5fa112be18f905ecacfecb92057603ab",
        "0x95eec8b2e541cad4e91de38385f2e046619f54496c2382cb6cacd5b98c26f5a4",
        "0xf893e908917775b62bff23294dbbe3a1cd8e6cc1c35b4801887b646a6f81f17f",
        "0xcddba7b592e3133393c16194fac7431abf2f5485ed711db282183c819e08ebaa",
        "0x8a8d7fe3af8caa085a7639a832001457dfb9128a8061142ad0335629ff23ff9c",
        "0xfeb3c337d7a51a6fbf00b9e34c52e1c9195c969bd4e7a0bfd51d5c5bed9c1167",
        "0xe71f0aa83cc32edfbefa9f4d3e0174ca85182eec9f3a09f6a6c0df6377a510d7",
        "0x31206fa80a50bb6abe29085058f16212212a60eec8f049fecb92d8c8e0a84bc0",
        "0x21352bfecbeddde993839f614c3dac0a3ee37543f9b412b16199dc158e23b544",
        "0x619e312724bb6d7c3153ed9de791d764a366b389af13c58bf8a8d90481a46765",
        "0x7cdd2986268250628d0c10e385c58c6191e6fbe05191bcc04f133f2cea72c1c4",
        "0x848930bd7ba8cac54661072113fb278869e07bb8587f91392933374d017bcbe1",
        "0x8869ff2c22b28cc10510d9853292803328be4fb0e80495e8bb8d271f5b889636",
        "0xb5fe28e79f1b850f8658246ce9b6a1e7b49fc06db7143e8fe0b4f2b0c5523a5c",
        "0x985e929f70af28d0bdd1a90a808f977f597c7c778c489e98d3bd8910d31ac0f7",
        "0xc6f67e02e6e4e1bdefb994c6098953f34636ba2b6ca20a4721d2b26a886722ff",
        "0x1c9a7e5ff1cf48b4ad1582d3f4e4a1004f3b20d8c5a2b71387a4254ad933ebc5",
        "0x2f075ae229646b6f6aed19a5e372cf295081401eb893ff599b3f9acc0c0d3e7d",
        "0x328921deb59612076801e8cd61592107b5c67c79b846595cc6320c395b46362c",
        "0xbfb909fdb236ad2411b4e4883810a074b840464689986c3f8a8091827e17c327",
        "0x55d8fb3687ba3ba49f342c77f5a1f89bec83d811446e1a467139213d640b6a74",
        "0xc0f1000000000000000000000000000000000000000000000000000000000000",
        "0xa2b940dcdbbb8e6a9940e94ac5cc90a8ee18d7549882d4f3b26406a8770db1df",
        "0x1c9f4ae53f01f807ea9c3e70da4793f791e170473ecf849d8eabf644323370c9",
        "0x2aef1c6b5ca45b9b7b2ea972fee379327de7e35e10e41d3f1756787d1824b29f",
        "0x760dd5d4f9e7552bb44ba3cabfc37f7736406b83787878afc9c1788e7b7bbf6c",
        "0xe7467e5a471e40f7969ed8b81a4f5d77af173320e89f2ba7379bd2db7a63cfd6"
    ],
    "WithdrawalCredentialProof": [
        "0xba087de35dc4b429ea39111a751664750e61e65c2c036c3ebf4d86e7e5de9340",
        "0xf3bfbc0caa1f8cb89df8a1a04bc18af14714102748965d52e1542b33c94b8ba2",
        "0x0c5a3c12daec8ad96ad6b635dd816b4c4252853260fc5dac3fce29f012f347d8",
        "0x2fd3aa6c99cc05e9fa3473f7cb0b7d737f051134e96be2cebd206825ce636ea2",
        "0x01da838685987c0be55ff085d903f8676048139f2e0aec20d426e336af670449",
        "0x4e4e743ed6cf9c4028e37808bdc202b6cc2f4eecb0f330002c4e41ce181f1def",
        "0xe25e6e55a2bcc935cfc225be988e42253421dc184b1384ceac85fa92228e9782",
        "0xf63336cf1d3b1172dad5513e209d459da726843898d7fcc8b4d2d99e502f2866",
        "0xae999ce50a65a88755ae12cba3616b368eba8f246c263d8154aa0aaa530c9064",
        "0x34706d3d48c0d6e24af619c8acd756da09af05236982caee98aef440242d08c1",
        "0xa61ed5b762a431e9641811d11fd9aa7219d47d4bfd803b7087e95390852f214a",
        "0xbd5c30fa2319470f928f91102b7fcf53bba4bb8ca4a38de53429efe7d00b0cde",
        "0xc655c6a25140072224c98e8b8963fab37d8eb51655265018f62d0860a4d58ad3",
        "0xf00f90e9671a1decbdf18b1ad2247fd9192f1be793818c2c303ee607f43876f0",
        "0xe5ae53bbdf410ecdecbbf58c7b3a4f9ee0885535ef95a3d5a34b69b32da31c07",
        "0x6c2d2ac0c0cbe5b9a09cfaf42b1f2ea0a23d2a46e40473a837bc6725fb94c432",
        "0x8fe6b1689256c0d385f42f5bbe2027a22c1996e110ba97c171d3e5948de92beb",
        "0x8d0d63c39ebade8509e0ae3c9c3876fb5fa112be18f905ecacfecb92057603ab",
        "0x95eec8b2e541cad4e91de38385f2e046619f54496c2382cb6cacd5b98c26f5a4",
        "0xf893e908917775b62bff23294dbbe3a1cd8e6cc1c35b4801887b646a6f81f17f",
        "0xcddba7b592e3133393c16194fac7431abf2f5485ed711db282183c819e08ebaa",
        "0x8a8d7fe3af8caa085a7639a832001457dfb9128a8061142ad0335629ff23ff9c",
        "0xfeb3c337d7a51a6fbf00b9e34c52e1c9195c969bd4e7a0bfd51d5c5bed9c1167",
        "0xe71f0aa83cc32edfbefa9f4d3e0174ca85182eec9f3a09f6a6c0df6377a510d7",
        "0x31206fa80a50bb6abe29085058f16212212a60eec8f049fecb92d8c8e0a84bc0",
        "0x21352bfecbeddde993839f614c3dac0a3ee37543f9b412b16199dc158e23b544",
        "0x619e312724bb6d7c3153ed9de791d764a366b389af13c58bf8a8d90481a46765",
        "0x7cdd2986268250628d0c10e385c58c6191e6fbe05191bcc04f133f2cea72c1c4",
        "0x848930bd7ba8cac54661072113fb278869e07bb8587f91392933374d017bcbe1",
        "0x8869ff2c22b28cc10510d9853292803328be4fb0e80495e8bb8d271f5b889636",
        "0xb5fe28e79f1b850f8658246ce9b6a1e7b49fc06db7143e8fe0b4f2b0c5523a5c",
        "0x985e929f70af28d0bdd1a90a808f977f597c7c778c489e98d3bd8910d31ac0f7",
        "0xc6f67e02e6e4e1bdefb994c6098953f34636ba2b6ca20a4721d2b26a886722ff",
        "0x1c9a7e5ff1cf48b4ad1582d3f4e4a1004f3b20d8c5a2b71387a4254ad933ebc5",
        "0x2f075ae229646b6f6aed19a5e372cf295081401eb893ff599b3f9acc0c0d3e7d",
        "0x328921deb59612076801e8cd61592107b5c67c79b846595cc6320c395b46362c",
        "0xbfb909fdb236ad2411b4e4883810a074b840464689986c3f8a8091827e17c327",
        "0x55d8fb3687ba3ba49f342c77f5a1f89bec83d811446e1a467139213d640b6a74",
        "0xf7210d4f8e7e1039790e7bf4efa207555a10a6db1dd4b95da313aaa88b88fe76",
        "0xad21b516cbc645ffe34ab5de1c8aef8cd4e7f8d2b51e8e1456adc7563cda206f",
        "0xc0f1000000000000000000000000000000000000000000000000000000000000",
        "0x8f03000000000000000000000000000000000000000000000000000000000000",
        "0x655ba28a360c2ba8b28ec4ab0f0cc329d0be63fc010e624850f4eb4c6e4e5f2c",
        "0x4257d5a9fa3f4382614a49c599fcf10a01a18d4fd9b81a0af588a2e38a1611af",
        "0x760dd5d4f9e7552bb44ba3cabfc37f7736406b83787878afc9c1788e7b7bbf6c",
        "0xe7467e5a471e40f7969ed8b81a4f5d77af173320e89f2ba7379bd2db7a63cfd6"
    ],
    "ValidatorFields": [
        "0xe827e0052f9bbd6b5eec2bc2bc5b1e83208b30feca87ae04388819c83321c183",
        "0x01000000000000000000000049c486e3f4303bc11c02f952fe5b08d0ab22d443",
        "0x0040597307000000000000000000000000000000000000000000000000000000",
        "0x0000000000000000000000000000000000000000000000000000000000000000",
        "0xb201000000000000000000000000000000000000000000000000000000000000",
        "0xc901000000000000000000000000000000000000000000000000000000000000",
        "0xffffffffffffffff000000000000000000000000000000000000000000000000",
        "0xffffffffffffffff000000000000000000000000000000000000000000000000"
    ],
    "LatestBlockHeaderProof": [
        "0xa787e90f294d84c8f175b8decee03b95aef0bd5c25ff0dc306500fdb537affd5",
        "0x81ee8c21a9d7b67ee31ff8b2f4aeb8c08e02758a6270e5f52445eb1cc5bc12f1",
        "0x0616a07f6e3bf6aa5e42faaf52627f4ff40a4b8e300b2cec71ed5c0fff0f643e",
        "0x740363449ce964e54c36c8ace68b3d3e1b37f7a4099643255db1e8b4bb9e69a0",
        "0xe7467e5a471e40f7969ed8b81a4f5d77af173320e89f2ba7379bd2db7a63cfd6"
    ]
}
````

## File: src/test/test-data/withdrawalCredentialAndBalanceProof_61336.json
````json
{
    "validatorIndex": 61336,
    "beaconStateRoot": "0x040086cbfc077b7c4461001a5d59e9cc62603db076a63b9a746d5e8320accf4f",
    "balanceRoot": "0xe5015b7307000000000000000000000000000000000000000000000000000000",
    "latestBlockHeaderRoot": "0xb70c51b37b01fe8c02ab81152374651196b471a0ef71ffefe858ea2b19ea7d06",
    "ValidatorBalanceProof": [
        "0xc834937207000000c834937207000000c83493720700000048c4927207000000",
        "0xb78a61531f51cb2ec7dd495212bd2d6c7ef34d2e7e58d3561bef92901f179715",
        "0x3b21ec6a4c8b5b904a453f6f7477095895fe64bc6941a3cc69ec9f60bfb8585e",
        "0x635421906b61e81b6b8c9be44cfaf116892c1b4f141cbd6dbbe0a265ac76566f",
        "0xced97d3fa19fa6b43cf3e214e63ec8d6b27027ac89129073416b86abd1887330",
        "0x343d88e386646d5f9c6bfed46c27e224b3f536e56dbb580cf643b49dc45580d5",
        "0xe335f3934d72a2f6e79b32a2b1695a76c8c037cfc46b8e81b2a77d730de62427",
        "0x78c3b05556e88eedf00401d25b1e320a2c2fbe8acc872dbab422fb1a8d44355a",
        "0xf7ae7fc6688d03a0b16b38010e3d30b80fcfcdbdc479e7ac663b77458f978fe9",
        "0x27bac8758154fa8ebcbfa158c2f85947738f8143ecebdf4fcb62eb03a8f2ae17",
        "0x08fd4f5d0a1221d230b03e76ba37ff155b87e73082e22d65022cd81854e1c40d",
        "0x42fe25019f71e593e06bdc1553d9b7e925aef3922863181029068f75c196d019",
        "0x73c806b68d570e08e2a113a93eeac34f71dbb2e99c6469a2172254e4fd3b239a",
        "0xb0ff98aa3c254d96da2ed42c3e951f47683679d980759e7f9e5dacd26c95dacb",
        "0xb58d900f5e182e3c50ef74969ea16c7726c549757cc23523c369587da7293784",
        "0xd49a7502ffcfb0340b1d7885688500ca308161a7f96b62df9d083b71fcc8f2bb",
        "0x8fe6b1689256c0d385f42f5bbe2027a22c1996e110ba97c171d3e5948de92beb",
        "0x8d0d63c39ebade8509e0ae3c9c3876fb5fa112be18f905ecacfecb92057603ab",
        "0x95eec8b2e541cad4e91de38385f2e046619f54496c2382cb6cacd5b98c26f5a4",
        "0xf893e908917775b62bff23294dbbe3a1cd8e6cc1c35b4801887b646a6f81f17f",
        "0xcddba7b592e3133393c16194fac7431abf2f5485ed711db282183c819e08ebaa",
        "0x8a8d7fe3af8caa085a7639a832001457dfb9128a8061142ad0335629ff23ff9c",
        "0xfeb3c337d7a51a6fbf00b9e34c52e1c9195c969bd4e7a0bfd51d5c5bed9c1167",
        "0xe71f0aa83cc32edfbefa9f4d3e0174ca85182eec9f3a09f6a6c0df6377a510d7",
        "0x31206fa80a50bb6abe29085058f16212212a60eec8f049fecb92d8c8e0a84bc0",
        "0x21352bfecbeddde993839f614c3dac0a3ee37543f9b412b16199dc158e23b544",
        "0x619e312724bb6d7c3153ed9de791d764a366b389af13c58bf8a8d90481a46765",
        "0x7cdd2986268250628d0c10e385c58c6191e6fbe05191bcc04f133f2cea72c1c4",
        "0x848930bd7ba8cac54661072113fb278869e07bb8587f91392933374d017bcbe1",
        "0x8869ff2c22b28cc10510d9853292803328be4fb0e80495e8bb8d271f5b889636",
        "0xb5fe28e79f1b850f8658246ce9b6a1e7b49fc06db7143e8fe0b4f2b0c5523a5c",
        "0x985e929f70af28d0bdd1a90a808f977f597c7c778c489e98d3bd8910d31ac0f7",
        "0xc6f67e02e6e4e1bdefb994c6098953f34636ba2b6ca20a4721d2b26a886722ff",
        "0x1c9a7e5ff1cf48b4ad1582d3f4e4a1004f3b20d8c5a2b71387a4254ad933ebc5",
        "0x2f075ae229646b6f6aed19a5e372cf295081401eb893ff599b3f9acc0c0d3e7d",
        "0x328921deb59612076801e8cd61592107b5c67c79b846595cc6320c395b46362c",
        "0xbfb909fdb236ad2411b4e4883810a074b840464689986c3f8a8091827e17c327",
        "0x55d8fb3687ba3ba49f342c77f5a1f89bec83d811446e1a467139213d640b6a74",
        "0xc0f1000000000000000000000000000000000000000000000000000000000000",
        "0xa2b940dcdbbb8e6a9940e94ac5cc90a8ee18d7549882d4f3b26406a8770db1df",
        "0x1c9f4ae53f01f807ea9c3e70da4793f791e170473ecf849d8eabf644323370c9",
        "0xfc4c6267c598928f75ed9a6093b17f3d4a803520ae75403dfe052ae422d0dd75",
        "0x760dd5d4f9e7552bb44ba3cabfc37f7736406b83787878afc9c1788e7b7bbf6c",
        "0xe7467e5a471e40f7969ed8b81a4f5d77af173320e89f2ba7379bd2db7a63cfd6"
    ],
    "WithdrawalCredentialProof": [
        "0x7b0e44f08bd17b0d0b03dc34533e4a32a2b97104a0fbec66260b629b7b7782fc",
        "0xfd4057403be1b96a41b63c9ac4a06b4c64954ad128a8c8b3a52b3dcb96d122a8",
        "0xcb9960e19d11ac9070baf26a31f1873e0d37385f27e552714f0cf3b4b216fe46",
        "0xce8a034702a0986ac89f1fff7167f615950a83abf321842d424594537f4fd274",
        "0x0990c5bf1d6f66b49861d8bdb6b68aec978b11f58fe98f6dbfa9809230717a2a",
        "0xf0bf5c561e6f031cf01b6790362ae58746c1f31be4db59269d14de4806505d79",
        "0xbd02a0782b3639b6b6a0f012fad51f9c63c46e4e5d8456e8e847c1affa1052f9",
        "0x430dd7834cf49b572dc5245c2c120037477a43f9b410675acfa7fc32a7d4649f",
        "0xfec85caf431b0850a8c2fb58f522c43670ca089e65bc5c4ae38f59487bd98880",
        "0x34706d3d48c0d6e24af619c8acd756da09af05236982caee98aef440242d08c1",
        "0xa61ed5b762a431e9641811d11fd9aa7219d47d4bfd803b7087e95390852f214a",
        "0xbd5c30fa2319470f928f91102b7fcf53bba4bb8ca4a38de53429efe7d00b0cde",
        "0xc655c6a25140072224c98e8b8963fab37d8eb51655265018f62d0860a4d58ad3",
        "0xf00f90e9671a1decbdf18b1ad2247fd9192f1be793818c2c303ee607f43876f0",
        "0xe5ae53bbdf410ecdecbbf58c7b3a4f9ee0885535ef95a3d5a34b69b32da31c07",
        "0x6c2d2ac0c0cbe5b9a09cfaf42b1f2ea0a23d2a46e40473a837bc6725fb94c432",
        "0x8fe6b1689256c0d385f42f5bbe2027a22c1996e110ba97c171d3e5948de92beb",
        "0x8d0d63c39ebade8509e0ae3c9c3876fb5fa112be18f905ecacfecb92057603ab",
        "0x95eec8b2e541cad4e91de38385f2e046619f54496c2382cb6cacd5b98c26f5a4",
        "0xf893e908917775b62bff23294dbbe3a1cd8e6cc1c35b4801887b646a6f81f17f",
        "0xcddba7b592e3133393c16194fac7431abf2f5485ed711db282183c819e08ebaa",
        "0x8a8d7fe3af8caa085a7639a832001457dfb9128a8061142ad0335629ff23ff9c",
        "0xfeb3c337d7a51a6fbf00b9e34c52e1c9195c969bd4e7a0bfd51d5c5bed9c1167",
        "0xe71f0aa83cc32edfbefa9f4d3e0174ca85182eec9f3a09f6a6c0df6377a510d7",
        "0x31206fa80a50bb6abe29085058f16212212a60eec8f049fecb92d8c8e0a84bc0",
        "0x21352bfecbeddde993839f614c3dac0a3ee37543f9b412b16199dc158e23b544",
        "0x619e312724bb6d7c3153ed9de791d764a366b389af13c58bf8a8d90481a46765",
        "0x7cdd2986268250628d0c10e385c58c6191e6fbe05191bcc04f133f2cea72c1c4",
        "0x848930bd7ba8cac54661072113fb278869e07bb8587f91392933374d017bcbe1",
        "0x8869ff2c22b28cc10510d9853292803328be4fb0e80495e8bb8d271f5b889636",
        "0xb5fe28e79f1b850f8658246ce9b6a1e7b49fc06db7143e8fe0b4f2b0c5523a5c",
        "0x985e929f70af28d0bdd1a90a808f977f597c7c778c489e98d3bd8910d31ac0f7",
        "0xc6f67e02e6e4e1bdefb994c6098953f34636ba2b6ca20a4721d2b26a886722ff",
        "0x1c9a7e5ff1cf48b4ad1582d3f4e4a1004f3b20d8c5a2b71387a4254ad933ebc5",
        "0x2f075ae229646b6f6aed19a5e372cf295081401eb893ff599b3f9acc0c0d3e7d",
        "0x328921deb59612076801e8cd61592107b5c67c79b846595cc6320c395b46362c",
        "0xbfb909fdb236ad2411b4e4883810a074b840464689986c3f8a8091827e17c327",
        "0x55d8fb3687ba3ba49f342c77f5a1f89bec83d811446e1a467139213d640b6a74",
        "0xf7210d4f8e7e1039790e7bf4efa207555a10a6db1dd4b95da313aaa88b88fe76",
        "0xad21b516cbc645ffe34ab5de1c8aef8cd4e7f8d2b51e8e1456adc7563cda206f",
        "0xc0f1000000000000000000000000000000000000000000000000000000000000",
        "0x8f03000000000000000000000000000000000000000000000000000000000000",
        "0x655ba28a360c2ba8b28ec4ab0f0cc329d0be63fc010e624850f4eb4c6e4e5f2c",
        "0x1dbd2f10de6e10eaa0f945d5c106e1c0352e752f28165f04e831711772043f8d",
        "0x760dd5d4f9e7552bb44ba3cabfc37f7736406b83787878afc9c1788e7b7bbf6c",
        "0xe7467e5a471e40f7969ed8b81a4f5d77af173320e89f2ba7379bd2db7a63cfd6"
    ],
    "ValidatorFields": [
        "0x2c58c7f513dab2de353f008ddaf054749e80709b8ec1f397011773c7b29cd950",
        "0x01000000000000000000000049c486e3f4303bc11c02f952fe5b08d0ab22d443",
        "0xe5015b7307000000000000000000000000000000000000000000000000000000",
        "0x0000000000000000000000000000000000000000000000000000000000000000",
        "0xb301000000000000000000000000000000000000000000000000000000000000",
        "0x0c02000000000000000000000000000000000000000000000000000000000000",
        "0x6603000000000000000000000000000000000000000000000000000000000000",
        "0x6604000000000000000000000000000000000000000000000000000000000000"
    ],
    "LatestBlockHeaderProof": [
        "0xa787e90f294d84c8f175b8decee03b95aef0bd5c25ff0dc306500fdb537affd5",
        "0x81ee8c21a9d7b67ee31ff8b2f4aeb8c08e02758a6270e5f52445eb1cc5bc12f1",
        "0x0616a07f6e3bf6aa5e42faaf52627f4ff40a4b8e300b2cec71ed5c0fff0f643e",
        "0x2df72afcad3355b9ea6965e94642ab99a49f8ba3e8abea7bf49bc594c2c48a90",
        "0xe7467e5a471e40f7969ed8b81a4f5d77af173320e89f2ba7379bd2db7a63cfd6"
    ]
}
````

## File: src/test/token/bEIGEN.t.sol
````
// SPDX-License-Identifier: UNLICENSED
⋮----
import "forge-std/Test.sol";
⋮----
import "@openzeppelin/contracts/proxy/transparent/ProxyAdmin.sol";
import "@openzeppelin/contracts/proxy/transparent/TransparentUpgradeableProxy.sol";
import "../harnesses/EigenHarness.sol";
⋮----
import "../../contracts/token/BackingEigen.sol";
⋮----
contract bEIGENTest is Test {
⋮----
function setUp() public {
⋮----
// deploy proxies
⋮----
// deploy impls
⋮----
// upgrade proxies
⋮----
function test_Initialize() public {
⋮----
// check that the owner is initialOwner
⋮----
// check the transfer restrictions are disabled after one year in the future
⋮----
function testFuzz_CanBackTheEigenToken(uint eigenSupply) public {
⋮----
// check that the total supply of bEIGEN is equal to the total supply of EIGEN
⋮----
function test_setIsMinterAndMint() public {
⋮----
function test_setIsMinter_revertsWhenNotCalledByOwner() public {
⋮----
function test_burn() public {
⋮----
function test_mint_revertsWhenNotCalledByMinter() public {
````

## File: src/test/token/EigenTransferRestrictions.t.sol
````
// SPDX-License-Identifier: UNLICENSED
⋮----
import "forge-std/Test.sol";
⋮----
import "@openzeppelin/contracts/proxy/transparent/ProxyAdmin.sol";
import "@openzeppelin/contracts/proxy/transparent/TransparentUpgradeableProxy.sol";
import "@openzeppelin/contracts/token/ERC20/presets/ERC20PresetFixedSupply.sol";
import "../harnesses/EigenHarness.sol";
⋮----
contract EigenTransferRestrictionsTest is Test {
⋮----
// EVENTS FROM EIGEN.sol
/// @notice event emitted when the allowedFrom status of an address is set
event SetAllowedFrom(address indexed from, bool isAllowedFrom);
/// @notice event emitted when the allowedTo status of an address is set
event SetAllowedTo(address indexed to, bool isAllowedTo);
/// @notice event emitted when a minter mints
event Mint(address indexed minter, uint amount);
/// @notice event emitted when the transfer restrictions are disabled
event TransferRestrictionsDisabled();
⋮----
modifier filterAddress(address fuzzedAddress) {
⋮----
function setUp() public {
⋮----
// initialize with dummy BackingEigen address
⋮----
function test_AllowedFromCanSendAnywhere(address to) public filterAddress(to) {
⋮----
// minter1 and eigenminter2 are already allowedFrom
⋮----
function test_CanSetAllowedFrom(address from, address to) public filterAddress(from) filterAddress(to) {
⋮----
// set allowedFrom[from] = true
⋮----
// new allowedFrom can send
⋮----
// set allowedFrom[from] = false
⋮----
function test_OnlyOwnerCanSetAllowedFrom(address notOwner) public filterAddress(notOwner) {
⋮----
function test_NotAllowedFromCannotSendIfNoAllowedTos(address from, address to) public filterAddress(from) filterAddress(to) {
⋮----
// send other tokens from minter1
⋮----
// sending from other will revert
⋮----
function test_CanSetAllowedTo(address from, address to) public filterAddress(from) filterAddress(to) {
⋮----
function test_OnlyOwnerCanSetAllowedTo(address notOwner) public filterAddress(notOwner) {
⋮----
function test_disableTransferRestrictions(address from, address to) public filterAddress(from) filterAddress(to) {
⋮----
// transfer will revert
⋮----
// set transfer restrictions to be disabled after one year in the future
⋮----
// transfer restrictions are disabled
⋮----
function _simulateMint() internal {
// dummy mint
⋮----
// set allowed froms
⋮----
// set transfer restrictions to be disabled after to max
⋮----
// set owner to minter1
````

## File: src/test/token/EigenWrapping.t.sol
````
// SPDX-License-Identifier: UNLICENSED
⋮----
import "forge-std/Test.sol";
⋮----
import "@openzeppelin/contracts/proxy/transparent/ProxyAdmin.sol";
import "@openzeppelin/contracts/proxy/transparent/TransparentUpgradeableProxy.sol";
import "../harnesses/EigenHarness.sol";
⋮----
import "../../contracts/token/BackingEigen.sol";
⋮----
contract EigenWrappingTests is Test {
⋮----
// EVENTS FROM EIGEN.sol
/// @notice event emitted when the allowedFrom status of an address is set
event SetAllowedFrom(address indexed from, bool isAllowedFrom);
/// @notice event emitted when the allowedTo status of an address is set
event SetAllowedTo(address indexed to, bool isAllowedTo);
/// @notice event emitted when a minter mints
event Mint(address indexed minter, uint amount);
/// @notice event emitted when the transfer restrictions are disabled
event TransferRestrictionsDisabled();
⋮----
// EVENTS FROM Eigen.sol
/// @notice event emitted when bEIGEN tokens are wrapped into EIGEN
event TokenWrapped(address indexed account, uint amount);
/// @notice event emitted when EIGEN tokens are unwrapped into bEIGEN
event TokenUnwrapped(address indexed account, uint amount);
⋮----
modifier filterAddress(address fuzzedAddress) {
⋮----
function setUp() public {
⋮----
// deploy proxies
⋮----
// deploy impls
⋮----
// upgrade proxies
⋮----
function test_AnyoneCanUnwrap(address unwrapper, uint unwrapAmount) public filterAddress(unwrapper) {
⋮----
// minter1 balance
⋮----
// send EIGEN to unwrapper
⋮----
// initial bEIGEN balance
⋮----
// initial EIGEN token supply
⋮----
// unwrap
// unwrap amount should be less than minter1 balance
⋮----
// check total supply and balance changes
⋮----
function test_AnyoneCanWrap(address wrapper, uint wrapAmount) public filterAddress(wrapper) {
⋮----
// send bEIGEN to wrapper
⋮----
// wrap
// wrap amount should be less than minter1 balance
⋮----
// approve bEIGEN
⋮----
function test_CannotUnwrapMoreThanBalance(address unwrapper, uint unwrapAmount) public filterAddress(unwrapper) {
⋮----
function test_CannotWrapMoreThanBalance(address wrapper, uint wrapAmount) public filterAddress(wrapper) {
⋮----
function _simulateMint() internal {
// dummy mint
⋮----
// set allowed froms
⋮----
// set transfer restrictions to be disabled after to max
⋮----
// set owner to minter1
⋮----
function _simulateBackingAndSetTransferRestrictions() internal {
````

## File: src/test/tree/AllocationManagerUnit.tree
````
.
├── AllocationManager Tree (**** denotes that integration tests are needed to fully validate path)
├── when setAllocationDelay is called by the operator
│   ├── given that the caller is not an operator in the delegationManager
│   │   └── it should revert
│   ├── given that the delay is set to 0
│   │   └── it should revert
│   ├── given that a previous delay is set and has passed
│   │   └── it should set the new delay to the previous delay
│   └── given the caller provides a valid delay
│       ├── given that a previous delay is set and has passed
│       │   └── it should set the new delay to the previous delay delay
│       ├── given that a previous delay is set and has not passed
│       │   └── it should should overwrite the previous pending delay with the new delay
│       └── it should set the pendingDelay, update the effectBlock, and emit an `AllocationDelaySetEvent`
├── when setAllocationDelay is called by the delegationManager
│   ├── given that the caller is not the delegationManager
│   │   └── it should revert
│   ├── given that the delay is set to 0
│   │   └── it should revert
│   ├── given that a previous delay is set and has passed
│   │   └── it should set the new delay to the previous delay
│   └── given the caller provides a valid delay
│       ├── given that a previous delay is set and has passed
│       │   └── it should set the new delay to the previous delay delay
│       ├── given that a previous delay is set and has not passed
│       │   └── it should should overwrite the previous pending delay with the new delay
│       └── it should set the pendingDelay, update the effectBlock, and emit an `AllocationDelaySetEvent`
├── when clearModificationQueue is called
│   ├── given that the length of the strategies and numToClear are not equal
│   │   └── it should revert
│   ├── given that the operator is registered in the delegationManager
│   │   └── it should revert
│   ├── given that there are no modifications OR numToClear is 0
│   │   └── no modifications should be cleared
│   └── it should loop through the modification queue and the numToClear
│       ├── given that the latest effect block has not been reached
│       │   └── it should break the loop
│       └── given that the latest effect block has been reached
│           ├── it should update the magnitude info to the currentMagnitude, with a pendingDiff of 0 and effectBlock of 0
│           ├── it should change the encumbered magnitude if the pendingDiff was less than 0
│           ├── it should emit an EncumberedmagnitudeUpdated event
│           ├── it should remove the modification from the queue
│           └── it should continue to pop off the modification queue if the size is greater than 0 and numToClear is less than numCompleted
├── given that modifyAllocations is called
│   ├── given that the allocation delay is not set for the msg.sender
│   │   └── it should revert
│   └── it should loop through the list of allocations
│       ├── given that the length of operator sets and magnitudes does not match
│       │   └── it should revert
│       ├── given that the operatorSets to allocate mags to do not exist in the AVSD
│       │   └── it should revert
│       ├── it should clear the modification queue for the given strategy for the type(uint16).max number of modifications
│       ├── given that the maximum magnitude does not equal the expected maximum magnitude
│       │   └── it should revert
│       └── it should loop through the list of operator sets for the allocation
│           ├── given that the pendingDiff is nonZero
│           │   └── it should revert
│           ├── given that that the magnitude delta is the same as the pendingDiff
│           │   └── it should revert
│           ├── given that the pendingDiff is less than 0 (this is a deallocation)
│           │   └── it should update the effect block in memory to be the operator deallocation delay
│           ├── given that the pendingDiff is greater than 0 (this is an allocation)
│           │   ├── it should update the effect timestamp in memory to be the operator allocation delay
│           │   └── it should increase the encumberedMagnitude in memory by the pendingDiff
│           ├── it should push to the modification queue
│           ├── it should update the magnitude info, encumbered magnitude, emit an event for encumbered magnitude
│           └── it should emit an AllocationUpdated Event
└── when slashOperator is called
    ├── given that the  wads to slash is 0
    │   └── it should revert
    ├── given that the wads to slash is greater than WAD
    │   └── it should revert
    ├── given that the operator is not registered in the delegationManager
    │   └── it should revert
    ├── given that the operator is deregistered from AVS for the given block
    │   └── it should revert
    └── it should loop through all slashing params
        ├── it should slash the current magnitude by wads to slash
        ├── given that there is a pending deallocation
        │   ├── it should slash the pending diff
        │   └── it should emit an event for AllocationUpdated with the original deallocation's effect timestamp
        ├── it should update the magnitude info, encumbered magnitude, emit an event for encumbered magnitude
        ├── it should decrease the operator's max magnitude
        ├── it should decrease the operators shares in the delegation manager
        └── It should emit an AllocationUpdated event
````

## File: src/test/tree/BN254CertificateVerifier.tree
````
.
└── BN254CertificateVerifier (**** denotes that integration tests are needed to fully validate path)
    ├── when updateOperatorTable is called
    │   ├── given that the caller is not the table updater
    │   │   └── it should revert
    │   ├── given that the reference timestamp is not greater than the latest
    │   │   └── it should revert
    │   └── given that all parameters are valid
    │       └── it should update operator set info, timestamp, owner, and staleness period & emit event
    ├── when verifyCertificate is called
    │   ├── given that the reference timestamp does not exist
    │   │   └── it should revert
    │   ├── given that the certificate is stale (non-zero staleness period)
    │   │   └── it should revert
    │   ├── given that the staleness period is zero
    │   │   └── it should never consider the certificate stale
    │   ├── given that the root at the reference timestamp is disabled
    │   │   └── it should revert
    │   ├── given that a non-signer witness has invalid operator index
    │   │   └── it should revert
    │   ├── given that a non-signer witness has invalid merkle proof
    │   │   └── it should revert
    │   ├── given that the signature is invalid
    │   │   └── it should revert
    │   ├── given that all operators are signers
    │   │   └── it should return full stake amounts
    │   ├── given that some operators are non-signers
    │   │   └── it should deduct non-signer stakes from total
    │   └── given that operator info is not cached
    │       └── it should cache operator info after verification
    ├── when verifyCertificateProportion is called
    │   ├── given that array lengths mismatch
    │   │   └── it should revert
    │   ├── given that the certificate meets thresholds
    │   │   └── it should return true
    │   └── given that the certificate does not meet thresholds
    │       └── it should return false
    ├── when verifyCertificateNominal is called
    │   ├── given that array lengths mismatch
    │   │   └── it should revert
    │   ├── given that the certificate meets thresholds
    │   │   └── it should return true
    │   └── given that the certificate does not meet thresholds
    │       └── it should return false
    ├── when trySignatureVerification is called
    │   ├── given a valid signature
    │   │   └── it should return pairing successful and signature valid
    │   └── given an invalid signature
    │       └── it should return pairing successful and signature invalid
    └── when view functions are called
        ├── getOperatorSetOwner
        │   └── it should return the correct owner address
        ├── maxOperatorTableStaleness
        │   └── it should return the correct staleness period
        ├── latestReferenceTimestamp
        │   └── it should return the latest timestamp
        ├── isReferenceTimestampSet
        │   ├── given that the timestamp has been set via updateOperatorTable
        │   │   └── it should return true
        │   └── given that the timestamp has not been set
        │       └── it should return false
        ├── getOperatorSetInfo
        │   └── it should return the correct operator set info
        ├── getNonsignerOperatorInfo
        │   └── it should return the cached operator info
        └── isNonsignerCached
            └── it should return whether the operator info is cached
````

## File: src/test/tree/CrossChainRegistry.tree
````
.
└── CrossChainRegistry (**** denotes that integration tests are needed to fully validate path)
    ├── when initialize is called
    │   ├── given that the contract is already initialized
    │   │   └── it should revert
    │   └── given that the contract is not initialized
    │       └── it should set the owner, minimum staleness period, and paused status correctly
    ├── when createGenerationReservation is called
    │   ├── given that the function is paused
    │   │   └── it should revert
    │   ├── given that the caller does not have permission
    │   │   └── it should revert
    │   ├── given that the operator set is invalid
    │   │   └── it should revert
    │   ├── given that a generation reservation already exists
    │   │   └── it should revert
    │   ├── given that the chain IDs array is empty
    │   │   └── it should revert
    │   ├── given that a chain ID is not whitelisted
    │   │   └── it should revert
    │   ├── given that the config staleness period is invalid
    │   │   └── it should revert
    │   └── given that all parameters are valid
    │       └── it should create the reservation, set calculator, config, and destinations & emit events
    ├── when removeGenerationReservation is called
    │   ├── given that the function is paused
    │   │   └── it should revert
    │   ├── given that the caller does not have permission
    │   │   └── it should revert
    │   ├── given that the operator set is invalid
    │   │   └── it should revert
    │   ├── given that the generation reservation does not exist
    │   │   └── it should revert
    │   └── given that a valid reservation exists
    │       └── it should remove all storage and emit events
    ├── when setOperatorTableCalculator is called
    │   ├── given that the function is paused
    │   │   └── it should revert
    │   ├── given that the caller does not have permission
    │   │   └── it should revert
    │   ├── given that the operator set is invalid
    │   │   └── it should revert
    │   ├── given that the generation reservation does not exist
    │   │   └── it should revert
    │   └── given that all parameters are valid
    │       └── it should update the calculator and emit event
    ├── when setOperatorSetConfig is called
    │   ├── given that the function is paused
    │   │   └── it should revert
    │   ├── given that the caller does not have permission
    │   │   └── it should revert
    │   ├── given that the operator set is invalid
    │   │   └── it should revert
    │   ├── given that the generation reservation does not exist
    │   │   └── it should revert
    │   ├── given that the config staleness period is invalid
    │   │   └── it should revert
    │   └── given that all parameters are valid
    │       └── it should update the config and emit event
    ├── when addTransportDestinations is called
    │   ├── given that the function is paused
    │   │   └── it should revert
    │   ├── given that the caller does not have permission
    │   │   └── it should revert
    │   ├── given that the operator set is invalid
    │   │   └── it should revert
    │   ├── given that the generation reservation does not exist
    │   │   └── it should revert
    │   ├── given that the chain IDs array is empty
    │   │   └── it should revert
    │   ├── given that a chain ID is not whitelisted
    │   │   └── it should revert
    │   ├── given that a transport destination already exists
    │   │   └── it should revert
    │   └── given that all parameters are valid
    │       └── it should add the destinations and emit events
    ├── when removeTransportDestinations is called
    │   ├── given that the function is paused
    │   │   └── it should revert
    │   ├── given that the caller does not have permission
    │   │   └── it should revert
    │   ├── given that the operator set is invalid
    │   │   └── it should revert
    │   ├── given that the generation reservation does not exist
    │   │   └── it should revert
    │   ├── given that the chain IDs array is empty
    │   │   └── it should revert
    │   ├── given that a transport destination is not found
    │   │   └── it should revert
    │   ├── given that removing would leave zero destinations
    │   │   └── it should revert
    │   └── given that all parameters are valid
    │       └── it should remove the destinations and emit events
    ├── when addChainIDsToWhitelist is called
    │   ├── given that the caller is not the owner
    │   │   └── it should revert
    │   ├── given that the function is paused
    │   │   └── it should revert
    │   ├── given that array lengths mismatch
    │   │   └── it should revert
    │   ├── given that a chain ID is zero
    │   │   └── it should revert
    │   ├── given that a chain ID is already whitelisted
    │   │   └── it should revert
    │   └── given that all parameters are valid
    │       └── it should add chains to whitelist and emit events
    ├── when removeChainIDsFromWhitelist is called
    │   ├── given that the caller is not the owner
    │   │   └── it should revert
    │   ├── given that the function is paused
    │   │   └── it should revert
    │   ├── given that a chain ID is not whitelisted
    │   │   └── it should revert
    │   └── given that all parameters are valid
    │       └── it should remove chains from whitelist and emit events
    └── when setMinimumStalenessPeriod is called
        ├── given that the caller is not the owner
        │   └── it should revert
        ├── given that the minimum staleness period is zero
        │   └── it should revert
        └── given that the caller is the owner
            └── it should update the minimum staleness period and emit event
````

## File: src/test/tree/DelegationManagerUnit.tree
````
.
├── DelegationManager Tree (*** denotes that integration tests are needed to validate path)
├── when registerAsOperator is called
│   ├── given that the caller has already delegated to an operator
│   │   └── it should revert
│   ├── it should call `_setOperatorDetails`
│   │   └── it should emit an OperatorDetailsModified event
│   └── it should call `_delegate`
│       ├── given that delegation is paused
│       │   └── it should revert
│       ├── it should set the operator allocation delay in the AllocationManager contract
│       ├── it should set the operator delegated to itself and emit a StakerDelegated event
│       ├── given the caller has delegateable shares
│       │   └── it should increase the operator's shares and and emit an OperatorSharesIncreased event
│       └── it should push an operator stake update
│           └── it should emit an OperatorRegistered event and OperatorMetadataURIUpdated event
├── when modifyOperatorDetails is called
│   ├── given caller is not an operator
│   │   └── it should revert
│   └── given caller is an operator
│       └── it should update the operatorDetails and emit an OperatorDetailsModified event
├── when updateOperatorMetadataURI is called
│   ├── given caller is not an operator
│   │   └── it should revert
│   └── given caller is an operator
│       └── it should emit an OperatorMetadataURIUpdated event 
├── when delegateTo is called
│   ├── given operator is not registered
│   │   └── it should revert
│   ├── given staker is already delegated to an operator
│   │   └── it should revert
│   └── it should call `_delegate` (internal function) with msg.sender as the staker
├── when delegateToBySignature is called
│   ├── given block timestamp is > staker signature expiry
│   │   └── it should revert
│   ├── given operator is not registered
│   │   └── it should revert
│   ├── given staker is already delegated to an operator
│   │   └── it should revert
│   ├── given staker signature verification fails
│   │   └── it should revert
│   └── given staker signature verification succeeds
│       └── it should call _delegate() (internal function)
├── when _delegate() is called
│   ├── given that new delegations are paused
│   │   └── it should revert
│   ├── given operator's delegationApprover is set to zero address OR given caller is the delegationApprover
│   │   └── it should check delegatable shares and update accordingly (**below logic tree reused elsewhere**)
│   │       ├── given staker doesn't have delegatable shares
│   │       │   └── it should set staker delegated to operator, call the StakeRegistry, and emit events
│   │       └── given staker has delegatable shares
│   │           ├── it should get the maxMagnitudes for each strategy from the staker's delegated operator
│   │           └── it should call `_increaseDelegation` with the maxMagnitude of the staker's operator
│   └── given operator's delegationApprover is set to nonzero address AND the caller is not the delegationApprover
│       ├── given the delegationApprover is an EOA
│       │   ├── given the block timestamp is past the expiry timestamp
│       │   │   └── it should revert
│       │   ├── given the delegationApprove salt has already been used
│       │   │   └── it should revert
│       │   ├── given the signature verification fails
│       │   │   └── it should revert
│       │   └── given the signature verification succeeds
│       │       └── it should set salt as spent, check delegatable shares and update accordingly (**logic tree reused from above**)
│       └── given the delegationApprover is a contract
│           ├── given the block timestamp is past the expiry timestamp
│           │   └── it should revert
│           ├── given the delegationApprove salt has already been used
│           │   └── it should revert
│           ├── given the contract isn't EIP1271 compliant
│           │   └── it should revert
│           ├── given the signature verification fails, isValidSignature() does not return  EIP1271_MAGICVALUE
│           │   └── it should revert
│           └── given the signature verification succeeds, isValidSignature() returns EIP1271_MAGICVALUE
│               └── it should set salt as spent, check delegatable shares and update accordingly (**logic tree reused from above**)
├── when undelegate is called
│   ├── given staker is not delegated to an operator
│   │   └── it should revert
│   ├── given that the staker is registered as operator
│   │   └── it should revert
│   ├── given that staker param is zero address
│   │   └── it should revert
│   ├── given msg.sender is neither the staker, operator, or delegationApprover (if applicable)
│   │   └── it should revert
│   ├── given the msg.sender is the operator or delegationApprover
│   │   └── it should emit a StakerForceUndelegated event
│   └── it should emit a StakerUndelegatedEvent and undelegate the staker
│       └── it should loop through each strategy that the staker has non-zero depositShares
│           ├── given `_hasNonZeroScalingFactors` returns false (the strategy has a maxMagnitude of 0 OR the strategy is the beacon chain strategy and the beaconChainScalingFactor is 0)
│           │   └── it should decrement all operator depositShares with a respective withdrawalRoot of 0x0
│           └── given `_hasNonZeroScalingFactors` returns true
│               └── it should convert depositShares to sharesToWithdraw to factor in Slashed amounts and call _removeSharesAndQueueWithdrawal and return a withdrawalRoot
├── when queueWithdrawals is called ***
│   ├── given that entering the withdrawal queue is paused
│   │   └── it should revert
│   ├── given for a withdrawal, the withdrawer address is not the msg.sender
│   │   └── it should revert
│   ├── given for a withdrawal, the strategies and shares arrays are not equal length
│   │   └── it should revert
│   └── it should loop through each withdrawal and call `_removeSharesAndQueueWithdrawal`
├── when _removeSharesAndQueueWithdrawal is called
│   ├── given that the staker is a zero address
│   │   └── it should revert
│   ├── given that the length of strategies is 0
│   │   └── it should revert
│   └── it should loop through each strategy
│       ├── given `_hasNonZeroScalingFactors` returns false (the strategy has a maxMagnitude of 0 OR the strategy is the beacon chain strategy and the beaconChainScalingFactor is 0)
│       │   └── it should revert
│       ├── given that the sharesToWithdraw is greater than the staker's withdrawable shares (accounting for slashing)
│       │   └── it should revert
│       ├── given that the staker is delegated to (not zero address)
│       │   └── it should decrease the operator's shares and emit OperatorSharesDecreased
│       ├── given that the strategy is the beacon chain strategy
│       │   └── it should remove shares from the eigen pod manager
│       ├── given that the strategy is not the beacon chain eth strategy
│       │   └── it should remove shares from the strategy manager
│       ├── it should increment the staker's cumulativeWithdrawalsQueued
│       ├── it should calculate the scaled shares for queued withdrawal and set the withdrawal root as pending
│       └── it should emit a SlashingWithdrawalQueued event and return the withdrawal root
├── when completeQueuedWithdrawal OR completeQueuedWithdrawals is called ***
│   ├── given that the exiting the withdrawal queue is paused
│   │   └── it should revert
│   ├── given that the function is reentered
│   │   └── it should revert
│   └── it should call _completeQueuedWithdrawal (internal function) for each withdrawal
├── when _completeQueuedWithdrawal is called ***
│   ├── given that the tokens and strategies arrays are not equal length
│   │   └── it should revert
│   ├── given that the caller is not the withdrawer
│   │   └── it should revert
│   ├── given that the withdrawal root is not pending
│   │   └── it should revert
│   ├── given that the withdrawal is a legacy pre-slashing upgrade withdrawal and LEGACY_MIN_WITHDRAWAL_DELAY_BLOCKS have not passed
│   │   └── it should revert
│   ├── given that the withdrawal is a post slashing upgrade withdrawal and MIN_WITHDRAWAL_DELAY seconds have not passed
│   │   └── it should revert
│   └── given that the above conditions are satisfied
│       ├── given that receiveAsTokens is false
│       │   └── for each strategy, it should call addShares on the shareManager to withdraw from
│       │       ├── given the shareManager is the EigenPodManager
│       │       │   └── it should call `EigenPodManager.addShares` which may callback `increaseDelegatedShares` to the DelegationManager 
│       │       └── given the shareManager is the StrategyManager
│       │           └── it should call `StrategyManager.addShares` which will callback `increaseDelegatedShares` to the DelegationManager 
│       ├── given that receiveAsTokens is true
│       │   └── for each strategy, it should call withdrawSharesAsTokens on the shareManager to withdraw from
│       │       ├── given the shareManager is the EigenPodManager
│       │       │   └── it should call `EigenPodManager.withdrawSharesAsTokens` which will withdraw ETH from the staker EigenPod if EPM shares not in deficit
│       │       └── given the shareManager is the StrategyManager
│       │           └── it should call `StrategyManager.withdrawSharesAsTokens` which will withdraw the strategy's underlying token
│       ├── it should delete the withdrawal root from pending withdrawals
│       └── it should emit a WithdrawalCompleted event
├── when increaseDelegatedShares is called
│   ├── if the caller is not the strategy manager or eigen pod manager
│   │   └── it should revert
│   └── given that the staker is delegated
│       ├── it should get the maxMagnitudes for each strategy from the staker's delegated operator
│       └── it should call `_increaseDelegation` with the maxMagnitude of the staker's operator
├── when _increaseDelegation is called
│   ├── given `_hasNonZeroScalingFactors` returns false (the strategy has a maxMagnitude of 0 OR the strategy is the beacon chain strategy and the beaconChainScalingFactor is 0)
│   │   └── it should revert
│   └── it should increase the operator's shares by addedShares amount, update the staker's depositScalingFactor, and emit OperatorSharesIncreased, DepositScalingFactorUpdated
├── when decreaseBeaconChainScalingFactor is called
│   ├── if the caller is not the eigen pod manager
│   │   └── it should revert
│   ├── it should decrease the beacon chain scaling factor and emit a BeaconChainScalingFactorDecreased event
│   └── given that the staker is delegated
│       └── it should decrease operator shares with the beacon chain shares slashed and emit OperatorSharesDecreased
├── when _decreaseDelegation is called
│   ├── given `_hasNonZeroScalingFactors` returns false (the strategy has a maxMagnitude of 0 OR the strategy is the beacon chain strategy and the beaconChainScalingFactor is 0)
│   │   └── it should revert
│   └── it should decrease the operator's shares by slashed shares amount, update the staker's depositScalingFactor, and emit OperatorSharesDecreased, DepositScalingFactorUpdated
└── when decreaseOperatorShares is called
    ├── given not called by AllocationManager
    │   └── it should revert
    └── it should decrease the operator's shares by slashed shares amount and emit OperatorSharesDecreased
````

## File: src/test/tree/ECDSACertificateVerifierUnit.tree
````
.
└── ECDSACertificateVerifier (**** denotes that integration tests are needed to fully validate path)
    ├── when updateOperatorTable is called
    │   ├── given that the caller is not the table updater
    │   │   └── it should revert
    │   ├── given that the reference timestamp is not greater than the latest
    │   │   └── it should revert
    │   └── given that all parameters are valid
    │       └── it should update operator infos, timestamp, owner, and staleness period & emit event
    ├── when verifyCertificate is called
    │   ├── given that the reference timestamp does not exist
    │   │   └── it should revert
    │   ├── given that the certificate is stale (non-zero staleness period)
    │   │   └── it should revert
    │   ├── given that the staleness period is zero
    │   │   └── it should never consider the certificate stale
    │   ├── given that the root at the reference timestamp is disabled
    │   │   └── it should revert
    │   ├── given that the signature is invalid
    │   │   └── it should revert
    │   ├── given that a signer is not an operator
    │   │   └── it should revert
    │   ├── given that signatures are not ordered by address
    │   │   └── it should revert
    │   ├── given that all operators are signers
    │   │   └── it should return full stake amounts
    │   └── given that some operators are non-signers
    │       └── it should deduct non-signer stakes from total
    ├── when verifyCertificateProportion is called
    │   ├── given that array lengths mismatch
    │   │   └── it should revert
    │   ├── given that the certificate meets thresholds
    │   │   └── it should return true
    │   └── given that the certificate does not meet thresholds
    │       └── it should return false
    ├── when verifyCertificateNominal is called
    │   ├── given that array lengths mismatch
    │   │   └── it should revert
    │   ├── given that the certificate meets thresholds
    │   │   └── it should return true
    │   └── given that the certificate does not meet thresholds
    │       └── it should return false
    └── when view functions are called
        ├── getOperatorSetOwner
        │   └── it should return the correct owner address
        ├── maxOperatorTableStaleness
        │   └── it should return the correct staleness period
        ├── latestReferenceTimestamp
        │   └── it should return the latest timestamp
        ├── isReferenceTimestampSet
        │   ├── given that the timestamp has been set via updateOperatorTable
        │   │   └── it should return true
        │   └── given that the timestamp has not been set
        │       └── it should return false
        ├── getOperatorInfos
        │   └── it should return all operator infos for the given timestamp
        ├── getOperatorInfo
        │   ├── given an out of bounds index
        │   │   └── it should revert
        │   └── given a valid index
        │       └── it should return the correct operator info
        ├── getOperatorCount
        │   └── it should return the correct number of operators
        ├── getTotalStakes
        │   ├── given that reference timestamp does not exist
        │   │   └── it should revert
        │   ├── given that there are no operators
        │   │   └── it should revert
        │   └── given valid operators exist
        │       └── it should return the sum of all operator weights
        ├── domainSeparator
        │   └── it should return the EIP-712 domain separator
        └── calculateCertificateDigest
            └── it should return the correct digest for given timestamp and message hash
````

## File: src/test/tree/EigenPodManagerUnit.tree
````
├── EigenPodManager Tree (*** denotes that integration tests are needed to validate path)
├── when contract is deployed and initialized
│   └── it should properly set storage
├── when initialize called again
│   └── it should revert
├── when createPod called
│   ├── given the user has already created a pod
│   │   └── it should revert
│   └── given the user has not created a pod
│       └── it should deploy a pod
├── when stake is called
│   ├── given the user has not created a pod
│   │   └── it should deploy a pod
│   └── given the user has already created a pod
│       └── it should call stake on the eigenPod
├── when updateBeaconChainOracle is called
│   ├── given the user is not the owner
│   │   └── it should revert
│   └── given the user is the owner 
│       └── it should set the beacon chain oracle
├── when addShares is called
│   ├── given that the caller is not the delegationManager
│   │   └── it should revert
│   ├── given that the podOwner address is 0
│   │   └── it should revert
│   ├── given that the shares amount is negative
│   │   └── it should revert
│   ├── given that the shares is not a whole gwei amount
│   │   └── it should revert
│   └── given that all of the above conditions are satisfied
│       └── it should update the podOwnerShares
├── when removeShares is called
│   ├── given that the caller is not the delegationManager
│   │   └── it should revert
│   ├── given that the shares amount is negative
│   │   └── it should revert
│   ├── given that the shares is not a whole gwei amount
│   │   └── it should revert
│   ├── given that removing shares results in the pod owner having negative shares
│   │   └── it should revert
│   └── given that all of the above conditions are satisfied
│       └── it should update the podOwnerShares
├── when withdrawSharesAsTokens is called
│   ├── given that the podOwner is address 0
│   │   └── it should revert
│   ├── given that the destination is address 0
│   │   └── it should revert
│   ├── given that the shares amount is negative
│   │   └── it should revert
│   ├── given that the shares is not a whole gwei amount
│   │   └── it should revert
│   ├── given that the current podOwner shares are negative
│   │   ├── given that the shares to withdraw are larger in magnitude than the shares of the podOwner
│   │   │   └── it should set the podOwnerShares to 0 and decrement shares to withdraw by the share deficit
│   │   └── given that the shares to withdraw are smaller in magnitude than shares of the podOwner
│   │       └── it should increment the podOwner shares by the shares to withdraw
│   └── given that the pod owner shares are positive
│       └── it should withdraw restaked ETH from the eigenPod
├── when shares are adjusted
│   ├── given that sharesBefore is negative or 0
│   │   ├── given that sharesAfter is negative or zero
│   │   │   └── the change in delegateable shares should be 0
│   │   └── given that sharesAfter is positive
│   │       └── the change in delegateable shares should be positive
│   └── given that sharesBefore is positive
│       ├── given that sharesAfter is negative or zero
│       │   └── the change in delegateable shares is negative sharesBefore
│       └── given that sharesAfter is positive
│           └── the change in delegateable shares is the difference between sharesAfter and sharesBefore
└── when recordBeaconChainETHBalanceUpdate is called
    ├── given that the podOwner's eigenPod is not the caller
    │   └── it should revert
    ├── given that the podOwner is a zero address
    │   └── it should revert
    ├── given that sharesDelta is not a whole gwei amount
    │   ├── it should revert
    │   └── given that the shares delta is valid
    │       └── it should update the podOwnerShares
    ├── given that the change in delegateable shares is positive ***
    │   └── it should increase delegated shares on the delegationManager
    ├── given that the change in delegateable shares is negative ***
    │   └── it should decrease delegated shares on the delegationManager
    ├── given that the change in delegateable shares is 0 ***
    │   └── it should only update the podOwnerShares
    └── given that the function is reentered ***
        └── it should revert
````

## File: src/test/tree/EigenPodUnit.tree
````
.
├── EigenPod Tree (*** denotes that integration tests are needed to validate path)
├── when the contract is deployed and initialized
│   └── it should properly set storage
├── when initialize called again
│   └── it should revert
├── // EigenPodManager Caller Tree
├── when stake is called
│   ├── given the caller is not the EigenPodManager
│   │   └── it should revert
│   ├── given the value staked is not 32 ETH
│   │   └── it should revert
│   └── given that all of the above conditions are satisfied
│       └── it should stake ETH in the beacon chain deposit contract
├── when withdrawRestakedBeaconChainETH is called - function only relevant when `withdrawableRestakedExecutionLayerGwei` is incremented after a full withdrawal
│   ├── given that the caller is not the EigenPodManager
│   │   └── it should revert
│   ├── given that the amount to withdraw is not a whole Gwei amount
│   │   └── it should revert
│   ├── given that the amount to withdraw is greater than the withdrawable restaked execution layer amount
│   │   └── it should revert
│   └── given the above conditions are satisfied
│       └── it should send eth from the pod to the recipient
├── // EigenPodOwner Caller Tree
├── when verifyWithdrawalCredentials is called ***
│   ├── given that the caller is not the eigen pod Owner
│   │   └── it should revert
│   ├── given that verify credentials is paused
│   │   └── it should revert
│   ├── given that the proof is not valid for the timestamp
│   │   └── it should revert
│   ├── given that restaking is not enabled
│   │   └── it should revert
│   ├── given that the validator indices, proofs, and validator fields are different lengths
│   │   └── it should revert
│   ├── given that the withdrawal credential proof is stale
│   │   └── it should revert
│   ├── given that the beacon state root proof is invalid
│   │   └── it should revert
│   ├── it should call _verifyWithdrawalCredentials for each validator
│   └── it should record a beaconChainETH balance update in the EPM
├── when _verifyWithdrawalCredentials is called (internal function)
│   ├── given that the validators status is not INACTIVE
│   │   └── it should revert
│   ├── given that the validator is currently in the process of fully exiting
│   │   └── it should revert
│   ├── given that validator's withdrawal credentials does not correspond to the pod withdrawal credentials
│   │   └── it should revert
│   ├── given that the validator fields proof is not valid
│   │   └── it should revert
│   └── given that all the above conditions are satisfied
│       ├── it should set the validator's restaked balance to their effective balance
│       ├── it should update the _validatorPubkeyHashToInfo mapping with an active validator, restaked balance in gwei, and lastCheckpointedAt timestamp
│       ├── it should emit ValidatorRestaked and ValidatorBalanceUpdated Events
│       └── it should return the validator's restakedBalance in wei
├── when recoverTokens is called
│   ├── given that the caller is not the eigen pod owner
│   │   └── it should revert
│   ├── given that non proof withdrawals are paused
│   │   └── it should revert
│   ├── given that the tokens and amounts to withdraw are different lengths
│   │   └── it should revert
│   └── given that the above conditions pass
│       └── it should transfer tokens to the recipient
├── // Checkpointing Tree
├── when startCheckpoint is called
│   ├── given that the caller is not the eigen pod owner
│   │   └── it should revert
│   ├── given that start checkpoints is not paused
│   │   └── it should revert
│   ├── it should call _startCheckpoint
│   └── given _startCheckpoint does not revert
│       └── given hasRestaked is false
│           └── it should set hasRestaked to true and emit RestakingActivated
├── when _startCheckpoint is called
│   ├── given a current checkpoint is in progress, currentCheckpointTimestamp != 0
│   │   └── it should revert
│   ├── given the last checkpoint occurred in the same block, lastCheckpointTimestamp == block.timestamp
│   │   └── it should revert
│   ├── given revertIfNoBalance is true and the pod has no increase balance in gwei
│   │   └── it should revert
│   └── given that the above conditions pass
│       ├── it should set the currentCheckpointTimestamp to the current block timestamp
│       ├── it should set the currentCheckpoint with the parentBlockRoot at block.timestamp and with the current activeValidatorCount
│       └── it should emit CheckpointCreated
├── when verifyCheckpointProofs is called
│   ├── given that verify checkpoint proofs is paused
│   │   └── it should revert
│   ├── given there is no currently active checkpoint, currentCheckpointTimestamp == 0
│   │   └── it should revert
│   ├── given the balanceContainerProof does not match with the current checkpoint beaconBlockRoot
│   │   └── it should revert
│   ├── for each balanceProof, it should process the respective validator accordingly
│   │   ├── given the validator is not active
│   │   │   └── it should continue to next validator proof
│   │   ├── given the validator last checkpointed timestamp is >= currentCheckpointTimestamp
│   │   │   └── it should continue to next validator proof
│   │   └── given _verifyCheckpointProof does not revert
│   │       └── it should decrement proofsRemaining, add to balanceDeltasGwei, add to exitedBalancesGwei
│   └── given that all above checkpoint proofs pass
│       └── it should update checkpointBalanceExitedGwei at the checkpoint timestamp and call _updateCheckpoint
├── when _verifyCheckpointProof is called
│   ├── given verifyValidatorBalance does not match with balanceContainerRoot
│   │   └── it should revert
│   └── it should return the balanceDeltaGwei and exitedBalanceGwei if the validator did a full exit
├── when _updateCheckpoint is called
│   ├── given there are still proofs remaining for the checkpoint
│   │   └── it should update the current checkpoint
│   └── given there are 0 proofs remaining for the checkpoint
│       ├── it should update the lastCheckpointTimestamp with currentCheckpointTimestamp
│       ├── it should delete currentCheckpointTimestamp resetting it to 0
│       ├── it should delete the currentCheckpoint
│       ├── it should recordBeaconChainBalanceUpdate on the EPM with the total delta of shares in wei
│       └── it should emit CheckpointFinalized
├── when _getParentBlockRoot is called
│   ├── given the provided timestamp is out of range, HISTORY_BUFFER_LENGTH * 12seconds
│   │   └── it should revert
│   └── given the slot at the provided timestamp was skipped
│       └── it should revert
└── when verifyStaleBalance is called
    ├── given that verify stale balance is paused
    │   └── it should revert
    ├── given that the validator last checkpointed timestamp is not stale enough (2 weeks)
    │   └── it should revert
    ├── given that the validator status is not ACTIVE
    │   └── it should revert
    ├── given that the validator has not been slashed
    │   └── it should revert
    ├── given that the beacon state root proof does not match the beaconBlockRoot at the given beaconTimestamp
    │   └── it should revert
    ├── given the validator container proof does not match the beacon state root
    │   └── it should revert
    └── given that all the above conditions pass
        └── it should call _startCheckpoint with revertIfNoBalance set to false
````

## File: src/test/tree/KeyRegistrar.tree
````
.
└── KeyRegistrar (**** denotes that integration tests are needed to fully validate path)
    ├── when configureOperatorSet is called
    │   ├── given that the caller does not have permission
    │   │   └── it should revert
    │   ├── given that the curve type is NONE
    │   │   └── it should revert
    │   ├── given that the curve type is invalid (not ECDSA or BN254)
    │   │   └── it should revert
    │   ├── given that the operator set configuration already exists
    │   │   └── it should revert
    │   └── given that all parameters are valid
    │       ├── given that the curve type is ECDSA
    │       │   └── it should configure the operator set for ECDSA and emit OperatorSetConfigured
    │       └── given that the curve type is BN254
    │           └── it should configure the operator set for BN254 and emit OperatorSetConfigured
    ├── when registerKey is called
    │   ├── given that the caller does not have permission
    │   │   └── it should revert
    │   ├── given that the operator set is not configured
    │   │   └── it should revert
    │   ├── given that the key is already registered for this operator set
    │   │   └── it should revert
    │   ├── given that the operator set is configured for ECDSA
    │   │   ├── given that the key data length is not 20 bytes
    │   │   │   └── it should revert
    │   │   ├── given that the decoded address is zero
    │   │   │   └── it should revert
    │   │   ├── given that the key hash is already globally registered
    │   │   │   └── it should revert
    │   │   ├── given that the signature is invalid
    │   │   │   └── it should revert
    │   │   └── given that all validations pass
    │   │       └── it should register the ECDSA key, update global registry, and emit KeyRegistered
    │   └── given that the operator set is configured for BN254
    │       ├── given that the G1 point is zero (0,0)
    │       │   └── it should revert
    │       ├── given that the signature verification fails
    │       │   └── it should revert
    │       ├── given that the key hash is already globally registered
    │       │   └── it should revert
    │       └── given that all validations pass
    │           └── it should register the BN254 key, update global registry, and emit KeyRegistered
    ├── when deregisterKey is called
    │   ├── given that the caller does not have permission
    │   │   └── it should revert
    │   ├── given that the operator is still slashable for this operator set ****
    │   │   └── it should revert
    │   ├── given that the operator set is not configured
    │   │   └── it should revert
    │   ├── given that the key is not registered
    │   │   └── it should revert
    │   └── given that all conditions are met
    │       ├── given that the operator set uses ECDSA
    │       │   └── it should delete the key info and emit KeyDeregistered (global registry remains)
    │       └── given that the operator set uses BN254
    │           └── it should delete the key info and emit KeyDeregistered (global registry remains)
    ├── when checkKey is called
    │   ├── given that the operator set is not configured
    │   │   └── it should revert
    │   ├── given that the operator has a registered key
    │   │   └── it should return true
    │   └── given that the operator does not have a registered key
    │       └── it should return false
    ├── when isRegistered is called
    │   ├── given that the operator has a registered key for the operator set
    │   │   └── it should return true
    │   └── given that the operator does not have a registered key for the operator set
    │       └── it should return false
    ├── when getOperatorSetCurveType is called
    │   ├── given that the operator set is not configured
    │   │   └── it should return CurveType.NONE
    │   ├── given that the operator set is configured for ECDSA
    │   │   └── it should return CurveType.ECDSA
    │   └── given that the operator set is configured for BN254
    │       └── it should return CurveType.BN254
    ├── when getBN254Key is called
    │   ├── given that the operator set is not configured for BN254
    │   │   └── it should revert
    │   ├── given that the operator is not registered
    │   │   └── it should return zero G1 and G2 points
    │   └── given that the operator is registered
    │       └── it should return the decoded G1 and G2 points
    ├── when getECDSAKey is called
    │   ├── given that the operator set is not configured for ECDSA
    │   │   └── it should revert
    │   ├── given that the operator is not registered
    │   │   └── it should return empty bytes
    │   └── given that the operator is registered
    │       └── it should return the 20-byte address as bytes
    ├── when getECDSAAddress is called
    │   ├── given that the operator set is not configured for ECDSA
    │   │   └── it should revert
    │   ├── given that the operator is not registered
    │   │   └── it should return address(0)
    │   └── given that the operator is registered
    │       └── it should return the decoded address
    ├── when isKeyGloballyRegistered is called
    │   ├── given that the key hash exists in global registry
    │   │   └── it should return true
    │   └── given that the key hash does not exist in global registry
    │       └── it should return false
    ├── when getKeyHash is called
    │   ├── given that the operator is not registered
    │   │   └── it should return bytes32(0)
    │   ├── given that the operator has an ECDSA key
    │   │   └── it should return keccak256 of the key data
    │   └── given that the operator has a BN254 key
    │       └── it should return the BN254 G1 point hash
    ├── when getECDSAKeyRegistrationMessageHash is called
    │   └── it should return the EIP-712 compliant message hash for ECDSA registration
    ├── when getBN254KeyRegistrationMessageHash is called
    │   └── it should return the EIP-712 compliant message hash for BN254 registration
    └── when encodeBN254KeyData is called
        └── it should return the encoded bytes of G1 and G2 points
````

## File: src/test/tree/OperatorTableUpdaterUnit.tree
````
.
└── OperatorTableUpdater (**** denotes that integration tests are needed to fully validate path)
    ├── when initialize is called
    │   ├── given that the contract is already initialized
    │   │   └── it should revert
    │   └── given that the contract is not initialized
    │       └── it should set the owner, generator, threshold, and update operator table & emit events
    ├── when confirmGlobalTableRoot is called
    │   ├── given that the contract is paused for global root updates
    │   │   └── it should revert with CurrentlyPaused
    │   ├── given that the reference timestamp is in the future
    │   │   └── it should revert with GlobalTableRootInFuture
    │   ├── given that the reference timestamp is not greater than latest
    │   │   └── it should revert with GlobalTableRootStale
    │   ├── given that the message hash is invalid
    │   │   └── it should revert with InvalidMessageHash
    │   ├── given that the certificate is invalid
    │   │   └── it should revert with CertificateInvalid
    │   └── given that all parameters are valid
    │       └── it should update global table root, reference timestamp, block number mappings (both directions) & emit NewGlobalTableRoot event
    ├── when updateOperatorTable is called
    │   ├── given that the contract is paused for operator table updates
    │   │   └── it should revert with CurrentlyPaused
    │   ├── given that the global table root is not valid
    │   │   └── it should revert with InvalidRoot
    │   ├── given that the operatorSet is the generator
    │   │   └── it should revert with InvalidOperatorSet
    │   ├── given that the reference timestamp is not greater than operator set's latest
    │   │   └── it should revert with TableUpdateForPastTimestamp
    │   ├── given that the global table root does not match the reference timestamp
    │   │   └── it should revert with InvalidGlobalTableRoot
    │   ├── given that the merkle proof is invalid
    │   │   └── it should revert with InvalidOperatorSetProof
    │   ├── given that the curve type is invalid
    │   │   └── it should revert with InvalidCurveType
    │   ├── given that the curve type is BN254
    │   │   └── it should call bn254CertificateVerifier.updateOperatorTable with decoded info
    │   └── given that the curve type is ECDSA
    │       └── it should call ecdsaCertificateVerifier.updateOperatorTable with decoded info
    ├── when setGenerator is called
    │   ├── given that the caller is not the owner
    │   │   └── it should revert
    │   └── given that the caller is the owner
    │       └── it should update the generator & emit GeneratorUpdated event
    ├── when setGlobalRootConfirmationThreshold is called
    │   ├── given that the caller is not the owner
    │   │   └── it should revert
    │   ├── given that the threshold exceeds MAX_BPS
    │   │   └── it should revert with InvalidConfirmationThreshold
    │   └── given that the caller is owner and threshold is valid
    │       └── it should update the threshold & emit GlobalRootConfirmationThresholdUpdated event
    ├── when disableRoot is called
    │   ├── given that the caller is not the pauser
    │   │   └── it should revert
    │   ├── given that the root is invalid or doesn't exist
    │   │   └── it should revert with InvalidRoot
    │   └── given that the caller is the pauser and root is valid
    │       └── it should disable the root & emit GlobalRootDisabled event
    ├── when updateGenerator is called
    │   ├── given that the caller is not the owner
    │   │   └── it should revert
    │   └── given that the caller is the owner
    │       └── it should update the generator table
    ├── when isRootValid(bytes32) is called
    │   └── it should return the validity status of the given global table root
    ├── when isRootValidByTimestamp(uint32) is called
    │   └── it should return the validity status of the global table root at the given reference timestamp
    ├── when getGlobalTableRootByTimestamp is called
    │   └── it should return the global table root for the given timestamp
    ├── when getCurrentGlobalTableRoot is called
    │   └── it should return the global table root for the latest reference timestamp
    ├── when getGenerator is called
    │   └── it should return the current generator
    ├── when getCertificateVerifier is called
    │   ├── given that the curve type is BN254
    │   │   └── it should return the bn254CertificateVerifier address
    │   ├── given that the curve type is ECDSA
    │   │   └── it should return the ecdsaCertificateVerifier address
    │   └── given that the curve type is invalid
    │       └── it should revert with InvalidCurveType
    ├── when getLatestReferenceTimestamp is called
    │   └── it should return the latest reference timestamp
    ├── when getLatestReferenceBlockNumber is called
    │   └── it should return the reference block number for the latest reference timestamp
    ├── when getReferenceBlockNumberByTimestamp is called
    │   └── it should return the reference block number for the given timestamp
    ├── when getReferenceTimestampByBlockNumber is called
    │   └── it should return the reference timestamp for the given block number
    ├── when getGlobalTableUpdateMessageHash is called
    │   └── it should return the keccak256 hash of encoded typehash, root, timestamp, and block number
    └── when getGeneratorReferenceTimestamp is called
        └── it should return the latest reference timestamp for the generator
````

## File: src/test/tree/PermissionControllerUnit.tree
````
.
└── PermissionController (**** denotes that integration tests are needed to fully validate path)
    ├── when setAdmin is called
    │   ├── given that the current admin it not set
    │   │   └── given that the caller is not the account
    │   │       └── it should revert
    │   ├── given that the current admin is set
    │   │   └── given that the msg.sender is not the current admin
    │   │       └── it should revert
    │   ├── given that the new admin is the zero address
    │   │   └── it should revert
    │   └── given that a valid caller sets a valid admin
    │       └── it should update the permissions of the account & emit an AdminSet event
    ├── when setAppointee is called
    │   ├── given that the caller is not the admin
    │   │   └── it should revert
    │   ├── given that the appointee already has permissions
    │   │   └── it should revert
    │   └── given that proper permissions are set
    │       └── it should emit a DelegateSet event, and update the `appointeePermissions` and `permissionAppointee` mappings for the account
    └── when removeAppointee is called
        ├── given that the caller is not the admin
        │   └── it should revert
        ├── given that the appointee does not have permissions
        │   └── it should revert
        └── given that proper permissions are set
            └── it should emit a DelegateRemoved event, and update the `appointeePermissions` and `permissionAppointee` mappings for the account
````

## File: src/test/tree/StrategyManagerUnit.tree
````
├── StrategyManagerUnit.t.sol (*** denotes that integration tests are needed to validate path)
├── initialize
|   ├── given that initialized is only called once
│   │   └── it should set the storage variables correctly (owner, strategyWhitelister, pauserRegistry)
│   └── given that initialize is called again
│       └── it should revert
├── depositIntoStrategy()
│   ├── given that deposits paused
│   │   └── it should revert
│   ├── given the function is re-entered
│   │   └── it should revert
│   ├── given that the strategy is not whitelisted
│   │   └── it should revert
│   ├── given the token safeTransferFrom() reverts
│   │   └── it should revert
│   └── given that token safeTransferFrom() succeeds
│       ├── given the staker has existing shares in strategy (not first deposit)
│       │   └── it should increase shares, nonce. while stakerStrategyListLength is unchanged
│       ├── given the staker has no existing shares in strategy (first deposit)
│       │   └── stakerStrategyListLength increases by 1 and shares increase
│       ├── given the staker has delegated to a operator ***
│       │   └── it should deposit successfully with shares increase, including delegated shares
│       └── given the staker is not delegated
│           └── it should deposit successfully with shares increase
├── depositIntoStrategyWithSignature()
│   ├── given that deposits paused
│   │   └── it should revert
│   ├── given the function is re-entered
│   │   └── it should revert
│   ├── given the signature expired
│   │   └── it should revert
│   ├── given that deposits paused and strategy not whitelisted
│   │   └── it should revert
│   ├── given the staker is a EOA
│   │   ├── given the signature verification fails
│   │   │   └── it should revert
│   │   └── given the signature verification succeeds
│   │       ├── given the token safeTransferFrom reverts
│   │       │   └── it should revert
│   │       └── given the token safeTransferFrom succeeds
│   │           ├── given that the staker has delegated to a operator ***
│   │           │   └── it should deposit successfully with shares and nonce increase, including delegated shares
│   │           └── given that the staker is not delegated
│   │               └── it should deposit successfully with shares and nonce increase
│   └── given the staker is a contract
│       ├── given the contract isn't EIP1271 compliant
│       │   └── it should revert
│       ├── given the signature verification fails, isValidSignature() return != EIP1271_MAGICVALUE
│       │   └── it should revert
│       └── given the signature verification succeeds, isValidSignature() returns EIP1271_MAGICVALUE
│           ├── given the token safeTransferFrom reverts
│           │   └── it should revert
│           └── given the token safeTransferFrom succeeds
│               ├── given the staker has delegated to a operator ***
│               │   └── it should deposit successfully with shares and nonce increase, including delegated shares
│               └── given the staker is not delegated
│                   └── it should deposit successfully with shares and nonce increase
├── removeShares()
│   ├── given not called by DelegationManager
│   │   └── it should revert
│   ├── given the share amount is 0
│   │   └── it should revert
│   ├── given the share amount is too high, higher than deposited amount
│   │   └── it should revert
│   ├── given the share amount is equal to the deposited amount
│   │   └── staker shares should be 0 with decremented stakerStrategyListLength
│   └── given the share amount is less than the deposited amount
│       └── staker shares should now be deposited - shares amount, unchanged stakerStrategyListLength
├── addShares()
│   ├── given not called by DelegationManager
│   │   └── it should revert
│   ├── given the share amount is 0
│   │   └── it should revert
│   ├── given the staker is 0 address
│   │   └── it should revert
│   ├── given adding shares with 0 existing shares
│   │   └── it should increase shares and increment stakerStrategyListLength
│   ├── given adding shares with 0 existing shares and staker has MAX_STAKER_STRATEGY_LIST_LENGTH 
│   │   └── it should revert
│   └── given the adding shares with > 0 existing shares
│       └── it should increase shares, unchanged stakerStrategyListLength
├── withdrawSharesAsTokens()
│   ├── given not called by DelegationManager
│   │   └── it should revert
│   └── given that deposited strategy is called
│   │   └── it should withdraw tokens from strategy with token balanceOf() update
├── setStrategyWhitelister()
│   ├── given not called by owner
│   │   └── it should revert
│   └── given called by owner address
│       └── it should update strategyWhitelister address
├── addStrategiesToDepositWhitelist()
│   ├── given not called by strategyWhitelister address
│   │   └── it should revert
│   └── given the strategyWhitelister address is called
│       ├── given adding one single strategy that is already whitelisted
│       │   └── it should not emit StrategyAddedToDepositWhitelist with mapping still true
│       ├── given adding one single strategy
│       │   └── it should whitelist the new strategy with mapping set to true
│       └── given adding multiple strategies to whitelist
│           └── it should whitelist all new strategies with mappings set to true
└── removeStrategiesFromDepositWhitelist()
    ├── given not called by strategyWhitelister address
    │   └── it should revert
    └── given called by strategyWhitelister address
        ├── given removing one single strategy that is not whitelisted
        │   └── it shouldn't emit StrategyRemovedFromDepositWhitelist with mapping still false
        ├── given removing one single strategy
        │   └── it should de-whitelist the new strategy with mapping set to false
        └── given removing multiple strategies to whitelist
            └── it should de-whitelist all specified strategies with mappings set to false
````

## File: src/test/unit/libraries/BytesLibUnit.t.sol
````
// SPDX-License-Identifier: BUSL-1.1
⋮----
import "forge-std/Test.sol";
import "src/test/utils/BytesLib.sol";
⋮----
contract BytesLibHarness {
function concat(bytes memory a, bytes memory b) public pure returns (bytes memory) {
⋮----
function slice(bytes memory data, uint start, uint length) public pure returns (bytes memory) {
⋮----
function toAddress(bytes memory data, uint offset) public pure returns (address) {
⋮----
function toUint256(bytes memory data, uint offset) public pure returns (uint) {
⋮----
function toUint128(bytes memory data, uint offset) public pure returns (uint128) {
⋮----
function toUint96(bytes memory data, uint offset) public pure returns (uint96) {
⋮----
function toUint64(bytes memory data, uint offset) public pure returns (uint64) {
⋮----
function toUint32(bytes memory data, uint offset) public pure returns (uint32) {
⋮----
function toUint16(bytes memory data, uint offset) public pure returns (uint16) {
⋮----
function toUint8(bytes memory data, uint offset) public pure returns (uint8) {
⋮----
function equal(bytes memory a, bytes memory b) public pure returns (bool) {
⋮----
contract BytesLibUnitTests is Test {
⋮----
function setUp() public {
⋮----
function test_Concat_Basic() public view {
⋮----
function test_Concat_EmptyInputs() public view {
⋮----
function test_Slice_Basic() public view {
⋮----
function test_Revert_SliceOutOfBounds() public {
⋮----
// Test start beyond length
⋮----
// Test length beyond data bounds
⋮----
// Test start + length beyond bounds
⋮----
function test_ToAddress() public view {
⋮----
function test_ToUint() public view {
⋮----
function test_Equal() public view {
⋮----
function test_Revert_ToTypesOutOfBounds() public {
````

## File: src/test/unit/libraries/SlashingLibUnit.t.sol
````
// SPDX-License-Identifier: BUSL-1.1
⋮----
import "forge-std/Test.sol";
import "src/contracts/libraries/SlashingLib.sol";
⋮----
contract SlashingLibHarness {
⋮----
function unsafeUpdate(uint scalingFactor) public {
⋮----
function update(uint prevDepositShares, uint addedShares, uint slashingFactor) public {
⋮----
contract SlashingLibUnitTests is Test {
/// @dev We use a harness so that `vm.expectRevert()` can be used.
⋮----
function setUp() public {
⋮----
function test_Revert_InvalidDepositScalingFactor() public {
````

## File: src/test/unit/libraries/SnapshotsUnit.t.sol
````
// SPDX-License-Identifier: BUSL-1.1
⋮----
import "forge-std/Test.sol";
import "src/contracts/libraries/Snapshots.sol";
⋮----
contract SnapshotsHarness {
⋮----
function pushWad(uint32 key, uint64 value) public {
⋮----
function upperLookupWad(uint32 key) public view returns (uint64) {
⋮----
function latestWad() public view returns (uint64) {
⋮----
function lengthWad() public view returns (uint) {
⋮----
function pushZero(uint32 key, uint value) public {
⋮----
function upperLookupZero(uint32 key) public view returns (uint) {
⋮----
function latestZero() public view returns (uint) {
⋮----
function lengthZero() public view returns (uint) {
⋮----
contract SnapshotsUnitTests is Test {
⋮----
function setUp() public {
⋮----
/// forge-config: default.allow_internal_expect_revert = true
function test_Revert_InvalidSnapshotOrdering(uint r) public {
⋮----
function test_Push_Correctness(uint r) public {
⋮----
function test_UpperLookup_InitiallyWad(uint32 r) public view {
⋮----
function test_Latest_InitiallyWad() public view {
⋮----
function test_Length_InitiallyZero() public view {
⋮----
function test_Revert_InvalidSnapshotOrdering_ZeroHistory(uint r) public {
⋮----
function test_Push_Correctness_ZeroHistory(uint r) public {
⋮----
function test_UpperLookup_InitiallyZero(uint32 r) public view {
⋮----
function test_Latest_InitiallyZero() public view {
⋮----
function test_Length_InitiallyZero_ZeroHistory() public view {
````

## File: src/test/unit/mixins/SemVerMixin.t.sol
````
// SPDX-License-Identifier: BUSL-1.1
⋮----
import {Test} from "forge-std/Test.sol";
import {SemVerMixin} from "src/contracts/mixins/SemVerMixin.sol";
⋮----
// Helper contract to test the abstract SemVerMixin
contract SemVerMixinMock is SemVerMixin {
⋮----
// Expose internal function for testing
function majorVersion() public view returns (string memory) {
⋮----
contract SemVerMixinTest is Test {
⋮----
function test_version_returnsCorrectVersion() public {
⋮----
function test_majorVersion_returnsCorrectMajorVersion() public {
````

## File: src/test/unit/mixins/SignatureUtilsUnit.t.sol
````
// SPDX-License-Identifier: BUSL-1.1
⋮----
import "forge-std/Test.sol";
import "src/contracts/mixins/SignatureUtilsMixin.sol";
⋮----
contract MockSigner {
⋮----
function setValidSignature(bytes32 digest, bytes memory signature, bool valid) public {
⋮----
function isValidSignatureNow(bytes32 digest, bytes memory signature) public view returns (bool) {
⋮----
contract SignatureUtilsMixinUnit is Test, SignatureUtilsMixin("9.9.9") {
⋮----
function setUp() public {
⋮----
function test_domainSeparator_NonZero() public view {
⋮----
function test_domainSeparator_NewChainId() public {
⋮----
// Change the chain ID
⋮----
/// forge-config: default.allow_internal_expect_revert = true
function test_checkIsValidSignatureNow_Expired() public {
⋮----
// function testFail_checkIsValidSignatureNow_InvalidSignature() public {
//     _checkIsValidSignatureNow(signer, digest, "", block.timestamp);
// }
````

## File: src/test/unit/AllocationManagerUnit.t.sol
````
// SPDX-License-Identifier: BUSL-1.1
⋮----
import "src/test/harnesses/AllocationManagerHarness.sol";
import "src/contracts/core/AllocationManagerView.sol";
import "src/test/utils/EigenLayerUnitTestSetup.sol";
import "src/test/mocks/MockAVSRegistrar.sol";
⋮----
contract AllocationManagerUnitTests is EigenLayerUnitTestSetup, IAllocationManagerErrors, IAllocationManagerEvents {
⋮----
/// -----------------------------------------------------------------------
/// Constants
⋮----
/// NOTE: Raising these values directly increases cpu time for tests.
⋮----
/// Mocks
⋮----
/// Defaults
⋮----
/// Internal Storage Helpers
⋮----
/// Setup
⋮----
function setUp() public virtual override {
⋮----
/// Internal Helpers
⋮----
function _initializeAllocationManager(IPauserRegistry _pauserRegistry, uint _initialPausedStatus)
⋮----
function _registerOperator(address operator) internal {
⋮----
function _setAllocationDelay(address operator, uint32 delay) internal {
⋮----
function _createOperatorSet(OperatorSet memory operatorSet, IStrategy[] memory strategies) internal returns (OperatorSet memory) {
⋮----
function _createOperatorSets(OperatorSet[] memory operatorSets, IStrategy[] memory strategies) internal {
⋮----
function _createRedistributingOperatorSet(
⋮----
function _createRedistributingOperatorSets(
⋮----
function _registerForOperatorSet(address operator, OperatorSet memory operatorSet) internal {
⋮----
function _grantDelegatedStake(address operator, OperatorSet memory operatorSet, uint stake) internal {
⋮----
function _registerForOperatorSets(address operator, OperatorSet[] memory operatorSets) internal {
⋮----
/// Get expected post slash storage values
/// Assumes that:
/// 1. WAD is max before slash
/// 2. encumbered is equal to magnitude before slash
function _getExpectedSlashVals(uint wadToSlash, uint64 magBeforeSlash)
⋮----
function _getExpectedSlashVals(uint wadToSlash, uint64 magBeforeSlash, uint64 encumberedMagBeforeSlash)
⋮----
// Get slippage to apply to returned values - we basically recreate mulWadRoundUp here
⋮----
// Get the magnitude to slash - this value is rounded UP in the implementation
⋮----
/// @dev Returns 0 or 1, depending on the remainder of the division
function _calculateSlippage(uint64 magnitude, uint wadToSlash) internal pure returns (uint64) {
⋮----
function _checkAllocationStorage(
⋮----
// Check `getMaxMagnitudes` alias for coverage.
⋮----
// Check `getAllocations` alias for coverage.
⋮----
/// @dev Check that the deallocation queue is in ascending order of effectBlocks
function _checkDeallocationQueueOrder(address operator, IStrategy strategy, uint numDeallocations) internal view {
⋮----
function _checkSlashableStake(
⋮----
function _checkAllocationEvents(
⋮----
function _checkDeallocationEvent(
⋮----
function _checkClearDeallocationQueueEvents(address operator, IStrategy strategy, uint64 encumberedMagnitude) internal {
⋮----
function _checkSlashEvents(
⋮----
// If there is nothing slashed, we don't emit events for encumbered magnitude
⋮----
/// Allocate/deallocate params
⋮----
/// @dev Create allocate params, allocating `magnitude` to each strategy in the set
function _newAllocateParams(OperatorSet memory operatorSet, uint64 magnitude) internal view returns (AllocateParams[] memory) {
⋮----
/// @dev Create allocate params for multiple operator sets
function _newAllocateParams(OperatorSet[] memory operatorSets, uint64 magnitude) internal view returns (AllocateParams[] memory) {
⋮----
/// @dev Create random allocation params to the default operator set and strategy
function _randAllocateParams_DefaultOpSet() internal returns (AllocateParams[] memory) {
⋮----
/// @dev Create allocate params for random magnitudes to the same default strategy across multiple operator sets
function _randAllocateParams_SingleMockStrategy(OperatorSet[] memory operatorSets) internal returns (AllocateParams[] memory) {
// Give each set a minimum of 1 magnitude
⋮----
// Distribute remaining magnitude
⋮----
/// NOTE: this variant allocates ALL magnitude (1 WAD)
function _randAllocateParams_SingleMockStrategy_AllocAll(OperatorSet[] memory operatorSets) internal returns (AllocateParams[] memory) {
⋮----
// If there's any left, dump it on a random set
⋮----
/// @dev Create allocate/deallocate params to the same default strategy across multiple sets
function _randAllocAndDeallocParams_SingleMockStrategy(OperatorSet[] memory operatorSets)
⋮----
// Generate a random deallocation for each operator set
⋮----
/// Utils
⋮----
function _maxNumToClear() internal pure returns (uint16[] memory) {
⋮----
function _defaultAllocEffectBlock() internal view returns (uint32) {
⋮----
contract AllocationManagerUnitTests_Initialization_Setters is AllocationManagerUnitTests {
⋮----
/// initialize()
⋮----
/// @dev Asserts the following:
/// 1. The fn can only be called once, during deployment.
/// 2. The fn initializes the contract state correctly (owner, pauserRegistry, and initialPausedStatus).
function testFuzz_Initialize(Randomness r) public rand(r) {
// Generate random values for the expected initial state of the contract.
⋮----
// Deploy the contract with the expected initial state.
⋮----
// Assert that the contract can only be initialized once.
⋮----
// Assert immutable state
⋮----
// Assert initialization state
// assertEq(alm.owner(), expectedInitialOwner);
⋮----
contract AllocationManagerUnitTests_SlashOperator is AllocationManagerUnitTests {
⋮----
/// slashOperator()
⋮----
function _randSlashingParams(address operator, uint32 operatorSetId) internal returns (SlashingParams memory) {
⋮----
function test_revert_paused() public {
⋮----
function test_revert_slashZero() public {
⋮----
function test_revert_slashGreaterThanWAD() public {
⋮----
function test_revert_NotRegisteredToSet() public {
⋮----
function test_revert_NotMemberOfSet() public {
⋮----
function test_revert_InputArrayLengthMismatch() public {
⋮----
function test_revert_StrategiesMustBeInAscendingOrder() public {
⋮----
function test_revert_StrategyNotInOperatorSet() public {
⋮----
/// Attempts to slash an operator before the allocation is active
/// Validates:
/// 1. The events of the slash indicate nothing was slashed
/// 2. Storage is not mutated post slash
/// 3. The operator's allocation takes effect as normal post slash
function test_operatorAllocated_notActive() public {
⋮----
// The only slash event we expect is the OperatorSlashed. Validate the number
⋮----
// Assert only 1 log was emitted
⋮----
// Assert encumberedMagnitude and maxMagnitude are unchanged
⋮----
// Roll to effect block and validate allocation
⋮----
/// Allocates all magnitude to for a single strategy to an operatorSet. Slashes 25%
⋮----
/// 1. Events are emitted
/// 2. Allocation & info introspection
/// 3. Slashable stake introspection
function test_slashPostAllocation() public {
// Generate allocation for this operator set, we allocate max
⋮----
// Slash operator for 25%
⋮----
// Check storage
⋮----
/// @notice Same test as above, but fuzzes the allocation
function testFuzz_slashPostAllocation(Randomness r) public rand(r) {
⋮----
// Allocate magnitude and roll forward to completable block
⋮----
// Slash Operator
⋮----
uint slashedStake = DEFAULT_OPERATOR_SHARES.mulWad(expectedWadSlashed); // Wad is same as slashed mag since we start with max mag
⋮----
/// Allocates half of magnitude for a single strategy to an operatorSet. Then allocates again. Slashes 50%
/// Asserts that:
⋮----
/// 2. Encumbered mag is updated
/// 3. Max mag is updated
/// 4. Calculations for `getAllocatableMagnitude` and `getAllocation` are correct
/// 5. The second allocation is not slashed from
function testFuzz_slash_oneCompletedAlloc_onePendingAlloc(Randomness r) public rand(r) {
⋮----
// Generate allocation for `strategyMock`, we allocate half
⋮----
// Allocate the other half
⋮----
// Slash operator for 50%
⋮----
// Slashable stake should include first allocation and slashed magnitude
⋮----
/// Allocates 100% magnitude for a single strategy to an operatorSet.
/// First slashes 99% from the operatorSet, slashes 99.99% a second time, and on the third slash, slashes
/// 99.9999999999999% which should get rounded up to 100% or WAD wadSlashed leaving the operator with no magnitude
/// in the operatorSet, 0 encumbered magnitude, and 0 max magnitude.
///
⋮----
/// 2. Storage properly updated after each slash
/// 3. Slashed amounts are rounded up to ensure magnitude is always slashed
/// 4. SlashCount increments
function test_repeatUntilFullSlash() public {
// Generate allocation for `strategyMock`, we allocate 100% to opSet 0
⋮----
// 1. Slash operator for 99% in opSet 0 bringing their magnitude to 1e16
⋮----
uint64 expectedEncumberedMagnitude = 1e16; // After slashing 99%, only 1% expected encumberedMagnitude
⋮----
uint64 maxMagnitudeAfterSlash = 1e16; // 1e15 is maxMagnitude
⋮----
// 2. Slash operator again for 99.99% in opSet 0 bringing their magnitude to 1e14
⋮----
expectedEncumberedMagnitude = 1e12; // After slashing 99.99%, only 0.01% expected encumberedMagnitude
⋮----
// 3. Slash operator again for 99.9999999999999% in opSet 0
⋮----
// Should technically be 1e3 remaining but with rounding error and rounding up slashed amounts
// the remaining magnitude is 0
expectedEncumberedMagnitude = 0; // Should technically be 1e3 remaining but with rounding error and rounding up slashed amounts.
⋮----
// Check slashable amount after final slash
⋮----
/// Allocates all of magnitude to a single strategy to an operatorSet. Deallocate half. Finally, slash while deallocation is pending
⋮----
/// 1. Events are emitted, including for deallocation
⋮----
/// 5. The deallocation is slashed from
/// 6. Pending magnitude updates post deallocation are valid
function testFuzz_SlashWhileDeallocationPending(Randomness r) public rand(r) {
// Initialize state
⋮----
// Allocate
⋮----
// Deallocate
⋮----
// Manually check slash events since we have a deallocation pending
// Deallocation update is emitted first
⋮----
allocatable: uint128(-expectedPendingDiff) // This works because we allocated all in the randomization allocation helper
⋮----
/// Allocates all magnitude to a single opSet. Then slashes the entire magnitude
⋮----
/// 1. Storage post slash
/// 2. The operator cannot allocate again
function testRevert_allocateAfterSlashedEntirely() public {
// Allocate all magnitude
⋮----
// Slash operator for 100%
⋮----
// Validate storage post slash
⋮----
// Attempt to allocate
⋮----
/// Allocates all magnitude to a single opSet. Deallocates magnitude. Slashes all
⋮----
/// 1. The Allocation is 0 after slash
/// 2. Them storage post slash for encumbered and maxMags is zero
function test_slash_allocateAll_deallocateAll() public {
⋮----
// Deallocate all
⋮----
// Validate event for the deallocation
⋮----
// forgefmt: disable-next-item
⋮----
// Complete deallocation
⋮----
// Validate allocatable amount is 0
⋮----
/// Slashes the operator after deallocation, even if the deallocation has not been cleared.
/// Validates that:
/// 1. Even if we do not clear deallocation queue, the deallocation is NOT slashed from since we're passed the deallocationEffectBlock
/// 2. Validates storage post slash & post clearing deallocation queue
/// 3. Max magnitude only decreased proportionally by the magnitude set after deallocation
function test_allocate_deallocate_slashAfterDeallocation() public {
⋮----
// Deallocate half
⋮----
// Warp to deallocation effect block
⋮----
uint64 expectedEncumberedMagnitude = 375e15; // 25e16 is slashed. 5e17 was previously
⋮----
uint64 maxMagnitudeAfterSlash = 875e15; // Operator can only allocate up to 75e16 magnitude since 25% is slashed
⋮----
// Slash Operator, only emit events assuming that there is no deallocation
⋮----
/// Allocates to multiple operatorSets for a strategy. Only slashes from one operatorSet.
⋮----
/// 1. The first operatorSet has less slashable shares post slash
/// 2. The second operatorSet has the same number slashable shares post slash (within slippage)
/// 3. The PROPORTION that is slashable for opSet 2 has increased
function testFuzz_allocateMultipleOpsets_slashSingleOpset(Randomness r) public rand(r) {
// Get magnitude to allocate
⋮----
// Allocate 40% to firstOperatorSet, 40% to secondOperatorSet
⋮----
// Register operator for both operatorSets
⋮----
// Modify allocations
⋮----
// Get slashable shares for each operatorSet
⋮----
// Slash operator on operatorSet1 for 50%
⋮----
// Validate storage operatorSet1
⋮----
// Validate storage for operatorSet2
⋮----
// Check proportion after slash
⋮----
magnitudeToAllocate, // This is the same as proportion before slash
⋮----
// Assert that slashable stake is the same - we add slippage here due to rounding error from the slash itself
⋮----
/// Allocates to multiple strategies for the given operatorSetKey. Slashes from both strategies Validates a slash propagates to both strategies.
/// Validates that
/// 1. Proper events are emitted for each strategy slashed
/// 2. Each strategy is slashed proportional to its allocation
/// 3. Storage is updated for each strategy, opSet
function testFuzz_allocateMultipleStrategies_slashMultiple(Randomness r) public rand(r) {
// Initialize random params
⋮----
// Crate and allocate to operatorSets
⋮----
// Store post-slash vars to check against
⋮----
/// @dev Allocates magnitude. Deallocates some. Slashes a portion, and then allocates up to the max available magnitude
function testFuzz_allocate_deallocate_allocateMax(Randomness r) public rand(r) {
⋮----
// Allocate some magnitude, then deallocate some.
⋮----
// Slash operator for some random amount (1% -> 99%).
⋮----
// Clear deallocation queue.
⋮----
// Allocate up to max magnitude
⋮----
/// Allocates magnitude to an operator, deallocates all, warps to deallocation effect block and attempts to slash
/// Asserts that the operator is not slashed
function test_noFundsSlashedAfterDeallocationDelay() public {
⋮----
// Slash operator for all wad
⋮----
// Assert that the operator's max magnitude and allocatable magnitude are still WAD
⋮----
function testRevert_noFundsSlashedAfterDeregistration() public {
⋮----
// Deregister operator
⋮----
function test_deallocationSlashedJustBeforeEffectBlock() public {
⋮----
// Warp to just before deallocation effect block
⋮----
// Assert that the operator has no max magnitude or allocatable magnitude
⋮----
function test_deregisteredOperatorSlashableBeforeDelay() public {
⋮----
// Roll to the slashableUntil at block
⋮----
/// @notice Tests that an AVS can update the slasher, and it can slash once the slasher is active
function test_slash_updateSlasher_slashAgain() public {
⋮----
// Slash the operator for half
⋮----
// Update the slasher
⋮----
// Warp to just before the effect block of the slasher - fail to slash
⋮----
// Warp to the effect block of the slasher
⋮----
// Slash the operator again for half
⋮----
// Sanity checks
⋮----
contract AllocationManagerUnitTests_ModifyAllocations is AllocationManagerUnitTests {
⋮----
/// @dev Thrown when the caller is not allowed to call a function on behalf of an account.
⋮----
function test_revert_InvalidCaller() public {
⋮----
function test_revert_allocationDelayNotSet() public {
⋮----
function test_revert_allocationDelayNotInEffect() public {
⋮----
// even though the operator has an allocation delay set, it is not in effect
// and modifyAllocations should still be blocked
⋮----
function test_revert_lengthMismatch() public {
⋮----
function test_revert_invalidOperatorSet() public {
⋮----
function test_revert_multiAlloc_modificationAlreadyPending_diffTx() public {
// Allocate magnitude
⋮----
// Warp to just before allocation complete block
⋮----
// Attempt to allocate magnitude again
⋮----
function test_revert_multiAlloc_modificationAlreadyPending_sameTx() public {
⋮----
/// @notice Regression tests for the bugfix where pending modifications were checked by
/// require(allocation.pendingDiff == 0, ModificationAlreadyPending());
/// which would overwrite the effectBlock, pendingDiff if a pendingDiff
/// of a deallocation was slashed to become 0.
⋮----
/// This test checks that the effectBlock, pendingDiff are not overwritten even if the pendingDiff is 0
/// when attempting to modify allocations again
function test_modifyAllocations_PendingDiffZero() public {
// Step 1: Allocate to the operator set
⋮----
// Step 2: Roll blocks forward until the allocation effectBlock
⋮----
// Step 3: Deallocate from the operator set
⋮----
// Step 4: Slash the operator to adjust pendingDiff to 0, slashing rounds up the amount of magnitude to slash
// so with an existing deallocation/pendingDiff of 1, it should result in a pendingDiff of 0
⋮----
// Step 5: Modify allocations again (Should not be called)
⋮----
// Assert that the allocation was modified without reverting
⋮----
// Note: These 2 assertions fail prior to the bugfix and if we kept the same
// require(allocation.pendingDiff == 0, ModificationAlreadyPending());
// in the code. The effectBlock, pendingDiff would get overwritten with the new modification
// but the deallocationQueue would now be unordered(in terms of effectBlocks) with this overwrite.
⋮----
/// This test checks that the deallocationQueue is ascending ordered by effectBlocks
function test_modifyAllocations_PendingDiffZero_CheckOrderedDeallocationQueue() public {
// Step 1: Register the operator to multiple operator sets
⋮----
// Step 2: Allocate to both operator sets
⋮----
// Step 3: Roll blocks forward until the allocation effectBlock
⋮----
// Step 4: Deallocate from both operator sets
⋮----
// roll blocks forward so that deallocations have different effectBlocks
⋮----
// Step 5: Slash the first deallocation to adjust pendingDiff to 0
⋮----
// Step 6: Modify allocations again for operatorSet1 making another deallocation and
// overwriting/increasing the effectBlock
⋮----
// Note: this should revert but previously it would not prior to the bugfix
⋮----
// Assert that the deallocationQueue is unordered for the 2 deallocations in queue
⋮----
/// In this case the new modifyAllocations call is an allocation
/// where the effectBlock is increased and the deallocationQueue is unordered as well because the operator
/// allocationDelay configured to be long enough.
function test_modifyAllocations_PendingDiffZero_Allocation() public {
⋮----
// Step 3: Update operator allocation delay
⋮----
// Step 6: Modify allocations again for operatorSet1 making an allocation and
⋮----
function test_revert_allocateZeroMagnitude() public {
// Allocate exact same magnitude as initial allocation (0)
⋮----
function test_revert_allocateSameMagnitude() public {
// Allocate nonzero magnitude
⋮----
// Warp to allocation complete block
⋮----
// Attempt to allocate no magnitude (i.e. same magnitude)
⋮----
function testFuzz_revert_insufficientAllocatableMagnitude(Randomness r) public rand(r) {
// Allocate some magnitude
⋮----
// Attempt to allocate more magnitude than the operator has
// uint64 allocatedMag = allocateParams[0].newMagnitudes[0];
⋮----
function test_revert_allocateDeallocate_modificationPending() public {
⋮----
function test_revert_deallocateTwice_modificationPending() public {
⋮----
// Warp past allocation complete timestsamp
⋮----
// Deallocate again -> expect revert
⋮----
function test_revert_safeCastOverflow() public {
// setup additional operatorSets for tests
⋮----
// 1. Allocate all available magnitude for the strategy (WAD)
⋮----
// 2. allocate to another operatorSet for the same strategy to reset encumberedMagnitude back to 0
⋮----
// 3. after resetting encumberedMagnitude, attempt to allocate to opSet2 with WAD
⋮----
// 4. after resetting encumberedMagnitude, attempt to allocate to opSet2 with 1
⋮----
/// @notice Tests edge cases around allocation delay:
/// 1. Set allocation delay to a value greater than ALLOCATION_CONFIGURATION_DELAY
/// 2. Allocate magnitude before the configured delay is hit
/// 3. Set allocation delay to a value less than ALLOCATION_CONFIGURATION_DELAY
/// 4. Allocate magnitude after allocation in step 2 takes effect, but before the new delay is hit
/// Validates that you should be able to allocate in step 4 since there is no other pending modifications
function testFuzz_ShouldBeAbleToAllocateSoonerThanLastDelay(Randomness r) public rand(r) {
⋮----
// Validate storage - the `firstDelay` should not be applied yet
⋮----
/// @notice Allocates a random magnitude to the default operatorSet.
⋮----
/// 1. Storage is clear prior to allocation
/// 2. Events are emitted
/// 3. Allocation storage/introspection after allocation
/// 4. Allocation storage/introspection after roll to allocation effect block
function testFuzz_allocate_singleStrat_singleOperatorSet(Randomness r) public rand(r) {
// Create allocation
⋮----
// Save vars to check against
⋮----
// Check that the operator has no allocated sets/strats before allocation
⋮----
// Check storage Prior to Completion
⋮----
// 1. Validate allocated sets and strategies
⋮----
// 2. Validate allocation + info
⋮----
// 3. Check allocation and info after roll to completion
⋮----
/// @notice Allocates magnitude for a single strategy to multiple operatorSets
⋮----
/// 1. Events
/// 2. Allocation storage/introspection after allocation
/// 3. Allocation storage/introspection after roll to allocation effect block
function testFuzz_allocate_singleStrat_multipleSets(Randomness r) public rand(r) {
⋮----
// Create and register for operator sets, each with a single default strategy
⋮----
// Validate events
⋮----
// There is only one strategy in each allocateParams, so we don't need a nested for loop
⋮----
// 1. Sanity check number of allocated sets
⋮----
// 2. Check storage after allocation
⋮----
// 3. Check storage after roll to completion
⋮----
/// @notice Allocates once, warps to allocation effect block, then allocates again
⋮----
/// 1. Events for each allocation
/// 2. Allocation storage/introspection immediately after each allocation
function testFuzz_allocateMultipleTimes(Randomness r) public rand(r) {
⋮----
// Allocate magnitude again
⋮----
/// Allocates maximum magnitude to multiple strategies for the same operatorSet
/// Validates that encumbered magnitude is max for each strategy
function testFuzz_allocateMaxToMultipleStrategies(Randomness r) public rand(r) {
⋮----
/// Allocates to `firstMod` magnitude and then deallocate to `secondMod` magnitude
⋮----
/// 1. Events are valid for the allocation and deallocation
/// 2. Storage after the allocation is made
/// 3. Storage after the deallocation is made
/// 4. Storage after the deallocation effect block is hit
/// 5. Storage after the deallocation queue is cleared (specifically encumbered mag is decreased)
function testFuzz_allocate_deallocate_whenRegistered(Randomness r) public rand(r) {
// Bound allocation and deallocation
⋮----
// Allocate magnitude to default registered set
⋮----
// Check storage after dealloc
⋮----
// Check storage after roll to completion
⋮----
// Check storage after clearing deallocation queue
⋮----
/// Allocates to an operatorSet, then fully deallocates after the strategy is removed from the set.
/// Validates that the deallocation takes effect immediately after the strategy is removed
function test_allocate_removeStrategyFromSet_fullyDeallocate() public {
⋮----
// Remove strategy from operatorSet
⋮----
// Deallocate All Instantly
⋮----
// We check the allocation event and not the deallocation event since the encumbered mag is updated too!
⋮----
/// Allocates to an operatorSet, deallocates, then removes a strategy from the operatorSet
⋮----
/// 1. The deallocation still completes at its expected time
function testFuzz_allocate_deallocate_removeStrategyFromSet(Randomness r) public {
⋮----
// Roll to just before deallocation complete block & clear deallocation queue for sanity
⋮----
// Roll to deallocation complete block
⋮----
// Note that the encumbered mag hasn't been updated since we haven't cleared the deallocaction queue!
⋮----
/// Allocates to an operator set, then fully deallocates when not registered to the set.
⋮----
/// 1. Events are properly emitted post instantaneous deallocation
/// 2. The deallocation is instant & can be reallocated immediately
/// 3. Storage/introspection post combined deallocation/allocation
function testFuzz_allocate_fullyDeallocate_reallocate_WhenNotRegistered(Randomness r) public rand(r) {
⋮----
// Create new operator sets that the operator is not registered for
⋮----
// Allocate magnitude to operator set
⋮----
// Deallocate instantly and reallocate all magnitude to second operator set
⋮----
// We check the allocation event and not the deallocation event since
// encumbered magnitude is also updated here
⋮----
effectBlock: uint32(block.number) // Instant deallocation
⋮----
// Check storage after deallocation
// Check operator set A
⋮----
expectedMagnitudes: Magnitudes({encumbered: firstMod, max: WAD, allocatable: WAD - firstMod}) // This is from opsetB
⋮----
// Check operator set B
⋮----
/// Allocates all magnitude to a single strategy across multiple operatorSets. Deallocates fully, and then reallocates
⋮----
/// 1. Events are emitted for the allocation, deallocation, and reallocation (including the deallocation queue clear)
/// 2. Stake is fully allocated & encumbered mag used up
/// 3. Stake can be reallocated after the deallocation delay
function testFuzz_allocate_fromClearedDeallocQueue(Randomness r) public rand(r) {
⋮----
// Create multiple operator sets, register, and allocate to each. Ensure all magnitude is fully allocated.
⋮----
// There is only one strategy each allocateParams, so we don't need a nested for loop
⋮----
// Move forward to allocation completion
⋮----
// Deallocate fully from each operator set
⋮----
// Move forward to deallocation completion
⋮----
// Check that we now have sufficient allocatable magnitude
⋮----
// Create and register for a new operator set with the same default strategy.
// If we try to allocate to this new set, it should clear the deallocation queue,
// allowing all magnitude to be allocated
⋮----
// Check that all magnitude will be allocated to the new set, and each prior set
// has a zeroed-out allocation
⋮----
/// Allocates all mag and then deallocates all mag
/// Validates
/// 1. Events for the deallocation
/// 2. Storage after deallocation
/// 3. Storage after clearing the deallocation queue
function test_deallocate_all() public {
// Allocate all
⋮----
// Warp to completion and clear deallocation queue
⋮----
/// Allocates, deallocates, and then clears the deallocation queue. Multiple strategies & sets in a single operatorSet
⋮----
/// 1. Events for allocation, deallocation, and deallocation queue clear
/// 2. Storage after allocation & after allocation effect block
/// 3. Storage after deallocation & after deallocation effect block
function testFuzz_lifecycle_allocate_deallocate_MultipleSetsAndStrats(Randomness r) public rand(r) {
⋮----
// Check storage after allocation
⋮----
// Warp to deallocation complete block
⋮----
contract AllocationManagerUnitTests_ClearDeallocationQueue is AllocationManagerUnitTests {
⋮----
/// clearDeallocationQueue()
⋮----
function test_revert_arrayMismatch() public {
⋮----
/// @notice Allocates magnitude to an operator and then
/// - Clears deallocation queue when only an allocation exists
/// - Clears deallocation queue when the alloc can be completed - asserts emit has been emitted
/// - Validates storage after the second clear
function testFuzz_allocate(Randomness r) public rand(r) {
⋮----
// Attempt to clear queue, assert no events emitted
⋮----
// Clear queue - this is a noop
⋮----
// Validate allocation is no longer pending
⋮----
/// @notice Allocates magnitude to an operator registered for some operator sets, and then
/// - Clears deallocation queue when nothing can be completed
/// - After the first clear, asserts the allocation info takes into account the deallocation
/// - Clears deallocation queue when the dealloc can be completed
/// - Assert events & validates storage after the deallocateParams are completed
function testFuzz_allocate_deallocate(Randomness r) public rand(r) {
// Generate a random allocation and subsequent deallocation from the default operator set
⋮----
// Roll to allocation complete block
⋮----
// Clear queue - since we have not rolled forward, this should be a no-op
⋮----
// Validate storage - encumbered magnitude should just be allocateParams (we only have 1 allocation)
⋮----
// Clear queue
⋮----
// Validate storage - encumbered magnitude should just be deallocateParams (we only have 1 deallocation)
⋮----
/// Allocates, deallocates, and then allocates again. Asserts that
/// - The deallocation does not block state updates from the second allocation, even though the allocation has an earlier
///   effect block
function test_allocate_deallocate_allocate() public {
// Allocate half of mag to default operator set
⋮----
// Deallocate half from default operator set
⋮----
// Create and register for a new operator set
⋮----
// Allocate 33e16 mag to new operator set
⋮----
// Warp to allocation effect block & clear the queue - clearing is a noop here
⋮----
// Validate `getAllocatableMagnitude`. Allocatable magnitude should be the difference between the max magnitude and the encumbered magnitude
⋮----
// Validate that we can allocate again for opset2. This should not revert
⋮----
// Warp & validate deallocation
⋮----
/// Allocates to opset1, allocates to opset2, deallocates from opset1. Asserts that the allocation, which has a higher
/// effect block is not blocking the deallocation.
/// The allocs/deallocs looks like
/// 1. (allocation, opSet2, mag: 5e17, effectBlock: 50th day)
/// 2. (deallocation, opSet1, mag: 0, effectBlock: 42.5 day)
⋮----
/// The deallocation queue looks like
/// 1. (deallocation, opSet1, mag: 0, effectBlock: 42.5 day)
function test_regression_deallocationNotBlocked() public {
// Set allocation delay to be longer than the deallocation delay
⋮----
// Create and register for a second operator set
⋮----
// Allocate half of mag to opset2
⋮----
// Deallocate all from opSet1
⋮----
// Warp to deallocation effect block & clear the queue
⋮----
// At this point, we should be able to allocate again to opSet1 AND have only 5e17 encumbered magnitude
⋮----
contract AllocationManagerUnitTests_SetAllocationDelay is AllocationManagerUnitTests {
⋮----
/// setAllocationDelay() + getAllocationDelay()
⋮----
function setUp() public override {
⋮----
function test_revert_callerNotOperator() public {
⋮----
function test_revert_callerNotAuthorized() public {
⋮----
function test_regression_boundary() public {
⋮----
// Warp to the allocation config delay - we should not be set yet
⋮----
// Warp to the next block - we should be set now
⋮----
function testFuzz_setDelay(Randomness r) public rand(r) {
⋮----
// Set delay
⋮----
// Check values after set
⋮----
// Warp to effect block
⋮----
// Check values after config delay
⋮----
function test_fuzz_setDelay_multipleTimesWithinConfigurationDelay(Randomness r) public rand(r) {
⋮----
// Warp just before effect block
⋮----
// Set delay again
⋮----
// Warp to effect block of first delay
⋮----
// Assert that the delay is still not set
⋮----
// Warp to effect block of second delay
⋮----
function testFuzz_multipleDelays(Randomness r) public rand(r) {
⋮----
// Assert that first delay is set
⋮----
// Check values after second delay
⋮----
function testFuzz_setDelay_DMCaller(Randomness r) public rand(r) {
⋮----
// The allocation delay is set immediately
⋮----
contract AllocationManagerUnitTests_registerForOperatorSets is AllocationManagerUnitTests {
⋮----
function test_registerForOperatorSets_Paused() public {
⋮----
function testFuzz_registerForOperatorSets_InvalidOperator_x(Randomness r) public rand(r) {
⋮----
function testFuzz_registerForOperatorSets_InvalidOperatorSet(Randomness r) public rand(r) {
⋮----
defaultRegisterParams.operatorSetIds[0] = 1; // invalid id
allocationManager.registerForOperatorSets(defaultOperator, defaultRegisterParams); // invalid id
⋮----
function testFuzz_registerForOperatorSets_AlreadyMemberOfSet(Randomness r) public rand(r) {
⋮----
function testFuzz_registerForOperatorSets_Correctness(Randomness r) public rand(r) {
⋮----
function testFuzz_registerForOperatorSets_Redistributing_Correctness(Randomness r) public rand(r) {
⋮----
contract AllocationManagerUnitTests_deregisterFromOperatorSets is AllocationManagerUnitTests {
⋮----
function test_deregisterFromOperatorSets_Paused() public {
⋮----
function test_deregisterFromOperatorSets_revert_invalidCaller_notOperator() public {
⋮----
function test_deregisterFromOperatorSets_revert_invalidCaller_notAVS() public {
⋮----
function testFuzz_deregisterFromOperatorSets_InvalidOperatorSet(Randomness r) public rand(r) {
defaultDeregisterParams.operatorSetIds = uint32(1).toArrayU32(); // invalid id
⋮----
function testFuzz_deregisterFromOperatorSets_NotMemberOfSet(Randomness r) public rand(r) {
⋮----
function testFuzz_deregisterFromOperatorSets_Correctness(Randomness r) public rand(r) {
⋮----
function testFuzz_deregisterFromOperatorSets_Redistributing_Correctness(Randomness r) public rand(r) {
⋮----
contract AllocationManagerUnitTests_addStrategiesToOperatorSet is AllocationManagerUnitTests {
⋮----
function test_addStrategiesToOperatorSet_InvalidOperatorSet() public {
⋮----
function test_addStrategiesToOperatorSet_StrategyAlreadyInOperatorSet() public {
⋮----
function test_addStrategiesToOperatorSet_EigenStrategyInRedistributingSet() public {
⋮----
function test_addStrategiesToOperatorSet_BeaconChainStratInRedistributingSet() public {
// Create a redistributing operator set
⋮----
// Try to add beacon chain strategy to redistributing set
⋮----
function testFuzz_addStrategiesToOperatorSet_Correctness(Randomness r) public rand(r) {
⋮----
contract AllocationManagerUnitTests_removeStrategiesFromOperatorSet is AllocationManagerUnitTests {
⋮----
function test_removeStrategiesFromOperatorSet_InvalidOperatorSet() public {
⋮----
function test_removeStrategiesFromOperatorSet_StrategyNotInOperatorSet() public {
⋮----
function testFuzz_removeStrategiesFromOperatorSet_Correctness(Randomness r) public rand(r) {
⋮----
// The original strategy should still be in the operator set.
⋮----
contract AllocationManagerUnitTests_createOperatorSets is AllocationManagerUnitTests {
⋮----
function testRevert_createOperatorSets_InvalidOperatorSet() public {
⋮----
function testRevert_createOperatorSets_NonexistentAVSMetadata(Randomness r) public rand(r) {
⋮----
function testRevert_createOperatorSets_ZeroSlasherAddress() public {
⋮----
function testFuzz_createOperatorSets_Correctness(Randomness r) public rand(r) {
⋮----
contract AllocationManagerUnitTests_createOperatorSets_V2 is AllocationManagerUnitTests {
⋮----
function testRevert_createOperatorSets_ZeroSlasherAddress(Randomness r) public rand(r) {
⋮----
contract AllocationManagerUnitTests_createRedistributingOperatorSets is AllocationManagerUnitTests {
⋮----
function testRevert_createRedistributingOperatorSets_InvalidOperatorSet() public {
⋮----
function testRevert_createRedistributingOperatorSets_EigenStrategyInRedistributingSet() public {
⋮----
function testRevert_createRedistributingOperatorSets_NonexistentAVSMetadata(Randomness r) public rand(r) {
⋮----
function testRevert_createRedistributingOperatorSets_ZeroRedistributionAddress(Randomness r) public rand(r) {
⋮----
function testRevert_createRedistributingOperatorSets_InvalidRedistributionRecipient(Randomness r) public rand(r) {
⋮----
/// @dev We prank address(0) as the avs to test the zero slasher address
function testRevert_createRedistributingOperatorSets_ZeroSlasherAddress() public {
⋮----
function testFuzz_createRedistributingOperatorSets_Correctness(Randomness r) public rand(r) {
⋮----
contract AllocationManagerUnitTests_createRedistributingOperatorSetsV2 is AllocationManagerUnitTests {
⋮----
contract AllocationManagerUnitTests_updateSlasher is AllocationManagerUnitTests, IPermissionControllerErrors {
⋮----
/// updateSlasher() + getSlasher() + getPendingSlasher()
⋮----
function test_revert_callerNotAuthorized(Randomness r) public rand(r) {
⋮----
function test_revert_slasherNotSet() public {
⋮----
// Zero out the slasher address
⋮----
function test_revert_slasherZeroAddress() public {
⋮----
function test_slasher_boundary(Randomness r) public rand(r) {
⋮----
// Warp to the allocation config delay - the slasher should still be the defaultAVS and the pending slasher should be the new slasher
⋮----
// Warp to the next block - the slasher should be the new slasher and the pending slasher should be the 0 address
⋮----
function testFuzz_updateSlasher(Randomness r) public rand(r) {
⋮----
// Set slasher
⋮----
function test_fuzz_updateSlasher_multipleTimesWithinConfigurationDelay(Randomness r) public rand(r) {
⋮----
// Set slasher again
⋮----
// Warp to effect block of first slasher
⋮----
// Assert that the slasher is still not set
⋮----
// Warp to effect block of second slasher
⋮----
// Set Slasher
⋮----
// Assert that first slasher is the current slasher
⋮----
/// @notice Tests that createOperatorSets with instantEffectBlock=true sets the slasher field in raw storage
function test_createOperatorSets_instantEffectBlock_setsSlasherFieldInStorage() public {
⋮----
// Create operator set with slasher (uses instantEffectBlock=true)
⋮----
// Verify raw storage: slasher field should be set, not just pendingSlasher
⋮----
/// Fix 3: Re-proposing same slasher is a no-op
⋮----
/// @notice Test that re-proposing the same pending slasher is a no-op (effectBlock doesn't restart)
function test_updateSlasher_reProposeSamePendingSlasher_isNoOp(Randomness r) public rand(r) {
⋮----
// First proposal
⋮----
// Roll forward but stay before effectBlock
⋮----
// Re-propose the same slasher - should be a no-op
⋮----
// effectBlock should NOT have changed
⋮----
/// @notice Test that proposing a different slasher does restart the delay
function test_updateSlasher_proposeDifferentSlasher_restartsDelay(Randomness r) public rand(r) {
⋮----
// Propose a different slasher - should restart the delay
⋮----
// effectBlock should have changed
⋮----
/// Fix 4: getSlasher/getPendingSlasher return zero for non-existent operator sets
⋮----
/// @notice Test that getSlasher returns address(0) for non-existent operator set
function test_getSlasher_nonExistentOperatorSet_returnsZero() public {
⋮----
/// @notice Test that getPendingSlasher returns (address(0), 0) for non-existent operator set
function test_getPendingSlasher_nonExistentOperatorSet_returnsZero() public {
⋮----
/// Fix 5: SLASHER_CONFIGURATION_DELAY constant
⋮----
/// @notice Test that SLASHER_CONFIGURATION_DELAY constant exists and equals ALLOCATION_CONFIGURATION_DELAY
function test_SLASHER_CONFIGURATION_DELAY_exists() public view {
⋮----
/// @notice Test that updateSlasher uses SLASHER_CONFIGURATION_DELAY for effectBlock calculation
function test_updateSlasher_usesSlasherConfigurationDelay(Randomness r) public rand(r) {
⋮----
contract AllocationManagerUnitTests_migrateSlashers is AllocationManagerUnitTests {
⋮----
// Test appointees
⋮----
function _assertNothingPending(OperatorSet memory operatorSet) internal view {
⋮----
// Manually set the slasher of the defaultAVS to be address(0)
// Given that the slasher is already set to the defaultAVS, we need to manually update so that the `migrateSlashers` function will not noop
⋮----
function test_noop_invalidOperatorSet() public {
⋮----
// Start recording
⋮----
/// @dev This test is ignored by coverage due to an extra vm.access call
function test_noCoverage_noop_slasherAlreadySet() public {
// Register the operatorSet
⋮----
// Start recording - in this case the slasher is already set, so we noop after
⋮----
function test_noSlasherInPC() public {
// Migrate the slasher
⋮----
// Sanity check on number of reads (greater than previous test)
⋮----
// Check that the slasher is set to the defaultAVS
⋮----
function test_zeroAddressInPC() public {
// Add an appointee for the zero address
⋮----
function test_multipleAppointees() public {
// Add two appointees
⋮----
// Migrate the slasher - only the first appointee should be set
⋮----
// Check that the slasher is set to the first appointee
⋮----
/// @notice Same as previous test, bus since appointee2 is added first, the slasher should be the second appointee
function test_multipleAppointees_differentOrder() public {
⋮----
// Migrate the slasher - only the second appointee should be set
⋮----
// Check that the slasher is set to the second appointee
⋮----
function test_noCoverage_cannotMigrateMultipleTimes() public {
⋮----
// Set an appointee for the slasher
⋮----
// Migrate the slasher again - should noop
⋮----
// Sanity check on number of reads (should be 5)
⋮----
// Check that the slasher is still set to the defaultAVS
⋮----
function testFuzz_migrateSlashers_Correctness(Randomness r) public rand(r) {
⋮----
// Set slashers to zero address on all previously create opSets so we can migrate them
⋮----
// Expect event emits
⋮----
// Migrate the slashers
⋮----
// Check that the slashers are set to the AVS
⋮----
/// @notice Tests that migrateSlashers sets the slasher field immediately in raw storage
function test_migrateSlashers_setsSlasherFieldImmediatelyInStorage() public {
// Zero out the slasher (simulating a legacy operator set)
⋮----
// Verify slasher is zeroed in raw storage
⋮----
contract AllocationManagerUnitTests_setAVSRegistrar is AllocationManagerUnitTests {
function test_getAVSRegistrar() public {
⋮----
function testFuzz_setAVSRegistrar_Correctness(Randomness r) public rand(r) {
⋮----
contract AllocationManagerUnitTests_updateAVSMetadataURI is AllocationManagerUnitTests {
function test_updateAVSMetadataURI_Correctness() public {
⋮----
contract AllocationManagerUnitTests_getStrategyAllocations is AllocationManagerUnitTests {
⋮----
function testFuzz_getStrategyAllocations_Correctness(Randomness r) public rand(r) {
⋮----
contract AllocationManagerUnitTests_getSlashableStake is AllocationManagerUnitTests {
⋮----
/// of the first allocation. Validates slashable stake at each step.
function test_allocate_onePendingAllocation(Randomness r) public rand(r) {
⋮----
// Check minimum slashable stake remains the same
⋮----
// Check minimum slashable stake would not change even after the second allocation becomes effective
// This is because the allocation is not effective yet & we're getting a MINIMUM
⋮----
// Check minimum slashable stake after the second allocation becomes effective
⋮----
/// Validates slashable stake at each step after allocation and deallocation
function testFuzz_allocate_deallocate_validateSlashableStake(Randomness r) public rand(r) {
⋮----
// 1. Validate slashable stake.
// This value should be 0 even at the effectBlock since its minimal slashable stake
⋮----
// 2. Check slashable stake after allocation effect block
⋮----
// 3. Check slashable stake after deallocation - should be same at current block
⋮----
// 4. Check slashable stake at the deallocation effect block
⋮----
// 5. Check slashable stake at the deallocation effect block
⋮----
/// Allocates all of magnitude to a single strategy to an operatorSet.
/// Deallocate some portion. Finally, slash while deallocation is pending
⋮----
// Check slashable stake after deallocation (still pending; no change)
⋮----
// Check slashable stake after deallocation takes effect, before slashing
⋮----
// Slash
⋮----
// Check slashable stake after slash
⋮----
// Check slashable stake after deallocation takes effect
// Add 1 slippage for rounding down slashable stake
⋮----
// Check slashable stake after slash and deallocation
⋮----
function testFuzz_allocate_deregister(Randomness r) public rand(r) {
⋮----
// Check slashable stake right after deregistration
⋮----
// Assert slashable stake after deregistration delay is 0
⋮----
contract AllocationManagerUnitTests_isOperatorSlashable is AllocationManagerUnitTests {
⋮----
function test_registeredOperator() public view {
⋮----
function test_deregisteredOperatorAndSlashable() public {
// 1. deregister defaultOperator from defaultOperator set
⋮----
// 2. assert operator is still slashable
⋮----
// 3. roll blocks forward to slashableUntil block assert still slashable
⋮----
// 4. roll 1 block forward and assert not slashable
⋮----
contract AllocationManagerUnitTests_getMaxMagnitudesAtBlock is AllocationManagerUnitTests {
⋮----
function testFuzz_correctness(Randomness r) public rand(r) {
// Randomly allocate
⋮----
// Slash first time
⋮----
// Warp to random block
⋮----
// Slash second time
⋮----
// Warp to a block after the second slash
⋮----
// Validate get max magnitudes at block
⋮----
contract AllocationManagerUnitTests_getAllocatedStake is AllocationManagerUnitTests {
⋮----
/// Allocates to `firstMod` magnitude and validates allocated stake is correct
⋮----
/// Validates allocated stake is updated even after deallocation is cleared in storage
⋮----
// 1. Allocate magnitude to default registered set & warp to allocation complete block
⋮----
// 2. Deallocate
⋮----
// 3. Check allocated stake right after deallocation - shouldn't be updated
⋮----
/// Allocates to `firstMod` magnitude and then deregisters the operator.
/// Validates allocated stake is nonzero even after deregistration delay
⋮----
// 1. Generate allocation for `strategyMock`, we allocate half
⋮----
// 2. Deregister from operator set & warp to deregistration effect block
⋮----
// 3. Check allocated stake
⋮----
contract AllocationManagerUnitTests_isRedistributingOperatorSet is AllocationManagerUnitTests {
function testFuzz_isRedistributingOperatorSet(Randomness r) public rand(r) {
⋮----
contract AllocationManagerUnitTests_isOperatorRedistributable is AllocationManagerUnitTests {
⋮----
function testFuzz_nonRedistributableSet(Randomness r) public rand(r) {
// Assert defaultOperator is not redistributable
⋮----
function testFuzz_registered_notAllocated(Randomness r) public rand(r) {
// Create redistributing operatorSet
⋮----
// Register operator to redistributing operatorSet
⋮----
// Operator should not be redistributable since it's not allocated
⋮----
function testFuzz_redistributableSet_allocated_notRegistered(Randomness r) public rand(r) {
⋮----
// Allocate to redistributing operatorSet
⋮----
// Operator should not be redistributable since it's not slashable
⋮----
function testFuzz_allocate_register_deregister(Randomness r) public rand(r) {
⋮----
// Deregister operator from redistributing operatorSet
⋮----
// Operator should be redistributable
⋮----
// Warp past deallocation delay
⋮----
// Operator should not be redistributable
⋮----
function testFuzz_allocate_register_deallocate(Randomness r) public rand(r) {
⋮----
// Deallocate from redistributing operatorSet
⋮----
// Operator should be redistributable (still registered)
⋮----
contract AllocationManagerUnitTests_setAllocationDelay is AllocationManagerUnitTests {
/// @notice Tests that newly registered operator has delay and isSet fields set immediately in raw storage
function test_setAllocationDelay_newlyRegistered_setsDelayAndIsSetImmediately() public {
⋮----
// Register operator
⋮----
// Call setAllocationDelay as DelegationManager (triggers newlyRegistered=true path)
⋮----
// Verify raw storage: delay and isSet should be set immediately, not just pendingDelay
⋮----
/// @notice Tests that existing operator update does NOT set delay/isSet immediately
function test_setAllocationDelay_existingOperator_delayNotSetImmediately() public {
⋮----
// Register operator and set initial delay
⋮----
// Update delay as the operator (not newly registered)
⋮----
// Verify raw storage: delay should still be initialDelay until effectBlock
````

## File: src/test/unit/AVSDirectoryUnit.t.sol
````
// SPDX-License-Identifier: BUSL-1.1
⋮----
import "src/contracts/core/AVSDirectory.sol";
import "src/test/utils/EigenLayerUnitTestSetup.sol";
⋮----
contract AVSDirectoryUnitTests is EigenLayerUnitTestSetup, IAVSDirectoryEvents, IAVSDirectoryErrors, ISignatureUtilsMixinTypes {
⋮----
function setUp() public virtual override {
⋮----
function _deployAVSD(address delegationManager, IPauserRegistry pauserRegistry) internal returns (AVSDirectory avsd) {
⋮----
0 // 0 is initialPausedStatus
⋮----
function _newOperatorRegistrationSignature(uint operatorPk, address avs, bytes32 salt, uint expiry)
⋮----
/// -----------------------------------------------------------------------
/// initialize()
⋮----
function test_initialize_Correctness() public {
⋮----
/// updateAVSMetadataURI()
⋮----
function test_updateAVSMetadataURI_Correctness() public {
⋮----
/// cancelSalt()
⋮----
function test_cancelSalt_Correctness() public {
⋮----
/// registerOperatorToAVS()
⋮----
function test_registerOperatorToAVS_Paused() public {
⋮----
function test_registerOperatorToAVS_SignatureExpired() public {
⋮----
function test_registerOperatorToAVS_OperatorAlreadyRegistered() public {
⋮----
function test_registerOperatorToAVS_SaltSpent() public {
⋮----
function test_registerOperatorToAVS_OperatorNotRegisteredToEigenLayer() public {
⋮----
function test_registerOperatorToAVS_Correctness() public {
⋮----
/// deregisterOperatorFromAVS()
⋮----
function test_deregisterOperatorFromAVS_Paused() public {
⋮----
function test_deregisterOperatorFromAVS_OperatorNotRegisteredToAVS() public {
⋮----
function test_deregisterOperatorFromAVS_Correctness() public {
````

## File: src/test/unit/BN254CertificateVerifierUnit.t.sol
````
// SPDX-License-Identifier: BUSL-1.1
⋮----
import "@openzeppelin/contracts/proxy/ERC1967/ERC1967Proxy.sol";
import "forge-std/Test.sol";
⋮----
import "src/test/utils/EigenLayerMultichainUnitTestSetup.sol";
import "src/contracts/libraries/BN254.sol";
import "src/contracts/libraries/Merkle.sol";
import "src/contracts/libraries/OperatorSetLib.sol";
import "src/contracts/multichain/BN254CertificateVerifier.sol";
import "src/contracts/interfaces/IOperatorTableUpdater.sol";
import "src/contracts/interfaces/IBaseCertificateVerifier.sol";
import "src/contracts/interfaces/IBN254CertificateVerifier.sol";
import "src/contracts/interfaces/ICrossChainRegistry.sol";
⋮----
/// @title BN254CertificateVerifierUnitTests
/// @notice Base contract for all BN254CertificateVerifier unit tests
contract BN254CertificateVerifierUnitTests is
⋮----
// Constants
⋮----
// Contracts
⋮----
// Test accounts
⋮----
// Defaults
⋮----
uint32 defaultMaxStaleness = 3600; // 1 hour max staleness
⋮----
// BLS signature specific fields
⋮----
BN254.G2Point aggSignerApkG2; // G2 public key corresponding to aggSignerPrivKey
⋮----
function setUp() public virtual override {
// Setup Mocks
⋮----
// Deploy Contracts
⋮----
// Set up the aggregate public key in G2
⋮----
// Helper functions
function _generateSignerAndNonSignerPrivateKeys(uint pseudoRandomNumber, uint numSigners, uint numNonSigners)
⋮----
// Generate numSigners-1 random keys
⋮----
// Last key makes the total sum equal to aggSignerPrivKey
⋮----
// Generate non-signer keys
⋮----
// Sort nonSignerPrivateKeys in order of ascending pubkeyHash
⋮----
function _toPubkeyHash(uint privKey) internal view returns (bytes32) {
⋮----
function _createOperatorsWithSplitKeys(uint pseudoRandomNumber, uint numSigners, uint numNonSigners)
⋮----
// Generate private keys
⋮----
// Create all operators
⋮----
// Track indices of non-signers
⋮----
// Create signers first
⋮----
// Create non-signers
⋮----
// Calculate aggregate signature for the signers
⋮----
function _getMerkleRoot(BN254OperatorInfo[] memory ops) internal view returns (bytes32 root) {
⋮----
function _getMerkleProof(BN254OperatorInfo[] memory ops, uint32 operatorIndex) internal view returns (bytes memory proof) {
⋮----
function _createOperatorSetInfo(BN254OperatorInfo[] memory ops) internal view returns (BN254OperatorSetInfo memory) {
⋮----
// Create aggregate public key
⋮----
// Create total weights
⋮----
function _createCertificate(
⋮----
// Create witnesses for non-signers
⋮----
// Compute EIP-712 digest and corresponding aggregate signature for tests
⋮----
function _updateOperatorTable(Randomness r, uint numSigners, uint numNonsigners)
⋮----
// Generate seed and reference timestamp
⋮----
// Create operators
⋮----
// Update operator table
⋮----
function _initializeOperatorTableBase() internal returns (uint32 referenceTimestamp) {
⋮----
/// @title BN254CertificateVerifierUnitTests_updateOperatorTable
/// @notice Unit tests for BN254CertificateVerifier.updateOperatorTable
contract BN254CertificateVerifierUnitTests_updateOperatorTable is BN254CertificateVerifierUnitTests, IBN254CertificateVerifierEvents {
function test_revert_notTableUpdater() public {
⋮----
function test_revert_staleTimestamp() public {
⋮----
// First update should succeed
⋮----
// Second update with earlier timestamp should fail
⋮----
function testFuzz_updateOperatorTable_correctness(Randomness r) public rand(r) {
⋮----
// Expect event
⋮----
// Verify storage updates
⋮----
// Verify operator set info was stored correctly
⋮----
function test_multiple() public {
// Create two different operator sets
⋮----
// Create operators for each set
⋮----
// Create operator set infos
⋮----
// Create operator set configs with different owners
⋮----
maxStalenessPeriod: 1800 // 30 minutes
⋮----
maxStalenessPeriod: 7200 // 2 hours
⋮----
// Update both operator tables
⋮----
// Verify that both operator sets are stored correctly and independently
⋮----
// Verify operator set infos are stored independently
⋮----
// Verify they have different tree roots (since operators are different)
⋮----
/// @title BN254CertificateVerifierUnitTests_verifyCertificate
/// @notice Unit tests for BN254CertificateVerifier.verifyCertificate
contract BN254CertificateVerifierUnitTests_verifyCertificate is BN254CertificateVerifierUnitTests {
function test_revert_certificateStale() public {
⋮----
// Jump forward in time beyond the max staleness
⋮----
function test_zeroStalenessPeriod_neverStale() public {
// Create operator set config with 0 staleness period
⋮----
maxStalenessPeriod: 0 // 0 means certificate never becomes stale
⋮----
// Create certificate
⋮----
// Jump forward in time far beyond any reasonable staleness period
⋮----
// Certificate should still be valid with 0 staleness period
⋮----
// Verify all stakes are signed
⋮----
function test_revert_referenceTimestampDoesNotExist() public {
⋮----
function test_isReferenceTimestampSet() public {
⋮----
// Before updating operator table, timestamp should not be set
⋮----
// After updating, timestamp should be set
⋮----
// A different timestamp should not be set
⋮----
function test_revert_rootDisabled() public {
// Initialize operator table with a valid root
⋮----
// Mock the operatorTableUpdater to return false for isRootValidByTimestamp
⋮----
function test_revert_invalidOperatorIndex() public {
⋮----
// Create certificate with invalid operator index
⋮----
operatorIndex: uint32(operatorSetInfo.numOperators), // Out of bounds, since we only have 1 nonsigner
⋮----
function test_revert_invalidMerkleProof() public {
⋮----
// Create certificate with invalid merkle proof
⋮----
operatorInfoProof: new bytes(32), // Invalid proof
⋮----
function test_revert_invalidSignature() public {
⋮----
// Create certificate with wrong message hash
⋮----
wrongHash, // Wrong hash
⋮----
// Overwrite signature to be for the correct digest of defaultMsgHash so it mismatches wrongHash
⋮----
function testFuzz_verifyCertificate_allSigners(Randomness r) public rand(r) {
⋮----
// Create certificate with no non-signers
⋮----
// All stakes should be signed
⋮----
function testFuzz_verifyCertificate_someNonSigners(Randomness r) public rand(r) {
// Create operators and update operator table
⋮----
// Check that the signed stakes are correct
⋮----
// Calculate expected signed stakes
⋮----
// Subtract non-signer stakes
⋮----
function test_verifyCertificate_cachesOperatorInfo(Randomness r) public rand(r) {
⋮----
// First verification should cache the operator infos
⋮----
// Check that operator infos are now cached
⋮----
// Cached info should match original
⋮----
// Second verification should use cached data. We don't have to provide an operatorInfoProof for the non-signers
// since they are in the cache.
⋮----
function test_verifyCertificate_olderTimestamp() public {
// First update with initial operators
⋮----
// Advance time and update with new operators (making this the latest timestamp)
⋮----
// Verify that the second timestamp is now the latest
⋮----
// Create certificate for the FIRST (older) timestamp
⋮----
// Verify certificate for older timestamp should succeed
⋮----
// Calculate expected signed stakes from first operators (total minus non-signers)
⋮----
// Verify the signed stakes match expected calculation
⋮----
/// @title BN254CertificateVerifierUnitTests_verifyCertificateProportion
/// @notice Unit tests for BN254CertificateVerifier.verifyCertificateProportion
contract BN254CertificateVerifierUnitTests_verifyCertificateProportion is BN254CertificateVerifierUnitTests {
function testFuzz_revert_arrayLengthMismatch(Randomness r) public rand(r) {
⋮----
) = _updateOperatorTable(r, numOperators, 0); // 0 nonsigners
⋮----
uint16[] memory wrongLengthThresholds = new uint16[](1); // Should be 2
⋮----
function testFuzz_verifyCertificateProportion_meetsThresholds(Randomness r) public rand(r) {
⋮----
// Set thresholds at 60% of total stake for each type
⋮----
thresholds[0] = 6000; // 60%
thresholds[1] = 6000; // 60%
⋮----
// Calculate expected result based on the number of signers
// With numSigners out of numOperators, check if it meets 60% threshold
⋮----
function testFuzz_verifyCertificateProportion_doesNotMeetThresholds(Randomness r) public rand(r) {
// Update operator table with a specific split to ensure some thresholds won't be met
uint numSigners = r.Uint256(1, numOperators / 2); // At most half signers
⋮----
// Try with higher threshold that shouldn't be met
⋮----
thresholds[0] = 9000; // 90%
thresholds[1] = 9000; // 90%
⋮----
// Calculate percentage of signed stakes to determine if it should meet threshold
⋮----
/// @notice Fuzz against random thresholds
function testFuzz_verifyCertificateProportion_thresholds(Randomness r, uint16 threshold0, uint16 threshold1) public rand(r) {
// Update operator table with random split
⋮----
threshold0 = uint16(bound(threshold0, 0, 10_000)); // 0% to 100%
threshold1 = uint16(bound(threshold1, 0, 10_000)); // 0% to 100%
⋮----
// Calculate expected result
⋮----
/// @title BN254CertificateVerifierUnitTests_verifyCertificateNominal
/// @notice Unit tests for BN254CertificateVerifier.verifyCertificateNominal
contract BN254CertificateVerifierUnitTests_verifyCertificateNominal is BN254CertificateVerifierUnitTests {
⋮----
uint[] memory wrongLengthThresholds = new uint[](1); // Should be 2
⋮----
function testFuzz_verifyCertificateNominal_meetsThresholds(Randomness r) public rand(r) {
⋮----
// Get the signed stakes for reference
⋮----
// Test with thresholds lower than signed stakes (should pass)
⋮----
function testFuzz_verifyCertificateNominal_doesNotMeetThresholds(Randomness r) public rand(r) {
⋮----
uint numSigners = r.Uint256(1, numOperators - 1); // Ensure at least one non-signer
⋮----
// Test with thresholds higher than signed stakes (should fail)
⋮----
function testFuzz_verifyCertificateNominal_thresholds(Randomness r, uint threshold0, uint threshold1) public rand(r) {
⋮----
// Bound thresholds to reasonable values
⋮----
// Expected result
⋮----
/// @title BN254CertificateVerifierUnitTests_ViewFunctions
/// @notice Unit tests for BN254CertificateVerifier view functions
contract BN254CertificateVerifierUnitTests_ViewFunctions is BN254CertificateVerifierUnitTests {
⋮----
function setUp() public override {
⋮----
function test_getOperatorSetOwner() public view {
⋮----
function test_maxOperatorTableStaleness() public view {
⋮----
function test_latestReferenceTimestamp() public view {
⋮----
function test_getOperatorSetInfo() public view {
⋮----
function test_getNonsignerOperatorInfo() public {
// First cache some operator info
⋮----
// Verify certificate to cache operator info
⋮----
// Get cached operator info
⋮----
function test_isNonsignerCached() public {
⋮----
// Non-signer index should be not cached prior to verification
⋮----
// Check that the non-signer operator info is cached
⋮----
// Assert that the signers are NOT cached
⋮----
function test_isReferenceTimestampSet_view() public view {
// Check that the reference timestamp is set (from setUp)
⋮----
// Check that a different timestamp is not set
⋮----
// Check for a different operator set
⋮----
function test_getTotalStakeWeights() public view {
// Test with valid timestamp - should return the totalWeights from operatorSetInfo
⋮----
// Test with non-existent timestamp - should return empty array
⋮----
// Test with different operator set - should return empty array
⋮----
function test_getOperatorCount() public view {
// Test with valid timestamp - should return the operator count from operatorSetInfo
⋮----
// Test with non-existent timestamp - should return 0
⋮----
// Test with different operator set - should return 0
⋮----
/// @title BN254CertificateVerifierUnitTests_trySignatureVerification
/// @notice Unit tests for BN254CertificateVerifier.trySignatureVerification
contract BN254CertificateVerifierUnitTests_trySignatureVerification is BN254CertificateVerifierUnitTests {
function testFuzz_trySignatureVerification_validSignature(Randomness r) public rand(r) {
// Create all operators as signers
⋮----
// Verify signature
⋮----
function testFuzz_trySignatureVerification_invalidPairing(Randomness r) public rand(r) {
// Create valid signature with one set of operators
⋮----
// Try to verify signature with invalid message hash
⋮----
function testFuzz_trySignatureVerification_invalidSigAndPairing(Randomness r) public rand(r) {
⋮----
// Try to verify signature with invalid apk
aggSignerApkG2.X[0] += 1; // Invalid apk
````

## File: src/test/unit/CrossChainRegistryUnit.t.sol
````
// SPDX-License-Identifier: BUSL-1.1
⋮----
import "src/contracts/multichain/CrossChainRegistry.sol";
import "src/test/utils/EigenLayerMultichainUnitTestSetup.sol";
import "src/test/mocks/OperatorTableCalculatorMock.sol";
import "src/contracts/interfaces/IKeyRegistrar.sol";
⋮----
/// @title CrossChainRegistryUnitTests
/// @notice Base contract for all CrossChainRegistry unit tests
contract CrossChainRegistryUnitTests is
⋮----
// Constants from CrossChainRegistryStorage
⋮----
// Test state variables
⋮----
function setUp() public virtual override {
⋮----
// Deploy CrossChainRegistry implementation
⋮----
// Deploy CrossChainRegistry proxy
⋮----
address(this), // initial owner
1 days, // initial table update cadence
0 // initial paused status
⋮----
// Set up default test values
⋮----
// Setup default permissions
⋮----
// Make the operator set valid in AllocationManager
⋮----
// Set the key type for the operator set in KeyRegistrar
⋮----
// Whitelist chain IDs
⋮----
// Helper functions
function _grantUAMRole(address target, address avs) internal {
// Grant admin role first
⋮----
// Set appointee for all CrossChainRegistry functions
⋮----
// Set appointee for KeyRegistrar functions
⋮----
function _createOperatorSet(address avs, uint32 operatorSetId) internal pure returns (OperatorSet memory) {
⋮----
function _createOperatorSetConfig(address owner, uint32 stalenessPeriod) internal pure returns (OperatorSetConfig memory) {
⋮----
function _createAndWhitelistChainIDs(uint count) internal returns (uint[] memory) {
⋮----
/// @title CrossChainRegistryUnitTests_initialize
/// @notice Unit tests for CrossChainRegistry.initialize
contract CrossChainRegistryUnitTests_initialize is CrossChainRegistryUnitTests {
function test_initialize_AlreadyInitialized() public {
⋮----
function test_initialize_CorrectOwnerAndPausedStatus() public {
// Deploy new implementation and proxy to test initialization
⋮----
/// @title CrossChainRegistryUnitTests_createGenerationReservation
/// @notice Unit tests for CrossChainRegistry.createGenerationReservation
contract CrossChainRegistryUnitTests_createGenerationReservation is CrossChainRegistryUnitTests {
function test_Revert_Paused() public {
⋮----
function test_Revert_NotPermissioned() public {
⋮----
function test_Revert_InvalidOperatorSet() public {
⋮----
// Grant permission for the invalid operator set's AVS
⋮----
function test_Revert_GenerationReservationAlreadyExists() public {
⋮----
function test_Revert_InvalidStalenessPeriod() public {
// Set a table update cadence
⋮----
// Try to create with a config that has staleness period less than cadence (but not 0)
⋮----
function test_Revert_KeyTypeNotSet() public {
// Create a new operator set that hasn't been configured in KeyRegistrar
⋮----
// Make the operator set valid in AllocationManager but don't configure it in KeyRegistrar
⋮----
// Expect the KeyTypeNotSet error when trying to create generation reservation
⋮----
function test_createGenerationReservation_Success() public {
// Expect events
⋮----
// Make the call
⋮----
// Verify state
⋮----
/// @title CrossChainRegistryUnitTests_removeGenerationReservation
/// @notice Unit tests for CrossChainRegistry.removeGenerationReservation
contract CrossChainRegistryUnitTests_removeGenerationReservation is CrossChainRegistryUnitTests {
function setUp() public override {
⋮----
// Create a default reservation
⋮----
function test_Revert_GenerationReservationDoesNotExist() public {
⋮----
function test_removeGenerationReservation_Success() public {
⋮----
// Remove the reservation
⋮----
/// @title CrossChainRegistryUnitTests_setOperatorTableCalculator
/// @notice Unit tests for CrossChainRegistry.setOperatorTableCalculator
contract CrossChainRegistryUnitTests_setOperatorTableCalculator is CrossChainRegistryUnitTests {
⋮----
function test_setOperatorTableCalculator_Success() public {
// Expect event
⋮----
// Set new calculator
⋮----
function testFuzz_setOperatorTableCalculator_MultipleUpdates(uint8 numUpdates) public {
⋮----
/// @title CrossChainRegistryUnitTests_setOperatorSetConfig
/// @notice Unit tests for CrossChainRegistry.setOperatorSetConfig
contract CrossChainRegistryUnitTests_setOperatorSetConfig is CrossChainRegistryUnitTests {
⋮----
function test_setOperatorSetConfig_Success() public {
⋮----
// Set new config
⋮----
function testFuzz_setOperatorSetConfig_StalenessPeriod(uint32 stalenessPeriod) public {
⋮----
// Try to set config with staleness period less than minimum (but not 0)
⋮----
function test_setOperatorSetConfig_ZeroStalenessPeriod() public {
⋮----
// Create config with 0 staleness period (should be allowed as special case)
⋮----
// Should succeed
⋮----
// Verify the config was set
⋮----
/// @title CrossChainRegistryUnitTests_addChainIDsToWhitelist
/// @notice Unit tests for CrossChainRegistry.addChainIDsToWhitelist
contract CrossChainRegistryUnitTests_addChainIDsToWhitelist is CrossChainRegistryUnitTests {
⋮----
function test_Revert_NotOwner() public {
⋮----
function test_Revert_ArrayLengthMismatch() public {
⋮----
function test_Revert_InvalidChainId() public {
⋮----
function test_Revert_ChainIDAlreadyWhitelisted() public {
⋮----
function test_addChainIDsToWhitelist_Success() public {
⋮----
// Add to whitelist
⋮----
function testFuzz_addChainIDsToWhitelist_MultipleChainIDs(uint8 numChainIDs) public {
⋮----
/// @title CrossChainRegistryUnitTests_removeChainIDsFromWhitelist
/// @notice Unit tests for CrossChainRegistry.removeChainIDsFromWhitelist
contract CrossChainRegistryUnitTests_removeChainIDsFromWhitelist is CrossChainRegistryUnitTests {
⋮----
function test_Revert_ChainIDNotWhitelisted() public {
⋮----
function test_removeChainIDsFromWhitelist_Success() public {
⋮----
// Remove from whitelist
⋮----
/// @title CrossChainRegistryUnitTests_getActiveGenerationReservations
/// @notice Unit tests for CrossChainRegistry.getActiveGenerationReservations
contract CrossChainRegistryUnitTests_getActiveGenerationReservations is CrossChainRegistryUnitTests {
function test_getActiveGenerationReservations_Empty() public {
⋮----
function test_getActiveGenerationReservations_Single() public {
⋮----
function testFuzz_getActiveGenerationReservations_Multiple(uint8 numReservations) public {
⋮----
/// @title CrossChainRegistryUnitTests_calculateOperatorTableBytes
/// @notice Unit tests for CrossChainRegistry.calculateOperatorTableBytes
contract CrossChainRegistryUnitTests_calculateOperatorTableBytes is CrossChainRegistryUnitTests {
⋮----
// Set up mock data
⋮----
function test_calculateOperatorTableBytes_Success() public {
⋮----
// Decode the result
⋮----
// Verify the decoded data
⋮----
function test_calculateOperatorTableBytes_NonExistentOperatorSet() public {
⋮----
// Should revert when trying to call calculateOperatorTableBytes on a null calculator
⋮----
/// @title CrossChainRegistryUnitTests_getSupportedChains
/// @notice Unit tests for CrossChainRegistry.getSupportedChains
contract CrossChainRegistryUnitTests_getSupportedChains is CrossChainRegistryUnitTests {
function test_getSupportedChains_Initial() public {
⋮----
function testFuzz_getSupportedChains_AddAndRemove(uint8 numToAdd, uint8 numToRemove) public {
⋮----
// Add chains
⋮----
// Remove some default chains
⋮----
/// @title CrossChainRegistryUnitTests_setTableUpdateCadence
/// @notice Unit tests for CrossChainRegistry.setTableUpdateCadence
contract CrossChainRegistryUnitTests_setTableUpdateCadence is CrossChainRegistryUnitTests {
⋮----
function test_setTableUpdateCadence_Success() public {
⋮----
// Set table update cadence
⋮----
function test_setTableUpdateCadence_AffectsConfigValidation() public {
// Create a reservation with a config
⋮----
// Update table update cadence to be higher than existing config
⋮----
// Try to set a config with staleness period less than new cadence
⋮----
// Verify setting a valid config works
⋮----
function testFuzz_setTableUpdateCadence(uint32 tableUpdateCadence) public {
⋮----
function test_Revert_TableUpdateCadenceZero() public {
⋮----
/// @title CrossChainRegistryUnitTests_getActiveGenerationReservationsByRange
/// @notice Unit tests for CrossChainRegistry.getActiveGenerationReservationsByRange
contract CrossChainRegistryUnitTests_getActiveGenerationReservationsByRange is CrossChainRegistryUnitTests {
function test_revert_invalidRange_startGreaterThanEnd() public {
// Create some reservations first
⋮----
// Test startIndex > endIndex - should revert with InvalidRange
⋮----
function test_revert_invalidEndIndex_endGreaterThanLength() public {
⋮----
// Test endIndex > length - should revert with InvalidEndIndex
⋮----
crossChainRegistry.getActiveGenerationReservationsByRange(0, 2); // length is 1, so endIndex 2 is invalid
⋮----
function test_getActiveGenerationReservationsByRange_emptyRegistry() public {
// Test with empty registry
⋮----
crossChainRegistry.getActiveGenerationReservationsByRange(0, 1); // length is 0, so endIndex 1 is invalid
⋮----
function test_emptyRange_startEqualEnd() public {
⋮----
// Test slice(n,n)
⋮----
function test_getActiveGenerationReservationsByRange_fullRange() public {
// Create multiple reservations
⋮----
// Get full range
⋮----
// Verify results are the same
⋮----
function test_getActiveGenerationReservationsByRange_DivideInFourths() public {
// Create 12 reservations to divide evenly by 4
⋮----
// Get all reservations to compare against
⋮----
// Collect all reservations by quarters
⋮----
// Get each quarter
⋮----
uint endIdx = (quarter == 3) ? totalCount : (quarter + 1) * quarterSize; // Handle last quarter
⋮----
// Copy to collected array
⋮----
// Verify we collected all reservations and they match
⋮----
function test_getActiveGenerationReservationsByRange_SingleItem() public {
⋮----
// Get each item individually
⋮----
// Verify it matches the expected item from full list
⋮----
/// @title CrossChainRegistryUnitTests_getActiveGenerationReservationCount
/// @notice Unit tests for CrossChainRegistry.getActiveGenerationReservationCount
contract CrossChainRegistryUnitTests_getActiveGenerationReservationCount is CrossChainRegistryUnitTests {
function test_getActiveGenerationReservationCount_Empty() public {
⋮----
function test_getActiveGenerationReservationCount_Single() public {
⋮----
function test_getActiveGenerationReservationCount_Multiple() public {
⋮----
function test_getActiveGenerationReservationCount_AddAndRemove() public {
// Create reservation
⋮----
// Remove reservation
⋮----
function testFuzz_getActiveGenerationReservationCount_consistency(uint8 numReservations) public {
⋮----
// Create reservations
⋮----
contract CrossChainRegistryUnitTests_hasActiveGenerationReservation is CrossChainRegistryUnitTests {
function test_hasActiveGenerationReservation_Single() public {
````

## File: src/test/unit/DelegationUnit.t.sol
````
// SPDX-License-Identifier: BUSL-1.1
⋮----
import "@openzeppelin/contracts/mocks/ERC1271WalletMock.sol";
import "@openzeppelin/contracts/token/ERC20/presets/ERC20PresetFixedSupply.sol";
⋮----
import "src/contracts/core/DelegationManager.sol";
import "src/contracts/strategies/StrategyBase.sol";
import "src/test/utils/EigenLayerUnitTestSetup.sol";
import "src/contracts/libraries/SlashingLib.sol";
import "src/test/utils/ArrayLib.sol";
import "src/test/harnesses/DelegationManagerHarness.sol";
⋮----
/// @notice Unit testing of the DelegationManager contract. Withdrawals are tightly coupled
/// with EigenPodManager and StrategyManager and are part of integration tests.
/// Contracts tested: DelegationManager
/// Contracts not mocked: StrategyBase, PauserRegistry
contract DelegationManagerUnitTests is EigenLayerUnitTestSetup, IDelegationManagerEvents, IDelegationManagerErrors {
⋮----
/// -----------------------------------------------------------------------
/// Contracts and Mocks
⋮----
/// Constants
⋮----
uint32 constant MIN_WITHDRAWAL_DELAY_BLOCKS = 126_000; // 17.5 days in blocks
⋮----
// Fuzz bound checks
⋮----
uint constant APPROX_REL_DIFF = 1e8; // 0.0.0000000100000000% relative difference for assertion checks. Needed due to rounding errors
// Max shares in a strategy, see StrategyBase.sol
⋮----
/// Defaults & Mappings for Stack too deep errors
⋮----
// Delegation signer
⋮----
// Helper to use in storage
⋮----
/// @notice mappings used to handle duplicate entries in fuzzed address array input
⋮----
// Keep track of queued withdrawals
⋮----
function setUp() public virtual override {
// Setup
⋮----
// Redeploy StrategyManagerMock with DM
⋮----
// Deploy DelegationManager implementation and upgrade proxy
⋮----
0 // 0 is initial paused status
⋮----
// Deploy mock token and strategy
⋮----
// Roll blocks forward so that block.number - MIN_WITHDRAWAL_DELAY_BLOCKS doesn't revert
// in _getSlashableSharesInQueue
⋮----
// Exclude delegation manager from fuzzed tests
⋮----
/// INTERNAL / HELPER FUNCTIONS
⋮----
/// @notice internal function to deploy mock tokens and strategies and have the staker deposit into them.
/// Since we are mocking the strategyManager we call strategyManagerMock.setDeposits so that when
/// DelegationManager calls getDeposits, we can have these share amounts returned.
function _deployAndDepositIntoStrategies(address staker, uint[] memory sharesAmounts, bool depositBeaconChainShares)
⋮----
// If depositing beaconShares, then for last index of shareAmount, set shares into EPM instead
⋮----
function _depositIntoStrategies(address staker, IStrategy[] memory strategies, uint[] memory sharesAmounts) internal {
⋮----
/// @notice internal function for calculating a signature from the delegationSigner corresponding to `_delegationSignerPrivateKey`, approving
/// the `staker` to delegate to `operator`, with the specified `salt`, and expiring at `expiry`.
function _getApproverSignature(uint _delegationSignerPrivateKey, address staker, address operator, bytes32 salt, uint expiry)
⋮----
// @notice Assumes operator does not have a delegation approver & staker != approver
function _delegateToOperatorWhoAcceptsAllStakers(address staker, address operator) internal {
⋮----
function _delegateToOperatorWhoRequiresSig(address staker, address operator, bytes32 salt) internal {
⋮----
function _delegateToOperatorWhoRequiresSig(address staker, address operator) internal {
⋮----
function _registerOperatorWithBaseDetails(address operator) internal {
⋮----
function _registerOperatorWithDelegationApprover(address operator) internal {
⋮----
function _registerOperatorWith1271DelegationApprover(address operator) internal returns (ERC1271WalletMock) {
⋮----
/// deploy a ERC1271WalletMock contract with the `delegationSigner` address as the owner,
/// so that we can create valid signatures from the `delegationSigner` for the contract to check when called
⋮----
function _registerOperator(address operator, address delegationApprover, string memory metadataURI)
⋮----
/// @notice Using this helper function to fuzz withdrawalAmounts since fuzzing two dynamic sized arrays of equal lengths
/// reject too many inputs.
function _fuzzDepositWithdrawalAmounts(Randomness r, uint32 numStrategies)
⋮----
// generate withdrawal amount within range s.t withdrawAmount <= depositAmount
⋮----
function _setUpQueueWithdrawalsSingleStrat(address staker, IStrategy strategy, uint depositSharesToWithdraw)
⋮----
// Get scaled shares to withdraw
⋮----
function _setUpQueueWithdrawals(address staker, IStrategy[] memory strategies, uint[] memory depositWithdrawalAmounts)
⋮----
/// @notice Call queue withdrawals and push the Withdrawal to storage for testing purposes and
/// later assertions
function _queueWithdrawals(address staker, QueuedWithdrawalParams[] memory queuedWithdrawalParams, Withdrawal memory withdrawal)
⋮----
function _getScaledShares(address staker, IStrategy strategy, uint depositSharesToWithdraw) internal view returns (uint) {
⋮----
/// @notice get the shares expected to be withdrawn given the staker, strategy, maxMagnitude, and depositSharesToWithdraw
function _getWithdrawableShares(
⋮----
function _getSlashingFactor(address staker, IStrategy strategy, uint64 operatorMaxMagnitude) internal view returns (uint) {
⋮----
/// Deploy and deposit staker into a single strategy, then set up a queued withdrawal for the staker
/// Assumptions:
/// - operator is already a registered operator.
/// - withdrawalAmount <= depositAmount
function _setUpCompleteQueuedWithdrawalSingleStrat(
⋮----
// Set the current deposits to be the depositAmount - withdrawalAmount
⋮----
/// Deploy and deposit staker into a single strategy, then set up multiple queued withdrawals for the staker
⋮----
/// - total deposit amount = depositAmount * numWithdrawals
/// - this will fully withdraw from the single strategy
function _setUpCompleteQueuedWithdrawalsSingleStrat(address staker, uint depositAmount, uint numWithdrawals)
⋮----
// Set the current deposits to be 0
⋮----
/// Deploy and deposit staker into strategies, then set up a queued withdrawal for the staker
⋮----
/// - for each i, withdrawalAmount[i] <= depositAmount[i] (see filterFuzzedDepositWithdrawInputs above)
function _setUpCompleteQueuedWithdrawal(
⋮----
function _setOperatorMagnitude(address operator, IStrategy strategy, uint64 magnitude) internal {
⋮----
function _setNewBeaconChainSlashingFactor(address staker, int beaconShares, uint sharesDecrease)
⋮----
function _decreaseBeaconChainShares(address staker, int beaconShares, uint sharesDecrease)
⋮----
/// Event helpers
⋮----
function _registerOperator_expectEmit(RegisterAsOperatorEmitStruct memory params) internal {
⋮----
function _delegateTo_expectEmit(DelegateToEmitStruct memory params) internal {
⋮----
function _delegateTo_expectEmit_singleStrat(DelegateToSingleStratEmitStruct memory params) internal {
⋮----
/// @notice Assumes only single strategy for staker being withdrawn, only checks for single strategy if
/// param.strategy address is not 0x0
function _undelegate_expectEmit_singleStrat(UndelegateEmitStruct memory params) internal {
⋮----
function _increaseDelegatedShares_expectEmit(IncreaseDelegatedSharesEmitStruct memory params) internal {
⋮----
function _decreaseDelegatedShares_expectEmit(DecreaseDelegatedSharesEmitStruct memory params) internal {
⋮----
function _queueWithdrawals_expectEmit(QueueWithdrawalsEmitStruct memory params) internal {
⋮----
function _completeQueuedWithdrawal_expectEmit(CompleteQueuedWithdrawalEmitStruct memory params) internal {
⋮----
// receiving as shares so check for OperatorSharesIncrease and DepositScalingFactor updated
⋮----
// Get updated deposit scaling factor
⋮----
function _completeQueuedWithdrawals_expectEmit(CompleteQueuedWithdrawalsEmitStruct memory params) internal {
⋮----
function _slashOperatorShares_expectEmit(SlashOperatorSharesEmitStruct memory params) internal {
⋮----
/// Slashing Lib helpers
/// Logic is essentially copied from SlashingLib to test the calculations
/// and to avoid using the same library in the tests
⋮----
/// @notice Calculates the exact withdrawable shares
function _calcWithdrawableShares(uint depositShares, uint depositScalingFactor, uint slashingFactor) internal pure returns (uint) {
⋮----
function _calcCompletedWithdrawnShares(uint scaledShares, uint slashingFactor) internal pure returns (uint) {
⋮----
/// @notice Calculates the new deposit scaling factor after a deposit
function _calcDepositScalingFactor(uint prevDsf, uint prevDepositShares, uint addedDepositShares, uint slashingFactor)
⋮----
function _calcSlashedAmount(uint operatorShares, uint64 prevMaxMagnitude, uint64 newMaxMagnitude)
⋮----
/// Helper Assertions
⋮----
/// @notice Asserts for depositShares, withdrawableShares, and depositScalingFactor after a deposit
function _assertDeposit(
⋮----
// Check deposit shares added correctly
⋮----
// Check withdrawable shares are increased, with rounding error
⋮----
// Check the new dsf is accurate
⋮----
// Check new operatorShares increased correctly
⋮----
// Check the newly calculated withdrawable shares are correct
⋮----
/// @notice Asserts for depositShares, withdrawableShares, and depositScalingFactor after a delegation
function _assertDelegation(
⋮----
// Check deposit shares don't change
⋮----
// Check withdrawable shares don't change
⋮----
/// @notice Asserts for depositShares, and operatorShares decremented properly after a withdrawal
function _assertWithdrawal(
⋮----
// Check deposit shares decreased correctly
⋮----
// Check withdrawable shares are decreased, with rounding error
⋮----
// Check operatorShares decreased properly
⋮----
/// @notice Asserts for a queuedWithdrawal that its root is no longer pending and the withdrawal no longer exists
/// Also checks if the withdrawal is completed as shares that the current operator shares are increased appropriately
/// with the staker's depositScalingFactor updated.
/// NOTE: assumes no duplicate strategies in the withdrawal
function _assertCompletedWithdrawal(AssertCompletedWithdrawalStruct memory params) internal view {
⋮----
// Check operator and staker shares if receiving as shares
⋮----
// assert deposit and withdrawable shares unchanged
⋮----
// assert operatorShares unchanged
⋮----
// assert dsf is unchanged
⋮----
// calculate shares to complete withdraw and add back as shares
⋮----
// assert deposit shares, withdrawable shares, and operator shares, and depositScalingFactor
⋮----
/// @notice assert withdrawals completed are reflected as completed in storage for the withdrawal root and staker
function _assertWithdrawalRootsComplete(address staker, Withdrawal[] memory withdrawals) internal view {
⋮----
// Check the withdrawal root is no longer pending
// and also doesn't exist in storage for the staker
⋮----
function _assertOperatorSharesAfterSlash(
⋮----
function _assertSharesAfterSlash(
⋮----
function _assertSharesAfterBeaconSlash(
⋮----
/// @notice Due to rounding, withdrawable shares and operator shares may not align even if the operator
/// only has the single staker with deposits.
function _assertWithdrawableAndOperatorShares(uint withdrawableShares, uint operatorShares, string memory errorMessage) internal pure {
⋮----
/// @notice Assertion checks after queuing a withdrawal. Reads withdrawals set in storage in test
/// - Asserts exact match of Withdrawal struct exists in storage
/// - Asserts Withdrawal root is pending
function _assertQueuedWithdrawalExists(address staker) internal view {
⋮----
function _assertQueuedWithdrawalExists(address staker, Withdrawal memory withdrawal) internal view {
⋮----
contract DelegationManagerUnitTests_Initialization_Setters is DelegationManagerUnitTests {
function test_initialization() public view {
⋮----
// assertEq(delegationManager.owner(), address(this), "constructor / initializer incorrect, owner set wrong");
⋮----
/// @notice Verifies that the DelegationManager cannot be initialized multiple times
function test_initialize_revert_reinitialization() public {
⋮----
contract DelegationManagerUnitTests_RegisterModifyOperator is DelegationManagerUnitTests {
⋮----
function test_registerAsOperator_revert_paused() public {
// set the pausing flag
⋮----
// @notice Verifies that someone cannot successfully call `DelegationManager.registerAsOperator(delegationApprover)` again after registering for the first time
function testFuzz_registerAsOperator_revert_cannotRegisterMultipleTimes(address delegationApprover) public {
// Register once
⋮----
// Expect revert when register again
⋮----
/// @notice `operator` registers via calling `DelegationManager.registerAsOperator(delegationApprover, metadataURI)`
/// Should be able to set any parameters, other than too high value for `stakerOptOutWindowBlocks`
/// The set parameters should match the desired parameters (correct storage update)
/// Operator becomes delegated to themselves
/// Properly emits events – especially the `OperatorRegistered` event, but also `StakerDelegated` & `DelegationApproverUpdated` events
/// Reverts appropriately if operator was already delegated to someone (including themselves, i.e. they were already an operator)
/// @param operator and @param delegationApprover are fuzzed inputs
function testFuzz_registerAsOperator(address operator, address delegationApprover, string memory metadataURI)
⋮----
// Storage checks
⋮----
/// @notice Register two separate operators shouldn't revert
function testFuzz_registerAsOperator_TwoSeparateOperatorsRegister(
⋮----
// register operator1 with expected emits
⋮----
// register operator2 with expected emits
⋮----
// @notice Verifies that a staker who is actively delegated to an operator cannot register as an operator (without first undelegating, at least)
function testFuzz_Revert_registerAsOperator_cannotRegisterWhileDelegated(address staker, address delegationApprover)
⋮----
// register *this contract* as an operator
⋮----
// delegate from the `staker` to the operator
⋮----
// expect revert if attempt to register as operator
⋮----
/// @notice Add test for registerAsOperator where the operator has existing deposits in strategies
/// Assert:
///     depositShares == operatorShares == withdrawableShares
///     check operatorDetails hash encode matches the operatorDetails hash stored (call view function)
function testFuzz_registerAsOperator_withDeposits(Randomness r) public rand(r) {
⋮----
// Set staker shares in StrategyManager
⋮----
// register operator, their own staker depositShares should increase their operatorShares
⋮----
// check depositShares == operatorShares == withdrawableShares
⋮----
/// @notice Tests that an operator can modify their OperatorDetails by calling `DelegationManager.modifyOperatorDetails`
/// Should be able to set any parameters, other than setting their `earningsReceiver` to the zero address or too high value for `stakerOptOutWindowBlocks`
⋮----
/// Properly emits an `DelegationApproverUpdated` event
/// Reverts appropriately if the caller is not an operator
/// Reverts if operator tries to decrease their `stakerOptOutWindowBlocks` parameter
/// @param delegationApprover1 and @param delegationApprover2 are fuzzed inputs
function testFuzz_modifyOperatorParameters(address delegationApprover1, address delegationApprover2) public {
⋮----
// or else the transition is disallowed
⋮----
// @notice Tests that an address which is not an operator cannot successfully call `updateOperatorMetadataURI`.
function test_Revert_updateOperatorMetadataUri_notRegistered() public {
⋮----
function test_Revert_updateOperatorMetadataUri_notOperator() public {
⋮----
/// @notice Verifies that a staker cannot call cannot modify their `OperatorDetails` without first registering as an operator
/// @dev This is an important check to ensure that our definition of 'operator' remains consistent, in particular for preserving the
/// invariant that 'operators' are always delegated to themselves
function testFuzz_UpdateOperatorMetadataURI(string memory metadataURI) public {
⋮----
// call `updateOperatorMetadataURI` and check for event
⋮----
function testFuzz_UAM_modifyOperatorDetails(address delegationApprover) public {
// Set admin
⋮----
// Modify operator details
⋮----
// Check storage
⋮----
function testFuzz_UAM_updateOperatorMetadataURI(string memory metadataURI) public {
⋮----
contract DelegationManagerUnitTests_delegateTo is DelegationManagerUnitTests {
⋮----
function test_Revert_WhenPaused() public {
⋮----
/// @notice Delegates from `staker` to an operator, then verifies that the `staker` cannot delegate to another `operator` (at least without first undelegating)
function testFuzz_Revert_WhenDelegateWhileDelegated(
⋮----
// delegate from the staker to an operator
⋮----
// try to delegate again and check that the call reverts
⋮----
/// @notice Verifies that `staker` cannot delegate to an unregistered `operator`
function testFuzz_Revert_WhenDelegateToUnregisteredOperator(Randomness r) public rand(r) {
⋮----
// try to delegate and check that the call reverts
⋮----
/// @notice `staker` delegates to an operator who does not require any signature verification (i.e. the operator’s `delegationApprover` address is set to the zero address)
/// via the `staker` calling `DelegationManager.delegateTo`
/// The function should pass with any `operatorSignature` input (since it should be unused)
/// Assertion checks
/// - Properly emitted events from `delegateTo`
/// - depositShares incremented for staker correctly
/// - withdrawableShares are correct
/// - depositScalingFactor is updated correctly
/// - operatorShares increase by depositShares amount
/// - defaultOperator is an operator, staker is delegated to defaultOperator, staker is not an operator
function testFuzz_OperatorWhoAcceptsAllStakers_StrategyManagerShares(
⋮----
// verify that the salt hasn't been used before
⋮----
// verify that the salt is still marked as unused (since it wasn't checked or used)
⋮----
/// via the `staker` calling `DelegationManager.delegateTo`. `staker` holds beaconChainETHStrategy Shares
⋮----
/// Assertion Checks
⋮----
/// - That the staker withdrawableShares is <= operatorShares (less due to rounding from non-WAD maxMagnitude)
function testFuzz_OperatorWhoAcceptsAllStakers_beaconChainStrategyShares(
⋮----
// Set the operators magnitude
⋮----
// Set staker shares in BeaconChainStrategy
⋮----
/// but it should revert as the strategy has been fully slashed for the operator.
⋮----
/// - staker is not delegated to defaultOperator afterwards
/// - staker is not delegated
/// - staker is not registered as an operator
/// - salt is not spent
function testFuzz_Revert_OperatorWhoAcceptsAllStakers_AlreadySlashed100Percent_StrategyManagerShares(Randomness r) public rand(r) {
⋮----
// Set the operators magnitude to be 0
⋮----
/// but it should revert as the beaconChainStrategy has been fully slashed for the operator.
⋮----
/// - beaconChainETHStrategy shares are unchanged for the operator
⋮----
function testFuzz_Revert_OperatorWhoAcceptsAllStakers_AlreadySlashed100Percent_BeaconChainStrategyShares(
⋮----
// Set the operators magnitude for native restaking to be 0
⋮----
/// and the strategy has already been slashed for the operator.
⋮----
function testFuzz_OperatorWhoAcceptsAllStakers_AlreadySlashed_StrategyManagerShares(Randomness r) public rand(r) {
⋮----
// Expected staker scaling factor
⋮----
/// and the strategy has already been slashed for the operator. `staker` holds beaconChainETHStrategy Shares
⋮----
function testFuzz_OperatorWhoAcceptsAllStakers_AlreadySlashed_beaconChainStrategyShares(Randomness r) public rand(r) {
⋮----
// Register and set operator's magnitude
⋮----
// delegate from the `staker` to the operator, check for events emitted
⋮----
/// and the strategy has already been slashed for the operator. `staker` holds beaconChainETHStrategy Shares and has been
/// slashed on the beaconChain resulting in a non-WAD beaconChainSlashingFactor.
⋮----
/// - operatorShares increase by withdrawableShares amount
⋮----
function testFuzz_OperatorWhoAcceptsAllStakers_AlreadySlashedAVSAndBeaconChain_beaconChainStrategyShares(Randomness r) public rand(r) {
⋮----
/// Similar to tests above but now with staker who has both EigenPod and StrategyManager shares.
/// Assertion Checks for strategyMock and beaconChainETHStrategy
⋮----
function testFuzz_OperatorWhoAcceptsAllStakers_BeaconChainAndStrategyManagerShares(
⋮----
// Set staker shares in BeaconChainStrategy and StrategyManager
⋮----
/// @notice `defaultStaker` delegates to an operator who does not require any signature verification (i.e. the operator’s `delegationApprover` address is set to the zero address)
/// via the `defaultStaker` calling `DelegationManager.delegateTo`
⋮----
/// The operator has been slashed prior to deposit for both strategies.
⋮----
/// - defaultOperator is an operator, defaultStaker is delegated to defaultOperator, defaultStaker is not an operator
/// - That the defaultStaker withdrawableShares is <= operatorShares (less due to rounding from non-WAD maxMagnitude)
function testFuzz_OperatorWhoAcceptsAllStakers_AlreadySlashed_BeaconChainAndStrategyManagerShares(Randomness r) public rand(r) {
// 1. register operator and setup values, magnitudes
⋮----
// 2. Set staker shares in BeaconChainStrategy and StrategyManager
⋮----
// 3. delegate from the `staker` to the operator with expected emitted events
⋮----
// 4. Assert correct end state values
⋮----
/// @notice `staker` delegates to a operator who does not require any signature verification similar to test above.
/// In this scenario, staker doesn't have any delegatable shares and operator shares should not increase. Staker
/// should still be correctly delegated to the operator after the call.
function testFuzz_OperatorWhoAcceptsAllStakers_ZeroDelegatableShares(
⋮----
/// @notice Like `testDelegateToOperatorWhoRequiresECDSASignature` but using an invalid expiry on purpose and checking that reversion occurs
function testFuzz_Revert_WhenOperatorWhoRequiresECDSASignature_ExpiredDelegationApproverSignature(Randomness r) public rand(r) {
⋮----
// roll to a very late timestamp
⋮----
// calculate the delegationSigner's signature
⋮----
/// @notice Like `testDelegateToOperatorWhoRequiresECDSASignature` but undelegating after delegating and trying the same approveSignature
/// and checking that reversion occurs with the same salt
function testFuzz_Revert_WhenOperatorWhoRequiresECDSASignature_PreviouslyUsedSalt(Randomness r) public rand(r) {
⋮----
// delegate from the `staker` to the operator, undelegate, and then try to delegate again with same approversalt
// to check that call reverts
⋮----
/// @notice Like `testDelegateToOperatorWhoRequiresECDSASignature` but using an incorrect signature on purpose and checking that reversion occurs
function testFuzz_Revert_WhenOperatorWhoRequiresECDSASignature_WithBadSignature(Randomness random) public rand(random) {
⋮----
// calculate the signature
⋮----
// mess up the signature by flipping v's parity
⋮----
// try to delegate from the `staker` to the operator, and check reversion
⋮----
/// @notice `staker` delegates to an operator who requires signature verification through an EOA (i.e. the operator’s `delegationApprover` address is set to a nonzero EOA)
⋮----
/// The function should pass *only with a valid ECDSA signature from the `delegationApprover`, OR if called by the operator or their delegationApprover themselves
/// Properly emits a `StakerDelegated` event
/// Staker is correctly delegated after the call (i.e. correct storage update)
/// Reverts if the staker is already delegated (to the operator or to anyone else)
/// Reverts if the ‘operator’ is not actually registered as an operator
function testFuzz_OperatorWhoRequiresECDSASignature(Randomness r) public rand(r) {
⋮----
// verify that the salt is marked as used
⋮----
/// Operator shares should increase by the amount of shares delegated
⋮----
function testFuzz_OperatorWhoRequiresECDSASignature_StrategyManagerShares(Randomness r) public rand(r) {
⋮----
/// Operator beaconShares should increase by the amount of shares delegated if beaconShares > 0
⋮----
function testFuzz_OperatorWhoRequiresECDSASignature_BeaconChainStrategyShares(Randomness r) public rand(r) {
⋮----
/// Operator beaconshares should increase by the amount of beaconShares delegated if beaconShares > 0
/// Operator strategy manager shares should icnrease by amount of shares
⋮----
function testFuzz_OperatorWhoRequiresECDSASignature_BeaconChainAndStrategyManagerShares(Randomness r) public rand(r) {
⋮----
// filter inputs, since this will fail when the staker is already registered as an operator
⋮----
/// @notice delegateTo test with operator's delegationApprover address set to a contract address
/// and check that reversion occurs when the signature is expired
function testFuzz_Revert_WhenOperatorWhoRequiresEIP1271Signature_ExpiredDelegationApproverSignature(Randomness r) public rand(r) {
⋮----
// roll to a late timestamp
⋮----
// create the signature struct
⋮----
/// and check that reversion occurs when the signature approverSalt is already used.
/// Performed by delegating to operator, undelegating, and trying to reuse the same signature
function testFuzz_Revert_WhenOperatorWhoRequiresEIP1271Signature_PreviouslyUsedSalt(Randomness r) public rand(r) {
⋮----
// Reusing same signature should revert with salt already being used
⋮----
/// @notice delegateTo test with operator's delegationApprover address set to a contract address that
/// is non compliant with EIP1271
function testFuzz_Revert_WhenOperatorWhoRequiresEIP1271Signature_NonCompliantWallet(Randomness r) public rand(r) {
⋮----
// deploy a ERC1271MaliciousMock contract that will return an incorrect value when called
⋮----
// because the ERC1271MaliciousMock contract returns the wrong amount of data, we get a low-level "EvmError: Revert" message here rather than the error message bubbling up
⋮----
/// returns a value other than the EIP1271 "magic bytes" and checking that reversion occurs appropriately
function testFuzz_Revert_WhenOperatorWhoRequiresEIP1271Signature_IsValidSignatureFails(Randomness r) public rand(r) {
⋮----
// deploy a ERC1271WalletMock contract that will return an incorrect value when called
// owner is the 0 address
⋮----
// calculate the delegationSigner's but this is not the correct signature from the wallet contract
// since the wallet owner is address(1)
⋮----
// Signature should fail as the wallet will not return EIP1271_MAGICVALUE
⋮----
/// @notice `staker` delegates to an operator who requires signature verification through an EIP1271-compliant contract (i.e. the operator’s `delegationApprover` address is
/// set to a nonzero and code-containing address) via the `staker` calling `DelegationManager.delegateTo`
/// The function uses OZ's ERC1271WalletMock contract, and thus should pass *only when a valid ECDSA signature from the `owner` of the ERC1271WalletMock contract,
/// OR if called by the operator or their delegationApprover themselves
⋮----
function testFuzz_OperatorWhoRequiresEIP1271Signature(Randomness r) public rand(r) {
⋮----
// check that the nonce incremented appropriately
⋮----
contract DelegationManagerUnitTests_increaseDelegatedShares is DelegationManagerUnitTests {
⋮----
/// @notice Verifies that `DelegationManager.increaseDelegatedShares` reverts if not called by the StrategyManager nor EigenPodManager
function testFuzz_Revert_increaseDelegatedShares_invalidCaller(Randomness r) public rand(r) {
⋮----
/// @notice Verifies that `DelegationManager.increaseDelegatedShares` reverts when operator slashed 100% for a strategy
/// and the staker has deposits in that strategy
function testFuzz_Revert_increaseDelegatedShares_slashedOperator100Percent(Randomness r) public rand(r) {
⋮----
// Register operator
⋮----
// Set operator magnitude
⋮----
/// and the staker has deposits in that strategy. In this test case, the staker was initially deposited and delegated
/// to the operator before the operator was slashed 100%.
/// @dev Checks that withdrawable shares after 100% slashed is 0
/// @dev Checks that as a staker, redepositing after 100% slashed reverts
function testFuzz_Revert_increaseDelegatedShares_slashedOperator100PercentWithExistingStaker(Randomness r) public rand(r) {
⋮----
// 1. Register operator with initial operator magnitude and delegate staker to operator
⋮----
// 2. set staker initial shares and increase delegated shares
⋮----
// 3. Now set operator magnitude to 0 (100% slashed)
⋮----
// 4. Try to "redeposit" and expect a revert since strategy is 100% slashed
// staker's withdrawable shares should also be 0 now
⋮----
/// @notice Verifies that there is no change in operatorShares if the staker is not delegated
function testFuzz_increaseDelegatedShares_noop(Randomness r) public rand(r) {
⋮----
/// @notice Verifies that `DelegationManager.increaseDelegatedShares` properly increases the delegated `shares` that the operator
/// who the `staker` is delegated to has in the strategy
/// Asserts:
/// - depositScalingFactor, depositShares, withdrawableShares, operatorShares after deposit
/// - correct operator shares after deposit
///
/// @dev Checks that there is no change if the staker is not delegated
function testFuzz_increaseDelegatedShares(Randomness r) public rand(r) {
⋮----
// delegate from the `staker` to the operator *if `delegateFromStakerToOperator` is 'true'*
⋮----
// deposit and increase delegated shares
⋮----
// Assert correct end state values
⋮----
function testFuzz_increaseDelegatedShares_beaconChainShares(Randomness r) public rand(r) {
⋮----
function testFuzz_increaseDelegatedShares_slashedOperator(Randomness r) public rand(r) {
⋮----
// Assert correct values
⋮----
/// @notice Verifies that `DelegationManager.increaseDelegatedShares` properly increases the delegated `shares` for the
/// `defaultOperator` who the staker is delegated to. Asserts for proper events emitted and correct withdrawable shares,
/// despoitScalingFactor for the staker, and operator shares after deposit.
function testFuzz_increaseDelegatedShares_slashedOperatorAndBeaconChainShares(Randomness r) public rand(r) {
⋮----
/// @notice Verifies that `DelegationManager.increaseDelegatedShares` doesn't revert when operator slashed 100% for a strategy
/// and the staker has deposits in a separate strategy
function testFuzz_increaseDelegatedShares_slashedOperator100Percent(Randomness r) public rand(r) {
⋮----
// Set operator magnitude for 100% slashed strategy
⋮----
// Set operator magnitude for non-100% slashed strategy
⋮----
// deposit and increaseDelegatedShares
⋮----
/// @notice A unique test setup where impact of rounding can clearly be observed here.
/// After making the initial deposit of 44182209037560531097078597505 shares, and the operator's magnitude is set to 999999999999990009,
/// Each subsequent deposit amount of 1000 actually results in LESS withdrawable shares for the staker. There in an increasing drift
/// between the operator's shares and the staker's withdrawable shares.
/// The test below results in a drift difference of 4.418e13
function test_increaseDelegatedShares_depositRepeatedly() public {
⋮----
// Set the staker deposits in the strategies
⋮----
// delegate from the `defaultStaker` to the operator
⋮----
contract DelegationManagerUnitTests_decreaseDelegatedShares is DelegationManagerUnitTests {
⋮----
function testFuzz_Revert_decreaseDelegatedShares_invalidCaller(Randomness r) public rand(r) {
⋮----
function testFuzz_decreaseDelegatedShares_noop(Randomness r) public rand(r) {
⋮----
/// @notice Verifies that `decreaseDelegatedShares` properly updates the staker's withdrawable shares
/// and their delegated operator's shares are decreased by the correct amount.
/// Ensures that after the decrease, the staker's withdrawableShares <= operatorShares,
/// preventing any underflow for the operator's shares if they were all to be withdrawn.
function testFuzz_decreaseDelegatedShares_nonSlashedOperator(Randomness r) public rand(r) {
⋮----
// 1. Setup staker and delegate to operator
⋮----
// 2. Perform beaconChain slash + decreaseDelegatedShares()
⋮----
// expected operatorShares decreased for event
⋮----
// expected events
⋮----
// 3. Assert correct values
⋮----
/// @notice Similar test to `testFuzz_decreaseDelegatedShares_nonSlashedOperator` but with
/// a pre-slashed operator (maxMagnitude < WAD).
/// Verifies that `decreaseDelegatedShares` properly updates the staker's withdrawable shares
⋮----
function testFuzz_decreaseDelegatedShares_slashedOperator(Randomness r) public rand(r) {
⋮----
/// @notice Verifies that if a staker's beaconChainSlashingFactor is reduced to 0 if their entire balance
/// is slashed. Their withdrawable shares should be 0 afterwards and decreasing operatorShares should
/// not underflow and revert either.
function testFuzz_decreaseDelegatedShares_entireBalance(Randomness r) public rand(r) {
⋮----
contract DelegationManagerUnitTests_undelegate is DelegationManagerUnitTests {
⋮----
// @notice Verifies that undelegating is not possible when the "undelegation paused" switch is flipped
function testFuzz_Revert_undelegate_paused(Randomness r) public rand(r) {
⋮----
function testFuzz_Revert_undelegate_notDelegated(Randomness r) public rand(r) {
⋮----
// @notice Verifies that an operator cannot undelegate from themself (this should always be forbidden)
function testFuzz_Revert_undelegate_stakerIsOperator(Randomness r) public rand(r) {
⋮----
/// @notice verifies that `DelegationManager.undelegate` reverts if trying to undelegate an operator from themselves
function testFuzz_Revert_undelegate_operatorCannotForceUndelegateThemself(Randomness r) public rand(r) {
⋮----
// register *this contract* as an operator with the default `delegationApprover`
⋮----
// try to call the `undelegate` function and check for reversion
⋮----
/// @notice Verifies that the `undelegate` function has proper access controls (can only be called by the operator who the `staker` has delegated
/// to or the operator's `delegationApprover`), or the staker themselves
function testFuzz_Revert_undelegate_invalidCaller(Randomness r) public rand(r) {
⋮----
/// Staker is undelegated from an operator, via a call to `undelegate`, properly originating from the staker's address.
/// Reverts if the staker is themselves an operator (i.e. they are delegated to themselves)
/// Does nothing if the staker is already undelegated
/// Properly undelegates the staker, i.e. the staker becomes “delegated to” the zero address, and `isDelegated(staker)` returns ‘false’
/// Emits a `StakerUndelegated` event
function testFuzz_undelegate_noDelegateableShares(Randomness r) public rand(r) {
⋮----
// register *this contract* as an operator and delegate from the `staker` to them
⋮----
/// @notice Verifies that the `undelegate` function allows for a force undelegation
function testFuzz_undelegate_forceUndelegation_noDelegateableShares(Randomness r) public rand(r) {
⋮----
/// @notice Verifies that the `undelegate` function properly queues a withdrawal for all shares of the staker
function testFuzz_undelegate_nonSlashedOperator(Randomness r) public rand(r) {
⋮----
// Format queued withdrawal
⋮----
// Undelegate the staker
⋮----
// Checks - delegation status
⋮----
// Checks - operator & staker shares
⋮----
/// @notice The operator should have its shares slashed prior to the staker's deposit
function testFuzz_undelegate_preSlashedOperator(Randomness r) public rand(r) {
⋮----
// register *this contract* as an operator & set its slashed magnitude
⋮----
// delegate from the `staker` to them
⋮----
// Calculate operatorShares decreased, may be off of shares due to rounding
⋮----
function testFuzz_undelegate_slashedWhileStaked(Randomness r) public rand(r) {
⋮----
// Get withdrawable shares
⋮----
/// @notice Verifies that the `undelegate` function properly undelegates a staker even though their shares
/// were slashed entirely.
function testFuzz_undelegate_slashedOperator100PercentWhileStaked(Randomness r) public rand(r) {
⋮----
// Get withdrawable and deposit shares
⋮----
function testFuzz_undelegate_slashedOperatorCloseTo100(Randomness r) public rand(r) {
⋮----
// 1. register *this contract* as an operator
⋮----
// 2. Stakers deposits in the strategyMock
⋮----
// 3. Delegate from the `stakers` to the operator
⋮----
// 4. Slash operator - Set operator magnitude and call burnOperatorShares
⋮----
// 5. Undelegate the stakers with expected events
⋮----
// 6. Checks - delegation status and staker,operator shares
⋮----
/// @notice Given an operator with slashed magnitude, delegate, undelegate, and then delegate back to the same operator with
/// completing withdrawals as shares. This should result in the operatorShares after the second delegation being <= the shares from the first delegation.
function testFuzz_undelegate_delegateAgainWithRounding(Randomness r) public rand(r) {
⋮----
// set magnitude to 66% to ensure rounding when calculating `toShares`
⋮----
// // Re-delegate the staker to the operator again. The shares should have increased but may be less than from before due to rounding
⋮----
// complete withdrawal as shares, should add back delegated shares to operator due to delegating again
⋮----
contract DelegationManagerUnitTests_redelegate is DelegationManagerUnitTests {
⋮----
// @notice Verifies that redelegating is not possible when the "delegation paused" switch is flipped
function testFuzz_Revert_redelegate_delegatePaused(Randomness r) public {
⋮----
// @notice Verifies that redelegating is not possible when the "undelegation paused" switch is flipped
function testFuzz_Revert_redelegate_undelegatePaused(Randomness r) public {
⋮----
function testFuzz_Revert_redelegate_notDelegated(Randomness r) public {
⋮----
function testFuzz_Revert_redelegate_stakerIsOperator(Randomness r) public {
⋮----
/// @notice Verifies that `staker` cannot redelegate to an unregistered `operator`
function testFuzz_Revert_redelegateToUnregisteredOperator(Randomness r) public {
⋮----
function testFuzz_Revert_redelegate_ExpiredSignature(Randomness r) public {
⋮----
function testFuzz_Revert_redelegate_SpentSalt(Randomness r) public {
⋮----
// Spend salt by delegating normally first
⋮----
// redelegate to a different operator
⋮----
// Now try to redelegate to the original operator using the invalid signature
⋮----
/// @notice Verifies that the `redelegate` function properly queues a withdrawal for all shares of the staker
/// ... and delegates to a new operator
function testFuzz_redelegate_noSlashing(Randomness r) public {
⋮----
// Redelegate the staker
⋮----
/// @notice This function tests to ensure that a delegator can re-delegate to an operator after undelegating.
/// Asserts the shares after re-delegating are the same as originally. No slashing is done in this test.
function testFuzz_undelegate_redelegateWithSharesBack(Randomness r) public rand(r) {
⋮----
// 1. Set staker shares
⋮----
// 2. register operator and delegate staker to operator
⋮----
// 3. Setup queued withdrawals from `undelegate`
// queued withdrawals done for single strat as this is how undelegate queue withdraws
⋮----
beaconWithdrawal.nonce = 1; // Ensure nonce is greater for second withdrawal
⋮----
// 4. Delegate to operator again with shares added back
⋮----
// delegate first and complete withdrawal
⋮----
// complete withdrawal first and then delegate
⋮----
// 5. assert correct shares and delegation state
⋮----
contract DelegationManagerUnitTests_queueWithdrawals is DelegationManagerUnitTests {
⋮----
function test_Revert_WhenEnterQueueWithdrawalsPaused() public {
⋮----
function test_Revert_WhenQueueWithdrawalParamsLengthMismatch() public {
⋮----
function testFuzz_IgnoresWithdrawerField(address withdrawer) public {
⋮----
// set the ignored field to a different address. the dm should ignore this.
⋮----
function test_Revert_WhenEmptyStrategiesArray() public {
⋮----
/// @notice Verifies that `DelegationManager.queueWithdrawals` properly queues a withdrawal for the `withdrawer`
/// from the `strategy` for the `sharesAmount`.
/// - Asserts that staker is delegated to the operator
/// - Asserts that shares for delegatedTo operator are decreased by `sharesAmount`
/// - Asserts that staker cumulativeWithdrawalsQueued nonce is incremented
/// - Checks that event was emitted with correct withdrawalRoot and withdrawal
function testFuzz_queueWithdrawal_SingleStrat_nonSlashedOperator(Randomness r) public rand(r) {
⋮----
// sharesAmounts is single element so returns single strategy
⋮----
// queueWithdrawals
⋮----
/// from the `strategy` for the `sharesAmount`. Operator is slashed prior to the staker's deposit
⋮----
function testFuzz_queueWithdrawal_SingleStrat_preSlashedOperator(Randomness r) public rand(r) {
⋮----
// Slash the operator
⋮----
// Deposit for staker & delegate
⋮----
/// from the `strategy` for the `sharesAmount`. Operator is slashed while the staker is deposited
⋮----
function testFuzz_queueWithdrawal_SingleStrat_slashedWhileStaked(Randomness r) public rand(r) {
⋮----
// Assertions on amount burned
⋮----
/// @notice Verifies that `DelegationManager.queueWithdrawals` queues an empty withdrawal for the `withdrawer`
/// from the `strategy` for the `sharesAmount` since the Operator is slashed 100% while the staker is deposited
/// - Asserts that queuing a withdrawal results in an empty withdrawal when the operator is slashed 100%
/// - Asserts that staker withdrawableShares after is 0
⋮----
function testFuzz_queueWithdrawal_SingleStrat_slashed100PercentWhileStaked(Randomness r) public rand(r) {
⋮----
// Register operator, deposit for staker & delegate
⋮----
depositSharesToWithdraw: 0 // expected 0 since slashed 100%
⋮----
// queueWithdrawals should result in an empty withdrawal
⋮----
/// with multiple strategies and sharesAmounts. Operator has default WAD maxMagnitude for all strategies.
/// Depending on number of strategies randomized, deposits sharesAmounts into each strategy for the staker and delegates to operator.
/// For each strategy,
⋮----
/// - Asserts that the staker withdrawal is queued both with the root and actual Withdrawal struct in storage
/// - Asserts that the operator shares decrease by the expected withdrawn shares
⋮----
function testFuzz_queueWithdrawal_MultipleStrats_nonSlashedOperator(Randomness r) public rand(r) {
⋮----
// Before queueWithdrawal state values
⋮----
// Post queueWithdrawal state values
⋮----
/// with multiple strategies and sharesAmounts. Operator has random maxMagnitudes for each strategy.
⋮----
/// - Asserts that shares for delegatedTo operator are decreased by `depositAmount`
⋮----
function testFuzz_queueWithdrawal_MultipleStrats_preSlashedOperator(Randomness r) public rand(r) {
// 1. Setup
// - fuzz numbers of strategies, deposit and withdraw amounts, and prev/new magnitudes for each strategy respectively
// - deposit into strategies, delegate to operator
⋮----
// Check deposit state for all strategies after delegating
⋮----
// 2. Setup and call queued withdrawals
⋮----
// expected events emitted
⋮----
// 3. call `DelegationManager.queueWithdrawals`
⋮----
// 4. Post queueWithdrawal state values
⋮----
/// After depositing, the operator gets slashed for each of the strategies and has new maxMagnitudes set.
⋮----
function testFuzz_queueWithdrawal_MultipleStrats_slashedWhileStaked(Randomness r) public rand(r) {
⋮----
// 2. Slash operator while staker is delegated and staked
⋮----
// Assert correct amount of shares slashed from operator
⋮----
// 3. Setup and call queued withdrawals
⋮----
// 4. call `DelegationManager.queueWithdrawals`
⋮----
// 5. Post queueWithdrawal state values
⋮----
// /**
//  * @notice Same test as `testFuzz_queueWithdrawal_MultipleStrats_slashedWhileStaked` but with one strategy having 0 newMaxMagnitude
//  * - Asserts that the strategy with 0 newMaxMagnitude has 0 delegated shares before and after withdrawal
//  * - Asserts that the staker withdrawn shares for the strategy with 0 newMaxMagnitude is 0
//  */
// function testFuzz_queueWithdrawal_MultipleStrats__slashed100PercentWhileStaked(Randomness r) public rand(r) {
//     // 1. Setup
//     // - fuzz numbers of strategies, deposit and withdraw amounts, and prev/new magnitudes for each strategy respectively
//     // - deposit into strategies, delegate to operator
//     uint32 numStrats = r.Uint32(1, 32);
//     IStrategy[] memory strategies = r.StrategyArray(numStrats);
//     bool depositBeaconChainShares = r.Boolean();
//     if (depositBeaconChainShares) strategies[numStrats - 1] = beaconChainETHStrategy;
//     (uint[] memory depositAmounts, uint[] memory withdrawalAmounts, uint64[] memory prevMaxMagnitudes, uint64[] memory newMaxMagnitudes)
//     = _fuzzDepositWithdrawalAmounts({r: r, numStrategies: numStrats});
//     // randomly choose strategy to have 0 newMaxMagnitude
//     uint zeroMagnitudeIndex = r.Uint256(0, numStrats - 1);
//     newMaxMagnitudes[zeroMagnitudeIndex] = 0;
⋮----
//     _registerOperatorWithBaseDetails(defaultOperator);
//     allocationManagerMock.setMaxMagnitudes(defaultOperator, strategies, prevMaxMagnitudes);
//     _depositIntoStrategies(defaultStaker, strategies, depositAmounts);
//     _delegateToOperatorWhoAcceptsAllStakers(defaultStaker, defaultOperator);
//     // Check deposit state for all strategies after delegating
//     for (uint i = 0; i < strategies.length; ++i) {
//         _assertDeposit({
//             staker: defaultStaker,
//             operator: defaultOperator,
//             strategy: strategies[i],
//             operatorSharesBefore: 0,
//             withdrawableSharesBefore: 0,
//             depositSharesBefore: 0,
//             prevDsf: WAD,
//             depositAmount: depositAmounts[i]
//         });
//     }
⋮----
//     // 2. Slash operator while staker is delegated and staked
//     uint nonceBefore = delegationManager.cumulativeWithdrawalsQueued(defaultStaker);
//     uint[] memory slashedOperatorShares = new uint[](strategies.length);
//     allocationManagerMock.setMaxMagnitudes(defaultOperator, strategies, newMaxMagnitudes);
//     cheats.startPrank(address(allocationManagerMock));
//     for (uint i = 0; i < strategies.length; i++) {
//         uint operatorSharesBefore = delegationManager.operatorShares(defaultOperator, strategies[i]);
//         delegationManager.slashOperatorShares(
//             defaultOperator, defaultOperatorSet, defaultSlashId, strategies[i].toArray(), prevMaxMagnitudes[i].toArrayU64(), newMaxMagnitudes[i].toArrayU64()
//         );
⋮----
//         // Assertions on amount burned
//         (slashedOperatorShares[i],) = _assertOperatorSharesAfterSlash({
⋮----
//             operatorSharesBefore: operatorSharesBefore,
//             prevMaxMagnitude: prevMaxMagnitudes[i],
//             newMaxMagnitude: newMaxMagnitudes[i]
⋮----
//         // additional assertion checks for strategy that was slashed 100%
//         if (zeroMagnitudeIndex == i) {
//             assertEq(slashedOperatorShares[i], operatorSharesBefore, "expected slashed operator shares to be full amount");
//             assertEq(delegationManager.operatorShares(defaultOperator, strategies[i]), 0, "expected operator shares to be 0");
//         }
⋮----
//     cheats.stopPrank();
⋮----
//     // 3. Setup and call queued withdrawals
//     {
//         (QueuedWithdrawalParams[] memory queuedWithdrawalParams, Withdrawal memory withdrawal, bytes32 withdrawalRoot) =
//             _setUpQueueWithdrawals({staker: defaultStaker, strategies: strategies, depositWithdrawalAmounts: withdrawalAmounts});
//         // expected events emitted
//         _queueWithdrawals_expectEmit(
//             QueueWithdrawalsEmitStruct({
//                 staker: defaultStaker,
//                 operator: defaultOperator,
//                 queuedWithdrawalParams: queuedWithdrawalParams,
//                 withdrawal: withdrawal,
//                 withdrawalRoot: withdrawalRoot
//             })
⋮----
//         // 4. call `DelegationManager.queueWithdrawals`
//         _queueWithdrawals(defaultStaker, queuedWithdrawalParams, withdrawal);
//         _assertQueuedWithdrawalExists(defaultStaker, withdrawal);
⋮----
//     // 5. Post queueWithdrawal state values
⋮----
//         if (zeroMagnitudeIndex == i) assertEq(newMaxMagnitudes[i], 0, "expected new max magnitude to be 0");
//         _assertWithdrawal({
⋮----
//             operatorSharesBefore: depositAmounts[i] - slashedOperatorShares[i],
//             depositSharesBefore: depositAmounts[i],
//             depositSharesWithdrawn: withdrawalAmounts[i],
//             depositScalingFactor: uint(WAD).divWad(prevMaxMagnitudes[i]),
//             slashingFactor: zeroMagnitudeIndex == i ? 0 : newMaxMagnitudes[i]
⋮----
//     assertEq(delegationManager.delegatedTo(defaultStaker), defaultOperator, "staker should be delegated to operator");
//     assertEq(nonceBefore + 1, delegationManager.cumulativeWithdrawalsQueued(defaultStaker), "staker nonce should have incremented");
// }
⋮----
contract DelegationManagerUnitTests_completeQueuedWithdrawal is DelegationManagerUnitTests {
⋮----
function test_Revert_WhenExitWithdrawalQueuePaused() public {
⋮----
/* bytes32 withdrawalRoot */
⋮----
// single withdrawal interface
⋮----
// multiple Withdrawal interface
⋮----
function test_Revert_WhenInputArrayLengthMismatch() public {
⋮----
// Roll to completion block
⋮----
// resize tokens array
⋮----
// check that the withdrawal completes otherwise
⋮----
function test_Revert_WhenWithdrawerNotCaller(Randomness r) public rand(r) {
⋮----
function test_Revert_WhenInvalidWithdrawalRoot() public {
⋮----
/// @notice should revert if MIN_WITHDRAWAL_DELAY_BLOCKS has not passed, and if
/// delegationManager.getCompletableTimestamp returns a value greater than MIN_WITHDRAWAL_DELAY_BLOCKS
/// then it should revert if the validBlockNumber has not passed either.
function test_Revert_WhenWithdrawalDelayNotPassed(Randomness r) public rand(r) {
⋮----
// prank as withdrawer address
⋮----
/// @notice Verifies that when we complete a withdrawal as shares after a full slash, we clear the withdrawal
function test_clearWithdrawal_fullySlashed() public {
⋮----
// Queue withdrawal
⋮----
// Warp to just before the MIN_WITHDRAWAL_DELAY_BLOCKS
⋮----
// Slash all of operator's shares
⋮----
// Complete withdrawal as shares and check that withdrawal was cleared
⋮----
// Assert that no shares were added back
⋮----
/// Test completing multiple queued withdrawals for a single strategy by passing in the withdrawals
function test_completeQueuedWithdrawals_MultipleWithdrawals(Randomness r) public rand(r) {
⋮----
// completeQueuedWithdrawal
⋮----
// assertion checks
⋮----
/// @notice Verifies that `DelegationManager.completeQueuedWithdrawal` properly completes a queued withdrawal for the `withdrawer`
/// for a single strategy.
/// - Asserts that the withdrawalRoot is True before `completeQueuedWithdrawal` and False after
/// - Asserts that event `WithdrawalCompleted` is emitted with withdrawalRoot
/// if receiveAsTokens is true
/// - Asserts operatorShares is unchanged after `completeQueuedWithdrawal`
/// - Asserts that the staker's withdrawable shares, deposit shares, and depositScalingFactors are unchanged
/// if receiveAsTokens is false
/// - Asserts operatorShares is increased correctly after `completeQueuedWithdrawal`
/// - Asserts that the staker's withdrawable shares, deposit shares, and depositScalingFactors are updated correctly
function test_completeQueuedWithdrawal_SingleStrat(Randomness r) public rand(r) {
⋮----
/// for a single strategy. Withdraws as tokens so there are no operator shares increase.
⋮----
/// - Asserts operatorShares is decreased after the operator is slashed
/// - Checks that event `WithdrawalCompleted` is emitted with withdrawalRoot
/// - Asserts that the shares the staker completed withdrawal for are less than what is expected since its operator is slashed
function test_completeQueuedWithdrawal_SingleStrat_slashOperatorDuringQueue(Randomness r) public rand(r) {
⋮----
// Deposit Staker
⋮----
// Register operator and delegate to it
⋮----
// Slash operator while staker has queued withdrawal
⋮----
// Complete queue withdrawal
⋮----
/// for the BeaconChainStrategy. Withdraws as tokens so there are no operator shares increase.
⋮----
/// - Asserts operatorShares is decreased after staker is slashed
⋮----
/// - Asserts that the shares the staker completed withdrawal for are less than what is expected since the staker is slashed during queue
function test_completeQueuedWithdrawal_BeaconStrat_slashStakerDuringQueue(Randomness r) public rand(r) {
⋮----
// Slash the staker for beacon chain shares while it has queued a withdrawal
// simulate the operations done in EigenPodManager._reduceSlashingFactor
⋮----
slashingFactors: uint(WAD).toArrayU256(), // beaconChainSlashingFactor is separate from slashingFactors input
⋮----
/// - Asserts operatorShares is decreased after staker is slashed and after the operator is slashed
⋮----
/// - Asserts that the shares the staker completed withdrawal for are less than what is expected since both the staker and its operator are slashed during queue
function test_completeQueuedWithdrawal_BeaconStratWithdrawAsTokens_slashStakerAndOperator(Randomness r) public rand(r) {
⋮----
// Slash the operator for beacon chain shares
⋮----
/// for a single strategy. Withdraws as shares so if the withdrawer is delegated, operator shares increase. In the test case, this only
/// happens if staker and withdrawer are fuzzed the same address (i.e. staker == withdrawer)
⋮----
/// - Asserts if staker == withdrawer, operatorShares increase, otherwise operatorShares are unchanged
⋮----
function testFuzz_completeQueuedWithdrawal_SingleStratWithdrawAsShares_nonSlashedOperator(Randomness r) public rand(r) {
⋮----
// Set delegationManager on strategyManagerMock so it can call back into delegationManager
⋮----
// Since staker is delegated, operatorShares get incremented
⋮----
function testFuzz_completeQueuedWithdrawals_OutOfOrderBlocking(Randomness r) public {
⋮----
// Throws `WithdrawalNotQueued`.
⋮----
contract DelegationManagerUnitTests_slashingShares is DelegationManagerUnitTests {
⋮----
/// @notice Verifies that `DelegationManager.slashOperatorShares` reverts if not called by the AllocationManager
function testFuzz_Revert_slashOperatorShares_invalidCaller(Randomness r) public rand(r) {
⋮----
/// @notice Verifies that there is no change in shares if the staker is not delegatedd
function testFuzz_Revert_slashOperatorShares_noop() public {
⋮----
/// @notice Verifies that shares are burnable for a withdrawal slashed just before the MIN_WITHDRAWAL_DELAY_BLOCKS is hit
function test_sharesBurnableAtMinDelayBlocks() public {
⋮----
// Complete withdrawal as tokens and assert that nothing is returned and withdrawal is cleared
⋮----
/// @notice Verifies getSlashableSharesInQueue returns 0 when operator is fully slashed (maxMagnitude = 0).
/// A fully slashed operator has no remaining slashable shares.
function test_getSlashableSharesInQueue_ReturnsZero_WhenFullySlashed() public {
// Register operator and set up deposits
⋮----
// Queue a withdrawal so there are shares in the queue
⋮----
// Fully slash the operator (maxMagnitude -> 0)
⋮----
// After full slashing, there are no more slashable shares - should return 0
⋮----
/// @notice Verifies that shares are NOT burnable for a withdrawal queued just before the MIN_WITHDRAWAL_DELAY_BLOCKS
function test_sharesNotBurnableWhenWithdrawalCompletable() public {
⋮----
// Warp to completion time
⋮----
// Complete withdrawal as tokens and assert that we call back into the SM with 100 tokens
⋮----
/// @notice Queues 5 withdrawals at different blocks. Then, warps such that the first 2 are completable. Validates the slashable shares
function test_slashableSharesInQueue() public {
⋮----
// Queue 5 withdrawals
⋮----
// Warp to completion time for the first 2 withdrawals
// First withdrawal queued at startBlock. Second queued at startBlock + 1
⋮----
// Get slashable shares
⋮----
depositAmount / 6 // 1 withdrawal not queued so decreased
⋮----
// Assert slashable shares
⋮----
//  * @notice Verifies that `DelegationManager.slashOperatorShares` properly decreases the delegated `shares` that the operator
//  * who the `defaultStaker` is delegated to has in the strategies
⋮----
// function testFuzz_slashOperatorShares_slashedOperator(Randomness r) public rand(r) {
//     // sanity-filtering on fuzzed input length & staker
//     IStrategy[] memory strategies = r.StrategyArray(16);
//     uint shares = r.Uint256(1, MAX_STRATEGY_SHARES);
//     uint64 prevMaxMagnitude = r.Uint64(2, WAD);
//     uint64 newMaxMagnitude = r.Uint64(1, prevMaxMagnitude);
//     bool hasBeaconChainStrategy = r.Boolean();
//     if (hasBeaconChainStrategy) {
//         // Set last strategy in array as  beacon chain strategy
//         strategies[strategies.length - 1] = beaconChainETHStrategy;
⋮----
//     // Register operator
⋮----
//     // Set the staker deposits in the strategies
//     uint[] memory sharesToSet = new uint[](strategies.length);
//     uint[] memory depositScalingFactors = new uint[](strategies.length);
⋮----
//         strategies[i] = IStrategy(random().Address());
//         sharesToSet[i] = shares;
//         depositScalingFactors[i] = uint(WAD).divWad(uint(prevMaxMagnitude));
//         _setOperatorMagnitude(defaultOperator, strategies[i], prevMaxMagnitude);
⋮----
//     // Okay to set beacon chain shares in SM mock, wont' be called by DM
//     strategyManagerMock.setDeposits(defaultStaker, strategies, sharesToSet);
//     if (hasBeaconChainStrategy) eigenPodManagerMock.setPodOwnerShares(defaultStaker, int(uint(shares)));
⋮----
//     // events expected emitted for each strategy
//     _delegateTo_expectEmit(
//         DelegateToEmitStruct({
⋮----
//             strategies: strategies,
//             depositShares: sharesToSet,
//             depositScalingFactors: depositScalingFactors
//         })
//     );
//     // delegate from the `staker` to the operator
⋮----
//     address delegatedTo = delegationManager.delegatedTo(defaultStaker);
⋮----
//     // check shares before call to `slashOperatorShares`
⋮----
//         // store delegated shares in a mapping
//         delegatedSharesBefore[strategies[i]] = delegationManager.operatorShares(delegatedTo, strategies[i]);
//         // also construct an array which we'll use in another loop
//         totalSharesForStrategyInArray[address(strategies[i])] += shares;
⋮----
//     // for each strategy in `strategies`, decrease delegated shares by `shares`
⋮----
//         cheats.startPrank(address(allocationManagerMock));
//         for (uint i = 0; i < strategies.length; ++i) {
//             uint currentShares = delegationManager.operatorShares(defaultOperator, strategies[i]);
//             uint sharesToDecrease = SlashingLib.calcSlashedAmount({
//                 operatorShares: currentShares,
//                 prevMaxMagnitude: prevMaxMagnitude,
//                 newMaxMagnitude: newMaxMagnitude
//             });
⋮----
//             cheats.expectEmit(true, true, true, true, address(delegationManager));
//             emit OperatorSharesDecreased(defaultOperator, address(0), strategies[i], sharesToDecrease);
//             delegationManager.slashOperatorShares(
//                 defaultOperator,
//                 defaultOperatorSet,
//                 defaultSlashId,
//                 strategies[i],
//                 prevMaxMagnitude,
//                 newMaxMagnitude
//             );
⋮----
//             // Also update maxMagnitude in ALM mock
//             _setOperatorMagnitude(defaultOperator, strategies[i], newMaxMagnitude);
⋮----
//             totalSharesDecreasedForStrategy[strategies[i]] += sharesToDecrease;
⋮----
//         cheats.stopPrank();
⋮----
//     // check shares after call to `slashOperatorShares`
//     (uint[] memory withdrawableShares,) = delegationManager.getWithdrawableShares(defaultStaker, strategies);
⋮----
//         uint delegatedSharesAfter = delegationManager.operatorShares(delegatedTo, strategies[i]);
//         assertEq(
//             delegatedSharesAfter,
//             delegatedSharesBefore[strategies[i]] - totalSharesDecreasedForStrategy[strategies[i]],
//             "delegated shares did not decrement correctly"
⋮----
//         _assertWithdrawableAndOperatorShares(
//             withdrawableShares[i], delegatedSharesAfter, "withdrawable and operator shares not decremented correctly"
⋮----
/// @notice Test burning shares for an operator with no queued withdrawals
/// - Asserts slashable shares before and after in queue is 0
/// - Asserts operator shares are decreased by half
function testFuzz_slashOperatorShares_NoQueuedWithdrawals(Randomness r) public rand(r) {
⋮----
// calculate burned shares, should be halved
⋮----
// Burn shares
⋮----
// Assert OperatorSharesSlashed event was emitted with correct params
⋮----
//  * @notice Test burning shares for an operator with no slashable queued withdrawals in past MIN_WITHDRAWAL_DELAY_BLOCKS window.
//  * There does exist past queued withdrawals but nothing in the queue is slashable.
//  * - Asserts slashable shares in queue right after queuing a withdrawal is the withdrawal amount
//  * and then checks that after the withdrawal window the slashable shares is 0 again.
//  * - Asserts operator shares are decreased by half after burning
//  * - Asserts that the slashable shares in queue before/after burning are 0
⋮----
// function testFuzz_slashOperatorShares_NoQueuedWithdrawalsInWindow(Randomness r) public rand(r) {
//     // 1. Randomize operator and staker info
//     // Operator info
//     address operator = r.Address();
//     uint64 newMagnitude = 5e17;
//     // First staker
//     address staker1 = r.Address();
⋮----
//     // Second Staker, will queue withdraw shares
//     address staker2 = r.Address();
//     uint depositAmount = r.Uint256(1, MAX_STRATEGY_SHARES);
//     uint withdrawAmount = r.Uint256(1, depositAmount);
⋮----
//     // 2. Register the operator, set the staker deposits, and delegate the 2 stakers to them
//     _registerOperatorWithBaseDetails(operator);
//     strategyManagerMock.addDeposit(staker1, strategyMock, shares);
//     strategyManagerMock.addDeposit(staker2, strategyMock, depositAmount);
//     _delegateToOperatorWhoAcceptsAllStakers(staker1, operator);
//     _delegateToOperatorWhoAcceptsAllStakers(staker2, operator);
⋮----
//     // 3. Queue withdrawal for staker2 and roll blocks forward so that the withdrawal is not slashable
⋮----
//         (QueuedWithdrawalParams[] memory queuedWithdrawalParams, Withdrawal memory withdrawal,) =
//             _setUpQueueWithdrawalsSingleStrat({staker: staker2, strategy: strategyMock, depositSharesToWithdraw: withdrawAmount});
//         cheats.prank(staker2);
//         delegationManager.queueWithdrawals(queuedWithdrawalParams);
⋮----
//             delegationManager.getSlashableSharesInQueue(operator, strategyMock),
//             withdrawAmount,
//             "there should be withdrawAmount slashable shares in queue"
⋮----
//         cheats.roll(withdrawal.startBlock + delegationManager.minWithdrawalDelayBlocks() + 1);
⋮----
//     uint operatorSharesBefore = delegationManager.operatorShares(operator, strategyMock);
//     uint queuedSlashableSharesBefore = delegationManager.getSlashableSharesInQueue(operator, strategyMock);
⋮----
//     // calculate burned shares, should be halved
//     // staker2 queue withdraws shares and we roll blocks to after the withdrawal is no longer slashable.
//     // Therefore amount of shares to burn should be what the staker still has remaining + staker1 shares and then
//     // divided by 2 since the operator was slashed 50%
//     uint sharesToBurn = (shares + depositAmount - withdrawAmount) / 2;
⋮----
//     // 4. Burn shares
//     _setOperatorMagnitude(operator, strategyMock, newMagnitude);
//     _slashOperatorShares_expectEmit(
//         SlashOperatorSharesEmitStruct({
//             operator: operator,
//             strategy: strategyMock,
//             sharesToDecrease: sharesToBurn,
//             sharesToBurn: sharesToBurn
⋮----
//     // Assert OperatorSharesSlashed event was emitted with correct params
//     cheats.expectEmit(true, true, true, true, address(delegationManager));
//     emit OperatorSharesSlashed(operator, strategyMock, sharesToBurn);
⋮----
//     cheats.prank(address(allocationManagerMock));
//     delegationManager.slashOperatorShares({
//         operator: operator,
//         operatorSet: defaultOperatorSet,
//         slashId: defaultSlashId,
//         strategy: strategyMock,
//         prevMaxMagnitude: WAD,
//         newMaxMagnitude: newMagnitude
//     });
⋮----
//     // 5. Assert expected values
//     uint queuedSlashableSharesAfter = delegationManager.getSlashableSharesInQueue(operator, strategyMock);
//     uint operatorSharesAfter = delegationManager.operatorShares(operator, strategyMock);
//     assertEq(queuedSlashableSharesBefore, 0, "there should be no slashable shares in queue");
//     assertEq(queuedSlashableSharesAfter, 0, "there should be no slashable shares in queue");
//     assertEq(operatorSharesAfter, operatorSharesBefore - sharesToBurn, "operator shares should be decreased by sharesToBurn");
⋮----
//  * @notice Test burning shares for an operator with slashable queued withdrawals in past MIN_WITHDRAWAL_DELAY_BLOCKS window.
//  * There exists a single withdrawal that is slashable.
⋮----
// function testFuzz_slashOperatorShares_SingleSlashableWithdrawal(Randomness r) public rand(r) {
⋮----
//     uint64 newMagnitude = 25e16;
⋮----
//     // 3. Queue withdrawal for staker2 so that the withdrawal is slashable
⋮----
//         (QueuedWithdrawalParams[] memory queuedWithdrawalParams,,) =
⋮----
//     // calculate burned shares, should be 3/4 of the original shares
//     // staker2 queue withdraws shares
⋮----
//     uint sharesToDecrease = (shares + depositAmount - withdrawAmount) * 3 / 4;
//     uint sharesToBurn = sharesToDecrease + withdrawAmount * 3 / 4;
⋮----
//             sharesToDecrease: sharesToDecrease,
⋮----
//     assertEq(queuedSlashableSharesBefore, withdrawAmount, "Slashable shares in queue should be full withdraw amount");
//     assertEq(queuedSlashableSharesAfter, withdrawAmount / 4, "Slashable shares in queue should be 1/4 withdraw amount after slashing");
//     assertEq(operatorSharesAfter, operatorSharesBefore - sharesToDecrease, "operator shares should be decreased by sharesToBurn");
⋮----
//  * There exists multiple withdrawals that are slashable.
⋮----
// function testFuzz_slashOperatorShares_MultipleSlashableWithdrawals(Randomness r) public rand(r) {
⋮----
//     // Staker and withdrawing amounts
//     address staker = r.Address();
//     uint depositAmount = r.Uint256(3, MAX_STRATEGY_SHARES);
//     uint withdrawAmount1 = r.Uint256(2, depositAmount);
//     uint withdrawAmount2 = r.Uint256(1, depositAmount - withdrawAmount1);
⋮----
//     strategyManagerMock.addDeposit(staker, strategyMock, depositAmount);
//     _delegateToOperatorWhoAcceptsAllStakers(staker, operator);
⋮----
//     // 3. Queue withdrawal for staker and roll blocks forward so that the withdrawal is not slashable
⋮----
//             _setUpQueueWithdrawalsSingleStrat({staker: staker, strategy: strategyMock, depositSharesToWithdraw: withdrawAmount1});
//         cheats.prank(staker);
⋮----
//             withdrawAmount1,
⋮----
//         (queuedWithdrawalParams, withdrawal,) =
//             _setUpQueueWithdrawalsSingleStrat({staker: staker, strategy: strategyMock, depositSharesToWithdraw: withdrawAmount2});
⋮----
//             withdrawAmount2 + withdrawAmount1,
⋮----
//     // calculate burned shares, should be halved for both operatorShares and slashable shares in queue
//     // staker queue withdraws shares twice and both withdrawals should be slashed 75%.
//     uint sharesToDecrease = (depositAmount - withdrawAmount1 - withdrawAmount2) * 3 / 4;
//     uint sharesToBurn = sharesToDecrease + (delegationManager.getSlashableSharesInQueue(operator, strategyMock) * 3 / 4);
⋮----
//     assertEq(
//         queuedSlashableSharesBefore, (withdrawAmount1 + withdrawAmount2), "Slashable shares in queue should be full withdraw amount"
⋮----
//         queuedSlashableSharesAfter,
//         (withdrawAmount1 + withdrawAmount2) / 4,
//         "Slashable shares in queue should be 1/4 withdraw amount after slashing"
⋮----
/// @notice Test burning shares for an operator with slashable queued withdrawals in past MIN_WITHDRAWAL_DELAY_BLOCKS window.
/// There exists multiple withdrawals that are slashable but queued with different maxMagnitudes at
/// time of queuing.
⋮----
/// Test Setup:
/// - staker1 deposits, queues withdrawal for some amount,
/// - operator slashed 50%
/// - staker 2 deposits, queues withdrawal for some amount
/// - operator is then slashed another 50%
/// slashed amount for staker 1 should be 75% and staker 2 should be 50% where the total
/// slashed amount is the sum of both
function testFuzz_slashOperatorShares_MultipleWithdrawalsMultipleSlashings(Randomness r) public rand(r) {
⋮----
// 2. Register the operator, set the staker deposits, and delegate the 2 stakers to them
⋮----
// 3. Queue withdrawal for staker and slash operator for 50%
⋮----
// 3.1 queue a withdrawal for the staker
⋮----
// 3.2 Burn shares
⋮----
// 3.3 Assert slashable shares and operator shares
⋮----
// 4. Queue withdrawal for staker and slash operator for 60% again
⋮----
// 4.1 queue a withdrawal for the staker
⋮----
// 4.2 Burn shares
⋮----
// 4.3 Assert slashable shares and operator shares
⋮----
/// @notice Ensure that when a withdrawal is completable then there are no slashable shares in the queue.
/// However if the withdrawal is not completable and the withdrawal delay hasn't elapsed, then the withdrawal
/// should be counted as slashable.
function testFuzz_slashOperatorShares_Timings(Randomness r) public rand(r) {
// 1. Randomize operator and staker info
// Operator info
⋮----
// staker
⋮----
// 2. Register the operator, set the staker deposits, and delegate the staker to them
⋮----
// 3. Queue withdrawal for staker and roll blocks forward so that the withdrawal is completable
⋮----
// 3.1 after queuing the withdrawal, check that there are slashable shares in queue
⋮----
// Check slashable shares in queue before and when the withdrawal is completable
⋮----
// 3.2 roll to right before withdrawal is completable, check that slashable shares are still there
// attempting to complete a withdrawal should revert
⋮----
// 3.3 roll to blocknumber that the withdrawal is completable, there should be no slashable shares in queue
⋮----
// 4. Burn 0 shares when new magnitude is set
⋮----
// 5. Assert expected values
⋮----
//  * @notice Ensure that no burning takes place for the beaconChainETHStrategy when the operator is slashed
//  * and there are no slashable shares in the queue. Note: this will be implemented in a future release with
//  * consideration of the Pectra upgrade.
⋮----
// function testFuzz_slashOperatorShares_BeaconChainStrategy(Randomness r) public rand(r) {
⋮----
//     eigenPodManagerMock.setPodOwnerShares(staker1, int(shares));
//     eigenPodManagerMock.setPodOwnerShares(staker2, int(depositAmount));
⋮----
//         (QueuedWithdrawalParams[] memory queuedWithdrawalParams,,) = _setUpQueueWithdrawalsSingleStrat({
//             staker: staker2,
//             strategy: beaconChainETHStrategy,
//             depositSharesToWithdraw: withdrawAmount
⋮----
//             delegationManager.getSlashableSharesInQueue(operator, beaconChainETHStrategy),
⋮----
//     uint operatorSharesBefore = delegationManager.operatorShares(operator, beaconChainETHStrategy);
//     uint queuedSlashableSharesBefore = delegationManager.getSlashableSharesInQueue(operator, beaconChainETHStrategy);
⋮----
//     uint sharesToBurn = sharesToDecrease + (delegationManager.getSlashableSharesInQueue(operator, beaconChainETHStrategy) * 3 / 4);
⋮----
//     _setOperatorMagnitude(operator, beaconChainETHStrategy, newMagnitude);
⋮----
//     emit OperatorSharesDecreased(operator, address(0), beaconChainETHStrategy, sharesToDecrease);
⋮----
//     emit OperatorSharesSlashed(operator, beaconChainETHStrategy, sharesToBurn);
⋮----
//         strategy: beaconChainETHStrategy,
⋮----
//     uint queuedSlashableSharesAfter = delegationManager.getSlashableSharesInQueue(operator, beaconChainETHStrategy);
//     uint operatorSharesAfter = delegationManager.operatorShares(operator, beaconChainETHStrategy);
⋮----
//     assertEq(operatorSharesAfter, operatorSharesBefore - sharesToDecrease, "operator shares should be decreased by sharesToDecrease");
⋮----
/// @notice This test demonstrates that the rate that withdrawable shares decrease from slashing is at LEAST
/// greater than or equal to the rate that the operator shares decrease from slashing.
/// We want this property otherwise undelegating/queue withdrawing all shares as a staker could lead to a underflow revert.
/// Note: If the SlashingLib.calcSlashedAmount function were to round down (overslash) then this test would fail.
function test_slashOperatorShares_slashedRepeatedly() public {
⋮----
/// @notice This unit test will slash a staker's beaconChainETH strategy shares from both on EigenLayer
/// and also on the beaconChain. This test ensures that the order of slashing does not matter and nets
/// the same withdrawableShares for the staker whether slashing occurred on the beaconChain, or on EigenLayer first.
function testFuzz_beaconSlashAndAVSSlash(Randomness r) public rand(r) {
⋮----
// note: beaconShares only goes negative when performing withdrawal -- and this will change post-migration
// so it's ok to make this assumption of positive shares
⋮----
////////////////////////////
// 0. setup operator and staker with Beacon Chain stake
⋮----
// delegate staker to operator with expected events emitted
⋮----
// withdrawable shares after both slashing, this will be checked with the other scenario when
// slashing in reverse order
⋮----
// 1. do beacon chain slash then AVS slash
⋮----
// Slash beaconChain first
⋮----
// Slash on EigenLayer second
⋮----
// do a slash via an AVS
⋮----
// save the outcome
⋮----
// 2. do AVS slash then beacon chain slash
⋮----
// initialize new staker and operator with same initial conditions
⋮----
// Slash on EigenLayer first
⋮----
// Slash beaconChain second
⋮----
// 3. Confirm withdrawable shares are the same regardless of order of operations in Test 1 or Test 2
⋮----
/// @notice Fuzzed Unit tests to compare totalWitdrawable shares for an operator vs their actual operatorShares.
/// Requires the WRITE_CSV_TESTS env variable to be set to true to output to a test file
contract DelegationManagerUnitTests_SharesUnderflowChecks is DelegationManagerUnitTests {
⋮----
/// @notice Fuzzed tests
/// Single staker with fuzzed starting shares and magnitude.
/// Slash 100 magnitude and deposit 100 shares for 100 iterations.
/// forge-config: default.fuzz.runs = 50
function testFuzz_slashDepositRepeatedly(Randomness r) public rand(r) {
⋮----
// Slash and deposit more for each iteration
⋮----
// 1. slash operator for 100 magnitude
⋮----
// 2. deposit again
⋮----
/// Slash 100 magnitude and fuzz deposit amount for 100 iterations.
⋮----
function testFuzz_slashDepositRepeatedly_randDeposits(Randomness r) public rand(r) {
⋮----
/// For 500 stakers, deposit `shares` amount and delegate to the operator. After each staker delegates,
/// slash 100 magnitude.
⋮----
function testFuzz_depositMultipleStakers_slash_repeatedly(Randomness r) public rand(r) {
⋮----
// 1. deposit and delegate new staker
⋮----
// 2. slash operator for 100 magnitude
⋮----
", ", // initial magnitude
⋮----
", ", // amount each staker deposits
⋮----
", ", // operator shares after all slashing and deposits
⋮----
", ", // total withdrawable shares from all stakers
cheats.toString(stdMath.delta(operatorSharesAfter, totalWithdrawableShares)) // delta difference between opShares and total withdrawable
⋮----
/// slash 1000 magnitude. Initial magnitude is very small so this will slash larger proportions.
⋮----
function testFuzz_depositMultipleStakers_slashLargeMagnitudes(Randomness r) public rand(r) {
⋮----
/// @notice Same as above `testFuzz_depositMultipleStakers_slashLargeMagnitudes` test but with slashing
/// 1 magnitude instead of 100.
⋮----
function testFuzz_depositMultipleStakers_slashSmallMagnitudes(Randomness r) public rand(r) {
⋮----
/// @notice Setup 500 delegated stakers who each deposit `shares` amount.
/// Then slash 1 magnitude 500 times and then compare amount of shares that can be withdrawn vs operatorShares
⋮----
function testFuzz_depositMultipleStakersOnce_slashSmallMagnitudes(Randomness r) public rand(r) {
⋮----
// deposit all stakers one time
⋮----
contract DelegationManagerUnitTests_Rounding is DelegationManagerUnitTests {}
⋮----
/// @notice TODO Lifecycle tests - These tests combine multiple functionalities of the DelegationManager
///    1. Old SigP test - registerAsOperator, separate staker delegate to operator, as operator undelegate (reverts),
///     checks that staker is still delegated and operator still registered, staker undelegates, checks staker not delegated and operator
///     is still registered
///    2. RegisterOperator, Deposit, Delegate, Queue, Complete
///    3. RegisterOperator, Mock Slash(set maxMagnitudes), Deposit/Delegate, Queue, Complete
///    4. RegisterOperator, Deposit/Delegate, Mock Slash(set maxMagnitudes), Queue, Complete
///    5. RegisterOperator, Mock Slash(set maxMagnitudes), Deposit/Delegate, Queue, Mock Slash(set maxMagnitudes), Complete
///    7. RegisterOperator, Deposit/Delegate, Mock Slash 100% (set maxMagnitudes), Undelegate, Complete non 100% slashed strategies
///    8. RegisterOperator, Deposit/Delegate, Undelegate, Re delegate to another operator, Mock Slash 100% (set maxMagnitudes), Complete as shares
///     (withdrawals should have been slashed even though delegated to a new operator)
///    9. Invariant check getWithdrawableShares = sum(deposits), Multiple deposits with operator who has never been slashed
///    10. Invariant check getWithdrawableShares = sum(deposits), Multiple deposits with operator who HAS been been slashed
contract DelegationManagerUnitTests_Lifecycle is DelegationManagerUnitTests {
⋮----
// 2. RegisterOperator, Deposit, Delegate, Queue, Complete
function test_register_operator_deposit_delegate_queue_complete(Randomness r) public rand(r) {
⋮----
// 1) Register operator.
⋮----
// 2) Mock deposit into SM.
⋮----
// 3) Staker delegates to operator.
⋮----
// 3) Staker queues withdrawals.
⋮----
// 4) Complete queued withdrawals.
⋮----
// Checks
⋮----
/// @notice While delegated to an operator who becomes 100% slashed. When the staker undelegates and queues a withdrawal
/// for all their shares which are now 0, the withdrawal should be completed with 0 shares even if they delegate to a new operator
/// who has not been slashed.
/// Note: This specifically tests that the completeQueuedWithdrawal is looking up the correct maxMagnitude for the operator
function testFuzz_undelegate_slashOperator100Percent_delegate_complete(Randomness r) public rand(r) {
⋮----
// delegate to the `newOperator` who has never been slashed
// Ensure that completing withdrawal now still results in 0 shares
⋮----
contract DelegationManagerUnitTests_ConvertToDepositShares is DelegationManagerUnitTests {
⋮----
function test_convertToDepositShares_noSlashing() public {
⋮----
function test_convertToDepositShares_withSlashing() public {
⋮----
// queue and complete a withdrawal for half the deposit shares
⋮----
// queued a withdrawal for half the deposit shares, and added back as withdrawable shares
⋮----
function test_convertToDepositShares_beaconChainETH() public {
⋮----
// delegate to an operator and slash
⋮----
// slash on beacon chain by 1/3
⋮----
function _checkDepositSharesConvertCorrectly(IStrategy[] memory strategies, uint[] memory expectedDepositShares) public view {
⋮----
// get the deposit shares
⋮----
// make sure that the deposit shares are less than or equal to the shares,
// so this value is sane to input into `completeQueuedWithdrawals`
⋮----
function _queueAndCompleteWithdrawalForSingleStrategy(IStrategy strategy, uint shares) public {
⋮----
contract DelegationManagerUnitTests_getQueuedWithdrawals is DelegationManagerUnitTests {
⋮----
function _withdrawalRoot(Withdrawal memory withdrawal) internal pure returns (bytes32) {
⋮----
function test_getQueuedWithdrawals_Correctness(Randomness r) public rand(r) {
⋮----
// Queue withdrawals.
⋮----
// Get queued withdrawals.
⋮----
function test_getQueuedWithdrawals_TotalQueuedGreaterThanTotalStrategies(Randomness r) public rand(r) {
⋮----
// Sanity
⋮----
/// @notice Assert that the shares returned in the view function `getQueuedWithdrawals` are unaffected from a
/// slash that occurs after the withdrawal is completed. Also assert that completing the withdrawal matches the
/// expected withdrawn shares from the view function.
/// Slashing on the completableBlock of the withdrawal should have no affect on the withdrawn shares.
function test_getQueuedWithdrawals_SlashAfterWithdrawalCompletion(Randomness r) public rand(r) {
⋮----
// Slash operator 50% while staker has queued withdrawal
⋮----
// Assert that the getQueuedWithdrawals returns shares that are halved as a result of being slashed 50%
⋮----
// Roll blocks to after withdrawal completion
⋮----
// slash operator 50% again
⋮----
// Assert that the getQueuedWithdrawals returns shares that are halved as a result of being slashed 50% and hasn't been
// affected by the second slash
⋮----
// Complete queued Withdrawal with shares added back. Since total deposit slashed by 50% and not 75%
⋮----
// Added shares
⋮----
function test_getQueuedWithdrawals_UsesCorrectOperatorMagnitude() public {
// Alice deposits 100 shares into strategy
⋮----
// Register operator with magnitude of 0.5 and delegate Alice to them
⋮----
// Alice queues withdrawal of all 100 shares while operator magnitude is 0.5
// This means she should get back 50 shares (100 * 0.5)
⋮----
// Alice undelegates, which would normally update operator's magnitude to 1.0
// This tests that the withdrawal still uses the original 0.5 magnitude from when it was queued
⋮----
// Get shares from withdrawal - should return 50 shares (100 * 0.5) using original magnitude
// rather than incorrectly returning 100 shares (100 * 1.0) using new magnitude
⋮----
contract DelegationManagerUnitTests_getQueuedWithdrawal is DelegationManagerUnitTests {
⋮----
function test_getQueuedWithdrawal_Correctness(Randomness r) public rand(r) {
// Set up initial deposit
⋮----
// Register operator and delegate
⋮----
// Get shares from queued withdrawal
⋮----
// Verify withdrawal details match
⋮----
function test_getQueuedWithdrawal_AfterSlashing(Randomness r) public rand(r) {
⋮----
// Slash operator by 50%
⋮----
// Verify withdrawal details match and shares are slashed
⋮----
function test_getQueuedWithdrawal_NonexistentWithdrawal() public view {
⋮----
function test_getQueuedWithdrawal_MultipleStrategies(Randomness r) public rand(r) {
// Set up multiple strategies with deposits
⋮----
// Queue withdrawals for multiple strategies
⋮----
// Verify withdrawal details and shares for each strategy
⋮----
function testFuzz_getQueuedWithdrawal_EmptyWithdrawal(bytes32 withdrawalRoot) public view {
````

## File: src/test/unit/DeployFromScratch.t.sol
````
// SPDX-License-Identifier: UNLICENSED
⋮----
import {Test} from "forge-std/Test.sol";
import {DeployFromScratch} from "script/deploy/local/deploy_from_scratch.slashing.s.sol";
⋮----
// NOTE: Run the following command to deploy from scratch in an anvil instance:
// RUST_LOG=forge,foundry=trace forge script script/deploy/local/Deploy_From_Scratch.s.sol --slow \
//   --rpc-url http://127.0.0.1:8545 \
//   --private-key 0xac0974bec39a17e36ba4a6b4d238ff944bacb478cbed5efcae784d7bf4f2ff80 \
//   --broadcast \
//   --sig "run(string memory configFile)" \
//   -- local/deploy_from_scratch.slashing.anvil.config.json
contract DeployTest is Test {
⋮----
function setUp() public {
⋮----
function test_DeployFromScratch() public {
// Deploy, expecting no revert.
````

## File: src/test/unit/DurationVaultStrategyUnit.t.sol
````
// SPDX-License-Identifier: BUSL-1.1
⋮----
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 {
⋮----
// TVL limits for tests
⋮----
function setUp() public virtual override {
⋮----
// Configure min withdrawal delay so allocationDelayBlocks == OPERATOR_ALLOCATION_DELAY.
⋮----
// Set the strategy for inherited tests
⋮----
// Configure the mock to return the vault as a supported strategy in the operator set
⋮----
// ===================== OPERATOR INTEGRATION TESTS =====================
⋮----
function testInitializeConfiguresOperatorIntegration() public {
⋮----
// Verify operator AVS rewards split is set to 0 (100% to stakers).
⋮----
// Verify rewards split is set to 0 (100% to stakers).
⋮----
function testLockAllocatesFullMagnitude() public {
⋮----
function testMarkMaturedDeallocatesAndDeregisters() public {
⋮----
function testMarkMaturedBestEffortWhenAllocationManagerReverts() public {
⋮----
// Should not revert even if AllocationManager refuses deallocation/deregistration.
⋮----
// Since the mock reverts before incrementing, only the initial lock allocation is recorded.
⋮----
function testMarkMaturedCanRetryOperatorCleanup() public {
⋮----
// markMatured is a permissionless retry path once in WITHDRAWALS.
⋮----
function testUpdateDelegationApprover() public {
⋮----
function testUpdateOperatorMetadataURI() public {
⋮----
function testSetRewardsClaimer() public {
⋮----
function testAdvanceToWithdrawals_onlyArbitrator_and_onlyBeforeUnlock() public {
// Cannot advance before lock (even as arbitrator).
⋮----
// Non-arbitrator cannot advance.
⋮----
// After unlockAt, arbitrator advance is not allowed.
⋮----
// markMatured works once duration has elapsed.
⋮----
// ===================== VAULT STATE TESTS =====================
⋮----
function testDepositsBlockedAfterLock() public {
⋮----
// The deposit() call succeeds (only validates token), but beforeAddShares() reverts
⋮----
function testWithdrawalQueueingBlockedDuringAllocations() public {
// prepare deposit
⋮----
// Attempt to queue withdrawal (beforeRemoveShares) during ALLOCATIONS - should revert
⋮----
// After maturity, queuing should be allowed
⋮----
// Queuing now works
⋮----
// And completion works
⋮----
// ===================== TVL LIMITS TESTS =====================
⋮----
function testSetTVLLimits(uint newMaxPerDeposit, uint newMaxTotalDeposits) public {
⋮----
function testSetInvalidMaxPerDepositAndMaxDeposits(uint newMaxPerDeposit, uint newMaxTotalDeposits) public {
⋮----
function testDepositMoreThanMaxPerDeposit() public {
⋮----
// Set up delegation to vault
⋮----
function testDepositMoreThanMaxTotalDeposits() public {
⋮----
// beforeAddShares checks operatorShares + new shares, so we update after each
⋮----
// Next deposit exceeds the cap
⋮----
function testTVLLimitsCannotBeChangedAfterLock() public {
````

## File: src/test/unit/ECDSACertificateVerifierUnit.t.sol
````
// SPDX-License-Identifier: BUSL-1.1
⋮----
import "@openzeppelin/contracts/proxy/transparent/TransparentUpgradeableProxy.sol";
import "forge-std/Test.sol";
⋮----
import "src/contracts/libraries/OperatorSetLib.sol";
import "src/contracts/multichain/ECDSACertificateVerifier.sol";
import "src/contracts/interfaces/IOperatorTableUpdater.sol";
import "src/contracts/interfaces/IECDSACertificateVerifier.sol";
import "src/contracts/interfaces/ICrossChainRegistry.sol";
import "src/test/utils/EigenLayerMultichainUnitTestSetup.sol";
import "src/test/utils/Random.sol";
⋮----
/// @title ECDSACertificateVerifierUnitTests
/// @notice Base contract for all ECDSACertificateVerifier unit tests
contract ECDSACertificateVerifierUnitTests is
⋮----
// Contracts
⋮----
// Test accounts
⋮----
// Defaults
⋮----
uint32 defaultMaxStaleness = 3600; // 1 hour max staleness
⋮----
// ECDSA signature specific fields
⋮----
function setUp() public virtual override {
⋮----
// Deploy implementation
⋮----
// Deploy proxy and initialize
⋮----
// Helper functions
⋮----
/// @notice Generate signer and non-signer private keys
/// @param pseudoRandomNumber Pseudo random number for generating keys
/// @param numSigners Number of signers to generate
/// @param numNonSigners Number of non-signers to generate
/// @return signerPrivKeys Array of signer private keys
/// @return nonSignerPrivKeys Array of non-signer private keys
function _generateSignerAndNonSignerPrivateKeys(uint pseudoRandomNumber, uint numSigners, uint numNonSigners)
⋮----
// Generate signer keys
⋮----
if (signerPrivKeys[i] == 0) signerPrivKeys[i] = 1; // Ensure non-zero
⋮----
// Generate non-signer keys
⋮----
if (nonSignerPrivKeys[i] == 0) nonSignerPrivKeys[i] = 1; // Ensure non-zero
⋮----
/// @notice Create operators with split keys
/// @param pseudoRandomNumber Pseudo random number for generating operator data
/// @param numSigners Number of signers
/// @param numNonSigners Number of non-signers
/// @return operators Array of operator infos
/// @return nonSignerIndices Array of non-signer indices
⋮----
function _createOperatorsWithSplitKeys(uint pseudoRandomNumber, uint numSigners, uint numNonSigners)
⋮----
// Generate private keys
⋮----
// Create all operators
⋮----
// Track indices of non-signers
⋮----
// Create signers first
⋮----
// Create non-signers
⋮----
/// @notice Create a certificate with ECDSA signatures
/// @param referenceTimestamp Reference timestamp for the certificate
/// @param messageHash Message hash to sign
/// @param nonSignerIndices Array of non-signer indices
/// @param operators Array of operator infos
/// @param signerPrivKeys Array of signer private keys
/// @return cert The created certificate
function _createCertificate(
⋮----
// Use the contract's digest calculation
⋮----
// Collect signers and their private keys
⋮----
// Get signer addresses and create signatures
⋮----
// Sort signers and signatures by address (ascending)
⋮----
// Swap addresses
⋮----
// Swap signatures
⋮----
// Concatenate signatures in sorted order
⋮----
/// @notice Update operator table with randomness
/// @param r Randomness for generating operator data
⋮----
/// @return operatorSetConfig Operator set configuration
/// @return referenceTimestamp Reference timestamp
⋮----
function _updateOperatorTable(Randomness r, uint numSigners, uint numNonSigners)
⋮----
// Generate seed and reference timestamp
⋮----
// Create operators
⋮----
// Update operator table
⋮----
/// @notice Initialize operator table for basic tests
/// @return referenceTimestamp The reference timestamp used
function _initializeOperatorTableBase() internal returns (uint32 referenceTimestamp) {
⋮----
/// @title ECDSACertificateVerifierUnitTests_updateOperatorTable
/// @notice Unit tests for ECDSACertificateVerifier.updateOperatorTable
contract ECDSACertificateVerifierUnitTests_updateOperatorTable is ECDSACertificateVerifierUnitTests {
function test_revert_notTableUpdater() public {
// Empty data
⋮----
// Update Table
⋮----
function test_revert_staleTimestamp() public {
⋮----
// First update should succeed
⋮----
// Second update with earlier timestamp should fail
⋮----
function testFuzz_updateOperatorTable_correctness(Randomness r) public rand(r) {
⋮----
// Expect event
⋮----
// Verify storage updates
⋮----
// Verify operator infos were stored correctly
⋮----
function test_multiple() public {
// Create two different operator sets
⋮----
// Create operators for each set
⋮----
// Create operator set configs with different owners
⋮----
maxStalenessPeriod: 1800 // 30 minutes
⋮----
maxStalenessPeriod: 7200 // 2 hours
⋮----
// Update both operator tables
⋮----
// Verify that both operator sets are stored correctly and independently
⋮----
/// @title ECDSACertificateVerifierUnitTests_verifyCertificate
/// @notice Unit tests for ECDSACertificateVerifier.verifyCertificate
contract ECDSACertificateVerifierUnitTests_verifyCertificate is ECDSACertificateVerifierUnitTests {
function test_revert_certificateStale() public {
⋮----
// Jump forward in time beyond the max staleness
⋮----
function test_zeroStalenessPeriod_neverStale() public {
// Create operator set config with 0 staleness period
⋮----
maxStalenessPeriod: 0 // 0 means certificate never becomes stale
⋮----
// Create certificate
⋮----
// Jump forward in time far beyond any reasonable staleness period
⋮----
// Certificate should still be valid with 0 staleness period
⋮----
// Verify all stakes are signed
⋮----
function test_revert_emptySignatures() public {
⋮----
// Create certificate with empty signatures
⋮----
sig: "" // Empty signatures
⋮----
function test_revert_invalidSignatureLength() public {
⋮----
// Create certificate with wrong signature length (not a multiple of 65)
bytes memory invalidLengthSig = new bytes(64); // Should be 65 bytes for ECDSA
⋮----
function test_revert_referenceTimestampDoesNotExist() public {
⋮----
function test_isReferenceTimestampSet() public {
⋮----
// Before updating operator table, timestamp should not be set
⋮----
// After updating, timestamp should be set
⋮----
// A different timestamp should not be set
⋮----
function test_revert_rootDisabled() public {
// Initialize operator table with a valid root
⋮----
function test_revert_invalidSignature() public {
⋮----
// Create a certificate with signatures for the original message hash
⋮----
// Modify the certificate to use a different message hash
⋮----
// Verification should fail - expect SignersNotOrdered because signature recovery
// with wrong message hash produces different addresses that break ordering
cheats.expectRevert(); // SignersNotOrdered or VerificationFailed
⋮----
function testFuzz_verifyCertificate_allSigners(Randomness r) public rand(r) {
⋮----
// Create certificate with no non-signers
⋮----
// Calculate total stakes
⋮----
// All stakes should be signed
⋮----
function testFuzz_verifyCertificate_someNonSigners(Randomness r) public rand(r) {
// Create operators and update operator table
⋮----
// Check that the signed stakes are correct
⋮----
// Calculate expected signed stakes
⋮----
// Subtract non-signer stakes
⋮----
function test_updateStalenessAndVerify() public {
// Initial setup with default staleness (3600)
⋮----
// Warp past the staleness period (3601 seconds)
⋮----
// Update table again with new staleness period (7200) and new owner
⋮----
// Warp past old staleness period (3601) but within new staleness period
⋮----
// Create and verify certificate - should succeed with new staleness period
⋮----
// Verify the new config is applied
⋮----
function test_updateOperatorsAndVerify() public {
// First update with initial operators
⋮----
// Advance time and update with new operators
⋮----
) = _createOperatorsWithSplitKeys(456, 2, 2); // Different seed for different operators
⋮----
// Create certificate with new operators
⋮----
// Verify only signers' stakes are counted
⋮----
// First 2 operators are signers
⋮----
// Verify the latest timestamp is updated
⋮----
// Verify new operators are stored
⋮----
function test_revert_signerNotOperator() public {
// Create operators and update the table
⋮----
// Create a private key for a non-operator signer
⋮----
// Create certificate with the non-operator as a signer
⋮----
// Should revert because the signer is not an operator
⋮----
function test_revert_signaturesNotOrdered() public {
// Create operators with at least 2 signers
⋮----
// Create two private keys where the first address is greater than the second
⋮----
// Ensure valid private keys
⋮----
// Make sure addr0 > addr1 by adjusting keys if needed
⋮----
// If addr0 < addr1, swap the keys to ensure we get the wrong order
⋮----
// Create operators with these addresses
⋮----
// Create signatures in the WRONG order (higher address first)
⋮----
// Sign with both keys but put them in wrong order (addr0 > addr1)
⋮----
// Concatenate signatures in wrong order (higher address first)
⋮----
// Should revert because signatures are not ordered by address
⋮----
function test_revert_invalidSignatureRecoveryError() public {
⋮----
// Create an invalid signature with invalid s value (too large)
// This will cause ECDSA.tryRecover to return RecoverError.InvalidSignatureS
⋮----
// Set r to a valid value
⋮----
// Set s to a value that's too large (> N/2)
⋮----
// Pack the signature
⋮----
// Should revert because signature recovery returns an error
⋮----
function test_revert_recoveredAddressZero() public {
⋮----
// Create a signature that will recover to address(0)
// This happens when v, r, s are valid but don't correspond to any valid signature
⋮----
// These specific values will cause ecrecover to return address(0)
// while still being within valid ranges
⋮----
// Should revert because recovered address is zero - now throws VerificationFailed
⋮----
function test_verifyCertificate_olderTimestamp() public {
⋮----
// Advance time and update with new operators (making this the latest timestamp)
⋮----
// Verify that the second timestamp is now the latest
⋮----
// Create certificate for the FIRST (older) timestamp
⋮----
// Verify certificate for older timestamp should succeed
⋮----
// Calculate expected signed stakes from first operators (only signers contribute)
⋮----
// Verify the correct number of signers
⋮----
/// @title ECDSACertificateVerifierUnitTests_verifyCertificateProportion
/// @notice Unit tests for ECDSACertificateVerifier.verifyCertificateProportion
contract ECDSACertificateVerifierUnitTests_verifyCertificateProportion is ECDSACertificateVerifierUnitTests {
function testFuzz_revert_arrayLengthMismatch(Randomness r) public rand(r) {
⋮----
// Set thresholds with wrong length
uint16[] memory wrongLengthThresholds = new uint16[](1); // Should be 2
⋮----
function testFuzz_verifyCertificateProportion_meetsThresholds(Randomness r) public rand(r) {
⋮----
// Set thresholds at 60% of total stake for each type
⋮----
thresholds[0] = 6000; // 60%
thresholds[1] = 6000; // 60%
⋮----
// Calculate expected result based on the number of signers
⋮----
function testFuzz_verifyCertificateProportion_doesNotMeetThresholds(Randomness r) public rand(r) {
// Update operator table with a specific split to ensure some thresholds won't be met
uint numSigners = r.Uint256(1, numOperators / 2); // At most half signers
⋮----
// Try with higher threshold that shouldn't be met
⋮----
thresholds[0] = 9000; // 90%
thresholds[1] = 9000; // 90%
⋮----
// Calculate percentage of signed stakes to determine if it should meet threshold
⋮----
/// @notice Fuzz against random thresholds
function testFuzz_verifyCertificateProportion_thresholds(Randomness r, uint16 threshold0, uint16 threshold1) public rand(r) {
// Update operator table with random split
⋮----
threshold0 = uint16(bound(threshold0, 0, 10_000)); // 0% to 100%
threshold1 = uint16(bound(threshold1, 0, 10_000)); // 0% to 100%
⋮----
// Calculate expected result
⋮----
/// @title ECDSACertificateVerifierUnitTests_verifyCertificateNominal
/// @notice Unit tests for ECDSACertificateVerifier.verifyCertificateNominal
contract ECDSACertificateVerifierUnitTests_verifyCertificateNominal is ECDSACertificateVerifierUnitTests {
⋮----
uint[] memory wrongLengthThresholds = new uint[](1); // Should be 2
⋮----
function testFuzz_verifyCertificateNominal_meetsThresholds(Randomness r) public rand(r) {
⋮----
// Get the signed stakes for reference
⋮----
// Test with thresholds lower than signed stakes (should pass)
⋮----
function testFuzz_verifyCertificateNominal_doesNotMeetThresholds(Randomness r) public rand(r) {
⋮----
uint numSigners = r.Uint256(1, numOperators - 1); // Ensure at least one non-signer
⋮----
// Test with thresholds higher than signed stakes (should fail)
⋮----
function testFuzz_verifyCertificateNominal_thresholds(Randomness r, uint threshold0, uint threshold1) public rand(r) {
⋮----
// Bound thresholds to reasonable values
⋮----
// Expected result
⋮----
/// @title ECDSACertificateVerifierUnitTests_ViewFunctions
/// @notice Unit tests for ECDSACertificateVerifier view functions
contract ECDSACertificateVerifierUnitTests_ViewFunctions is ECDSACertificateVerifierUnitTests {
⋮----
function setUp() public override {
⋮----
function _getOperators() internal view returns (IECDSACertificateVerifierTypes.ECDSAOperatorInfo[] memory) {
⋮----
function test_getOperatorSetOwner() public view {
⋮----
function test_maxOperatorTableStaleness() public view {
⋮----
function test_latestReferenceTimestamp() public view {
⋮----
function test_getOperatorInfos() public view {
⋮----
function test_getOperatorInfo() public view {
⋮----
function test_getOperatorCount() public view {
⋮----
function test_getTotalStakeWeights() public view {
⋮----
// Calculate expected total stakes
⋮----
function test_calculateCertificateDigest() public view {
⋮----
// Verify digest is deterministic
⋮----
// Verify different inputs produce different digests
⋮----
function test_calculateCertificateDigestBytes() public view {
⋮----
// Get the digest bytes
⋮----
// Verify the bytes have the expected structure:
// - First 2 bytes should be "\x19\x01" (EIP-712 prefix)
// - Next 32 bytes should be the domain separator
// - Last 32 bytes should be the struct hash
⋮----
// Verify that keccak256 of the digest bytes equals calculateCertificateDigest
⋮----
function test_domainSeparator() public view {
⋮----
// Verify domain separator is deterministic
⋮----
function test_revert_indexOutOfBounds() public {
⋮----
// Try to get operator info with out of bounds index
⋮----
function test_revert_noOperators() public {
⋮----
// Create empty operator array
````

## File: src/test/unit/EigenPodManagerUnit.t.sol
````
// SPDX-License-Identifier: BUSL-1.1
⋮----
import "@openzeppelin/contracts/proxy/beacon/UpgradeableBeacon.sol";
⋮----
import "src/contracts/pods/EigenPodManager.sol";
import "src/contracts/pods/EigenPodPausingConstants.sol";
import "src/contracts/libraries/SlashingLib.sol";
⋮----
import "src/test/utils/EigenLayerUnitTestSetup.sol";
import "src/test/harnesses/EigenPodManagerWrapper.sol";
import "src/test/mocks/EigenPodMock.sol";
import "src/test/mocks/ETHDepositMock.sol";
⋮----
contract EigenPodManagerUnitTests is EigenLayerUnitTestSetup, IEigenPodManagerEvents {
// Contracts Under Test: EigenPodManager
⋮----
// Mocks
⋮----
IBeacon public eigenPodBeacon; // Proxy for eigenPodMockImplementation
⋮----
// Constants
⋮----
function setUp() public virtual override {
⋮----
// Deploy Mocks
⋮----
// Deploy EPM Implementation & Proxy
⋮----
0 /*initialPausedStatus*/
⋮----
// Set defaultPod
⋮----
// Exclude the zero address, and the eigenPodManager itself from fuzzed inputs
⋮----
///
///                         Helper Functions/Modifiers
⋮----
function _initializePodWithShares(address podOwner, int shares) internal {
// Deploy pod
⋮----
modifier deployPodForStaker(address staker) {
⋮----
function _deployAndReturnEigenPodForStaker(address staker) internal returns (IEigenPod deployedPod) {
⋮----
function _checkPodDeployed(address staker, address expectedPod, uint numPodsBefore) internal view {
⋮----
contract EigenPodManagerUnitTests_Initialization_Setters is EigenPodManagerUnitTests {
⋮----
///                             Initialization Tests
⋮----
function test_initialization() public view {
// Check max pods, beacon chain, owner, and pauser
⋮----
// Check storage variables
⋮----
function test_initialize_revert_alreadyInitialized() public {
⋮----
contract EigenPodManagerUnitTests_CreationTests is EigenPodManagerUnitTests {
function test_createPod() public {
// Get expected pod address and pods before
⋮----
// Create pod
⋮----
// Check pod deployed
⋮----
function test_createPod_revert_alreadyCreated() public deployPodForStaker(defaultStaker) {
⋮----
contract EigenPodManagerUnitTests_ProofTimestampSetterTests is EigenPodManagerUnitTests {
function testFuzz_setProofTimestampSetter_revert_notOwner(address notOwner) public filterFuzzedAddressInputs(notOwner) {
⋮----
function test_setProofTimestampSetter() public {
⋮----
function test_setPectraForkTimestamp_revert_notSetter(address notSetter) public filterFuzzedAddressInputs(notSetter) {
// First set a proof timestamp setter
⋮----
// Try to set timestamp from non-setter address
⋮----
function test_setPectraForkTimestamp() public {
⋮----
// Set new timestamp
⋮----
contract EigenPodManagerUnitTests_StakeTests is EigenPodManagerUnitTests {
function test_stake_podAlreadyDeployed() public deployPodForStaker(defaultStaker) {
// Declare dummy variables
⋮----
// Stake
⋮----
// Expect pod has 32 ether
⋮----
function test_stake_newPodDeployed() public {
⋮----
_checkPodDeployed(defaultStaker, address(defaultPod), 0); // staker, defaultPod, numPodsBefore
⋮----
contract EigenPodManagerUnitTests_ShareUpdateTests is EigenPodManagerUnitTests {
// Wrapper contract that exposes the internal `_calculateChangeInDelegatableShares` function
⋮----
// Upgrade eigenPodManager to wrapper
⋮----
///                             Add Shares Tests
⋮----
function testFuzz_addShares_revert_notDelegationManager(address notDelegationManager)
⋮----
function test_addShares_revert_podOwnerZeroAddress() public {
⋮----
function testFuzz_addShares_revert_sharesNegative(int shares) public {
⋮----
function testFuzz_addShares(uint shares) public {
// Fuzz inputs
⋮----
shares = shares - (shares % GWEI_TO_WEI); // Round down to nearest Gwei
⋮----
// Add shares
⋮----
// Check storage update
⋮----
function test_addShares_negativeInitial() public {
⋮----
function testFuzz_addShares_negativeSharesInitial(int sharesToStart, int sharesToAdd) public {
⋮----
// validate that prev shares return 0 since we started from a negative balance
⋮----
// If we now have positive shares, expect return
⋮----
// We still have negative shares, return 0
⋮----
///                             Remove Shares Tests
⋮----
function testFuzz_removeDepositShares_revert_notDelegationManager(address notDelegationManager)
⋮----
function testFuzz_removeDepositShares_revert_depositSharesOverflow(uint sharesToAdd, uint sharesToRemove) public {
// bound sharesToAdd so that it can be cast to int256 and initial shares can be set in storage
⋮----
// if sharesToRemove is greater than the max int256 and cast overflows, expect revert
⋮----
// if sharesToRemove is greater than the sharesToAdd, expect revert from removing more depositShares than exists
⋮----
// else don't expect a revert and check event emitted
⋮----
function testFuzz_removeDepositShares_revert_sharesNegative(uint sharesToRemove) public {
⋮----
// if sharesToRemove is valid input and existing shares is 0, expect revert from removing more depositShares than exists
⋮----
function testFuzz_removeDepositShares_revert_tooManySharesRemoved(uint sharesToAdd, uint sharesToRemove) public {
// Constrain inputs
⋮----
// Initialize pod with shares
⋮----
// Remove shares
⋮----
function testFuzz_removeShares(uint sharesToAdd, uint sharesToRemove) public {
⋮----
// Check storage
⋮----
function testFuzz_removeDepositShares_zeroShares(address podOwner, uint shares) public filterFuzzedAddressInputs(podOwner) {
⋮----
contract EigenPodManagerUnitTests_WithdrawSharesAsTokensTests is EigenPodManagerUnitTests {
⋮----
///                     WithdrawSharesAsTokens Tests
⋮----
function test_withdrawSharesAsTokens_revert_invalidStrategy() public {
⋮----
function test_withdrawSharesAsTokens_revert_podOwnerZeroAddress() public {
⋮----
function testFuzz_withdrawSharesAsTokens_revert_sharesNegative(int shares) public {
⋮----
/// @notice The `withdrawSharesAsTokens` is called in the `completeQueuedWithdrawal` function from the
///         delegationManager. When a withdrawal is queued in the delegationManager, `removeDepositShares is called`
function test_withdrawSharesAsTokens_m2NegativeShares_reduceEntireDeficit() public {
// Shares to initialize & withdraw
⋮----
// Deploy Pod And initialize with negative shares
⋮----
// Withdraw shares
⋮----
// Expect call to EigenPod for the withdrawal
⋮----
function test_withdrawSharesAsTokens_m2NegativeShares_partialDeficitReduction() public {
⋮----
// Assert that no call is made by passing in zero for the count
⋮----
emptyBytes, // Cheatcode checks a partial match starting at the first byte of the calldata
⋮----
function test_withdrawSharesAsTokens_withdrawPositive() public {
⋮----
// Check storage remains the same
⋮----
contract EigenPodManagerUnitTests_BeaconChainETHBalanceUpdateTests is EigenPodManagerUnitTests {
⋮----
function testFuzz_revert_notPod(address invalidCaller)
⋮----
function test_revert_zeroAddress() public {
⋮----
function testFuzz_revert_nonWholeGweiAmount(int sharesDelta) public deployPodForStaker(defaultStaker) {
⋮----
function testFuzz_revert_negativeDepositShares(int sharesBefore) public {
⋮----
// Initialize shares
⋮----
// Record balance update
⋮----
function testFuzz_noCall_zeroBalanceUpdate(uint sharesBefore, uint prevRestakedBalanceWei) public {
// Constrain Inputs
⋮----
// Add 0 shares, expect no call to DM
⋮----
0 // No call is made
⋮----
function testFuzz_recordPositiveBalanceUpdate(uint sharesBefore, uint sharesDelta, uint prevRestakedBalanceWei) public {
⋮----
// Note that this is a unit test, we don't validate that the withdrawable shares are updated correctly
// See the integration tests for checking scaling factors and withdrawable shares
⋮----
function testFuzz_recordNegativeBalanceUpdate(int sharesBefore, int sharesDelta, uint prevRestakedBalanceWei) public {
⋮----
// ensure sharesBefore >= 0 to avoid LegacyWithdrawalsNotCompleted error
⋮----
// bound prevRestakedBalanceWei so that it fits within int256 to avoid cast overflow
⋮----
// bound sharesDelta so that it fits within int256
⋮----
contract EigenPodManagerUnitTests_increaseBurnOrRedistributableShares is EigenPodManagerUnitTests {
function testFuzz_onlyDelegationManager(address invalidCaller) public filterFuzzedAddressInputs(invalidCaller) {
⋮----
function testFuzz_singleDeposit(uint increasedBurnableShares) public {
⋮----
function testFuzz_existingDeposit(uint existingBurnableShares, uint increasedBurnableShares) public {
// prevent overflow
````

## File: src/test/unit/EigenPodUnit.t.sol
````
// SPDX-License-Identifier: BUSL-1.1
⋮----
import "@openzeppelin/contracts/proxy/beacon/UpgradeableBeacon.sol";
import "@openzeppelin/contracts/utils/Create2.sol";
⋮----
import "src/contracts/pods/EigenPod.sol";
import "src/contracts/pods/EigenPodPausingConstants.sol";
⋮----
import "src/test/mocks/ETHDepositMock.sol";
import "src/test/mocks/ERC20Mock.sol";
import "src/test/harnesses/EigenPodHarness.sol";
import "src/test/utils/ProofParsing.sol";
import "src/test/utils/EigenLayerUnitTestSetup.sol";
⋮----
import "src/test/integration/mocks/BeaconChainMock.t.sol";
import "src/test/integration/mocks/BeaconChainMock_Deneb.t.sol";
import "src/test/integration/mocks/EIP_4788_Oracle_Mock.t.sol";
import "src/test/integration/mocks/LibValidator.t.sol";
import "src/test/utils/EigenPodUser.t.sol";
import "src/test/utils/BytesLib.sol";
⋮----
contract EigenPodUnitTests is EigenLayerUnitTestSetup, EigenPodPausingConstants, IEigenPodEvents {
⋮----
// Contract Under Test: EigenPod
⋮----
// BeaconChain Mock Setup
⋮----
// Beacon chain genesis time when running locally
// Multiple of 12 for sanity's sake
⋮----
function setUp() public virtual override {
// Setup
⋮----
// Create time machine and beacon chain. Set block time to beacon chain genesis time
// beaconChainMock will also etch 4788 precompile
⋮----
// Deploy EigenPod
⋮----
// Deploy Beacon
⋮----
// Deploy Proxy same way as EigenPodManager does
⋮----
// set the beacon address to the eigenPodBeacon
⋮----
// Store the eigenPodBeacon address in the eigenPod beacon proxy
⋮----
// Initialize pod
⋮----
// Set a proof submitter
⋮----
///
///                     EIGENPOD Helpers
⋮----
modifier timewarp() {
⋮----
function _seedPodWithETH(uint ethAmount) internal {
⋮----
function _newEigenPodStaker(uint rand) internal returns (EigenPodUser, uint) {
⋮----
/// @dev Opposite of Endian.fromLittleEndianUint64
function _toLittleEndianUint64(uint64 num) internal pure returns (bytes32) {
⋮----
// Rearrange the bytes from big-endian to little-endian format
⋮----
// Shift the little-endian bytes to the end of the bytes32 value
⋮----
/// From EigenPod._calcPubkeyHash
function _calcPubkeyHash(bytes memory pubkey) internal view returns (bytes32) {
⋮----
///                     verifyWithdrawalCredentials Assertions
⋮----
function assert_Snap_Added_ActiveValidatorCount(EigenPodUser staker, uint addedValidators, string memory err) internal {
⋮----
function assert_Snap_Removed_ActiveValidatorCount(EigenPodUser staker, uint removedValidators, string memory err) internal {
⋮----
function assert_Snap_Unchanged_ActiveValidatorCount(EigenPodUser staker, string memory err) internal {
⋮----
function _getActiveValidatorCount(EigenPodUser staker) internal view returns (uint) {
⋮----
function _getPrevActiveValidatorCount(EigenPodUser staker) internal timewarp returns (uint) {
⋮----
function assert_Snap_Added_ActiveValidators(EigenPodUser staker, uint40[] memory addedValidators, string memory err) internal {
⋮----
function assert_Snap_Removed_ActiveValidators(EigenPodUser staker, uint40[] memory removedValidators, string memory err) internal {
⋮----
function _getValidatorStatuses(EigenPodUser staker, bytes32[] memory pubkeyHashes)
⋮----
function _getPrevValidatorStatuses(EigenPodUser staker, bytes32[] memory pubkeyHashes)
⋮----
///                     startCheckpoint Assertions
⋮----
function check_StartCheckpoint_State(EigenPodUser staker) internal {
⋮----
function assert_ProofsRemainingEqualsActive(EigenPodUser staker, string memory err) internal view {
⋮----
function assert_Snap_Created_Checkpoint(EigenPodUser staker, string memory err) internal {
⋮----
function _getCheckpointTimestamp(EigenPodUser staker) internal view returns (uint64) {
⋮----
function _getPrevCheckpointTimestamp(EigenPodUser staker) internal timewarp returns (uint64) {
⋮----
///                     verifyCheckpointProofs
⋮----
/// @notice assumes positive rewards and that the checkpoint will be finalized
function _expectEventsVerifyCheckpointProofs(
⋮----
/// @dev Calculates the delta between two Gwei amounts and returns as an int256
function _calcBalanceDelta(uint64 newAmountGwei, uint64 previousAmountGwei) internal pure returns (int128) {
⋮----
contract EigenPodUnitTests_Initialization is EigenPodUnitTests {
function test_constructor() public {
⋮----
function test_initialization() public {
⋮----
// Check podOwner and restaked
⋮----
// Check immutable storage
⋮----
function test_initialize_revert_alreadyInitialized() public {
⋮----
function test_initialize_revert_emptyPodOwner() public {
⋮----
// un-initialize pod
⋮----
function test_setProofSubmitter_revert_notPodOwner(address invalidCaller) public {
⋮----
function test_setProofSubmitter(address newProofSubmitter) public {
⋮----
contract EigenPodUnitTests_EPMFunctions is EigenPodUnitTests {
⋮----
///                         stake() tests
⋮----
// Beacon chain staking constnats
⋮----
function testFuzz_stake_revert_notEigenPodManager(address invalidCaller) public {
⋮----
function testFuzz_stake_revert_invalidValue(uint value) public {
⋮----
function test_stake() public {
⋮----
// Expect emit
⋮----
// Stake
⋮----
// Check eth transferred
⋮----
///                         withdrawRestakedBeaconChainETH() tests
⋮----
function testFuzz_withdrawRestakedBeaconChainETH_revert_notEigenPodManager(address invalidCaller, address recipient, uint randAmount)
⋮----
// Setup EigenPod Staker
⋮----
// ensure invalid caller causing revert
⋮----
function testFuzz_withdrawRestakedBeaconChainETH_revert_withdrawAmountTooLarge(uint rand, address recipient, uint randAmountWei)
⋮----
// ensure amount is too large
⋮----
// Bound gwei amount to fit in uint64, then convert to wei to prevent overflow
⋮----
function testFuzz_withdrawRestakedBeaconChainETH(uint rand, uint randAmountWei) public {
⋮----
// ensure valid fuzzed wei amounts
⋮----
function testFuzz_withdrawRestakedBeaconChainETH_AmountGweiNotDivisibleByGwei(uint rand, uint randAmountWei) public {
⋮----
// Bound to prevent overflow, but keep full wei precision to test rounding behavior
⋮----
contract EigenPodUnitTests_recoverTokens is EigenPodUnitTests {
⋮----
///                         recoverTokens() tests
⋮----
function testFuzz_recoverTokens_revert_notPodOwner(address invalidCaller) public {
⋮----
function test_recoverTokens_revert_whenPaused() public {
⋮----
// pause recoverTokens
⋮----
function test_recoverTokens_revert_invalidLengths() public {
⋮----
function test_recoverTokens() public {
⋮----
// Deploy dummy token
⋮----
// Recover tokens
⋮----
// Checks
⋮----
contract EigenPodUnitTests_verifyWithdrawalCredentials is EigenPodUnitTests, ProofParsing {
⋮----
///                         verifyWithdrawalCredentials() tests
⋮----
/// @notice revert when verify wc is not called by pod owner
function testFuzz_revert_callerIsNotPodOwnerOrProofSubmitter(address invalidCaller) public {
⋮----
/// @notice test verify wc reverts when paused
function test_revert_verifyWithdrawalCredentialsPaused() public {
⋮----
/// @notice beaconTimestamp must be after the current checkpoint
function testFuzz_revert_beaconTimestampInvalid() public {
⋮----
// Ensure we have more than one validator (_newEigenPodStaker allocates a nonzero amt of eth)
⋮----
// Start a checkpoint so `currentCheckpointTimestamp` is nonzero
⋮----
// Try to verify withdrawal credentials at the current block
⋮----
/// @notice beaconTimestamp must be after the last checkpoint
function test_revert_beaconTimestampBeforeCheckpoint() public {
⋮----
// Try to verify withdrawal credentials at the current block, right at the checkpoint timestamp
⋮----
/// @notice Check for revert on input array mismatch lengths
function testFuzz_revert_inputArrayLengthsMismatch(uint rand) public {
⋮----
/// @notice Check beaconStateRootProof reverts on invalid length or invalid proof
function testFuzz_revert_beaconStateRootProofInvalid(uint rand) public {
⋮----
// Change the proof to have an invalid value
⋮----
/// @notice attempt to verify validator credentials in both ACTIVE and WITHDRAWN states
/// check reverts
function testFuzz_revert_validatorsWithdrawn(uint rand) public {
⋮----
// now that validators are ACTIVE, ensure we can't verify them again
⋮----
// now that validators are WITHDRAWN, ensure we can't verify them again
⋮----
/// @notice attempt to verify validator credentials after they have exited
⋮----
function testFuzz_revert_validatorsExited(uint rand) public {
⋮----
// Exit validators from beacon chain and withdraw to pod
// We use the beacon chain mock directly instead of the user contract since the
// user contract uses the precompile to exit validators.
⋮----
// now that validators are exited, ensure we can't verify them
⋮----
/// @notice modify withdrawal credentials to cause a revert
function testFuzz_revert_invalidWithdrawalAddress(uint rand, bytes32 invalidWithdrawalCredentials) public {
⋮----
// Set invalid withdrawal credentials in validatorFields
⋮----
/// @notice test verify wc reverts when fork timestamp is zero
function test_revert_forkTimestampZero() public {
⋮----
// Set zero fork timestamp to zero
⋮----
/// @notice modify validator field length to cause a revert
function testFuzz_revert_invalidValidatorFields(uint rand) public {
⋮----
// change validator field length to invalid value
⋮----
/// @notice modify validator activation epoch to cause a revert
function testFuzz_revert_activationEpochNotSet(uint rand) public {
⋮----
/// @notice modify validator proof length to cause a revert
function testFuzz_revert_invalidValidatorProofLength(uint rand) public {
⋮----
// add an element to the proof
⋮----
/// @notice modify validator pubkey to cause a revert
function testFuzz_revert_invalidValidatorProof(uint rand, bytes32 randPubkey) public {
⋮----
// change validator pubkey to an invalid value causing a revert
⋮----
/// @notice fuzz test a eigenPod with multiple validators. Using timemachine to assert values over time
function testFuzz_verifyWithdrawalCredentials(uint rand) public {
⋮----
// Complete a quick empty checkpoint so we have a nonzero value for `lastCheckpointedAt`
⋮----
// staker.verifyWithdrawalCredentials(validators);
// Prank either the staker or proof submitter
⋮----
// Check ValidatorInfo values for each validator
⋮----
contract EigenPodUnitTests_startCheckpoint is EigenPodUnitTests {
⋮----
///                         startCheckpoint() tests
⋮----
/// @notice revert when startCheckpoint is not called by pod owner
function testFuzz_revert_callerIsNotPodOwnerOrProofSubmitter(uint rand, address invalidCaller) public {
⋮----
/// @notice test startCheckpoint reverts when paused
function testFuzz_revert_startCheckpointPaused(uint rand) public {
⋮----
/// @notice startCheckpoint should revert if another checkpoint already in progress
function testFuzz_revert_checkpointAlreadyStarted(uint rand) public {
⋮----
/// @notice startCheckpoint should revert if a checkpoint has already been completed this block
function testFuzz_revert_checkpointTwicePerBlock(uint rand) public {
⋮----
/// @notice if no rewards and revertIfNoBalance is set, startCheckpoint should revert
function testFuzz_revert_revertIfNoBalanceIsSet(uint rand) public {
⋮----
/// @notice fuzz test an eigenpod with multiple validators and starting a checkpoint
function testFuzz_startCheckpoint(uint rand) public {
⋮----
function testFuzz_startCheckpoint_AsProofSubmitter(uint rand) public {
⋮----
contract EigenPodUnitTests_verifyCheckpointProofs is EigenPodUnitTests {
⋮----
///                         verifyCheckpointProofs() tests
⋮----
/// @notice test verifyCheckpointProofs reverts when paused
function testFuzz_revert_verifyCheckpointProofsPaused(uint rand) public {
⋮----
/// @notice verifyCheckpointProofs should revert if checkpoint not in progress
function testFuzz_revert_checkpointNotStarted(uint rand) public {
⋮----
/// @notice should revert if fork timestamp zero
⋮----
// Setup verifyCheckpointProofs
⋮----
// Set forkTimestamp to zero
⋮----
/// @notice invalid proof length should revert
function testFuzz_revert_verifyBalanceContainerInvalidLengths(uint rand) public {
⋮----
// change the length of balanceContainerProof to cause a revert
⋮----
/// @notice change one of the bytes in the balanceContainer proof to cause a revert
function testFuzz_revert_verifyBalanceContainerInvalidProof(uint rand) public {
⋮----
// randomly change one of the bytes in the proof to make the proof invalid
⋮----
/// @notice invalid balance proof length should revert
function testFuzz_revert_verifyValidatorBalanceInvalidLength(uint rand) public {
⋮----
// change the length of balance proof to cause a revert
⋮----
/// @notice change one of the bytes in one of the balance proofs to cause a revert
function testFuzz_revert_verifyValidatorBalanceInvalidProof(uint rand) public {
⋮----
// randomly change one of the bytes in the first proof to make the proof invalid
⋮----
/// @notice test that verifyCheckpointProofs skips proofs submitted for non-ACTIVE validators
function testFuzz_verifyCheckpointProofs_skipIfNotActive(uint rand) public {
⋮----
// Create a joint set of validators & verify withdrawal credentials
⋮----
// Exit a validator and advance epoch so the exit is picked up next checkpoint
⋮----
// verify checkpoint proof for one exited validator
// manually create a snapshot here for Snap checks
⋮----
// attempt to submit the same proof and ensure that checkpoint did not progress
// the call should succeed, but nothing should happen
⋮----
// finally, finish the checkpoint by submitting all proofs
⋮----
/// @notice test that verifyCheckpointProofs skips duplicate checkpoint proofs
function testFuzz_verifyCheckpointProofs_skipIfAlreadyProven(uint rand) public {
⋮----
// Advance epoch and generate rewards on the beacon chain
⋮----
// select a single validator to submit multiple times
⋮----
// verify checkpoint proof for one validator
⋮----
/// @notice test that verifyCheckpointProofs sets validators to WITHDRAWN if they are exited
function testFuzz_verifyCheckpointProofs_validatorExits(uint rand) public {
⋮----
// Exit validators and advance epoch so exits are picked up in next checkpoint
⋮----
// Verify checkpoint proofs emit the expected values
⋮----
/// @notice fuzz test an eigenPod with multiple validators and verifyCheckpointProofs
function testFuzz_verifyCheckpointProofs(uint rand, bool epochRewards) public {
⋮----
contract EigenPodUnitTests_verifyStaleBalance is EigenPodUnitTests {
/// @notice test verifyStaleBalance reverts when paused
function testFuzz_revert_verifyStaleBalancePaused(uint rand) public {
⋮----
/// @notice test verifyStaleBalance reverts when paused via the PAUSED_START_CHECKPOINT flag
function testFuzz_revert_verifyStaleBalancePausedViaStartCheckpoint(uint rand) public {
⋮----
/// @notice verifyStaleBalance should revert if validator balance too stale
function testFuzz_revert_validatorBalanceNotStale(uint rand) public {
// setup eigenpod staker and validators
⋮----
// proof for given beaconTimestamp is not yet stale, this should revert
⋮----
/// @notice checks staleness condition when a pod has never completed a checkpoint before
/// The only value that will result in a revert here is `beaconTimestamp == 0`
function testFuzz_revert_validatorBalanceNotStale_NeverCheckpointed(uint rand) public {
⋮----
/// @notice verifyStaleBalance should revert if validator status is not ACTIVE
function testFuzz_revert_validatorStatusNotActive(uint rand) public {
⋮----
// Advance epoch and use stale balance proof without verifyingWithdrawalCredentials
// validator should be INACTIVE and cause a revert
⋮----
/// @notice verifyStaleBalance should revert if validator is not slashed
function testFuzz_revert_validatorNotSlashed(uint rand) public {
⋮----
// Advance epoch and use stale balance proof where the validator has not been slashed
// this should cause a revert
⋮----
/// @notice verifyStaleBalance should revert with forkTimestamp of 0
⋮----
// Slash validators and advance epoch
⋮----
/// @notice verifyStaleBalance should revert with invalid beaconStateRoot proof length
function testFuzz_revert_beaconStateRootProofInvalidLength(uint rand) public {
⋮----
// change the proof to have an invalid length
⋮----
/// @notice verifyStaleBalance should revert with invalid beaconStateRoot proof
⋮----
// change the proof to have an invalid value
⋮----
/// @notice verifyStaleBalance should revert with invalid validatorFields and validator proof length
function testFuzz_revert_validatorContainerProofInvalidLength(uint rand) public {
⋮----
// Change the validator fields to have an invalid length
⋮----
/// @notice verifyStaleBalance should revert with invalid validatorContainer proof
function testFuzz_revert_validatorContainerProofInvalid(uint rand, bytes32 randWithdrawalCredentials) public {
⋮----
// change validator withdrawal creds to an invalid value causing a revert
⋮----
function testFuzz_verifyStaleBalance(uint rand) public {
⋮----
/// @notice Tests that deneb proofs are not successful against pectra state
contract EigenPodUnitTests_DenebProofsAgainstPectra is EigenPodUnitTests {
/// @notice Set the beacon chain mock to Deneb Forkable
/// @notice The EigenPods by default use Pectra state given the early `proofTimestamp`
function setUp() public override {
⋮----
// Set beaconChainMock to Deneb Forkable
⋮----
function testFuzz_revert_verifyWC_DenebAgainstPectra(uint24 rand) public {
⋮----
// Get credentials proofs on Deneb state
⋮----
function testFuzz_revert_completeCheckpoint_DenebAgainstPectra(uint24 rand) public {
// Forward proof timestamp so that EigenPods prove everything against Deneb state
⋮----
// Get checkpoint proofs on Deneb state
⋮----
// Rewind proof timestamp such that EigenPods prove everything against Pectra state
⋮----
contract EigenPodUnitTests_PectraFeatures is EigenPodUnitTests {
⋮----
/// @notice revert when requestConsolidation and requestWithdrawal are called by an invalid caller
⋮----
/// @notice revert when requestConsolidation and requestWithdrawal are paused
function testFuzz_revert_consolidationsAndWithdrawalsPaused() public {
⋮----
/// @notice Revert when the validator is not active in the pod
function testFuzz_revert_validatorNotActiveInPod() public {
⋮----
// Mutate pubkey to be invalid
⋮----
/// @notice Revert when the caller does not supply enough msg.value for the fee
function testFuzz_revert_insufficientFunds(uint randConsolidations, uint randWithdrawals) public {
⋮----
/// @notice Revert when requestConsolidation or requestWithdrawal are sent invalid length pubkeys
function testFuzz_revert_invalidPubkeyLength(uint pubkeyLength) public {
⋮----
// Bad srcPubkey
⋮----
// Bad targetPubkey
⋮----
// Bad withdrawal pubkey
⋮----
/// @notice Revert when the target for consolidation is an INACTIVE validator
function testFuzz_revert_consolidationTargetInactive(uint40 srcIndex, uint40 targetIndex) public {
⋮----
/// @notice Revert when the target for consolidation is a WITHDRAWN validator
function testFuzz_revert_consolidationTargetWithdrawn(uint rand) public {
⋮----
// Create an ACTIVE validator
⋮----
// Exit from the beacon chain
⋮----
// Checkpoint, setting the validator to INACTIVE
⋮----
function testFuzz_consolidationRequest(uint rand) public {
⋮----
// Form consolidation requests for each validator
⋮----
// Half switch requests, half standard
⋮----
function testFuzz_withdrawalRequest(uint rand) public {
⋮----
// Half full exits, half partial withdrawals
⋮----
contract EigenPodHarnessSetup is EigenPodUnitTests {
// Harness that exposes internal functions for test
⋮----
// Deploy EP Harness
⋮----
// Upgrade eigenPod to harness
⋮----
/// @notice No unit tests as of now but would be good to add specific unit tests using proofs from our proofGen library
/// for a EigenPod on Hoodi
contract EigenPodUnitTests_proofParsingTests is EigenPodHarnessSetup, ProofParsing {
⋮----
// Params to _verifyWithdrawalCredentials, can be set in test or helper function
⋮----
function _assertWithdrawalCredentialsSet(uint restakedBalanceGwei) internal view {
⋮----
function _setWithdrawalCredentialParams() public {
// Set beacon state root, validatorIndex
⋮----
validatorFieldsProof = getWithdrawalCredentialProof(); // Validator fields are proven here
⋮----
// Get an oracle timestamp
⋮----
///@notice Effective balance is > 32 ETH
modifier setWithdrawalCredentialsExcess() {
// Set JSON and params
````

## File: src/test/unit/EmissionsControllerUnit.t.sol
````
// SPDX-License-Identifier: BUSL-1.1
⋮----
import "src/contracts/core/EmissionsController.sol";
import "src/test/utils/EigenLayerUnitTestSetup.sol";
⋮----
contract EmissionsControllerUnitTests is EigenLayerUnitTestSetup, IEmissionsControllerErrors, IEmissionsControllerEvents {
⋮----
// Use a fixed start time that's aligned with CALCULATION_INTERVAL_SECONDS (1 day = 86400)
// 7 days from an aligned base ensures proper alignment
⋮----
function setUp() public virtual override {
⋮----
function emptyOperatorSet() public pure returns (OperatorSet memory) {
⋮----
function emptyStrategiesAndMultipliers() public pure returns (IRewardsCoordinatorTypes.StrategyAndMultiplier[][] memory) {
⋮----
function defaultStrategiesAndMultipliers() public pure returns (IRewardsCoordinatorTypes.StrategyAndMultiplier[][] memory) {
⋮----
function _getTotalDistributionsProcessed() public returns (uint) {
⋮----
function _pressButton(uint epoch, uint length, uint expectedProcessed, bool expectedPressable) public {
⋮----
function _addDefaultDistribution(uint64 startEpoch, uint64 totalEpochs, uint64 weight) public {
⋮----
/// -----------------------------------------------------------------------
/// Initialization
⋮----
contract EmissionsControllerUnitTests_Initialization_Setters is EmissionsControllerUnitTests {
function test_constructor_setters() public {
⋮----
function test_initialize_setters() public {
⋮----
function test_revert_initialize_AlreadyInitialized() public {
⋮----
/// Permissionless Trigger
⋮----
contract EmissionsControllerUnitTests_pressButton is EmissionsControllerUnitTests {
⋮----
/// Revert Tests
⋮----
/// @notice Assert the function reverts when paused.
function test_revert_pressButton_WhenPaused() public {
⋮----
/// @notice Assert the function reverts when emissions have not started yet.
function test_revert_pressButton_EmissionsNotStarted() public {
⋮----
/// @notice Assert the function reverts when no distributions are left to be processed (none to start with).
function test_revert_pressButton_AllDistributionsProcessed_NoDistributions() public {
⋮----
/// @notice Assert the function reverts when no distributions are left to be processed (some to start with).
function test_revert_pressButton_AllDistributionsProcessed() public {
⋮----
/// Timing Fuzz Tests
⋮----
/// @notice Assert the function processes a single epoch distribution correctly.
function testFuzz_pressButton_SingleEpochDistribution(uint64 startEpoch) public {
⋮----
/// @notice Assert the function processes a multiple epoch distribution correctly.
function testFuzz_pressButton_MultipleEpochDistribution(uint64 startEpoch, uint64 totalEpochs) public {
⋮----
/// @notice Assert the function processes an infinite distribution correctly.
function testFuzz_pressButton_InfiniteDistribution(uint64 startEpoch) public {
⋮----
/// Minting Behavior Tests
⋮----
/// @notice Assert the function mints only once per epoch.
function test_pressButton_MintsOnlyOncePerEpoch() public {
⋮----
/// 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 {
⋮----
/// @notice Assert the function skips distributions that have ended.
function testFuzz_pressButton_SkipsEndedDistributions(uint64 startEpoch, uint64 totalEpochs) public {
⋮----
/// @notice Assert the function skips distributions with zero weight.
function testFuzz_pressButton_SkipsZeroWeightDistribution(uint64 startEpoch) public {
⋮----
/// Length Edge Cases
⋮----
function test_pressButton_LengthZeroProcessesNone() public {
⋮----
contract EmissionsControllerUnitTests_sweep is EmissionsControllerUnitTests {
⋮----
function test_revert_sweep_WhenPaused() public {
⋮----
/// @notice Assert the function transfers tokens to the incentive council.
function test_sweep_TransfersTokensToIncentiveCouncil() public {
⋮----
function test_sweep_DoesNothingWhenButtonPressable() public {
// Add distribution
⋮----
// Warp to epoch 0 - button is pressable
⋮----
// Give some EIGEN tokens directly to the controller
⋮----
// Sweep should do nothing when button is pressable
⋮----
// Tokens should still be in the controller
⋮----
function test_sweep_DoesNothingWhenBalanceZeroAfterButtonNotPressable() public {
// Don't add any distributions - button won't be pressable after start
⋮----
// Warp to epoch 0
⋮----
// Can't press button with no distributions
⋮----
// Balance is 0, sweep should do nothing (no transfer, no event)
⋮----
/// Owner Functions
⋮----
contract EmissionsControllerUnitTests_setIncentiveCouncil is EmissionsControllerUnitTests {
function test_revert_setIncentiveCouncil_ZeroAddress() public {
⋮----
function test_revert_setIncentiveCouncil_OnlyOwner(address notOwner) public {
⋮----
function testFuzz_setIncentiveCouncil_Correctness(address newIncentiveCouncil) public {
⋮----
/// Incentive Council Functions
⋮----
contract EmissionsControllerUnitTests_addDistribution is EmissionsControllerUnitTests {
function test_revert_addDistribution_OnlyIncentiveCouncil() public {
⋮----
function test_revert_addDistribution_DisabledDistribution() public {
⋮----
function test_revert_addDistribution_RewardsSubmissionsCannotBeEmpty() public {
⋮----
function test_revert_addDistribution_StartEpochMustBeInTheFuture() public {
⋮----
function testFuzz_revert_addDistribution_TotalWeightExceedsMax(uint weight) public {
⋮----
function test_revert_addDistribution_TotalWeightExceedsMax_MultipleDistributions() public {
// Add first distribution with weight 6000
⋮----
// Attempt to add second distribution with weight 5000, total would be 11000 > 10000
⋮----
function testFuzz_addDistribution_Correctness(uint weight, uint8 distributionTypeUint8) public {
⋮----
// Use defaultStrategiesAndMultipliers for non-Manual types, empty for Manual
⋮----
function test_revert_addDistribution_AllDistributionsMustBeProcessed() public {
// Add first distribution before emissions start
⋮----
// Warp to after emissions start (epoch 0)
⋮----
// Now there's 1 distribution but 0 processed, button is pressable
⋮----
// Attempt to add another distribution before processing the first one should revert
⋮----
contract EmissionsControllerUnitTests_updateDistribution is EmissionsControllerUnitTests {
function test_revert_updateDistribution_OnlyIncentiveCouncil() public {
⋮----
function test_revert_updateDistribution_NonExistentDistribution() public {
⋮----
cheats.expectRevert(stdError.indexOOBError); // team may want an explicit check for this
⋮----
function test_revert_updateDistribution_RewardsSubmissionsCannotBeEmpty() public {
⋮----
// NOTE: Fuzz test removed - covered by test_revert_updateDistribution_TotalWeightExceedsMax_MultipleDistributions
⋮----
function test_revert_updateDistribution_TotalWeightExceedsMax_MultipleDistributions() public {
⋮----
// Add second distribution with weight 3000
⋮----
// Attempt to update second distribution to weight 5000, total would be 11000 > 10000
⋮----
function test_revert_updateDistribution_AllDistributionsMustBeProcessed() public {
⋮----
// Attempt to update the distribution before processing it should revert
⋮----
/// View Functions
⋮----
contract EmissionsControllerUnitTests_getCurrentEpoch is EmissionsControllerUnitTests {
function test_getCurrentEpoch_MaxBeforeStart() public {
⋮----
function test_getCurrentEpoch_ZeroAtStart() public {
⋮----
function test_getCurrentEpoch_MonotonicallyIncreasingFromZero() public {
⋮----
contract EmissionsControllerUnitTests_isButtonPressable is EmissionsControllerUnitTests {
function test_isButtonPressable_NoDistributions() public {
// Before emissions start, no distributions
⋮----
// After emissions start, still no distributions
⋮----
function test_isButtonPressable_WithDistributions() public {
// Add a distribution
⋮----
// Should be pressable after emissions start
⋮----
function test_isButtonPressable_AfterProcessing() public {
⋮----
// Warp to emissions start
⋮----
// Process all distributions
⋮----
// Should not be pressable after processing all
⋮----
function test_isButtonPressable_BeforeEmissionsStart_WithDistributions() public {
// Add a distribution before emissions start
⋮----
totalEpochs: 0, // infinite duration
⋮----
// 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
⋮----
contract EmissionsControllerUnitTests_nextTimeButtonPressable is EmissionsControllerUnitTests {
function test_nextTimeButtonPressable_BeforeStart() public {
⋮----
function test_nextTimeButtonPressable_AtStart() public {
// At emissions start (epoch 0)
⋮----
function test_nextTimeButtonPressable_AfterMultipleEpochs() public {
// Warp to epoch 5
⋮----
function testFuzz_nextTimeButtonPressable_Correctness(uint numEpochs) public {
⋮----
// Warp to arbitrary epoch
⋮----
// Next button press time should be start of next epoch
⋮----
contract EmissionsControllerUnitTests_lastTimeButtonPressable is EmissionsControllerUnitTests {
function test_lastTimeButtonPressable_BeforeStart() public {
⋮----
function test_lastTimeButtonPressable_AtStart() public {
⋮----
function test_lastTimeButtonPressable_AfterMultipleEpochs() public {
// Warp to middle of epoch 5
⋮----
// Last time pressable should be start of epoch 5
⋮----
function testFuzz_lastTimeButtonPressable_Correctness(uint numEpochs) public {
⋮----
// Last button press time should be start of current epoch
⋮----
contract EmissionsControllerUnitTests_getTotalProcessableDistributions is EmissionsControllerUnitTests {
function test_getTotalProcessableDistributions_InitiallyZero() public {
⋮----
function test_getTotalProcessableDistributions_AfterAdding() public {
// Add first distribution
⋮----
// Add second distribution
⋮----
function testFuzz_getTotalProcessableDistributions_Correctness(uint8 count) public {
count = uint8(bound(count, 0, 50)); // Reasonable upper bound for gas
⋮----
contract EmissionsControllerUnitTests_getDistribution is EmissionsControllerUnitTests {
function test_revert_getDistribution_NonExistent() public {
⋮----
function test_getDistribution_SingleDistribution() public {
⋮----
// Retrieve and verify
⋮----
function test_getDistribution_MultipleDistributions() public {
⋮----
// Add multiple distributions with different parameters
⋮----
// Verify first distribution
⋮----
// Verify second distribution
⋮----
function test_getDistribution_AfterUpdate() public {
⋮----
// Update the distribution (new weight 4000 is still within limits)
⋮----
// Verify updated values
⋮----
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
⋮----
// Request length that exceeds available distributions from start=0
// Should return 2 distributions instead of reverting
⋮----
// Request length that exceeds available distributions from start=1
// Should return 1 distribution instead of reverting
⋮----
function test_getDistributions_All() public {
⋮----
// Add multiple distributions
⋮----
// Get all distributions
⋮----
function test_getDistributions_Subset() public {
// Add multiple distributions (total weight: 100 * 5 = 500, well under 10000 limit)
⋮----
// Get subset starting at index 1, 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
⋮----
// Get 0 length
⋮----
function test_getDistributions_SingleElement() public {
⋮----
// Get single element at index 1
⋮----
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
⋮----
// Ensure we don't go out of bounds
⋮----
// Add distributions
⋮----
// Get subset
⋮----
// Verify each element
````

## File: src/test/unit/KeyRegistrarUnit.t.sol
````
//SPDX-License-Identifier: BUSL-1.1
⋮----
import "@openzeppelin/contracts/utils/cryptography/ECDSA.sol";
⋮----
import "forge-std/Test.sol";
import "src/contracts/permissions/KeyRegistrar.sol";
import "src/contracts/interfaces/IKeyRegistrar.sol";
import "src/contracts/libraries/BN254.sol";
import "src/contracts/libraries/BN254SignatureVerifier.sol";
import "src/contracts/interfaces/IPermissionController.sol";
import "src/contracts/mixins/PermissionControllerMixin.sol";
import "src/test/utils/EigenLayerMultichainUnitTestSetup.sol";
import "src/contracts/libraries/OperatorSetLib.sol";
import "src/contracts/interfaces/ISignatureUtilsMixin.sol";
⋮----
contract KeyRegistrarUnitTests is EigenLayerMultichainUnitTestSetup, IKeyRegistrarErrors, IKeyRegistrarEvents, ISignatureUtilsMixinErrors {
⋮----
// Test accounts
⋮----
// Test addresses for ECDSA (20 bytes each)
⋮----
// Private keys for ECDSA addresses (for signature generation)
⋮----
// Test keys for BN254
⋮----
function setUp() public virtual override {
// The KeyRegistrar is deployed in the setUp of the EigenLayerMultichainUnitTestSetup
⋮----
// Set up ECDSA addresses that correspond to the private keys
⋮----
// Set up BN254 keys with proper G2 components
⋮----
// Valid G2 points that correspond to the private keys
⋮----
function _createOperatorSet(address avs, uint32 operatorSetId) internal pure returns (OperatorSet memory) {
⋮----
function _generateECDSASignature(address operator, OperatorSet memory operatorSet, address keyAddress, uint privKey)
⋮----
function _generateBN254Signature(address operator, OperatorSet memory operatorSet, bytes memory pubkey, uint privKey)
⋮----
/// @title KeyRegistrarUnitTests_configureOperatorSet
/// @notice Unit tests for KeyRegistrar.configureOperatorSet
contract KeyRegistrarUnitTests_configureOperatorSet is KeyRegistrarUnitTests {
function test_revert_unauthorized() public {
⋮----
function test_revert_invalidCurveType() public {
⋮----
function test_revert_configurationAlreadySet() public {
⋮----
// Try configuring the same curve type again
⋮----
function test_configureOperatorSet_ECDSA() public {
⋮----
function test_configureOperatorSet_BN254() public {
⋮----
function test_multipleOperatorSets() public {
⋮----
/// @title KeyRegistrarUnitTests_registerKey_ECDSA
/// @notice Unit tests for KeyRegistrar.registerKey with ECDSA keys
contract KeyRegistrarUnitTests_registerKey_ECDSA is KeyRegistrarUnitTests {
function test_revert_invalidFormat() public {
⋮----
// Invalid length (not 20 bytes)
⋮----
// Another invalid length
⋮----
function test_revert_zeroPubkey() public {
⋮----
function test_revert_invalidSignature() public {
⋮----
// Use wrong private key for signature
⋮----
ecdsaPrivKey2 // Wrong private key
⋮----
function test_revert_invalidSignature_malformed() public {
⋮----
// Malformed signature (wrong length)
⋮----
vm.expectRevert(); // Will revert with ECDSA-specific error
⋮----
function test_revert_invalidSignature_emptySignature() public {
⋮----
// Empty signature
⋮----
vm.expectRevert(); // Will revert with ECDSA recovery error
⋮----
function test_revert_alreadyRegistered() public {
⋮----
function test_revert_globallyRegistered() public {
⋮----
function test_revert_operatorSetNotConfigured() public {
⋮----
function test_revert_wrongCurveType() public {
// Configure for ECDSA but try to register BN254 key
⋮----
function test_registerECDSAKey() public {
⋮----
// Verify getOperatorFromSigningKey returns the correct operator and registration status
⋮----
/// @title KeyRegistrarUnitTests_registerKey_BN254
/// @notice Unit tests for KeyRegistrar.registerKey with BN254 keys
contract KeyRegistrarUnitTests_registerKey_BN254 is KeyRegistrarUnitTests {
⋮----
function test_revert_invalidKeyDataLength() public {
⋮----
function test_revert_invalidSignatureLength() public {
⋮----
function test_revert_invalidSignature_malformedData() public {
⋮----
// Malformed signature - wrong format
⋮----
vm.expectRevert(); // Will revert during abi.decode
⋮----
// Try to register the same operator again
⋮----
function test_registerBN254Key_wrongSignature() public {
⋮----
bn254PrivKey2 // Wrong private key
⋮----
function test_encodeBN254KeyData() public {
// Test that encodeBN254KeyData produces the expected encoding
⋮----
// Verify the encoded data matches our manual encoding
⋮----
// Decode to verify structure
⋮----
function test_encodeBN254KeyData_registerKey() public {
// Test that encoded data from encodeBN254KeyData can be used with registerKey
⋮----
// Use encodeBN254KeyData to prepare the key data
⋮----
// Generate signature for the encoded key
⋮----
// Register the key using the encoded data
⋮----
// Verify registration was successful
⋮----
// Verify the stored key matches what we registered
⋮----
function test_registerBN254Key() public {
⋮----
/// @title KeyRegistrarUnitTests_deregisterKey
/// @notice Unit tests for KeyRegistrar.deregisterKey
contract KeyRegistrarUnitTests_deregisterKey is KeyRegistrarUnitTests {
function test_revert_keyNotFound() public {
⋮----
vm.prank(operator2); // operator2 is not authorized to call on behalf of operator1
⋮----
function test_revert_operatorStillSlashable() public {
⋮----
// Set operator as slashable
⋮----
// Operator should not be able to deregister their key when still slashable
⋮----
function test_deregisterKey_ECDSA() public {
⋮----
// Set operator as not slashable
⋮----
function test_deregisterKey_BN254() public {
⋮----
/// @title KeyRegistrarUnitTests_ViewFunctions
/// @notice Unit tests for KeyRegistrar view functions
contract KeyRegistrarUnitTests_ViewFunctions is KeyRegistrarUnitTests {
function test_getKeyHash_unregisteredOperator() public {
⋮----
function test_getKeyHash_ECDSA() public {
⋮----
function test_getKeyHash_BN254() public {
⋮----
function test_isKeyGloballyRegistered() public {
⋮----
function test_getBN254Key_emptyForUnregistered() public {
⋮----
function test_getECDSAKey_emptyForUnregistered() public {
⋮----
function test_getECDSAAddress_zeroForUnregistered() public {
⋮----
function test_getECDSAKey_revertWrongCurveType() public {
⋮----
function test_getBN254Key_revertWrongCurveType() public {
⋮----
function test_version() public {
⋮----
function test_getOperatorSetCurveType_unconfigured() public {
⋮----
// Should return NONE for unconfigured operator set
⋮----
function test_getOperatorFromSigningKey_ECDSA() public {
⋮----
// Before registration, should return address(0) and false
⋮----
// Register key
⋮----
// After registration, should return the operator and true
⋮----
function test_getOperatorFromSigningKey_BN254() public {
⋮----
// Only pass in the G1 key
⋮----
function test_getOperatorFromSigningKey_multipleOperators() public {
⋮----
// Register different keys for different operators
⋮----
// Verify each key returns the correct operator and registration status
⋮----
function test_getOperatorFromSigningKey_sameKeyDifferentOperatorSets() public {
⋮----
// Register same operator with same key in first operator set
⋮----
// The same key should return the same operator for both operator sets
// But registration status will differ - true for operatorSet1, false for operatorSet2
⋮----
assertTrue(isReg1); // Registered in operatorSet1
⋮----
assertFalse(isReg2); // NOT registered in operatorSet2
⋮----
function test_getOperatorFromSigningKey_afterDeregistration() public {
⋮----
// Verify registration
⋮----
// Deregister
⋮----
// After deregistration, the key should still map to the operator (global registry persists)
// but the registration status should be false
⋮----
function test_getOperatorFromSigningKey_nonExistentKey() public {
⋮----
// Query for a key that was never registered
⋮----
function test_getOperatorFromSigningKey_revertUnconfiguredOperatorSet() public {
⋮----
// Don't configure the operator set - it will have CurveType.NONE
⋮----
// This should revert because the operator set is not configured
⋮----
/// @title KeyRegistrarUnitTests_MultipleOperatorSets
/// @notice Unit tests for KeyRegistrar with multiple operator sets
contract KeyRegistrarUnitTests_MultipleOperatorSets is KeyRegistrarUnitTests {
function test_multipleOperatorSets_differentKeyTypes() public {
⋮----
// Register ECDSA key for one operator set
⋮----
// Register BN254 key for another operator set
⋮----
// Verify both registrations
⋮----
// Verify key retrieval
⋮----
function test_multipleOperatorsRegistration() public {
⋮----
/// @title KeyRegistrarUnitTests_GlobalKeyPersistence
/// @notice Unit tests for global key persistence in KeyRegistrar
contract KeyRegistrarUnitTests_GlobalKeyPersistence is KeyRegistrarUnitTests {
function test_globalKeyPersistence_ECDSA() public {
⋮----
// Key should still be globally registered after deregistration
⋮----
function test_globalKeyPersistence_BN254() public {
⋮----
/// @title KeyRegistrarUnitTests_CrossCurveInteraction
/// @notice Unit tests for cross-curve type interactions in KeyRegistrar
contract KeyRegistrarUnitTests_CrossCurveInteraction is KeyRegistrarUnitTests {
function test_crossCurveGlobalUniqueness() public {
// Configure ECDSA and BN254 operator sets
⋮----
// Register ECDSA key
⋮----
// Register BN254 key (should succeed as they have different hashes)
⋮----
// Both should be registered
⋮----
/// @title KeyRegistrarUnitTests_SignatureVerification
/// @notice Unit tests for signature verification in KeyRegistrar
contract KeyRegistrarUnitTests_SignatureVerification is KeyRegistrarUnitTests {
⋮----
function test_verifyBN254Signature() public {
⋮----
// Generate signature with private key
⋮----
function test_verifyBN254Signature_revertInvalid() public {
⋮----
// Use a signature generated with the wrong private key - this should fail verification
⋮----
BN254.G1Point memory invalidSignature = msgPoint.scalar_mul(bn254PrivKey1); // Wrong private key
````

## File: src/test/unit/OperatorTableUpdaterUnit.t.sol
````
// SPDX-License-Identifier: BUSL-1.1
⋮----
import "src/contracts/multichain/OperatorTableUpdater.sol";
import "src/contracts/interfaces/IOperatorTableUpdater.sol";
import "src/test/utils/EigenLayerMultichainUnitTestSetup.sol";
import "src/contracts/multichain/BN254CertificateVerifier.sol";
⋮----
contract OperatorTableUpdaterUnitTests is
⋮----
/// @notice Pointers to the operatorTableUpdater and its implementation
⋮----
/// @notice The default operatorSet
⋮----
/// @notice The generator operatorSet params
⋮----
uint16 internal constant GLOBAL_ROOT_CONFIRMATION_THRESHOLD = 10_000; // 100% signoff threshold
⋮----
function setUp() public virtual override {
⋮----
// Setup a mock Bn254OperatorSetInfo for the initial table update on initialization
⋮----
// Deploy operatorTableUpdater
⋮----
address(this), // owner
0, // initialPausedStatus
generator, // generator
GLOBAL_ROOT_CONFIRMATION_THRESHOLD, // globalRootConfirmationThreshold
initialOperatorSetInfo // generatorInfo
⋮----
// Configure the BN254CertificateVerifierMock to point to the actual OperatorTableUpdater
⋮----
// Warp past the latest reference timestamp so that only *new* roots can be confirmed
⋮----
function _setLatestReferenceTimestampBN254(OperatorSet memory operatorSet, uint32 referenceTimestamp) internal {
⋮----
/// @dev Sets a valid certificate for the BN254 certificate verifier
function _setIsValidCertificate(BN254Certificate memory certificate, bool isValid) internal {
⋮----
/// @dev Sets a valid certificate for the ECDSA certificate verifier
function _setIsValidCertificate(ECDSACertificate memory certificate, bool isValid) internal {
⋮----
/// @dev Generates a random BN254 operator set info
function _generateRandomBN254OperatorSetInfo(Randomness r) internal returns (BN254OperatorSetInfo memory) {
⋮----
/// @dev Generates a random ECDSA operator set info
function _generateRandomECDSAOperatorInfos(Randomness r) internal returns (ECDSAOperatorInfo[] memory) {
⋮----
/// @dev Generates a random operator set config
function _generateRandomOperatorSetConfig(Randomness r) internal returns (OperatorSetConfig memory) {
⋮----
/// @dev Creates a global table root with a single operatorSetLeafHash
function _createGlobalTableRoot(Randomness r, bytes32 operatorSetLeafHash) internal returns (bytes32, uint32, bytes32[] memory) {
// Generate a random power of 2 between 2 and 2^16
⋮----
// Create leaves array with the specified size
⋮----
// Set a random index to be the operatorSetLeafHash
⋮----
// Fill remaining leaves with random data
⋮----
/// @dev Creates a global table root with multiple operatorSetLeafHashes
function _createGlobalTableRoot(Randomness r, bytes32[] memory operatorSetLeafHashes)
⋮----
// Generate a random power of 2 between the number of operatorSetLeafHashes and 2^16
⋮----
// Set the first n indices to be the operatorSetLeafHashes
⋮----
// Fill the leaves
⋮----
// Fill the remaining leaves with random data
⋮----
/// @dev Updates the global table root in the BN254 certificate verifier
function _updateGlobalTableRoot(bytes32 globalTableRoot) internal {
⋮----
// Use the generator reference timestamp (1) for the certificate since it always has a valid root
mockCertificate.referenceTimestamp = 1; // GENERATOR_REFERENCE_TIMESTAMP
⋮----
contract OperatorTableUpdaterUnitTests_initialize is OperatorTableUpdaterUnitTests {
function test_initialize_success() public view {
⋮----
// _latestReferenceTimestamp is set to block.timestamp during initialization
⋮----
// Generator reference timestamp is set to 1 in _updateGenerator
⋮----
// Check that the GENERATOR_GLOBAL_TABLE_ROOT is valid
⋮----
// Test that the generator config is properly set during initialization
⋮----
// Check the storage of the mock Bn254CertificateVerifier
⋮----
function test_initialize_revert_reinitialization() public {
⋮----
contract OperatorTableUpdaterUnitTests_confirmGlobalTableRoot is OperatorTableUpdaterUnitTests {
⋮----
// Initialize the mockCertificate with the generator reference timestamp
⋮----
function testFuzz_revert_futureTableRoot(Randomness r) public rand(r) {
⋮----
function testFuzz_revert_paused(Randomness r) public rand(r) {
// Pause the confirmGlobalTableRoot functionality (bit index 0)
uint pausedStatus = 1 << 0; // Set bit 0 to pause PAUSED_GLOBAL_ROOT_UPDATE
⋮----
// Try to confirm a global table root while paused
⋮----
function testFuzz_revert_staleCertificate(Randomness r) public rand(r) {
⋮----
function testFuzz_revert_InvalidMessageHash(Randomness r) public rand(r) {
⋮----
function test_revert_invalidCertificate() public {
⋮----
function testFuzz_correctness(Randomness r) public rand(r) {
⋮----
// Expect the global table root to be updated
⋮----
contract OperatorTableUpdaterUnitTests_updateOperatorTable_BN254 is OperatorTableUpdaterUnitTests {
function testFuzz_BN254_revert_paused(Randomness r) public rand(r) {
// Pause the updateOperatorTable functionality (bit index 1)
uint pausedStatus = 1 << 1; // Set bit 1 to pause PAUSED_OPERATOR_TABLE_UPDATE
⋮----
// Generate random operatorSetInfo and operatorSetConfig
⋮----
// First create a valid root
⋮----
// Try to update operator table while paused
⋮----
function testFuzz_BN254_revert_staleTableUpdate(Randomness r) public rand(r) {
⋮----
// First create a valid root so we don't get InvalidRoot error
⋮----
function testFuzz_BN254_revert_rootDisabled(Randomness r) public rand(r) {
⋮----
// Disable the root
⋮----
// First need to create a valid root before we can disable it
⋮----
// Try to update with a disabled global table root
⋮----
function testFuzz_BN254_revert_invalidOperatorSet(Randomness r) public rand(r) {
// Try to update the generator's operator table (which is not allowed)
⋮----
// Encode the operator table using the generator as the operatorSet
⋮----
// Create a global table root containing this operator set
⋮----
// Generate proof for the operatorSetInfo and operatorSetConfig
⋮----
// Try to update the generator's operator table
⋮----
function testFuzz_BN254_revert_invalidGlobalTableRoot(Randomness r) public rand(r) {
⋮----
// Include the operatorSetInfo and operatorSetConfig in the global table root & set it
⋮----
// Create a different valid root at a different timestamp
⋮----
// Generate proof for the operatorSetInfo and operatorSetConfig (still valid for original root)
⋮----
// Try to update with a global table root that exists but doesn't match the reference timestamp
// The error should be InvalidGlobalTableRoot because the global table root at originalTimestamp
// doesn't match wrongGlobalTableRoot
⋮----
function testFuzz_BN254_revert_invalidOperatorSetProof(Randomness r) public rand(r) {
⋮----
// Generate an invalid proof
⋮----
// Always expect InvalidOperatorSetProof for invalid random data
⋮----
function testFuzz_BN254_revert_invalidOperatorSetProof_length(Randomness r) public rand(r) {
⋮----
// Try to update with a proof that is too short
⋮----
function testFuzz_BN254_revert_invalidOperatorSetProof_index(Randomness r) public rand(r) {
⋮----
// Guarantee that index is beyond max index for the tree
⋮----
// Always expect InvalidIndex for index beyond max index for the tree
⋮----
function testFuzz_BN254_correctness(Randomness r) public rand(r) {
⋮----
// Encode the operatorSetInfo as bytes, as the CrossChainRegistry expects the operatorTable to be encoded as a bytes array;
⋮----
// Update the operator table
⋮----
function testFuzz_BN254_silentReturn_alreadyUpdated(Randomness r) public rand(r) {
⋮----
// Create global table root and update it
⋮----
// Generate proof
⋮----
// First update should succeed
⋮----
// Set the reference timestamp as already updated in the certificate verifier mock
⋮----
// Second update with same reference timestamp should silently return
⋮----
// Verify no events were emitted on the second call
⋮----
contract OperatorTableUpdaterUnitTests_updateOperatorTable_ECDSA is OperatorTableUpdaterUnitTests {
function _setLatestReferenceTimestampECDSA(OperatorSet memory operatorSet, uint32 referenceTimestamp) internal {
⋮----
function testFuzz_ECDSA_revert_paused(Randomness r) public rand(r) {
⋮----
// Generate random operatorInfos and operatorSetConfig
⋮----
function testFuzz_ECDSA_revert_rootDisabled(Randomness r) public rand(r) {
⋮----
function testFuzz_ECDSA_revert_staleTableUpdate(Randomness r) public rand(r) {
⋮----
function testFuzz_ECDSA_revert_invalidOperatorSet(Randomness r) public rand(r) {
⋮----
// Generate proof for the operatorInfos and operatorSetConfig
⋮----
function testFuzz_ECDSA_correctness(Randomness r) public rand(r) {
⋮----
// Encode the operatorInfos as bytes, as the CrossChainRegistry expects the operatorTable to be encoded as a bytes array;
⋮----
// Include the operatorInfos and operatorSetConfig in the global table root & set it
⋮----
function testFuzz_ECDSA_silentReturn_alreadyUpdated(Randomness r) public rand(r) {
⋮----
contract OperatorTableUpdaterUnitTests_updateOperatorTable_InvalidCurveType is OperatorTableUpdaterUnitTests {
function testFuzz_revert_invalidCurveType_inGetCertificateVerifier(Randomness r) public rand(r) {
// Generate random operatorSetInfo and operatorSetConfig with invalid curve type
⋮----
// Use CurveType.NONE (0) which is invalid
⋮----
// Should revert with InvalidCurveType when trying to update with CurveType.NONE
// This will revert in getCertificateVerifier, not in the else branch
⋮----
contract OperatorTableUpdaterUnitTests_multipleCurveTypes is OperatorTableUpdaterUnitTests {
⋮----
// Generate random BN254 operatorSetInfo and operatorSetConfig
⋮----
// Generate random ECDSA operatorInfos and operatorSetConfig
⋮----
// Update the operator table for bn254
⋮----
// Update the operator table for ecdsa
⋮----
contract OperatorTableUpdaterUnitTests_getCertificateVerifier is OperatorTableUpdaterUnitTests {
function test_revert_invalidCurveType() public {
⋮----
// Get the certificate verifier
⋮----
// Expect the certificate verifier to be the correct address
⋮----
contract OperatorTableUpdaterUnitTests_getters is OperatorTableUpdaterUnitTests {
function testFuzz_getGlobalTableRootByTimestamp(Randomness r) public rand(r) {
⋮----
// Set a global table root
⋮----
// Test getters
⋮----
function test_getGenerator() public view {
⋮----
function test_getGeneratorReferenceTimestamp() public view {
⋮----
assertEq(timestamp, 1); // Generator reference timestamp is set to 1 during initialization
⋮----
function testFuzz_getGlobalTableUpdateMessageHash(Randomness r) public rand(r) {
⋮----
// Verify the hash is deterministic
⋮----
// Verify hash changes with different inputs
⋮----
contract OperatorTableUpdaterUnitTests_setGlobalRootConfirmationThreshold is OperatorTableUpdaterUnitTests {
function testFuzz_revert_onlyOwner(Randomness r) public rand(r) {
⋮----
// Should revert when called by non-owner
⋮----
function testFuzz_revert_invalidThreshold(Randomness r) public rand(r) {
⋮----
// Generate random threshold (0 to 10000 bps = 0% to 100%)
⋮----
// Expect the event to be emitted
⋮----
// Verify the storage was updated
⋮----
contract OperatorTableUpdaterUnitTests_disableRoot is OperatorTableUpdaterUnitTests {
function testFuzz_revert_onlyPauser(Randomness r) public rand(r) {
⋮----
// Should revert when called by non-pauser
⋮----
function testFuzz_revert_invalidRoot(Randomness r) public rand(r) {
⋮----
// Verify the root is not valid initially
⋮----
// Should revert when trying to disable a non-existent/invalid root
⋮----
function test_revert_cannotDisableGeneratorRoot() public {
// The GENERATOR_GLOBAL_TABLE_ROOT is valid by default after initialization
⋮----
// Verify the generator root is valid
⋮----
// Try to disable the generator root as pauser (should revert)
⋮----
// Verify the root is valid
⋮----
// Disable the root as pauser
⋮----
// Verify the root is now invalid
⋮----
contract OperatorTableUpdaterUnitTests_updateGenerator is OperatorTableUpdaterUnitTests {
⋮----
// Create a new generator
⋮----
// Generate random operator set info and config
⋮----
// The reference timestamp will be 1 (GENERATOR_REFERENCE_TIMESTAMP)
// The config will have maxStalenessPeriod = 0 and owner = address(operatorTableUpdater)
⋮----
// Expect the GeneratorUpdated event
⋮----
// Check that the generator is updated
⋮----
contract OperatorTableUpdaterUnitTests_isRootValid is OperatorTableUpdaterUnitTests {
function testFuzz_isRootValid(Randomness r) public rand(r) {
⋮----
// Initially should not be valid
⋮----
// Create a valid root
⋮----
// Should now be valid
⋮----
// Should now be invalid
⋮----
function testFuzz_isRootValidByTimestamp(Randomness r) public rand(r) {
// Set a global table root for a specific timestamp
⋮----
// Should be valid
⋮----
// Should now be invalid when queried by timestamp
⋮----
contract OperatorTableUpdaterUnitTests_IntegrationScenarios is OperatorTableUpdaterUnitTests {
function testRevert_updateGenerator_alreadyInitialized() public {
// Step 1: Create a new generator and only update it (no initial setup)
⋮----
// Step 2: Set a non-zero reference timestamp (simulating that it was already initialized elsewhere)
⋮----
// Try to update generator when it already has a non-zero reference timestamp
⋮----
// This should fail because the generator already has a non-zero reference timestamp
⋮----
function test_updateGenerator_success() public {
// Setup generator info
⋮----
// Update generator
⋮----
// Verify the generator was updated
⋮----
/// @notice This test simulates a real-world ops scenario of disabling a root, updating the generator, and confirming a new global table root
function test_disableRoot_updategenerator_confirmGlobalTableRoot() public {
// Step 1: Set an initial global table root at a different timestamp to avoid conflicting with generator
vm.warp(100); // Use a different timestamp
bytes32 oldGlobalTableRoot = bytes32(uint(999)); // Use a different value to avoid conflicts
⋮----
// Step 2: Disable the old root as pauser
⋮----
// Step 3: Create and update a new generator
⋮----
// Step 4: Update the generator operator table
⋮----
// Step 5: Confirm a new global table root with the new generator
⋮----
newCertificate.referenceTimestamp = 1; // GENERATOR_REFERENCE_TIMESTAMP
⋮----
// Set the certificate as valid for the new generator
⋮----
// This should succeed with the new generator
⋮----
// Verify the new root was set
⋮----
function test_updateTable_updateGenerator_updateNewTable() public {
// Step 1: Set up initial global table root and update an operator table
⋮----
// Create operator table data for the first update
⋮----
// Create the operator set to update
⋮----
// Encode the operator table
⋮----
bytes32[] memory leaves = new bytes32[](4); // Simple 4-leaf tree
⋮----
// Update the global table root
⋮----
// Generate proof for the operator set
⋮----
// Update the first operator table
⋮----
0, // operatorSetIndex
⋮----
// Verify the update was successful
⋮----
// Step 2: Update the generator
⋮----
// Set up operator info for the new generator
⋮----
// Update the generator
⋮----
// Step 3: Create and update a new operator table with the new generator
⋮----
// Move time forward
⋮----
// Create a new operator set
⋮----
// Create operator table data for the second update
⋮----
// Encode the new operator table
⋮----
// Create a new global table root
⋮----
// Create a certificate for the new global table root signed by the new generator
⋮----
// Confirm the new global table root with the new generator
⋮----
// Generate proof for the second operator set
⋮----
// Update the second operator table
⋮----
// Verify the second update was successful
````

## File: src/test/unit/PausableUnit.t.sol
````
// SPDX-License-Identifier: BUSL-1.1
⋮----
import "forge-std/Test.sol";
⋮----
import "../../contracts/permissions/PauserRegistry.sol";
import "../harnesses/PausableHarness.sol";
⋮----
contract PausableUnitTests is Test {
⋮----
/// @notice Emitted when the pause is triggered by `account`, and changed to `newPausedStatus`.
event Paused(address indexed account, uint newPausedStatus);
⋮----
/// @notice Emitted when the pause is lifted by `account`, and changed to `newPausedStatus`.
event Unpaused(address indexed account, uint newPausedStatus);
⋮----
function setUp() public virtual {
⋮----
function testPause(uint previousPausedStatus, uint newPausedStatus) public {
⋮----
function testPause_RevertsWhenCalledByNotPauser(address notPauser, uint newPausedStatus) public {
⋮----
function testPauseAll(uint previousPausedStatus) public {
⋮----
function testPauseAll_RevertsWhenCalledByNotPauser(address notPauser) public {
⋮----
function testPause_RevertsWhenTryingToUnpause(uint previousPausedStatus, uint newPausedStatus) public {
// filter to only fuzzed inputs which would (improperly) flip any bits to '0'.
⋮----
function testPauseSingleIndex(uint previousPausedStatus, uint8 indexToPause) public {
⋮----
function testUnpause(uint previousPausedStatus, uint newPausedStatus) public {
// ensure newPausedStatus is a subset of previousPausedStatus (i.e. only unpause)
previousPausedStatus = type(uint).max; // all bits set to 1
newPausedStatus = previousPausedStatus & (type(uint).max - 1); // clear lowest bit
⋮----
function testUnpause_RevertsWhenCalledByNotUnpauser(address notUnpauser, uint newPausedStatus) public {
⋮----
function testUnpause_RevertsWhenTryingToPause(uint previousPausedStatus, uint newPausedStatus) public {
// filter to only fuzzed inputs which would (improperly) flip any bits to '1'.
````

## File: src/test/unit/PauserRegistryUnit.t.sol
````
// SPDX-License-Identifier: BUSL-1.1
⋮----
import "forge-std/Test.sol";
⋮----
import "../../contracts/interfaces/IPausable.sol";
import "../../contracts/permissions/PauserRegistry.sol";
⋮----
contract PauserRegistryUnitTests is Test {
⋮----
event PauserStatusChanged(address pauser, bool canPause);
⋮----
event UnpauserChanged(address previousUnpauser, address newUnpauser);
⋮----
function setUp() public virtual {
⋮----
function testSetIsPauserTrue(address newPauser) public {
⋮----
function testSetIsPauserFalse() public {
⋮----
function testSetUnpauser(address newUnpauser) public {
⋮----
function testSetPauser_RevertsWhenCallingFromNotUnpauser(address notUnpauser, address newPauser) public {
⋮----
function testSetUnpauser_RevertsWhenCallingFromNotUnpauser(address notUnpauser, address newUnpauser) public {
⋮----
function testSetPauser_RevertsWhenSettingToZeroAddress() public {
⋮----
function testSetUnpauser_RevertsWhenSettingToZeroAddress() public {
````

## File: src/test/unit/PermissionControllerUnit.t.sol
````
// SPDX-License-Identifier: BUSL-1.1
⋮----
import "forge-std/Test.sol";
⋮----
import "src/contracts/permissions/PermissionController.sol";
import "src/contracts/interfaces/IPermissionController.sol";
⋮----
import "src/test/utils/EigenLayerUnitTestSetup.sol";
⋮----
contract PermissionControllerUnitTests is EigenLayerUnitTestSetup, IPermissionControllerEvents, IPermissionControllerErrors {
⋮----
function setUp() public virtual override {
// Setup - already deploys permissionController
⋮----
// Set targets
⋮----
contract PermissionControllerUnitTests_AddPendingAdmin is PermissionControllerUnitTests {
function testFuzz_getAdmin_notSet(address account) public view filterFuzzedAddressInputs(account) {
⋮----
/// @notice Tests the setAdmin function when it has not been initialized
function test_revert_caller_not_account() public {
⋮----
function test_revert_adminPending() public {
// Set admin to be pending
⋮----
// Expect revert
⋮----
function test_addPendingAdmin_initialSet() public {
// Expect emit
⋮----
// Check storage
⋮----
contract PermissionControllerUnitTests_RemovePendingAdmin is PermissionControllerUnitTests {
⋮----
// Setup
⋮----
function test_revert_notAdmin() public {
⋮----
function test_revert_notPending() public {
⋮----
function test_removePendingAdmin() public {
⋮----
contract PermissionControllerUnitTests_AcceptAdmin is PermissionControllerUnitTests {
⋮----
// Set admin
⋮----
function test_revert_adminNotPending() public {
⋮----
function test_acceptAdmin() public {
⋮----
function test_addMultipleAdmin_fromAccount() public {
// Add another pending admin
⋮----
// Assert pending admins length
⋮----
// Accept admins
⋮----
function test_addMultipleAdmin_newAdminAdds() public {
// Accept admin
⋮----
contract PermissionControllerUnitTests_RemoveAdmin is PermissionControllerUnitTests {
⋮----
// Set admins
⋮----
function test_revert_adminNotSet() public {
⋮----
function test_revert_cannotHaveZeroAdmins() public {
// Remove admin2
⋮----
// Remove admin
⋮----
function test_removeAdmin() public {
⋮----
// Assert that admin2 is now the only admin
⋮----
contract PermissionControllerUnitTests_SetAppointee is PermissionControllerUnitTests {
⋮----
// Set & accept admin
⋮----
function test_setAppointee() public {
⋮----
// Validate Permissions
⋮----
function test_revert_appointeeAlreadySet() public {
// Set appointee
⋮----
function test_setMultipleAppointees() public {
// Set appointees
⋮----
function _validateSetAppointee(address accountToCheck, address appointee, address target, bytes4 selector) internal view {
⋮----
function _validateAppointeePermissions(address accountToCheck, address appointee, address target, bytes4 selector) internal view {
⋮----
function _validateGetAppointees(address accountToCheck, address appointee, address target, bytes4 selector) internal view {
⋮----
contract PermissionControllerUnitTests_RemoveAppointee is PermissionControllerUnitTests {
⋮----
function test_removeAppointee() public {
⋮----
function test_revert_appointeeNotSet() public {
⋮----
function test_removeMultipleAppointees() public {
// Remove appointees
⋮----
// Tests that the encoding from adding an appointee is properly decoded
function test_symmetricalTargetSelector() public view {
// Test Decoding
⋮----
function _validateRemoveAppointee(address accountToCheck, address appointee, address target, bytes4 selector) internal view {
⋮----
function _validateAppointeePermissionsRemoved(address accountToCheck, address appointee, address target, bytes4 selector)
⋮----
function _validateGetAppointeesRemoved(address accountToCheck, address appointee, address target, bytes4 selector) internal view {
````

## File: src/test/unit/ProtocolRegistryUnit.t.sol
````
// SPDX-License-Identifier: BUSL-1.1
⋮----
import "src/contracts/core/ProtocolRegistry.sol";
import "src/test/utils/EigenLayerUnitTestSetup.sol";
⋮----
contract ProtocolRegistryUnitTests is EigenLayerUnitTestSetup, IProtocolRegistryEvents, IProtocolRegistryErrors {
⋮----
function setUp() public virtual override {
⋮----
function _deployProtocolRegistry(address proxyAdmin) internal returns (ProtocolRegistry registry) {
⋮----
/// -----------------------------------------------------------------------
/// initialize()
⋮----
function test_initialize_Correctness() public {
⋮----
/// ship()
⋮----
function test_ship_OnlyOwner() public {
⋮----
function test_ship_SingleDeployment() public {
⋮----
// Check version getter
⋮----
// Check major version getter
⋮----
function test_ship_MultipleDeployments() public {
⋮----
function test_ship_revert_arrayLengthMismatch_addressesConfigs() public {
⋮----
function test_ship_revert_arrayLengthMismatch_configsNames() public {
⋮----
function test_ship_revert_zeroAddress() public {
⋮----
addresses[1] = address(0); // Zero address
⋮----
function test_ship_revert_emptyName() public {
⋮----
names[1] = ""; // Empty name
⋮----
function test_ship_overwriteName_deletesOldConfig() public {
⋮----
// Ship with old address
⋮----
// Verify old address is set
⋮----
// Ship same name with new address - should emit DeploymentConfigDeleted for old address
⋮----
// Verify new address is set
⋮----
// Verify total deployments is still 1 (not 2)
⋮----
function test_ship_sameNameSameAddress_noDeleteEvent() public {
⋮----
// Ship with address
⋮----
// Ship same name with same address - should NOT emit DeploymentConfigDeleted
⋮----
// We only expect DeploymentShipped, not DeploymentConfigDeleted
⋮----
/// configure()
⋮----
function test_configure_OnlyOwner() public {
// First ship a deployment
⋮----
function test_configure_revert_unshippedName() public {
⋮----
function test_configure_succeeds_shippedName() public {
⋮----
// First ship the address
⋮----
// Now configure should succeed
⋮----
function test_configure_Correctness() public {
⋮----
// Update config
⋮----
/// pauseAll()
⋮----
function test_pauseAll_OnlyPauserMultisig() public {
⋮----
function test_pauseAll_PausableContracts() public {
⋮----
// Check hecks for version and major version
⋮----
function test_pauseAll_SkipsDeprecated() public {
⋮----
/// getAddress()
⋮----
function test_getAddress_ExistingDeployment() public {
⋮----
// Check version and major version
⋮----
/// getDeployment()
⋮----
function test_getDeployment() public {
⋮----
/// getAllDeployments()
⋮----
function test_getAllDeployments_Empty() public {
⋮----
function test_getAllDeployments_Multiple() public {
⋮----
// Check version & major version
⋮----
/// totalDeployments()
⋮----
function test_totalDeployments_InitiallyZero() public {
⋮----
function test_totalDeployments_IncreasesWithShip() public {
⋮----
// Test version and major version
⋮----
// Mock contracts for testing
contract PausableMock {
⋮----
function pauseAll() external {
⋮----
function paused() external view returns (bool) {
⋮----
contract ProxyAdminMock {
⋮----
function setImplementation(address proxy, address implementation) external {
⋮----
function getProxyImplementation(address proxy) external view returns (address) {
````

## File: src/test/unit/ReleaseManagerUnit.t.sol
````
// SPDX-License-Identifier: BUSL-1.1
⋮----
import "src/contracts/core/ReleaseManager.sol";
import "src/test/utils/EigenLayerUnitTestSetup.sol";
import "src/contracts/interfaces/IReleaseManager.sol";
import "src/contracts/interfaces/IPermissionController.sol";
import "src/contracts/libraries/OperatorSetLib.sol";
⋮----
contract ReleaseManagerUnitTests is EigenLayerUnitTestSetup, IReleaseManagerErrors, IReleaseManagerEvents {
⋮----
/// -----------------------------------------------------------------------
/// Constants
⋮----
/// Contracts Under Test
⋮----
/// Test Data
⋮----
/// Setup
⋮----
function setUp() public virtual override {
⋮----
// Deploy ReleaseManager
⋮----
// Setup default test data
⋮----
/// Internal Helper Functions
⋮----
function _createRelease(Artifact[] memory artifacts, uint32 upgradeByTime) internal pure returns (Release memory) {
⋮----
function _createReleaseWithArtifacts(uint numArtifacts, uint32 upgradeByTime) internal pure returns (Release memory) {
⋮----
function _publishRelease(OperatorSet memory operatorSet, Release memory release) internal returns (uint) {
⋮----
function _checkReleaseStorage(OperatorSet memory operatorSet, uint releaseId, Release memory expectedRelease) internal view {
⋮----
contract ReleaseManagerUnitTests_Initialization is ReleaseManagerUnitTests {
function test_constructor() public {
// Test that constructor sets the correct values
⋮----
contract ReleaseManagerUnitTests_publishRelease is ReleaseManagerUnitTests {
function test_revert_MustPublishMetadataURI() public {
⋮----
function test_revert_InvalidUpgradeByTime() public {
// Create release with past timestamp
⋮----
function test_UpgradeByTimeEqualToZero() public {
// Create release with upgradeByTime 0
⋮----
function test_UpgradeByTimeEqualToNow() public {
// Create release with current timestamp (edge case)
⋮----
// Should pass since requirement is >=
⋮----
function test_revert_permissionDenied() public {
// Remove permission
⋮----
function test_publishSingleRelease() public {
// Check event emission
⋮----
// Publish release
⋮----
// Verify release ID
⋮----
// Verify storage
⋮----
// Verify total releases
⋮----
function testFuzz_publishUpgradeByTime(uint upgradeByTime) public {
⋮----
function testFuzz_publishMultipleReleases(uint numReleases) public {
⋮----
// Check event
⋮----
// Publish and verify ID
⋮----
// Verify total count
⋮----
function test_publishReleaseWithMultipleArtifacts() public {
// Create release with many artifacts
⋮----
// Publish
⋮----
// Verify all artifacts stored correctly
⋮----
function test_publishReleaseEmptyArtifacts() public {
// Create release with no artifacts
⋮----
// Should succeed
⋮----
function testFuzz_publishReleaseDifferentOperatorSets(uint32 operatorSetId1, uint32 operatorSetId2) public {
⋮----
// Publish to first operator set
⋮----
// Publish to second operator set
⋮----
// Verify independent storage
⋮----
contract ReleaseManagerUnitTests_getTotalReleases is ReleaseManagerUnitTests {
function test_getTotalReleases_noReleases() public view {
⋮----
function test_getTotalReleases_afterPublish() public {
// Publish some releases
⋮----
function testFuzz_getTotalReleases_multiplePublishes(uint8 numReleases) public {
⋮----
function test_getTotalReleases_differentOperatorSets() public {
⋮----
// Publish to different sets
⋮----
contract ReleaseManagerUnitTests_getRelease is ReleaseManagerUnitTests {
function test_revert_getRelease_outOfBounds() public {
// Try to get non-existent release
vm.expectRevert(); // Array out of bounds
⋮----
function test_getRelease_validId() public {
// Publish a release
⋮----
// Get and verify
⋮----
function testFuzz_getRelease_multipleReleases(uint8 numReleases, uint8 targetIndex) public {
⋮----
// Publish multiple releases
⋮----
// Get specific release and verify
⋮----
function test_getRelease_afterMultiplePublishes() public {
// Publish three different releases
⋮----
// Verify each can be retrieved correctly
⋮----
contract ReleaseManagerUnitTests_getLatestRelease is ReleaseManagerUnitTests {
function test_revert_getLatestRelease_noReleases() public {
⋮----
function test_getLatestRelease_singleRelease() public {
// Publish one release
⋮----
// Get latest
⋮----
function testFuzz_getLatestRelease_multipleReleases(uint8 numReleases) public {
⋮----
// Get latest and verify it's the last one published
⋮----
function test_getLatestRelease_afterUpdates() public {
// Publish initial release
⋮----
// Verify latest is first
⋮----
// Publish second release
⋮----
// Verify latest is now second
⋮----
contract ReleaseManagerUnitTests_EdgeCases is ReleaseManagerUnitTests {
function testFuzz_largeArtifactArray(uint16 numArtifacts) public {
⋮----
function test_boundaryTimestamps() public {
// Test with max uint32 timestamp
⋮----
function test_multipleOperatorSetsIndependence() public {
// Create multiple operator sets
⋮----
// Grant permission for second AVS
⋮----
// Publish to each
⋮----
// Verify independence
⋮----
contract ReleaseManagerUnitTests_getLatestUpgradeByTime is ReleaseManagerUnitTests {
function test_revert_getLatestUpgradeByTime_noReleases() public {
⋮----
function test_getLatestUpgradeByTime_singleRelease() public {
⋮----
// Get latest upgrade by time
⋮----
function test_getLatestUpgradeByTime_multipleReleases() public {
⋮----
contract ReleaseManagerUnitTests_isValidRelease is ReleaseManagerUnitTests {
function test_revert_isValidRelease_noReleases() public {
⋮----
function test_isValidRelease_singleRelease() public {
⋮----
// Check if the release is the latest
⋮----
function test_isValidRelease_multipleReleases() public {
⋮----
contract ReleaseManagerUnitTests_publishMetadataURI is ReleaseManagerUnitTests {
function test_revert_InvalidMetadataURI() public {
⋮----
function test_publishMetadataURI_Correctness() public {
````

## File: src/test/unit/RewardsCoordinatorUnit.t.sol
````
// SPDX-License-Identifier: BUSL-1.1
⋮----
import "@openzeppelin/contracts/mocks/ERC1271WalletMock.sol";
import "@openzeppelin/contracts/token/ERC20/presets/ERC20PresetFixedSupply.sol";
⋮----
import "src/contracts/core/RewardsCoordinator.sol";
import "src/contracts/strategies/StrategyBase.sol";
⋮----
import "src/test/utils/EigenLayerUnitTestSetup.sol";
import "src/test/mocks/Reenterer.sol";
import "src/test/mocks/ERC20Mock.sol";
⋮----
/// @notice Unit testing of the RewardsCoordinator contract
/// Contracts tested: RewardsCoordinator
/// Contracts not mocked: StrategyBase, PauserRegistry
contract RewardsCoordinatorUnitTests is EigenLayerUnitTestSetup, IRewardsCoordinatorEvents, IRewardsCoordinatorErrors {
// used for stack too deep
⋮----
// Contract under test
⋮----
// Mocks
⋮----
// Config Variables
/// @notice intervals(epochs) are 1 day: https://github.com/eigenfoundation/ELIPs/blob/main/ELIPs/ELIP-001.md#updated-calculation-interval-seconds
⋮----
/// @notice Max duration is 5 epochs (2 weeks * 5 = 10 weeks in seconds)
⋮----
/// @notice Lower bound start range is ~3 months into the past, multiple of CALCULATION_INTERVAL_SECONDS
⋮----
/// @notice Upper bound start range is ~1 month into the future, multiple of CALCULATION_INTERVAL_SECONDS
⋮----
/// @notice absolute min timestamp that a rewards can start at
⋮----
/// @notice Equivalent to 100%, but in basis points.
⋮----
/// @notice Delay in timestamp before a posted root can be claimed against
⋮----
/// @notice the split for all operators across all avss
⋮----
// RewardsCoordinator Constants
⋮----
/// @dev Index for flag that pauses calling createAVSRewardsSubmission
⋮----
/// @dev Index for flag that pauses calling createRewardsForAllSubmission
⋮----
/// @dev Index for flag that pauses claiming
⋮----
/// @dev Index for flag that pauses submitRoots
⋮----
/// @dev Index for flag that pauses rewardAllStakersAndOperators
⋮----
/// @dev Index for flag that pauses calling createOperatorDirectedAVSRewardsSubmission
⋮----
/// @dev Index for flag that pauses calling setOperatorAVSSplit
⋮----
/// @dev Index for flag that pauses calling setOperatorPISplit
⋮----
/// @dev Index for flag that pauses calling setOperatorSetSplit
⋮----
/// @dev Index for flag that pauses calling setOperatorSetPerformanceRewardsSubmission
⋮----
/// @dev Index for flag that pauses calling createUniqueStakeRewardsSubmission
⋮----
/// @dev Index for flag that pauses calling createTotalStakeRewardsSubmission
⋮----
// RewardsCoordinator entities
⋮----
function setUp() public virtual override {
// Setup
⋮----
// Deploy RewardsCoordinator proxy and implementation
⋮----
address(this), // initOwner
0, // 0 is initialPausedStatus
⋮----
// Deploy mock token and strategy
⋮----
// Exclude from fuzzed tests
⋮----
// Set the timestamp to some time after the genesis rewards timestamp
⋮----
/// @notice deploy token to owner and approve rewardsCoordinator. Used for deploying reward tokens
function _deployMockRewardTokens(address owner, uint numTokens) internal virtual {
⋮----
function _getBalanceForTokens(IERC20[] memory tokens, address holder) internal view returns (uint[] memory) {
⋮----
function _maxTimestamp(uint32 timestamp1, uint32 timestamp2) internal pure returns (uint32) {
⋮----
function _assertRewardsClaimedEvents(bytes32 root, RewardsMerkleClaim memory claim, address recipient) internal {
⋮----
/// @notice given address and array of reward tokens, return array of cumulativeClaimed amonts
function _getCumulativeClaimed(address earner, RewardsMerkleClaim memory claim) internal view returns (uint[] memory) {
⋮----
/// @notice given a claim, return the new cumulativeEarnings for each token
function _getCumulativeEarnings(RewardsMerkleClaim memory claim) internal pure returns (uint[] memory) {
⋮----
function _getClaimTokenBalances(address earner, RewardsMerkleClaim memory claim) internal view returns (uint[] memory) {
⋮----
/// @dev Sort to ensure that the array is in ascending order for strategies
function _sortArrayAsc(IStrategy[] memory arr) internal pure returns (IStrategy[] memory) {
⋮----
contract RewardsCoordinatorUnitTests_initializeAndSetters is RewardsCoordinatorUnitTests {
function testFuzz_setClaimerFor(address earner, address claimer) public filterFuzzedAddressInputs(earner) {
⋮----
function test_setClaimerFor_UAM_revert_staker(address earner, address claimer) public filterFuzzedAddressInputs(earner) {
⋮----
function test_setClaimerFor_UAM_AVS() public {
⋮----
// Set AVS
⋮----
// Initialize UAM
⋮----
// Set claimer for AVS
⋮----
function test_setClaimerFor_UAM_Operator() public {
⋮----
// Set operator
⋮----
// Set claimer for operator
⋮----
function testFuzz_setActivationDelay(uint32 activationDelay) public {
⋮----
function testFuzz_setActivationDelay_Revert_WhenNotOwner(address caller, uint32 activationDelay)
⋮----
function testFuzz_setDefaultOperatorSplit(uint16 defaultSplitBips) public {
⋮----
function testFuzz_setDefaultOperatorSplit_Revert_WhenSplitGreaterThan100(uint16 defaultSplitBips) public {
⋮----
function testFuzz_setDefaultOperatorSplit_Revert_WhenNotOwner(address caller, uint16 defaultSplitBips)
⋮----
function testFuzz_setRewardsUpdater(address newRewardsUpdater) public {
⋮----
function testFuzz_setRewardsUpdater_Revert_WhenNotOwner(address caller, address newRewardsUpdater)
⋮----
function testFuzz_setRewardsForAllSubmitter(address submitter, bool newValue) public {
⋮----
function testFuzz_setRewardsForAllSubmitter_Revert_WhenNotOwner(address caller, address submitter, bool newValue)
⋮----
function testFuzz_setFeeRecipient(address newFeeRecipient) public {
⋮----
function testFuzz_setFeeRecipient_Revert_WhenNotOwner(address caller, address newFeeRecipient)
⋮----
function test_setFeeRecipient_Revert_WhenAddressZero() public {
⋮----
contract RewardsCoordinatorUnitTests_setOptInForProtocolFee is RewardsCoordinatorUnitTests {
function testFuzz_setOptInForProtocolFee(address submitter, bool optIn) public filterFuzzedAddressInputs(submitter) {
⋮----
function testFuzz_setOptInForProtocolFee_UAM(address submitter, bool optIn) public filterFuzzedAddressInputs(submitter) {
⋮----
// Set UAM
⋮----
contract RewardsCoordinatorUnitTests_setOperatorAVSSplit is RewardsCoordinatorUnitTests {
// Revert when paused
function testFuzz_Revert_WhenPaused(address operator, address avs, uint16 split) public filterFuzzedAddressInputs(operator) {
⋮----
// Revert when split is greater than 100%
function testFuzz_Revert_WhenSplitGreaterThan100(address operator, address avs, uint16 split)
⋮----
function testFuzz_setOperatorAVSSplit(address operator, address avs, uint16 split) public filterFuzzedAddressInputs(operator) {
⋮----
function testFuzz_setOperatorAVSSplit_UAM(address operator, address avs, uint16 split) public filterFuzzedAddressInputs(operator) {
⋮----
// Testing that the split has been initialized for the first time.
function testFuzz_setOperatorAVSSplitFirstTime(address operator, address avs, uint16 split) public filterFuzzedAddressInputs(operator) {
⋮----
// Check that the split returns the default split before initialization for the first time.
⋮----
cheats.prank(address(this)); // Owner of RewardsCoordinator
// Change default split to check if it is returned before activation
⋮----
// Check that the split returns the default split before activation for the first time.
⋮----
// Testing the split setting for a second time prior to the earlier activation.
function testFuzz_Revert_setOperatorAVSSplitSecondTimeBeforePriorActivation(
⋮----
// Setting First Split
⋮----
// Warping to time before activation of First split
⋮----
// Trying to set Second Split
⋮----
// Testing the split setting for a second time after earlier activation.
function testFuzz_setOperatorAVSSplitSecondTimeAfterPriorActivation(
⋮----
// Warping to time after activation of First split
⋮----
// Setting Second Split
⋮----
contract RewardsCoordinatorUnitTests_setOperatorPISplit is RewardsCoordinatorUnitTests {
⋮----
function testFuzz_Revert_WhenPaused(address operator, uint16 split) public filterFuzzedAddressInputs(operator) {
⋮----
function testFuzz_Revert_WhenSplitGreaterThan100(address operator, uint16 split) public filterFuzzedAddressInputs(operator) {
⋮----
function testFuzz_setOperatorPISplit(address operator, uint16 split) public filterFuzzedAddressInputs(operator) {
⋮----
function testFuzz_setOperatorPISplit_UAM(address operator, uint16 split) public filterFuzzedAddressInputs(operator) {
⋮----
function testFuzz_setOperatorPISplitFirstTime(address operator, uint16 split) public filterFuzzedAddressInputs(operator) {
⋮----
function testFuzz_Revert_setOperatorPISplitSecondTimeBeforePriorActivation(
⋮----
function testFuzz_setOperatorPISplitSecondTimeAfterPriorActivation(
⋮----
contract RewardsCoordinatorUnitsTests_setOperatorSetSplit is RewardsCoordinatorUnitTests {
⋮----
function testFuzz_Revert_InvalidOperatorSet(address operator, uint16 split) public filterFuzzedAddressInputs(operator) {
⋮----
operatorSet.id = 2; // Invalid operator set id
⋮----
function testFuzz_setOperatorSetSplit(address operator, uint16 split) public filterFuzzedAddressInputs(operator) {
⋮----
function testFuzz_setOperatorSetSplit_UAM(address operator, uint16 split) public filterFuzzedAddressInputs(operator) {
⋮----
function testFuzz_setOperatorSetSplitFirstTime(address operator, uint16 split) public filterFuzzedAddressInputs(operator) {
⋮----
function testFuzz_Revert_setOperatorSetSplitSecondTimeBeforePriorActivation(
⋮----
function testFuzz_setOperatorSetSplitSecondTimeAfterPriorActivation(
⋮----
contract RewardsCoordinatorUnitTests_createAVSRewardsSubmission is RewardsCoordinatorUnitTests {
⋮----
function test_Revert_WhenPaused() public {
⋮----
// Revert from reentrancy
function test_Revert_WhenReentrancy(uint amount) public {
⋮----
// Revert with 0 length strats and multipliers
function testFuzz_Revert_WhenEmptyStratsAndMultipliers(address avs, uint startTimestamp, uint duration, uint amount)
⋮----
// 1. Bound fuzz inputs to valid ranges and amounts
⋮----
// 2. Create rewards submission input param
⋮----
// 3. call createAVSRewardsSubmission() with expected revert
⋮----
// Revert when amount > 1e38-1
function testFuzz_Revert_AmountTooLarge(address avs, uint startTimestamp, uint duration, uint amount)
⋮----
// 1. Bound fuzz inputs
⋮----
// 3. Call createAVSRewardsSubmission() with expected revert
⋮----
function testFuzz_Revert_WhenDuplicateStrategies(address avs, uint startTimestamp, uint duration, uint amount)
⋮----
// Revert with exceeding max duration
function testFuzz_Revert_WhenExceedingMaxDuration(address avs, uint startTimestamp, uint duration, uint amount)
⋮----
// Revert with invalid interval seconds
function testFuzz_Revert_WhenInvalidIntervalSeconds(address avs, uint startTimestamp, uint duration, uint amount)
⋮----
// Revert when duration is 0
function testFuzz_Revert_WhenDurationIsZero(address avs, uint startTimestamp, uint amount) public filterFuzzedAddressInputs(avs) {
⋮----
// Revert with retroactive rewards enabled and set too far in past
// - either before genesis rewards timestamp
// - before max retroactive length
function testFuzz_Revert_WhenRewardsSubmissionTooStale(
⋮----
// Revert with start timestamp past max future length
function testFuzz_Revert_WhenRewardsSubmissionTooFarInFuture(address avs, uint startTimestamp, uint duration, uint amount)
⋮----
// Revert with non whitelisted strategy
function testFuzz_Revert_WhenInvalidStrategy(address avs, uint startTimestamp, uint duration, uint amount)
⋮----
// 3. call createAVSRewardsSubmission() with expected event emitted
⋮----
/// @notice test a single rewards submission asserting for the following
/// - correct event emitted
/// - submission nonce incrementation by 1, and rewards submission hash being set in storage.
/// - rewards submission hash being set in storage
/// - token balance before and after of avs and rewardsCoordinator
function testFuzz_createAVSRewardsSubmission_SingleSubmission(address avs, uint startTimestamp, uint duration, uint amount)
⋮----
/// @notice test multiple rewards submissions asserting for the following
⋮----
/// - submission nonce incrementation by numSubmissions, and rewards submission hashes being set in storage.
⋮----
/// - token balances before and after of avs and rewardsCoordinator
function testFuzz_createAVSRewardsSubmission_MultipleSubmissions(FuzzAVSRewardsSubmission memory param, uint numSubmissions)
⋮----
// Create multiple rewards submissions and their expected event
⋮----
// 1. Bound fuzz inputs to valid ranges and amounts using randSeed for each
⋮----
// 3. expected event emitted for this rewardsSubmission
⋮----
// 4. call createAVSRewardsSubmission()
⋮----
// 5. Check for submissionNonce() and rewardsSubmissionHashes being set
⋮----
/// @notice Test fee deduction when submitter opts in for protocol fees
function testFuzz_createAVSRewardsSubmission_WithProtocolFee_OptedIn(address avs, uint startTimestamp, uint duration, uint amount)
⋮----
// 2. Opt in for protocol fees
⋮----
// 3. Create rewards submission input param
⋮----
// 4. Calculate expected fee: 20% of amount
⋮----
// 5. Call createAVSRewardsSubmission() and verify balances
⋮----
// Verify balances
⋮----
/// @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)
⋮----
// 2. Ensure submitter is not opted in (default state)
⋮----
// 3. Create rewards submission and verify balances
⋮----
// Verify balances - no fee should be taken
⋮----
/// @notice Test that protocol fee uses msg.sender for AVS rewards submission
function test_ProtocolFee_UsesMessageSender_AVS() public {
⋮----
// Opt in the AVS (who is also msg.sender here) for protocol fees
⋮----
// Fee should be taken because msg.sender (AVS) is opted in
uint expectedFee = (amount * 2000) / 10_000; // 20% fee
⋮----
contract RewardsCoordinatorUnitTests_createEigenDARewardsSubmission is RewardsCoordinatorUnitTests {
// Revert when not called by emissionsController
function testFuzz_Revert_WhenNotEmissionsController(address unauthorizedCaller) public filterFuzzedAddressInputs(unauthorizedCaller) {
⋮----
// Test that emissionsController can successfully call
function test_EmissionsControllerCanCall() public {
⋮----
// Setup token and approval - AVS needs to have the tokens since it's the one submitting rewards
⋮----
// EmissionsController approves the rewards coordinator on each processed distribution.
// We mock that here.
⋮----
// Call from emissionsController should succeed
⋮----
// Verify the rewards submission was created
⋮----
/// @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 {
⋮----
// Setup token - EmissionsController has the tokens since it's the one paying
⋮----
// Opt in the EmissionsController (msg.sender) for protocol fees
⋮----
// Verify the AVS is NOT opted in (this is the key difference)
⋮----
// EmissionsController approves and submits
⋮----
// Calculate expected fee (20% = 2000 bips)
⋮----
// Fee should be taken because msg.sender (EmissionsController) is opted in
// even though the AVS parameter is not opted in
⋮----
/// @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 {
⋮----
// Setup token - EmissionsController has the tokens
⋮----
// Opt in the AVS for protocol fees, but NOT the EmissionsController
⋮----
// Verify opt-in states
⋮----
// Fee should NOT be taken because msg.sender (EmissionsController) is not opted in
// even though the AVS parameter is opted in
⋮----
contract RewardsCoordinatorUnitTests_createRewardsForAllSubmission is RewardsCoordinatorUnitTests {
⋮----
function testFuzz_Revert_WhenNotRewardsForAllSubmitter(address invalidSubmitter) public filterFuzzedAddressInputs(invalidSubmitter) {
⋮----
function testFuzz_Revert_WhenDurationIsZero(uint startTimestamp, uint amount) public {
⋮----
// 3. call createRewardsForAllSubmission() with expected revert
⋮----
/// - token balance before and after of RewardsForAllSubmitter and rewardsCoordinator
function testFuzz_createRewardsForAllSubmission_SingleSubmission(uint startTimestamp, uint duration, uint amount) public {
⋮----
/// - token balances before and after of createRewardsForAllSubmission submitter and rewardsCoordinator
function testFuzz_createRewardsForAllSubmission_MultipleSubmissions(FuzzAVSRewardsSubmission memory param, uint numSubmissions) public {
⋮----
contract RewardsCoordinatorUnitTests_createRewardsForAllEarners is RewardsCoordinatorUnitTests {
⋮----
// 3. call createRewardsForAllEarners() with expected revert
⋮----
contract RewardsCoordinatorUnitTests_createOperatorDirectedAVSRewardsSubmission is RewardsCoordinatorUnitTests {
⋮----
// Set the timestamp to when Rewards v2 will realisticly go out (i.e 6 months)
⋮----
/// @dev Sort to ensure that the array is in ascending order for addresses
function _sortAddressArrayAsc(address[] memory arr) internal pure returns (address[] memory) {
⋮----
function _getTotalRewardsAmount(OperatorReward[] memory operatorRewards) internal pure returns (uint) {
⋮----
function testFuzz_Revert_WhenReentrancy(uint startTimestamp, uint duration) public {
⋮----
// 2. Deploy Reenterer
⋮----
// 2. Create operator directed rewards submission input param
⋮----
function testFuzz_Revert_WhenEmptyStratsAndMultipliers(address avs, uint startTimestamp, uint duration)
⋮----
// 3. call createOperatorDirectedAVSRewardsSubmission() with expected revert
⋮----
// Revert with 0 length operator rewards
function testFuzz_Revert_WhenEmptyOperatorRewards(address avs, uint startTimestamp, uint duration)
⋮----
// Revert when operator is zero address
function testFuzz_Revert_WhenOperatorIsZeroAddress(address avs, uint startTimestamp, uint duration)
⋮----
// Revert when duplicate operators
function testFuzz_Revert_WhenDuplicateOperators(address avs, uint startTimestamp, uint duration) public filterFuzzedAddressInputs(avs) {
⋮----
// Revert when operator amount is zero
function testFuzz_Revert_WhenOperatorAmountIsZero(address avs, uint startTimestamp, uint duration)
⋮----
function testFuzz_Revert_TotalAmountTooLarge(address avs, uint startTimestamp, uint duration, uint amount)
⋮----
// Bound amount to be above MAX_REWARDS_AMOUNT but not so large it causes overflow in arithmetic operations
⋮----
// 2. Create operator directed rewards submission with single operator to avoid overflow in sum
⋮----
function testFuzz_Revert_WhenExceedingMaxDuration(address avs, uint startTimestamp, uint duration)
⋮----
function testFuzz_Revert_WhenInvalidIntervalSeconds(address avs, uint startTimestamp, uint duration)
⋮----
function testFuzz_Revert_WhenDurationIsZero(address avs, uint startTimestamp) public filterFuzzedAddressInputs(avs) {
⋮----
// Revert with invalid interval start timestamp
function testFuzz_Revert_WhenInvalidIntervalStartTimestamp(address avs, uint startTimestamp, uint duration)
⋮----
function testFuzz_Revert_WhenRewardsSubmissionTooStale(address avs, uint startTimestamp, uint duration)
⋮----
// Revert when not retroactive
function testFuzz_Revert_WhenRewardsSubmissionNotRetroactive(address avs, uint startTimestamp, uint duration)
⋮----
function testFuzz_Revert_WhenInvalidStrategy(address avs, uint startTimestamp, uint duration) public filterFuzzedAddressInputs(avs) {
⋮----
// Revert when duplicate strategies
function testFuzz_Revert_WhenDuplicateStrategies(address avs, uint startTimestamp, uint duration)
⋮----
function testFuzz_createOperatorDirectedAVSRewardsSubmission_SingleSubmission(address avs, uint startTimestamp, uint duration)
⋮----
// 3. call createOperatorDirectedAVSRewardsSubmission() with expected event emitted
⋮----
/// @notice Same test as above, uses UAM
⋮----
function testFuzz_createOperatorDirectedAVSRewardsSubmission_SingleSubmission_UAM(address avs, uint startTimestamp, uint duration)
⋮----
/// @notice test a multiple rewards submission asserting for the following
⋮----
function testFuzz_createOperatorDirectedAVSRewardsSubmission_MultipleSubmissions(
⋮----
/// @notice Test fee deduction for operator directed submissions when opted in
function testFuzz_createOperatorDirectedAVSRewardsSubmission_WithProtocolFee_OptedIn(address avs, uint startTimestamp, uint duration)
⋮----
// 3. Create operator directed rewards submission and verify
⋮----
// Calculate expected fee: 20% of each operator reward
⋮----
/// @notice Test no fee deduction for operator directed submissions when not opted in
function testFuzz_createOperatorDirectedAVSRewardsSubmission_WithProtocolFee_NotOptedIn(address avs, uint startTimestamp, uint duration)
⋮----
/// @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 {
⋮----
// 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
⋮----
// Operator-directed submissions must be retroactive (already ended)
⋮----
// Opt in for protocol fees
⋮----
// Create operator rewards that sum to just under MAX_REWARDS_AMOUNT
⋮----
// This should succeed because we check BEFORE the fee
⋮----
// Verify the submission was created successfully
uint expectedFee = (amountJustUnderMax * 2000) / 10_000; // 20% 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 {
⋮----
// 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
⋮----
// Create operator rewards that sum to over MAX_REWARDS_AMOUNT
⋮----
// This should revert because amount exceeds max BEFORE fee
⋮----
/// @notice Test that protocol fee uses msg.sender for operator-directed submissions too
function test_ProtocolFee_UsesMessageSender_OperatorDirected() public {
⋮----
// Grant permission for thirdPartySubmitter to act on behalf of AVS
⋮----
// Opt in the submitter (msg.sender), not the AVS
⋮----
// Verify states
⋮----
// Third party submits on behalf of AVS
⋮----
// Fee should be taken because msg.sender is opted in
⋮----
contract RewardsCoordinatorUnitTests_createOperatorDirectedOperatorSetRewardsSubmission is RewardsCoordinatorUnitTests {
⋮----
function _sortAddressArrayAsc(address[] memory arr) internal returns (address[] memory) {
⋮----
function testFuzz_Revert_InvalidOperatorSet(uint32 id) public {
⋮----
// 3. call createOperatorDirectedOperatorSetRewardsSubmission() with expected revert
⋮----
function testFuzz_createOperatorDirectedOperatorSetRewardsSubmission_SingleSubmission(address avs, uint startTimestamp, uint duration)
⋮----
// 3. call createOperatorDirectedOperatorSetRewardsSubmission() with expected event emitted
⋮----
function testFuzz_createOperatorDirectedOperatorSetRewardsSubmission_SingleSubmission_UAM(
⋮----
function testFuzz_createOperatorDirectedOperatorSetRewardsSubmission_MultipleSubmissions(
⋮----
contract RewardsCoordinatorUnitTests_createUniqueStakeRewardsSubmission is RewardsCoordinatorUnitTests {
⋮----
function testFuzz_Revert_WhenReentrancy(uint startTimestamp, uint duration, uint amount) public {
⋮----
// Update operator set
⋮----
// 3. call createUniqueStakeRewardsSubmission() with expected revert
⋮----
// Revert with duplicate strategies
⋮----
// 2. Create rewards submission input param with duplicate strategies
⋮----
// 3. Call createUniqueStakeRewardsSubmission() with expected revert
⋮----
// 2. Create rewards submission input param with invalid strategy
⋮----
// Test successful single submission
function testFuzz_createUniqueStakeRewardsSubmission_SingleSubmission(address avs, uint startTimestamp, uint duration, uint amount)
⋮----
// 3. Setup expectations
⋮----
// Expect event emission
⋮----
// 4. Call createUniqueStakeRewardsSubmission()
⋮----
// 5. Check state changes
⋮----
// Test multiple submissions
function testFuzz_createUniqueStakeRewardsSubmission_MultipleSubmissions(
⋮----
// 2. Create multiple submissions
⋮----
// Expect events for all submissions
⋮----
// 3. Call createUniqueStakeRewardsSubmission()
⋮----
// 4. Verify state changes
⋮----
// Test successful single submission with UAM (User Access Management)
function testFuzz_createUniqueStakeRewardsSubmission_SingleSubmission_UAM(address avs, uint startTimestamp, uint duration, uint amount)
⋮----
// Set UAM - allow defaultAppointee to call on behalf of avs
⋮----
// 4. Call createUniqueStakeRewardsSubmission() as appointee
⋮----
/// @notice Test fee deduction for createUniqueStakeRewardsSubmission when opted in
function testFuzz_createUniqueStakeRewardsSubmission_WithProtocolFee_OptedIn(
⋮----
// Setup operator set
⋮----
// 3. Create rewards submission and verify
⋮----
/// @notice Test no fee deduction for createUniqueStakeRewardsSubmission when not opted in
function testFuzz_createUniqueStakeRewardsSubmission_WithProtocolFee_NotOptedIn(
⋮----
contract RewardsCoordinatorUnitTests_createTotalStakeRewardsSubmission is RewardsCoordinatorUnitTests {
⋮----
// 3. call createTotalStakeRewardsSubmission() with expected revert
⋮----
// 3. Call createTotalStakeRewardsSubmission() with expected revert
⋮----
function testFuzz_createTotalStakeRewardsSubmission_SingleSubmission(address avs, uint startTimestamp, uint duration, uint amount)
⋮----
// 4. Call createTotalStakeRewardsSubmission()
⋮----
function testFuzz_createTotalStakeRewardsSubmission_MultipleSubmissions(
⋮----
// 3. Call createTotalStakeRewardsSubmission()
⋮----
function testFuzz_createTotalStakeRewardsSubmission_SingleSubmission_UAM(address avs, uint startTimestamp, uint duration, uint amount)
⋮----
// 4. Call createTotalStakeRewardsSubmission() as appointee
⋮----
/// @notice Test fee deduction for createTotalStakeRewardsSubmission when opted in
function testFuzz_createTotalStakeRewardsSubmission_WithProtocolFee_OptedIn(
⋮----
/// @notice Test no fee deduction for createTotalStakeRewardsSubmission when not opted in
function testFuzz_createTotalStakeRewardsSubmission_WithProtocolFee_NotOptedIn(
⋮----
contract RewardsCoordinatorUnitTests_submitRoot is RewardsCoordinatorUnitTests {
// only callable by rewardsUpdater
function testFuzz_Revert_WhenNotRewardsUpdater(address invalidRewardsUpdater) public filterFuzzedAddressInputs(invalidRewardsUpdater) {
⋮----
function test_Revert_WhenSubmitRootPaused() public {
⋮----
/// @notice submits root with correct values and adds to root storage array
/// - checks activatedAt has added activationDelay
function testFuzz_submitRoot(bytes32 root, uint32 rewardsCalculationEndTimestamp) public {
// fuzz avoiding overflows and valid activatedAt values
⋮----
/// @notice Submits multiple roots and checks root index from hash is correct
function testFuzz_getRootIndexFromHash(bytes32 root, uint16 numRoots, uint index) public {
⋮----
/// @notice Tests for sets of JSON data with different distribution roots
contract RewardsCoordinatorUnitTests_processClaim is RewardsCoordinatorUnitTests {
⋮----
/// @notice earner address used for proofs
⋮----
/// @notice mock token bytecode
⋮----
// Temp storage for managing stack in _parseProofData
⋮----
// Create mock token to use bytecode later to etch
⋮----
/// @notice Claim against latest submitted root, rootIndex 3 using batch claim.
/// Limit fuzz runs to speed up tests since these require reading from JSON
/// forge-config: default.fuzz.runs = 10
function testFuzz_processClaims_LatestRoot(bool setClaimerFor, address claimerFor) public filterFuzzedAddressInputs(claimerFor) {
// if setClaimerFor is true, set the earners claimer to the fuzzed address
⋮----
// Parse all 3 claim proofs for distributionRoots 0,1,2 respectively
⋮----
// Claim against root and check balances before/after, and check it matches the difference between
// cumulative claimed and earned.
⋮----
/// @notice Claim against latest submitted root, rootIndex 3
⋮----
function testFuzz_processClaim_LatestRoot(bool setClaimerFor, address claimerFor) public filterFuzzedAddressInputs(claimerFor) {
⋮----
/// @notice Claim against an old root that isn't the latest
⋮----
function testFuzz_processClaim_OldRoot(bool setClaimerFor, address claimerFor) public filterFuzzedAddressInputs(claimerFor) {
⋮----
/// @notice Claim against all roots in order, rootIndex 0, 1, 2
⋮----
function testFuzz_processClaim_Sequential(bool setClaimerFor, address claimerFor) public filterFuzzedAddressInputs(claimerFor) {
⋮----
// 1. Claim against first root
⋮----
// 2. Claim against second root
⋮----
// 3. Claim against third and latest root
⋮----
function testFuzz_processClaim_Revert_WhenRootDisabled(bool setClaimerFor, address claimerFor, bytes32 root)
⋮----
// Submit a root and disable it
⋮----
// rootIndex in claim is 0, which is disabled
⋮----
/// @notice Claim against rootIndex 0 and claim again. Balances should not increment.
⋮----
function testFuzz_processClaim_Revert_WhenReuseSameClaimAgain(bool setClaimerFor, address claimerFor)
⋮----
// 2. Claim against first root again, expect a revert
⋮----
/// @notice Claim against latest submitted root, rootIndex 3 but modify some of the leaf values
⋮----
function testFuzz_processClaim_Revert_WhenInvalidTokenClaim(bool setClaimerFor, address claimerFor)
⋮----
// Modify Earnings
⋮----
// Check claim is not valid from both checkClaim() and processClaim() throwing a revert
⋮----
function testFuzz_processClaim_Revert_WhenInvalidEarnerClaim(bool setClaimerFor, address claimerFor, address invalidEarner)
⋮----
// Ensure invalidEarner is actually different from the real earner
⋮----
// Modify Earner
⋮----
/// @notice Claim against latest submitted root, rootIndex 3 but write to cumulativeClaimed storage.
/// Expects a revert when calling processClaim()
function testFuzz_processClaim_Revert_WhenCumulativeClaimedUnderflow(bool setClaimerFor, address claimerFor)
⋮----
// Set cumulativeClaimed to be max uint256, should revert when attempting to claim
⋮----
/// @notice Claim against latest submitted root, rootIndex 3 but with larger tokenIndex used that could pass the proofs.
/// Expects a revert as we check for this in processClaim()
function testFuzz_processClaim_Revert_WhenTokenIndexBitwiseAddedTo(bool setClaimerFor, address claimerFor, uint8 numShift)
⋮----
// Take the tokenIndex and add a significant bit so that the actual index number is increased
// but still with the same least significant bits for valid proofs
⋮----
/// @notice Claim against latest submitted root, rootIndex 3 but with larger earnerIndex used that could pass the proofs.
⋮----
function testFuzz_processClaim_Revert_WhenEarnerIndexBitwiseAddedTo(bool setClaimerFor, address claimerFor, uint8 numShift)
⋮----
/// @notice tests with earnerIndex and tokenIndex set to max value and using alternate claim proofs
function testFuzz_processClaim_WhenMaxEarnerIndexAndTokenIndex(bool setClaimerFor, address claimerFor)
⋮----
// Hardcode earner address to earner in alternate claim proofs
⋮----
// 1. Claim against first root where earner tree is full tree and earner and token index is last index of that tree height
⋮----
// +1 since earnerIndex is 0-indexed
// Here the earnerIndex is 7 in a full binary tree and the number of bytes32 hash proofs is 3
⋮----
// +1 since tokenIndex is 0-indexed
// Here the tokenIndex is also 7 in a full binary tree and the number of bytes32 hash proofs is 3
⋮----
/// @notice tests with single token leaf for the earner's subtree. tokenTreeProof for the token in the claim should be empty
function testFuzz_processClaim_WhenSingleTokenLeaf(bool setClaimerFor, address claimerFor)
⋮----
// Single tokenLeaf in earner's subtree, should be 0 index
⋮----
/// @notice tests with single earner leaf in the merkle tree. earnerTreeProof in claim should be empty
function testFuzz_processClaim_WhenSingleEarnerLeaf(bool setClaimerFor, address claimerFor)
⋮----
// Earner Leaf in merkle tree, should be 0 index
⋮----
/// @notice Set address with ERC20Mock bytecode and mint amount to rewardsCoordinator for
/// balance for testing processClaim()
function _setAddressAsERC20(address randAddress, uint mintAmount) internal {
⋮----
/// @notice parse proofs from json file and submitRoot()
function _parseProofData(string memory filePath) internal returns (RewardsMerkleClaim memory) {
⋮----
// Parse RewardsMerkleClaim
⋮----
/// DeployCode ERC20 to Token Address
// deployCodeTo("ERC20PresetFixedSupply.sol", address(tokenLeaves[i].token));
⋮----
function _parseAllProofs() internal virtual returns (RewardsMerkleClaim[] memory) {
⋮----
function _parseAllProofsMaxEarnerAndLeafIndices() internal virtual returns (RewardsMerkleClaim[] memory) {
⋮----
function _parseAllProofsSingleTokenLeaf() internal virtual returns (RewardsMerkleClaim[] memory) {
⋮----
function _parseAllProofsSingleEarnerLeaf() internal virtual returns (RewardsMerkleClaim[] memory) {
````

## File: src/test/unit/SplitContractMixin.t.sol
````
// SPDX-License-Identifier: BUSL-1.1
⋮----
import "forge-std/Test.sol";
import "src/contracts/mixins/SplitContractMixin.sol";
⋮----
contract SplitContractMixinTest is Test, SplitContractMixin {
⋮----
function getValue() public view returns (uint result) {
⋮----
function test_getValue() public {
⋮----
// Mock contract to test delegation
contract Delegate is Test {
````

## File: src/test/unit/StrategyBaseTVLLimitsUnit.sol
````
// SPDX-License-Identifier: BUSL-1.1
⋮----
import "./StrategyBaseUnit.t.sol";
⋮----
import "../../contracts/strategies/StrategyBaseTVLLimits.sol";
⋮----
contract StrategyBaseTVLLimitsUnitTests is StrategyBaseUnitTests {
⋮----
// defaults for tests, used in setup
⋮----
/// @notice Emitted when `maxPerDeposit` value is updated from `previousValue` to `newValue`
event MaxPerDepositUpdated(uint previousValue, uint newValue);
⋮----
/// @notice Emitted when `maxTotalDeposits` value is updated from `previousValue` to `newValue`
event MaxTotalDepositsUpdated(uint previousValue, uint newValue);
⋮----
function setUp() public virtual override {
// copy setup for StrategyBaseUnitTests
⋮----
// depoloy the TVL-limited strategy
⋮----
// verify that limits were set up correctly
⋮----
// replace the strategy from the non-TVL-limited tests with the TVL-limited strategy
// this should result in all the StrategyBaseUnitTests also running against the `StrategyBaseTVLLimits` contract
⋮----
function testSetTVLLimits(uint maxPerDepositFuzzedInput, uint maxTotalDepositsFuzzedInput) public {
⋮----
function testSetTVLLimitsFailsWhenNotCalledByUnpauser(
⋮----
function testSetInvalidMaxPerDepositAndMaxDeposits(uint maxPerDepositFuzzedInput, uint maxTotalDepositsFuzzedInput) public {
⋮----
function testDepositMoreThanMaxPerDeposit(uint maxPerDepositFuzzedInput, uint maxTotalDepositsFuzzedInput, uint amount) public {
⋮----
function testDepositMorethanMaxDeposits() public {
⋮----
function testDepositValidAmount(uint depositAmount) public {
⋮----
// we need to actually transfer the tokens to the strategy to avoid underflow in the `deposit` calculation
⋮----
function testDepositTVLLimit_ThenChangeTVLLimit(uint maxTotalDepositsFuzzedInput, uint newMaxTotalDepositsFuzzedInput) public {
⋮----
/// @notice General-purpose test, re-useable, handles whether the deposit should revert or not and returns 'true' if it did revert.
function testDeposit_WithTVLLimits(uint maxPerDepositFuzzedInput, uint maxTotalDepositsFuzzedInput, uint depositAmount)
⋮----
// need to filter this to make sure the deposit amounts can actually be transferred
⋮----
// set TVL limits
⋮----
// we need to calculate this before transferring tokens to the strategy
⋮----
// transfer the tokens back from the strategy to not mess up the state
⋮----
// return 'true' since the call to `deposit` reverted
⋮----
// return 'false' since the call to `deposit` succeeded
⋮----
// sets the TVL Limits and checks that events were emitted correctly
function _setTVLLimits(uint _maxPerDeposit, uint _maxTotalDeposits) internal {
⋮----
/// OVERRIDING EXISTING TESTS TO FILTER INPUTS THAT WOULD FAIL DUE TO DEPOSIT-LIMITING
modifier filterToValidDepositAmounts(uint amountToDeposit) {
⋮----
function testCanWithdrawDownToSmallShares(uint amountToDeposit, uint32 sharesToLeave)
⋮----
function testDepositWithNonzeroPriorBalanceAndNonzeroPriorShares(uint priorTotalShares, uint amountToDeposit)
⋮----
function testDepositWithZeroPriorBalanceAndZeroPriorShares(uint amountToDeposit)
⋮----
function testIntegrityOfSharesToUnderlyingWithNonzeroTotalShares(
⋮----
function testIntegrityOfUnderlyingToSharesWithNonzeroTotalShares(
⋮----
function testWithdrawFailsWhenSharesGreaterThanTotalShares(uint amountToDeposit, uint sharesToWithdraw)
⋮----
function testWithdrawFailsWhenWithdrawalsPaused(uint amountToDeposit)
⋮----
function testWithdrawWithPriorTotalSharesAndAmountSharesEqual(uint amountToDeposit)
⋮----
function testWithdrawWithPriorTotalSharesAndAmountSharesNotEqual(uint96 amountToDeposit, uint96 sharesToWithdraw)
````

## File: src/test/unit/StrategyBaseUnit.t.sol
````
// SPDX-License-Identifier: BUSL-1.1
⋮----
import "@openzeppelin/contracts/token/ERC20/presets/ERC20PresetFixedSupply.sol";
import "@openzeppelin/contracts/proxy/transparent/ProxyAdmin.sol";
import "@openzeppelin/contracts/proxy/transparent/TransparentUpgradeableProxy.sol";
⋮----
import "../../contracts/strategies/StrategyBase.sol";
import "../../contracts/permissions/PauserRegistry.sol";
⋮----
import "../mocks/StrategyManagerMock.sol";
import "../mocks/ERC20_SetTransferReverting_Mock.sol";
⋮----
import "forge-std/Test.sol";
⋮----
contract StrategyBaseUnitTests is Test {
⋮----
/// @notice virtual shares used as part of the mitigation of the common 'share inflation' attack vector.
/// Constant value chosen to reasonably reduce attempted share inflation by the first depositor, while still
/// incurring reasonably small losses to depositors
⋮----
/// @notice virtual balance used as part of the mitigation of the common 'share inflation' attack vector
⋮----
event ExchangeRateEmitted(uint rate);
⋮----
function setUp() public virtual {
⋮----
function testCannotReinitialize() public {
⋮----
function testCannotReceiveZeroShares() public {
⋮----
function testDepositWithZeroPriorBalanceAndZeroPriorShares(uint amountToDeposit) public virtual {
// sanity check / filter
⋮----
function testDepositWithNonzeroPriorBalanceAndNonzeroPriorShares(uint priorTotalShares, uint amountToDeposit) public virtual {
⋮----
function testDepositFailsWhenDepositsPaused() public {
// pause deposits
⋮----
function testDepositFailsWhenCallingFromNotStrategyManager(address caller) public {
⋮----
function testDepositFailsWhenNotUsingUnderlyingToken(address notUnderlyingToken) public {
⋮----
function testDepositFailForTooManyShares() public {
// Deploy token with 1e39 total supply
⋮----
// Transfer underlying token to strategy
⋮----
// Deposit
⋮----
function testWithdrawWithPriorTotalSharesAndAmountSharesEqual(uint amountToDeposit) public virtual {
⋮----
function testWithdrawWithPriorTotalSharesAndAmountSharesNotEqual(uint96 amountToDeposit, uint96 sharesToWithdraw) public virtual {
⋮----
function testWithdrawZeroAmount(uint amountToDeposit) public {
⋮----
function testWithdrawFailsWhenWithdrawalsPaused(uint amountToDeposit) public virtual {
⋮----
// pause withdrawals
⋮----
function testWithdrawalFailsWhenCallingFromNotStrategyManager(address caller) public {
⋮----
function testWithdrawalFailsWhenNotUsingUnderlyingToken(address notUnderlyingToken) public {
⋮----
function testWithdrawFailsWhenSharesGreaterThanTotalShares(uint amountToDeposit, uint sharesToWithdraw) public virtual {
⋮----
// since we are checking strictly greater than in this test
⋮----
function testWithdrawalFailsWhenTokenTransferFails() public {
⋮----
// uint240 input to prevent overflow
function testIntegrityOfSharesToUnderlyingWithZeroTotalShares(uint240 amountSharesToQuery) public view {
⋮----
function testDeposit_ZeroAmount() public {
⋮----
// amountSharesToQuery input is uint96 to prevent overflow
function testIntegrityOfSharesToUnderlyingWithNonzeroTotalShares(
⋮----
// amountUnderlyingToQuery input is uint96 to prevent overflow
function testIntegrityOfUnderlyingToSharesWithNonzeroTotalShares(
⋮----
// verify that small remaining share amounts (nonzero in particular) are allowed
function testCanWithdrawDownToSmallShares(uint amountToDeposit, uint32 sharesToLeave) public virtual {
⋮----
// filter out underflow
````

## File: src/test/unit/StrategyFactoryUnit.t.sol
````
// SPDX-License-Identifier: BUSL-1.1
⋮----
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
contract StrategyFactoryUnitTests is EigenLayerUnitTestSetup {
// Contract under test
⋮----
// Contract dependencies
⋮----
/// @notice Emitted whenever a slot is set in the `deployedStrategies` mapping
event StrategySetForToken(IERC20 token, IStrategy strategy);
⋮----
event TokenBlacklisted(IERC20 token);
⋮----
function setUp() public virtual override {
⋮----
// Ensure allocation delay matches expected OPERATOR_ALLOCATION_DELAY when vaults register.
⋮----
// Deploy strategyFactory proxy first (with placeholder impl) so DurationVaultStrategy can reference it
⋮----
// Now deploy DurationVaultStrategy with the factory reference
⋮----
// Upgrade strategyFactory to final impl with correct beacon
⋮----
function test_initialization() public view {
⋮----
function test_initialize_revert_reinitialization() public {
⋮----
function test_deployNewStrategy() public {
// cheats.expectEmit(true, true, true, true, address(strategyFactory));
// StrategySetForToken(underlyingToken, newStrategy);
⋮----
function test_deployNewStrategy_revert_StrategyAlreadyExists() public {
⋮----
function test_deployDurationVaultStrategy() public {
⋮----
function test_deployDurationVaultStrategy_withExistingStrategy() public {
⋮----
// Base mapping should remain untouched.
⋮----
function test_blacklistTokens(IERC20 token) public {
⋮----
function test_blacklistTokens_RemovesFromWhitelist() public {
⋮----
function test_whitelistStrategies() public {
⋮----
function test_whitelistStrategies_revert_notOwner() public {
⋮----
function test_removeStrategiesFromWhitelist_revert_notOwner() public {
⋮----
function test_removeStrategiesFromWhitelist() public {
⋮----
function _deployStrategy() internal returns (StrategyBase) {
````

## File: src/test/unit/StrategyManagerDurationUnit.t.sol
````
// SPDX-License-Identifier: BUSL-1.1
⋮----
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 {
⋮----
function setUp() public override {
⋮----
// Align allocation delay with expected OPERATOR_ALLOCATION_DELAY for duration vault registration.
⋮----
// Configure the mock to return the vault as a supported strategy in the operator set
⋮----
function testDepositIntoDurationVaultViaStrategyManager() public {
⋮----
function testDepositRevertsAfterVaultLock() public {
⋮----
function _depositFor(address staker, uint amount) internal {
⋮----
function testWithdrawalsBlockedViaStrategyManagerBeforeMaturity() public {
⋮----
// Withdrawal blocking now happens at the queueing stage (removeDepositShares -> beforeRemoveShares),
// not at the withdrawal execution stage (withdrawSharesAsTokens).
⋮----
function testWithdrawalsAllowedAfterMaturity() public {
````

## File: src/test/unit/StrategyManagerUnit.t.sol
````
// SPDX-License-Identifier: BUSL-1.1
⋮----
import "@openzeppelin/contracts/mocks/ERC1271WalletMock.sol";
import "src/contracts/core/StrategyManager.sol";
import "src/contracts/strategies/StrategyBase.sol";
import "src/contracts/permissions/PauserRegistry.sol";
import "src/test/mocks/ERC20Mock.sol";
import "src/test/mocks/ERC20_SetTransferReverting_Mock.sol";
import "src/test/mocks/Reverter.sol";
import "src/test/mocks/Reenterer.sol";
import "src/test/mocks/MockDecimals.sol";
import "src/test/utils/EigenLayerUnitTestSetup.sol";
⋮----
/// @notice Unit testing of the StrategyManager contract, entire withdrawal tests related to the
/// DelegationManager are not tested here but callable functions by the DelegationManager are mocked and tested here.
/// Contracts tested: StrategyManager.sol
/// Contracts not mocked: StrategyBase, PauserRegistry
contract StrategyManagerUnitTests is EigenLayerUnitTestSetup, IStrategyManagerEvents {
⋮----
function setUp() public override {
⋮----
0 /*initialPausedStatus*/
⋮----
// whitelist the strategy for deposit
⋮----
// INTERNAL / HELPER FUNCTIONS
function _deployNewStrategy(IERC20 _token, IStrategyManager _strategyManager, IPauserRegistry _pauserRegistry, address admin)
⋮----
function _depositIntoStrategySuccessfully(IStrategy strategy, address staker, uint amount) internal filterFuzzedAddressInputs(staker) {
⋮----
// filter out zero case since it will revert with "StrategyManager._addShares: shares should not be zero!"
⋮----
// filter out zero address because the mock ERC20 we are using will revert on using it
⋮----
// sanity check / filter
⋮----
// needed for expecting an event with the right parameters
⋮----
// internal function for de-duping code. expects success if `expectedRevertMessage` is empty and expiry is valid.
function _depositIntoStrategyWithSignature(address staker, uint amount, uint expiry, bytes4 expectedRevertMessage)
⋮----
/// @notice internal function to help check if a strategy is part of list of deposited strategies for a staker
/// Used to check if removed correctly after withdrawing all shares for a given strategy
function _isDepositedStrategy(address staker, IStrategy strategy) internal view returns (bool) {
⋮----
/// @notice Deploys numberOfStrategiesToAdd new strategies and adds them to the whitelist
function _addStrategiesToWhitelist(uint8 numberOfStrategiesToAdd) internal returns (IStrategy[] memory) {
⋮----
// loop that deploys a new strategy and adds it to the array
⋮----
contract StrategyManagerUnitTests_initialize is StrategyManagerUnitTests {
function test_CannotReinitialize() public {
⋮----
function test_InitializedStorageProperly() public view {
⋮----
contract StrategyManagerUnitTests_depositIntoStrategy is StrategyManagerUnitTests {
function testFuzz_depositIntoStrategySuccessfully(address staker, uint amount) public filterFuzzedAddressInputs(staker) {
⋮----
// filter out the strategy itself from fuzzed inputs
⋮----
function test_DepositWhenStrategySharesExist() public {
⋮----
function test_Revert_WhenDepositsPaused() public {
⋮----
// pause deposits
⋮----
function test_Revert_WhenReentering() public {
⋮----
function test_Revert_WhenTokenSafeTransferFromReverts() external {
// replace 'dummyStrat' with one that uses a reverting token
⋮----
function test_Revert_WhenTokenDoesNotExist() external {
// replace 'dummyStrat' with one that uses a non-existent token, but will pass the initializer decimals check
⋮----
function test_Revert_WhenStrategyDepositFunctionReverts() external {
// replace 'dummyStrat' with one that always reverts
⋮----
function test_Revert_WhenStrategyDoesNotExist() external {
// replace 'dummyStrat' with one that does not exist
⋮----
function test_Revert_WhenStrategyNotWhitelisted() external {
// replace 'dummyStrat' with one that is not whitelisted
⋮----
function test_addShares_Revert_WhenSharesIsZero() external {
// replace dummyStrat with Reenterer contract
⋮----
contract StrategyManagerUnitTests_depositIntoStrategyWithSignature is StrategyManagerUnitTests {
function test_Revert_WhenSignatureInvalid() public {
⋮----
// call with `notStaker` as input instead of `staker` address
⋮----
function testFuzz_DepositSuccessfully(uint amount, uint expiry) public {
// min shares must be minted on strategy
⋮----
// not expecting a revert, so input an empty string
⋮----
function testFuzz_Revert_SignatureReplay(uint amount, uint expiry) public {
⋮----
// tries depositing using a signature and an EIP 1271 compliant wallet, *but* providing a bad signature
function testFuzz_Revert_WithContractWallet_BadSignature(uint amount) public {
⋮----
// deploy ERC1271WalletMock for staker to use
⋮----
// mess up the signature by flipping v's parity
⋮----
// tries depositing using a wallet that does not comply with EIP 1271
function testFuzz_Revert_WithContractWallet_NonconformingWallet(uint amount, uint8 v, bytes32 r, bytes32 s) public {
⋮----
// Tries depositing without token approval and transfer fails. deposit function should also revert
function test_Revert_WithContractWallet_TokenTransferFails() external {
⋮----
// tries depositing using a signature and an EIP 1271 compliant wallet
function testFuzz_WithContractWallet_Successfully(uint amount, uint expiry) public {
⋮----
/// @notice reenterer contract which is configured as the strategy contract
/// is configured to call depositIntoStrategy after reenterer.deposit() is called from the
/// depositIntoStrategyWithSignature() is called from the StrategyManager. Situation is not likely to occur given
/// the strategy has to be whitelisted but it at least protects from reentrant attacks
⋮----
function test_Revert_WhenSignatureExpired() public {
⋮----
// warp to 1 second after expiry
⋮----
contract StrategyManagerUnitTests_removeDepositShares is StrategyManagerUnitTests {
/// @notice Should revert if not called by DelegationManager
function test_Revert_DelegationManagerModifier() external {
⋮----
/// @notice deposits a single strategy and tests removeDepositShares() function reverts when sharesAmount is 0
function testFuzz_Revert_ZeroShares(address staker, uint depositAmount) external filterFuzzedAddressInputs(staker) {
⋮----
/// @notice deposits a single strategy and tests removeDepositShares() function reverts when sharesAmount is
/// higher than depositAmount
function testFuzz_Revert_ShareAmountTooHigh(address staker, uint depositAmount, uint removeSharesAmount)
⋮----
/// @notice deposit single strategy and removeDepositShares() for less than the deposited amount
/// Shares should be updated correctly with stakerStrategyListLength unchanged
function testFuzz_RemoveSharesLessThanDeposit(address staker, uint depositAmount, uint removeSharesAmount)
⋮----
/// @notice testing removeDepositShares()
/// deposits 1 strategy and tests it is removed from staker strategy list after removing all shares
function testFuzz_RemovesStakerStrategyListSingleStrat(address staker, uint sharesAmount) external filterFuzzedAddressInputs(staker) {
⋮----
/// @notice testing removeDepositShares() function with 3 strategies deposited.
/// Randomly selects one of the 3 strategies to be fully removed from staker strategy list.
/// Only callable by DelegationManager
function testFuzz_RemovesStakerStrategyListMultipleStrat(address staker, uint[3] memory amounts, uint8 randStrategy)
⋮----
/// Removing Shares could result in removing from staker strategy list if depositAmounts[i] == sharesAmounts[i].
⋮----
function testFuzz_RemoveShares(uint[3] memory depositAmounts, uint[3] memory sharesAmounts) external {
⋮----
contract StrategyManagerUnitTests_addShares is StrategyManagerUnitTests {
⋮----
function testFuzz_Revert_StakerZeroAddress(uint amount) external {
⋮----
function testFuzz_Revert_ZeroShares(address staker) external filterFuzzedAddressInputs(staker) {
⋮----
function testFuzz_AppendsStakerStrategyList(address staker, uint amount) external filterFuzzedAddressInputs(staker) {
⋮----
function testFuzz_AddSharesToExistingShares(address staker, uint sharesAmount) external filterFuzzedAddressInputs(staker) {
⋮----
/// @notice When _addShares() called either by depositIntoStrategy or addShares() results in appending to
/// stakerStrategyListLength when the staker has MAX_STAKER_STRATEGY_LIST_LENGTH strategies, it should revert
function test_Revert_WhenMaxStrategyListLength() external {
⋮----
// loop that deploys a new strategy and deposits into it
⋮----
contract StrategyManagerUnitTests_withdrawSharesAsTokens is StrategyManagerUnitTests {
⋮----
/// @notice deposits a single strategy and withdrawSharesAsTokens() function reverts when sharesAmount is
⋮----
function testFuzz_Revert_ShareAmountTooHigh(address staker, uint depositAmount, uint sharesAmount)
⋮----
function testFuzz_SingleStrategyDeposited(address staker, uint depositAmount, uint sharesAmount)
⋮----
contract StrategyManagerUnitTests_increaseBurnOrRedistributableShares is StrategyManagerUnitTests {
⋮----
function test_Revert_StrategyAlreadyInSlash() external {
⋮----
// Add strategy once
⋮----
// Revert when adding strategy again
⋮----
function testFuzz_singleStrategy(uint addedSharesToBurn) external {
⋮----
// Check pending operator sets and slash IDs
⋮----
// Sanity check that the strategy is not in the OLD burnable shares mapping
⋮----
function testFuzz_multipleStrategies(uint sharesToAdd1, uint sharesToAdd2, uint sharesToAdd3) external {
⋮----
// Check pending operator sets and slash IDs - still only 1 of each since same operator set and slash ID
⋮----
function testFuzz_existingShares(uint existingBurnableShares, uint addedSharesToBurn) external {
// preventing fuzz overflow, in practice StrategyBase has a 1e38 - 1 maxShares limit so this won't
// be an issue on mainnet/testnet environments
⋮----
// Check pending operator sets and slash IDs - should have 1 operator set but 2 slash IDs
⋮----
// Note: We can't guarantee order, so just check both are present
⋮----
function test_multipleOperatorSetsAndSlashIds_AllCleared() external {
⋮----
// Create a second operator set
⋮----
// Add shares for multiple operator sets and slash IDs
⋮----
// Add to defaultOperatorSet with defaultSlashId
⋮----
// Add to defaultOperatorSet with a different slashId
⋮----
// Add to operatorSet2 with defaultSlashId
⋮----
// Check pending sets - should have 2 operator sets
⋮----
// Check pending slash IDs for each operator set
⋮----
// Deposit shares to strategies to enable clearing
⋮----
// Clear one slash ID from defaultOperatorSet
⋮----
// Check pending sets - should still have 2 operator sets since defaultOperatorSet still has slashId2
⋮----
// Clear the second slash ID from defaultOperatorSet
⋮----
// Now defaultOperatorSet should be removed from pending, but operatorSet2 should remain
⋮----
// Clear operatorSet2
⋮----
// All pending sets should be cleared now
⋮----
contract StrategyManagerUnitTests_clearBurnOrRedistributableShares is StrategyManagerUnitTests {
function _increaseBurnOrRedistributableShares(IStrategy strategy, uint sharesToAdd) internal {
⋮----
function _increaseBurnOrRedistributableShares(IStrategy[] memory strategies, uint[] memory sharesToAdd) internal {
⋮----
function testFuzz_singleStrategy(uint shares) external {
⋮----
// Check that pending operator set and slash ID are added
⋮----
// Check that pending operator set and slash ID are removed since all strategies are cleared
⋮----
/// @notice Same as above, but uses the indexed version of the function
function testFuzz_singleStrategy_byIndex(uint shares) external {
⋮----
/// @dev We use uint128 to avoid overflow when adding the three share amounts
function testFuzz_multipleStrategies(uint shares) external {
⋮----
// The dummyStrats all have the same token, assert total balance
⋮----
function testFuzz_multipleStrategies_byRandomIndex(uint shares, Randomness r) external rand(r) {
⋮----
// Remove shares in random order
⋮----
indices[0] = 1; // dummyStrat2
indices[1] = 0; // dummyStrat
indices[2] = 2; // dummyStrat3
⋮----
// Check pending sets - should remain until last strategy is cleared
⋮----
// After last strategy is cleared, pending sets should be empty
⋮----
/// @notice check that balances are unchanged with a reverting token but burnShares doesn't revert
function testFuzz_unchangedWithRevertToken(address staker, uint depositAmount, uint sharesToRemove)
⋮----
// slash shares and increase amount to burn from DelegationManager
⋮----
// Now set token to be contract that reverts simulating an upgrade
⋮----
contract StrategyManagerUnitTests_setStrategyWhitelister is StrategyManagerUnitTests {
function testFuzz_SetStrategyWhitelister(address newWhitelister) external filterFuzzedAddressInputs(newWhitelister) {
⋮----
function testFuzz_Revert_WhenCalledByNotOwner(address notOwner) external filterFuzzedAddressInputs(notOwner) {
⋮----
contract StrategyManagerUnitTests_addStrategiesToDepositWhitelist is StrategyManagerUnitTests {
function testFuzz_Revert_WhenCalledByNotStrategyWhitelister(address notStrategyWhitelister)
⋮----
function test_AddSingleStrategyToWhitelist() external {
⋮----
function test_AddAlreadyWhitelistedStrategy() external {
⋮----
// Make sure event not emitted by checking logs length
⋮----
function testFuzz_AddStrategiesToDepositWhitelist(uint8 numberOfStrategiesToAdd) external {
// sanity filtering on fuzzed input
⋮----
contract StrategyManagerUnitTests_removeStrategiesFromDepositWhitelist is StrategyManagerUnitTests {
⋮----
/// @notice testing that mapping is still false and no event emitted
function test_RemoveNonWhitelistedStrategy() external {
⋮----
/// @notice testing that strategy is removed from whitelist and event is emitted
function test_RemoveWhitelistedStrategy() external {
⋮----
// Add strategy to whitelist first
⋮----
// Now remove strategy from whitelist
⋮----
function testFuzz_RemoveStrategiesFromDepositWhitelist(uint8 numberOfStrategiesToAdd, uint8 numberOfStrategiesToRemove) external {
⋮----
// loop that selectively copies from array to other array
⋮----
contract StrategyManagerUnitTests_getPendingOperatorSets is StrategyManagerUnitTests {
function test_getPendingOperatorSets_InitiallyZero() external {
⋮----
function test_getPendingOperatorSets_SingleOperatorSet() external {
⋮----
// Staker must deposit first
⋮----
// Clear shares
⋮----
function test_getPendingOperatorSets_MultipleOperatorSets() external {
⋮----
// Create multiple operator sets
⋮----
// Add shares for each operator set
⋮----
// Verify all operator sets are present
⋮----
contract StrategyManagerUnitTests_getPendingSlashIds is StrategyManagerUnitTests {
function test_getPendingSlashIds_InitiallyZero() external {
⋮----
function test_getPendingSlashIds_SingleOperatorSet_SingleSlashId() external {
⋮----
function test_getPendingSlashIds_SingleOperatorSet_MultipleSlashIds() external {
````

## File: src/test/unit/TaskMailboxUnit.t.sol
````
// SPDX-License-Identifier: BUSL-1.1
⋮----
import {Test, Vm} from "forge-std/Test.sol";
import {ProxyAdmin} from "@openzeppelin/contracts/proxy/transparent/ProxyAdmin.sol";
import {TransparentUpgradeableProxy} from "@openzeppelin/contracts/proxy/transparent/TransparentUpgradeableProxy.sol";
import {ITransparentUpgradeableProxy} from "@openzeppelin/contracts/proxy/transparent/TransparentUpgradeableProxy.sol";
import {IERC20} from "@openzeppelin/contracts/token/ERC20/IERC20.sol";
⋮----
import {IBN254CertificateVerifier, IBN254CertificateVerifierTypes} from "src/contracts/interfaces/IBN254CertificateVerifier.sol";
import {IECDSACertificateVerifier, IECDSACertificateVerifierTypes} from "src/contracts/interfaces/IECDSACertificateVerifier.sol";
import {IOperatorTableCalculatorTypes} from "src/contracts/interfaces/IOperatorTableCalculator.sol";
import {OperatorSet, OperatorSetLib} from "src/contracts/libraries/OperatorSetLib.sol";
import {BN254} from "src/contracts/libraries/BN254.sol";
import {IKeyRegistrarTypes} from "src/contracts/interfaces/IKeyRegistrar.sol";
import {TaskMailbox} from "src/contracts/avs/task/TaskMailbox.sol";
import {ITaskMailboxTypes, ITaskMailboxErrors, ITaskMailboxEvents} from "src/contracts/interfaces/ITaskMailbox.sol";
import {IAVSTaskHook} from "src/contracts/interfaces/IAVSTaskHook.sol";
⋮----
import {MockAVSTaskHook} from "src/test/mocks/MockAVSTaskHook.sol";
import {MockBN254CertificateVerifier} from "src/test/mocks/MockBN254CertificateVerifier.sol";
import {MockBN254CertificateVerifierFailure} from "src/test/mocks/MockBN254CertificateVerifierFailure.sol";
import {MockECDSACertificateVerifier} from "src/test/mocks/MockECDSACertificateVerifier.sol";
import {MockECDSACertificateVerifierFailure} from "src/test/mocks/MockECDSACertificateVerifierFailure.sol";
import {MockSimpleERC20} from "src/test/mocks/MockSimpleERC20.sol";
import {AVSTaskHookReentrantAttacker} from "src/test/mocks/AVSTaskHookReentrantAttacker.sol";
⋮----
contract TaskMailboxUnitTests is Test, ITaskMailboxTypes, ITaskMailboxErrors, ITaskMailboxEvents {
⋮----
// Constants
⋮----
// Contracts
⋮----
// Test addresses
⋮----
// Test operator set IDs
⋮----
// Test config values
⋮----
uint16 public stakeProportionThreshold = 6667; // 66.67%
⋮----
function setUp() public virtual {
// Deploy mock contracts
⋮----
// Deploy TaskMailbox with proxy pattern
⋮----
// Give creator some tokens and approve TaskMailbox
⋮----
function _createValidTaskParams() internal view returns (TaskParams memory) {
⋮----
function _createValidExecutorOperatorSetTaskConfig() internal view returns (ExecutorOperatorSetTaskConfig memory) {
⋮----
function _createValidBN254Certificate(bytes32 messageHash, uint96 referenceTimestamp)
⋮----
signature: BN254.G1Point(1, 2), // Non-zero signature
⋮----
function _createValidECDSACertificate(bytes32 messageHash, uint96 referenceTimestamp)
⋮----
sig: bytes("0x1234567890abcdef") // Non-empty signature
⋮----
/// @notice Create a valid BN254 certificate for a given result
/// @param taskHash The task hash
/// @param result The result data to create certificate for
/// @param referenceTimestamp The reference timestamp
/// @return The BN254 certificate
function _createValidBN254CertificateForResult(bytes32 taskHash, bytes memory result, uint96 referenceTimestamp)
⋮----
/// @notice Get the reference timestamp for a task (helper for tests)
/// @param _taskHash The task hash
/// @return The reference timestamp stored in the task
function _getTaskReferenceTimestamp(bytes32 _taskHash) internal view returns (uint32) {
⋮----
/// @notice Create a valid ECDSA certificate for a given result
⋮----
/// @return The ECDSA certificate
function _createValidECDSACertificateForResult(bytes32 taskHash, bytes memory result, uint96 referenceTimestamp)
⋮----
contract TaskMailboxUnitTests_Constructor is TaskMailboxUnitTests {
function test_Constructor_WithCertificateVerifiers() public {
⋮----
// Deploy with proxy pattern
⋮----
function test_Constructor_SetsMaxTaskSLA() public {
// Test that MAX_TASK_SLA is properly set during construction
⋮----
// Deploy with custom MAX_TASK_SLA
⋮----
// Verify MAX_TASK_SLA is set correctly
⋮----
// Test contract for registerExecutorOperatorSet
contract TaskMailboxUnitTests_registerExecutorOperatorSet is TaskMailboxUnitTests {
function testFuzz_registerExecutorOperatorSet(address fuzzAvs, uint32 fuzzOperatorSetId, bool fuzzIsRegistered) public {
// Skip if fuzzAvs is the proxy admin to avoid proxy admin access issues
⋮----
// Set config first (requirement for registerExecutorOperatorSet)
⋮----
// If unregistering, expect event
⋮----
// Register operator set
⋮----
// Verify registration status
⋮----
function test_registerExecutorOperatorSet_Unregister() public {
⋮----
// Set config (this automatically registers the operator set)
⋮----
// Then unregister
⋮----
function test_Revert_registerExecutorOperatorSet_ConfigNotSet() public {
⋮----
function test_Revert_registerExecutorOperatorSet_InvalidOperatorSetOwner() public {
⋮----
// Set config as avs
⋮----
// Try to register as different address
⋮----
// Test contract for setExecutorOperatorSetTaskConfig
contract TaskMailboxUnitTests_setExecutorOperatorSetTaskConfig is TaskMailboxUnitTests {
function test_Revert_InvalidOperatorSetOwner() public {
⋮----
// Try to set config as wrong address
⋮----
function testFuzz_setExecutorOperatorSetTaskConfig(
⋮----
// Bound inputs
⋮----
// Bound taskSLA to be between 1 and MAX_TASK_SLA
⋮----
// Bound stake proportion threshold to valid range (0-10000 basis points)
⋮----
// Since setExecutorOperatorSetTaskConfig always registers if not already registered,
// we expect both events every time for a new operator set
// Note: The contract emits config event first, then registration event
⋮----
// Expect config event first
⋮----
// Expect registration event second
⋮----
// Set config
⋮----
// Verify config was set
⋮----
// Verify consensus configuration
⋮----
// Verify operator set is registered
⋮----
function test_setExecutorOperatorSetTaskConfig_AlreadyRegistered() public {
⋮----
// First set config (which auto-registers)
⋮----
// Update config again
⋮----
// Should not emit registration event since already registered
⋮----
// Verify only one event was emitted (config set, not registration)
⋮----
// Verify the config was updated
⋮----
function test_Revert_WhenCurveTypeIsNone() public {
⋮----
// Expecting revert due to accessing zero address certificate verifier
⋮----
function test_Revert_WhenTaskHookIsZero() public {
⋮----
function test_Revert_WhenTaskSLAIsZero() public {
⋮----
function test_Revert_WhenConsensusValueInvalid_EmptyBytes() public {
⋮----
function test_Revert_WhenConsensusValueInvalid_WrongLength() public {
⋮----
value: abi.encodePacked(uint8(50)) // Wrong size - should be 32 bytes
⋮----
function test_Revert_WhenConsensusValueInvalid_ExceedsMaximum() public {
⋮----
value: abi.encode(uint16(10_001)) // Exceeds 10000 basis points
⋮----
function test_ConsensusZeroThreshold() public {
⋮----
value: abi.encode(uint16(0)) // Zero threshold is valid
⋮----
function test_ConsensusMaxThreshold() public {
⋮----
value: abi.encode(uint16(10_000)) // Maximum 100%
⋮----
function test_ConsensusTypeNone_ValidWithEmptyValue() public {
⋮----
value: bytes("") // Empty value for NONE type
⋮----
// Should succeed with ConsensusType.NONE and empty value
⋮----
// Verify the config was set
⋮----
function test_Revert_ConsensusTypeNone_InvalidWithNonEmptyValue() public {
⋮----
value: abi.encode(uint16(5000)) // Non-empty value for NONE type
⋮----
// Should revert with non-empty value for ConsensusType.NONE
⋮----
function test_Revert_WhenTaskSLAExceedsMaximum() public {
// Test that setExecutorOperatorSetTaskConfig reverts when taskSLA > MAX_TASK_SLA
⋮----
// Set taskSLA to exceed MAX_TASK_SLA
⋮----
function test_setExecutorOperatorSetTaskConfig_WithMaxTaskSLA() public {
// Test that setExecutorOperatorSetTaskConfig succeeds when taskSLA equals MAX_TASK_SLA
⋮----
// Set taskSLA to exactly MAX_TASK_SLA
⋮----
// Should emit events and succeed
⋮----
// Verify the config was set correctly
⋮----
function testFuzz_setExecutorOperatorSetTaskConfig_RespectsMaxTaskSLA(uint96 fuzzTaskSLA) public {
// Fuzz test to ensure all valid taskSLA values work and invalid ones revert
⋮----
// Should revert for invalid values
⋮----
// Should succeed for valid values
⋮----
// Test contract for setFeeSplit
contract TaskMailboxUnitTests_setFeeSplit is TaskMailboxUnitTests {
function test_SetFeeSplit() public {
uint16 newFeeSplit = 2000; // 20%
⋮----
function test_SetFeeSplit_MaxValue() public {
uint16 maxFeeSplit = 10_000; // 100%
⋮----
function test_Revert_SetFeeSplit_NotOwner() public {
⋮----
function test_Revert_SetFeeSplit_ExceedsMax() public {
⋮----
taskMailbox.setFeeSplit(10_001); // > 100%
⋮----
// Test contract for setFeeSplitCollector
contract TaskMailboxUnitTests_setFeeSplitCollector is TaskMailboxUnitTests {
function test_SetFeeSplitCollector() public {
⋮----
function test_Revert_SetFeeSplitCollector_NotOwner() public {
⋮----
function test_Revert_SetFeeSplitCollector_ZeroAddress() public {
⋮----
// Test contract for createTask
contract TaskMailboxUnitTests_createTask is TaskMailboxUnitTests {
function setUp() public override {
⋮----
// Set up executor operator set task config
⋮----
function testFuzz_createTask(address fuzzRefundCollector, uint96 fuzzAvsFee, bytes memory fuzzPayload) public {
⋮----
// We create two tasks in this test, so need at least 2x the fee
⋮----
// If there's a fee, refund collector cannot be zero address
⋮----
// Set the mock hook to return the fuzzed fee
⋮----
// First task will have count 0
⋮----
// Expect Transfer event for fee transfer from creator to taskMailbox
⋮----
// Expect event
⋮----
0, // operatorTableReferenceTimestamp
⋮----
// Create task
⋮----
// Verify task hash
⋮----
// Verify global task count incremented by creating another task and checking its hash
⋮----
// Expect Transfer event for fee transfer from creator to taskMailbox for second task
⋮----
// Verify task was created
⋮----
// Verify token transfer if fee > 0
// Note: We created two tasks with the same fee, so balance should be 2 * fuzzAvsFee
⋮----
function test_createTask_ZeroFee() public {
// Set the mock hook to return 0 fee
⋮----
// Verify no token transfer occurred
⋮----
// Verify task was created with zero fee
⋮----
function test_createTask_NoFeeToken() public {
// Set up config without fee token
⋮----
// Verify no token transfer occurred even with non-zero fee
⋮----
function test_Revert_WhenPayloadIsEmpty() public {
⋮----
function test_Revert_WhenExecutorOperatorSetNotRegistered() public {
⋮----
taskParams.executorOperatorSet.id = 99; // Unregistered operator set
⋮----
function test_Revert_WhenExecutorOperatorSetTaskConfigNotSet() public {
// Create an operator set that has never been configured
⋮----
// Should revert because operator set is not registered (no config set)
⋮----
function test_Revert_ReentrancyOnCreateTask() public {
// Deploy reentrant attacker as task hook
⋮----
// Set up executor operator set with attacker as hook
⋮----
// Give attacker tokens and approve
⋮----
// Set up attack parameters
⋮----
true, // attack on post
true // attack createTask
⋮----
// Try to create task - should revert on reentrancy
⋮----
function test_Revert_createTask_InvalidFeeReceiver_RefundCollector() public {
// Set up operator set with fee token
⋮----
// Create task params with zero refund collector
⋮----
// Should revert with InvalidFeeReceiver when refundCollector is zero
⋮----
function test_Revert_createTask_InvalidFeeReceiver_FeeCollector() public {
// Set up operator set with fee token but zero fee collector
⋮----
config.feeCollector = address(0); // Zero fee collector
⋮----
// Create valid task params
⋮----
// Should revert with InvalidFeeReceiver when feeCollector is zero
⋮----
function test_createTask_ValidWithZeroFeeReceivers_NoFeeToken() public {
// When there's no fee token, zero addresses should be allowed
⋮----
config.feeToken = IERC20(address(0)); // No fee token
config.feeCollector = address(0); // Zero fee collector is OK when no fee token
⋮----
refundCollector: address(0), // Zero refund collector is OK when no fee token
⋮----
// Should succeed when there's no fee token
⋮----
function test_createTask_CapturesFeeSplitValues() public {
// Set fee split values
uint16 feeSplit = 1500; // 15%
⋮----
// Verify task captured current fee split value
⋮----
// Change fee split values
uint16 newFeeSplit = 3000; // 30%
⋮----
// Create another task
⋮----
// Verify new task has new fee split while old task retains old value
⋮----
// Verify old task still has old fee split value
⋮----
// Verify that the global feeSplitCollector is used (not captured in task)
⋮----
function test_createTask_CertificateStaleness_NoStalenessCheck() public {
// Test when maxOperatorTableStaleness is 0 (no staleness check)
⋮----
// Configure the existing mock BN254 certificate verifier
mockBN254CertificateVerifier.setLatestReferenceTimestamp(100); // Set reference timestamp to 100
mockBN254CertificateVerifier.setMaxOperatorTableStaleness(0); // No staleness check when 0
⋮----
config.taskSLA = 3600; // 1 hour SLA
⋮----
// Set time far in the future, making the reference timestamp stale
vm.warp(100_000); // Reference timestamp (100) + taskSLA (3600) = 3700, current time = 100000
⋮----
// Give creator tokens and approve
⋮----
// Should succeed because maxOperatorTableStaleness is 0 (no check)
⋮----
// Verify task was created successfully
⋮----
function test_createTask_CertificateStaleness_WithinStalenessWindow() public {
// Test when certificate is within the staleness window
⋮----
mockBN254CertificateVerifier.setLatestReferenceTimestamp(1000); // Reference timestamp
mockBN254CertificateVerifier.setMaxOperatorTableStaleness(3600); // 1 hour staleness window
⋮----
config.taskSLA = 1800; // 30 minutes SLA
⋮----
// Set time such that certificate is within staleness window:
// referenceTimestamp (1000) + maxStaleness (3600) = 4600
// current time + taskSLA (1800) = 3000 + 1800 = 4800
// Since 4800 <= 4600 is false, this should be within limits
// Let's adjust: current time + taskSLA should be <= referenceTimestamp + maxStaleness
// So: current time + 1800 <= 1000 + 3600 = 4600
// current time <= 2800
vm.warp(2500); // Well within limits (2500 + 1800 = 4300 <= 4600)
⋮----
// Should succeed because certificate is within staleness window
⋮----
function test_Revert_createTask_CertificateStale() public {
// Test when certificate is stale (outside the staleness window)
⋮----
// Set time such that certificate is outside staleness window:
// We need: current time + taskSLA > referenceTimestamp + maxStaleness
// current time + 1800 > 1000 + 3600 = 4600
// current time > 2800
vm.warp(3000); // 3000 + 1800 = 4800 > 4600, so certificate is stale
⋮----
// Should revert with CertificateStale error
⋮----
function test_createTask_CertificateStaleness_EdgeCase_ExactBoundary() public {
// Test edge case where current time + taskSLA equals referenceTimestamp + maxStaleness
⋮----
// Set time such that current time + taskSLA exactly equals referenceTimestamp + maxStaleness
⋮----
// current time + taskSLA (1800) = 4600
// current time = 2800
vm.warp(2800); // 2800 + 1800 = 4600, exactly at the boundary
⋮----
// Should succeed because the condition is <= (current time + taskSLA <= referenceTimestamp + maxStaleness)
⋮----
// Test contract for submitResult
contract TaskMailboxUnitTests_submitResult is TaskMailboxUnitTests {
⋮----
// Create a task
⋮----
function testFuzz_submitResult_WithBN254Certificate(bytes memory fuzzResult) public {
// Advance time by 1 second to pass TimestampAtCreation check
⋮----
// Submit result
⋮----
// Verify task was verified
⋮----
// Verify result was stored
⋮----
// Verify certificate was stored
⋮----
function testFuzz_submitResult_WithECDSACertificate(bytes memory fuzzResult) public {
// Setup executor operator set with ECDSA curve type
⋮----
function test_Revert_WhenTimestampAtCreation() public {
// Get task creation time
⋮----
// Don't advance time
⋮----
function test_Revert_WhenTaskExpired() public {
// Get task creation time before advancing time
⋮----
// Advance time past task SLA
⋮----
function test_Revert_WhenTaskDoesNotExist() public {
⋮----
// Use block.timestamp as a dummy creation time for non-existent task
⋮----
function test_Revert_WhenCertificateVerificationFailed_BN254() public {
// Create a custom mock that returns false for certificate verification
⋮----
// Deploy a new TaskMailbox with the failing verifier using proxy pattern
⋮----
// Give creator tokens and approve the new TaskMailbox
⋮----
// Create new task with this config
⋮----
// Get task info
⋮----
// Advance time
⋮----
function test_Revert_WhenCertificateVerificationFailed_ECDSA() public {
⋮----
// Deploy a new TaskMailbox with the failing ECDSA verifier using proxy pattern
⋮----
// Create ECDSA certificate
⋮----
// Submit should fail
⋮----
function test_Revert_WhenInvalidCertificateEncoding() public {
⋮----
// Create invalid encoded certificate (not properly encoded ECDSA certificate)
⋮----
// Submit should fail due to decoding error
⋮----
vm.expectRevert(); // Will revert during abi.decode
⋮----
function test_Revert_AlreadyVerified() public {
⋮----
// First submit a valid result
⋮----
// Try to submit again with a different result
⋮----
function test_Revert_ReentrancyOnSubmitResult() public {
⋮----
false, // attack on handleTaskResultSubmission
false // attack submitResult
⋮----
// Try to submit result - should revert on reentrancy
⋮----
function test_Revert_ReentrancyOnSubmitResult_TryingToCreateTask() public {
⋮----
function test_submitResult_WithZeroStakeThreshold() public {
// Setup executor operator set with zero stake threshold
⋮----
value: abi.encode(uint16(0)) // Zero threshold
⋮----
// Submit result with zero threshold should still work
⋮----
function test_submitResult_WithMaxStakeThreshold() public {
// Setup executor operator set with max stake threshold
⋮----
value: abi.encode(uint16(10_000)) // 100% threshold
⋮----
// Submit result with max threshold
⋮----
function test_Revert_WhenBN254CertificateHasEmptySignature() public {
⋮----
// Create BN254 certificate with empty signature (X=0, Y=0)
⋮----
signature: BN254.G1Point(0, 0), // Empty signature
⋮----
// Submit result should fail with EmptyCertificateSignature error
⋮----
function test_Revert_WhenUsingOldBN254CertificateForDifferentTask() public {
// Create and submit result for first task
⋮----
// Submit result for first task (taskHash)
⋮----
// Create second task
⋮----
// Try to use the certificate from task1 for task2
// This creates a certificate with messageHash for task1 but tries to use it for task2
⋮----
// Attacker tries to submit result for task2 using certificate signed for task1
// This should fail with InvalidMessageHash because the certificate's messageHash
// doesn't match getMessageHash(taskHash2, result)
vm.prank(address(0xBAD)); // Random attacker address
⋮----
function test_Revert_WhenUsingOldECDSACertificateForDifferentTask() public {
⋮----
// Create first task
⋮----
// Submit result for first task
⋮----
// Try to use certificate from task1 for task2
⋮----
function test_ValidSignature_WhenBN254CertificateHasOnlyXZero() public {
⋮----
// Create BN254 certificate with only X coordinate as zero (valid signature)
⋮----
signature: BN254.G1Point(0, 2), // Only X is zero - this is valid
⋮----
// Submit result should succeed since only one coordinate is zero
// MockBN254CertificateVerifier returns true by default
⋮----
// Verify task is now verified
⋮----
function test_ValidSignature_WhenBN254CertificateHasOnlyYZero() public {
⋮----
// Create BN254 certificate with only Y coordinate as zero (valid signature)
⋮----
signature: BN254.G1Point(1, 0), // Only Y is zero - this is valid
⋮----
function test_Revert_WhenECDSACertificateHasEmptySignature() public {
⋮----
// Create ECDSA certificate with empty signature
⋮----
sig: bytes("") // Empty signature
⋮----
function test_Revert_WhenBN254CertificateHasEmptySignature_WithZeroThreshold() public {
⋮----
// Create BN254 certificate with empty signature
⋮----
// Even with zero threshold, empty signatures should be rejected
⋮----
function test_Revert_WhenECDSACertificateHasEmptySignature_WithZeroThreshold() public {
// Setup executor operator set with ECDSA curve type and zero threshold
⋮----
function test_submitResult_FeeTransferToCollector() public {
⋮----
// Create task with fee
⋮----
// Check initial balances
⋮----
// mailboxBalanceBefore should be 2*avsFee (one from setUp, one from this test)
⋮----
// Advance time and submit result
⋮----
// Mock certificate verification
⋮----
// Expect Transfer event for fee transfer from taskMailbox to feeCollector
// Since feeSplit is 0 by default, all avsFee goes to feeCollector
⋮----
// Verify fee was transferred to fee collector
⋮----
// Verify task cannot be refunded after verification
⋮----
function test_FeeSplit_10Percent() public {
// Setup fee split
uint16 feeSplit = 1000; // 10%
⋮----
// Calculate expected amounts
⋮----
// Expect Transfer events for fee distribution
// First, transfer to fee split collector
⋮----
// Then, transfer remaining to fee collector
⋮----
function test_FeeSplit_50Percent() public {
⋮----
uint16 feeSplit = 5000; // 50%
⋮----
// Calculate expected amounts - should be equal split
⋮----
function test_FeeSplit_0Percent() public {
// Setup fee split - 0% means all fees go to fee collector
⋮----
// Expect Transfer event for fee transfer to fee collector only (no fee split)
// Since feeSplit is 0, all avsFee goes to feeCollector
⋮----
// Verify all fees went to fee collector
assertEq(mockToken.balanceOf(localFeeSplitCollector), feeSplitCollectorBalanceBefore); // No change
⋮----
function test_FeeSplit_100Percent() public {
// Setup fee split - 100% means all fees go to fee split collector
⋮----
// Expect Transfer event for fee transfer to fee split collector only
// Since feeSplit is 100%, all avsFee goes to feeSplitCollector
⋮----
// Verify all fees went to fee split collector
⋮----
assertEq(mockToken.balanceOf(feeCollector), feeCollectorBalanceBefore); // No change
⋮----
function test_FeeSplit_ZeroFeeAmount() public {
⋮----
// Setup operator set with zero fee
⋮----
// Verify no transfers occurred
⋮----
function test_FeeSplit_WithSmallFee() public {
⋮----
uint16 feeSplit = 3333; // 33.33%
⋮----
// Setup small fee
uint96 smallFee = 100; // 100 wei
⋮----
// Calculate expected fee distribution
uint expectedFeeSplitAmount = (smallFee * feeSplit) / 10_000; // 33 wei
uint expectedFeeCollectorAmount = smallFee - expectedFeeSplitAmount; // 67 wei
⋮----
assertEq(expectedFeeSplitAmount + expectedFeeCollectorAmount, smallFee); // Verify no wei lost
⋮----
function test_FeeSplit_Rounding() public {
// Setup fee split that will cause rounding
uint16 feeSplit = 1; // 0.01%
⋮----
// Setup fee that won't divide evenly
uint96 oddFee = 10_001; // Will result in 1.0001 wei split
⋮----
uint expectedFeeSplitAmount = (oddFee * feeSplit) / 10_000; // 1 wei (rounded down from 1.0001)
uint expectedFeeCollectorAmount = oddFee - expectedFeeSplitAmount; // 10000 wei
⋮----
function testFuzz_FeeSplit(uint16 _feeSplit, uint96 _avsFee) public {
⋮----
// Setup fee
⋮----
// Verify balances
⋮----
// Verify total distribution equals original fee
⋮----
function test_FeeSplit_TaskUsesSnapshotFeeSplitAndCurrentCollector() public {
// Setup initial fee split
uint16 initialFeeSplit = 2000; // 20%
⋮----
// Change fee split after task creation
⋮----
taskMailbox.setFeeSplit(5000); // 50%
⋮----
// First, transfer to current fee split collector (not the initial one)
⋮----
assertEq(mockToken.balanceOf(initialFeeSplitCollector), initialCollectorBalanceBefore); // No change
⋮----
assertEq(mockToken.balanceOf(newFeeSplitCollector), newCollectorBalanceBefore + ((avsFee * initialFeeSplit) / 10_000)); // Gets the fee split
⋮----
function test_Revert_WhenBN254CertificateHasInvalidReferenceTimestamp() public {
⋮----
// Create BN254 certificate with wrong reference timestamp (current block.timestamp instead of creation time)
⋮----
referenceTimestamp: uint32(block.timestamp), // Wrong timestamp
⋮----
// Submit result should fail with InvalidReferenceTimestamp error
⋮----
function test_Revert_WhenECDSACertificateHasInvalidReferenceTimestamp() public {
⋮----
// Create ECDSA certificate with wrong reference timestamp
⋮----
function test_Revert_WhenBN254CertificateHasInvalidMessageHash() public {
⋮----
// Create BN254 certificate with wrong message hash
⋮----
messageHash: keccak256(wrongResult), // Wrong message hash
⋮----
// Submit result should fail with InvalidMessageHash error
⋮----
function test_Revert_WhenECDSACertificateHasInvalidMessageHash() public {
⋮----
// Create ECDSA certificate with wrong message hash
⋮----
// ============ ConsensusType.NONE Tests ============
⋮----
function test_submitResult_ConsensusTypeNone_WithBN254Certificate() public {
// Setup executor operator set with ConsensusType.NONE
⋮----
// Submit result with valid certificate
⋮----
// Create a valid BN254 certificate
⋮----
// Verify task is marked as verified
⋮----
function test_submitResult_ConsensusTypeNone_WithECDSACertificate() public {
⋮----
// Create a valid ECDSA certificate
⋮----
function test_Revert_ConsensusTypeNone_BN254Certificate_InvalidReferenceTimestamp() public {
⋮----
// Submit result with invalid reference timestamp
⋮----
99_999 // Wrong reference timestamp
⋮----
function test_Revert_ConsensusTypeNone_ECDSACertificate_InvalidReferenceTimestamp() public {
⋮----
referenceTimestamp: 99_999, // Wrong reference timestamp
⋮----
function test_Revert_ConsensusTypeNone_BN254Certificate_InvalidMessageHash() public {
⋮----
// Submit result with invalid message hash
⋮----
messageHash: keccak256(bytes("wrong result")), // Wrong message hash
⋮----
function test_Revert_ConsensusTypeNone_ECDSACertificate_InvalidMessageHash() public {
⋮----
// Submit result with wrong message hash
⋮----
function test_Revert_ConsensusTypeNone_BN254Certificate_EmptySignature() public {
⋮----
// Submit result with empty signature
⋮----
function test_Revert_ConsensusTypeNone_ECDSACertificate_EmptySignature() public {
⋮----
// Test contract for refundFee function
contract TaskMailboxUnitTests_refundFee is TaskMailboxUnitTests {
⋮----
// Set up operator set and task config with fee token
⋮----
// Create a task with fee
⋮----
function test_refundFee_Success() public {
// Move time forward to expire the task
⋮----
// Expect Transfer event for fee refund from taskMailbox to refundCollector
⋮----
// Refund fee as refund collector
⋮----
// Verify balances changed correctly
⋮----
// Verify task state
⋮----
function test_Revert_refundFee_OnlyRefundCollector() public {
⋮----
// Try to refund as someone else (not refund collector)
⋮----
// Try as a random address
⋮----
function test_Revert_refundFee_FeeAlreadyRefunded() public {
⋮----
// First refund should succeed
⋮----
// Second refund should fail
⋮----
function test_Revert_refundFee_TaskNotExpired() public {
// Try to refund before task expires
⋮----
function test_Revert_refundFee_TaskAlreadyVerified() public {
⋮----
// Submit result to verify the task
⋮----
// Move time forward to what would be expiry
⋮----
// Try to refund - should fail because task is verified
⋮----
function test_refundFee_NoFeeToken() public {
// Create a task without fee token
⋮----
// Refund should succeed but no transfer should occur
⋮----
// Balances should not change since there's no fee token
⋮----
// Task should still be marked as refunded
⋮----
function test_refundFee_WithFeeSplit() public {
⋮----
uint16 feeSplit = 3000; // 30%
⋮----
// Check initial balance
⋮----
// Note: fee split doesn't apply to refunds, full amount is refunded
⋮----
// Refund fee
⋮----
// Verify full fee was refunded (fee split doesn't apply to refunds)
⋮----
// Verify fee split collector got nothing
⋮----
function test_refundFee_ZeroFee() public {
// Set mock to return 0 fee
⋮----
// Create a task with 0 fee
⋮----
// Balances should not change since fee is 0
⋮----
// Test contract for view functions
contract TaskMailboxUnitTests_ViewFunctions is TaskMailboxUnitTests {
⋮----
function test_ViewFunctions() public {
// Test that we can read the immutable certificate verifiers
⋮----
// Test fee split getters
assertEq(taskMailbox.feeSplit(), 0); // Default value from initialization
assertEq(taskMailbox.feeSplitCollector(), feeSplitCollector); // Default value from initialization
⋮----
// Test MAX_TASK_SLA getter
assertEq(taskMailbox.MAX_TASK_SLA(), MAX_TASK_SLA); // Should return the configured maximum task SLA
⋮----
function test_getExecutorOperatorSetTaskConfig() public {
⋮----
function test_getExecutorOperatorSetTaskConfig_Unregistered() public {
⋮----
// Should return empty config
⋮----
function test_getTaskInfo() public {
⋮----
assertEq(task.operatorTableReferenceTimestamp, _getTaskReferenceTimestamp(taskHash)); // New field check
⋮----
function test_getTaskInfo_NonExistentTask() public {
⋮----
// Should return empty task with NONE status (default for non-existent tasks)
⋮----
assertEq(uint8(task.status), uint8(TaskStatus.NONE)); // Non-existent tasks show as NONE
⋮----
function test_getTaskStatus_Created() public {
⋮----
function test_getTaskStatus_Verified() public {
⋮----
function test_getTaskStatus_Expired() public {
// Advance time past SLA
⋮----
function test_getTaskStatus_None() public {
// Get status of non-existent task
⋮----
function test_getTaskInfo_Expired() public {
⋮----
// getTaskInfo should return Expired status
⋮----
function test_getTaskResult() public {
⋮----
// Submit result first
⋮----
// Get result
⋮----
function test_Revert_getTaskResult_NotVerified() public {
⋮----
function test_Revert_getTaskResult_Expired() public {
⋮----
function test_Revert_getTaskResult_None() public {
⋮----
// Test contract for storage variables
contract TaskMailboxUnitTests_Storage is TaskMailboxUnitTests {
function test_globalTaskCount() public {
⋮----
// Create multiple tasks and verify the count through task hashes
⋮----
// First task should have count 0
⋮----
// Second task should have count 1
⋮----
// Third task should have count 2
⋮----
function test_isExecutorOperatorSetRegistered() public {
⋮----
// Initially not registered
⋮----
// After setting config, it should be automatically registered
⋮----
// Unregister
⋮----
// Access config via getExecutorOperatorSetTaskConfig function
⋮----
function test_tasks() public {
⋮----
// Access task via getTaskInfo public function
⋮----
// Test contract for upgradeable functionality
contract TaskMailboxUnitTests_Upgradeable is TaskMailboxUnitTests {
function test_Initialize_OnlyOnce() public {
// Try to initialize again, should revert
⋮----
function test_Implementation_CannotBeInitialized() public {
// Deploy a new implementation
⋮----
// Try to initialize the implementation directly, should revert
⋮----
function test_ProxyUpgrade() public {
⋮----
// Deploy new implementation with different version
⋮----
// Upgrade proxy to new implementation
⋮----
// Verify state is preserved (owner should still be the same)
⋮----
function test_ProxyAdmin_OnlyOwnerCanUpgrade() public {
⋮----
// Deploy new implementation
⋮----
// Try to upgrade from non-owner, should revert
⋮----
function test_ProxyAdmin_CannotCallImplementation() public {
// ProxyAdmin should not be able to call implementation functions
⋮----
function test_StorageSlotConsistency_AfterUpgrade() public {
⋮----
// First, make some state changes
⋮----
// Set up an executor operator set
⋮----
// Verify config is set
⋮----
// Upgrade
vm.prank(address(this)); // proxyAdmin owner
⋮----
// Verify all state is preserved after upgrade
⋮----
// Verify the executor operator set config is still there
⋮----
function test_InitializerModifier_PreventsReinitialization() public {
// Deploy a new proxy without initialization data
⋮----
// Initialize it once
⋮----
// Try to initialize again, should fail
````

## File: src/test/utils/ArrayLib.sol
````
// SPDX-License-Identifier: BUSL-1.1
⋮----
import {Vm} from "forge-std/Vm.sol";
⋮----
import "src/contracts/interfaces/IAllocationManager.sol";
import "src/contracts/interfaces/IDelegationManager.sol";
⋮----
/// -----------------------------------------------------------------------
/// Single Item Arrays
⋮----
function toArrayU16(uint16 x) internal pure returns (uint16[] memory array) {
⋮----
function toArrayU32(uint32 x) internal pure returns (uint32[] memory array) {
⋮----
function toArrayU64(uint64 x) internal pure returns (uint64[] memory array) {
⋮----
function toArrayU256(uint x) internal pure returns (uint[] memory array) {
⋮----
function toArrayU16(uint16 x, uint len) internal pure returns (uint16[] memory array) {
⋮----
function toArrayU32(uint32 x, uint len) internal pure returns (uint32[] memory array) {
⋮----
function toArrayU64(uint64 x, uint len) internal pure returns (uint64[] memory array) {
⋮----
function toArrayU256(uint x, uint len) internal pure returns (uint[] memory array) {
⋮----
function toArray(address x) internal pure returns (address[] memory array) {
⋮----
function toArray(bool x) internal pure returns (bool[] memory array) {
⋮----
function toArray(bool x, uint len) internal pure returns (bool[] memory array) {
⋮----
/// EigenLayer Types
⋮----
function toArray(IERC20 token) internal pure returns (IERC20[] memory array) {
⋮----
function toArray(IStrategy strategy) internal pure returns (IStrategy[] memory array) {
⋮----
function toArray(OperatorSet memory operatorSet) internal pure returns (OperatorSet[] memory array) {
⋮----
function toArray(IAllocationManagerTypes.CreateSetParams memory createSetParams)
⋮----
function toArray(IAllocationManagerTypes.CreateSetParamsV2 memory createSetParamsV2)
⋮----
function toArray(IAllocationManagerTypes.AllocateParams memory allocateParams)
⋮----
function toArray(IDelegationManagerTypes.Withdrawal memory withdrawal)
⋮----
function toArray(IDelegationManagerTypes.QueuedWithdrawalParams memory queuedWithdrawalParams)
⋮----
/// Length Updates
⋮----
function setLength(uint16[] memory array, uint len) internal pure returns (uint16[] memory) {
⋮----
function setLength(uint32[] memory array, uint len) internal pure returns (uint32[] memory) {
⋮----
function setLength(uint64[] memory array, uint len) internal pure returns (uint64[] memory) {
⋮----
function setLength(uint[] memory array, uint len) internal pure returns (uint[] memory) {
⋮----
function setLength(address[] memory array, uint len) internal pure returns (address[] memory) {
⋮----
function setLength(IERC20[] memory array, uint len) internal pure returns (IERC20[] memory) {
⋮----
function setLength(IStrategy[] memory array, uint len) internal pure returns (IStrategy[] memory) {
⋮----
function setLength(OperatorSet[] memory array, uint len) internal pure returns (OperatorSet[] memory) {
⋮----
function setLength(IDelegationManagerTypes.Withdrawal[] memory array, uint len)
⋮----
/// Contains
⋮----
function contains(uint16[] memory array, uint16 x) internal pure returns (bool) {
⋮----
function contains(uint32[] memory array, uint32 x) internal pure returns (bool) {
⋮----
function contains(uint64[] memory array, uint64 x) internal pure returns (bool) {
⋮----
function contains(uint[] memory array, uint x) internal pure returns (bool) {
⋮----
function contains(address[] memory array, address x) internal pure returns (bool) {
⋮----
function contains(IERC20[] memory array, IERC20 x) internal pure returns (bool) {
⋮----
function contains(IStrategy[] memory array, IStrategy x) internal pure returns (bool) {
⋮----
function contains(OperatorSet[] memory array, OperatorSet memory x) internal pure returns (bool) {
⋮----
function contains(IDelegationManagerTypes.Withdrawal[] memory array, IDelegationManagerTypes.Withdrawal memory x)
⋮----
/// indexOf
⋮----
function indexOf(uint16[] memory array, uint16 x) internal pure returns (uint) {
⋮----
function indexOf(uint32[] memory array, uint32 x) internal pure returns (uint) {
⋮----
function indexOf(uint64[] memory array, uint64 x) internal pure returns (uint) {
⋮----
function indexOf(uint[] memory array, uint x) internal pure returns (uint) {
⋮----
function indexOf(address[] memory array, address x) internal pure returns (uint) {
⋮----
function indexOf(IERC20[] memory array, IERC20 x) internal pure returns (uint) {
⋮----
function indexOf(IStrategy[] memory array, IStrategy x) internal pure returns (uint) {
⋮----
function indexOf(OperatorSet[] memory array, OperatorSet memory x) internal pure returns (uint) {
⋮----
function indexOf(IDelegationManagerTypes.Withdrawal[] memory array, IDelegationManagerTypes.Withdrawal memory x)
⋮----
/// Sorting
⋮----
function sort(IStrategy[] memory strategies) internal returns (IStrategy[] memory) {
⋮----
function shuffle(IStrategy[] memory strats) internal returns (IStrategy[] memory) {
````

## File: src/test/utils/BN256G2.sol
````
/// @title Elliptic curve operations on twist points for alt_bn128
/// @author Mustafa Al-Bassam (mus@musalbas.com)
/// @dev Homepage: https://github.com/musalbas/solidity-BN256G2
⋮----
/// @notice Add two twist points
/// @param pt1xx Coefficient 1 of x on point 1
/// @param pt1xy Coefficient 2 of x on point 1
/// @param pt1yx Coefficient 1 of y on point 1
/// @param pt1yy Coefficient 2 of y on point 1
/// @param pt2xx Coefficient 1 of x on point 2
/// @param pt2xy Coefficient 2 of x on point 2
/// @param pt2yx Coefficient 1 of y on point 2
/// @param pt2yy Coefficient 2 of y on point 2
/// @return (pt3xx, pt3xy, pt3yx, pt3yy)
function ECTwistAdd(uint pt1xx, uint pt1xy, uint pt1yx, uint pt1yy, uint pt2xx, uint pt2xy, uint pt2yx, uint pt2yy)
⋮----
/// @notice Multiply a twist point by a scalar
/// @param s     Scalar to multiply by
/// @param pt1xx Coefficient 1 of x
/// @param pt1xy Coefficient 2 of x
/// @param pt1yx Coefficient 1 of y
/// @param pt1yy Coefficient 2 of y
/// @return (pt2xx, pt2xy, pt2yx, pt2yy)
function ECTwistMul(uint s, uint pt1xx, uint pt1xy, uint pt1yx, uint pt1yy) public view returns (uint, uint, uint, uint) {
⋮----
/// @notice Get the field modulus
/// @return The field modulus
function GetFieldModulus() public pure returns (uint) {
⋮----
function submod(uint a, uint b, uint n) internal pure returns (uint) {
⋮----
function _FQ2Mul(uint xx, uint xy, uint yx, uint yy) internal pure returns (uint, uint) {
⋮----
function _FQ2Mul(uint xx, uint xy, uint c) internal pure returns (uint, uint) {
⋮----
function _FQ2Add(uint xx, uint xy, uint yx, uint yy) internal pure returns (uint, uint) {
⋮----
function _FQ2Sub(uint xx, uint xy, uint yx, uint yy) internal pure returns (uint rx, uint ry) {
⋮----
function _FQ2Div(uint xx, uint xy, uint yx, uint yy) internal view returns (uint, uint) {
⋮----
function _FQ2Inv(uint x, uint y) internal view returns (uint, uint) {
⋮----
function _isOnCurve(uint xx, uint xy, uint yx, uint yy) internal pure returns (bool) {
⋮----
function _modInv(uint a, uint n) internal view returns (uint result) {
⋮----
function _fromJacobian(uint pt1xx, uint pt1xy, uint pt1yx, uint pt1yy, uint pt1zx, uint pt1zy)
⋮----
function _ECTwistAddJacobian(
⋮----
(pt2yx, pt2yy) = _FQ2Mul(pt2yx, pt2yy, pt1zx, pt1zy); // U1 = y2 * z1
(pt3[PTYX], pt3[PTYY]) = _FQ2Mul(pt1yx, pt1yy, pt2zx, pt2zy); // U2 = y1 * z2
(pt2xx, pt2xy) = _FQ2Mul(pt2xx, pt2xy, pt1zx, pt1zy); // V1 = x2 * z1
(pt3[PTZX], pt3[PTZY]) = _FQ2Mul(pt1xx, pt1xy, pt2zx, pt2zy); // V2 = x1 * z2
⋮----
(pt2zx, pt2zy) = _FQ2Mul(pt1zx, pt1zy, pt2zx, pt2zy); // W = z1 * z2
(pt1xx, pt1xy) = _FQ2Sub(pt2yx, pt2yy, pt3[PTYX], pt3[PTYY]); // U = U1 - U2
(pt1yx, pt1yy) = _FQ2Sub(pt2xx, pt2xy, pt3[PTZX], pt3[PTZY]); // V = V1 - V2
(pt1zx, pt1zy) = _FQ2Mul(pt1yx, pt1yy, pt1yx, pt1yy); // V_squared = V * V
(pt2yx, pt2yy) = _FQ2Mul(pt1zx, pt1zy, pt3[PTZX], pt3[PTZY]); // V_squared_times_V2 = V_squared * V2
(pt1zx, pt1zy) = _FQ2Mul(pt1zx, pt1zy, pt1yx, pt1yy); // V_cubed = V * V_squared
(pt3[PTZX], pt3[PTZY]) = _FQ2Mul(pt1zx, pt1zy, pt2zx, pt2zy); // newz = V_cubed * W
(pt2xx, pt2xy) = _FQ2Mul(pt1xx, pt1xy, pt1xx, pt1xy); // U * U
(pt2xx, pt2xy) = _FQ2Mul(pt2xx, pt2xy, pt2zx, pt2zy); // U * U * W
(pt2xx, pt2xy) = _FQ2Sub(pt2xx, pt2xy, pt1zx, pt1zy); // U * U * W - V_cubed
(pt2zx, pt2zy) = _FQ2Mul(pt2yx, pt2yy, 2); // 2 * V_squared_times_V2
(pt2xx, pt2xy) = _FQ2Sub(pt2xx, pt2xy, pt2zx, pt2zy); // A = U * U * W - V_cubed - 2 * V_squared_times_V2
(pt3[PTXX], pt3[PTXY]) = _FQ2Mul(pt1yx, pt1yy, pt2xx, pt2xy); // newx = V * A
(pt1yx, pt1yy) = _FQ2Sub(pt2yx, pt2yy, pt2xx, pt2xy); // V_squared_times_V2 - A
(pt1yx, pt1yy) = _FQ2Mul(pt1xx, pt1xy, pt1yx, pt1yy); // U * (V_squared_times_V2 - A)
(pt1xx, pt1xy) = _FQ2Mul(pt1zx, pt1zy, pt3[PTYX], pt3[PTYY]); // V_cubed * U2
(pt3[PTYX], pt3[PTYY]) = _FQ2Sub(pt1yx, pt1yy, pt1xx, pt1xy); // newy = U * (V_squared_times_V2 - A) - V_cubed * U2
⋮----
function _ECTwistDoubleJacobian(uint pt1xx, uint pt1xy, uint pt1yx, uint pt1yy, uint pt1zx, uint pt1zy)
⋮----
(pt2xx, pt2xy) = _FQ2Mul(pt1xx, pt1xy, 3); // 3 * x
(pt2xx, pt2xy) = _FQ2Mul(pt2xx, pt2xy, pt1xx, pt1xy); // W = 3 * x * x
(pt1zx, pt1zy) = _FQ2Mul(pt1yx, pt1yy, pt1zx, pt1zy); // S = y * z
(pt2yx, pt2yy) = _FQ2Mul(pt1xx, pt1xy, pt1yx, pt1yy); // x * y
(pt2yx, pt2yy) = _FQ2Mul(pt2yx, pt2yy, pt1zx, pt1zy); // B = x * y * S
(pt1xx, pt1xy) = _FQ2Mul(pt2xx, pt2xy, pt2xx, pt2xy); // W * W
(pt2zx, pt2zy) = _FQ2Mul(pt2yx, pt2yy, 8); // 8 * B
(pt1xx, pt1xy) = _FQ2Sub(pt1xx, pt1xy, pt2zx, pt2zy); // H = W * W - 8 * B
(pt2zx, pt2zy) = _FQ2Mul(pt1zx, pt1zy, pt1zx, pt1zy); // S_squared = S * S
(pt2yx, pt2yy) = _FQ2Mul(pt2yx, pt2yy, 4); // 4 * B
(pt2yx, pt2yy) = _FQ2Sub(pt2yx, pt2yy, pt1xx, pt1xy); // 4 * B - H
(pt2yx, pt2yy) = _FQ2Mul(pt2yx, pt2yy, pt2xx, pt2xy); // W * (4 * B - H)
(pt2xx, pt2xy) = _FQ2Mul(pt1yx, pt1yy, 8); // 8 * y
(pt2xx, pt2xy) = _FQ2Mul(pt2xx, pt2xy, pt1yx, pt1yy); // 8 * y * y
(pt2xx, pt2xy) = _FQ2Mul(pt2xx, pt2xy, pt2zx, pt2zy); // 8 * y * y * S_squared
(pt2yx, pt2yy) = _FQ2Sub(pt2yx, pt2yy, pt2xx, pt2xy); // newy = W * (4 * B - H) - 8 * y * y * S_squared
(pt2xx, pt2xy) = _FQ2Mul(pt1xx, pt1xy, 2); // 2 * H
(pt2xx, pt2xy) = _FQ2Mul(pt2xx, pt2xy, pt1zx, pt1zy); // newx = 2 * H * S
(pt2zx, pt2zy) = _FQ2Mul(pt1zx, pt1zy, pt2zx, pt2zy); // S * S_squared
(pt2zx, pt2zy) = _FQ2Mul(pt2zx, pt2zy, 8); // newz = 8 * S * S_squared
⋮----
function _ECTwistMulJacobian(uint d, uint pt1xx, uint pt1xy, uint pt1yx, uint pt1yy, uint pt1zx, uint pt1zy)
````

## File: src/test/utils/BytesLib.sol
````
// SPDX-License-Identifier: Unlicense
/*
 * @title Solidity Bytes Arrays Utils
 * @author Gonçalo Sá <goncalo.sa@consensys.net>
 *
 * @dev Bytes tightly packed arrays utility library for ethereum contracts written in Solidity.
 *      The library lets you concatenate, slice and type cast bytes arrays both in memory and storage.
 */
⋮----
function concat(bytes memory _preBytes, bytes memory _postBytes) internal pure returns (bytes memory) {
⋮----
// Get a location of some free memory and store it in tempBytes as
// Solidity does for memory variables.
⋮----
// Store the length of the first bytes array at the beginning of
// the memory for tempBytes.
⋮----
// Maintain a memory counter for the current write location in the
// temp bytes array by adding the 32 bytes for the array length to
// the starting location.
⋮----
// Stop copying when the memory counter reaches the length of the
// first bytes array.
⋮----
// Initialize a copy counter to the start of the _preBytes data,
// 32 bytes into its memory.
⋮----
// Increase both counters by 32 bytes each iteration.
⋮----
// Write the _preBytes data into the tempBytes memory 32 bytes
// at a time.
⋮----
// Add the length of _postBytes to the current length of tempBytes
// and store it as the new length in the first 32 bytes of the
// tempBytes memory.
⋮----
// Move the memory counter back from a multiple of 0x20 to the
// actual end of the _preBytes data.
⋮----
// Stop copying when the memory counter reaches the new combined
// length of the arrays.
⋮----
// Update the free-memory pointer by padding our last write location
// to 32 bytes: add 31 bytes to the end of tempBytes to move to the
// next 32 byte block, then round down to the nearest multiple of
// 32. If the sum of the length of the two arrays is zero then add
// one before rounding down to leave a blank 32 bytes (the length block with 0).
⋮----
not(31) // Round down to the nearest 32 bytes.
⋮----
function concatStorage(bytes storage _preBytes, bytes memory _postBytes) internal {
⋮----
// Read the first 32 bytes of _preBytes storage, which is the length
// of the array. (We don't need to use the offset into the slot
// because arrays use the entire slot.)
⋮----
// Arrays of 31 bytes or less have an even value in their slot,
// while longer arrays have an odd value. The actual length is
// the slot divided by two for odd values, and the lowest order
// byte divided by two for even values.
// If the slot is even, bitwise and the slot with 255 and divide by
// two to get the length. If the slot is odd, bitwise and the slot
// with -1 and divide by two.
⋮----
// slength can contain both the length and contents of the array
// if length < 32 bytes so let's prepare for that
// v. http://solidity.readthedocs.io/en/latest/miscellaneous.html#layout-of-state-variables-in-storage
⋮----
// Since the new array still fits in the slot, we just need to
// update the contents of the slot.
// uint256(bytes_storage) = uint256(bytes_storage) + uint256(bytes_memory) + new_length
⋮----
// all the modifications to the slot are inside this
// next block
⋮----
// we can just add to the slot contents because the
// bytes we want to change are the LSBs
⋮----
// load the bytes from memory
⋮----
// zero all bytes to the right
⋮----
// and now shift left the number of bytes to
// leave space for the length in the slot
⋮----
// increase length by the double of the memory
// bytes length
⋮----
// The stored value fits in the slot, but the combined value
// will exceed it.
// get the keccak hash to get the contents of the array
⋮----
// save new length
⋮----
// The contents of the _postBytes array start 32 bytes into
// the structure. Our first read should obtain the `submod`
// bytes that can fit into the unused space in the last word
// of the stored array. To get this, we read 32 bytes starting
// from `submod`, so the data we read overlaps with the array
// contents by `submod` bytes. Masking the lowest-order
// `submod` bytes allows us to add that value directly to the
// stored value.
⋮----
// Start copying to the last used word of the stored array.
⋮----
// Copy over the first `submod` bytes of the new data as in
// case 1 above.
⋮----
// solhint-disable-next-line no-unused-vars
⋮----
function slice(bytes memory _bytes, uint _start, uint _length) internal pure returns (bytes memory) {
⋮----
// The first word of the slice result is potentially a partial
// word read from the original array. To read it, we calculate
// the length of that partial word and start copying that many
// bytes into the array. The first word we copy will start with
// data we don't care about, but the last `lengthmod` bytes will
// land at the beginning of the contents of the new array. When
// we're done copying, we overwrite the full first word with
// the actual length of the slice.
⋮----
// The multiplication in the next line is necessary
// because when slicing multiples of 32 bytes (lengthmod == 0)
// the following copy loop was copying the origin's length
// and then ending prematurely not copying everything it should.
⋮----
// The multiplication in the next line has the same exact purpose
// as the one above.
⋮----
//update free-memory pointer
//allocating the array padded to 32 bytes like the compiler does now
⋮----
//if we want a zero-length slice let's just return a zero-length array
⋮----
//zero out the 32 bytes slice we are about to return
//we need to do it because Solidity does not garbage collect
⋮----
function toAddress(bytes memory _bytes, uint _start) internal pure returns (address) {
⋮----
function toUint8(bytes memory _bytes, uint _start) internal pure returns (uint8) {
⋮----
function toUint16(bytes memory _bytes, uint _start) internal pure returns (uint16) {
⋮----
function toUint32(bytes memory _bytes, uint _start) internal pure returns (uint32) {
⋮----
function toUint64(bytes memory _bytes, uint _start) internal pure returns (uint64) {
⋮----
function toUint96(bytes memory _bytes, uint _start) internal pure returns (uint96) {
⋮----
function toUint128(bytes memory _bytes, uint _start) internal pure returns (uint128) {
⋮----
function toUint256(bytes memory _bytes, uint _start) internal pure returns (uint) {
⋮----
function toBytes32(bytes memory _bytes, uint _start) internal pure returns (bytes32) {
⋮----
function equal(bytes memory _preBytes, bytes memory _postBytes) internal pure returns (bool) {
⋮----
// if lengths don't match the arrays are not equal
⋮----
// cb is a circuit breaker in the for loop since there's
//  no said feature for inline assembly loops
// cb = 1 - don't breaker
// cb = 0 - break
⋮----
for { let cc := add(_postBytes, 0x20) } // while(uint256(mc < end) + cb == 2) // the next line is the loop condition:
⋮----
// if any of these checks fails then arrays are not equal
⋮----
// unsuccessful:
⋮----
function equalStorage(bytes storage _preBytes, bytes memory _postBytes) internal view returns (bool) {
⋮----
// we know _preBytes_offset is 0
⋮----
// Decode the length of the stored array like in concatStorage().
⋮----
// blank the last byte which is the length
⋮----
// the next line is the loop condition:
// while(uint256(mc < end) + cb == 2)
// solhint-disable-next-line no-empty-blocks
````

## File: src/test/utils/EigenLayerMultichainUnitTestSetup.sol
````
// SPDX-License-Identifier: BUSL-1.1
⋮----
import "src/test/utils/EigenLayerUnitTestSetup.sol";
import "src/contracts/permissions/KeyRegistrar.sol";
import "src/test/mocks/BN254CertificateVerifierMock.sol";
import "src/test/mocks/ECDSACertificateVerifierMock.sol";
import "src/test/mocks/CrossChainRegistryMock.sol";
import "src/test/mocks/OperatorTableUpdaterMock.sol";
import "src/contracts/multichain/CrossChainRegistry.sol";
⋮----
abstract contract EigenLayerMultichainUnitTestSetup is EigenLayerUnitTestSetup {
⋮----
/// @dev In order to test key functionality, we use the actual KeyRegistrar implementation and not a mock
⋮----
/// @dev Mocks
⋮----
function setUp() public virtual override {
// Setup Core Mocks
⋮----
// Deploy Key Registrar
⋮----
// Deploy mocks
⋮----
// Filter out mocks
````

## File: src/test/utils/EigenLayerUnitTestSetup.sol
````
// SPDX-License-Identifier: BUSL-1.1
⋮----
import "forge-std/Test.sol";
⋮----
import "@openzeppelin/contracts/proxy/transparent/ProxyAdmin.sol";
import "@openzeppelin/contracts/proxy/transparent/TransparentUpgradeableProxy.sol";
import "@openzeppelin/contracts/token/ERC20/presets/ERC20PresetFixedSupply.sol";
⋮----
import "src/contracts/permissions/PauserRegistry.sol";
import "src/contracts/permissions/PermissionController.sol";
import "src/contracts/strategies/StrategyBase.sol";
⋮----
import "src/test/mocks/AVSDirectoryMock.sol";
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";
import "src/test/utils/Random.sol";
⋮----
abstract contract EigenLayerUnitTestSetup is Test {
⋮----
modifier filterFuzzedAddressInputs(address addr) {
⋮----
modifier rand(Randomness r) {
⋮----
function random() internal returns (Randomness) {
⋮----
function setUp() public virtual {
⋮----
// Deploy permission controller
````

## File: src/test/utils/EigenPodUser.t.sol
````
// SPDX-License-Identifier: BUSL-1.1
⋮----
import "forge-std/Test.sol";
⋮----
import "src/contracts/pods/EigenPodManager.sol";
import "src/contracts/pods/EigenPod.sol";
⋮----
import "src/contracts/interfaces/IStrategy.sol";
⋮----
import "src/test/integration/TypeImporter.t.sol";
import "src/test/integration/TimeMachine.t.sol";
import "src/test/integration/mocks/BeaconChainMock.t.sol";
import "src/test/utils/Logger.t.sol";
⋮----
interface IUserDeployer {
function timeMachine() external view returns (TimeMachine);
function beaconChain() external view returns (BeaconChainMock);
function eigenPodBeacon() external view returns (IBeacon);
⋮----
contract EigenPodUser is Logger, TypeImporter {
⋮----
// User's EigenPod and each of their validator indices within that pod
⋮----
// set the beacon address to the eigenPodBeacon
⋮----
modifier createSnapshot() virtual {
⋮----
function NAME() public view override returns (string memory) {
⋮----
///
///                             BEACON CHAIN METHODS
⋮----
/// @dev Uses any ETH held by the User to start validators on the beacon chain
/// @return A list of created validator indices
/// @return The amount of wei sent to the beacon chain
/// @return The number of validators that have the MaxEB
/// Note: If the user does not have enough ETH to start a validator, this method reverts
/// Note: This method also advances one epoch forward on the beacon chain, so that
/// withdrawal credential proofs are generated for each validator.
function startValidators() public virtual createSnapshot returns (uint40[] memory, uint64, uint) {
⋮----
/// @dev Starts a specified number of 0x01 validators for 32 ETH each on the beacon chain
/// @param count The number of validators to start
/// @return newValidators A list of created validator indices
/// @return totalBalanceGwei The amount of gwei sent to the beacon chain
function startETH1Validators(uint8 count)
⋮----
function exitValidators(uint40[] memory _validators) public virtual createSnapshot returns (uint64 exitedBalanceGwei) {
⋮----
///                              EIGENPOD METHODS
⋮----
function verifyWithdrawalCredentials(uint40[] memory _validators) public virtual createSnapshot {
⋮----
function startCheckpoint() public virtual createSnapshot {
⋮----
function completeCheckpoint() public virtual createSnapshot {
⋮----
///                             INTERNAL METHODS
⋮----
/// @dev Creates validators between 32 and 2048 ETH
⋮----
function _startValidators() internal virtual returns (uint40[] memory, uint64, uint) {
⋮----
// Get maximum possible number of validators. Add 1 to account for a validator with < 32 ETH
⋮----
// Create validators between 32 and 2048 ETH until we can't create more
⋮----
// Generate random validator balance between 32 and 2048 ETH
uint validatorEth = uint(keccak256(abi.encodePacked(block.timestamp, balanceWei, numValidators))) % 64 + 1; // 1-64 multiplier
validatorEth *= 32 ether; // Results in 32-2048 ETH
⋮----
// If we don't have enough ETH for the random amount, use remaining balance
// as long as it's >= 32 ETH
⋮----
// Create the validator
⋮----
// Track validators with max effective balance
// - For 0x01 validators, this is 32 ETH
// - For 0x02 validators, this is 2048 ETH
⋮----
// If we still have at least 1 ETH left over, we can create another (non-full) validator
// Note that in the mock beacon chain this validator will generate rewards like any other.
// The main point is to ensure pods are able to handle validators that have less than 32 ETH
⋮----
// Resize the array to actual number of validators created
⋮----
// Advance forward one epoch and generate withdrawal and balance proofs for each validator
⋮----
/// @dev Starts a 32 ETH validator with 0x01 withdrawal credentials
/// - Reverts if the user does not hold sufficient balance
/// @return the new validator index
function _startETH1Validator() internal returns (uint40) {
⋮----
function _exitValidators(uint40[] memory _validators) internal returns (uint64 exitedBalanceGwei) {
⋮----
// Send withdrawal requests to pod
⋮----
function _startCheckpoint() internal {
⋮----
function _completeCheckpoint() internal {
⋮----
function _verifyWithdrawalCredentials(uint40[] memory _validators) internal {
⋮----
function _podWithdrawalCredentials() internal view returns (bytes memory) {
⋮----
function _podCompoundingWithdrawalCredentials() internal view returns (bytes memory) {
⋮----
function getActiveValidators() public view returns (uint40[] memory) {
⋮----
// Manually update length
````

## File: src/test/utils/g2mul.go
````go
package main
⋮----
import (
	"fmt"
	"math/big"
	"os"
	"strings"

	"github.com/consensys/gnark-crypto/ecc/bn254"
)
⋮----
"fmt"
"math/big"
"os"
"strings"
⋮----
"github.com/consensys/gnark-crypto/ecc/bn254"
⋮----
func main()
⋮----
//parse args
⋮----
//g2 mul
⋮----
//parse out point coords to big ints
⋮----
//switch to print coord requested
⋮----
func GetG2Generator() *bn254.G2Affine
````

## File: src/test/utils/Logger.t.sol
````
// SPDX-License-Identifier: BUSL-1.1
⋮----
import "forge-std/Test.sol";
import "@openzeppelin/contracts/token/ERC20/extensions/IERC20Metadata.sol";
import "src/contracts/interfaces/IStrategy.sol";
import {IAllocationManagerTypes} from "src/contracts/interfaces/IAllocationManager.sol";
⋮----
/// @dev Types representing the different types of assets a ranomized users can hold.
uint constant NO_ASSETS = (FLAG << 0); // will have no assets
uint constant HOLDS_LST = (FLAG << 1); // will hold some random amount of LSTs
uint constant HOLDS_ETH = (FLAG << 2); // will hold some random amount of ETH
uint constant HOLDS_ALL = (FLAG << 3); // will always hold ETH, and some LSTs
uint constant HOLDS_MAX = (FLAG << 4); // will hold every LST and ETH (used for testing max strategies)
⋮----
/// @dev Types representing the different types of users that can be created.
⋮----
/// @dev Types representing the different types of forks that can be simulated.
⋮----
abstract contract Logger is Test {
⋮----
/// -----------------------------------------------------------------------
/// Storage
⋮----
/// Modifiers
⋮----
// Address used to store a trace counter to allow us to use noTracing
// across any contract that inherits Logger
⋮----
modifier noTracing() {
// uint traceCounter = _getTraceCounter();
// if (traceCounter == 0) cheats.pauseTracing();
⋮----
// traceCounter++;
// _setTraceCounter(traceCounter);
⋮----
// traceCounter = _getTraceCounter();
// traceCounter--;
⋮----
// if (traceCounter == 0) cheats.resumeTracing();
⋮----
modifier noLogging() {
// logging = false;
⋮----
// logging = true;
⋮----
/// Must Override
⋮----
/// @dev Provide a name for the inheriting contract.
function NAME() public view virtual returns (string memory);
⋮----
/// Colored Names
⋮----
/// @dev Returns `NAME` colored based logging the inheriting contract's role.
function NAME_COLORED() public view returns (string memory) {
⋮----
/// @dev Returns `name` colored based logging its role.
function colorByRole(string memory name) public pure returns (string memory colored) {
⋮----
/// @dev Returns `true` if `needle` is found in `haystack`.
function _contains(string memory haystack, string memory needle) internal pure returns (bool) {
⋮----
/// Cheats
⋮----
function rollForward(uint blocks) internal {
⋮----
function rollBackward(uint blocks) internal {
⋮----
/// Logging
⋮----
function _toggleLog() internal {
⋮----
/// Trace Counter get/set
⋮----
function _getTraceCounter() internal view returns (uint) {
⋮----
function _setTraceCounter(uint _newValue) internal {
⋮----
/// @dev Assumes the user is a `Logger`.
⋮----
function method(string memory m) internal view {
⋮----
function method(string memory m, string memory args) internal view {
⋮----
function user(string memory name, uint assetType, uint userType, IStrategy[] memory strategies, uint[] memory tokenBalances)
⋮----
function gasUsed() internal {
⋮----
function createOperatorSets(IAllocationManagerTypes.CreateSetParams[] memory p) internal pure {
⋮----
function createOperatorSets(IAllocationManagerTypes.CreateSetParamsV2[] memory p) internal pure {
⋮----
function deregisterFromOperatorSets(IAllocationManagerTypes.DeregisterParams memory p) internal pure {
⋮----
/// Strings
⋮----
function asAssetType(uint t) internal pure returns (string memory s) {
⋮----
function asUserType(uint t) internal pure returns (string memory s) {
⋮----
function asForkType(uint t) internal pure returns (string memory s) {
⋮----
function asGwei(uint x) internal pure returns (string memory) {
⋮----
function asWad(uint x) internal pure returns (string memory) {
⋮----
function asDecimal(uint x, uint8 decimals, string memory denomination) internal pure returns (string memory s) {
⋮----
/// Helpers
⋮----
function _name() internal view returns (string memory) {
⋮----
function _logger() internal view returns (Logger) {
⋮----
function _logging() internal view returns (bool) {
````

## File: src/test/utils/OperatorWalletLib.sol
````
// SPDX-License-Identifier: MIT
⋮----
import {Vm} from "forge-std/Vm.sol";
import {BN254} from "../../../src/contracts/libraries/BN254.sol";
import {BN256G2} from "./BN256G2.sol";
import {Strings} from "@openzeppelin/contracts/utils/Strings.sol";
⋮----
function sign(Wallet memory wallet, bytes32 digest) internal pure returns (bytes memory) {
⋮----
function sign(BLSWallet memory blsWallet, bytes32 messageHash) internal view returns (BN254.G1Point memory) {
// Hash the message to a point on G1
⋮----
// Sign by multiplying the hashed message point with the private key
⋮----
function aggregate(BN254.G2Point memory pk1, BN254.G2Point memory pk2) internal view returns (BN254.G2Point memory apk) {
⋮----
function createBLSWallet(uint salt) internal returns (BLSWallet memory) {
⋮----
function createWallet(uint salt) internal pure returns (Wallet memory) {
⋮----
function createOperator(string memory name) internal returns (Operator memory) {
⋮----
function mul(uint x) internal returns (BN254.G2Point memory g2Point) {
````

## File: src/test/utils/ProofParsing.sol
````
// SPDX-License-Identifier: BUSL-1.1
⋮----
import "forge-std/Test.sol";
import "forge-std/StdJson.sol";
⋮----
contract ProofParsing is Test {
⋮----
function setJSON(string memory path) public {
⋮----
function getSlot() public view returns (uint) {
⋮----
function getValidatorIndex() public view returns (uint) {
⋮----
function getValidatorPubkeyHash() public view returns (bytes32) {
⋮----
function getWithdrawalIndex() public view returns (uint) {
⋮----
function getBlockRootIndex() public view returns (uint) {
⋮----
function getHistoricalSummaryIndex() public view returns (uint) {
⋮----
function getBeaconStateRoot() public view returns (bytes32) {
⋮----
function getBlockRoot() public view returns (bytes32) {
⋮----
function getSlotRoot() public view returns (bytes32) {
⋮----
function getTimestampRoot() public view returns (bytes32) {
⋮----
function getExecutionPayloadRoot() public view returns (bytes32) {
⋮----
function getLatestBlockRoot() public view returns (bytes32) {
⋮----
function getExecutionPayloadProof() public returns (bytes32[7] memory) {
⋮----
function getTimestampProofDeneb() public returns (bytes32[5] memory) {
⋮----
function getTimestampProofCapella() public returns (bytes32[4] memory) {
⋮----
function getBlockHeaderProof() public returns (bytes32[18] memory) {
⋮----
function getSlotProof() public returns (bytes32[3] memory) {
⋮----
function getStateRootProof() public returns (bytes memory) {
⋮----
function getWithdrawalProofDeneb() public returns (bytes32[10] memory) {
⋮----
function getWithdrawalProofCapella() public returns (bytes32[9] memory) {
⋮----
function getValidatorProof() public returns (bytes32[46] memory) {
⋮----
function getHistoricalSummaryProof() public returns (bytes32[44] memory) {
⋮----
function getWithdrawalFields() public returns (bytes32[] memory) {
⋮----
function getValidatorFields() public returns (bytes32[] memory) {
⋮----
function getBalanceUpdateProof() public returns (bytes memory) {
// Balance update proofs are the same as withdrawal credential proofs
⋮----
function getWithdrawalCredentialProof() public returns (bytes memory) {
⋮----
function getValidatorFieldsProof() public returns (bytes32[] memory) {
````

## File: src/test/utils/Random.sol
````
// SPDX-License-Identifier: BUSL-1.1
⋮----
import "src/contracts/interfaces/IAllocationManager.sol";
import "src/contracts/interfaces/IStrategy.sol";
import "src/contracts/libraries/OperatorSetLib.sol";
⋮----
/// -----------------------------------------------------------------------
/// Constants
⋮----
/// @dev Equivalent to: `uint256(keccak256("RANDOMNESS.SEED"))`.
⋮----
/// @dev Equivalent to: `uint256(keccak256("RANDOMNESS.SLOT"))`.
⋮----
/// Helpers
⋮----
function set(Randomness r) internal returns (Randomness) {
/// @solidity memory-safe-assembly
⋮----
function shuffle(Randomness r) internal returns (Randomness) {
⋮----
/// Native Types
⋮----
function Int256(Randomness r, int min, int max) internal returns (int) {
⋮----
function Int256(Randomness r) internal returns (int) {
⋮----
function Int128(Randomness r, int128 min, int128 max) internal returns (int128) {
⋮----
function Int128(Randomness r) internal returns (int128) {
⋮----
function Int64(Randomness r, int64 min, int64 max) internal returns (int64) {
⋮----
function Int64(Randomness r) internal returns (int64) {
⋮----
function Int32(Randomness r, int32 min, int32 max) internal returns (int32) {
⋮----
function Uint256(Randomness r, uint min, uint max) internal returns (uint) {
⋮----
function Uint256(Randomness r) internal returns (uint) {
⋮----
function Uint128(Randomness r, uint128 min, uint128 max) internal returns (uint128) {
⋮----
function Uint128(Randomness r) internal returns (uint128) {
⋮----
function Uint64(Randomness r, uint64 min, uint64 max) internal returns (uint64) {
⋮----
function Uint64(Randomness r) internal returns (uint64) {
⋮----
function Uint32(Randomness r, uint32 min, uint32 max) internal returns (uint32) {
⋮----
function Uint32(Randomness r) internal returns (uint32) {
⋮----
function Bytes32(Randomness r) internal returns (bytes32) {
⋮----
function Address(Randomness r) internal returns (address) {
⋮----
function Boolean(Randomness r) internal returns (bool) {
⋮----
/// Arrays
⋮----
function Int256Array(Randomness r, uint len, int min, int max) internal returns (int[] memory arr) {
⋮----
function Int128Array(Randomness r, uint len, int128 min, int128 max) internal returns (int128[] memory arr) {
⋮----
function Int64Array(Randomness r, uint len, int64 min, int64 max) internal returns (int64[] memory arr) {
⋮----
function Int32Array(Randomness r, uint len, int32 min, int32 max) internal returns (int32[] memory arr) {
⋮----
function Uint256Array(Randomness r, uint len, uint min, uint max) internal returns (uint[] memory arr) {
⋮----
/// General Types
⋮----
function StakerArray(Randomness r, uint len) internal returns (address[] memory stakers) {
⋮----
function StrategyArray(Randomness r, uint len) internal returns (IStrategy[] memory strategies) {
⋮----
function OperatorSetArray(Randomness r, address avs, uint len) internal returns (OperatorSet[] memory operatorSets) {
⋮----
/// `AllocationManager` Types
⋮----
/// @dev Usage: `r.createSetParams(r, numOpSets, numStrats)`.
function CreateSetParams(Randomness r, uint numOpSets, uint numStrats)
⋮----
/// @dev Usage:
/// ```
/// AllocateParams[] memory allocateParams = r.allocateParams(avs, numAllocations, numStrats);
/// cheats.prank(avs);
/// allocationManager.createOperatorSets(r.createSetParams(allocateParams));
⋮----
function CreateSetParams(Randomness, IAllocationManagerTypes.AllocateParams[] memory allocateParams)
⋮----
/// CreateSetParams[] memory createSetParams = r.createSetParams(allocateParams);
///
⋮----
/// allocationManager.createOperatorSets(createSetParams);
⋮----
/// cheats.prank(operator);
/// allocationManager.modifyAllocations(allocateParams);
⋮----
function AllocateParams(Randomness r, address avs, uint numAllocations, uint numStrats)
⋮----
// TODO: Randomize magnitudes such that they sum to 1e18 (100%).
⋮----
/// AllocateParams[] memory deallocateParams = r.deallocateParams(allocateParams);
⋮----
/// cheats.prank(operator)
/// allocationManager.modifyAllocations(deallocateParams);
⋮----
function DeallocateParams(Randomness r, IAllocationManagerTypes.AllocateParams[] memory allocateParams)
⋮----
/// RegisterParams memory registerParams = r.registerParams(allocateParams);
⋮----
/// allocationmanager.registerForOperatorSets(registerParams);
⋮----
function RegisterParams(Randomness r, IAllocationManagerTypes.AllocateParams[] memory allocateParams)
⋮----
function SlashingParams(Randomness r, address operator, IAllocationManagerTypes.AllocateParams memory allocateParams)
⋮----
// Randomly select a subset of strategies to slash.
⋮----
// Update length of strategies array.
⋮----
// Randomly select a `wadToSlash` for each strategy.
⋮----
function wrap(uint r) internal pure returns (Randomness) {
⋮----
function unwrap(Randomness r) internal pure returns (uint) {
````

## File: src/test/DevnetLifecycle.t.sol
````
// SPDX-License-Identifier: BUSL-1.1
⋮----
// Contracts
import "../../src/contracts/core/DelegationManager.sol";
import "../../src/contracts/core/StrategyManager.sol";
import "../../src/contracts/core/AVSDirectory.sol";
import "../../src/contracts/core/AllocationManager.sol";
import "../../src/contracts/strategies/StrategyBase.sol";
⋮----
import "src/test/utils/ArrayLib.sol";
⋮----
// Test
import "forge-std/Test.sol";
⋮----
/// @notice Tests deployed contracts as part of the public devnet
/// Run with: forge test --mc Devnet_Lifecycle_Test --rpc-url $RPC_HOLESKY
contract Devnet_Lifecycle_Test is Test, IAllocationManagerTypes {
⋮----
// Addresses
⋮----
// Values
⋮----
function setUp() public {
// Set contracts
⋮----
// Set operator
⋮----
function _getOperatorSetArray() internal view returns (uint32[] memory) {
⋮----
function _getOperatorSetsArray() internal view returns (OperatorSet[] memory) {
⋮----
function test() public {
⋮----
// Seed staker with WETH
⋮----
function _run_lifecycle() internal {
// Staker <> Operator Relationship
⋮----
// Operator <> AVS Relationship
⋮----
// Slash operator
⋮----
// Withdraw staker
⋮----
function _depositIntoStrategy() internal {
// Approve WETH
⋮----
// Deposit WETH into strategy
⋮----
// Check staker balance
⋮----
// Check staker shares
⋮----
function _registerOperator() internal {
// Register operator
⋮----
// Warp passed configuration delay
⋮----
// Validate storage
⋮----
function _delegateToOperator() internal {
// Delegate to operator
⋮----
// Validate operator shares
⋮----
function _registerAVS() internal {
⋮----
function _registerOperatorToAVS() public {
⋮----
function _setMagnitude() public {
⋮----
// Assert storage
⋮----
// Warp to effect block
⋮----
// Check allocation
⋮----
function _slashOperator() public {
// Get slashing params
⋮----
function _withdrawStaker() public {
// Generate queued withdrawal params
⋮----
// Generate withdrawal params
⋮----
// bytes32 withdrawalRoot = delegationManager.calculateWithdrawalRoot(withdrawal);
// Generate complete withdrawal params
⋮----
// Roll passed withdrawal delay
⋮----
// Complete withdrawal
⋮----
// Assert tokens
````

## File: src/test/TestConstants.sol
````
// SPDX-License-Identifier: BUSL-1.1
````

## File: .dockerignore
````
/cache
````

## File: .env.example
````
RPC_MAINNET="https://eth.llamarpc.com"
RPC_HOODI="https://ethereum-hoodi.gateway.tatum.io"
ETHERSCAN_API_KEY="API-KEY"
````

## File: .gitattributes
````
pkg/**/*.go linguist-generated=true

# Certora formatting settings
*.spec linguist-language=Solidity
*.conf linguist-detectable
*.conf linguist-language=JSON5
````

## File: .gitignore
````
*/node_modules
*node_modules
.env
coverage
coverage.json
typechain
config.json
contract.addresses
deployedAddresses

script/output/eigenpods.json

#Hardhat files
cache_hardhat
artifacts
*.lock
#Foundry files
out
cache
snapshots

*.DS_Store

broadcast

# Deployment tools
/data
.idea/

# Certora Outputs
.certora_internal/
.certora_recent_jobs.json

#script config file
# script/M1_deploy.config.json
script/output/M1_deployment_data.json
/script/output/M2_deployment_data.json

# autogenerated docs (you can generate these locally)
/docs/docgen/

script/misc

test.sh

# Surya outputs
InheritanceGraph.png
surya_report.md

.idea

*state.json
deployed_strategies.json
populate_src*

# cerota
.certora_internal/*
````

## File: .gitmodules
````
[submodule "lib/ds-test"]
	path = lib/ds-test
	url = https://github.com/dapphub/ds-test
[submodule "lib/openzeppelin-contracts-v4.9.0"]
	path = lib/openzeppelin-contracts-v4.9.0
	url = https://github.com/OpenZeppelin/openzeppelin-contracts
[submodule "lib/openzeppelin-contracts-upgradeable-v4.9.0"]
	path = lib/openzeppelin-contracts-upgradeable-v4.9.0
	url = https://github.com/OpenZeppelin/openzeppelin-contracts-upgradeable
[submodule "lib/zeus-templates"]
	path = lib/zeus-templates
	url = https://github.com/Layr-Labs/zeus-templates
[submodule "lib/forge-std"]
	path = lib/forge-std
	url = https://github.com/foundry-rs/forge-std
````

## File: .zeus
````
{
	"zeusHost": "https://github.com/Layr-Labs/eigenlayer-contracts-zeus-metadata",
	"migrationDirectory": "script/releases"
}
````

## File: CLAUDE.md
````markdown
# EigenLayer Contracts

**EigenLayer** is a protocol built on Ethereum that introduces Restaking, a primitive for app and service builders to make verifiable commitments to their users. EigenLayer brings together Restakers, Operators, and Autonomous Verifiable Services (AVSs) to extend Ethereum's cryptoeconomic security. The protocol supports permissionless security: EIGEN, Native ETH, LSTs, and ERC-20s.

## Build & Test Commands

```bash
# Initial setup (installs pre-commit hook, foundry, abigen)
make deps

# Build contracts
forge b

# Run tests
forge t

# Run unit tests
forge test --no-match-contract Integration

# Run integration tests
forge test --match-contract Integration

# Run fork tests
env FOUNDRY_PROFILE=forktest forge test --match-contract Integration

# Format 
make fmt

# Generate Go bindings
make bindings
```

## Project Structure

- `src/contracts/` - Core Solidity contracts
  - `core/` - DelegationManager, StrategyManager, AVSDirectory, AllocationManager, RewardsCoordinator
  - `pods/` - EigenPodManager, EigenPod
  - `strategies/` - StrategyBase, StrategyFactory, EigenStrategy
  - `token/` - Eigen, BackingEigen tokens
  - `permissions/` - PauserRegistry, PermissionController, KeyRegistrar
  - `multichain/` - CrossChainRegistry, OperatorTableUpdater, CertificateVerifiers
  - `avs/` - TaskMailbox and AVS-related contracts
- `src/test/` - Test files
  - `integration/` - Integration tests for cross-contract interactions
- `script/` - Deployment and utility scripts
- `docs/` - Technical documentation (detailed contract docs in `/docs`)
- `pkg/` - Go bindings

## Key Branches

- `main` - The canonical, most up-to-date branch with work-in-progress for upcoming releases
- `Vx.y.z` - Release branches matching EigenLayer releases, cut from `main` via cherry-picking
- `release-dev/xxx` - Development branches for large features (merged to `main` then deleted)

## Testing Notes

- Fork tests require `RPC_MAINNET` environment variable
- See `.env.example` for environment setup
- Use `source source-env.sh [goerli|local]` with yq installed for forked environment tests
- Check integration tests in `src/test/integration/` for examples of user interactions

## Development Workflow

1. Make Changes

2. Format 
make fmt

3. Update docs

4. Ensure Tests Pass
forge t

5. Commit Changes & Open PR
- All commits MUST follow conventional commit standard
- PRs must be named with (release|feat|fix|chore|docs|refactor|test|style|ci|perf): 
- All PRs MUST be formatted per the following formatting:

```markdown
**Motivation:**

*Explain here the context, and why you're making that change. What is the problem you're trying to solve.*

**Modifications:**

*Describe the modifications you've done.*

**Result:**

*After your change, what will change.*
```
````

## File: CONTRIBUTING.md
````markdown
# Contribution Guide

Thank you for considering contributing to EigenLayer! This guide will help you set up your development environment and submit high-quality pull requests (PRs).

## Setting Up Your Environment

### Install Dependencies

To set up this repo for the first time, run:

```bash
make deps
```

This will:
* Install the pre-commit hook
* Install foundry and its tools
* Install abigen


See the [Foundry docs](https://book.getfoundry.sh/) for more info on installation and usage of foundry. If you already have it, you can build this project with these commands:

```
foundryup

forge build
```


### Run Unit and Integration Tests

Verify your setup by running the test suite:

```bash
forge test
```

Congratulations! You've successfully set up your repository and run the tests.


### Run Fork Tests

We have a few fork tests against ETH mainnet. Passing these requires the environment variable `RPC_MAINNET` to be set. See `.env.example` for an example. Once you've set up your environment, `forge test` should show these fork tests passing.

Additionally, to run all tests in a forked environment, [install yq](https://mikefarah.gitbook.io/yq/v/v3.x/). Then, set up your environment by running the following command.

`source bin/source-env.sh [local]`

Then run the tests:

`forge test --fork-url [RPC_URL]`


### Run Static Analysis

1. Install [solhint](https://github.com/protofire/solhint), then run:

`solhint 'src/contracts/**/*.sol'`

2. Install [slither](https://github.com/crytic/slither), then run:

`slither .`


### Generate Inheritance and Control-Flow Graphs

1. Install [surya](https://github.com/ConsenSys/surya/) and graphviz:

```
npm i -g surya

apt install graphviz
```

2. Then, run:

```
surya inheritance ./src/contracts/**/*.sol | dot -Tpng > InheritanceGraph.png

surya mdreport surya_report.md ./src/contracts/**/*.sol
```

### Generate Go bindings

```bash
make bindings
```


### Generate updated Storage Report

To update the storage reports in `/docs/storage-report` run:

```bash
make storage-report
```

------


## Submitting a Pull Request

### PR Title Format

Format your PR title as follows:

```
<type>: <subject>
```

Where:
- **Type**: Indicates the nature of the change
- **Subject**: A brief description of the change

Use one of these types:

| Type | Description |
|------|-------------|
| **feat** | A new feature |
| **fix** | A bug fix |
| **docs** | Documentation-only changes |
| **style** | Changes that don't affect code meaning (formatting) |
| **refactor** | Code changes that neither fix bugs nor add features |
| **ci** | Changes to continuous integration configuration |
| **perf** | Performance improvements |
| **test** | Adding or correcting tests |
| **chore** | Changes to build process or auxiliary tools |
| **release** | Merging a release-dev branch to `main` |

Remember to set the appropriate PR label as well.

### PR Description Template

Use this template for your PR description:

```markdown
**Motivation:**
- Describe the context and reason for the change

**Modifications:**
- Detail the specific changes made

**Result:**
- Explain the outcome or effects of the change
```

#### Example PR:

```markdown
feat: Implement new withdrawal flow in StrategyManager

**Motivation:**
The current withdrawal process is inefficient and leads to delays for users.

**Modifications:**
- Refactored the `withdraw` function in `StrategyManager.sol`
- Updated associated unit tests to reflect changes
- Modified documentation to explain the new withdrawal process

**Result:**
The withdrawal process is now more efficient, reducing wait times for users.
```

## Testing and Continuous Integration

- All PRs should include appropriate test coverage
- Write unit and integration tests that verify your changes
- Ensure all existing tests continue to pass

For first-time external contributors: A maintainer will review your PR and manually approve CI to run.

By following these guidelines, you help maintain the quality and readability of the EigenLayer codebase. We appreciate your contributions and look forward to collaborating with you!
````

## File: Dockerfile
````dockerfile
FROM ubuntu:24.04

COPY bin /build-bin

RUN apt-get update \
    && apt-get install -y \
    make curl git \
    software-properties-common \
    jq sudo
RUN /build-bin/install-deps.sh
RUN apt-get clean && \
    rm -rf /var/lib/apt/lists/*

WORKDIR /workspaces/eigenlayer-contracts
````

## File: foundry.toml
````toml
[profile.default]
    # Project Configuration

    # Path to contract sources relative to the root of the project.
    src = "src"
    # Path to the test contract sources relative to the root of the project.
    test = "src/test"
    # Path to the script contract sources relative to the root of the project.
    script = "script"
    # Path to store contract artifacts relative to the root of the project.
    out = "out"
    # Array of paths that contain libraries, relative to the root of the project.
    libs = ["lib"]

    # Solidity Compiler Configuration

    # Defines paths for Solidity imports.
    remappings = [
        "@openzeppelin/=lib/openzeppelin-contracts-v4.9.0/",
        "@openzeppelin-upgrades/=lib/openzeppelin-contracts-upgradeable-v4.9.0/",
        "ds-test/=lib/ds-test/src/",
        "forge-std/=lib/forge-std/src/"
    ]
    # 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" 
    # 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.
    optimizer = true
    # The number of runs specifies roughly how often each opcode of the deployed code will be executed 
    # across the life-time of the contract. This means it is a trade-off parameter between code size (deploy cost) 
    # and code execution cost (cost after deployment).
    optimizer_runs = 200
    # An array of Solidity compiler error codes to ignore during build, such as warnings.
    ignored_error_codes = [
        # 1878, # license
        5574, # code-size
        # 2018, # func-mutability
        # 2072, # unused-var
        # 5667, # unused-param
        # 9302, # unused-return
        # 5815, # virtual-interfaces
        # 3628, # missing-receive-ether
        # 2519, # shadowing
        # 8760, # same-varname
        # 6321, # unnamed-return
        # 5740, # unreachable
        # 3420, # pragma-solidity
        # 2462, # constructor-visibility
        3860, # init-code-size
        # 2394, # transient-storage
        4591  # too-many-warnings
    ]
    # An array of file paths from which warnings should be ignored during compilation.
    ignored_warnings_from = [
        "src/test",
        "src/contracts/core/AllocationManager.sol" # TODO: Remove
    ]

    # Test Configuration

    # Verbosity level during test execution. Higher levels provide more detailed information:
    # - 2 (-vv): Logs emitted during tests are displayed.
    # - 3 (-vvv): Stack traces for failing tests are displayed.
    # - 4 (-vvvv): Stack traces for all tests and setup traces for failing tests are displayed.
    # - 5 (-vvvvv): Stack and setup traces are always displayed.
    verbosity = 0
    # Enables the Foreign Function Interface (FFI) cheatcode. 
    # WARNING: This allows arbitrary programs to run on your computer, which poses security risks.
    ffi = false
    # Contracts to include in gas reports. By default, all contracts are included.
    gas_reports = ["./src/contracts/**/*"]
    # Show test execution progress if set to true.
    show_progress = true
    # Sparse mode only compiles files that match certain criteria.
    sparse_mode = true
    
    no_match_test = "queueUpgrade"
    no_match_path = "script/**/*.sol"
    fs_permissions = [{ access = "read-write", path = "./"}]

[profile.default.fmt]
    # Single-line vs multi-line statement blocks
    single_line_statement_blocks = "preserve"  # Options: "single", "multi", "preserve"
    # Formatting style for long function headers
    multiline_func_header = "params_first"  # Options: "attributes_first", "params_first", "all"
    # Sort import statements alphabetically
    sort_imports = false  
    # Maximum line length where formatter will wrap the line
    line_length = 120  # Default: 120
    # Number of spaces per indentation level
    tab_width = 4  # Default: 4
    # Style of indent
    style = "space"  # Options: "space", "tab"
    # Whether to print spaces between brackets
    bracket_spacing = false  
    # Style of uint/int256 types
    int_types = "long"  # Options: "long", "short", "preserve"
    # Quotation mark style
    quote_style = "double"  # Options: "double", "single", "preserve"
    # Style of underscores in number literals
    number_underscore = "thousands"  # Options: "preserve", "thousands", "remove"
    # Style of underscores in hex literals
    hex_underscore = "preserve"  # Options: "preserve", "remove", "bytes"
    # Print space in state variable, function and modifier `override` attribute
    override_spacing = false  
    # Whether or not to wrap comments at line_length
    wrap_comments = false  
    # Style of doc comments
    docs_style = "line"  # Options: "preserve", "line", "block"
    # Add new line at start and end of contract declarations
    contract_new_lines = false  
    # Whether to suppress spaces around the power operator (**)
    pow_no_space = true  
    # Style that determines if a broken list should keep its elements together before breaking individually
    prefer_compact = "none"  # Options: "none", "calls", "events", "errors", "events_errors", "all"
    # Keep single imports on a single line even if they exceed line length
    single_line_imports = false  
    # List of files to ignore during formatting (can use glob patterns)
    ignore = [
        "./src/test/**/*"
    ]

[profile.test.fmt]
    single_line_statement_blocks = "single"
    multiline_func_header = "attributes_first"
    int_types = "short"
    line_length = 140
    ignore = [
        "./script/**/*",
        "./src/contracts/**/*"
    ]

[profile.default.lint]
    # Whether to run the linter when building.
    lint_on_build = false
    # Specifies which lints to run based on severity.
    severity = [
        "high", 
        "med", 
        "low", 
        "info", 
        "gas"
    ]
    # List of lints to exclude from linting.
    exclude_lints = [
        # High
        # "incorrect-shift",
        # "unchecked-call",
        # "erc20-unchecked-transfer",

        # Medium
        # "divide-before-multiply",

        # Info
        # "unused-import",
        # "unaliased-plain-import",
        # "mixed-case-function",
        # "mixed-case-variable",
        # "pascal-case-struct",
        # "screaming-snake-case-const",
        # "screaming-snake-case-immutable",

        # Gas
        # "asm-keccak256",
        # "unwrapped-modifier-logic"
    ]
    # List of files or patterns to ignore when running the linter (can use glob patterns)
    ignore = [
        "src/test/**/*",
        "script/**/*"
    ]

[profile.forktest.fuzz]    
    optimizer = false
    runs = 16

[profile.coverage.fuzz]
    optimizer = false
    runs = 1
    gas_limit = "18446744073709551615" # u64::MAX

[profile.medium.fuzz]
    optimizer = false
    runs = 256

[profile.intense.fuzz]
    optimizer = false
    runs = 5000

[rpc_endpoints]
    mainnet = "${RPC_MAINNET}"
````

## File: go.mod
````
module github.com/Layr-Labs/eigenlayer-contracts

go 1.21

require github.com/ethereum/go-ethereum v1.14.0

require (
	github.com/Microsoft/go-winio v0.6.1 // indirect
	github.com/StackExchange/wmi v1.2.1 // indirect
	github.com/bits-and-blooms/bitset v1.10.0 // indirect
	github.com/btcsuite/btcd/btcec/v2 v2.2.0 // 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.1.0 // indirect
	github.com/decred/dcrd/dcrec/secp256k1/v4 v4.0.1 // indirect
	github.com/ethereum/c-kzg-4844 v1.0.0 // indirect
	github.com/fsnotify/fsnotify v1.6.0 // indirect
	github.com/go-ole/go-ole v1.3.0 // indirect
	github.com/google/uuid v1.3.0 // indirect
	github.com/gorilla/websocket v1.4.2 // indirect
	github.com/holiman/uint256 v1.2.4 // indirect
	github.com/mmcloughlin/addchain v0.4.0 // indirect
	github.com/shirou/gopsutil v3.21.4-0.20210419000835-c7a38de76ee5+incompatible // indirect
	github.com/supranational/blst v0.3.11 // indirect
	github.com/tklauser/go-sysconf v0.3.12 // indirect
	github.com/tklauser/numcpus v0.6.1 // indirect
	golang.org/x/crypto v0.22.0 // indirect
	golang.org/x/mod v0.17.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
)
````

## File: LICENSE
````
Business Source License 1.1

License text copyright (c) 2017 MariaDB Corporation Ab, All Rights Reserved.
"Business Source License" is a trademark of MariaDB Corporation Ab.

-----------------------------------------------------------------------------

Parameters

Licensor:             Layr Labs, Inc.

Licensed Work:        EigenLayer Core Contracts
                      The Licensed Work is (c) 2023 Layr Labs, Inc.

Additional Use Grant: 

You may additionally use any of the software included in the following repositories
[here](https://docs.google.com/spreadsheets/d/1PlJRow5C0GMqXZlIxRm5CEnkhH-gMV1wIdq1pCfbZco/edit?usp=sharing)
(“Additional Use Grant Software”) for production commercial uses, but only if such
uses are (i) built on or using the EigenLayer Protocol or EigenDA, and (ii) not
Competing Uses. 

“Competing Use” means any use of the Additional Use Grant Software in any product,
protocol, application or service that is made available to third parties and that
(i) substitutes for use of EigenLayer Protocol or EigenDA, (ii) offers the same or
substantially similar functionality as the EigenLayer Protocol or EigenDA or
(iii) is built on or using a protocol with substantially similar functionality as
the EigenLayer Protocol.

EigenLayer Protocol means the restaking protocol as further described in the
documentation [here](https://docs.eigenlayer.xyz/), as updated from time to time. 

EigenDA means the data availability protocol built on top of the EigenLayer
Protocol as further described in the documentation
[here](https://docs.eigenlayer.xyz/eigenda/overview), as updated from time to time. 

Change Dates:

- All commits at or prior to commit 6de01c6c16d6df44af15f0b06809dc160eac0ebf
(i.e. committed to this repository on or before February 6, 2024, the date of
the [v0.2.1-goerli-m2](https://github.com/Layr-Labs/eigenlayer-contracts/releases/tag/v0.2.1-goerli-m2) release)
have a change date of 2025-05-01 (May 1st, 2025)
- All commits after 6de01c6c16d6df44af15f0b06809dc160eac0ebf (i.e. committed to this
repository after February 6, 2024) have a change date of 2027-02-06 (February 6th, 2027)

Change License:       MIT

-----------------------------------------------------------------------------

Terms

The Licensor hereby grants you the right to copy, modify, create derivative
works, redistribute, and make non-production use of the Licensed Work. The
Licensor may make an Additional Use Grant, above, permitting limited
production use.

Effective on the Change Date, or the fourth anniversary of the first publicly
available distribution of a specific version of the Licensed Work under this
License, whichever comes first, the Licensor hereby grants you rights under
the terms of the Change License, and the rights granted in the paragraph
above terminate.

If your use of the Licensed Work does not comply with the requirements
currently in effect as described in this License, you must purchase a
commercial license from the Licensor, its affiliated entities, or authorized
resellers, or you must refrain from using the Licensed Work.

All copies of the original and modified Licensed Work, and derivative works
of the Licensed Work, are subject to this License. This License applies
separately for each version of the Licensed Work and the Change Date may vary
for each version of the Licensed Work released by Licensor.

You must conspicuously display this License on each original or modified copy
of the Licensed Work. If you receive the Licensed Work in original or
modified form from a third party, the terms and conditions set forth in this
License apply to your use of that work.

Any use of the Licensed Work in violation of this License will automatically
terminate your rights under this License for the current and all other
versions of the Licensed Work.

This License does not grant you any right in any trademark or logo of
Licensor or its affiliates (provided that you may use a trademark or logo of
Licensor as expressly required by this License).

TO THE EXTENT PERMITTED BY APPLICABLE LAW, THE LICENSED WORK IS PROVIDED ON
AN "AS IS" BASIS. LICENSOR HEREBY DISCLAIMS ALL WARRANTIES AND CONDITIONS,
EXPRESS OR IMPLIED, INCLUDING (WITHOUT LIMITATION) WARRANTIES OF
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, NON-INFRINGEMENT, AND
TITLE.

MariaDB hereby grants you permission to use this License’s text to license
your works, and to refer to it using the trademark "Business Source License",
as long as you comply with the Covenants of Licensor below.

-----------------------------------------------------------------------------

Covenants of Licensor

In consideration of the right to use this License’s text and the "Business
Source License" name and trademark, Licensor covenants to MariaDB, and to all
other recipients of the licensed work to be provided by Licensor:

1. To specify as the Change License the GPL Version 2.0 or any later version,
   or a license that is compatible with GPL Version 2.0 or a later version,
   where "compatible" means that software provided under the Change License can
   be included in a program with software provided under GPL Version 2.0 or a
   later version. Licensor may specify additional Change Licenses without
   limitation.

2. To either: (a) specify an additional grant of rights to use that does not
   impose any additional restriction on the right granted in this License, as
   the Additional Use Grant; or (b) insert the text "None".

3. To specify a Change Date.

4. Not to modify this License in any other way.

-----------------------------------------------------------------------------

Notice

The Business Source License (this document, or the "License") is not an Open
Source license. However, the Licensed Work will eventually be made available
under an Open Source License, as stated in this License.
````

## File: MAINTENANCE.md
````markdown
# Maintenance Guide

This document outlines essential procedures for repository maintenance, including PR management, branching strategies, and release processes that maintainers should follow to ensure code quality and stability.

## Code Review Process

Code reviewers are responsible for ensuring that PRs meet the following criteria before merging:

- **Properly labeled** according to our labeling conventions
- **Well-formatted** code adhering to our style guidelines
- **Comprehensive test coverage** including unit and integration tests
- **Documentation updates** where appropriate
- **Security considerations** addressed and potential vulnerabilities mitigated

For first-time external contributors, a maintainer must:
1. Review the PR with additional scrutiny
2. Verify the contributor has signed the CLA (Contributor License Agreement)
3. Manually approve CI workflows to run
4. Provide detailed feedback to help onboard the contributor


## Branching and Merge Strategy for Development

### Core Branches

- **`main` (default)**: 
  - The canonical branch where all approved code changes are merged
  - Must remain stable and suitable for internal/external testing
  - All CI workflows must pass before and after every commit
  - Security audits are performed against specific commits on this branch

- **`release-dev/xxx`**:
  - Used for large features requiring multiple commits that introduce breaking changes
  - Examples: `release-dev/slashing-v1`, `release-dev/rewards-v2`
  - Branch from `main` for isolated development
  - Must be regularly rebased against `main` to reduce merge conflicts
  - Merged back into `main` as a single logical unit when complete
  - No security audits are performed directly on these branches

### Merge Strategies

We employ different merge strategies based on PR type:

#### 1. Regular PRs
Regular PRs include bug fixes, small features, or incremental updates where each PR represents an atomic change.

**Merge Strategy**: Always use **Squash and Merge**
- Combines all commits into a single, atomic unit
- Maintains a clean, linear history on the target branch
- Preserves PR number in commit message for traceability
- Example: `PR #123 -> [squash] -> main`

#### 2. Release-Dev Merges
When merging a complete `release-dev` branch into `main` after a major feature is completed.

**Merge Strategy**: Always use **Merge Commit (no squash)**
- Preserves the complete commit history of the feature branch
- Creates a merge commit that serves as a feature completion marker
- Simplifies cherry-picking specific changes for hotfixes
- Example: `release-dev/feature -> [merge commit] -> main`


#### 3. Merge multiple release-dev branches

A release may contain multiple features that each is developed on its own `release-dev/*` branch. 

When merging to `main`, atomic commits on each `release-dev/*` branch should be preserved, in order to track commit history of each individual feature scope in the release.

This can be achieved by either merge commit each `release-dev/*` branch into `main` respectively, or merge commit into a single `release-dev/*` branch (consolidation) then commit merge the single one into `main`.


### Best Practices

- **Branch Hygiene**: Delete branches after merging to avoid clutter
- **CI Validation**: Never merge code that fails CI checks
- **Documentation**: Update documentation alongside code changes
- **Breaking Changes**: Clearly document any breaking changes in PR descriptions


### Auto Remove Stale Branches

Many stale branches lives in the repo and never got cleaned up. to balance developer convenience vs being organized/legible, we have implemented a CI workflow to identify and remove stable branches.

The CI workflow will:

- scan stale branches that not hv new commits since 90 days ago, and notify owner if there's one
- if still no changes coming in, delete the stable branch 7 days later

Following branches and regex are excluded

- `main`
- `release-dev/*` (release development branches)
- `v*.*.*` (release branches)

Regex rules can be changed by modifying `exempt-branches-regex` config in the [yml](https://github.com/Layr-Labs/eigenlayer-contracts/blob/main/.github/workflows/remove-stale-branches.yml)


------


## Release Management

### Release Tags and Semver

This section defines release tag semver where `<semver>` = `<major>.<minor>.<patch>`

E.g.
- v1.1.0
- v1.1.1

`<semver>` should follow [best practices of semver definition](https://semver.org/)


In observing semver, we define the following;

1. A **major** upgrade
    1. An ideologically breaking upgrade, which may require re-learning parts of the system. 
    2. “Upgrade Required” — Major upgrades are **assumed to break** all tooling, integrations, and downstream consumers unless otherwise stated.
    3. Major upgrades are announced ahead of time via blog posts, the ELIP process, and onchain via the Eigen timelock.
    4. example: slashing, which changes most of our codebase
2. A **minor** upgrade
    1. A conceptually breaking upgrade, which require adapting break changes and APIs, upgrading tools, CLIs, or integrations with EigenLayer.
    2. “Upgrade carefully” — Minor upgrades are **assumed not to break** any tooling, CLIs, or interactions with EigenLayer unless otherwise stated in release notes.
3. A **patch** upgrade
    1. A “silent” upgrade, which addresses a bug or inconsistency in the system, but does not change any interfaces.
        1. i.e. fixes reveal the need for a rounding fix in a contract. Notably **abi** and **tooling** remains stable across patches.
    2. “Upgrade suggested” — Patch upgrades may come with upgrades to tooling, CLIs, or other Eigen infrastructure. You are encouraged to read the patch notes and upgrade.


### Release Base and Cherry Pick

All releases will be cut from `main` the base branch, to ensure global consistency, clean legibility, and high code quality with no env-network specific code

Each env_network deployment will pick one release above.


During release, release manager can cherry pick to exclude certain commits, especially in case of a non-sequential feature deployment


#### Non Sequential Feature Release

In smart contracts, there is a common scenario for non sequential feature deployment due to Ethereum hardforks, whose time we cannot control.

E.g. say we have features A, B, and Ethereum hardfork X,  where B is an upgrade to adapt to X. The deployment sequence for testnet is A, B, X. While that of mainnet has to be B, X, A, because 1/ we don’t control the time of X, 2/ B must happen before X, and 3/ A is not ready for mainnet yet which can’t be deployed before B

Concrete example just happened is A = slashing V1, B = prooftra, X = pectra

So our release branch and model must be flexible enough to solve it via cherry picking


### Release and Deployment Scope

- a release would upgrade versions for all code, even though there's no change to a file from last release
- a deployment would adopt a release as a whole, so all contracts would upgrade to that release, instead of "some file on release v1.3 and some on release v1.4"
    - there's no phrasing of, for example, "all non-EigenPod contracts be on `v1.3.0` and  EigenPods contract on `v1.4.0`" - they would all be on v1.4.0, just the non-eigenpod contract are not changed at all from v1.3.0
    - as implementation detail, we can skip upgrade the contracts that have not changed, but the codebase and releases are on new release version
- all changes have to be deployed to testnet first, before mainnet. No skipping from preprod to mainnet directly


### Changelog, Release Note, Release Announcement Blog

Each release in testnet and mainnet must have corresponding changelog, release note, and announcement blog

- Changelog and release notes
    - lives in the repo `/CHANGELOG` dir
    - release note: high level summary of key changes users need to be aware of
    - changelog: exact commit history diff from last release
    - See examples in Kubernetes https://github.com/kubernetes/kubernetes/tree/master/CHANGELOG
- Release announcement blog
    - published to [blog.eigenlayer.xyz](http://blog.eigenlayer.xyz)
    - an announcement with polished language to introduce the release to users. It will include content in both release notes and changelog
    - See examples in Golang https://tip.golang.org/doc/go1.24
    - Owner: release manager and PM



## Release Manager Responsibilities

We introduce a new critical role called release manager (RM)

Each release should have a primary RM and a secondary RM. RM is on rotating base, not necessarily always be the tech lead of the project, so we can amortize the cost and onboard all developers with same standards

Primary Release Manager is responsible for

- Managing the release-dev branch during development phase
    - create it from `main` and eventually merge back to `main`
    - constantly rebasing to `main` to resolve conflict early, without required efforts from other developers working on the release-dev branch
    - holding high bar for quality:
        - code quality
        - PR templating
        - test quality (e.g. no flaky or failed tests, keep test runtime under control)
- Manage release branches and deployment
    - create and manage corresponding release branches `Vx.y.z`
    - author and publish release notes and changelog
    - author and publish release blog with PM and marketing team
    - lead communication with marketing and BD team to inform stakerholders for preparation
    - lead deployment to env network
- Mentoring and knowledge sharing
    - mentor and train secondary release manager, who will be the primary manager for next release


By following these maintenance procedures, we ensure a stable, secure, and well-documented codebase that meets the high standards required for EigenLayer's infrastructure.
````

## File: Makefile
````
CONTAINER_NAME = eigenlayer-contracts

.PHONY: install-hooks
install-hooks:
	cp bin/pre-commit.sh .git/hooks/pre-commit

.PHONY: install-deps
install-deps:
	./bin/install-deps.sh

.PHONY: deps
deps: install-hooks install-deps

.PHONY: compile
compile:
	forge b

.PHONY: bindings
bindings: compile
	./bin/compile-bindings.sh

.PHONY: all
all: compile bindings

gha:
	git config --global --add safe.directory "*"
	forge install
	forge b
	./bin/compile-bindings.sh

docker:
	docker build --progress=plain -t ${CONTAINER_NAME}:latest .

compile-in-docker:
	docker run -v $(PWD):/build -w /build --rm -it ${CONTAINER_NAME}:latest bash -c "make compile"

bindings-in-docker:
	docker run -v $(PWD):/build -w /build --rm -it ${CONTAINER_NAME}:latest bash -c "make bindings"

all-in-docker:
	docker run -v $(PWD):/build -w /build --rm -it ${CONTAINER_NAME}:latest bash -c "make all"

gha-docker:
	docker run -v $(PWD):/build -w /build --rm -i ${CONTAINER_NAME}:latest bash -c "make gha"

storage-report:
	bash "bin/storage-report.sh" "docs/storage-report/"

fix-typos:
	typos --config .github/configs/typos-cli.toml --write-changes

fmt:
	forge fmt; FOUNDRY_PROFILE=test forge fmt
````

## File: mythril.config.json
````json
{
    "remappings": [
        "forge-std/=lib/forge-std/src/",
        "@openzeppelin/=lib/openzeppelin-contracts-v4.9.0/",
        "@openzeppelin-upgrades/=lib/openzeppelin-contracts-upgradeable-v4.9.0/"
    ],
    "optimizer": {
        "enabled": true,
        "runs": 200
    }
}
````

## File: package.json
````json
{
  "name": "eigenlayer-contracts",
  "version": "1.0.0",
  "description": "<a name=\"introduction\"/></a> # EigenLayer EigenLayer (formerly 'EigenLayr') is a set of smart contracts deployed on Ethereum that enable restaking of assets to secure new services. At present, this repository contains *both* the contracts for EigenLayer *and* a set of general \"middleware\" contracts, designed to be reusable across different applications built on top of EigenLayer.",
  "main": "index.js",
  "directories": {
    "doc": "docs",
    "lib": "lib"
  },
  "scripts": {
    "test": "forge test -v",
    "fmt:check": "forge fmt --check",
    "fmt:fix": "forge fmt",
    "hint": "solhint -c .github/configs/solhint.json 'contracts/**/*.sol' 'script/**/*.sol'"
  },
  "repository": {
    "type": "git",
    "url": "git+https://github.com/Layr-Labs/eigenlayer-contracts.git"
  },
  "author": "",
  "license": "ISC",
  "bugs": {
    "url": "https://github.com/Layr-Labs/eigenlayer-contracts/issues"
  },
  "homepage": "https://github.com/Layr-Labs/eigenlayer-contracts#readme",
  "devDependencies": {
    "@commitlint/cli": "^18.2.0",
    "@commitlint/config-conventional": "^18.1.0",
    "@types/yargs": "^17.0.28",
    "dotenv": "^16.3.1",
    "fs": "^0.0.1-security",
    "husky": "^8.0.3",
    "ts-node": "^10.9.1",
    "typescript": "^4.9.4",
    "yargs": "^17.7.2",
    "solhint": "5.0.1"
  },
  "dependencies": {
    "solidity-docgen": "^0.6.0-beta.32"
  }
}
````

## File: README.md
````markdown
<a name="introduction"/></a>

# EigenLayer

**EigenLayer** is a protocol built on Ethereum that introduces Restaking, a primitive for app and service builders to make verifiable commitments to their users.

EigenLayer brings together Restakers, Operators, and Autonomous Verifiable Services (AVSs) to extend Ethereum's cryptoeconomic security with penalty and reward commitments (like slashing) on staked assets acting as security. The protocol supports permissionless security; EIGEN, Native ETH, LSTs, and ERC-20s. 

## Deployments

The deployments on `mainnet`, `base`, `sepolia`, `hoodi`, and `base sepolia` are on the below versions:

| Environment | Version | Core Protocol Deployed | Supports Native Restaking | Supports Multichain |
| -------- | -------- | -------- | -------- | -------- | 
| Mainnet Ethereum | [`v1.12.0`](https://github.com/Layr-Labs/eigenlayer-contracts/releases/tag/v1.12.0) | Yes | Yes | Yes (source & destination) |
| Base | [`v1.8.1`](https://github.com/Layr-Labs/eigenlayer-contracts/releases/tag/v1.8.1) | No | No | Yes (destination) |
| Testnet Sepolia | [`v1.9.0-rc.0`](https://github.com/Layr-Labs/eigenlayer-contracts/releases/tag/v1.9.0-rc.0) | Yes | No | Yes (source & destination) |
| Testnet Hoodi | [`v1.9.0-rc.0`](https://github.com/Layr-Labs/eigenlayer-contracts/releases/tag/v1.9.0-rc.0) | Yes | Yes | No |
| Testnet Base Sepolia | [`v1.9.0-rc.0`](https://github.com/Layr-Labs/eigenlayer-contracts/releases/tag/v1.9.0-rc.0) | No | No | Yes (destination) |

### Current Deployment Contracts

<details>
    <summary>Mainnet Ethereum</summary>


###### Core

| Name | Proxy | Implementation | Notes |
| -------- | -------- | -------- | -------- |
| [`DelegationManager`](https://github.com/Layr-Labs/eigenlayer-contracts/blob/v1.6.0/src/contracts/core/DelegationManager.sol) | [`0x39053D51B77DC0d36036Fc1fCc8Cb819df8Ef37A`](https://etherscan.io/address/0x39053D51B77DC0d36036Fc1fCc8Cb819df8Ef37A) | [`0x6EEd...F89`](https://etherscan.io/address/0x6EEd6c2802dF347e05884857CdDB2D3E96D12F89) | Proxy: [`TUP@4.7.1`](https://github.com/OpenZeppelin/openzeppelin-contracts/blob/v4.7.1/contracts/proxy/transparent/TransparentUpgradeableProxy.sol) |
| [`StrategyManager`](https://github.com/Layr-Labs/eigenlayer-contracts/blob/v1.12.0/src/contracts/core/StrategyManager.sol) | [`0x858646372CC42E1A627fcE94aa7A7033e7CF075A`](https://etherscan.io/address/0x858646372CC42E1A627fcE94aa7A7033e7CF075A) | [`0x8858...d394`](https://etherscan.io/address/0x88582996b70FDd7C4f16e3Fde7B53858FcE0d394) | Proxy: [`TUP@4.7.1`](https://github.com/OpenZeppelin/openzeppelin-contracts/blob/v4.7.1/contracts/proxy/transparent/TransparentUpgradeableProxy.sol) |
| [`EigenPodManager`](https://github.com/Layr-Labs/eigenlayer-contracts/blob/v1.6.0/src/contracts/pods/EigenPodManager.sol) | [`0x91E677b07F7AF907ec9a428aafA9fc14a0d3A338`](https://etherscan.io/address/0x91E677b07F7AF907ec9a428aafA9fc14a0d3A338) | [`0xE48D...ABd`](https://etherscan.io/address/0xE48D7CaeC1790b293667e4bB2dE1E00536F2bABd) | Proxy: [`TUP@4.7.1`](https://github.com/OpenZeppelin/openzeppelin-contracts/blob/v4.7.1/contracts/proxy/transparent/TransparentUpgradeableProxy.sol) |
| [`AVSDirectory`](https://github.com/Layr-Labs/eigenlayer-contracts/blob/v1.3.0/src/contracts/core/AVSDirectory.sol) | [`0x135dda560e946695d6f155dacafc6f1f25c1f5af`](https://etherscan.io/address/0x135dda560e946695d6f155dacafc6f1f25c1f5af) | [`0xA396...B6A2`](https://etherscan.io/address/0xA396D855D70e1A1ec1A0199ADB9845096683B6A2) | Proxy: [`TUP@4.7.1`](https://github.com/OpenZeppelin/openzeppelin-contracts/blob/v4.7.1/contracts/proxy/transparent/TransparentUpgradeableProxy.sol) |
| [`RewardsCoordinator`](https://github.com/Layr-Labs/eigenlayer-contracts/blob/v1.12.0/src/contracts/core/RewardsCoordinator.sol) | [`0x7750d328b314EfFa365A0402CcfD489B80B0adda`](https://etherscan.io/address/0x7750d328b314EfFa365A0402CcfD489B80B0adda) | [`0xa067...3C26`](https://etherscan.io/address/0xa0673C53980665a706352412D2538bA005403C26) | Proxy: [`TUP@4.7.1`](https://github.com/OpenZeppelin/openzeppelin-contracts/blob/v4.7.1/contracts/proxy/transparent/TransparentUpgradeableProxy.sol) |
| [`PermissionController`](https://github.com/Layr-Labs/eigenlayer-contracts/blob/v1.3.0/src/contracts/permissions/PermissionController.sol) | [`0x25E5F8B1E7aDf44518d35D5B2271f114e081f0E5`](https://etherscan.io/address/0x25E5F8B1E7aDf44518d35D5B2271f114e081f0E5) | [`0xe7f3...C6B1`](https://etherscan.io/address/0xe7f3705c9Addf2DE14e03C345fA982CAb2c1C6B1) | Proxy: [`TUP@4.9.0`](https://github.com/OpenZeppelin/openzeppelin-contracts/blob/v4.9.0/contracts/proxy/transparent/TransparentUpgradeableProxy.sol) |
| [`AllocationManager`](https://github.com/Layr-Labs/eigenlayer-contracts/blob/v1.6.0/src/contracts/core/AllocationManager.sol) | [`0x948a420b8CC1d6BFd0B6087C2E7c344a2CD0bc39`](https://etherscan.io/address/0x948a420b8CC1d6BFd0B6087C2E7c344a2CD0bc39) | [`0xC976...345`](https://etherscan.io/address/0xC97602648fA52F92B4ee2b0e5a54Bd15b6cB0345) | Proxy: [`TUP@4.9.0`](https://github.com/OpenZeppelin/openzeppelin-contracts/blob/v4.9.0/contracts/proxy/transparent/TransparentUpgradeableProxy.sol) |
| [`EmissionsController`](https://github.com/Layr-Labs/eigenlayer-contracts/blob/v1.12.0/src/contracts/core/EmissionsController.sol) | [`0x619F988b4EA2f896ED068d84cE6F52550d6acE84`](https://etherscan.io/address/0x619F988b4EA2f896ED068d84cE6F52550d6acE84) | [`0x29Db...CA01`](https://etherscan.io/address/0x29Db9526F3A95F3059A5d3a9A05B611eBA7dcA01) | Proxy: [`TUP@4.7.1`](https://github.com/OpenZeppelin/openzeppelin-contracts/blob/v4.7.1/contracts/proxy/transparent/TransparentUpgradeableProxy.sol) |

###### Strategies

Anyone can deploy and whitelist strategies for standard ERC20s by using the `StrategyFactory` deployed to the address below (see [docs](./docs/core/StrategyManager.md#strategyfactorydeploynewstrategy)). Strategies deployed from the `StrategyFactory` are deployed using the beacon proxy pattern:

| Name | Proxy | Implementation | Notes |
| -------- | -------- | -------- | -------- | 
| [`StrategyFactory`](https://github.com/Layr-Labs/eigenlayer-contracts/blob/v1.12.0/src/contracts/strategies/StrategyFactory.sol) | [`0x5e4C39Ad7A3E881585e383dB9827EB4811f6F647`](https://etherscan.io/address/0x5e4C39Ad7A3E881585e383dB9827EB4811f6F647) | [`0x315B...09E7`](https://etherscan.io/address/0x315BCD0f31EF8b1124382f3acab3913f791C09E7) | Proxy: [`TUP@4.7.1`](https://github.com/OpenZeppelin/openzeppelin-contracts/blob/v4.7.1/contracts/proxy/transparent/TransparentUpgradeableProxy.sol) |
| [`StrategyBase`](https://github.com/Layr-Labs/eigenlayer-contracts/blob/v1.12.0/src/contracts/strategies/StrategyBase.sol) | [`0x0ed6703C298d28aE0878d1b28e88cA87F9662fE9`](https://etherscan.io/address/0x0ed6703c298d28ae0878d1b28e88ca87f9662fe9) | [`0x8F6b...1Ce`](https://etherscan.io/address/0x8F6be4A906376bB4481E78cBF6FC783Cc0f8D1Ce) | - Beacon: [`BeaconProxy`](https://github.com/OpenZeppelin/openzeppelin-contracts/blob/v4.7.0/contracts/proxy/beacon/BeaconProxy.sol) <br />- Strategies: [`UpgradeableBeacon`](https://github.com/OpenZeppelin/openzeppelin-contracts/blob/v4.4.1/contracts/proxy/beacon/UpgradeableBeacon.sol) |
| [`DurationVaultStrategy`](https://github.com/Layr-Labs/eigenlayer-contracts/blob/v1.12.0/src/contracts/strategies/DurationVaultStrategy.sol) | [`0x0fCE0A591D96BB76883323eF555867111E2050a9`](https://etherscan.io/address/0x0fCE0A591D96BB76883323eF555867111E2050a9) | [`0xC355...AC97`](https://etherscan.io/address/0xC355123d0a51b4B5185aA7f21150904CEE3EAC97) | - Beacon: [`BeaconProxy`](https://github.com/OpenZeppelin/openzeppelin-contracts/blob/v4.7.0/contracts/proxy/beacon/BeaconProxy.sol) <br />- Strategies: [`UpgradeableBeacon`](https://github.com/OpenZeppelin/openzeppelin-contracts/blob/v4.4.1/contracts/proxy/beacon/UpgradeableBeacon.sol) |

The following strategies were originally deployed and whitelisted outside of the `StrategyFactory`:

| Name | Proxy | Implementation | Notes |
| -------- | -------- | -------- | -------- | 
| [`StrategyBase (cbETH)`](https://github.com/Layr-Labs/eigenlayer-contracts/blob/v1.12.0/src/contracts/strategies/StrategyBaseTVLLimits.sol) | [`0x54945180dB7943c0ed0FEE7EdaB2Bd24620256bc`](https://etherscan.io/address/0x54945180dB7943c0ed0FEE7EdaB2Bd24620256bc) | [`0xB427...7230`](https://etherscan.io/address/0xB427E2Eb4Bb33eE3f1ee72dc9e347e8625a72230) | Proxy: [`TUP@4.7.1`](https://github.com/OpenZeppelin/openzeppelin-contracts/blob/v4.7.1/contracts/proxy/transparent/TransparentUpgradeableProxy.sol) |
| [`StrategyBase (stETH)`](https://github.com/Layr-Labs/eigenlayer-contracts/blob/v1.12.0/src/contracts/strategies/StrategyBaseTVLLimits.sol) | [`0x93c4b944D05dfe6df7645A86cd2206016c51564D`](https://etherscan.io/address/0x93c4b944D05dfe6df7645A86cd2206016c51564D) | [`0xB427...7230`](https://etherscan.io/address/0xB427E2Eb4Bb33eE3f1ee72dc9e347e8625a72230) | Proxy: [`TUP@4.7.1`](https://github.com/OpenZeppelin/openzeppelin-contracts/blob/v4.7.1/contracts/proxy/transparent/TransparentUpgradeableProxy.sol) |
| [`StrategyBase (rETH)`](https://github.com/Layr-Labs/eigenlayer-contracts/blob/v1.12.0/src/contracts/strategies/StrategyBaseTVLLimits.sol) | [`0x1BeE69b7dFFfA4E2d53C2a2Df135C388AD25dCD2`](https://etherscan.io/address/0x1BeE69b7dFFfA4E2d53C2a2Df135C388AD25dCD2) | [`0xB427...7230`](https://etherscan.io/address/0xB427E2Eb4Bb33eE3f1ee72dc9e347e8625a72230) | Proxy: [`TUP@4.7.1`](https://github.com/OpenZeppelin/openzeppelin-contracts/blob/v4.7.1/contracts/proxy/transparent/TransparentUpgradeableProxy.sol) |
| [`StrategyBase (ETHx)`](https://github.com/Layr-Labs/eigenlayer-contracts/blob/v1.12.0/src/contracts/strategies/StrategyBaseTVLLimits.sol) | [`0x9d7eD45EE2E8FC5482fa2428f15C971e6369011d`](https://etherscan.io/address/0x9d7eD45EE2E8FC5482fa2428f15C971e6369011d) | [`0xB427...7230`](https://etherscan.io/address/0xB427E2Eb4Bb33eE3f1ee72dc9e347e8625a72230) | Proxy: [`TUP@4.7.1`](https://github.com/OpenZeppelin/openzeppelin-contracts/blob/v4.7.1/contracts/proxy/transparent/TransparentUpgradeableProxy.sol) |
| [`StrategyBase (ankrETH)`](https://github.com/Layr-Labs/eigenlayer-contracts/blob/v1.12.0/src/contracts/strategies/StrategyBaseTVLLimits.sol) | [`0x13760F50a9d7377e4F20CB8CF9e4c26586c658ff`](https://etherscan.io/address/0x13760F50a9d7377e4F20CB8CF9e4c26586c658ff) | [`0xB427...7230`](https://etherscan.io/address/0xB427E2Eb4Bb33eE3f1ee72dc9e347e8625a72230) | Proxy: [`TUP@4.7.1`](https://github.com/OpenZeppelin/openzeppelin-contracts/blob/v4.7.1/contracts/proxy/transparent/TransparentUpgradeableProxy.sol) |
| [`StrategyBase (OETH)`](https://github.com/Layr-Labs/eigenlayer-contracts/blob/v1.12.0/src/contracts/strategies/StrategyBaseTVLLimits.sol) | [`0xa4C637e0F704745D182e4D38cAb7E7485321d059`](https://etherscan.io/address/0xa4C637e0F704745D182e4D38cAb7E7485321d059) | [`0xB427...7230`](https://etherscan.io/address/0xB427E2Eb4Bb33eE3f1ee72dc9e347e8625a72230) | Proxy: [`TUP@4.7.1`](https://github.com/OpenZeppelin/openzeppelin-contracts/blob/v4.7.1/contracts/proxy/transparent/TransparentUpgradeableProxy.sol) |
| [`StrategyBase (osETH)`](https://github.com/Layr-Labs/eigenlayer-contracts/blob/v1.12.0/src/contracts/strategies/StrategyBaseTVLLimits.sol) | [`0x57ba429517c3473B6d34CA9aCd56c0e735b94c02`](https://etherscan.io/address/0x57ba429517c3473B6d34CA9aCd56c0e735b94c02) | [`0xB427...7230`](https://etherscan.io/address/0xB427E2Eb4Bb33eE3f1ee72dc9e347e8625a72230) | Proxy: [`TUP@4.7.1`](https://github.com/OpenZeppelin/openzeppelin-contracts/blob/v4.7.1/contracts/proxy/transparent/TransparentUpgradeableProxy.sol) |
| [`StrategyBase (swETH)`](https://github.com/Layr-Labs/eigenlayer-contracts/blob/v1.12.0/src/contracts/strategies/StrategyBaseTVLLimits.sol) | [`0x0Fe4F44beE93503346A3Ac9EE5A26b130a5796d6`](https://etherscan.io/address/0x0Fe4F44beE93503346A3Ac9EE5A26b130a5796d6) | [`0xB427...7230`](https://etherscan.io/address/0xB427E2Eb4Bb33eE3f1ee72dc9e347e8625a72230) | Proxy: [`TUP@4.7.1`](https://github.com/OpenZeppelin/openzeppelin-contracts/blob/v4.7.1/contracts/proxy/transparent/TransparentUpgradeableProxy.sol) |
| [`StrategyBase (wBETH)`](https://github.com/Layr-Labs/eigenlayer-contracts/blob/v1.12.0/src/contracts/strategies/StrategyBaseTVLLimits.sol) | [`0x7CA911E83dabf90C90dD3De5411a10F1A6112184`](https://etherscan.io/address/0x7CA911E83dabf90C90dD3De5411a10F1A6112184) | [`0xB427...7230`](https://etherscan.io/address/0xB427E2Eb4Bb33eE3f1ee72dc9e347e8625a72230) | Proxy: [`TUP@4.7.1`](https://github.com/OpenZeppelin/openzeppelin-contracts/blob/v4.7.1/contracts/proxy/transparent/TransparentUpgradeableProxy.sol) |
| [`StrategyBase (sfrxETH)`](https://github.com/Layr-Labs/eigenlayer-contracts/blob/v1.12.0/src/contracts/strategies/StrategyBaseTVLLimits.sol) | [`0x8CA7A5d6f3acd3A7A8bC468a8CD0FB14B6BD28b6`](https://etherscan.io/address/0x8CA7A5d6f3acd3A7A8bC468a8CD0FB14B6BD28b6) | [`0xB427...7230`](https://etherscan.io/address/0xB427E2Eb4Bb33eE3f1ee72dc9e347e8625a72230) | Proxy: [`TUP@4.7.1`](https://github.com/OpenZeppelin/openzeppelin-contracts/blob/v4.7.1/contracts/proxy/transparent/TransparentUpgradeableProxy.sol) |
| [`StrategyBase (lsETH)`](https://github.com/Layr-Labs/eigenlayer-contracts/blob/v1.12.0/src/contracts/strategies/StrategyBaseTVLLimits.sol) | [`0xAe60d8180437b5C34bB956822ac2710972584473`](https://etherscan.io/address/0xAe60d8180437b5C34bB956822ac2710972584473) | [`0xB427...7230`](https://etherscan.io/address/0xB427E2Eb4Bb33eE3f1ee72dc9e347e8625a72230) | Proxy: [`TUP@4.7.1`](https://github.com/OpenZeppelin/openzeppelin-contracts/blob/v4.7.1/contracts/proxy/transparent/TransparentUpgradeableProxy.sol) |
| [`StrategyBase (mETH)`](https://github.com/Layr-Labs/eigenlayer-contracts/blob/v1.12.0/src/contracts/strategies/StrategyBaseTVLLimits.sol) | [`0x298aFB19A105D59E74658C4C334Ff360BadE6dd2`](https://etherscan.io/address/0x298aFB19A105D59E74658C4C334Ff360BadE6dd2) | [`0xB427...7230`](https://etherscan.io/address/0xB427E2Eb4Bb33eE3f1ee72dc9e347e8625a72230) | Proxy: [`TUP@4.7.1`](https://github.com/OpenZeppelin/openzeppelin-contracts/blob/v4.7.1/contracts/proxy/transparent/TransparentUpgradeableProxy.sol) |

###### Strategies - Special

The following strategies differ significantly from the other strategies deployed/used above:

| Name | Proxy | Implementation | Notes |
| -------- | -------- | -------- | -------- |
| [`EigenStrategy (EIGEN)`](https://github.com/Layr-Labs/eigenlayer-contracts/blob/v1.12.0/src/contracts/strategies/EigenStrategy.sol) | [`0xaCB55C530Acdb2849e6d4f36992Cd8c9D50ED8F7`](https://etherscan.io/address/0xaCB55C530Acdb2849e6d4f36992Cd8c9D50ED8F7) | [`0x509A...8f40`](https://etherscan.io/address/0x509Aadb99487182b21fF4E9e7Eb362a9Ea8E8f40) | Proxy: [`TUP@4.9.0`](https://github.com/OpenZeppelin/openzeppelin-contracts/blob/v4.9.0/contracts/proxy/transparent/TransparentUpgradeableProxy.sol) |
| `Beacon Chain ETH` | `0xbeaC0eeEeeeeEEeEeEEEEeeEEeEeeeEeeEEBEaC0` | - | - Used for Beacon Chain ETH shares <br />- Not a real contract! |

###### EigenPods

| Name | Proxy | Implementation | Notes |
| -------- | -------- | -------- | -------- | 
| [`EigenPod (beacon)`](https://github.com/Layr-Labs/eigenlayer-contracts/blob/v1.6.0/src/contracts/pods/EigenPod.sol) | [`0x5a2a4F2F3C18f09179B6703e63D9eDD165909073`](https://etherscan.io/address/0x5a2a4F2F3C18f09179B6703e63D9eDD165909073) | [`0xcb27...3745`](https://etherscan.io/address/0xcb27A4819A64FBA93ABD4D480e4466aEc0503745) | - Beacon: [`BeaconProxy`](https://github.com/OpenZeppelin/openzeppelin-contracts/blob/v4.7.0/contracts/proxy/beacon/BeaconProxy.sol) <br />- Pods: [`UpgradeableBeacon`](https://github.com/OpenZeppelin/openzeppelin-contracts/blob/v4.4.1/contracts/proxy/beacon/UpgradeableBeacon.sol) |

###### EIGEN/bEIGEN

| Name | Proxy | Implementation | Notes |
| -------- | -------- | -------- | -------- | 
| [`Eigen`](https://github.com/Layr-Labs/eigenlayer-contracts/blob/v1.6.0/src/contracts/token/Eigen.sol) | [`0xec53bf9167f50cdeb3ae105f56099aaab9061f83`](https://etherscan.io/address/0xec53bf9167f50cdeb3ae105f56099aaab9061f83) | [`0x2C4A...2E50`](https://etherscan.io/address/0x2C4A81e257381F87F5A5C4bd525116466D972E50) | Proxy: [`TUP@4.9.0`](https://github.com/OpenZeppelin/openzeppelin-contracts/blob/v4.9.0/contracts/proxy/transparent/TransparentUpgradeableProxy.sol) |
| [`Backing Eigen`](https://github.com/Layr-Labs/eigenlayer-contracts/blob/v1.6.0/src/contracts/token/BackingEigen.sol) | [`0x83E9115d334D248Ce39a6f36144aEaB5b3456e75`](https://etherscan.io/address/0x83E9115d334D248Ce39a6f36144aEaB5b3456e75) | [`0xF2b2...9b17`](https://etherscan.io/address/0xF2b225815F70c9b327DC9db758A36c92A4279b17) | Proxy: [`TUP@4.9.0`](https://github.com/OpenZeppelin/openzeppelin-contracts/blob/v4.9.0/contracts/proxy/transparent/TransparentUpgradeableProxy.sol) |
| [`SignedDistributor`](https://etherscan.io/address/0x035bdAeaB85E47710C27EdA7FD754bA80aD4ad02#code) | - | [`0x035b...ad02`](https://etherscan.io/address/0x035bdAeaB85E47710C27EdA7FD754bA80aD4ad02) | - |

###### AVS

The following contracts are used by AVSs.

| Name | Proxy | Implementation | Notes |
| -------- | -------- | -------- | -------- |
| [`ReleaseManager`](https://github.com/Layr-Labs/eigenlayer-contracts/blob/v1.8.1/src/contracts/core/ReleaseManager.sol) | [`0xeDA3CAd031c0cf367cF3f517Ee0DC98F9bA80C8F`](https://etherscan.io/address/0xeDA3CAd031c0cf367cF3f517Ee0DC98F9bA80C8F) | [`0x888f...8A3`](https://etherscan.io/address/0x888fE518e321301975A21A7ffE0C898d453c58A3) | Proxy: [`TUP@4.9.0`](https://github.com/OpenZeppelin/openzeppelin-contracts/blob/v4.9.0/contracts/proxy/transparent/TransparentUpgradeableProxy.sol) |
| [`TaskMailbox`](https://github.com/Layr-Labs/eigenlayer-contracts/blob/v1.8.1/src/contracts/avs/task/TaskMailbox.sol) | [`0x132b466d9d5723531F68797519DfED701aC2C749`](https://etherscan.io/address/0x132b466d9d5723531F68797519DfED701aC2C749) | [`0x7610...0150`](https://etherscan.io/address/0x76106801F287236Abe0799B1FAb7f7F39AD50150) | Proxy: [`TUP@4.9.0`](https://github.com/OpenZeppelin/openzeppelin-contracts/blob/v4.9.0/contracts/proxy/transparent/TransparentUpgradeableProxy.sol) |

###### Multichain - Source

The multichain protocol expects AVSs to register on the source chain. AVS's stakes are then transported to supported destination chains. For the mainnet Ethereum network, the destination chains include Base.

| Name | Proxy | Implementation | Notes |
| -------- | -------- | -------- | -------- |
| [`CrossChainRegistry`](https://github.com/Layr-Labs/eigenlayer-contracts/blob/v1.8.1/src/contracts/multichain/CrossChainRegistry.sol) | [`0x9376A5863F2193cdE13e1aB7c678F22554E2Ea2b`](https://etherscan.io/address/0x9376A5863F2193cdE13e1aB7c678F22554E2Ea2b) | [`0x18e7...a4`](https://etherscan.io/address/0x18e7389659De5dd24adfb0f432591973799B1ba4) | Proxy: [`TUP@4.9.0`](https://github.com/OpenZeppelin/openzeppelin-contracts/blob/v4.9.0/contracts/proxy/transparent/TransparentUpgradeableProxy.sol) |
| [`KeyRegistrar`](https://github.com/Layr-Labs/eigenlayer-contracts/blob/v1.8.1/src/contracts/permissions/KeyRegistrar.sol) | [`0x54f4bC6bDEbe479173a2bbDc31dD7178408A57A4`](https://etherscan.io/address/0x54f4bC6bDEbe479173a2bbDc31dD7178408A57A4) | [`0x047b...136b`](https://etherscan.io/address/0x047bEc3D8C19D70BA81d61a48Bf9dC63A3E9136b) | Proxy: [`TUP@4.9.0`](https://github.com/OpenZeppelin/openzeppelin-contracts/blob/v4.9.0/contracts/proxy/transparent/TransparentUpgradeableProxy.sol) |

###### Multichain - Destination

| Name | Proxy | Implementation | Notes |
| -------- | -------- | -------- | -------- |
| [`OperatorTableUpdater`](https://github.com/Layr-Labs/eigenlayer-contracts/blob/v1.8.1/src/contracts/multichain/OperatorTableUpdater.sol) | [`0x5557E1fE3068A1e823cE5Dcd052c6C352E2617B5`](https://etherscan.io/address/0x5557E1fE3068A1e823cE5Dcd052c6C352E2617B5) | [`0x64ad...f22b`](https://etherscan.io/address/0x64ad668f6Ca7104E452041555a857CCE6267f22b) | Proxy: [`TUP@4.9.0`](https://github.com/OpenZeppelin/openzeppelin-contracts/blob/v4.9.0/contracts/proxy/transparent/TransparentUpgradeableProxy.sol) |
| [`ECDSACertificateVerifier`](https://github.com/Layr-Labs/eigenlayer-contracts/blob/v1.8.1/src/contracts/multichain/ECDSACertificateVerifier.sol) | [`0xd0930ee96D07de4F9d493c259232222e46B6EC25`](https://etherscan.io/address/0xd0930ee96D07de4F9d493c259232222e46B6EC25) | [`0x6A74...1A6`](https://etherscan.io/address/0x6A74CA72cdF26F3E8a9684E0Ef2F36d1bd2AA1A6) | Proxy: [`TUP@4.9.0`](https://github.com/OpenZeppelin/openzeppelin-contracts/blob/v4.9.0/contracts/proxy/transparent/TransparentUpgradeableProxy.sol) |
| [`BN254CertificateVerifier`](https://github.com/Layr-Labs/eigenlayer-contracts/blob/v1.8.1/src/contracts/multichain/BN254CertificateVerifier.sol) | [`0x3F55654b2b2b86bB11bE2f72657f9C33bf88120A`](https://etherscan.io/address/0x3F55654b2b2b86bB11bE2f72657f9C33bf88120A) | [`0x7b82...6c66`](https://etherscan.io/address/0x7b8231f0652943734682C87C01D3169b19006c66) | Proxy: [`TUP@4.9.0`](https://github.com/OpenZeppelin/openzeppelin-contracts/blob/v4.9.0/contracts/proxy/transparent/TransparentUpgradeableProxy.sol) |

###### Multisigs

| Name | Proxy | Implementation | Notes |
| -------- | -------- | -------- | -------- | 
| [`PauserRegistry`](https://github.com/Layr-Labs/eigenlayer-contracts/blob/v1.8.1/src/contracts/permissions/PauserRegistry.sol) | - | [`0xB876...2806`](https://etherscan.io/address/0xB8765ed72235d279c3Fb53936E4606db0Ef12806) | |
| [`OZ: TimelockController`](https://github.com/OpenZeppelin/openzeppelin-contracts/blob/release-v4.7/contracts/governance/TimelockController.sol) | - | [`0xC06F...Aa2d`](https://etherscan.io/address/0xC06Fd4F821eaC1fF1ae8067b36342899b57BAa2d) | |
| [`OZ: TimelockController (BEIGEN)`](https://github.com/OpenZeppelin/openzeppelin-contracts/blob/release-v4.7/contracts/governance/TimelockController.sol) | - | [`0x7381...bc53`](https://etherscan.io/address/0x738130BC8eADe1Bc65A9c056DEa636835896bc53) | |
| [`OZ: Proxy Admin`](https://github.com/OpenZeppelin/openzeppelin-contracts/blob/v4.7.1/contracts/proxy/transparent/ProxyAdmin.sol) | - | [`0x8b95...2444`](https://etherscan.io/address/0x8b9566AdA63B64d1E1dcF1418b43fd1433b72444) | |
| [`Pauser Multisig`](https://github.com/safe-global/safe-contracts/blob/v1.3.0/contracts/GnosisSafe.sol) | [`0x5050389572f2d220ad927CcbeA0D406831012390`](https://etherscan.io/address/0x5050389572f2d220ad927CcbeA0D406831012390) | - | |
| [`Community Multisig`](https://github.com/safe-global/safe-contracts/blob/v1.3.0/contracts/GnosisSafe.sol) | [`0xFEA47018D632A77bA579846c840d5706705Dc598`](https://etherscan.io/address/0xFEA47018D632A77bA579846c840d5706705Dc598) | - | |
| [`Executor Multisig`](https://github.com/safe-global/safe-contracts/blob/v1.3.0/contracts/GnosisSafe.sol) | [`0x369e6F597e22EaB55fFb173C6d9cD234BD699111`](https://etherscan.io/address/0x369e6F597e22EaB55fFb173C6d9cD234BD699111) | - | |
| [`Operations Multisig`](https://github.com/safe-global/safe-contracts/blob/v1.3.0/contracts/GnosisSafe.sol) | [`0xBE1685C81aA44FF9FB319dD389addd9374383e90`](https://etherscan.io/address/0xBE1685C81aA44FF9FB319dD389addd9374383e90) | - | |
| [`Protocol Council Multisig`](https://github.com/safe-global/safe-contracts/blob/v1.3.0/contracts/GnosisSafe.sol) | [`0x461854d84ee845f905e0ecf6c288ddeeb4a9533f`](https://etherscan.io/address/0x461854d84ee845f905e0ecf6c288ddeeb4a9533f) | - | |
| [`Foundation Multisig`](https://github.com/safe-global/safe-contracts/blob/v1.3.0/contracts/GnosisSafe.sol) | [`0xbb00DDa2832850a43840A3A86515E3Fe226865F2`](https://etherscan.io/address/0xbb00DDa2832850a43840A3A86515E3Fe226865F2) | - | |
| [`BEIGEN Executor Multisig`](https://github.com/safe-global/safe-contracts/blob/v1.3.0/contracts/GnosisSafe.sol) | [`0x942eaF324971440384e4cA0ffA39fC3bb369D67d`](https://etherscan.io/address/0x942eaF324971440384e4cA0ffA39fC3bb369D67d) | - | |
| [`Multichain Deployer Multisig`](https://github.com/safe-global/safe-contracts/blob/v1.3.0/contracts/GnosisSafe.sol) | [`0xa3053EF25F1F7d9D55a7655372B8a31D0f40eCA9`](https://etherscan.io/address/0xa3053EF25F1F7d9D55a7655372B8a31D0f40eCA9) | - | |


</details>



<details>
    <summary>Base</summary>


**Note: Base only supports verification of tasks from stake that lives on Mainnet Ethereum. Standard core protocol functionality (restaking, slashing) does not exist on Base.**

###### Multichain - Destination

| Name | Proxy | Implementation | Notes |
| -------- | -------- | -------- | -------- |
| [`OperatorTableUpdater`](https://github.com/Layr-Labs/eigenlayer-contracts/blob/v1.8.1/src/contracts/multichain/OperatorTableUpdater.sol) | [`0x5557E1fE3068A1e823cE5Dcd052c6C352E2617B5`](https://basescan.org/address/0x5557E1fE3068A1e823cE5Dcd052c6C352E2617B5) | [`0xEd18...fdA9`](https://basescan.org/address/0xEd18bAa093164fF477996c4b957F806b4A0ffdA9) | Proxy: [`TUP@4.9.0`](https://github.com/OpenZeppelin/openzeppelin-contracts/blob/v4.9.0/contracts/proxy/transparent/TransparentUpgradeableProxy.sol) |
| [`ECDSACertificateVerifier`](https://github.com/Layr-Labs/eigenlayer-contracts/blob/v1.8.1/src/contracts/multichain/ECDSACertificateVerifier.sol) | [`0xd0930ee96D07de4F9d493c259232222e46B6EC25`](https://basescan.org/address/0xd0930ee96D07de4F9d493c259232222e46B6EC25) | [`0x3cf9...b3C`](https://basescan.org/address/0x3cf9F2F82AAB604C347ec03A5C642D6a9eac1b3C) | Proxy: [`TUP@4.9.0`](https://github.com/OpenZeppelin/openzeppelin-contracts/blob/v4.9.0/contracts/proxy/transparent/TransparentUpgradeableProxy.sol) |
| [`BN254CertificateVerifier`](https://github.com/Layr-Labs/eigenlayer-contracts/blob/v1.8.1/src/contracts/multichain/BN254CertificateVerifier.sol) | [`0x3F55654b2b2b86bB11bE2f72657f9C33bf88120A`](https://basescan.org/address/0x3F55654b2b2b86bB11bE2f72657f9C33bf88120A) | [`0x48F0...4Ec`](https://basescan.org/address/0x48F0a11AADc9c687410A3664A4fDD61DAf6904Ec) | Proxy: [`TUP@4.9.0`](https://github.com/OpenZeppelin/openzeppelin-contracts/blob/v4.9.0/contracts/proxy/transparent/TransparentUpgradeableProxy.sol) |

###### AVS

The following contracts are used by AVSs.

| Name | Proxy | Implementation | Notes |
| -------- | -------- | -------- | -------- |
| [`TaskMailbox`](https://github.com/Layr-Labs/eigenlayer-contracts/blob/v1.8.1/src/contracts/avs/task/TaskMailbox.sol) | [`0x132b466d9d5723531F68797519DfED701aC2C749`](https://basescan.org/address/0x132b466d9d5723531F68797519DfED701aC2C749) | [`0x9c2A...c84A`](https://basescan.org/address/0x9c2A1F3a47b2f6607a8511DF753F7B8Ca952c84A) | Proxy: [`TUP@4.9.0`](https://github.com/OpenZeppelin/openzeppelin-contracts/blob/v4.9.0/contracts/proxy/transparent/TransparentUpgradeableProxy.sol) |

###### Multisigs

| Name | Proxy | Implementation | Notes |
| -------- | -------- | -------- | -------- | 
| [`PauserRegistry`](https://github.com/Layr-Labs/eigenlayer-contracts/blob/v1.8.1/src/contracts/permissions/PauserRegistry.sol) | - | [`0xb175...6ea`](https://basescan.org/address/0xb1754226917e866c1701f1d9F9E135D88f2e86ea) | |
| [`OZ: TimelockController`](https://github.com/OpenZeppelin/openzeppelin-contracts/blob/release-v4.7/contracts/governance/TimelockController.sol) | - | [`0xE48D...ABd`](https://basescan.org/address/0xE48D7CaeC1790b293667e4bB2dE1E00536F2bABd) | |
| [`OZ: Proxy Admin`](https://github.com/OpenZeppelin/openzeppelin-contracts/blob/v4.9.0/contracts/proxy/transparent/ProxyAdmin.sol) | - | [`0xDb00...9CE`](https://basescan.org/address/0xDb0052E272D1D126617c36A9D6d65C801d1549CE) | |
| [`Pauser Multisig`](https://github.com/safe-global/safe-contracts/blob/v1.3.0/contracts/GnosisSafe.sol) | [`0x1a051eF1524cbaEa57Ca04319ef93fE78903D5E6`](https://basescan.org/address/0x1a051eF1524cbaEa57Ca04319ef93fE78903D5E6) | - | |
| [`Operations Multisig`](https://github.com/safe-global/safe-contracts/blob/v1.3.0/contracts/GnosisSafe.sol) | [`0x8eD55c7640497Db15aC32c698c1a06E2E604d865`](https://basescan.org/address/0x8eD55c7640497Db15aC32c698c1a06E2E604d865) | - | |
| [`Protocol Council Multisig`](https://github.com/safe-global/safe-contracts/blob/v1.3.0/contracts/GnosisSafe.sol) | [`0x841B988aaEafce13b6456ff34015FBc42Aedb7e6`](https://basescan.org/address/0x841B988aaEafce13b6456ff34015FBc42Aedb7e6) | - | |
| [`Community Multisig`](https://github.com/safe-global/safe-contracts/blob/v1.3.0/contracts/GnosisSafe.sol) | [`0xC107547924C7D1d3E2d10eA8DF534BBfC5F373e6`](https://basescan.org/address/0xC107547924C7D1d3E2d10eA8DF534BBfC5F373e6) | - | |
| [`Executor Multisig`](https://github.com/safe-global/safe-contracts/blob/v1.3.0/contracts/GnosisSafe.sol) | [`0x5d808608Ad70873ca4dE50F83416264dc15264C2`](https://basescan.org/address/0x5d808608Ad70873ca4dE50F83416264dc15264C2) | - | |
| [`Multichain Deployer Multisig`](https://github.com/safe-global/safe-contracts/blob/v1.3.0/contracts/GnosisSafe.sol) | [`0xa3053EF25F1F7d9D55a7655372B8a31D0f40eCA9`](https://basescan.org/address/0xa3053EF25F1F7d9D55a7655372B8a31D0f40eCA9) | - | |

</details>



<details>
    <summary>Testnet Sepolia</summary>


You can view the deployed contract addresses below, or check out the code itself on the [`testnet-sepolia`](https://github.com/Layr-Labs/eigenlayer-contracts/tree/testnet-sepolia) branch.

###### Core

| Name | Proxy | Implementation | Notes |
| -------- | -------- | -------- | -------- |
| [`DelegationManager`](https://github.com/Layr-Labs/eigenlayer-contracts/blob/v1.5.0/src/contracts/core/DelegationManager.sol) | [`0xD4A7E1Bd8015057293f0D0A557088c286942e84b`](https://sepolia.etherscan.io/address/0xD4A7E1Bd8015057293f0D0A557088c286942e84b) | [`0xa982...1b823`](https://sepolia.etherscan.io/address/0xa9821F0620D347648f375c597761C7FD16C1b823) | Proxy: [`TUP@4.9.0`](https://github.com/OpenZeppelin/openzeppelin-contracts/blob/v4.9.0/contracts/proxy/transparent/TransparentUpgradeableProxy.sol) |
| [`StrategyManager`](https://github.com/Layr-Labs/eigenlayer-contracts/blob/v1.5.0/src/contracts/core/StrategyManager.sol) | [`0x2E3D6c0744b10eb0A4e6F679F71554a39Ec47a5D`](https://sepolia.etherscan.io/address/0x2E3D6c0744b10eb0A4e6F679F71554a39Ec47a5D) | [`0xf0A8...FCB3`](https://sepolia.etherscan.io/address/0xf0A8735c26121e6C488ebac65c8fa3fe37cBFCB3) | Proxy: [`TUP@4.9.0`](https://github.com/OpenZeppelin/openzeppelin-contracts/blob/v4.9.0/contracts/proxy/transparent/TransparentUpgradeableProxy.sol) |
| [`EigenPodManager`](https://github.com/Layr-Labs/eigenlayer-contracts/blob/v1.5.0/src/contracts/pods/EigenPodManager.sol) | [`0x56BfEb94879F4543E756d26103976c567256034a`](https://sepolia.etherscan.io/address/0x56BfEb94879F4543E756d26103976c567256034a) | [`0x1084...88Ae`](https://sepolia.etherscan.io/address/0x10848d61cE044bcAEE301a28A4C30Ad0a40e88Ae) | Proxy: [`TUP@4.9.0`](https://github.com/OpenZeppelin/openzeppelin-contracts/blob/v4.9.0/contracts/proxy/transparent/TransparentUpgradeableProxy.sol) | All EigenPod functionality is paused on Sepolia | 
| [`AVSDirectory`](https://github.com/Layr-Labs/eigenlayer-contracts/blob/v1.3.0/src/contracts/core/AVSDirectory.sol) | [`0xa789c91ECDdae96865913130B786140Ee17aF545`](https://sepolia.etherscan.io/address/0xa789c91ECDdae96865913130B786140Ee17aF545) | [`0xD88b...C188`](https://sepolia.etherscan.io/address/0xD88b96998325c3e74A74a0B0938BBFeA1395C188) | Proxy: [`TUP@4.9.0`](https://github.com/OpenZeppelin/openzeppelin-contracts/blob/v4.9.0/contracts/proxy/transparent/TransparentUpgradeableProxy.sol) |
| [`RewardsCoordinator`](https://github.com/Layr-Labs/eigenlayer-contracts/blob/v1.3.0/src/contracts/core/RewardsCoordinator.sol) | [`0x5ae8152fb88c26ff9ca5C014c94fca3c68029349`](https://sepolia.etherscan.io/address/0x5ae8152fb88c26ff9ca5C014c94fca3c68029349) | [`0xcC30...7940`](https://sepolia.etherscan.io/address/0xcC305562B01bec562D13A40ef8781e313AFE7940) | Proxy: [`TUP@4.9.0`](https://github.com/OpenZeppelin/openzeppelin-contracts/blob/v4.9.0/contracts/proxy/transparent/TransparentUpgradeableProxy.sol) |
| [`AllocationManager`](https://github.com/Layr-Labs/eigenlayer-contracts/blob/v1.5.0/src/contracts/core/AllocationManager.sol) | [`0x42583067658071247ec8CE0A516A58f682002d07`](https://sepolia.etherscan.io/address/0x42583067658071247ec8CE0A516A58f682002d07) | [`0xB87A...7Db7`](https://sepolia.etherscan.io/address/0xB87AeeA46BB3a3050D277272E33b011922537Db7) | Proxy: [`TUP@4.9.0`](https://github.com/OpenZeppelin/openzeppelin-contracts/blob/v4.9.0/contracts/proxy/transparent/TransparentUpgradeableProxy.sol) |
| [`PermissionController`](https://github.com/Layr-Labs/eigenlayer-contracts/blob/v1.3.0/src/contracts/permissions/PermissionController.sol) | [`0x44632dfBdCb6D3E21EF613B0ca8A6A0c618F5a37`](https://sepolia.etherscan.io/address/0x44632dfBdCb6D3E21EF613B0ca8A6A0c618F5a37) | [`0x59B1...f525`](https://sepolia.etherscan.io/address/0x59B11b191B572888703E150E45F5015e0fFcf525) | Proxy: [`TUP@4.9.0`](https://github.com/OpenZeppelin/openzeppelin-contracts/blob/v4.9.0/contracts/proxy/transparent/TransparentUpgradeableProxy.sol) |
| [`KeyRegistrar`](https://github.com/Layr-Labs/eigenlayer-contracts/blob/v1.8.0-testnet-final/src/contracts/permissions/KeyRegistrar.sol) | [`0xA4dB30D08d8bbcA00D40600bee9F029984dB162a`](https://sepolia.etherscan.io/address/0xA4dB30D08d8bbcA00D40600bee9F029984dB162a) | [`0xd3b7...21c3`](https://sepolia.etherscan.io/address/0xd3b7f85e3f289c601fb808b0d7d366e2dfff21c3) | Proxy: [`TUP@4.9.0`](https://github.com/OpenZeppelin/openzeppelin-contracts/blob/v4.9.0/contracts/proxy/transparent/TransparentUpgradeableProxy.sol) |

###### Strategies

Anyone can deploy and whitelist strategies for standard ERC20s by using the `StrategyFactory` deployed to the address below (see [docs](./docs/core/StrategyManager.md#strategyfactorydeploynewstrategy)). Strategies deployed from the `StrategyFactory` are deployed using the beacon proxy pattern:

| Name | Proxy | Implementation | Notes |
| -------- | -------- | -------- | -------- | 
| [`StrategyFactory`](https://github.com/Layr-Labs/eigenlayer-contracts/blob/v1.3.0/src/contracts/strategies/StrategyFactory.sol) | [`0x066cF95c1bf0927124DFB8B02B401bc23A79730D`](https://sepolia.etherscan.io/address/0x066cF95c1bf0927124DFB8B02B401bc23A79730D) | [`0xEE41...ca1A`](https://sepolia.etherscan.io/address/0xEE41826B7D5B89e7F5eED6a831b4eFD69FC9ca1A) | Proxy: [`TUP@4.9.0`](https://github.com/OpenZeppelin/openzeppelin-contracts/blob/v4.9.0/contracts/proxy/transparent/TransparentUpgradeableProxy.sol) |
| [`StrategyBase`](https://github.com/Layr-Labs/eigenlayer-contracts/blob/v1.5.0/src/contracts/strategies/StrategyBase.sol) | [`0x427e627Bc7E83cac0f84337d3Ad94230C32697D3`](https://sepolia.etherscan.io/address/0x427e627Bc7E83cac0f84337d3Ad94230C32697D3) | [`0x3BA4...a43b`](https://sepolia.etherscan.io/address/0x3BA4F6973D9ed2f0617C4b15d8CE06155fd6a43b) | - Beacon: [`BeaconProxy`](https://github.com/OpenZeppelin/openzeppelin-contracts/blob/v4.7.0/contracts/proxy/beacon/BeaconProxy.sol) <br />- Strategies: [`UpgradeableBeacon`](https://github.com/OpenZeppelin/openzeppelin-contracts/blob/v4.4.1/contracts/proxy/beacon/UpgradeableBeacon.sol) |
| [`StETH Strategy`](https://github.com/Layr-Labs/eigenlayer-contracts/blob/v1.5.0/src/contracts/strategies/StrategyBase.sol) | [`0x8b29d91e67b013e855EaFe0ad704aC4Ab086a574`](https://sepolia.etherscan.io/address/0x8b29d91e67b013e855EaFe0ad704aC4Ab086a574) | [`0x3BA4...a43b`](https://sepolia.etherscan.io/address/0x3BA4F6973D9ed2f0617C4b15d8CE06155fd6a43b) | Strategy Factory deployed |
| [`WETH Strategy`](https://github.com/Layr-Labs/eigenlayer-contracts/blob/v1.5.0/src/contracts/strategies/StrategyBase.sol) | [`0x424246eF71b01ee33aA33aC590fd9a0855F5eFbc`](https://sepolia.etherscan.io/address/0x424246eF71b01ee33aA33aC590fd9a0855F5eFbc) | [`0x3BA4...a43b`](https://sepolia.etherscan.io/address/0x3BA4F6973D9ed2f0617C4b15d8CE06155fd6a43b) | Strategy Factory deployed |

###### Strategies - Special

The following strategies differ significantly from the other strategies deployed/used above:

| Name | Proxy | Implementation | Notes |
| -------- | -------- | -------- | -------- |
| [`EigenStrategy (EIGEN)`](https://github.com/Layr-Labs/eigenlayer-contracts/blob/v1.5.0/src/contracts/strategies/EigenStrategy.sol) | [`0x8E93249a6C37a32024756aaBd813E6139b17D1d5`](https://sepolia.etherscan.io/address/0x8E93249a6C37a32024756aaBd813E6139b17D1d5) | [`0x5351...52B7`](https://sepolia.etherscan.io/address/0x535185d24cD1B2e4F7afDe4ee39CF717c00B52B7) | Proxy: [`TUP@4.9.0`](https://github.com/OpenZeppelin/openzeppelin-contracts/blob/v4.9.0/contracts/proxy/transparent/TransparentUpgradeableProxy.sol) |
| `Beacon Chain ETH` | `0xbeaC0eeEeeeeEEeEeEEEEeeEEeEeeeEeeEEBEaC0` | - | - Used for Beacon Chain ETH shares <br />- Not a real contract! |

###### EigenPods

**NOTE: Due to the permissioned validator set on Sepolia, all EigenPod functionality is *PAUSED*.**

| Name | Proxy | Implementation | Notes |
| -------- | -------- | -------- | -------- | 
| [`EigenPod (beacon)`](https://github.com/Layr-Labs/eigenlayer-contracts/blob/v1.6.0/src/contracts/pods/EigenPod.sol) | [`0x0e19E56E41D42137d00dD4f51EC2F613E50cAcf4`](https://sepolia.etherscan.io/address/0x0e19E56E41D42137d00dD4f51EC2F613E50cAcf4) | [`0x1073...b40e`](https://sepolia.etherscan.io/address/0x107339987a46F77598cB563bf63eb8a1C9f5b40e) | - Beacon: [`BeaconProxy`](https://github.com/OpenZeppelin/openzeppelin-contracts/blob/v4.4.1/contracts/proxy/beacon/BeaconProxy.sol) <br />- Pods: [`UpgradeableBeacon`](https://github.com/OpenZeppelin/openzeppelin-contracts/blob/v4.4.1/contracts/proxy/beacon/UpgradeableBeacon.sol) |

###### EIGEN/bEIGEN

| Name | Proxy | Implementation | Notes |
| -------- | -------- | -------- | -------- | 
| [`Eigen`](https://github.com/Layr-Labs/eigenlayer-contracts/blob/v1.6.0/src/contracts/token/Eigen.sol) | [`0x0011FA2c512063C495f77296Af8d195F33A8Dd38`](https://sepolia.etherscan.io/address/0x0011FA2c512063C495f77296Af8d195F33A8Dd38) | [`0x7ec6...BD6F`](https://sepolia.etherscan.io/address/0x7ec6a02235Bf8d8a1fDB894AD2E1573192bfBD6F) | Proxy: [`TUP@4.9.0`](https://github.com/OpenZeppelin/openzeppelin-contracts/blob/v4.9.0/contracts/proxy/transparent/TransparentUpgradeableProxy.sol) |
| [`Backing Eigen`](https://github.com/Layr-Labs/eigenlayer-contracts/blob/v1.3.0/src/contracts/token/BackingEigen.sol) | [`0xc5B857A92245f64e9D90cCc5b096Db82eB77eB5c`](https://sepolia.etherscan.io/address/0xc5B857A92245f64e9D90cCc5b096Db82eB77eB5c) | [`0x1298...3173`](https://sepolia.etherscan.io/address/0x12988B679AA497C30A8D1850eCC4Dc7700383173) | Proxy: [`TUP@4.9.0`](https://github.com/OpenZeppelin/openzeppelin-contracts/blob/v4.9.0/contracts/proxy/transparent/TransparentUpgradeableProxy.sol) |

###### AVS

The following contracts are used by AVSs.

| Name | Proxy | Implementation | Notes |
| -------- | -------- | -------- | -------- |
| [`ReleaseManager`](https://github.com/Layr-Labs/eigenlayer-contracts/blob/v1.8.0-testnet-final/src/contracts/core/ReleaseManager.sol) | [`0x59c8D715DCa616e032B744a753C017c9f3E16bf4`](https://sepolia.etherscan.io/address/0x59c8D715DCa616e032B744a753C017c9f3E16bf4) | [`0x5e3f...71d9`](https://sepolia.etherscan.io/address/0x5e3f88341830d01d34971b12179f1ec270fc71d9) | Proxy: [`TUP@4.9.0`](https://github.com/OpenZeppelin/openzeppelin-contracts/blob/v4.9.0/contracts/proxy/transparent/TransparentUpgradeableProxy.sol) |
| [`TaskMailbox`](https://github.com/Layr-Labs/eigenlayer-contracts/blob/v1.8.0-testnet-final/src/contracts/avs/task/TaskMailbox.sol) | [`0xB99CC53e8db7018f557606C2a5B066527bF96b26`](https://sepolia.etherscan.io/address/0xB99CC53e8db7018f557606C2a5B066527bF96b26) | [`0x005d...4888`](https://sepolia.etherscan.io/address/0x005d147a956c5d8114c630a3a23a203d48334888) | Proxy: [`TUP@4.9.0`](https://github.com/OpenZeppelin/openzeppelin-contracts/blob/v4.9.0/contracts/proxy/transparent/TransparentUpgradeableProxy.sol) |

###### Multichain - Source

The multichain protocol expects AVSs to register on the source chain. AVS's stakes are then transported to supported destination chains. For the sepolia network, the destination chains are sepolia and base-sepolia. 

| Name | Proxy | Implementation | Notes |
| -------- | -------- | -------- | -------- |
| [`CrossChainRegistry`](https://github.com/Layr-Labs/eigenlayer-contracts/blob/v1.8.0-testnet-final/src/contracts/multichain/source/CrossChainRegistry.sol) | [`0x287381B1570d9048c4B4C7EC94d21dDb8Aa1352a`](https://sepolia.etherscan.io/address/0x287381B1570d9048c4B4C7EC94d21dDb8Aa1352a) | [`0x8f62...119c`](https://sepolia.etherscan.io/address/0x8f622596e0d98a840c8e5da1d257a701c9d8119c) | Proxy: [`TUP@4.9.0`](https://github.com/OpenZeppelin/openzeppelin-contracts/blob/v4.9.0/contracts/proxy/transparent/TransparentUpgradeableProxy.sol) |

###### Multichain - Destination

| Name | Proxy | Implementation | Notes |
| -------- | -------- | -------- | -------- |
| [`OperatorTableUpdater`](https://github.com/Layr-Labs/eigenlayer-contracts/blob/v1.8.0-testnet-final/src/contracts/multichain/destination/OperatorTableUpdater.sol) | [`0xB02A15c6Bd0882b35e9936A9579f35FB26E11476`](https://sepolia.etherscan.io/address/0xB02A15c6Bd0882b35e9936A9579f35FB26E11476) | [`0xfd85...df7d`](https://sepolia.etherscan.io/address/0xfd859cf6ce0e7e3b37e637edf699f2f87f78df7d) | Proxy: [`TUP@4.9.0`](https://github.com/OpenZeppelin/openzeppelin-contracts/blob/v4.9.0/contracts/proxy/transparent/TransparentUpgradeableProxy.sol) |
| [`ECDSACertificateVerifier`](https://github.com/Layr-Labs/eigenlayer-contracts/blob/v1.8.0-testnet-final/src/contracts/multichain/destination/ECDSACertificateVerifier.sol) | [`0xb3Cd1A457dEa9A9A6F6406c6419B1c326670A96F`](https://sepolia.etherscan.io/address/0xb3Cd1A457dEa9A9A6F6406c6419B1c326670A96F) | [`0xb5b2...2a90`](https://sepolia.etherscan.io/address/0xb5b2179c0c58ae285a02c1390dbaf28651902a90) | Proxy: [`TUP@4.9.0`](https://github.com/OpenZeppelin/openzeppelin-contracts/blob/v4.9.0/contracts/proxy/transparent/TransparentUpgradeableProxy.sol) |
| [`BN254CertificateVerifier`](https://github.com/Layr-Labs/eigenlayer-contracts/blob/v1.8.0-testnet-final/src/contracts/multichain/destination/BN254CertificateVerifier.sol) | [`0xff58A373c18268F483C1F5cA03Cf885c0C43373a`](https://sepolia.etherscan.io/address/0xff58A373c18268F483C1F5cA03Cf885c0C43373a) | [`0x157a...6180`](https://sepolia.etherscan.io/address/0x157a9f3e97c7688372617262239aa3b8fd3b6180) | Proxy: [`TUP@4.9.0`](https://github.com/OpenZeppelin/openzeppelin-contracts/blob/v4.9.0/contracts/proxy/transparent/TransparentUpgradeableProxy.sol) |

###### Multisigs

| Name | Proxy | Implementation | Notes |
| -------- | -------- | -------- | -------- | 
| [`PauserRegistry`](https://github.com/Layr-Labs/eigenlayer-contracts/blob/v1.3.0/src/contracts/permissions/PauserRegistry.sol) | - | [`0x63AA...20f3`](https://sepolia.etherscan.io/address/0x63AAe451780090f50Ad323aAEF155F63a29D20f3) | |
| [`OZ: TimelockController`](https://github.com/OpenZeppelin/openzeppelin-contracts/blob/release-v4.7/contracts/governance/TimelockController.sol) | - | [`0x1BEF...1b5B`](https://sepolia.etherscan.io/address/0x1BEF05C7303d44e0E2FCD2A19d993eDEd4c51b5B) | |
| [`OZ: Proxy Admin`](https://github.com/OpenZeppelin/openzeppelin-contracts/blob/v4.7.1/contracts/proxy/transparent/ProxyAdmin.sol) | - | [`0x56E8...6Fa1`](https://sepolia.etherscan.io/address/0x56E88cb4f0136fC27D95499dE4BE2acf47946Fa1) | |
| [`Pauser Multisig`](https://github.com/safe-global/safe-contracts/blob/v1.3.0/contracts/GnosisSafe.sol) | [`0x0B415f75980D863872C3eb8caa76E6eC8Bc81536`](https://sepolia.etherscan.io/address/0x0B415f75980D863872C3eb8caa76E6eC8Bc81536) | [`0x4167...461a`](https://sepolia.etherscan.io/address/0xd9db270c1b5e3bd161e8c8503c55ceabee709552) | Proxy: [`Gnosis@1.3.0`](https://github.com/safe-global/safe-contracts/blob/v1.3.0/contracts/proxies/GnosisSafeProxy.sol) |
| [`Community Multisig`](https://github.com/safe-global/safe-contracts/blob/v1.3.0/contracts/GnosisSafe.sol) | [`0x6f8459810197cc9fE123BBeB918451757a4fBAc6`](https://sepolia.etherscan.io/address/0x6f8459810197cc9fE123BBeB918451757a4fBAc6) | [`0x4167...461a`](https://sepolia.etherscan.io/address/0xd9db270c1b5e3bd161e8c8503c55ceabee709552) | Proxy: [`Gnosis@1.3.0`](https://github.com/safe-global/safe-contracts/blob/v1.3.0/contracts/proxies/GnosisSafeProxy.sol) |
| [`Executor Multisig`](https://github.com/safe-global/safe-contracts/blob/v1.3.0/contracts/GnosisSafe.sol) | [`0x4FDA8998EC3b7d4b4A612d45FeB8fB36734470f2`](https://sepolia.etherscan.io/address/0x4FDA8998EC3b7d4b4A612d45FeB8fB36734470f2) | [`0x4167...461a`](https://sepolia.etherscan.io/address/0xd9db270c1b5e3bd161e8c8503c55ceabee709552) | Proxy: [`Gnosis@1.3.0`](https://github.com/safe-global/safe-contracts/blob/v1.3.0/contracts/proxies/GnosisSafeProxy.sol) |
| [`Operations Multisig`](https://github.com/safe-global/safe-contracts/blob/v1.3.0/contracts/GnosisSafe.sol) | [`0xb094Ba769b4976Dc37fC689A76675f31bc4923b0`](https://sepolia.etherscan.io/address/0xb094Ba769b4976Dc37fC689A76675f31bc4923b0) | [`0x4167...461a`](https://sepolia.etherscan.io/address/0x41675C099F32341bf84BFc5382aF534df5C7461a) | Proxy: [`Gnosis@1.3.0`](https://github.com/safe-global/safe-contracts/blob/v1.3.0/contracts/proxies/GnosisSafeProxy.sol) |

</details>



<details>
    <summary>Testnet Hoodi</summary>


You can view the deployed contract addresses below, or check out the code itself on the [`testnet-hoodi`](https://github.com/Layr-Labs/eigenlayer-contracts/tree/testnet-hoodi) branch.

###### Core

| Name | Proxy | Implementation | Notes |
| -------- | -------- | -------- | -------- |
| [`DelegationManager`](https://github.com/Layr-Labs/eigenlayer-contracts/blob/v1.5.0/src/contracts/core/DelegationManager.sol) | [`0x867837a9722C512e0862d8c2E15b8bE220E8b87d`](https://hoodi.etherscan.io/address/0x867837a9722C512e0862d8c2E15b8bE220E8b87d) | [`0xcC30...7940`](https://hoodi.etherscan.io/address/0xcC305562B01bec562D13A40ef8781e313AFE7940) | Proxy: [`TUP@4.9.0`](https://github.com/OpenZeppelin/openzeppelin-contracts/blob/v4.9.0/contracts/proxy/transparent/TransparentUpgradeableProxy.sol) |
| [`StrategyManager`](https://github.com/Layr-Labs/eigenlayer-contracts/blob/v1.5.0/src/contracts/core/StrategyManager.sol) | [`0xeE45e76ddbEDdA2918b8C7E3035cd37Eab3b5D41`](https://hoodi.etherscan.io/address/0xeE45e76ddbEDdA2918b8C7E3035cd37Eab3b5D41) | [`0x742A...27b`](https://hoodi.etherscan.io/address/0x742A228482701d693061BfE9C5B3Eb3959Ea927b) | Proxy: [`TUP@4.9.0`](https://github.com/OpenZeppelin/openzeppelin-contracts/blob/v4.9.0/contracts/proxy/transparent/TransparentUpgradeableProxy.sol) |
| [`EigenPodManager`](https://github.com/Layr-Labs/eigenlayer-contracts/blob/v1.5.0/src/contracts/pods/EigenPodManager.sol) | [`0xcd1442415Fc5C29Aa848A49d2e232720BE07976c`](https://hoodi.etherscan.io/address/0xcd1442415Fc5C29Aa848A49d2e232720BE07976c) | [`0x59B1...f525`](https://hoodi.etherscan.io/address/0x59B11b191B572888703E150E45F5015e0fFcf525) | Proxy: [`TUP@4.9.0`](https://github.com/OpenZeppelin/openzeppelin-contracts/blob/v4.9.0/contracts/proxy/transparent/TransparentUpgradeableProxy.sol) |
| [`AVSDirectory`](https://github.com/Layr-Labs/eigenlayer-contracts/blob/v1.3.0/src/contracts/core/AVSDirectory.sol) | [`0xD58f6844f79eB1fbd9f7091d05f7cb30d3363926`](https://hoodi.etherscan.io/address/0xD58f6844f79eB1fbd9f7091d05f7cb30d3363926) | [`0xd290...Ed5c`](https://hoodi.etherscan.io/address/0xd2905B858cA5Ded115B61dd9E98F7dcF9aEE2d5c) | Proxy: [`TUP@4.9.0`](https://github.com/OpenZeppelin/openzeppelin-contracts/blob/v4.9.0/contracts/proxy/transparent/TransparentUpgradeableProxy.sol) |
| [`RewardsCoordinator`](https://github.com/Layr-Labs/eigenlayer-contracts/blob/v1.3.0/src/contracts/core/RewardsCoordinator.sol) | [`0x29e8572678e0c272350aa0b4B8f304E47EBcd5e7`](https://hoodi.etherscan.io/address/0x29e8572678e0c272350aa0b4B8f304E47EBcd5e7) | [`0xe786...832`](https://hoodi.etherscan.io/address/0xe786FD0dE8a6001772386700318187Dc438a2832) | Proxy: [`TUP@4.9.0`](https://github.com/OpenZeppelin/openzeppelin-contracts/blob/v4.9.0/contracts/proxy/transparent/TransparentUpgradeableProxy.sol) |
| [`AllocationManager`](https://github.com/Layr-Labs/eigenlayer-contracts/blob/v1.5.0/src/contracts/core/AllocationManager.sol) | [`0x95a7431400F362F3647a69535C5666cA0133CAA0`](https://hoodi.etherscan.io/address/0x95a7431400F362F3647a69535C5666cA0133CAA0) | [`0x8b1D...11a0`](https://hoodi.etherscan.io/address/0x8b1DBbAa79507CD6b6e1d9FBe90E3FB18EFf11a0) | Proxy: [`TUP@4.9.0`](https://github.com/OpenZeppelin/openzeppelin-contracts/blob/v4.9.0/contracts/proxy/transparent/TransparentUpgradeableProxy.sol) |
| [`PermissionController`](https://github.com/Layr-Labs/eigenlayer-contracts/blob/v1.3.0/src/contracts/permissions/PermissionController.sol) | [`0xdcCF401fD121d8C542E96BC1d0078884422aFAD2`](https://hoodi.etherscan.io/address/0xdcCF401fD121d8C542E96BC1d0078884422aFAD2) | [`0x2D73...A27`](https://hoodi.etherscan.io/address/0x2D731E7993a100afd19454B98eEEC7b90366eA27) | Proxy: [`TUP@4.9.0`](https://github.com/OpenZeppelin/openzeppelin-contracts/blob/v4.9.0/contracts/proxy/transparent/TransparentUpgradeableProxy.sol) |


###### Strategies

Anyone can deploy and whitelist strategies for standard ERC20s by using the `StrategyFactory` deployed to the address below (see [docs](./docs/core/StrategyManager.md#strategyfactorydeploynewstrategy)). Strategies deployed from the `StrategyFactory` are deployed using the beacon proxy pattern:

| Name | Proxy | Implementation | Notes |
| -------- | -------- | -------- | -------- | 
| [`StrategyFactory`](https://github.com/Layr-Labs/eigenlayer-contracts/blob/v1.4.1/src/contracts/strategies/StrategyFactory.sol) | [`0xfB7d94501E4d4ACC264833Ef4ede70a11517422B`](https://hoodi.etherscan.io/address/0xfB7d94501E4d4ACC264833Ef4ede70a11517422B) | [`0x798E...7216`](https://hoodi.etherscan.io/address/0x798EB817B7C109c6780264D5161183809C817216) | Proxy: [`TUP@4.9.0`](https://github.com/OpenZeppelin/openzeppelin-contracts/blob/v4.9.0/contracts/proxy/transparent/TransparentUpgradeableProxy.sol) |
| [`StrategyBase`](https://github.com/Layr-Labs/eigenlayer-contracts/blob/v1.5.0/src/contracts/strategies/StrategyBase.sol) | [`0x6d28cEC1659BC3a9BC814c3EFc1412878B406579`](https://hoodi.etherscan.io/address/0x6d28cEC1659BC3a9BC814c3EFc1412878B406579) | [`0x6514...2D6F`](https://hoodi.etherscan.io/address/0x65147e9916152C1EbdBaD8A6f3e145b4BDeE2D6F) | - Beacon: [`BeaconProxy`](https://github.com/OpenZeppelin/openzeppelin-contracts/blob/v4.7.0/contracts/proxy/beacon/BeaconProxy.sol) <br />- Strategies: [`UpgradeableBeacon`](https://github.com/OpenZeppelin/openzeppelin-contracts/blob/v4.4.1/contracts/proxy/beacon/UpgradeableBeacon.sol) |
| [`StETH Strategy`](https://github.com/Layr-Labs/eigenlayer-contracts/blob/v1.5.0/src/contracts/strategies/StrategyBase.sol) | [`0xf8a1a66130d614c7360e868576d5e59203475fe0`](https://hoodi.etherscan.io/address/0xf8a1a66130d614c7360e868576d5e59203475fe0) | [`0x6514...2D6F`](https://hoodi.etherscan.io/address/0x65147e9916152C1EbdBaD8A6f3e145b4BDeE2D6F) | Strategy Factory deployed |
| [`WETH Strategy`](https://github.com/Layr-Labs/eigenlayer-contracts/blob/v1.5.0/src/contracts/strategies/StrategyBase.sol) | [`0x24579aD4fe83aC53546E5c2D3dF5F85D6383420d`](https://hoodi.etherscan.io/address/0x24579aD4fe83aC53546E5c2D3dF5F85D6383420d) | [`0x6514...2D6F`](https://hoodi.etherscan.io/address/0x65147e9916152C1EbdBaD8A6f3e145b4BDeE2D6F) | Strategy Factory deployed |

###### Strategies - Special

The following strategies differ significantly from the other strategies deployed/used above:

| Name | Proxy | Implementation | Notes |
| -------- | -------- | -------- | -------- |
| [`EigenStrategy (EIGEN)`](https://github.com/Layr-Labs/eigenlayer-contracts/blob/v1.5.0/src/contracts/strategies/EigenStrategy.sol) | [`0xB27b10291DBFE6576d17afF3e251c954Ae14f1D3`](https://hoodi.etherscan.io/address/0xB27b10291DBFE6576d17afF3e251c954Ae14f1D3) | [`0xEE41...ca1A`](https://hoodi.etherscan.io/address/0xEE41826B7D5B89e7F5eED6a831b4eFD69FC9ca1A) | Proxy: [`TUP@4.9.0`](https://github.com/OpenZeppelin/openzeppelin-contracts/blob/v4.9.0/contracts/proxy/transparent/TransparentUpgradeableProxy.sol) |
| `Beacon Chain ETH` | `0xbeaC0eeEeeeeEEeEeEEEEeeEEeEeeeEeeEEBEaC0` | - | - Used for Beacon Chain ETH shares <br />- Not a real contract! |

###### EigenPods

| Name | Proxy | Implementation | Notes |
| -------- | -------- | -------- | -------- | 
| [`EigenPod (beacon)`](https://github.com/Layr-Labs/eigenlayer-contracts/blob/v1.6.0/src/contracts/pods/EigenPod.sol) | [`0x5e1577f8efB21b229cD5Eb4C5Aa3d6C4b228f650`](https://hoodi.etherscan.io/address/0x5e1577f8efB21b229cD5Eb4C5Aa3d6C4b228f650) | [`0x2D6c...2869`](https://hoodi.etherscan.io/address/0x2D6c7f9862BD80Cf0d9d93FC6b513D69E7Db7869) | - Beacon: [`BeaconProxy`](https://github.com/OpenZeppelin/openzeppelin-contracts/blob/v4.4.1/contracts/proxy/beacon/BeaconProxy.sol) <br />- Pods: [`UpgradeableBeacon`](https://github.com/OpenZeppelin/openzeppelin-contracts/blob/v4.4.1/contracts/proxy/beacon/UpgradeableBeacon.sol) |

###### EIGEN/bEIGEN

| Name | Proxy | Implementation | Notes |
| -------- | -------- | -------- | -------- | 
| [`Eigen`](https://github.com/Layr-Labs/eigenlayer-contracts/blob/v1.6.0/src/contracts/token/Eigen.sol) | [`0x8ae2520954db7D80D66835cB71E692835bbA45bf`](https://hoodi.etherscan.io/address/0x8ae2520954db7D80D66835cB71E692835bbA45bf) | [`0x68F3...2FE9`](https://hoodi.etherscan.io/address/0x68F3E0B02b15F96B50aC73d7680F020B646D2FE9) | Proxy: [`TUP@4.9.0`](https://github.com/OpenZeppelin/openzeppelin-contracts/blob/v4.9.0/contracts/proxy/transparent/TransparentUpgradeableProxy.sol) |
| [`Backing Eigen`](https://github.com/Layr-Labs/eigenlayer-contracts/blob/v1.3.0/src/contracts/token/BackingEigen.sol) | [`0x6e60888132Cc7e637488379B4B40c42b3751f63a`](https://hoodi.etherscan.io/address/0x6e60888132Cc7e637488379B4B40c42b3751f63a) | [`0x43e4...1C4`](https://hoodi.etherscan.io/address/0x43e4940aCeb1C1F5a57e307EEB212007F0f6a1C4) | Proxy: [`TUP@4.9.0`](https://github.com/OpenZeppelin/openzeppelin-contracts/blob/v4.9.0/contracts/proxy/transparent/TransparentUpgradeableProxy.sol) |

###### Multisigs

| Name | Proxy | Implementation | Notes |
| -------- | -------- | -------- | -------- | 
| [`PauserRegistry`](https://github.com/Layr-Labs/eigenlayer-contracts/blob/v1.4.1/src/contracts/permissions/PauserRegistry.sol) | - | [`0x64D7...c13D`](https://hoodi.etherscan.io/address/0x64D78399B0fa32EA72959f33edCF313159F3c13D) | |
| [`OZ: TimelockController`](https://github.com/OpenZeppelin/openzeppelin-contracts/blob/release-v4.7/contracts/governance/TimelockController.sol) | - | [`0xE332...2d15`](https://hoodi.etherscan.io/address/0xE3328cb5068924119d6170496c4AB2dD12c12d15) | |
| [`OZ: Proxy Admin`](https://github.com/OpenZeppelin/openzeppelin-contracts/blob/v4.9.0/contracts/proxy/transparent/ProxyAdmin.sol) | - | [`0xE7f4...2257`](https://hoodi.etherscan.io/address/0xE7f4E30D2619273468afe9EC0Acf805E55532257) | |

</details>



<details>
    <summary>Testnet Base Sepolia</summary>


**Note: Testnet Base Sepolia only supports verification of tasks from stake that lives on Sepolia. Standard core protocol functionality (restaking, slashing) does not exist on Base Sepolia.**

###### Multichain - Destination

| Name | Proxy | Implementation | Notes |
| -------- | -------- | -------- | -------- |
| [`OperatorTableUpdater`](https://github.com/Layr-Labs/eigenlayer-contracts/blob/v1.8.0-testnet-final/src/contracts/multichain/destination/OperatorTableUpdater.sol) | [`0xB02A15c6Bd0882b35e9936A9579f35FB26E11476`](https://sepolia.basescan.org/address/0xB02A15c6Bd0882b35e9936A9579f35FB26E11476) | [`0x1D4d...3e17C`](https://sepolia.basescan.org/address/0x1D4d6054BD11A5711ad7c5d3E376C987a603e17C) | Proxy: [`TUP@4.9.0`](https://github.com/OpenZeppelin/openzeppelin-contracts/blob/v4.9.0/contracts/proxy/transparent/TransparentUpgradeableProxy.sol) |
| [`ECDSACertificateVerifier`](https://github.com/Layr-Labs/eigenlayer-contracts/blob/v1.8.0-testnet-final/src/contracts/multichain/destination/ECDSACertificateVerifier.sol) | [`0xb3Cd1A457dEa9A9A6F6406c6419B1c326670A96F`](https://sepolia.basescan.org/address/0xb3Cd1A457dEa9A9A6F6406c6419B1c326670A96F) | [`0x3D8c...2A477`](https://sepolia.basescan.org/address/0x3D8c4Ac89040aa25168F32407274F239Ab52A477) | Proxy: [`TUP@4.9.0`](https://github.com/OpenZeppelin/openzeppelin-contracts/blob/v4.9.0/contracts/proxy/transparent/TransparentUpgradeableProxy.sol) |
| [`BN254CertificateVerifier`](https://github.com/Layr-Labs/eigenlayer-contracts/blob/v1.8.0-testnet-final/src/contracts/multichain/destination/BN254CertificateVerifier.sol) | [`0xff58A373c18268F483C1F5cA03Cf885c0C43373a`](https://sepolia.basescan.org/address/0xff58A373c18268F483C1F5cA03Cf885c0C43373a) | [`0x854d...f00b5`](https://sepolia.basescan.org/address/0x854dc9e5d011B060bf77B1a492302C349f2f00b5) | Proxy: [`TUP@4.9.0`](https://github.com/OpenZeppelin/openzeppelin-contracts/blob/v4.9.0/contracts/proxy/transparent/TransparentUpgradeableProxy.sol) |

###### AVS

The following contracts are used by AVSs.

| Name | Proxy | Implementation | Notes |
| -------- | -------- | -------- | -------- |
| [`TaskMailbox`](https://github.com/Layr-Labs/eigenlayer-contracts/blob/v1.8.0-testnet-final/src/contracts/avs/task/TaskMailbox.sol) | [`0xB99CC53e8db7018f557606C2a5B066527bF96b26`](https://sepolia.basescan.org/address/0xB99CC53e8db7018f557606C2a5B066527bF96b26) | [`0x0bf1...0E85`](https://sepolia.basescan.org/address/0x0bf1fD127176310375C4d8852066acbD4Fcf0E85) | Proxy: [`TUP@4.9.0`](https://github.com/OpenZeppelin/openzeppelin-contracts/blob/v4.9.0/contracts/proxy/transparent/TransparentUpgradeableProxy.sol) |

###### Multisigs

| Name | Proxy | Implementation | Notes |
| -------- | -------- | -------- | -------- | 
| [`PauserRegistry`](https://github.com/Layr-Labs/eigenlayer-contracts/blob/v1.7.0-rc.4/src/contracts/permissions/PauserRegistry.sol) | - | [`0x6ffE...672B`](https://sepolia.basescan.org/address/0x6ffE77C321a773e2A27B0B0a31C5e1bBda83672B) | |
| [`OZ: Proxy Admin`](https://github.com/OpenZeppelin/openzeppelin-contracts/blob/v4.9.0/contracts/proxy/transparent/ProxyAdmin.sol) | - | [`0xbe2F...0b5`](https://sepolia.basescan.org/address/0xbe2F96Efff467c6773Dc91eA62Ab34C73195a0b5) | |
| [`Pauser Multisig`](https://github.com/safe-global/safe-contracts/blob/v1.3.0/contracts/GnosisSafe.sol) | [`0x2DD9BDDf299C846f61C0105905f9a60ee99242d6`](https://sepolia.basescan.org/address/0x2DD9BDDf299C846f61C0105905f9a60ee99242d6) | - | |
| [`Operations Multisig`](https://github.com/safe-global/safe-contracts/blob/v1.3.0/contracts/GnosisSafe.sol) | [`0x4ACA7e09eF90612941A9185A6690Dbe9e39aae8f`](https://sepolia.basescan.org/address/0x4ACA7e09eF90612941A9185A6690Dbe9e39aae8f) | - | |
| [`Multichain Deployer Multisig`](https://github.com/safe-global/safe-contracts/blob/v1.3.0/contracts/GnosisSafe.sol) | [`0xA591635DE4C254BD3fa9C9Db9000eA6488344C28`](https://sepolia.basescan.org/address/0xA591635DE4C254BD3fa9C9Db9000eA6488344C28) | - | |

</details>

## Branching

Branches we use:
* `main`: The canonical, most up-to-date branch, containing the work-in-progress code for upcoming releases
* `Vx.y.z`: Release branch with version `x.y.z` that matches a release of EigenLayer, release branch is always cut from `main` via cherry-picking
* `release-dev/xxx`: A development branch for a large feature to be released, the branch should eventually be deleted after merge to `main`

## Building Apps & Services on EigenLayer

### Developer & User Basics

[Our documentation](https://docs.eigenlayer.xyz/) is a great place to start to understand EigenLayer and the Eigen ecosystem. If you are an audio/visual learner, check out the "[You Could've Invented EigenLayer](https://www.blog.eigenlayer.xyz/ycie/)" video. 

To understand more about how our ecosystem and its participants work, checkout the guides below. These are split out by who you are: AVS developers, restakers and Operators. All have different roles and interactioons with EigenLayer:

* [AVS Developer Guide](https://docs.eigenlayer.xyz/developers/Concepts/avs-developer-guide)
* [Operator Guide](https://docs.eigenlayer.xyz/operators/concepts/operator-introduction)
* [Restaker Guide](https://docs.eigenlayer.xyz/restakers/concepts/overview)

### Contract Docs & Deep Dive

The most up-to-date and technical documentation on our core contracts can be found in [/docs](/docs). If you're a shadowy super coder, this is a great place to get an overview of the contracts before diving into the code.

To learn more about interfacing with the EigenLayer core contracts onchain, see our [middleware repo.](https://github.com/Layr-Labs/eigenlayer-middleware)

To get an idea of how users interact with these contracts, check out our integration tests: [/src/test/integration](./src/test/integration/).

## Contribute to the Core

See [CONTRIBUTING](CONTRIBUTING.md). 

Contributions that do not follow our fork base PR practices will be either rejected or immediately deleted based on your role, preventing branch pollution, keeping our repository clean, make it more readable and searchable.
````

## File: slither.config.json
````json
{
    "detectors_to_exclude": "assembly,solc-version,naming-convention,incorrect-equality,uninitialized-local,timestamp,low-level-calls,unimplemented-functions,too-many-digits,similar-names,calls-loop,arbitrary-send-eth,reentrancy-no-eth,reentrancy-benign,reentrancy-events,unused-state,incorrect-shift-in-assembly,dead-code",
    "filter_paths": "lib/|test/|mocks/|BytesLib|script/",
    "solc_remaps": [
        "forge-std/=lib/forge-std/src/",
        "@openzeppelin/=lib/openzeppelin-contracts-v4.9.0/",
        "@openzeppelin-upgrades/=lib/openzeppelin-contracts-upgradeable-v4.9.0/",
        "ds-test/=lib/ds-test/src/"
    ],
    "compile_force_framework": "foundry"
}
````
