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
```
.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
    certora.yml
    checks.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
      AllocationManagerSanity.conf
      DelegationManager.conf
      DelegationManagerValidState.conf
      StrategyManager.conf
    permissions/
      Pausable.conf
    pods/
      EigenPodManagerRules.conf
    strategies/
      StrategyBase.conf
  harnesses/
    DelegationManagerHarness.sol
    EigenPodHarness.sol
    EigenPodManagerHarness.sol
    PausableHarness.sol
    ShortStringsUpgradeableHarness.sol
    StrategyManagerHarness.sol
    StructuredLinkedListHarness.sol
  mocks/
    CertoraAVSRegistrar.sol
  scripts/
    pods/
      verifyEigenPod.sh
      verifyEigenPodManager.sh
  specs/
    core/
      AllocationManagerRules.spec
      AllocationManagerSanity.spec
      AllocationManagerValidState.spec
      DelegationManager.spec
      DelegationManagerValidState.spec
      Slasher.spec
      StrategyManager.spec
    libraries/
      StructuredLinkedList.spec
    permissions/
      Pausable.spec
    pods/
      EigenPod.spec
      EigenPodManager.spec
      EigenPodManagerRules.spec
    strategies/
      StrategyBase.spec
    erc20cvl.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-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
    EigenPod.md
    EigenPodManager.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
    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
    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
    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
    IECDSACertificateVerifier/
      binding.go
    IEigen/
      binding.go
    IEigenPod/
      binding.go
    IEigenPodManager/
      binding.go
    IETHPOSDeposit/
      binding.go
    IKeyRegistrar/
      binding.go
    IOperatorTableCalculator/
      binding.go
    IOperatorTableUpdater/
      binding.go
    IPausable/
      binding.go
    IPauserRegistry/
      binding.go
    IPermissionController/
      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
    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
    Snapshots/
      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
    holesky.json
    mainnet.json
    preprod.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/
    update-generator/
      1-updateGenerator.s.sol
      README.md
      upgrade.json
    README.md
  releases/
    v1.7.0-v1.8.0-multichain-hourglass-combined/
      configs/
        mainnet.toml
        preprod.toml
        README.md
        testnet.toml
      1-deploySourceChain.s.sol
      2-deployDestinationChainProxies.s.sol
      3-deployDestinationChainImpls.s.sol
      4-instantiateDestinationChainProxies.s.sol
      5-configureCrossChainRegistry.s.sol
      upgrade.json
    v1.8.1-hourglass-testnet-replay-fix/
      1-deployTaskMailboxImpl.s.sol
      2-queueTaskMailboxUpgrade.s.sol
      3-executeTaskMailboxUpgrade.s.sol
      upgrade.json
    CrosschainDeployLib.sol
    Env.sol
    README.md
  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
snapshots/
  Integration_ALM_Multi.json
src/
  contracts/
    avs/
      task/
        TaskMailbox.sol
        TaskMailboxStorage.sol
    core/
      AllocationManager.sol
      AllocationManagerStorage.sol
      AVSDirectory.sol
      AVSDirectoryStorage.sol
      DelegationManager.sol
      DelegationManagerStorage.sol
      ReleaseManager.sol
      ReleaseManagerStorage.sol
      RewardsCoordinator.sol
      RewardsCoordinatorStorage.sol
      StrategyManager.sol
      StrategyManagerStorage.sol
    interfaces/
      IAllocationManager.sol
      IAVSDirectory.sol
      IAVSRegistrar.sol
      IAVSTaskHook.sol
      IBackingEigen.sol
      IBaseCertificateVerifier.sol
      IBN254CertificateVerifier.sol
      ICrossChainRegistry.sol
      IDelegationManager.sol
      IECDSACertificateVerifier.sol
      IEigen.sol
      IEigenPod.sol
      IEigenPodManager.sol
      IETHPOSDeposit.sol
      IKeyRegistrar.sol
      IOperatorTableCalculator.sol
      IOperatorTableUpdater.sol
      IPausable.sol
      IPauserRegistry.sol
      IPermissionController.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
    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/
      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/
          README.md
          Redistribution.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
        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
        Upgrade_Setup.t.sol
      users/
        AVS.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
      BN254CertificateVerifierMock.sol
      CrossChainRegistryMock.sol
      DelegationManagerMock.sol
      Dummy.sol
      ECDSACertificateVerifierMock.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
      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
      ECDSACertificateVerifierUnit.t.sol
      EigenPodManagerUnit.t.sol
      EigenPodUnit.t.sol
      KeyRegistrarUnit.t.sol
      OperatorTableUpdaterUnit.t.sol
      PausableUnit.t.sol
      PauserRegistryUnit.t.sol
      PermissionControllerUnit.t.sol
      ReleaseManagerUnit.t.sol
      RewardsCoordinatorUnit.t.sol
      StrategyBaseTVLLimitsUnit.sol
      StrategyBaseUnit.t.sol
      StrategyFactoryUnit.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
CONTRIBUTING.md
Dockerfile
foundry.toml
go.mod
LICENSE
MAINTENANCE.md
Makefile
mythril.config.json
package.json
README.md
slither.config.json
```

# Files

## 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}",
		"RPC_HOLESKY": "${localEnv:RPC_HOLESKY}"
	},
	// 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-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
name: Certora

on:
  # Run when PRs from feat/* branches are merged into dev
  pull_request:
    types: [closed]
    branches:
      - main
  
  # 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:
  # First job: Compile the contracts for Certora verification
  compile:
    name: Compile
    # Run if it meets one of these conditions:
    # 1. It's a merged PR from a feat/* branch to dev
    # 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 && 
       startsWith(github.head_ref, 'feat/')) || 
      (github.event_name == 'push' && 
       startsWith(github.ref, 'refs/heads/certora/')) ||
      github.event_name == 'schedule' || 
      github.event_name == 'workflow_dispatch'
    runs-on: protocol-x64-16core
    steps:
      - uses: step-security/harden-runner@ec9f2d5744a09debf3a187a3f4f675c53b671911
        with:
          egress-policy: audit

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

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

      # Install dependencies using Forge
      - name: Install forge dependencies
        run: forge install

      # Run Certora compilation step only
      - uses: Certora/certora-run-action@56c6a98e84eee5cd3a135967a9a4bc06ef6d38cc
        with:
          # List of configuration files for different contracts to verify
          configurations: |-
            certora/confs/core/AllocationManager.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
          use-beta: true
          solc-versions: 0.8.27
          solc-remove-version-prefix: "0."
          job-name: "Eigenlayer Contracts"
          certora-key: ${{ secrets.CERTORAKEY }}
          # Only compile, don't run verification yet
          compilation-steps-only: true
        env:
          GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}

  # Second job: Run the actual verification after compilation succeeds
  verify:
    name: Verify
    runs-on: protocol-x64-16core
    # This job depends on the compile job
    needs: compile
    # Same conditions as the compile job
    if: >
      (github.event_name == 'pull_request' && 
       github.event.pull_request.merged == true && 
       startsWith(github.head_ref, 'feat/')) || 
      (github.event_name == 'push' && 
       startsWith(github.ref, 'refs/heads/certora/')) ||
      github.event_name == 'schedule' || 
      github.event_name == 'workflow_dispatch'
    steps:
      - uses: step-security/harden-runner@ec9f2d5744a09debf3a187a3f4f675c53b671911
        with:
          egress-policy: audit

      # Checkout the repository with submodules
      - uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683
        with:
          submodules: recursive
          # Use dev branch for scheduled runs, otherwise use the branch that triggered the workflow
          ref: ${{ github.event_name == 'schedule' && 'dev' || github.ref }}
          
      # Install the Foundry toolchain.
      - name: Install Foundry
        uses: foundry-rs/foundry-toolchain@82dee4ba654bd2146511f85f0d013af94670c4de
        with:
          version: stable

      # Install dependencies using Forge
      - name: Install forge dependencies
        run: forge install

      # Run Certora verification with the same configurations
      - uses: Certora/certora-run-action@56c6a98e84eee5cd3a135967a9a4bc06ef6d38cc
        with:
          # List of configuration files for different contracts to verify
          configurations: |-
            certora/confs/core/AllocationManager.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
          use-beta: true
          solc-versions: 0.8.27
          solc-remove-version-prefix: "0."
          job-name: "Eigenlayer Contracts"
          certora-key: ${{ secrets.CERTORAKEY }}
        env:
          GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
````

## File: .github/workflows/certora.yml
````yaml
# name: Certora

# on:
#   workflow_dispatch:
#   pull_request:
#     branches:
#       - dev
#   push:
#     branches:
#       - dev
#       - master
#       - release-v*
#       - formal-verification
#       - m2-mainnet
#       - testnet-holesky

# jobs:
#   certora:
#     name: Test

#     runs-on: ubuntu-latest
#     steps:

#       - uses: actions/checkout@v3
#         with:
#           submodules: recursive
    
#       - name: Install Foundry
#         uses: foundry-rs/foundry-toolchain@v1
#         with:
#           version: stable
    
#       - name: Install forge dependencies
#         run: forge install
    
#       - name: Install Python
#         uses: actions/setup-python@v2
#         with:
#           python-version: '3.10'
#           cache: 'pip'
    
#       - name: Install Java
#         uses: actions/setup-java@v2
#         with:
#           distribution: temurin
#           java-version: '17'
    
#       - name: Install Certora CLI
#         run: pip install certora-cli
    
#       - name: Install Solidity Compiler
#         run: |
#           pip install solc-select
#           solc-select use 0.8.27 --always-install
    
#       - name: Run Certora Verification
#         run: |
#           for script in $(ls certora/scripts/{,**}/*.sh | grep -v '\WnoCI\W'); do
#             bash "$script"
#           done
#         env:
#           CERTORAKEY: ${{ secrets.CERTORAKEY }}
````

## 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/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
            powerful-dimensional-season.ethereum-holesky.quiknode.pro: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
            powerful-dimensional-season.ethereum-holesky.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.3.5

      # 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_HOLESKY: ${{ secrets.RPC_HOLESKY }}

  # -----------------------------------------------------------------------
  # 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.3.5

      # 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.3.5

      # 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)
          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.3.5

      - 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: true
      matrix:
        env: [preprod, testnet, mainnet, testnet-sepolia, testnet-hoodi, testnet-base-sepolia, base]

    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
      
        # 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

      # 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" 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" ] || [ "${{ matrix.env }}" = "preprod" ]; then
            RPC_URL="${{ secrets.RPC_HOLESKY }}"
          elif [ "${{ matrix.env }}" = "testnet-sepolia" ]; then
            RPC_URL="${{ secrets.RPC_SEPOLIA }}"
          elif [ "${{ matrix.env }}" = "testnet-hoodi" ]; then
            RPC_URL="${{ secrets.RPC_HOODI }}"
          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 }}"
          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,
    "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": "1",
    "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": "solc8.27",
    "solc_optimize": "1",
    "verify": "AllocationManager:certora/specs/core/AllocationManagerRules.spec",
    "server": "production",
}
````

## 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": "solc8.27",
    "solc_optimize": "1",
    "solc_via_ir": true,
    "verify": "AllocationManager:certora/specs/core/AllocationManagerSanity.spec"
}
````

## 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"
    ],
    "link": [
        "AllocationManager:delegation=DelegationManagerHarness",
        "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": "solc8.27",
    "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"
    ],
    "link": [
        "AllocationManager:delegation=DelegationManagerHarness",
        "DelegationManagerHarness:permissionController=PermissionController",
        "DelegationManagerHarness:allocationManager=AllocationManager",
        "AllocationManager:permissionController=PermissionController",
        "DelegationManagerHarness:strategyManager=StrategyManager",
        "EigenPodManager:delegationManager=DelegationManagerHarness",
        "DelegationManagerHarness:eigenPodManager=EigenPodManager"
    ],
    "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": "solc8.27",
    "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"
    ],
    "link": [
        "DelegationManager:allocationManager=AllocationManager",
        "DelegationManager:eigenPodManager=EigenPodManager",
        "StrategyManagerHarness:delegation=DelegationManager"
    ],
    "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": "solc8.27",
    "solc_optimize": "1",
    "solc_via_ir": true,
    "verify": "StrategyManagerHarness:certora/specs/core/StrategyManager.spec",
    "rule_sanity": "basic"
}
````

## 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": "solc8.27",
    "solc_optimize": "1",
    "solc_via_ir": true,
    "verify": "PausableHarness:certora/specs/permissions/Pausable.spec"
}
````

## 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",
//    "optimistic_hashing": true,
//    "hashing_length_bound": "4700",
    "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/strategies/StrategyBase.sol",
//        "certora/mocks/CertoraAVSRegistrar.sol",
//        "lib/openzeppelin-contracts-v4.9.0/contracts/token/ERC20/ERC20.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": [
        "EigenPodManager"
    ],
    "process": "emv",
    "prover_args": [
        " -recursionErrorAsAssert false -recursionEntryLimit 3"
    ],
    "solc": "solc8.27",
    "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": "solc8.27",
    "solc_optimize": "1",
    "solc_via_ir": true,
    "verify": "StrategyBase:certora/specs/strategies/StrategyBase.spec"
}
````

## File: certora/harnesses/DelegationManagerHarness.sol
````
// SPDX-License-Identifier: BUSL-1.1
⋮----
import "../../src/contracts/core/DelegationManager.sol";
⋮----
contract DelegationManagerHarness is DelegationManager {
⋮----
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/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/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";

use invariant maxMagnitudeHistoryKeysMonotonicInc;
use invariant maxMagnitudeHistoryKeysLessThanCurrentBlock;
use invariant maxMagnitudeMonotonicallyDecreasing;
use invariant SetInRegisteredIFFStatusIsTrue;
use invariant encumberedMagnitudeEqSumOfCurrentMagnitudesAndPositivePending;
use invariant negativePendingDiffAtMostCurrentMagnitude;
use invariant deallocationQueueDataUniqueness;
use invariant noZeroKeyInDealocationQ;
use invariant deallocationQueueEffectBlocLessThanCurrBlockNumberPlushDelayPlusOne;
use invariant deallocationQueueEffectBlockAscesndingOrder;
use invariant noPositivePendingDiffInDeallocationQ;
use invariant effectBlockZeroHasNoPendingDiff;

/*
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;
}

// 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;
}
````

## 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";

using AllocationManager as AllocationManager;
methods {
    function AllocationManager.DEALLOCATION_DELAY() external returns(uint32) envfree;
    function AllocationManager.getMaxMagnitude(address,address) external returns (uint64) 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]);
}

// -----------------------------------------
// 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(address operator, address strategy)
   AllocationManager.getMaxMagnitude(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 deallocationQueueEffectBlockAscesndingOrder(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 deallocationQueueEffectBlockAscesndingOrder(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 deallocationQueueEffectBlockAscesndingOrder(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 deallocationQueueEffectBlockAscesndingOrder(e);
        }
    }
````

## 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 owner() external returns (address) 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 owner() external returns (address) 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`, or `depositBeaconChainETH` has been called
* *OR* when completing a withdrawal
*/
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
* `queueWithdrawal`, `slashShares`, or `recordBeaconChainETHBalanceUpdate` has been 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 an 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` and `removeShares` functions, since these are called only by the DelegationManager, and do not
* "create new shares", but rather represent existing shares being "moved into a withdrawal".
*/
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
//        || f.selector == sig:removeShares(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);
    }
    // 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/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/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/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-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 |
| -------- | -------- |
| [`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 |

## 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:

* [AVS Metadata](#avs-metadata)
* [Operator Sets](#operator-sets)
* [Allocations and Slashing](#allocations-and-slashing)
* [Config](#config)

## 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).

---

## 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`

```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
 */
struct CreateSetParams {
    uint32 operatorSetId;
    IStrategy[] strategies;
}

/**
 * @notice Allows an AVS to create new operator sets, defining strategies that the operator set uses
 */
function createOperatorSets(
    address avs,
    CreateSetParams[] 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`.

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

*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]`

#### `createRedistributingOperatorSets`

```solidity
/**
 * @notice Allows an AVS to create new redistributing operator sets, defining strategies and the redistribution recipient the operator set uses
 */
function createRedistributingOperatorSets(
    address avs,
    CreateSetParams[] 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`

*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]`
    
#### `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)
    checkCanCall(avs)
    returns (uint256, uint256[] memory)
```

_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 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)

#### `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
 */
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. Both the initial setting of this value and any 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 one 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
    * `effectBlock = uint32(block.number) + ALLOCATION_CONFIGURATION_DELAY + 1`
* 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))
````

## 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))
* `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/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/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 |
| [`SemVerMixin.sol`](../../src/contracts/mixins/SemVerMixin.sol) | semantic versioning |
| [`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 two forms of rewards:
* Rewards v1, also known as rewards submissions.
* Rewards v2, also known as operator-directed rewards submissions. See the [ELIP](https://github.com/eigenfoundation/ELIPs/blob/main/ELIPs/ELIP-001.md) for additional context on this rewards type.

*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.

*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) or `OperatorDirectedRewardsSubmission` (v2), 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").
   * Note that **v1 rewards** specify a total `amount`, whereas **v2 rewards** specify a per-operator reward (due to customizable rewards logic). **v2 rewards** also allow for adding a `description` of the rewards submission's purpose.
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, both the v1 `RewardsSubmission` and the v2 `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)

#### `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 function allows AVSs to make rewards submissions to specific operator sets, 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).

*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`

---

### 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 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
}
⋮----
// 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\":\"_delegation\",\"type\":\"address\",\"internalType\":\"contractIDelegationManager\"},{\"name\":\"_eigenStrategy\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"},{\"name\":\"_pauserRegistry\",\"type\":\"address\",\"internalType\":\"contractIPauserRegistry\"},{\"name\":\"_permissionController\",\"type\":\"address\",\"internalType\":\"contractIPermissionController\"},{\"name\":\"_DEALLOCATION_DELAY\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"_ALLOCATION_CONFIGURATION_DELAY\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"_version\",\"type\":\"string\",\"internalType\":\"string\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"ALLOCATION_CONFIGURATION_DELAY\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"DEALLOCATION_DELAY\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"addStrategiesToOperatorSet\",\"inputs\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"operatorSetId\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"strategies\",\"type\":\"address[]\",\"internalType\":\"contractIStrategy[]\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"clearDeallocationQueue\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"strategies\",\"type\":\"address[]\",\"internalType\":\"contractIStrategy[]\"},{\"name\":\"numToClear\",\"type\":\"uint16[]\",\"internalType\":\"uint16[]\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"createOperatorSets\",\"inputs\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"params\",\"type\":\"tuple[]\",\"internalType\":\"structIAllocationManagerTypes.CreateSetParams[]\",\"components\":[{\"name\":\"operatorSetId\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"strategies\",\"type\":\"address[]\",\"internalType\":\"contractIStrategy[]\"}]}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"createRedistributingOperatorSets\",\"inputs\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"params\",\"type\":\"tuple[]\",\"internalType\":\"structIAllocationManagerTypes.CreateSetParams[]\",\"components\":[{\"name\":\"operatorSetId\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"strategies\",\"type\":\"address[]\",\"internalType\":\"contractIStrategy[]\"}]},{\"name\":\"redistributionRecipients\",\"type\":\"address[]\",\"internalType\":\"address[]\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"delegation\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIDelegationManager\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"deregisterFromOperatorSets\",\"inputs\":[{\"name\":\"params\",\"type\":\"tuple\",\"internalType\":\"structIAllocationManagerTypes.DeregisterParams\",\"components\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"operatorSetIds\",\"type\":\"uint32[]\",\"internalType\":\"uint32[]\"}]}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"eigenStrategy\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getAVSRegistrar\",\"inputs\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIAVSRegistrar\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getAllocatableMagnitude\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"strategy\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getAllocatedSets\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"tuple[]\",\"internalType\":\"structOperatorSet[]\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getAllocatedStake\",\"inputs\":[{\"name\":\"operatorSet\",\"type\":\"tuple\",\"internalType\":\"structOperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]},{\"name\":\"operators\",\"type\":\"address[]\",\"internalType\":\"address[]\"},{\"name\":\"strategies\",\"type\":\"address[]\",\"internalType\":\"contractIStrategy[]\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256[][]\",\"internalType\":\"uint256[][]\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getAllocatedStrategies\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"operatorSet\",\"type\":\"tuple\",\"internalType\":\"structOperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]}],\"outputs\":[{\"name\":\"\",\"type\":\"address[]\",\"internalType\":\"contractIStrategy[]\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getAllocation\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"operatorSet\",\"type\":\"tuple\",\"internalType\":\"structOperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]},{\"name\":\"strategy\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"}],\"outputs\":[{\"name\":\"\",\"type\":\"tuple\",\"internalType\":\"structIAllocationManagerTypes.Allocation\",\"components\":[{\"name\":\"currentMagnitude\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"pendingDiff\",\"type\":\"int128\",\"internalType\":\"int128\"},{\"name\":\"effectBlock\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getAllocationDelay\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getAllocations\",\"inputs\":[{\"name\":\"operators\",\"type\":\"address[]\",\"internalType\":\"address[]\"},{\"name\":\"operatorSet\",\"type\":\"tuple\",\"internalType\":\"structOperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]},{\"name\":\"strategy\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"}],\"outputs\":[{\"name\":\"\",\"type\":\"tuple[]\",\"internalType\":\"structIAllocationManagerTypes.Allocation[]\",\"components\":[{\"name\":\"currentMagnitude\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"pendingDiff\",\"type\":\"int128\",\"internalType\":\"int128\"},{\"name\":\"effectBlock\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getEncumberedMagnitude\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"strategy\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getMaxMagnitude\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"strategy\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getMaxMagnitudes\",\"inputs\":[{\"name\":\"operators\",\"type\":\"address[]\",\"internalType\":\"address[]\"},{\"name\":\"strategy\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint64[]\",\"internalType\":\"uint64[]\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getMaxMagnitudes\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"strategies\",\"type\":\"address[]\",\"internalType\":\"contractIStrategy[]\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint64[]\",\"internalType\":\"uint64[]\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getMaxMagnitudesAtBlock\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"strategies\",\"type\":\"address[]\",\"internalType\":\"contractIStrategy[]\"},{\"name\":\"blockNumber\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint64[]\",\"internalType\":\"uint64[]\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getMemberCount\",\"inputs\":[{\"name\":\"operatorSet\",\"type\":\"tuple\",\"internalType\":\"structOperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getMembers\",\"inputs\":[{\"name\":\"operatorSet\",\"type\":\"tuple\",\"internalType\":\"structOperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]}],\"outputs\":[{\"name\":\"\",\"type\":\"address[]\",\"internalType\":\"address[]\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getMinimumSlashableStake\",\"inputs\":[{\"name\":\"operatorSet\",\"type\":\"tuple\",\"internalType\":\"structOperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]},{\"name\":\"operators\",\"type\":\"address[]\",\"internalType\":\"address[]\"},{\"name\":\"strategies\",\"type\":\"address[]\",\"internalType\":\"contractIStrategy[]\"},{\"name\":\"futureBlock\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"outputs\":[{\"name\":\"slashableStake\",\"type\":\"uint256[][]\",\"internalType\":\"uint256[][]\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getOperatorSetCount\",\"inputs\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getRedistributionRecipient\",\"inputs\":[{\"name\":\"operatorSet\",\"type\":\"tuple\",\"internalType\":\"structOperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]}],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getRegisteredSets\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"tuple[]\",\"internalType\":\"structOperatorSet[]\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getSlashCount\",\"inputs\":[{\"name\":\"operatorSet\",\"type\":\"tuple\",\"internalType\":\"structOperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getStrategiesInOperatorSet\",\"inputs\":[{\"name\":\"operatorSet\",\"type\":\"tuple\",\"internalType\":\"structOperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]}],\"outputs\":[{\"name\":\"\",\"type\":\"address[]\",\"internalType\":\"contractIStrategy[]\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getStrategyAllocations\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"strategy\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"}],\"outputs\":[{\"name\":\"\",\"type\":\"tuple[]\",\"internalType\":\"structOperatorSet[]\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]},{\"name\":\"\",\"type\":\"tuple[]\",\"internalType\":\"structIAllocationManagerTypes.Allocation[]\",\"components\":[{\"name\":\"currentMagnitude\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"pendingDiff\",\"type\":\"int128\",\"internalType\":\"int128\"},{\"name\":\"effectBlock\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"initialize\",\"inputs\":[{\"name\":\"initialPausedStatus\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"isMemberOfOperatorSet\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"operatorSet\",\"type\":\"tuple\",\"internalType\":\"structOperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"isOperatorRedistributable\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"isOperatorSet\",\"inputs\":[{\"name\":\"operatorSet\",\"type\":\"tuple\",\"internalType\":\"structOperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"isOperatorSlashable\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"operatorSet\",\"type\":\"tuple\",\"internalType\":\"structOperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"isRedistributingOperatorSet\",\"inputs\":[{\"name\":\"operatorSet\",\"type\":\"tuple\",\"internalType\":\"structOperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"modifyAllocations\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"params\",\"type\":\"tuple[]\",\"internalType\":\"structIAllocationManagerTypes.AllocateParams[]\",\"components\":[{\"name\":\"operatorSet\",\"type\":\"tuple\",\"internalType\":\"structOperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]},{\"name\":\"strategies\",\"type\":\"address[]\",\"internalType\":\"contractIStrategy[]\"},{\"name\":\"newMagnitudes\",\"type\":\"uint64[]\",\"internalType\":\"uint64[]\"}]}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"pause\",\"inputs\":[{\"name\":\"newPausedStatus\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"pauseAll\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"paused\",\"inputs\":[{\"name\":\"index\",\"type\":\"uint8\",\"internalType\":\"uint8\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"paused\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"pauserRegistry\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIPauserRegistry\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"permissionController\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIPermissionController\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"registerForOperatorSets\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"params\",\"type\":\"tuple\",\"internalType\":\"structIAllocationManagerTypes.RegisterParams\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"operatorSetIds\",\"type\":\"uint32[]\",\"internalType\":\"uint32[]\"},{\"name\":\"data\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"removeStrategiesFromOperatorSet\",\"inputs\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"operatorSetId\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"strategies\",\"type\":\"address[]\",\"internalType\":\"contractIStrategy[]\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"setAVSRegistrar\",\"inputs\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"registrar\",\"type\":\"address\",\"internalType\":\"contractIAVSRegistrar\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"setAllocationDelay\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"delay\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"slashOperator\",\"inputs\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"params\",\"type\":\"tuple\",\"internalType\":\"structIAllocationManagerTypes.SlashingParams\",\"components\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"operatorSetId\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"strategies\",\"type\":\"address[]\",\"internalType\":\"contractIStrategy[]\"},{\"name\":\"wadsToSlash\",\"type\":\"uint256[]\",\"internalType\":\"uint256[]\"},{\"name\":\"description\",\"type\":\"string\",\"internalType\":\"string\"}]}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"\",\"type\":\"uint256[]\",\"internalType\":\"uint256[]\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"unpause\",\"inputs\":[{\"name\":\"newPausedStatus\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"updateAVSMetadataURI\",\"inputs\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"metadataURI\",\"type\":\"string\",\"internalType\":\"string\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"version\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"string\",\"internalType\":\"string\"}],\"stateMutability\":\"view\"},{\"type\":\"event\",\"name\":\"AVSMetadataURIUpdated\",\"inputs\":[{\"name\":\"avs\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"metadataURI\",\"type\":\"string\",\"indexed\":false,\"internalType\":\"string\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"AVSRegistrarSet\",\"inputs\":[{\"name\":\"avs\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"},{\"name\":\"registrar\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"contractIAVSRegistrar\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"AllocationDelaySet\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"},{\"name\":\"delay\",\"type\":\"uint32\",\"indexed\":false,\"internalType\":\"uint32\"},{\"name\":\"effectBlock\",\"type\":\"uint32\",\"indexed\":false,\"internalType\":\"uint32\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"AllocationUpdated\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"},{\"name\":\"operatorSet\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structOperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]},{\"name\":\"strategy\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"contractIStrategy\"},{\"name\":\"magnitude\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"},{\"name\":\"effectBlock\",\"type\":\"uint32\",\"indexed\":false,\"internalType\":\"uint32\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"EncumberedMagnitudeUpdated\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"},{\"name\":\"strategy\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"contractIStrategy\"},{\"name\":\"encumberedMagnitude\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Initialized\",\"inputs\":[{\"name\":\"version\",\"type\":\"uint8\",\"indexed\":false,\"internalType\":\"uint8\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"MaxMagnitudeUpdated\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"},{\"name\":\"strategy\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"contractIStrategy\"},{\"name\":\"maxMagnitude\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"OperatorAddedToOperatorSet\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"operatorSet\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structOperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"OperatorRemovedFromOperatorSet\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"operatorSet\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structOperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"OperatorSetCreated\",\"inputs\":[{\"name\":\"operatorSet\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structOperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"OperatorSlashed\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"},{\"name\":\"operatorSet\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structOperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]},{\"name\":\"strategies\",\"type\":\"address[]\",\"indexed\":false,\"internalType\":\"contractIStrategy[]\"},{\"name\":\"wadSlashed\",\"type\":\"uint256[]\",\"indexed\":false,\"internalType\":\"uint256[]\"},{\"name\":\"description\",\"type\":\"string\",\"indexed\":false,\"internalType\":\"string\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Paused\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"newPausedStatus\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"RedistributionAddressSet\",\"inputs\":[{\"name\":\"operatorSet\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structOperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]},{\"name\":\"redistributionRecipient\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"StrategyAddedToOperatorSet\",\"inputs\":[{\"name\":\"operatorSet\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structOperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]},{\"name\":\"strategy\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"contractIStrategy\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"StrategyRemovedFromOperatorSet\",\"inputs\":[{\"name\":\"operatorSet\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structOperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]},{\"name\":\"strategy\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"contractIStrategy\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Unpaused\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"newPausedStatus\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"error\",\"name\":\"AlreadyMemberOfSet\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"CurrentlyPaused\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"Empty\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InputAddressZero\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InputArrayLengthMismatch\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InsufficientMagnitude\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidAVSRegistrar\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidCaller\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidNewPausedStatus\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidOperator\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidOperatorSet\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidPermissions\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidRedistributionRecipient\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidShortString\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidSnapshotOrdering\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidStrategy\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidWadToSlash\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ModificationAlreadyPending\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"NonexistentAVSMetadata\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"NotMemberOfSet\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"OnlyPauser\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"OnlyUnpauser\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"OperatorNotSlashable\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"OutOfBounds\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"SameMagnitude\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"StrategiesMustBeInAscendingOrder\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"StrategyAlreadyInOperatorSet\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"StrategyNotInOperatorSet\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"StringTooLong\",\"inputs\":[{\"name\":\"str\",\"type\":\"string\",\"internalType\":\"string\"}]},{\"type\":\"error\",\"name\":\"UninitializedAllocationDelay\",\"inputs\":[]}]",
	Bin: "0x610160604052348015610010575f5ffd5b506040516161d63803806161d683398101604081905261002f916101ef565b8084888886868a6001600160a01b03811661005d576040516339b190bb60e11b815260040160405180910390fd5b6001600160a01b0390811660805293841660a05291831660c05263ffffffff90811660e05216610100521661012052610095816100ae565b61014052506100a26100f4565b50505050505050610367565b5f5f829050601f815111156100e1578260405163305a27a960e01b81526004016100d8919061030c565b60405180910390fd5b80516100ec82610341565b179392505050565b5f54610100900460ff161561015b5760405162461bcd60e51b815260206004820152602760248201527f496e697469616c697a61626c653a20636f6e747261637420697320696e697469604482015266616c697a696e6760c81b60648201526084016100d8565b5f5460ff908116146101aa575f805460ff191660ff9081179091556040519081527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b565b6001600160a01b03811681146101c0575f5ffd5b50565b805163ffffffff811681146101d6575f5ffd5b919050565b634e487b7160e01b5f52604160045260245ffd5b5f5f5f5f5f5f5f60e0888a031215610205575f5ffd5b8751610210816101ac565b6020890151909750610221816101ac565b6040890151909650610232816101ac565b6060890151909550610243816101ac565b9350610251608089016101c3565b925061025f60a089016101c3565b60c08901519092506001600160401b0381111561027a575f5ffd5b8801601f81018a1361028a575f5ffd5b80516001600160401b038111156102a3576102a36101db565b604051601f8201601f19908116603f011681016001600160401b03811182821017156102d1576102d16101db565b6040528181528282016020018c10156102e8575f5ffd5b8160208401602083015e5f6020838301015280935050505092959891949750929550565b602081525f82518060208401528060208501604085015e5f604082850101526040601f19601f83011684010191505092915050565b80516020808301519190811015610361575f198160200360031b1b821691505b50919050565b60805160a05160c05160e051610100516101205161014051615dca61040c5f395f61136d01525f81816104cd0152612c9101525f81816106400152613be001525f81816103d6015281816117660152611e3901525f818161079b0152613a4c01525f81816107d5015281816113a10152818161140b0152818161211901528181612f0501526137a201525f818161066701528181612b5d01526141f80152615dca5ff3fe608060405234801561000f575f5ffd5b50600436106102ff575f3560e01c8063670d3ba211610195578063b2447af7116100e4578063db4df7611161009e578063f231bd0811610079578063f231bd08146107f7578063f605ce081461080a578063fabc1cbc1461081d578063fe4b84df14610830575f5ffd5b8063db4df76114610796578063dc2af692146107bd578063df5cf723146107d0575f5ffd5b8063b2447af714610708578063b66bd9891461071b578063b9fbaed11461072e578063ba1a84e51461075d578063c221d8ae14610770578063d3d96ff414610783575f5ffd5b8063886f11951161014f578063952899ee1161012a578063952899ee146106bc578063a9333ec8146106cf578063a9821821146106e2578063adc2e3d9146106f5575f5ffd5b8063886f1195146106625780638ce648541461068957806394d7d00c146106a9575f5ffd5b8063670d3ba2146105c45780636cfb4481146105d75780636e3492b5146106025780636e875dba1461061557806379ae50cd146106285780637bc1ef611461063b575f5ffd5b806340120dab1161025157806350feea201161020b57806356c483e6116101e657806356c483e61461057e578063595c6a67146105915780635ac86ab7146105995780635c975abb146105bc575f5ffd5b806350feea2014610543578063547afb871461055657806354fd4d5014610569575f5ffd5b806340120dab146104875780634177a87c146104a85780634657e26a146104c85780634a10ffe5146104ef5780634b5046ef1461050f5780634cfd293914610522575f5ffd5b8063261f84e0116102bc5780632bab2c4a116102975780632bab2c4a1461042d578063304c10cd1461044057806332a879e4146104535780633635205714610466575f5ffd5b8063261f84e0146103be5780632981eb77146103d15780632b453a9a1461040d575f5ffd5b80630f3df50e1461030357806310e1b9b8146103335780631352c3e614610353578063136439dd1461037657806315fe50281461038b578063260dc758146103ab575b5f5ffd5b610316610311366004614bf0565b610843565b6040516001600160a01b0390911681526020015b60405180910390f35b610346610341366004614c0a565b610884565b60405161032a9190614c51565b610366610361366004614c84565b6108bd565b604051901515815260200161032a565b610389610384366004614cb8565b610938565b005b61039e610399366004614ccf565b610972565b60405161032a9190614d4d565b6103666103b9366004614bf0565b610a89565b6103896103cc366004614d9f565b610aba565b6103f87f000000000000000000000000000000000000000000000000000000000000000081565b60405163ffffffff909116815260200161032a565b61042061041b366004614e84565b610b63565b60405161032a9190614f27565b61042061043b366004614f8a565b610b79565b61031661044e366004614ccf565b610c18565b61038961046136600461500e565b610c47565b61047961047436600461508e565b610d8e565b60405161032a9291906150e0565b61049a6104953660046150f8565b610ed1565b60405161032a929190615185565b6104bb6104b6366004614bf0565b61104c565b60405161032a91906151e2565b6103167f000000000000000000000000000000000000000000000000000000000000000081565b6105026104fd3660046151f4565b611070565b60405161032a9190615237565b61038961051d36600461500e565b611118565b610535610530366004614bf0565b6111ab565b60405190815260200161032a565b610389610551366004615282565b6111cd565b6105026105643660046152e0565b6112be565b610571611366565b60405161032a9190615322565b61038961058c366004615357565b611396565b61038961149b565b6103666105a7366004615381565b606654600160ff9092169190911b9081161490565b606654610535565b6103666105d2366004614c84565b6114af565b6105ea6105e53660046150f8565b6114db565b6040516001600160401b03909116815260200161032a565b6103896106103660046153b7565b6114f0565b6104bb610623366004614bf0565b6118b3565b61039e610636366004614ccf565b6118c4565b6103f87f000000000000000000000000000000000000000000000000000000000000000081565b6103167f000000000000000000000000000000000000000000000000000000000000000081565b61069c6106973660046153e8565b61199e565b60405161032a919061542b565b6105026106b736600461543d565b611a5a565b6103896106ca366004615498565b611b46565b6105ea6106dd3660046150f8565b611fe7565b6103896106f0366004615641565b612016565b6103896107033660046156bf565b6120c8565b610535610716366004614bf0565b612411565b610389610729366004615282565b612433565b61074161073c366004614ccf565b61258d565b60408051921515835263ffffffff90911660208301520161032a565b61053561076b366004614ccf565b612627565b6104bb61077e366004614c84565b612647565b6103896107913660046150f8565b612670565b6103167f000000000000000000000000000000000000000000000000000000000000000081565b6103666107cb366004614ccf565b61279d565b6103167f000000000000000000000000000000000000000000000000000000000000000081565b610366610805366004614bf0565b6127d0565b6105ea6108183660046150f8565b6127ef565b61038961082b366004614cb8565b6127fb565b61038961083e366004614cb8565b612868565b5f5f60a65f61085185612979565b815260208101919091526040015f20546001600160a01b031690508015610878578061087d565b620e16e45b9392505050565b604080516060810182525f80825260208201819052918101829052906108b3856108ad86612979565b856129dc565b9695505050505050565b6001600160a01b0382165f908152609e602052604081208190816108e085612979565b815260208082019290925260409081015f2081518083019092525460ff8116151580835261010090910463ffffffff169282019290925291508061092e5750806020015163ffffffff164311155b9150505b92915050565b610940612b48565b60665481811681146109655760405163c61dca5d60e01b815260040160405180910390fd5b61096e82612beb565b5050565b6001600160a01b0381165f908152609d602052604081206060919061099690612c28565b90505f816001600160401b038111156109b1576109b1614b00565b6040519080825280602002602001820160405280156109f557816020015b604080518082019091525f80825260208201528152602001906001900390816109cf5790505b5090505f5b82811015610a81576001600160a01b0385165f908152609d60205260409020610a5c90610a279083612c31565b604080518082019091525f80825260208201525060408051808201909152606082901c815263ffffffff909116602082015290565b828281518110610a6e57610a6e615701565b60209081029190910101526001016109fa565b509392505050565b60208082015182516001600160a01b03165f9081526098909252604082206109329163ffffffff90811690612c3c16565b82610ac481612c53565b610ae15760405163932d94f760e01b815260040160405180910390fd5b6001600160a01b0384165f90815260a4602052604090205460ff16610b19576040516348f7dbb960e01b815260040160405180910390fd5b5f5b82811015610b5c57610b5485858584818110610b3957610b39615701565b9050602002810190610b4b9190615715565b620e16e4612cfd565b600101610b1b565b5050505050565b6060610b7184848443612eb1565b949350505050565b6060610b8785858585612eb1565b90505f5b8451811015610c0f57610bb7858281518110610ba957610ba9615701565b6020026020010151876108bd565b610c07575f5b8451811015610c05575f838381518110610bd957610bd9615701565b60200260200101518281518110610bf257610bf2615701565b6020908102919091010152600101610bbd565b505b600101610b8b565b50949350505050565b6001600160a01b038082165f908152609760205260408120549091168015610c40578061087d565b5090919050565b84610c5181612c53565b610c6e5760405163932d94f760e01b815260040160405180910390fd5b838214610c8e576040516343714afd60e01b815260040160405180910390fd5b6001600160a01b0386165f90815260a4602052604090205460ff16610cc6576040516348f7dbb960e01b815260040160405180910390fd5b5f5b84811015610d85575f848483818110610ce357610ce3615701565b9050602002016020810190610cf89190614ccf565b90506001600160a01b038116610d21576040516339b190bb60e11b815260040160405180910390fd5b620e16e3196001600160a01b03821601610d4e576040516364be1a3f60e11b815260040160405180910390fd5b610d7c88888885818110610d6457610d64615701565b9050602002810190610d769190615715565b83612cfd565b50600101610cc8565b50505050505050565b5f60606001610d9c8161319e565b84610da681612c53565b610dc35760405163932d94f760e01b815260040160405180910390fd5b5f6040518060400160405280886001600160a01b03168152602001876020016020810190610df19190615733565b63ffffffff1690529050610e08606087018761574c565b9050610e17604088018861574c565b905014610e37576040516343714afd60e01b815260040160405180910390fd5b60208082015182516001600160a01b03165f90815260989092526040909120610e699163ffffffff90811690612c3c16565b610e8657604051631fb1705560e21b815260040160405180910390fd5b610e9c610e966020880188614ccf565b826108bd565b610eb95760405163ebbff49760e01b815260040160405180910390fd5b610ec386826131cc565b945094505050509250929050565b6001600160a01b0382165f908152609d602052604081206060918291610ef690612c28565b90505f816001600160401b03811115610f1157610f11614b00565b604051908082528060200260200182016040528015610f5557816020015b604080518082019091525f8082526020820152815260200190600190039081610f2f5790505b5090505f826001600160401b03811115610f7157610f71614b00565b604051908082528060200260200182016040528015610fba57816020015b604080516060810182525f80825260208083018290529282015282525f19909201910181610f8f5790505b5090505f5b8381101561103d576001600160a01b0388165f908152609d60205260408120610fec90610a279084612c31565b90508084838151811061100157611001615701565b602002602001018190525061101789828a610884565b83838151811061102957611029615701565b602090810291909101015250600101610fbf565b509093509150505b9250929050565b60605f61087d60995f61105e86612979565b81526020019081526020015f2061390c565b60605f83516001600160401b0381111561108c5761108c614b00565b6040519080825280602002602001820160405280156110b5578160200160208202803683370190505b5090505f5b8451811015610a81576110e68582815181106110d8576110d8615701565b602002602001015185611fe7565b8282815181106110f8576110f8615701565b6001600160401b03909216602092830291909101909101526001016110ba565b5f6111228161319e565b838214611142576040516343714afd60e01b815260040160405180910390fd5b5f5b84811015610d85576111a38787878481811061116257611162615701565b90506020020160208101906111779190614ccf565b86868581811061118957611189615701565b905060200201602081019061119e9190615791565b613918565b600101611144565b5f60a55f6111b884612979565b81526020019081526020015f20549050919050565b836111d781612c53565b6111f45760405163932d94f760e01b815260040160405180910390fd5b6040805180820182526001600160a01b03871680825263ffffffff80881660208085018290525f938452609890529390912091926112339291612c3c16565b61125057604051631fb1705560e21b815260040160405180910390fd5b5f5b83811015610d85576112b68286868481811061127057611270615701565b90506020020160208101906112859190614ccf565b6112b160405180604001604052808c6001600160a01b031681526020018b63ffffffff168152506127d0565b613a1c565b600101611252565b60605f82516001600160401b038111156112da576112da614b00565b604051908082528060200260200182016040528015611303578160200160208202803683370190505b5090505f5b8351811015610a81576113348585838151811061132757611327615701565b6020026020010151611fe7565b82828151811061134657611346615701565b6001600160401b0390921660209283029190910190910152600101611308565b60606113917f0000000000000000000000000000000000000000000000000000000000000000613afc565b905090565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614611491576113cf82612c53565b6113ec576040516348f5c3ed60e01b815260040160405180910390fd5b6040516336b87bd760e11b81526001600160a01b0383811660048301527f00000000000000000000000000000000000000000000000000000000000000001690636d70f7ae90602401602060405180830381865afa158015611450573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061147491906157b2565b6114915760405163ccea9e6f60e01b815260040160405180910390fd5b61096e8282613b39565b6114a3612b48565b6114ad5f19612beb565b565b5f61087d83609a5f6114c086612979565b81526020019081526020015f20613ce590919063ffffffff16565b5f5f6114e78484613d06565b95945050505050565b60026114fb8161319e565b61151061150b6020840184614ccf565b612c53565b80611529575061152961150b6040840160208501614ccf565b611546576040516348f5c3ed60e01b815260040160405180910390fd5b5f5b611555604084018461574c565b9050811015611817575f604051806040016040528085602001602081019061157d9190614ccf565b6001600160a01b03168152602001611598604087018761574c565b858181106115a8576115a8615701565b90506020020160208101906115bd9190615733565b63ffffffff16815250905061160a816020015163ffffffff1660985f8760200160208101906115ec9190614ccf565b6001600160a01b0316815260208101919091526040015f2090612c3c565b61162757604051631fb1705560e21b815260040160405180910390fd5b609e5f6116376020870187614ccf565b6001600160a01b03166001600160a01b031681526020019081526020015f205f61166083612979565b815260208101919091526040015f205460ff16611690576040516325131d4f60e01b815260040160405180910390fd5b6116ca61169c82612979565b609c5f6116ac6020890189614ccf565b6001600160a01b0316815260208101919091526040015f2090613e75565b506117026116db6020860186614ccf565b609a5f6116e785612979565b81526020019081526020015f20613e8090919063ffffffff16565b506117106020850185614ccf565b6001600160a01b03167fad34c3070be1dffbcaa499d000ba2b8d9848aefcac3059df245dd95c4ece14fe8260405161174891906157d1565b60405180910390a2604080518082019091525f81526020810161178b7f0000000000000000000000000000000000000000000000000000000000000000436157f3565b63ffffffff169052609e5f6117a36020880188614ccf565b6001600160a01b03166001600160a01b031681526020019081526020015f205f6117cc84612979565b81526020808201929092526040015f2082518154939092015163ffffffff166101000264ffffffff00199215159290921664ffffffffff199093169290921717905550600101611548565b5061182b61044e6040840160208501614ccf565b6001600160a01b031663303ca9566118466020850185614ccf565b6118566040860160208701614ccf565b611863604087018761574c565b6040518563ffffffff1660e01b81526004016118829493929190615848565b5f604051808303815f87803b158015611899575f5ffd5b505af11580156118ab573d5f5f3e3d5ffd5b505050505050565b6060610932609a5f61105e85612979565b6001600160a01b0381165f908152609c60205260408120606091906118e890612c28565b90505f816001600160401b0381111561190357611903614b00565b60405190808252806020026020018201604052801561194757816020015b604080518082019091525f80825260208201528152602001906001900390816119215790505b5090505f5b82811015610a81576001600160a01b0385165f908152609c6020526040902061197990610a279083612c31565b82828151811061198b5761198b615701565b602090810291909101015260010161194c565b60605f84516001600160401b038111156119ba576119ba614b00565b604051908082528060200260200182016040528015611a0357816020015b604080516060810182525f80825260208083018290529282015282525f199092019101816119d85790505b5090505f5b8551811015610c0f57611a35868281518110611a2657611a26615701565b60200260200101518686610884565b828281518110611a4757611a47615701565b6020908102919091010152600101611a08565b60605f83516001600160401b03811115611a7657611a76614b00565b604051908082528060200260200182016040528015611a9f578160200160208202803683370190505b5090505f5b8451811015610c0f576001600160a01b0386165f90815260a1602052604081208651611b1492879291899086908110611adf57611adf615701565b60200260200101516001600160a01b03166001600160a01b031681526020019081526020015f20613e9490919063ffffffff16565b828281518110611b2657611b26615701565b6001600160401b0390921660209283029190910190910152600101611aa4565b5f611b508161319e565b611b5983612c53565b611b76576040516348f5c3ed60e01b815260040160405180910390fd5b5f5f5f611b828661258d565b9150915081611ba45760405163fa55fc8160e01b815260040160405180910390fd5b91505f90505b8351811015610b5c57838181518110611bc557611bc5615701565b60200260200101516040015151848281518110611be457611be4615701565b6020026020010151602001515114611c0f576040516343714afd60e01b815260040160405180910390fd5b5f848281518110611c2257611c22615701565b602090810291909101810151518082015181516001600160a01b03165f90815260989093526040909220909250611c629163ffffffff90811690612c3c16565b611c7f57604051631fb1705560e21b815260040160405180910390fd5b5f611c8a87836108bd565b90505f5b868481518110611ca057611ca0615701565b60200260200101516020015151811015611fdc575f878581518110611cc757611cc7615701565b6020026020010151602001518281518110611ce457611ce4615701565b60200260200101519050611cfb898261ffff613918565b5f5f611d0a8b6108ad88612979565b91509150806040015163ffffffff165f14611d3857604051630d8fcbe360e41b815260040160405180910390fd5b5f611d4587858489613ea8565b9050611d8a825f01518c8a81518110611d6057611d60615701565b6020026020010151604001518781518110611d7d57611d7d615701565b6020026020010151613ede565b600f0b602083018190525f03611db357604051634606179360e11b815260040160405180910390fd5b5f8260200151600f0b1215611ef7578015611e7957611e34611dd488612979565b6001600160a01b03808f165f90815260a360209081526040808320938a16835292905220908154600160801b90819004600f0b5f818152600180860160205260409091209390935583546001600160801b03908116939091011602179055565b611e5e7f0000000000000000000000000000000000000000000000000000000000000000436157f3565b611e699060016157f3565b63ffffffff166040830152611f64565b611e8b83602001518360200151613ef5565b6001600160401b031660208401528a518b9089908110611ead57611ead615701565b6020026020010151604001518581518110611eca57611eca615701565b6020908102919091018101516001600160401b031683525f9083015263ffffffff43166040830152611f64565b5f8260200151600f0b1315611f6457611f1883602001518360200151613ef5565b6001600160401b039081166020850181905284519091161015611f4e57604051636c9be0bf60e01b815260040160405180910390fd5b611f5889436157f3565b63ffffffff1660408301525b611f798c611f7189612979565b868686613f14565b7f1487af5418c47ee5ea45ef4a93398668120890774a9e13487e61e9dc3baf76dd8c8886611fae865f01518760200151613ef5565b8660400151604051611fc4959493929190615874565b60405180910390a1505060019092019150611c8e9050565b505050600101611baa565b6001600160a01b038083165f90815260a160209081526040808320938516835292905290812061087d9061414c565b8261202081612c53565b61203d5760405163932d94f760e01b815260040160405180910390fd5b6001600160a01b0384165f90815260a4602052604090205460ff1661207f576001600160a01b0384165f90815260a460205260409020805460ff191660011790555b836001600160a01b03167fa89c1dc243d8908a96dd84944bcc97d6bc6ac00dd78e20621576be6a3c94371384846040516120ba9291906158ed565b60405180910390a250505050565b60026120d38161319e565b826120dd81612c53565b6120fa5760405163932d94f760e01b815260040160405180910390fd5b6040516336b87bd760e11b81526001600160a01b0385811660048301527f00000000000000000000000000000000000000000000000000000000000000001690636d70f7ae90602401602060405180830381865afa15801561215e573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061218291906157b2565b61219f5760405163ccea9e6f60e01b815260040160405180910390fd5b5f5b6121ae602085018561574c565b905081101561237657604080518082019091525f90806121d16020880188614ccf565b6001600160a01b031681526020018680602001906121ef919061574c565b858181106121ff576121ff615701565b90506020020160208101906122149190615733565b63ffffffff90811690915260208083015183516001600160a01b03165f90815260989092526040909120929350612250929190811690612c3c16565b61226d57604051631fb1705560e21b815260040160405180910390fd5b61227786826108bd565b1561229557604051636c6c6e2760e11b815260040160405180910390fd5b6122be6122a182612979565b6001600160a01b0388165f908152609c602052604090209061415f565b506122ea86609a5f6122cf85612979565b81526020019081526020015f2061416a90919063ffffffff16565b50856001600160a01b03167f43232edf9071753d2321e5fa7e018363ee248e5f2142e6c08edd3265bfb4895e8260405161232491906157d1565b60405180910390a26001600160a01b0386165f908152609e6020526040812060019161234f84612979565b815260208101919091526040015f20805460ff1916911515919091179055506001016121a1565b5061238761044e6020850185614ccf565b6001600160a01b031663c63fd502856123a36020870187614ccf565b6123b0602088018861574c565b6123bd60408a018a615900565b6040518763ffffffff1660e01b81526004016123de96959493929190615942565b5f604051808303815f87803b1580156123f5575f5ffd5b505af1158015612407573d5f5f3e3d5ffd5b5050505050505050565b5f610932609a5f61242185612979565b81526020019081526020015f20612c28565b8361243d81612c53565b61245a5760405163932d94f760e01b815260040160405180910390fd5b6040805180820182526001600160a01b03871680825263ffffffff80881660208085018290525f938452609890529390912091926124999291612c3c16565b6124b657604051631fb1705560e21b815260040160405180910390fd5b5f6124c082612979565b90505f5b84811015612407576125098686838181106124e1576124e1615701565b90506020020160208101906124f69190614ccf565b5f84815260996020526040902090613e80565b612526576040516331bc342760e11b815260040160405180910390fd5b7f7b4b073d80dcac55a11177d8459ad9f664ceeb91f71f27167bb14f8152a7eeee8387878481811061255a5761255a615701565b905060200201602081019061256f9190614ccf565b60405161257d92919061598e565b60405180910390a16001016124c4565b6001600160a01b0381165f908152609b602090815260408083208151608081018352905463ffffffff80821680845260ff600160201b8404161515958401869052650100000000008304821694840194909452600160481b90910416606082018190528493919291901580159061260e5750826060015163ffffffff164310155b1561261d575050604081015160015b9590945092505050565b6001600160a01b0381165f90815260986020526040812061093290612c28565b6001600160a01b0382165f908152609f602052604081206060919061092e908261105e86612979565b8161267a81612c53565b6126975760405163932d94f760e01b815260040160405180910390fd5b60405163b526578760e01b81526001600160a01b03848116600483015283169063b526578790602401602060405180830381865afa1580156126db573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906126ff91906157b2565b61271c57604051631d0b13c160e31b815260040160405180910390fd5b6001600160a01b038381165f90815260976020526040902080546001600160a01b0319169184169190911790557f2ae945c40c44dc0ec263f95609c3fdc6952e0aefa22d6374e44f2c997acedf858361277481610c18565b604080516001600160a01b039384168152929091166020830152015b60405180910390a1505050565b5f5f6127a8836118c4565b90505f6127b484610972565b90506127c0848361417e565b80610b715750610b71848261417e565b5f620e16e46127de83610843565b6001600160a01b0316141592915050565b5f5f610c0f8484613d06565b6128036141f6565b6066548019821981161461282a5760405163c61dca5d60e01b815260040160405180910390fd5b606682905560405182815233907f3582d1828e26bf56bd801502bc021ac0bc8afb57c826e4986b45593c8fad389c9060200160405180910390a25050565b5f54610100900460ff161580801561288657505f54600160ff909116105b8061289f5750303b15801561289f57505f5460ff166001145b6129075760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b60648201526084015b60405180910390fd5b5f805460ff191660011790558015612928575f805461ff0019166101001790555b61293182612beb565b801561096e575f805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15050565b5f815f0151826020015163ffffffff166040516020016129c492919060609290921b6bffffffffffffffffffffffff1916825260a01b6001600160a01b031916601482015260200190565b604051602081830303815290604052610932906159b4565b6040805180820182525f80825260208083018290528351606081018552828152808201839052808501839052845180860186526001600160a01b03898116855260a1845286852090881685529092529382209293928190612a3c9061414c565b6001600160401b0390811682526001600160a01b038981165f81815260a260209081526040808320948c168084529482528083205486169682019690965291815260a082528481208b8252825284812092815291815290839020835160608101855290549283168152600160401b8304600f0b91810191909152600160c01b90910463ffffffff16918101829052919250431015612ade579092509050612b40565b612aef815f01518260200151613ef5565b6001600160401b0316815260208101515f600f9190910b1215612b2d57612b1e82602001518260200151613ef5565b6001600160401b031660208301525b5f60408201819052602082015290925090505b935093915050565b60405163237dfb4760e11b81523360048201527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906346fbf68e90602401602060405180830381865afa158015612baa573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612bce91906157b2565b6114ad57604051631d77d47760e21b815260040160405180910390fd5b606681905560405181815233907fab40a374bc51de372200a8bc981af8c9ecdc08dfdaef0bb6e09f88f3c616ef3d9060200160405180910390a250565b5f610932825490565b5f61087d83836142a7565b5f818152600183016020526040812054151561087d565b604051631beb2b9760e31b81526001600160a01b0382811660048301523360248301523060448301525f80356001600160e01b0319166064840152917f00000000000000000000000000000000000000000000000000000000000000009091169063df595cb8906084016020604051808303815f875af1158015612cd9573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061093291906157b2565b5f6040518060400160405280856001600160a01b03168152602001845f016020810190612d2a9190615733565b63ffffffff168152509050612d74816020015163ffffffff1660985f876001600160a01b03166001600160a01b031681526020019081526020015f2061415f90919063ffffffff16565b612d9157604051631fb1705560e21b815260040160405180910390fd5b7f31629285ead2335ae0933f86ed2ae63321f7af77b4e6eaabc42c057880977e6c81604051612dc091906157d1565b60405180910390a16001600160a01b038216620e16e414801590612e55578260a65f612deb85612979565b81526020019081526020015f205f6101000a8154816001600160a01b0302191690836001600160a01b031602179055507f90a6fa2a9b79b910872ebca540cf3bd8be827f586e6420c30d8836e30012907e8284604051612e4c92919061598e565b60405180910390a15b5f5b612e64602086018661574c565b90508110156118ab57612ea983612e7e602088018861574c565b84818110612e8e57612e8e615701565b9050602002016020810190612ea39190614ccf565b84613a1c565b600101612e57565b606083516001600160401b03811115612ecc57612ecc614b00565b604051908082528060200260200182016040528015612eff57816020015b6060815260200190600190039081612eea5790505b5090505f7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663f0e0e67686866040518363ffffffff1660e01b8152600401612f519291906159d7565b5f60405180830381865afa158015612f6b573d5f5f3e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052612f9291908101906159fb565b90505f5b8551811015613194575f868281518110612fb257612fb2615701565b6020026020010151905085516001600160401b03811115612fd557612fd5614b00565b604051908082528060200260200182016040528015612ffe578160200160208202803683370190505b5084838151811061301157613011615701565b60209081029190910101525f5b865181101561318a575f87828151811061303a5761303a615701565b6020908102919091018101516001600160a01b038086165f90815260a18452604080822092841682529190935282209092506130759061414c565b9050806001600160401b03165f0361308e575050613182565b5f61309a858d85610884565b90508863ffffffff16816040015163ffffffff16111580156130c257505f8160200151600f0b125b156130e4576130d8815f01518260200151613ef5565b6001600160401b031681525b80515f906130ff906001600160401b039081169085166142cd565b90506131468189898151811061311757613117615701565b6020026020010151878151811061313057613130615701565b60200260200101516142e190919063ffffffff16565b89888151811061315857613158615701565b6020026020010151868151811061317157613171615701565b602002602001018181525050505050505b60010161301e565b5050600101612f96565b5050949350505050565b606654600160ff83161b908116036131c95760405163840a48d560e01b815260040160405180910390fd5b50565b5f6060816131dd604086018661574c565b90506001600160401b038111156131f6576131f6614b00565b60405190808252806020026020018201604052801561321f578160200160208202803683370190505b50905061322f604086018661574c565b90506001600160401b0381111561324857613248614b00565b604051908082528060200260200182016040528015613271578160200160208202803683370190505b50915060a55f61328086612979565b81526020019081526020015f205f815461329990615b07565b918290555092505f5b6132af604087018761574c565b905081101561389e5780158061334257506132cd604087018761574c565b6132d8600184615b1f565b8181106132e7576132e7615701565b90506020020160208101906132fc9190614ccf565b6001600160a01b0316613312604088018861574c565b8381811061332257613322615701565b90506020020160208101906133379190614ccf565b6001600160a01b0316115b61335f57604051639f1c805360e01b815260040160405180910390fd5b61336c606087018761574c565b8281811061337c5761337c615701565b905060200201355f1080156133bc5750670de0b6b3a76400006133a2606088018861574c565b838181106133b2576133b2615701565b9050602002013511155b6133d957604051631353603160e01b815260040160405180910390fd5b61341a6133e9604088018861574c565b838181106133f9576133f9615701565b905060200201602081019061340e9190614ccf565b60995f6114c089612979565b613437576040516331bc342760e11b815260040160405180910390fd5b5f8061348961344960208a018a614ccf565b61345289612979565b61345f60408c018c61574c565b8781811061346f5761346f615701565b90506020020160208101906134849190614ccf565b6129dc565b805191935091506001600160401b03165f036134a6575050613896565b5f6134e16134b760608b018b61574c565b868181106134c7576134c7615701565b85516001600160401b0316926020909102013590506142f5565b83519091506134fc6001600160401b038084169083166142cd565b86868151811061350e5761350e615701565b60200260200101818152505081835f0181815161352b9190615b32565b6001600160401b0316905250835182908590613548908390615b32565b6001600160401b0316905250602084018051839190613568908390615b32565b6001600160401b031690525060208301515f600f9190910b1215613680575f6135cb61359760608d018d61574c565b888181106135a7576135a7615701565b9050602002013585602001516135bc90615b51565b6001600160801b0316906142f5565b9050806001600160401b0316846020018181516135e89190615b75565b600f0b9052507f1487af5418c47ee5ea45ef4a93398668120890774a9e13487e61e9dc3baf76dd61361c60208d018d614ccf565b8b61362a60408f018f61574c565b8a81811061363a5761363a615701565b905060200201602081019061364f9190614ccf565b613660885f01518960200151613ef5565b8860400151604051613676959493929190615874565b60405180910390a1505b6136d261369060208c018c614ccf565b6136998b612979565b6136a660408e018e61574c565b898181106136b6576136b6615701565b90506020020160208101906136cb9190614ccf565b8787613f14565b7f1487af5418c47ee5ea45ef4a93398668120890774a9e13487e61e9dc3baf76dd61370060208c018c614ccf565b8a61370e60408e018e61574c565b8981811061371e5761371e615701565b90506020020160208101906137339190614ccf565b865160405161374794939291904390615874565b60405180910390a161379861375f60208c018c614ccf565b61376c60408d018d61574c565b8881811061377c5761377c615701565b90506020020160208101906137919190614ccf565b865161430b565b6001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016635ae679a76137d460208d018d614ccf565b8b8b8e80604001906137e6919061574c565b8b8181106137f6576137f6615701565b905060200201602081019061380b9190614ccf565b89516040516001600160e01b031960e088901b16815261383395949392918991600401615ba2565b6020604051808303815f875af115801561384f573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906138739190615bf5565b87868151811061388557613885615701565b602002602001018181525050505050505b6001016132a2565b507f80969ad29428d6797ee7aad084f9e4a42a82fc506dcd2ca3b6fb431f85ccebe56138cd6020870187614ccf565b856138db604089018961574c565b856138e960808c018c615900565b6040516138fc9796959493929190615c0c565b60405180910390a1509250929050565b60605f61087d8361438d565b6001600160a01b038381165f90815260a360209081526040808320938616835292905290812054600f81810b600160801b909204900b035b5f8111801561396257508261ffff1682105b15610b5c576001600160a01b038086165f90815260a3602090815260408083209388168352929052908120613996906143e6565b90505f5f6139a58884896129dc565b91509150806040015163ffffffff164310156139c357505050610b5c565b6139d08884898585613f14565b6001600160a01b038089165f90815260a360209081526040808320938b168352929052206139fd90614438565b50613a0785615b07565b9450613a1284615ca2565b9350505050613950565b8015613a9e576001600160a01b03821673beac0eeeeeeeeeeeeeeeeeeeeeeeeeeeeeebeac014801590613a8157507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316826001600160a01b031614155b613a9e57604051632711b74d60e11b815260040160405180910390fd5b613aae8260995f6122cf87612979565b613acb5760405163585cfb2f60e01b815260040160405180910390fd5b7f7ab260fe0af193db5f4986770d831bda4ea46099dc817e8b6716dcae8af8e88b838360405161279092919061598e565b60605f613b08836144b5565b6040805160208082528183019092529192505f91906020820181803683375050509182525060208101929092525090565b6001600160a01b0382165f908152609b60209081526040918290208251608081018452905463ffffffff808216835260ff600160201b830416151593830193909352650100000000008104831693820193909352600160481b909204166060820181905215801590613bb55750806060015163ffffffff164310155b15613bcf57604081015163ffffffff168152600160208201525b63ffffffff82166040820152613c057f0000000000000000000000000000000000000000000000000000000000000000436157f3565b613c109060016157f3565b63ffffffff90811660608381019182526001600160a01b0386165f818152609b602090815260409182902087518154838a0151858b01519851928a1664ffffffffff1990921691909117600160201b91151591909102176cffffffffffffffff0000000000191665010000000000978916979097026cffffffff000000000000000000191696909617600160481b968816968702179055815192835294871694820194909452928301919091527f4e85751d6331506c6c62335f207eb31f12a61e570f34f5c17640308785c6d4db9101612790565b6001600160a01b0381165f908152600183016020526040812054151561087d565b6001600160a01b038281165f81815260a2602090815260408083209486168084529482528083205493835260a38252808320948352939052918220546001600160401b039091169190600f81810b600160801b909204900b03815b81811015613e31576001600160a01b038087165f90815260a3602090815260408083209389168352929052908120613d9990836144dc565b6001600160a01b038881165f90815260a0602090815260408083208584528252808320938b16835292815290829020825160608101845290546001600160401b0381168252600160401b8104600f0b92820192909252600160c01b90910463ffffffff16918101829052919250431015613e14575050613e31565b613e22868260200151613ef5565b95505050806001019050613d61565b506001600160a01b038086165f90815260a1602090815260408083209388168352929052208390613e619061414c565b613e6b9190615b32565b9150509250929050565b5f61087d838361454b565b5f61087d836001600160a01b03841661454b565b5f61087d8383670de0b6b3a764000061462e565b5f613eb98460995f6114c089612979565b8015613ec25750815b80156114e757505090516001600160401b031615159392505050565b5f61087d6001600160401b03808516908416615cb7565b5f61087d613f0c836001600160401b038616615b75565b600f0b614683565b6020808301516001600160a01b038088165f90815260a284526040808220928816825291909352909120546001600160401b03908116911614613fda57602082810180516001600160a01b038881165f81815260a286526040808220938a1680835293875290819020805467ffffffffffffffff19166001600160401b0395861617905593518451918252948101919091529216908201527facf9095feb3a370c9cf692421c69ef320d4db5c66e6a7d29c7694eb02364fc559060600160405180910390a15b6001600160a01b038086165f90815260a060209081526040808320888452825280832093871683529281529082902083518154928501519385015163ffffffff16600160c01b0263ffffffff60c01b196001600160801b038616600160401b026001600160c01b03199095166001600160401b03909316929092179390931716919091179055600f0b156140bc576001600160a01b0385165f908152609f602090815260408083208784529091529020614094908461416a565b506001600160a01b0385165f908152609d602052604090206140b6908561415f565b50610b5c565b80516001600160401b03165f03610b5c576001600160a01b0385165f908152609f6020908152604080832087845290915290206140f99084613e80565b506001600160a01b0385165f908152609f60209081526040808320878452909152902061412590612c28565b5f03610b5c576001600160a01b0385165f908152609d602052604090206118ab9085613e75565b5f61093282670de0b6b3a76400006146ee565b5f61087d8383614725565b5f61087d836001600160a01b038416614725565b5f805b82518110156141ed576141ad848483815181106141a0576141a0615701565b60200260200101516108bd565b80156141d657506141d68382815181106141c9576141c9615701565b60200260200101516127d0565b156141e5576001915050610932565b600101614181565b505f9392505050565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663eab66d7a6040518163ffffffff1660e01b8152600401602060405180830381865afa158015614252573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906142769190615ce4565b6001600160a01b0316336001600160a01b0316146114ad5760405163794821ff60e01b815260040160405180910390fd5b5f825f0182815481106142bc576142bc615701565b905f5260205f200154905092915050565b5f61087d83670de0b6b3a764000084614771565b5f61087d8383670de0b6b3a7640000614771565b5f61087d8383670de0b6b3a76400006001614856565b6001600160a01b038084165f90815260a16020908152604080832093861683529290522061433a9043836148a5565b604080516001600160a01b038086168252841660208201526001600160401b038316918101919091527f1c6458079a41077d003c11faf9bf097e693bd67979e4e6500bac7b29db779b5c90606001612790565b6060815f018054806020026020016040519081016040528092919081815260200182805480156143da57602002820191905f5260205f20905b8154815260200190600101908083116143c6575b50505050509050919050565b5f6144008254600f81810b600160801b909204900b131590565b1561441e57604051631ed9509560e11b815260040160405180910390fd5b508054600f0b5f9081526001909101602052604090205490565b5f6144528254600f81810b600160801b909204900b131590565b1561447057604051631ed9509560e11b815260040160405180910390fd5b508054600f0b5f818152600180840160205260408220805492905583546fffffffffffffffffffffffffffffffff191692016001600160801b03169190911790915590565b5f60ff8216601f81111561093257604051632cd44ac360e21b815260040160405180910390fd5b5f5f6144fe6144ea846148be565b85546144f99190600f0b615cff565b614927565b8454909150600160801b9004600f90810b9082900b1261453157604051632d0483c560e21b815260040160405180910390fd5b600f0b5f9081526001939093016020525050604090205490565b5f8181526001830160205260408120548015614625575f61456d600183615b1f565b85549091505f9061458090600190615b1f565b90508181146145df575f865f01828154811061459e5761459e615701565b905f5260205f200154905080875f0184815481106145be576145be615701565b5f918252602080832090910192909255918252600188019052604090208390555b85548690806145f0576145f0615d26565b600190038181905f5260205f20015f90559055856001015f8681526020019081526020015f205f905560019350505050610932565b5f915050610932565b82545f908161463f86868385614990565b905080156146795761466386614656600184615b1f565b5f91825260209091200190565b54600160201b90046001600160e01b03166108b3565b5091949350505050565b5f6001600160401b038211156146ea5760405162461bcd60e51b815260206004820152602660248201527f53616665436173743a2076616c756520646f65736e27742066697420696e203660448201526534206269747360d01b60648201526084016128fe565b5090565b81545f90801561471d5761470784614656600184615b1f565b54600160201b90046001600160e01b031661092e565b509092915050565b5f81815260018301602052604081205461476a57508154600181810184555f848152602080822090930184905584548482528286019093526040902091909155610932565b505f610932565b5f80805f19858709858702925082811083820303915050805f036147a85783828161479e5761479e615d3a565b049250505061087d565b8084116147ef5760405162461bcd60e51b81526020600482015260156024820152744d6174683a206d756c446976206f766572666c6f7760581b60448201526064016128fe565b5f8486880960026001871981018816978890046003810283188082028403028082028403028082028403028082028403028082028403029081029092039091025f889003889004909101858311909403939093029303949094049190911702949350505050565b5f5f614863868686614771565b9050600183600281111561487957614879615d4e565b14801561489557505f848061489057614890615d3a565b868809115b156114e7576108b3600182615d62565b6148b983836001600160401b0384166149e3565b505050565b5f6001600160ff1b038211156146ea5760405162461bcd60e51b815260206004820152602860248201527f53616665436173743a2076616c756520646f65736e27742066697420696e2061604482015267371034b73a191a9b60c11b60648201526084016128fe565b80600f81900b811461498b5760405162461bcd60e51b815260206004820152602760248201527f53616665436173743a2076616c756520646f65736e27742066697420696e20316044820152663238206269747360c81b60648201526084016128fe565b919050565b5f5b81831015610a81575f6149a58484614ae6565b5f8781526020902090915063ffffffff86169082015463ffffffff1611156149cf578092506149dd565b6149da816001615d62565b93505b50614992565b82548015614a99575f6149fb85614656600185615b1f565b60408051808201909152905463ffffffff808216808452600160201b9092046001600160e01b031660208401529192509085161015614a4d5760405163151b8e3f60e11b815260040160405180910390fd5b805163ffffffff808616911603614a975782614a6e86614656600186615b1f565b80546001600160e01b0392909216600160201b0263ffffffff9092169190911790555050505050565b505b506040805180820190915263ffffffff92831681526001600160e01b03918216602080830191825285546001810187555f968752952091519051909216600160201b029190921617910155565b5f614af46002848418615d75565b61087d90848416615d62565b634e487b7160e01b5f52604160045260245ffd5b604051606081016001600160401b0381118282101715614b3657614b36614b00565b60405290565b604051601f8201601f191681016001600160401b0381118282101715614b6457614b64614b00565b604052919050565b6001600160a01b03811681146131c9575f5ffd5b803563ffffffff8116811461498b575f5ffd5b5f60408284031215614ba3575f5ffd5b604080519081016001600160401b0381118282101715614bc557614bc5614b00565b6040529050808235614bd681614b6c565b8152614be460208401614b80565b60208201525092915050565b5f60408284031215614c00575f5ffd5b61087d8383614b93565b5f5f5f60808486031215614c1c575f5ffd5b8335614c2781614b6c565b9250614c368560208601614b93565b91506060840135614c4681614b6c565b809150509250925092565b81516001600160401b03168152602080830151600f0b9082015260408083015163ffffffff169082015260608101610932565b5f5f60608385031215614c95575f5ffd5b8235614ca081614b6c565b9150614caf8460208501614b93565b90509250929050565b5f60208284031215614cc8575f5ffd5b5035919050565b5f60208284031215614cdf575f5ffd5b813561087d81614b6c565b80516001600160a01b0316825260209081015163ffffffff16910152565b5f8151808452602084019350602083015f5b82811015614d4357614d2d868351614cea565b6040959095019460209190910190600101614d1a565b5093949350505050565b602081525f61087d6020830184614d08565b5f5f83601f840112614d6f575f5ffd5b5081356001600160401b03811115614d85575f5ffd5b6020830191508360208260051b8501011115611045575f5ffd5b5f5f5f60408486031215614db1575f5ffd5b8335614dbc81614b6c565b925060208401356001600160401b03811115614dd6575f5ffd5b614de286828701614d5f565b9497909650939450505050565b5f6001600160401b03821115614e0757614e07614b00565b5060051b60200190565b5f82601f830112614e20575f5ffd5b8135614e33614e2e82614def565b614b3c565b8082825260208201915060208360051b860101925085831115614e54575f5ffd5b602085015b83811015614e7a578035614e6c81614b6c565b835260209283019201614e59565b5095945050505050565b5f5f5f60808486031215614e96575f5ffd5b614ea08585614b93565b925060408401356001600160401b03811115614eba575f5ffd5b614ec686828701614e11565b92505060608401356001600160401b03811115614ee1575f5ffd5b614eed86828701614e11565b9150509250925092565b5f8151808452602084019350602083015f5b82811015614d43578151865260209586019590910190600101614f09565b5f602082016020835280845180835260408501915060408160051b8601019250602086015f5b82811015614f7e57603f19878603018452614f69858351614ef7565b94506020938401939190910190600101614f4d565b50929695505050505050565b5f5f5f5f60a08587031215614f9d575f5ffd5b614fa78686614b93565b935060408501356001600160401b03811115614fc1575f5ffd5b614fcd87828801614e11565b93505060608501356001600160401b03811115614fe8575f5ffd5b614ff487828801614e11565b92505061500360808601614b80565b905092959194509250565b5f5f5f5f5f60608688031215615022575f5ffd5b853561502d81614b6c565b945060208601356001600160401b03811115615047575f5ffd5b61505388828901614d5f565b90955093505060408601356001600160401b03811115615071575f5ffd5b61507d88828901614d5f565b969995985093965092949392505050565b5f5f6040838503121561509f575f5ffd5b82356150aa81614b6c565b915060208301356001600160401b038111156150c4575f5ffd5b830160a081860312156150d5575f5ffd5b809150509250929050565b828152604060208201525f610b716040830184614ef7565b5f5f60408385031215615109575f5ffd5b823561511481614b6c565b915060208301356150d581614b6c565b5f8151808452602084019350602083015f5b82811015614d435761516f86835180516001600160401b03168252602080820151600f0b9083015260409081015163ffffffff16910152565b6060959095019460209190910190600101615136565b604081525f6151976040830185614d08565b82810360208401526114e78185615124565b5f8151808452602084019350602083015f5b82811015614d435781516001600160a01b03168652602095860195909101906001016151bb565b602081525f61087d60208301846151a9565b5f5f60408385031215615205575f5ffd5b82356001600160401b0381111561521a575f5ffd5b61522685828601614e11565b92505060208301356150d581614b6c565b602080825282518282018190525f918401906040840190835b818110156152775783516001600160401b0316835260209384019390920191600101615250565b509095945050505050565b5f5f5f5f60608587031215615295575f5ffd5b84356152a081614b6c565b93506152ae60208601614b80565b925060408501356001600160401b038111156152c8575f5ffd5b6152d487828801614d5f565b95989497509550505050565b5f5f604083850312156152f1575f5ffd5b82356152fc81614b6c565b915060208301356001600160401b03811115615316575f5ffd5b613e6b85828601614e11565b602081525f82518060208401528060208501604085015e5f604082850101526040601f19601f83011684010191505092915050565b5f5f60408385031215615368575f5ffd5b823561537381614b6c565b9150614caf60208401614b80565b5f60208284031215615391575f5ffd5b813560ff8116811461087d575f5ffd5b5f606082840312156153b1575f5ffd5b50919050565b5f602082840312156153c7575f5ffd5b81356001600160401b038111156153dc575f5ffd5b61092e848285016153a1565b5f5f5f608084860312156153fa575f5ffd5b83356001600160401b0381111561540f575f5ffd5b61541b86828701614e11565b935050614c368560208601614b93565b602081525f61087d6020830184615124565b5f5f5f6060848603121561544f575f5ffd5b833561545a81614b6c565b925060208401356001600160401b03811115615474575f5ffd5b61548086828701614e11565b92505061548f60408501614b80565b90509250925092565b5f5f604083850312156154a9575f5ffd5b82356154b481614b6c565b915060208301356001600160401b038111156154ce575f5ffd5b8301601f810185136154de575f5ffd5b80356154ec614e2e82614def565b8082825260208201915060208360051b85010192508783111561550d575f5ffd5b602084015b838110156156325780356001600160401b0381111561552f575f5ffd5b85016080818b03601f19011215615544575f5ffd5b61554c614b14565b6155598b60208401614b93565b815260608201356001600160401b03811115615573575f5ffd5b6155828c602083860101614e11565b60208301525060808201356001600160401b038111156155a0575f5ffd5b6020818401019250508a601f8301126155b7575f5ffd5b81356155c5614e2e82614def565b8082825260208201915060208360051b86010192508d8311156155e6575f5ffd5b6020850194505b8285101561561c5784356001600160401b038116811461560b575f5ffd5b8252602094850194909101906155ed565b6040840152505084525060209283019201615512565b50809450505050509250929050565b5f5f5f60408486031215615653575f5ffd5b833561565e81614b6c565b925060208401356001600160401b03811115615678575f5ffd5b8401601f81018613615688575f5ffd5b80356001600160401b0381111561569d575f5ffd5b8660208284010111156156ae575f5ffd5b939660209190910195509293505050565b5f5f604083850312156156d0575f5ffd5b82356156db81614b6c565b915060208301356001600160401b038111156156f5575f5ffd5b613e6b858286016153a1565b634e487b7160e01b5f52603260045260245ffd5b5f8235603e19833603018112615729575f5ffd5b9190910192915050565b5f60208284031215615743575f5ffd5b61087d82614b80565b5f5f8335601e19843603018112615761575f5ffd5b8301803591506001600160401b0382111561577a575f5ffd5b6020019150600581901b3603821315611045575f5ffd5b5f602082840312156157a1575f5ffd5b813561ffff8116811461087d575f5ffd5b5f602082840312156157c2575f5ffd5b8151801515811461087d575f5ffd5b604081016109328284614cea565b634e487b7160e01b5f52601160045260245ffd5b63ffffffff8181168382160190811115610932576109326157df565b8183526020830192505f815f5b84811015614d435763ffffffff61583283614b80565b168652602095860195919091019060010161581c565b6001600160a01b038581168252841660208201526060604082018190525f906108b3908301848661580f565b6001600160a01b038616815260c081016158916020830187614cea565b6001600160a01b039490941660608201526001600160401b0392909216608083015263ffffffff1660a09091015292915050565b81835281816020850137505f828201602090810191909152601f909101601f19169091010190565b602081525f610b716020830184866158c5565b5f5f8335601e19843603018112615915575f5ffd5b8301803591506001600160401b0382111561592e575f5ffd5b602001915036819003821315611045575f5ffd5b6001600160a01b038781168252861660208201526080604082018190525f9061596e908301868861580f565b82810360608401526159818185876158c5565b9998505050505050505050565b6060810161599c8285614cea565b6001600160a01b039290921660409190910152919050565b805160208083015191908110156153b1575f1960209190910360031b1b16919050565b604081525f6159e960408301856151a9565b82810360208401526114e781856151a9565b5f60208284031215615a0b575f5ffd5b81516001600160401b03811115615a20575f5ffd5b8201601f81018413615a30575f5ffd5b8051615a3e614e2e82614def565b8082825260208201915060208360051b850101925086831115615a5f575f5ffd5b602084015b83811015615afc5780516001600160401b03811115615a81575f5ffd5b8501603f81018913615a91575f5ffd5b6020810151615aa2614e2e82614def565b808282526020820191506020808460051b8601010192508b831115615ac5575f5ffd5b6040840193505b82841015615ae7578351825260209384019390910190615acc565b86525050602093840193919091019050615a64565b509695505050505050565b5f60018201615b1857615b186157df565b5060010190565b81810381811115610932576109326157df565b6001600160401b038281168282160390811115610932576109326157df565b5f81600f0b60016001607f1b03198103615b6d57615b6d6157df565b5f0392915050565b600f81810b9083900b0160016001607f1b03811360016001607f1b031982121715610932576109326157df565b6001600160a01b038716815260e08101615bbf6020830188614cea565b60608201959095526001600160a01b039390931660808401526001600160401b0391821660a08401521660c09091015292915050565b5f60208284031215615c05575f5ffd5b5051919050565b6001600160a01b03881681525f60c08201615c2a602084018a614cea565b60c060608401528690528660e083015f5b88811015615c6b578235615c4e81614b6c565b6001600160a01b0316825260209283019290910190600101615c3b565b508381036080850152615c7e8188614ef7565b91505082810360a0840152615c948185876158c5565b9a9950505050505050505050565b5f81615cb057615cb06157df565b505f190190565b600f82810b9082900b0360016001607f1b0319811260016001607f1b0382131715610932576109326157df565b5f60208284031215615cf4575f5ffd5b815161087d81614b6c565b8082018281125f831280158216821582161715615d1e57615d1e6157df565b505092915050565b634e487b7160e01b5f52603160045260245ffd5b634e487b7160e01b5f52601260045260245ffd5b634e487b7160e01b5f52602160045260245ffd5b80820180821115610932576109326157df565b5f82615d8f57634e487b7160e01b5f52601260045260245ffd5b50049056fea2646970667358221220e6558cc233ddec01b4f105ba85995f702aa766ccaa81881e2e04ab296beac9d464736f6c634300081b0033",
}
⋮----
// 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, _delegation common.Address, _eigenStrategy common.Address, _pauserRegistry common.Address, _permissionController common.Address, _DEALLOCATION_DELAY uint32, _ALLOCATION_CONFIGURATION_DELAY uint32, _version string) (common.Address, *types.Transaction, *AllocationManager, error)
⋮----
// 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)
⋮----
// 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 operator, address strategy) view returns(uint64)
func (_AllocationManager *AllocationManagerCaller) 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 (_AllocationManager *AllocationManagerCaller) 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 (_AllocationManager *AllocationManagerCaller) 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 (_AllocationManager *AllocationManagerCaller) 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 (_AllocationManager *AllocationManagerCaller) 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 (_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[] operators, (address,uint32) operatorSet, address strategy) view returns((uint64,int128,uint32)[])
func (_AllocationManager *AllocationManagerCaller) 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 (_AllocationManager *AllocationManagerCaller) 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 (_AllocationManager *AllocationManagerCaller) 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 (_AllocationManager *AllocationManagerCaller) 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 (_AllocationManager *AllocationManagerCaller) 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 (_AllocationManager *AllocationManagerCaller) 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 (_AllocationManager *AllocationManagerCaller) 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 (_AllocationManager *AllocationManagerCaller) 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 (_AllocationManager *AllocationManagerCaller) 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 (_AllocationManager *AllocationManagerCaller) GetOperatorSetCount(opts *bind.CallOpts, avs common.Address) (*big.Int, error)
⋮----
// 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 operator) view returns((address,uint32)[])
func (_AllocationManager *AllocationManagerCaller) 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 (_AllocationManager *AllocationManagerCaller) GetSlashCount(opts *bind.CallOpts, operatorSet OperatorSet) (*big.Int, error)
⋮----
// GetStrategiesInOperatorSet is a free data retrieval call binding the contract method 0x4177a87c.
⋮----
// Solidity: function getStrategiesInOperatorSet((address,uint32) operatorSet) view returns(address[])
func (_AllocationManager *AllocationManagerCaller) 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 (_AllocationManager *AllocationManagerCaller) 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 (_AllocationManager *AllocationManagerCaller) 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 (_AllocationManager *AllocationManagerCaller) 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 (_AllocationManager *AllocationManagerCaller) 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 (_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)
⋮----
// Version is a free data retrieval call binding the contract method 0x54fd4d50.
⋮----
// Solidity: function version() view returns(string)
func (_AllocationManager *AllocationManagerCaller) Version(opts *bind.CallOpts) (string, error)
⋮----
// 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)
⋮----
// 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)
⋮----
// 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)
⋮----
// 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)
⋮----
// 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)
⋮----
// 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
)
⋮----
// 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
}
⋮----
// 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
}
⋮----
// AllocationManagerStorageMetaData contains all meta data concerning the AllocationManagerStorage contract.
var AllocationManagerStorageMetaData = &bind.MetaData{
	ABI: "[{\"type\":\"function\",\"name\":\"ALLOCATION_CONFIGURATION_DELAY\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"DEALLOCATION_DELAY\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"addStrategiesToOperatorSet\",\"inputs\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"operatorSetId\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"strategies\",\"type\":\"address[]\",\"internalType\":\"contractIStrategy[]\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"clearDeallocationQueue\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"strategies\",\"type\":\"address[]\",\"internalType\":\"contractIStrategy[]\"},{\"name\":\"numToClear\",\"type\":\"uint16[]\",\"internalType\":\"uint16[]\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"createOperatorSets\",\"inputs\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"params\",\"type\":\"tuple[]\",\"internalType\":\"structIAllocationManagerTypes.CreateSetParams[]\",\"components\":[{\"name\":\"operatorSetId\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"strategies\",\"type\":\"address[]\",\"internalType\":\"contractIStrategy[]\"}]}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"createRedistributingOperatorSets\",\"inputs\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"params\",\"type\":\"tuple[]\",\"internalType\":\"structIAllocationManagerTypes.CreateSetParams[]\",\"components\":[{\"name\":\"operatorSetId\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"strategies\",\"type\":\"address[]\",\"internalType\":\"contractIStrategy[]\"}]},{\"name\":\"redistributionRecipients\",\"type\":\"address[]\",\"internalType\":\"address[]\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"delegation\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIDelegationManager\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"deregisterFromOperatorSets\",\"inputs\":[{\"name\":\"params\",\"type\":\"tuple\",\"internalType\":\"structIAllocationManagerTypes.DeregisterParams\",\"components\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"operatorSetIds\",\"type\":\"uint32[]\",\"internalType\":\"uint32[]\"}]}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"eigenStrategy\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getAVSRegistrar\",\"inputs\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIAVSRegistrar\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getAllocatableMagnitude\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"strategy\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getAllocatedSets\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"tuple[]\",\"internalType\":\"structOperatorSet[]\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getAllocatedStake\",\"inputs\":[{\"name\":\"operatorSet\",\"type\":\"tuple\",\"internalType\":\"structOperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]},{\"name\":\"operators\",\"type\":\"address[]\",\"internalType\":\"address[]\"},{\"name\":\"strategies\",\"type\":\"address[]\",\"internalType\":\"contractIStrategy[]\"}],\"outputs\":[{\"name\":\"slashableStake\",\"type\":\"uint256[][]\",\"internalType\":\"uint256[][]\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getAllocatedStrategies\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"operatorSet\",\"type\":\"tuple\",\"internalType\":\"structOperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]}],\"outputs\":[{\"name\":\"\",\"type\":\"address[]\",\"internalType\":\"contractIStrategy[]\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getAllocation\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"operatorSet\",\"type\":\"tuple\",\"internalType\":\"structOperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]},{\"name\":\"strategy\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"}],\"outputs\":[{\"name\":\"\",\"type\":\"tuple\",\"internalType\":\"structIAllocationManagerTypes.Allocation\",\"components\":[{\"name\":\"currentMagnitude\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"pendingDiff\",\"type\":\"int128\",\"internalType\":\"int128\"},{\"name\":\"effectBlock\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getAllocationDelay\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"isSet\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"delay\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getAllocations\",\"inputs\":[{\"name\":\"operators\",\"type\":\"address[]\",\"internalType\":\"address[]\"},{\"name\":\"operatorSet\",\"type\":\"tuple\",\"internalType\":\"structOperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]},{\"name\":\"strategy\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"}],\"outputs\":[{\"name\":\"\",\"type\":\"tuple[]\",\"internalType\":\"structIAllocationManagerTypes.Allocation[]\",\"components\":[{\"name\":\"currentMagnitude\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"pendingDiff\",\"type\":\"int128\",\"internalType\":\"int128\"},{\"name\":\"effectBlock\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getEncumberedMagnitude\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"strategy\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getMaxMagnitude\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"strategy\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getMaxMagnitudes\",\"inputs\":[{\"name\":\"operators\",\"type\":\"address[]\",\"internalType\":\"address[]\"},{\"name\":\"strategy\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint64[]\",\"internalType\":\"uint64[]\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getMaxMagnitudes\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"strategies\",\"type\":\"address[]\",\"internalType\":\"contractIStrategy[]\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint64[]\",\"internalType\":\"uint64[]\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getMaxMagnitudesAtBlock\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"strategies\",\"type\":\"address[]\",\"internalType\":\"contractIStrategy[]\"},{\"name\":\"blockNumber\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint64[]\",\"internalType\":\"uint64[]\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getMemberCount\",\"inputs\":[{\"name\":\"operatorSet\",\"type\":\"tuple\",\"internalType\":\"structOperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getMembers\",\"inputs\":[{\"name\":\"operatorSet\",\"type\":\"tuple\",\"internalType\":\"structOperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]}],\"outputs\":[{\"name\":\"operators\",\"type\":\"address[]\",\"internalType\":\"address[]\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getMinimumSlashableStake\",\"inputs\":[{\"name\":\"operatorSet\",\"type\":\"tuple\",\"internalType\":\"structOperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]},{\"name\":\"operators\",\"type\":\"address[]\",\"internalType\":\"address[]\"},{\"name\":\"strategies\",\"type\":\"address[]\",\"internalType\":\"contractIStrategy[]\"},{\"name\":\"futureBlock\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"outputs\":[{\"name\":\"slashableStake\",\"type\":\"uint256[][]\",\"internalType\":\"uint256[][]\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getOperatorSetCount\",\"inputs\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getRedistributionRecipient\",\"inputs\":[{\"name\":\"operatorSet\",\"type\":\"tuple\",\"internalType\":\"structOperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]}],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getRegisteredSets\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"operatorSets\",\"type\":\"tuple[]\",\"internalType\":\"structOperatorSet[]\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getSlashCount\",\"inputs\":[{\"name\":\"operatorSet\",\"type\":\"tuple\",\"internalType\":\"structOperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getStrategiesInOperatorSet\",\"inputs\":[{\"name\":\"operatorSet\",\"type\":\"tuple\",\"internalType\":\"structOperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]}],\"outputs\":[{\"name\":\"strategies\",\"type\":\"address[]\",\"internalType\":\"contractIStrategy[]\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getStrategyAllocations\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"strategy\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"}],\"outputs\":[{\"name\":\"\",\"type\":\"tuple[]\",\"internalType\":\"structOperatorSet[]\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]},{\"name\":\"\",\"type\":\"tuple[]\",\"internalType\":\"structIAllocationManagerTypes.Allocation[]\",\"components\":[{\"name\":\"currentMagnitude\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"pendingDiff\",\"type\":\"int128\",\"internalType\":\"int128\"},{\"name\":\"effectBlock\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"initialize\",\"inputs\":[{\"name\":\"initialPausedStatus\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"isMemberOfOperatorSet\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"operatorSet\",\"type\":\"tuple\",\"internalType\":\"structOperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"isOperatorRedistributable\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"isOperatorSet\",\"inputs\":[{\"name\":\"operatorSet\",\"type\":\"tuple\",\"internalType\":\"structOperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"isOperatorSlashable\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"operatorSet\",\"type\":\"tuple\",\"internalType\":\"structOperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"isRedistributingOperatorSet\",\"inputs\":[{\"name\":\"operatorSet\",\"type\":\"tuple\",\"internalType\":\"structOperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"modifyAllocations\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"params\",\"type\":\"tuple[]\",\"internalType\":\"structIAllocationManagerTypes.AllocateParams[]\",\"components\":[{\"name\":\"operatorSet\",\"type\":\"tuple\",\"internalType\":\"structOperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]},{\"name\":\"strategies\",\"type\":\"address[]\",\"internalType\":\"contractIStrategy[]\"},{\"name\":\"newMagnitudes\",\"type\":\"uint64[]\",\"internalType\":\"uint64[]\"}]}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"registerForOperatorSets\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"params\",\"type\":\"tuple\",\"internalType\":\"structIAllocationManagerTypes.RegisterParams\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"operatorSetIds\",\"type\":\"uint32[]\",\"internalType\":\"uint32[]\"},{\"name\":\"data\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"removeStrategiesFromOperatorSet\",\"inputs\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"operatorSetId\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"strategies\",\"type\":\"address[]\",\"internalType\":\"contractIStrategy[]\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"setAVSRegistrar\",\"inputs\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"registrar\",\"type\":\"address\",\"internalType\":\"contractIAVSRegistrar\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"setAllocationDelay\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"delay\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"slashOperator\",\"inputs\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"params\",\"type\":\"tuple\",\"internalType\":\"structIAllocationManagerTypes.SlashingParams\",\"components\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"operatorSetId\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"strategies\",\"type\":\"address[]\",\"internalType\":\"contractIStrategy[]\"},{\"name\":\"wadsToSlash\",\"type\":\"uint256[]\",\"internalType\":\"uint256[]\"},{\"name\":\"description\",\"type\":\"string\",\"internalType\":\"string\"}]}],\"outputs\":[{\"name\":\"slashId\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"shares\",\"type\":\"uint256[]\",\"internalType\":\"uint256[]\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"updateAVSMetadataURI\",\"inputs\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"metadataURI\",\"type\":\"string\",\"internalType\":\"string\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"version\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"string\",\"internalType\":\"string\"}],\"stateMutability\":\"view\"},{\"type\":\"event\",\"name\":\"AVSMetadataURIUpdated\",\"inputs\":[{\"name\":\"avs\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"metadataURI\",\"type\":\"string\",\"indexed\":false,\"internalType\":\"string\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"AVSRegistrarSet\",\"inputs\":[{\"name\":\"avs\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"},{\"name\":\"registrar\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"contractIAVSRegistrar\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"AllocationDelaySet\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"},{\"name\":\"delay\",\"type\":\"uint32\",\"indexed\":false,\"internalType\":\"uint32\"},{\"name\":\"effectBlock\",\"type\":\"uint32\",\"indexed\":false,\"internalType\":\"uint32\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"AllocationUpdated\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"},{\"name\":\"operatorSet\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structOperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]},{\"name\":\"strategy\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"contractIStrategy\"},{\"name\":\"magnitude\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"},{\"name\":\"effectBlock\",\"type\":\"uint32\",\"indexed\":false,\"internalType\":\"uint32\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"EncumberedMagnitudeUpdated\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"},{\"name\":\"strategy\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"contractIStrategy\"},{\"name\":\"encumberedMagnitude\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"MaxMagnitudeUpdated\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"},{\"name\":\"strategy\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"contractIStrategy\"},{\"name\":\"maxMagnitude\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"OperatorAddedToOperatorSet\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"operatorSet\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structOperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"OperatorRemovedFromOperatorSet\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"operatorSet\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structOperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"OperatorSetCreated\",\"inputs\":[{\"name\":\"operatorSet\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structOperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"OperatorSlashed\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"},{\"name\":\"operatorSet\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structOperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]},{\"name\":\"strategies\",\"type\":\"address[]\",\"indexed\":false,\"internalType\":\"contractIStrategy[]\"},{\"name\":\"wadSlashed\",\"type\":\"uint256[]\",\"indexed\":false,\"internalType\":\"uint256[]\"},{\"name\":\"description\",\"type\":\"string\",\"indexed\":false,\"internalType\":\"string\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"RedistributionAddressSet\",\"inputs\":[{\"name\":\"operatorSet\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structOperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]},{\"name\":\"redistributionRecipient\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"StrategyAddedToOperatorSet\",\"inputs\":[{\"name\":\"operatorSet\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structOperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]},{\"name\":\"strategy\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"contractIStrategy\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"StrategyRemovedFromOperatorSet\",\"inputs\":[{\"name\":\"operatorSet\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structOperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]},{\"name\":\"strategy\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"contractIStrategy\"}],\"anonymous\":false},{\"type\":\"error\",\"name\":\"AlreadyMemberOfSet\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InputArrayLengthMismatch\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InsufficientMagnitude\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidAVSRegistrar\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidCaller\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidOperator\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidOperatorSet\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidRedistributionRecipient\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidStrategy\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidWadToSlash\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ModificationAlreadyPending\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"NonexistentAVSMetadata\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"NotMemberOfSet\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"OperatorNotSlashable\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"SameMagnitude\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"StrategiesMustBeInAscendingOrder\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"StrategyAlreadyInOperatorSet\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"StrategyNotInOperatorSet\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"UninitializedAllocationDelay\",\"inputs\":[]}]",
}
⋮----
// AllocationManagerStorageABI is the input ABI used to generate the binding from.
// 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)
⋮----
// 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)
⋮----
// GetAVSRegistrar is a free data retrieval call binding the contract method 0x304c10cd.
⋮----
// Solidity: function getAVSRegistrar(address avs) view returns(address)
func (_AllocationManagerStorage *AllocationManagerStorageCaller) 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 (_AllocationManagerStorage *AllocationManagerStorageCaller) 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 (_AllocationManagerStorage *AllocationManagerStorageCaller) 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 (_AllocationManagerStorage *AllocationManagerStorageCaller) 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 (_AllocationManagerStorage *AllocationManagerStorageCaller) 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 (_AllocationManagerStorage *AllocationManagerStorageCaller) 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 (_AllocationManagerStorage *AllocationManagerStorageCaller) 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 (_AllocationManagerStorage *AllocationManagerStorageCaller) 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 (_AllocationManagerStorage *AllocationManagerStorageCaller) 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 (_AllocationManagerStorage *AllocationManagerStorageCaller) 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 (_AllocationManagerStorage *AllocationManagerStorageCaller) 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 (_AllocationManagerStorage *AllocationManagerStorageCaller) 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 (_AllocationManagerStorage *AllocationManagerStorageCaller) 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 (_AllocationManagerStorage *AllocationManagerStorageCaller) 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 (_AllocationManagerStorage *AllocationManagerStorageCaller) 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 (_AllocationManagerStorage *AllocationManagerStorageCaller) 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 (_AllocationManagerStorage *AllocationManagerStorageCaller) GetOperatorSetCount(opts *bind.CallOpts, avs common.Address) (*big.Int, error)
⋮----
// GetRedistributionRecipient is a free data retrieval call binding the contract method 0x0f3df50e.
⋮----
// Solidity: function getRedistributionRecipient((address,uint32) operatorSet) view returns(address)
func (_AllocationManagerStorage *AllocationManagerStorageCaller) 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 (_AllocationManagerStorage *AllocationManagerStorageCaller) 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 (_AllocationManagerStorage *AllocationManagerStorageCaller) GetSlashCount(opts *bind.CallOpts, operatorSet OperatorSet) (*big.Int, error)
⋮----
// GetStrategiesInOperatorSet is a free data retrieval call binding the contract method 0x4177a87c.
⋮----
// Solidity: function getStrategiesInOperatorSet((address,uint32) operatorSet) view returns(address[] strategies)
func (_AllocationManagerStorage *AllocationManagerStorageCaller) 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 (_AllocationManagerStorage *AllocationManagerStorageCaller) 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 (_AllocationManagerStorage *AllocationManagerStorageCaller) 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 (_AllocationManagerStorage *AllocationManagerStorageCaller) 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 (_AllocationManagerStorage *AllocationManagerStorageCaller) 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 (_AllocationManagerStorage *AllocationManagerStorageCaller) 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 (_AllocationManagerStorage *AllocationManagerStorageCaller) IsRedistributingOperatorSet(opts *bind.CallOpts, operatorSet OperatorSet) (bool, error)
⋮----
// Version is a free data retrieval call binding the contract method 0x54fd4d50.
⋮----
// Solidity: function version() view returns(string)
func (_AllocationManagerStorage *AllocationManagerStorageCaller) Version(opts *bind.CallOpts) (string, error)
⋮----
// AddStrategiesToOperatorSet is a paid mutator transaction binding the contract method 0x50feea20.
⋮----
// Solidity: function addStrategiesToOperatorSet(address avs, uint32 operatorSetId, address[] strategies) returns()
func (_AllocationManagerStorage *AllocationManagerStorageTransactor) 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 (_AllocationManagerStorage *AllocationManagerStorageTransactor) 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 (_AllocationManagerStorage *AllocationManagerStorageTransactor) CreateOperatorSets(opts *bind.TransactOpts, avs common.Address, params []IAllocationManagerTypesCreateSetParams) (*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 (_AllocationManagerStorage *AllocationManagerStorageTransactor) CreateRedistributingOperatorSets(opts *bind.TransactOpts, avs common.Address, params []IAllocationManagerTypesCreateSetParams, 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 (_AllocationManagerStorage *AllocationManagerStorageTransactor) 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 (_AllocationManagerStorage *AllocationManagerStorageTransactor) Initialize(opts *bind.TransactOpts, initialPausedStatus *big.Int) (*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 (_AllocationManagerStorage *AllocationManagerStorageTransactor) ModifyAllocations(opts *bind.TransactOpts, operator common.Address, params []IAllocationManagerTypesAllocateParams) (*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 (_AllocationManagerStorage *AllocationManagerStorageTransactor) 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 (_AllocationManagerStorage *AllocationManagerStorageTransactor) 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 (_AllocationManagerStorage *AllocationManagerStorageTransactor) 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 (_AllocationManagerStorage *AllocationManagerStorageTransactor) 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 (_AllocationManagerStorage *AllocationManagerStorageTransactor) SlashOperator(opts *bind.TransactOpts, avs common.Address, params IAllocationManagerTypesSlashingParams) (*types.Transaction, error)
⋮----
// UpdateAVSMetadataURI is a paid mutator transaction binding the contract method 0xa9821821.
⋮----
// Solidity: function updateAVSMetadataURI(address avs, string metadataURI) returns()
func (_AllocationManagerStorage *AllocationManagerStorageTransactor) UpdateAVSMetadataURI(opts *bind.TransactOpts, avs common.Address, metadataURI string) (*types.Transaction, 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)
⋮----
// 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/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: "0x60e060405234801561000f575f5ffd5b5060405161185938038061185983398101604081905261002e916101b3565b808084846001600160a01b038116610059576040516339b190bb60e11b815260040160405180910390fd5b6001600160a01b039081166080521660a0526100748161008a565b60c0525061008290506100d0565b5050506102e4565b5f5f829050601f815111156100bd578260405163305a27a960e01b81526004016100b49190610289565b60405180910390fd5b80516100c8826102be565b179392505050565b5f54610100900460ff16156101375760405162461bcd60e51b815260206004820152602760248201527f496e697469616c697a61626c653a20636f6e747261637420697320696e697469604482015266616c697a696e6760c81b60648201526084016100b4565b5f5460ff90811614610186575f805460ff191660ff9081179091556040519081527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b565b6001600160a01b038116811461019c575f5ffd5b50565b634e487b7160e01b5f52604160045260245ffd5b5f5f5f606084860312156101c5575f5ffd5b83516101d081610188565b60208501519093506101e181610188565b60408501519092506001600160401b038111156101fc575f5ffd5b8401601f8101861361020c575f5ffd5b80516001600160401b038111156102255761022561019f565b604051601f8201601f19908116603f011681016001600160401b03811182821017156102535761025361019f565b60405281815282820160200188101561026a575f5ffd5b8160208401602083015e5f602083830101528093505050509250925092565b602081525f82518060208401528060208501604085015e5f604082850101526040601f19601f83011684010191505092915050565b805160208083015191908110156102de575f198160200360031b1b821691505b50919050565b60805160a05160c05161152f61032a5f395f81816104240152610d4d01525f8181610360015261053901525f818161023c01528181610ac90152610dbc015261152f5ff3fe608060405234801561000f575f5ffd5b5060043610610148575f3560e01c8063a1060c88116100bf578063dce974b911610079578063dce974b914610334578063df5cf7231461035b578063ec76f44214610382578063f2fde38b146103b5578063f698da25146103c8578063fabc1cbc146103d0575f5ffd5b8063a1060c881461029a578063a364f4da146102ad578063a98fb355146102c0578063c825fe68146102d3578063cd6dc687146102fa578063d79aceab1461030d575f5ffd5b80635ac86ab7116101105780635ac86ab7146101fa5780635c975abb1461021d578063715018a61461022f578063886f1195146102375780638da5cb5b146102765780639926ee7d14610287575f5ffd5b8063136439dd1461014c578063374823b51461016157806349075da3146101a357806354fd4d50146101dd578063595c6a67146101f2575b5f5ffd5b61015f61015a3660046110dc565b6103e3565b005b61018e61016f366004611107565b609960209081525f928352604080842090915290825290205460ff1681565b60405190151581526020015b60405180910390f35b6101d06101b1366004611131565b609860209081525f928352604080842090915290825290205460ff1681565b60405161019a919061117c565b6101e561041d565b60405161019a91906111d0565b61015f61044d565b61018e6102083660046111e9565b606654600160ff9092169190911b9081161490565b6066545b60405190815260200161019a565b61015f610461565b61025e7f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b03909116815260200161019a565b6033546001600160a01b031661025e565b61015f610295366004611277565b610472565b6102216102a8366004611364565b610673565b61015f6102bb3660046113a7565b6106f2565b61015f6102ce3660046113c2565b6107b9565b6102217f809c5ac049c45b7a7f050a20f00c16cf63797efbf8b1eb8d749fdfa39ff8f92981565b61015f610308366004611107565b610800565b6102217fda2c89bafdd34776a2b8bb9c83c82f419e20cc8c67207f70edd58249b92661bd81565b6102217f4ee65f64218c67b68da66fd0db16560040a6b973290b9e71912d661ee53fe49581565b61025e7f000000000000000000000000000000000000000000000000000000000000000081565b61015f6103903660046110dc565b335f90815260996020908152604080832093835292905220805460ff19166001179055565b61015f6103c33660046113a7565b61091c565b610221610995565b61015f6103de3660046110dc565b610a4e565b6103eb610ab4565b60665481811681146104105760405163c61dca5d60e01b815260040160405180910390fd5b61041982610b57565b5050565b60606104487f0000000000000000000000000000000000000000000000000000000000000000610b94565b905090565b610455610ab4565b61045f5f19610b57565b565b610469610bd1565b61045f5f610c2b565b5f61047c81610c7c565b6001335f9081526098602090815260408083206001600160a01b038816845290915290205460ff1660018111156104b5576104b5611168565b036104d357604051631aa528bb60e11b815260040160405180910390fd5b6001600160a01b0383165f90815260996020908152604080832085830151845290915290205460ff161561051a57604051630d4c4c9160e21b815260040160405180910390fd5b6040516336b87bd760e11b81526001600160a01b0384811660048301527f00000000000000000000000000000000000000000000000000000000000000001690636d70f7ae90602401602060405180830381865afa15801561057e573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906105a29190611430565b6105bf57604051639f88c8af60e01b815260040160405180910390fd5b6105e3836105d7853386602001518760400151610673565b84516040860151610ca7565b6001600160a01b0383165f81815260996020908152604080832086830151845282528083208054600160ff19918216811790925533808652609885528386208787529094529382902080549094168117909355519092917ff0952b1c65271d819d39983d2abb044b9cace59bcc4d4dd389f586ebdcb15b4191610666919061117c565b60405180910390a3505050565b604080517fda2c89bafdd34776a2b8bb9c83c82f419e20cc8c67207f70edd58249b92661bd60208201526001600160a01b038087169282019290925290841660608201526080810183905260a081018290525f906106e99060c00160405160208183030381529060405280519060200120610cff565b95945050505050565b5f6106fc81610c7c565b6001335f9081526098602090815260408083206001600160a01b038716845290915290205460ff16600181111561073557610735611168565b14610753576040516352df45c960e01b815260040160405180910390fd5b335f8181526098602090815260408083206001600160a01b0387168085529252808320805460ff191690555190917ff0952b1c65271d819d39983d2abb044b9cace59bcc4d4dd389f586ebdcb15b41916107ad919061117c565b60405180910390a35050565b336001600160a01b03167fa89c1dc243d8908a96dd84944bcc97d6bc6ac00dd78e20621576be6a3c94371383836040516107f492919061144f565b60405180910390a25050565b5f54610100900460ff161580801561081e57505f54600160ff909116105b806108375750303b15801561083757505f5460ff166001145b61089f5760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b60648201526084015b60405180910390fd5b5f805460ff1916600117905580156108c0575f805461ff0019166101001790555b6108c982610b57565b6108d283610c2b565b8015610917575f805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b505050565b610924610bd1565b6001600160a01b0381166109895760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610896565b61099281610c2b565b50565b60408051808201909152600a81526922b4b3b2b72630bcb2b960b11b6020909101525f7f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f7f71b625cfad44bac63b13dba07f2e1d6084ee04b6f8752101ece6126d584ee6ea610a02610d45565b805160209182012060408051928301949094529281019190915260608101919091524660808201523060a082015260c00160405160208183030381529060405280519060200120905090565b610a56610dba565b60665480198219811614610a7d5760405163c61dca5d60e01b815260040160405180910390fd5b606682905560405182815233907f3582d1828e26bf56bd801502bc021ac0bc8afb57c826e4986b45593c8fad389c906020016107f4565b60405163237dfb4760e11b81523360048201527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906346fbf68e90602401602060405180830381865afa158015610b16573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610b3a9190611430565b61045f57604051631d77d47760e21b815260040160405180910390fd5b606681905560405181815233907fab40a374bc51de372200a8bc981af8c9ecdc08dfdaef0bb6e09f88f3c616ef3d9060200160405180910390a250565b60605f610ba083610e6b565b6040805160208082528183019092529192505f91906020820181803683375050509182525060208101929092525090565b6033546001600160a01b0316331461045f5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610896565b603380546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a35050565b606654600160ff83161b908116036109925760405163840a48d560e01b815260040160405180910390fd5b42811015610cc857604051630819bdcd60e01b815260040160405180910390fd5b610cdc6001600160a01b0385168484610e98565b610cf957604051638baa579f60e01b815260040160405180910390fd5b50505050565b5f610d08610995565b60405161190160f01b6020820152602281019190915260428101839052606201604051602081830303815290604052805190602001209050919050565b60605f610d717f0000000000000000000000000000000000000000000000000000000000000000610b94565b9050805f81518110610d8557610d8561147d565b016020908101516040516001600160f81b03199091169181019190915260210160405160208183030381529060405291505090565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663eab66d7a6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610e16573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610e3a9190611491565b6001600160a01b0316336001600160a01b03161461045f5760405163794821ff60e01b815260040160405180910390fd5b5f60ff8216601f811115610e9257604051632cd44ac360e21b815260040160405180910390fd5b92915050565b5f5f5f610ea58585610ef6565b90925090505f816004811115610ebd57610ebd611168565b148015610edb5750856001600160a01b0316826001600160a01b0316145b80610eec5750610eec868686610f38565b9695505050505050565b5f5f8251604103610f2a576020830151604084015160608501515f1a610f1e8782858561101f565b94509450505050610f31565b505f905060025b9250929050565b5f5f5f856001600160a01b0316631626ba7e60e01b8686604051602401610f609291906114ac565b60408051601f198184030181529181526020820180516001600160e01b03166001600160e01b0319909416939093179092529051610f9e91906114cc565b5f60405180830381855afa9150503d805f8114610fd6576040519150601f19603f3d011682016040523d82523d5f602084013e610fdb565b606091505b5091509150818015610fef57506020815110155b8015610eec57508051630b135d3f60e11b9061101490830160209081019084016114e2565b149695505050505050565b5f807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a083111561105457505f905060036110d3565b604080515f8082526020820180845289905260ff881692820192909252606081018690526080810185905260019060a0016020604051602081039080840390855afa1580156110a5573d5f5f3e3d5ffd5b5050604051601f1901519150506001600160a01b0381166110cd575f600192509250506110d3565b91505f90505b94509492505050565b5f602082840312156110ec575f5ffd5b5035919050565b6001600160a01b0381168114610992575f5ffd5b5f5f60408385031215611118575f5ffd5b8235611123816110f3565b946020939093013593505050565b5f5f60408385031215611142575f5ffd5b823561114d816110f3565b9150602083013561115d816110f3565b809150509250929050565b634e487b7160e01b5f52602160045260245ffd5b602081016002831061119c57634e487b7160e01b5f52602160045260245ffd5b91905290565b5f81518084528060208401602086015e5f602082860101526020601f19601f83011685010191505092915050565b602081525f6111e260208301846111a2565b9392505050565b5f602082840312156111f9575f5ffd5b813560ff811681146111e2575f5ffd5b634e487b7160e01b5f52604160045260245ffd5b6040516060810167ffffffffffffffff8111828210171561124057611240611209565b60405290565b604051601f8201601f1916810167ffffffffffffffff8111828210171561126f5761126f611209565b604052919050565b5f5f60408385031215611288575f5ffd5b8235611293816110f3565b9150602083013567ffffffffffffffff8111156112ae575f5ffd5b8301606081860312156112bf575f5ffd5b6112c761121d565b813567ffffffffffffffff8111156112dd575f5ffd5b8201601f810187136112ed575f5ffd5b803567ffffffffffffffff81111561130757611307611209565b61131a601f8201601f1916602001611246565b81815288602083850101111561132e575f5ffd5b816020840160208301375f6020928201830152835283810135908301525060409182013591810191909152919491935090915050565b5f5f5f5f60808587031215611377575f5ffd5b8435611382816110f3565b93506020850135611392816110f3565b93969395505050506040820135916060013590565b5f602082840312156113b7575f5ffd5b81356111e2816110f3565b5f5f602083850312156113d3575f5ffd5b823567ffffffffffffffff8111156113e9575f5ffd5b8301601f810185136113f9575f5ffd5b803567ffffffffffffffff81111561140f575f5ffd5b856020828401011115611420575f5ffd5b6020919091019590945092505050565b5f60208284031215611440575f5ffd5b815180151581146111e2575f5ffd5b60208152816020820152818360408301375f818301604090810191909152601f909201601f19160101919050565b634e487b7160e01b5f52603260045260245ffd5b5f602082840312156114a1575f5ffd5b81516111e2816110f3565b828152604060208201525f6114c460408301846111a2565b949350505050565b5f82518060208501845e5f920191825250919050565b5f602082840312156114f2575f5ffd5b505191905056fea26469706673582212205d1a7fe2f701906564102d19d8626dd6ccc14ab32da1b7f72df6cb714b9674e464736f6c634300081b0033",
}
⋮----
// 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\":\"function\",\"name\":\"version\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"string\",\"internalType\":\"string\"}],\"stateMutability\":\"view\"},{\"type\":\"event\",\"name\":\"AVSMetadataURIUpdated\",\"inputs\":[{\"name\":\"avs\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"metadataURI\",\"type\":\"string\",\"indexed\":false,\"internalType\":\"string\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"OperatorAVSRegistrationStatusUpdated\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"avs\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"status\",\"type\":\"uint8\",\"indexed\":false,\"internalType\":\"enumIAVSDirectoryTypes.OperatorAVSRegistrationStatus\"}],\"anonymous\":false},{\"type\":\"error\",\"name\":\"InvalidSignature\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"OperatorAlreadyRegisteredToAVS\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"OperatorNotRegisteredToAVS\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"OperatorNotRegisteredToEigenLayer\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"SaltSpent\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"SignatureExpired\",\"inputs\":[]}]",
}
⋮----
// AVSDirectoryStorageABI is the input ABI used to generate the binding from.
// 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)
⋮----
// Version is a free data retrieval call binding the contract method 0x54fd4d50.
⋮----
// Solidity: function version() view returns(string)
func (_AVSDirectoryStorage *AVSDirectoryStorageCaller) Version(opts *bind.CallOpts) (string, error)
⋮----
// 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: "0x60a060405234801561000f575f5ffd5b50604051612d11380380612d1183398101604081905261002e91610105565b6001600160a01b038116608052610043610049565b50610132565b5f54610100900460ff16156100b45760405162461bcd60e51b815260206004820152602760248201527f496e697469616c697a61626c653a20636f6e747261637420697320696e697469604482015266616c697a696e6760c81b606482015260840160405180910390fd5b5f5460ff90811614610103575f805460ff191660ff9081179091556040519081527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b565b5f60208284031215610115575f5ffd5b81516001600160a01b038116811461012b575f5ffd5b9392505050565b608051612bb261015f5f395f81816105e901528181610dae01528181610dd90152610e040152612bb25ff3fe608060405234801561000f575f5ffd5b506004361061023f575f3560e01c80637ecebe0011610135578063aa271e1a116100b4578063dd62ed3e11610079578063dd62ed3e14610579578063eb415f451461058c578063f1127ed814610594578063f2fde38b146105d1578063fdc371ce146105e4575f5ffd5b8063aa271e1a1461050a578063b8c255941461052d578063c3cda52014610540578063c4d66de814610553578063d505accf14610566575f5ffd5b806395d89b41116100fa57806395d89b41146104bf5780639ab24eb0146104c75780639aec4bae146104da578063a457c2d7146104e4578063a9059cbb146104f7575f5ffd5b80637ecebe001461044e57806384b0196e146104615780638da5cb5b1461047c5780638e539e8c1461048d57806391ddadf4146104a0575f5ffd5b806340c10f19116101c157806366eb399f1161018657806366eb399f146103c05780636fcfff45146103d357806370a08231146103fb578063715018a61461042357806378aa33ba1461042b575f5ffd5b806340c10f191461031a57806342966c681461032d5780634bf5d7e914610340578063587cde1e1461036a5780635c19a95c146103ad575f5ffd5b806323b872dd1161020757806323b872dd146102ca578063313ce567146102dd5780633644e515146102ec57806339509351146102f45780633a46b1a814610307575f5ffd5b80630455e6941461024357806306fdde031461027b578063095ea7b31461029057806318160ddd146102a35780631ffacdef146102b5575b5f5ffd5b610266610251366004612682565b6101316020525f908152604090205460ff1681565b60405190151581526020015b60405180910390f35b61028361060b565b60405161027291906126c9565b61026661029e3660046126db565b61069b565b6067545b604051908152602001610272565b6102c86102c3366004612703565b6106b4565b005b6102666102d836600461273c565b6106ca565b60405160128152602001610272565b6102a76106ed565b6102666103023660046126db565b6106fb565b6102a76103153660046126db565b61071c565b6102c86103283660046126db565b6107a4565b6102c861033b366004612776565b61081f565b60408051808201909152600e81526d06d6f64653d74696d657374616d760941b6020820152610283565b610395610378366004612682565b6001600160a01b039081165f90815260fe60205260409020541690565b6040516001600160a01b039091168152602001610272565b6102c86103bb366004612682565b61082c565b6102c86103ce366004612703565b610836565b6103e66103e1366004612682565b6108ae565b60405163ffffffff9091168152602001610272565b6102a7610409366004612682565b6001600160a01b03165f9081526065602052604090205490565b6102c86108cf565b610266610439366004612682565b6101326020525f908152604090205460ff1681565b6102a761045c366004612682565b6108e2565b6104696108ff565b604051610272979695949392919061278d565b6033546001600160a01b0316610395565b6102a761049b366004612776565b610998565b6104a86109ff565b60405165ffffffffffff9091168152602001610272565b610283610a09565b6102a76104d5366004612682565b610a18565b6102a76101305481565b6102666104f23660046126db565b610a95565b6102666105053660046126db565b610b0f565b610266610518366004612682565b6101336020525f908152604090205460ff1681565b6102c861053b366004612703565b610b1c565b6102c861054e366004612833565b610b2e565b6102c8610561366004612682565b610c63565b6102c8610574366004612887565b610ea5565b6102a76105873660046128ed565b611006565b6102c8611030565b6105a76105a236600461291e565b6110fe565b60408051825163ffffffff1681526020928301516001600160e01b03169281019290925201610272565b6102c86105df366004612682565b61117f565b6103957f000000000000000000000000000000000000000000000000000000000000000081565b60606068805461061a90612950565b80601f016020809104026020016040519081016040528092919081815260200182805461064690612950565b80156106915780601f1061066857610100808354040283529160200191610691565b820191905f5260205f20905b81548152906001019060200180831161067457829003601f168201915b5050505050905090565b5f336106a88185856111f5565b60019150505b92915050565b6106bc611318565b6106c68282611372565b5050565b5f336106d78582856113d2565b6106e285858561144a565b506001949350505050565b5f6106f6611604565b905090565b5f336106a881858561070d8383611006565b6107179190612996565b6111f5565b5f6107256109ff565b65ffffffffffff16821061077c5760405162461bcd60e51b815260206004820152601960248201527804552433230566f7465733a20667574757265206c6f6f6b757603c1b60448201526064015b60405180910390fd5b6001600160a01b0383165f90815260ff6020526040902061079d908361160d565b9392505050565b335f908152610133602052604090205460ff166108155760405162461bcd60e51b815260206004820152602960248201527f4261636b696e67456967656e2e6d696e743a2063616c6c6572206973206e6f7460448201526810309036b4b73a32b960b91b6064820152608401610773565b6106c682826116ee565b6108293382611779565b50565b6108293382611792565b61083e611318565b816001600160a01b03167f0124b12503bddc2616c0f3f54fd23ed283f5ef0c1483a75409e42612176b8bde8260405161087b911515815260200190565b60405180910390a26001600160a01b03919091165f90815261013360205260409020805460ff1916911515919091179055565b6001600160a01b0381165f90815260ff60205260408120546106ae9061180b565b6108d7611318565b6108e05f611873565b565b6001600160a01b0381165f90815260cb60205260408120546106ae565b5f6060805f5f5f60606097545f5f1b14801561091b5750609854155b61095f5760405162461bcd60e51b81526020600482015260156024820152741152540dcc4c8e88155b9a5b9a5d1a585b1a5e9959605a1b6044820152606401610773565b6109676118c4565b61096f6118d3565b604080515f80825260208201909252600f60f81b9b939a50919850469750309650945092509050565b5f6109a16109ff565b65ffffffffffff1682106109f35760405162461bcd60e51b815260206004820152601960248201527804552433230566f7465733a20667574757265206c6f6f6b757603c1b6044820152606401610773565b6106ae6101008361160d565b5f6106f6426118e2565b60606069805461061a90612950565b6001600160a01b0381165f90815260ff60205260408120548015610a83576001600160a01b0383165f90815260ff6020526040902080545f198301908110610a6257610a626129bd565b5f9182526020909120015464010000000090046001600160e01b0316610a85565b5f5b6001600160e01b03169392505050565b5f3381610aa28286611006565b905083811015610b025760405162461bcd60e51b815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f77604482015264207a65726f60d81b6064820152608401610773565b6106e282868684036111f5565b5f336106a881858561144a565b610b24611318565b6106c68282611948565b83421115610b7e5760405162461bcd60e51b815260206004820152601d60248201527f4552433230566f7465733a207369676e617475726520657870697265640000006044820152606401610773565b604080517fe48329057bfd03d55e49b547132e39cffd9c1820ad7b9d4c5307691425d15adf60208201526001600160a01b0388169181019190915260608101869052608081018590525f90610bf790610bef9060a001604051602081830303815290604052805190602001206119a0565b8585856119cc565b9050610c02816119f2565b8614610c505760405162461bcd60e51b815260206004820152601960248201527f4552433230566f7465733a20696e76616c6964206e6f6e6365000000000000006044820152606401610773565b610c5a8188611792565b50505050505050565b5f54610100900460ff1615808015610c8157505f54600160ff909116105b80610c9a5750303b158015610c9a57505f5460ff166001145b610cfd5760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b6064820152608401610773565b5f805460ff191660011790558015610d1e575f805461ff0019166101001790555b610d26611a19565b610d736040518060400160405280600d81526020016c2130b1b5b4b7339022b4b3b2b760991b815250604051806040016040528060068152602001653122a4a3a2a760d11b815250611a47565b610d7c82611873565b610da3604051806040016040528060068152602001653122a4a3a2a760d11b815250611a77565b5f1961013055610dd47f00000000000000000000000000000000000000000000000000000000000000006001611372565b610dff7f00000000000000000000000000000000000000000000000000000000000000006001611948565b610e357f00000000000000000000000000000000000000000000000000000000000000006b05686877afb5cbccbf7340006116ee565b6040517fb7c23c1e2e36f298e9879a88ecfcd07e28fbb439bcfa9c78ca1363ca14370d26905f90a180156106c6575f805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15050565b83421115610ef55760405162461bcd60e51b815260206004820152601d60248201527f45524332305065726d69743a206578706972656420646561646c696e650000006044820152606401610773565b5f7f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c9888888610f238c6119f2565b6040805160208101969096526001600160a01b0394851690860152929091166060840152608083015260a082015260c0810186905260e0016040516020818303038152906040528051906020012090505f610f7d826119a0565b90505f610f8c828787876119cc565b9050896001600160a01b0316816001600160a01b031614610fef5760405162461bcd60e51b815260206004820152601e60248201527f45524332305065726d69743a20696e76616c6964207369676e617475726500006044820152606401610773565b610ffa8a8a8a6111f5565b50505050505050505050565b6001600160a01b039182165f90815260666020908152604080832093909416825291909152205490565b611038611318565b5f1961013054146110ce5760405162461bcd60e51b815260206004820152605460248201527f4261636b696e67456967656e2e64697361626c655472616e736665725265737460448201527f72696374696f6e733a207472616e73666572207265737472696374696f6e7320606482015273185c9948185b1c9958591e48191a5cd8589b195960621b608482015260a401610773565b5f6101308190556040517f2b18986d3ba809db2f13a5d7bf17f60d357b37d9cbb55dd71cbbac8dc4060f649190a1565b604080518082019091525f80825260208201526001600160a01b0383165f90815260ff60205260409020805463ffffffff8416908110611140576111406129bd565b5f9182526020918290206040805180820190915291015463ffffffff8116825264010000000090046001600160e01b0316918101919091529392505050565b611187611318565b6001600160a01b0381166111ec5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610773565b61082981611873565b6001600160a01b0383166112575760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b6064820152608401610773565b6001600160a01b0382166112b85760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b6064820152608401610773565b6001600160a01b038381165f8181526066602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b6033546001600160a01b031633146108e05760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610773565b6001600160a01b0382165f8181526101316020908152604091829020805460ff191685151590811790915591519182527fcf20b1ecb604b0e8888d579c64e8a3b10e590d45c1c2dddb393bed284362227191015b60405180910390a25050565b5f6113dd8484611006565b90505f19811461144457818110156114375760405162461bcd60e51b815260206004820152601d60248201527f45524332303a20696e73756666696369656e7420616c6c6f77616e63650000006044820152606401610773565b61144484848484036111f5565b50505050565b6001600160a01b0383166114ae5760405162461bcd60e51b815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604482015264647265737360d81b6064820152608401610773565b6001600160a01b0382166115105760405162461bcd60e51b815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201526265737360e81b6064820152608401610773565b61151b838383611ac0565b6001600160a01b0383165f90815260656020526040902054818110156115925760405162461bcd60e51b815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e7420657863656564732062604482015265616c616e636560d01b6064820152608401610773565b6001600160a01b038085165f8181526065602052604080822086860390559286168082529083902080548601905591517fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef906115f19086815260200190565b60405180910390a3611444848484611b9c565b5f6106f6611bcd565b81545f9081816005811115611664575f61162684611c40565b61163090856129d1565b5f88815260209020909150869082015463ffffffff16111561165457809150611662565b61165f816001612996565b92505b505b808210156116af575f6116778383611d24565b5f88815260209020909150869082015463ffffffff16111561169b578091506116a9565b6116a6816001612996565b92505b50611664565b80156116d9575f8681526020902081015f19015464010000000090046001600160e01b03166116db565b5f5b6001600160e01b03169695505050505050565b6116f88282611d3e565b6067546001600160e01b03101561176a5760405162461bcd60e51b815260206004820152603060248201527f4552433230566f7465733a20746f74616c20737570706c79207269736b73206f60448201526f766572666c6f77696e6720766f74657360801b6064820152608401610773565b611444610100611e0f83611e1a565b6117838282611f86565b6114446101006120c983611e1a565b6001600160a01b038281165f81815260fe6020818152604080842080546065845282862054949093528787166001600160a01b03198416811790915590519190951694919391928592917f3134e8a2e6d97e929a7e54011ea5485d7d196dd5f0ba4d4ef95803e8e3fc257f9190a46114448284836120d4565b5f63ffffffff82111561186f5760405162461bcd60e51b815260206004820152602660248201527f53616665436173743a2076616c756520646f65736e27742066697420696e203360448201526532206269747360d01b6064820152608401610773565b5090565b603380546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a35050565b60606099805461061a90612950565b6060609a805461061a90612950565b5f65ffffffffffff82111561186f5760405162461bcd60e51b815260206004820152602660248201527f53616665436173743a2076616c756520646f65736e27742066697420696e203460448201526538206269747360d01b6064820152608401610773565b6001600160a01b0382165f8181526101326020908152604091829020805460ff191685151590811790915591519182527f72a561d1af7409467dae4f1e9fc52590a9335a1dda17727e2b6aa8c4db35109b91016113c6565b5f6106ae6119ac611604565b8360405161190160f01b8152600281019290925260228201526042902090565b5f5f5f6119db8787878761220e565b915091506119e8816122cb565b5095945050505050565b6001600160a01b0381165f90815260cb602052604090208054600181018255905b50919050565b5f54610100900460ff16611a3f5760405162461bcd60e51b8152600401610773906129e4565b6108e0612414565b5f54610100900460ff16611a6d5760405162461bcd60e51b8152600401610773906129e4565b6106c68282612443565b5f54610100900460ff16611a9d5760405162461bcd60e51b8152600401610773906129e4565b61082981604051806040016040528060018152602001603160f81b815250612482565b610130544211611b97576001600160a01b0383165f908152610131602052604090205460ff1680611b0957506001600160a01b0382165f908152610132602052604090205460ff165b80611b1b57506001600160a01b038316155b611b975760405162461bcd60e51b815260206004820152604160248201527f4261636b696e67456967656e2e5f6265666f7265546f6b656e5472616e73666560448201527f723a2066726f6d206f7220746f206d7573742062652077686974656c697374656064820152601960fa1b608482015260a401610773565b505050565b6001600160a01b038381165f90815260fe6020526040808220548584168352912054611b97929182169116836120d4565b5f7f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f611bf76124cf565b611bff612527565b60408051602081019490945283019190915260608201524660808201523060a082015260c00160405160208183030381529060405280519060200120905090565b5f815f03611c4f57505f919050565b5f6001611c5b84612557565b901c6001901b90506001818481611c7457611c74612a2f565b048201901c90506001818481611c8c57611c8c612a2f565b048201901c90506001818481611ca457611ca4612a2f565b048201901c90506001818481611cbc57611cbc612a2f565b048201901c90506001818481611cd457611cd4612a2f565b048201901c90506001818481611cec57611cec612a2f565b048201901c90506001818481611d0457611d04612a2f565b048201901c905061079d81828581611d1e57611d1e612a2f565b046125ea565b5f611d326002848418612a43565b61079d90848416612996565b6001600160a01b038216611d945760405162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f2061646472657373006044820152606401610773565b611d9f5f8383611ac0565b8060675f828254611db09190612996565b90915550506001600160a01b0382165f818152606560209081526040808320805486019055518481527fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a36106c65f8383611b9c565b5f61079d8284612996565b82545f908190818115611e64575f8781526020902082015f190160408051808201909152905463ffffffff8116825264010000000090046001600160e01b03166020820152611e78565b604080518082019091525f80825260208201525b905080602001516001600160e01b03169350611e9884868863ffffffff16565b92505f82118015611ec05750611eac6109ff565b65ffffffffffff16815f015163ffffffff16145b15611f0357611ece836125ff565b5f8881526020902083015f190180546001600160e01b03929092166401000000000263ffffffff909216919091179055611f7c565b866040518060400160405280611f27611f1a6109ff565b65ffffffffffff1661180b565b63ffffffff168152602001611f3b866125ff565b6001600160e01b0390811690915282546001810184555f938452602093849020835194909301519091166401000000000263ffffffff909316929092179101555b5050935093915050565b6001600160a01b038216611fe65760405162461bcd60e51b815260206004820152602160248201527f45524332303a206275726e2066726f6d20746865207a65726f206164647265736044820152607360f81b6064820152608401610773565b611ff1825f83611ac0565b6001600160a01b0382165f90815260656020526040902054818110156120645760405162461bcd60e51b815260206004820152602260248201527f45524332303a206275726e20616d6f756e7420657863656564732062616c616e604482015261636560f01b6064820152608401610773565b6001600160a01b0383165f8181526065602090815260408083208686039055606780548790039055518581529192917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a3611b97835f84611b9c565b5f61079d82846129d1565b816001600160a01b0316836001600160a01b0316141580156120f557505f81115b15611b97576001600160a01b03831615612182576001600160a01b0383165f90815260ff60205260408120819061212f906120c985611e1a565b91509150846001600160a01b03167fdec2bacdd2f05b59de34da9b523dff8be42e5e38e818c82fdb0bae774387a7248383604051612177929190918252602082015260400190565b60405180910390a250505b6001600160a01b03821615611b97576001600160a01b0382165f90815260ff6020526040812081906121b790611e0f85611e1a565b91509150836001600160a01b03167fdec2bacdd2f05b59de34da9b523dff8be42e5e38e818c82fdb0bae774387a72483836040516121ff929190918252602082015260400190565b60405180910390a25050505050565b5f807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a083111561224357505f905060036122c2565b604080515f8082526020820180845289905260ff881692820192909252606081018690526080810185905260019060a0016020604051602081039080840390855afa158015612294573d5f5f3e3d5ffd5b5050604051601f1901519150506001600160a01b0381166122bc575f600192509250506122c2565b91505f90505b94509492505050565b5f8160048111156122de576122de612a62565b036122e65750565b60018160048111156122fa576122fa612a62565b036123475760405162461bcd60e51b815260206004820152601860248201527f45434453413a20696e76616c6964207369676e617475726500000000000000006044820152606401610773565b600281600481111561235b5761235b612a62565b036123a85760405162461bcd60e51b815260206004820152601f60248201527f45434453413a20696e76616c6964207369676e6174757265206c656e677468006044820152606401610773565b60038160048111156123bc576123bc612a62565b036108295760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202773272076616c604482015261756560f01b6064820152608401610773565b5f54610100900460ff1661243a5760405162461bcd60e51b8152600401610773906129e4565b6108e033611873565b5f54610100900460ff166124695760405162461bcd60e51b8152600401610773906129e4565b60686124758382612ac1565b506069611b978282612ac1565b5f54610100900460ff166124a85760405162461bcd60e51b8152600401610773906129e4565b60996124b48382612ac1565b50609a6124c18282612ac1565b50505f609781905560985550565b5f5f6124d96118c4565b8051909150156124f0578051602090910120919050565b60975480156124ff5792915050565b7fc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a4709250505090565b5f5f6125316118d3565b805190915015612548578051602090910120919050565b60985480156124ff5792915050565b5f80608083901c1561256b57608092831c92015b604083901c1561257d57604092831c92015b602083901c1561258f57602092831c92015b601083901c156125a157601092831c92015b600883901c156125b357600892831c92015b600483901c156125c557600492831c92015b600283901c156125d757600292831c92015b600183901c156106ae5760010192915050565b5f8183106125f8578161079d565b5090919050565b5f6001600160e01b0382111561186f5760405162461bcd60e51b815260206004820152602760248201527f53616665436173743a2076616c756520646f65736e27742066697420696e20326044820152663234206269747360c81b6064820152608401610773565b80356001600160a01b038116811461267d575f5ffd5b919050565b5f60208284031215612692575f5ffd5b61079d82612667565b5f81518084528060208401602086015e5f602082860101526020601f19601f83011685010191505092915050565b602081525f61079d602083018461269b565b5f5f604083850312156126ec575f5ffd5b6126f583612667565b946020939093013593505050565b5f5f60408385031215612714575f5ffd5b61271d83612667565b915060208301358015158114612731575f5ffd5b809150509250929050565b5f5f5f6060848603121561274e575f5ffd5b61275784612667565b925061276560208501612667565b929592945050506040919091013590565b5f60208284031215612786575f5ffd5b5035919050565b60ff60f81b8816815260e060208201525f6127ab60e083018961269b565b82810360408401526127bd818961269b565b606084018890526001600160a01b038716608085015260a0840186905283810360c0850152845180825260208087019350909101905f5b818110156128125783518352602093840193909201916001016127f4565b50909b9a5050505050505050505050565b803560ff8116811461267d575f5ffd5b5f5f5f5f5f5f60c08789031215612848575f5ffd5b61285187612667565b9550602087013594506040870135935061286d60608801612823565b9598949750929560808101359460a0909101359350915050565b5f5f5f5f5f5f5f60e0888a03121561289d575f5ffd5b6128a688612667565b96506128b460208901612667565b955060408801359450606088013593506128d060808901612823565b9699959850939692959460a0840135945060c09093013592915050565b5f5f604083850312156128fe575f5ffd5b61290783612667565b915061291560208401612667565b90509250929050565b5f5f6040838503121561292f575f5ffd5b61293883612667565b9150602083013563ffffffff81168114612731575f5ffd5b600181811c9082168061296457607f821691505b602082108103611a1357634e487b7160e01b5f52602260045260245ffd5b634e487b7160e01b5f52601160045260245ffd5b808201808211156106ae576106ae612982565b634e487b7160e01b5f52604160045260245ffd5b634e487b7160e01b5f52603260045260245ffd5b818103818111156106ae576106ae612982565b6020808252602b908201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960408201526a6e697469616c697a696e6760a81b606082015260800190565b634e487b7160e01b5f52601260045260245ffd5b5f82612a5d57634e487b7160e01b5f52601260045260245ffd5b500490565b634e487b7160e01b5f52602160045260245ffd5b601f821115611b9757805f5260205f20601f840160051c81016020851015612a9b5750805b601f840160051c820191505b81811015612aba575f8155600101612aa7565b5050505050565b815167ffffffffffffffff811115612adb57612adb6129a9565b612aef81612ae98454612950565b84612a76565b6020601f821160018114612b21575f8315612b0a5750848201515b5f19600385901b1c1916600184901b178455612aba565b5f84815260208120601f198516915b82811015612b505787850151825560209485019460019092019101612b30565b5084821015612b6d57868401515f19600387901b60f8161c191681555b50505050600190811b0190555056fea2646970667358221220e63487e41f434068c326685f38f3b42cae05dc5f424d3b54b53460214543d28764736f6c634300081b0033",
}
⋮----
// 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: "0x60556032600b8282823980515f1a607314602657634e487b7160e01b5f525f60045260245ffd5b305f52607381538281f3fe730000000000000000000000000000000000000000301460806040525f5ffdfea2646970667358221220cfd005b54745fb0d52f5e3c6372cc0e327e7723423384b9d650e2e00dfe5f5cc64736f6c634300081b0033",
}
⋮----
// 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: "0x60556032600b8282823980515f1a607314602657634e487b7160e01b5f525f60045260245ffd5b305f52607381538281f3fe730000000000000000000000000000000000000000301460806040525f5ffdfea2646970667358221220d084bedd451fadde14a6590fa5fb3e40f2250b7f49f9228d15f27cae51d34f7464736f6c634300081b0033",
}
⋮----
// 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\"},{\"name\":\"_version\",\"type\":\"string\",\"internalType\":\"string\"}],\"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\":\"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\":\"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\":\"InvalidShortString\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"NonSignerIndicesNotSorted\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"OnlyTableUpdater\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ReferenceTimestampDoesNotExist\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"RootDisabled\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"StringTooLong\",\"inputs\":[{\"name\":\"str\",\"type\":\"string\",\"internalType\":\"string\"}]},{\"type\":\"error\",\"name\":\"TableUpdateStale\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"VerificationFailed\",\"inputs\":[]}]",
	Bin: "0x60c060405234801561000f575f5ffd5b50604051612e71380380612e7183398101604081905261002e9161016a565b6001600160a01b0382166080528061004581610058565b60a0525061005161009e565b5050610294565b5f5f829050601f8151111561008b578260405163305a27a960e01b81526004016100829190610239565b60405180910390fd5b80516100968261026e565b179392505050565b5f54610100900460ff16156101055760405162461bcd60e51b815260206004820152602760248201527f496e697469616c697a61626c653a20636f6e747261637420697320696e697469604482015266616c697a696e6760c81b6064820152608401610082565b5f5460ff90811614610154575f805460ff191660ff9081179091556040519081527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b565b634e487b7160e01b5f52604160045260245ffd5b5f5f6040838503121561017b575f5ffd5b82516001600160a01b0381168114610191575f5ffd5b60208401519092506001600160401b038111156101ac575f5ffd5b8301601f810185136101bc575f5ffd5b80516001600160401b038111156101d5576101d5610156565b604051601f8201601f19908116603f011681016001600160401b038111828210171561020357610203610156565b60405281815282820160200187101561021a575f5ffd5b8160208401602083015e5f602083830101528093505050509250929050565b602081525f82518060208401528060208501604085015e5f604082850101526040601f19601f83011684010191505092915050565b8051602080830151919081101561028e575f198160200360031b1b821691505b50919050565b60805160a051612bae6102c35f395f6106d501525f81816102a6015281816108200152610ff50152612bae5ff3fe608060405234801561000f575f5ffd5b5060043610610132575f3560e01c80635ddb9b5b116100b4578063848189201161007957806384818920146102f3578063a2c902f514610306578063a2f2e24d1461030e578063cd83a72b14610321578063dd2ae1b914610334578063eb39e68f14610347575f5ffd5b80635ddb9b5b146102515780636141879e146102795780636738c40b1461028c57806368d6e081146102a15780637d1d1f5b146102e0575f5ffd5b806323c2a3cb116100fa57806323c2a3cb146101e357806326af6a3c146101f6578063538a37901461021657806354fd4d50146102295780635be872741461023e575f5ffd5b8063017d797414610136578063080b71501461015e578063121409ea1461017e57806318467434146101985780631a18746c146101b9575b5f5ffd5b610149610144366004612461565b610367565b60405190151581526020015b60405180910390f35b61017161016c36600461253c565b6104f8565b6040516101559190612587565b610186608e81565b60405160ff9091168152602001610155565b6101ab6101a63660046125be565b61050d565b604051908152602001610155565b6101cc6101c73660046125e6565b610570565b604080519215158352901515602083015201610155565b6101ab6101f1366004612634565b610591565b610209610204366004612666565b6105c7565b60405161015591906126db565b6101ab610224366004612708565b61067f565b6102316106ce565b6040516101559190612739565b61014961024c366004612666565b6106fe565b61026461025f36600461276e565b6107c9565b60405163ffffffff9091168152602001610155565b61026461028736600461276e565b6107ef565b61029f61029a36600461279e565b610815565b005b6102c87f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b039091168152602001610155565b6101716102ee366004612634565b6109fb565b6102c861030136600461276e565b610a7b565b610186607581565b6101ab61031c366004612857565b610aa4565b61014961032f366004612634565b610abb565b6101496103423660046128c3565b610af1565b61035a610355366004612634565b610b84565b604051610155919061297b565b5f5f6103738585610c49565b90505f61037f86610de6565b5f8181526004602081815260408084208a5163ffffffff16855282528084208151608081018352815481526001820154818501528251808401845260028301548152600383015481860152818401529381018054835181860281018601909452808452969750949593949093606086019383018282801561041d57602002820191905f5260205f20905b815481526020019060010190808311610409575b50505050508152505090505f8160600151905085518451146104525760405163512509d360e11b815260040160405180910390fd5b5f5b84518110156104e7575f6127108883815181106104735761047361298d565b602002602001015161ffff168484815181106104915761049161298d565b60200260200101516104a391906129b5565b6104ad91906129e0565b9050808683815181106104c2576104c261298d565b602002602001015110156104de575f96505050505050506104f1565b50600101610454565b5060019450505050505b9392505050565b60606105048383610c49565b90505b92915050565b604080517fd9f77a423768f4b0526fa60a7c732334516a93f1d228dce50ad804ea74ced36e602082015263ffffffff841691810191909152606081018290525f906080015b60405160208183030381529060405280519060200120905092915050565b5f5f61058486848787600162061a80610e49565b9150915094509492505050565b5f5f61059c84610de6565b5f90815260046020908152604080832063ffffffff8716845290915290206001015491505092915050565b6105cf611dfa565b5f6105d985610de6565b5f81815260056020908152604080832063ffffffff89168452825280832087845282529182902082516080810184528154818501908152600183015460608301528152600282018054855181860281018601909652808652959650909491938584019390929083018282801561066c57602002820191905f5260205f20905b815481526020019060010190808311610658575b5050505050815250509150509392505050565b5f60758260405160200161069391906126db565b60408051601f19818403018152908290526106b192916020016129f3565b604051602081830303815290604052805190602001209050919050565b60606106f97f0000000000000000000000000000000000000000000000000000000000000000610f11565b905090565b5f5f61070985610de6565b5f81815260056020908152604080832063ffffffff8916845282528083208784528252808320815160808101835281548184019081526001830154606083015281526002820180548451818702810187019095528085529697509495909491938581019392919083018282801561079d57602002820191905f5260205f20905b815481526020019060010190808311610789575b50505091909252505081515191925050158015906107bf575080516020015115155b9695505050505050565b5f5f6107d483610de6565b5f9081526003602052604090205463ffffffff169392505050565b5f5f6107fa83610de6565b5f9081526002602052604090205463ffffffff169392505050565b336001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000161461085e5760405163030c1b6b60e11b815260040160405180910390fd5b5f6108766108713687900387018761276e565b610de6565b5f8181526003602052604090205490915063ffffffff908116908516116108b057604051632f20889f60e01b815260040160405180910390fd5b5f81815260046020818152604080842063ffffffff8916855282529283902086518155818701516001820155928601518051600285015581015160038401556060860151805187949361090893908501920190611e24565b5050505f818152600360209081526040909120805463ffffffff191663ffffffff871617905561093a90830183612a1c565b5f8281526001602090815260409182902080546001600160a01b0319166001600160a01b03949094169390931790925561097991908401908401612a35565b5f828152600260209081526040808320805463ffffffff191663ffffffff958616179055600682528083209388168352929052819020805460ff19166001179055517f93e6bea1c9b5dce4a5c07b00261e956df2a4a253d9ab6ca070ca2037d72ada9e906109ec90879087908790612a4e565b60405180910390a15050505050565b60605f610a0784610de6565b5f81815260046020818152604080842063ffffffff891685528252928390209091018054835181840281018401909452808452939450919290830182828015610a6d57602002820191905f5260205f20905b815481526020019060010190808311610a59575b505050505091505092915050565b5f5f610a8683610de6565b5f908152600160205260409020546001600160a01b03169392505050565b5f608e838360405160200161055293929190612a9a565b5f5f610ac684610de6565b5f90815260066020908152604080832063ffffffff8716845290915290205460ff1691505092915050565b5f5f610afd8585610c49565b90508251815114610b215760405163512509d360e11b815260040160405180910390fd5b5f5b8151811015610b7857838181518110610b3e57610b3e61298d565b6020026020010151828281518110610b5857610b5861298d565b60200260200101511015610b70575f925050506104f1565b600101610b23565b50600195945050505050565b610b8c611e6d565b5f610b9684610de6565b5f81815260046020818152604080842063ffffffff8916855282529283902083516080810185528154815260018201548184015284518086018652600283015481526003830154818501528186015292810180548551818502810185019096528086529596509294909360608601939092909190830182828015610c3757602002820191905f5260205f20905b815481526020019060010190808311610c23575b50505050508152505091505092915050565b6060610c53611e9f565b610c5c84610de6565b8082528351610c6b9190610f4e565b80515f908152600460208181526040808420875163ffffffff1685528252928390208351608081018552815481526001820154818401528451808601865260028301548152600383015481850152818601529281018054855181850281018501909652808652939491936060860193830182828015610d0757602002820191905f5260205f20905b815481526020019060010190808311610cf3575b505050919092525050506020820181905260600151516001600160401b03811115610d3457610d34611fcd565b604051908082528060200260200182016040528015610d5d578160200160208202803683370190505b5060408201525f5b81602001516060015151811015610dc1578160200151606001518181518110610d9057610d9061298d565b602002602001015182604001518281518110610dae57610dae61298d565b6020908102919091010152600101610d65565b50610dcc8184611088565b6060820152610ddb81846111e5565b604001519392505050565b5f815f0151826020015163ffffffff16604051602001610e3192919060609290921b6bffffffffffffffffffffffff1916825260a01b6001600160a01b031916601482015260200190565b60405160208183030381529060405261050790612ac1565b5f5f5f610e5589611264565b90505f610e648a89898c6112ee565b90505f610e7b610e748a846113a2565b8b9061140a565b90505f610ebd610eb684610eb06040805180820182525f80825260209182015281518083019092526001825260029082015290565b906113a2565b859061140a565b90508715610ee257610ed982610ed161147e565b838c8b61153e565b96509450610f02565b610ef582610eee61147e565b838c611752565b95508515610f0257600194505b50505050965096945050505050565b60605f610f1d83611989565b6040805160208082528183019092529192505f91906020820181803683375050509182525060208101929092525090565b5f8281526002602052604090205463ffffffff16801580610f7e5750610f748183612ae4565b63ffffffff164211155b610f9b5760405163640fcd6b60e11b815260040160405180910390fd5b5f83815260066020908152604080832063ffffffff8616845290915290205460ff16610fda57604051630cad17b760e31b815260040160405180910390fd5b60405163193877e160e21b815263ffffffff831660048201527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906364e1df8490602401602060405180830381865afa158015611042573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906110669190612b00565b61108357604051631b14174b60e01b815260040160405180910390fd5b505050565b6040805180820182525f80825260209182018190528251808401909352808352908201819052805b8360800151518110156111dd575f846080015182815181106110d4576110d461298d565b602002602001015190505f82111561111057805163ffffffff80851691161161111057604051631d8c4d1760e31b815260040160405180910390fd5b6020808701510151815163ffffffff161061113e576040516301fa53c760e11b815260040160405180910390fd5b855185515f9161114e91846119b0565b805190915061115e90869061140a565b94505f5b8160200151518110156111d0578760400151518110156111c857816020015181815181106111925761119261298d565b6020026020010151886040015182815181106111b0576111b061298d565b602002602001018181516111c49190612b1f565b9052505b600101611162565b50505191506001016110b0565b505092915050565b5f6112056111f68460600151611b27565b6020850151604001519061140a565b90505f611219835f0151846020015161050d565b90505f5f611231838587606001518860400151610570565b9150915081801561123f5750805b61125c5760405163439cc0cd60e01b815260040160405180910390fd5b505050505050565b604080518082019091525f80825260208201525f80806112915f516020612b595f395f51905f5286612b32565b90505b61129d81611bbd565b90935091505f516020612b595f395f51905f5282830983036112d5576040805180820190915290815260208101919091529392505050565b5f516020612b595f395f51905f52600182089050611294565b8251602080850151845180519083015186840151805190850151875188870151604080519889018e90528801989098526060870195909552608086019390935260a085019190915260c084015260e08301526101008201526101208101919091525f907f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000019061014001604051602081830303815290604052805190602001205f1c6113999190612b32565b95945050505050565b604080518082019091525f80825260208201526113bd611ee4565b835181526020808501519082015260408082018490525f908360608460076107d05a03fa905080806113eb57fe5b50806111dd57604051632319df1960e11b815260040160405180910390fd5b604080518082019091525f8082526020820152611425611f02565b835181526020808501518183015283516040808401919091529084015160608301525f908360808460066107d05a03fa9050808061145f57fe5b50806111dd5760405163d4b68fd760e01b815260040160405180910390fd5b611486611f20565b50604080516080810182527f198e9393920d483a7260bfb731fb5d25f1aa493335a9e71297e485b7aef312c28183019081527f1800deef121f1e76426a00665e5c4479674322d4f75edadd46debd5cd992f6ed6060830152815281518083019092527f275dc4a288d1afb3cbb1ac09187524c7db36395df7be3b99e673b13a075a65ec82527f1d9befcd05a5323e6da4d435f3b617cdb3af83285c2df711ef39c01571827f9d60208381019190915281019190915290565b6040805180820182528681526020808201869052825180840190935286835282018490525f9182919061156f611f40565b5f5b6002811015611726575f6115868260066129b5565b905084826002811061159a5761159a61298d565b602002015151836115ab835f612b45565b600c81106115bb576115bb61298d565b60200201528482600281106115d2576115d261298d565b602002015160200151838260016115e99190612b45565b600c81106115f9576115f961298d565b60200201528382600281106116105761161061298d565b6020020151515183611623836002612b45565b600c81106116335761163361298d565b602002015283826002811061164a5761164a61298d565b6020020151516001602002015183611663836003612b45565b600c81106116735761167361298d565b602002015283826002811061168a5761168a61298d565b6020020151602001515f600281106116a4576116a461298d565b6020020151836116b5836004612b45565b600c81106116c5576116c561298d565b60200201528382600281106116dc576116dc61298d565b6020020151602001516001600281106116f7576116f761298d565b602002015183611708836005612b45565b600c81106117185761171861298d565b602002015250600101611571565b5061172f611f5f565b5f6020826101808560088cfa9151919c9115159b50909950505050505050505050565b6040805180820182528581526020808201859052825180840190935285835282018390525f91611780611f40565b5f5b6002811015611937575f6117978260066129b5565b90508482600281106117ab576117ab61298d565b602002015151836117bc835f612b45565b600c81106117cc576117cc61298d565b60200201528482600281106117e3576117e361298d565b602002015160200151838260016117fa9190612b45565b600c811061180a5761180a61298d565b60200201528382600281106118215761182161298d565b6020020151515183611834836002612b45565b600c81106118445761184461298d565b602002015283826002811061185b5761185b61298d565b6020020151516001602002015183611874836003612b45565b600c81106118845761188461298d565b602002015283826002811061189b5761189b61298d565b6020020151602001515f600281106118b5576118b561298d565b6020020151836118c6836004612b45565b600c81106118d6576118d661298d565b60200201528382600281106118ed576118ed61298d565b6020020151602001516001600281106119085761190861298d565b602002015183611919836005612b45565b600c81106119295761192961298d565b602002015250600101611782565b50611940611f5f565b5f6020826101808560086107d05a03fa9050808061195a57fe5b5080611979576040516324ccc79360e21b815260040160405180910390fd5b5051151598975050505050505050565b5f60ff8216601f81111561050757604051632cd44ac360e21b815260040160405180910390fd5b6119b8611dfa565b5f84815260056020908152604080832063ffffffff8088168552908352818420865190911684528252808320815160808101835281548184019081526001830154606083015281526002820180548451818702810187019095528085529194929385840193909290830182828015611a4d57602002820191905f5260205f20905b815481526020019060010190808311611a39575b5050509190925250508151519192505f911515905080611a71575081516020015115155b905080611b1a575f611a918787875f015188604001518960200151611c39565b905080611ab15760405163439cc0cd60e01b815260040160405180910390fd5b6040808601515f8981526005602090815283822063ffffffff808c1684529082528483208a5190911683528152929020815180518255830151600182015582820151805192939192611b099260028501920190611e24565b509050508460400151935050611b1e565b8192505b50509392505050565b604080518082019091525f80825260208201528151158015611b4b57506020820151155b15611b68575050604080518082019091525f808252602082015290565b6040518060400160405280835f015181526020015f516020612b595f395f51905f528460200151611b999190612b32565b611bb0905f516020612b595f395f51905f52612b1f565b905292915050565b919050565b5f80805f516020612b595f395f51905f5260035f516020612b595f395f51905f52865f516020612b595f395f51905f52888909090890505f611c2d827f0c19139cb84c680a6e14116da060561765e05aa45a1c72a34f082305b61f3f525f516020612b595f395f51905f52611c87565b91959194509092505050565b5f5f611c448461067f565b5f88815260046020908152604080832063ffffffff808c168552925290912054919250611c7b908590839085908a811690611d0016565b98975050505050505050565b5f5f611c91611f5f565b611c99611f7d565b602080825281810181905260408201819052606082018890526080820187905260a082018690528260c08360056107d05a03fa92508280611cd657fe5b5082611cf55760405163d51edae360e01b815260040160405180910390fd5b505195945050505050565b5f83611d1f576040516329e7276760e11b815260040160405180910390fd5b83611d2b868585611d35565b1495945050505050565b5f83515f03611d455750816104f1565b60208451611d539190612b32565b15611d71576040516313717da960e21b815260040160405180910390fd5b8260205b85518111611dd257611d88600285612b32565b5f03611da957815f528086015160205260405f209150600284049350611dc0565b808601515f528160205260405f2091506002840493505b611dcb602082612b45565b9050611d75565b508215611df2576040516363df817160e01b815260040160405180910390fd5b949350505050565b604080516080810182525f91810182815260608201929092529081905b8152602001606081525090565b828054828255905f5260205f20908101928215611e5d579160200282015b82811115611e5d578251825591602001919060010190611e42565b50611e69929150611f9b565b5090565b60405180608001604052805f81526020015f8152602001611e1760405180604001604052805f81526020015f81525090565b60405180608001604052805f8152602001611eb8611e6d565b815260200160608152602001611edf60405180604001604052805f81526020015f81525090565b905290565b60405180606001604052806003906020820280368337509192915050565b60405180608001604052806004906020820280368337509192915050565b6040518060400160405280611f33611faf565b8152602001611edf611faf565b604051806101800160405280600c906020820280368337509192915050565b60405180602001604052806001906020820280368337509192915050565b6040518060c001604052806006906020820280368337509192915050565b5b80821115611e69575f8155600101611f9c565b60405180604001604052806002906020820280368337509192915050565b634e487b7160e01b5f52604160045260245ffd5b604080519081016001600160401b038111828210171561200357612003611fcd565b60405290565b60405160a081016001600160401b038111828210171561200357612003611fcd565b604051606081016001600160401b038111828210171561200357612003611fcd565b604051608081016001600160401b038111828210171561200357612003611fcd565b604051601f8201601f191681016001600160401b038111828210171561209757612097611fcd565b604052919050565b80356001600160a01b0381168114611bb8575f5ffd5b803563ffffffff81168114611bb8575f5ffd5b5f604082840312156120d8575f5ffd5b6120e0611fe1565b90506120eb8261209f565b81526120f9602083016120b5565b602082015292915050565b5f60408284031215612114575f5ffd5b61211c611fe1565b823581526020928301359281019290925250919050565b5f82601f830112612142575f5ffd5b61214a611fe1565b80604084018581111561215b575f5ffd5b845b8181101561217557803584526020938401930161215d565b509095945050505050565b5f60808284031215612190575f5ffd5b612198611fe1565b90506121a48383612133565b81526120f98360408401612133565b5f6001600160401b038211156121cb576121cb611fcd565b5060051b60200190565b5f82601f8301126121e4575f5ffd5b81356121f76121f2826121b3565b61206f565b8082825260208201915060208360051b860101925085831115612218575f5ffd5b602085015b8381101561223557803583526020928301920161221d565b5095945050505050565b5f6060828403121561224f575f5ffd5b612257611fe1565b90506122638383612104565b815260408201356001600160401b0381111561227d575f5ffd5b612289848285016121d5565b60208301525092915050565b5f61012082840312156122a6575f5ffd5b6122ae612009565b90506122b9826120b5565b8152602082810135908201526122d28360408401612104565b60408201526122e48360808401612180565b60608201526101008201356001600160401b03811115612302575f5ffd5b8201601f81018413612312575f5ffd5b80356123206121f2826121b3565b8082825260208201915060208360051b850101925086831115612341575f5ffd5b602084015b838110156124515780356001600160401b03811115612363575f5ffd5b85016060818a03601f19011215612378575f5ffd5b61238061202b565b61238c602083016120b5565b815260408201356001600160401b038111156123a6575f5ffd5b82016020810190603f018b136123ba575f5ffd5b80356001600160401b038111156123d3576123d3611fcd565b6123e6601f8201601f191660200161206f565b8181528c60208385010111156123fa575f5ffd5b816020840160208301375f6020838301015280602085015250505060608201356001600160401b0381111561242d575f5ffd5b61243c8b60208386010161223f565b60408301525084525060209283019201612346565b5060808501525091949350505050565b5f5f5f60808486031215612473575f5ffd5b61247d85856120c8565b925060408401356001600160401b03811115612497575f5ffd5b6124a386828701612295565b92505060608401356001600160401b038111156124be575f5ffd5b8401601f810186136124ce575f5ffd5b80356124dc6121f2826121b3565b8082825260208201915060208360051b8501019250888311156124fd575f5ffd5b6020840193505b8284101561252e57833561ffff8116811461251d575f5ffd5b825260209384019390910190612504565b809450505050509250925092565b5f5f6060838503121561254d575f5ffd5b61255784846120c8565b915060408301356001600160401b03811115612571575f5ffd5b61257d85828601612295565b9150509250929050565b602080825282518282018190525f918401906040840190835b818110156121755783518352602093840193909201916001016125a0565b5f5f604083850312156125cf575f5ffd5b6125d8836120b5565b946020939093013593505050565b5f5f5f5f61012085870312156125fa575f5ffd5b8435935061260b8660208701612104565b925061261a8660608701612180565b91506126298660e08701612104565b905092959194509250565b5f5f60608385031215612645575f5ffd5b61264f84846120c8565b915061265d604084016120b5565b90509250929050565b5f5f5f60808486031215612678575f5ffd5b61268285856120c8565b9250612690604085016120b5565b929592945050506060919091013590565b5f8151808452602084019350602083015f5b828110156126d15781518652602095860195909101906001016126b3565b5093949350505050565b60208082528251805183830152015160408201525f6020830151606080840152611df260808401826126a1565b5f60208284031215612718575f5ffd5b81356001600160401b0381111561272d575f5ffd5b611df28482850161223f565b602081525f82518060208401528060208501604085015e5f604082850101526040601f19601f83011684010191505092915050565b5f6040828403121561277e575f5ffd5b61050483836120c8565b5f60408284031215612798575f5ffd5b50919050565b5f5f5f5f60c085870312156127b1575f5ffd5b6127bb8686612788565b93506127c9604086016120b5565b925060608501356001600160401b038111156127e3575f5ffd5b850160a081880312156127f4575f5ffd5b6127fc61204d565b81358152602080830135908201526128178860408401612104565b604082015260808201356001600160401b03811115612834575f5ffd5b612840898285016121d5565b606083015250925061262990508660808701612788565b5f5f60208385031215612868575f5ffd5b82356001600160401b0381111561287d575f5ffd5b8301601f8101851361288d575f5ffd5b80356001600160401b038111156128a2575f5ffd5b8560208284010111156128b3575f5ffd5b6020919091019590945092505050565b5f5f5f608084860312156128d5575f5ffd5b6128df85856120c8565b925060408401356001600160401b038111156128f9575f5ffd5b61290586828701612295565b92505060608401356001600160401b03811115612920575f5ffd5b61292c868287016121d5565b9150509250925092565b80518252602081015160208301525f6040820151612961604085018280518252602090810151910152565b50606082015160a06080850152611df260a08501826126a1565b602081525f6105046020830184612936565b634e487b7160e01b5f52603260045260245ffd5b634e487b7160e01b5f52601160045260245ffd5b8082028115828204841417610507576105076129a1565b634e487b7160e01b5f52601260045260245ffd5b5f826129ee576129ee6129cc565b500490565b60ff60f81b8360f81b1681525f82518060208501600185015e5f92016001019182525092915050565b5f60208284031215612a2c575f5ffd5b6105048261209f565b5f60208284031215612a45575f5ffd5b610504826120b5565b6001600160a01b03612a5f8561209f565b16815263ffffffff612a73602086016120b5565b16602082015263ffffffff83166040820152608060608201525f6113996080830184612936565b60f884901b6001600160f81b0319168152818360018301375f910160010190815292915050565b80516020808301519190811015612798575f1960209190910360031b1b16919050565b63ffffffff8181168382160190811115610507576105076129a1565b5f60208284031215612b10575f5ffd5b815180151581146104f1575f5ffd5b81810381811115610507576105076129a1565b5f82612b4057612b406129cc565b500690565b80820180821115610507576105076129a156fe30644e72e131a029b85045b68181585d97816a916871ca8d3c208c16d87cfd47a264697066735822122047efe08902b75ecc731f770008e0f2e919f7167601f0783a4a7fbbb3e147b78c64736f6c634300081b0033",
}
⋮----
// 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, _version string) (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
⋮----
// Version is a free data retrieval call binding the contract method 0x54fd4d50.
⋮----
// Solidity: function version() view returns(string)
func (_BN254CertificateVerifier *BN254CertificateVerifierCaller) Version(opts *bind.CallOpts) (string, error)
⋮----
// 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: "0x60556032600b8282823980515f1a607314602657634e487b7160e01b5f525f60045260245ffd5b305f52607381538281f3fe730000000000000000000000000000000000000000301460806040525f5ffdfea264697066735822122099890b68aab0bf243dce6fa1d9c78bbdb3bbd47fb6b3dbc51c4b9691de9707ef64736f6c634300081b0033",
}
⋮----
// 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\"},{\"name\":\"_version\",\"type\":\"string\",\"internalType\":\"string\"}],\"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\":\"function\",\"name\":\"version\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"string\",\"internalType\":\"string\"}],\"stateMutability\":\"view\"},{\"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\":\"InvalidShortString\",\"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\":[]},{\"type\":\"error\",\"name\":\"StringTooLong\",\"inputs\":[{\"name\":\"str\",\"type\":\"string\",\"internalType\":\"string\"}]}]",
	Bin: "0x610120604052348015610010575f5ffd5b5060405161281438038061281483398101604081905261002f916101c1565b80838686856001600160a01b03811661005b576040516339b190bb60e11b815260040160405180910390fd5b6001600160a01b0390811660805291821660a052811660c0521660e05261008181610098565b610100525061008e6100de565b5050505050610319565b5f5f829050601f815111156100cb578260405163305a27a960e01b81526004016100c291906102be565b60405180910390fd5b80516100d6826102f3565b179392505050565b5f54610100900460ff16156101455760405162461bcd60e51b815260206004820152602760248201527f496e697469616c697a61626c653a20636f6e747261637420697320696e697469604482015266616c697a696e6760c81b60648201526084016100c2565b5f5460ff90811614610194575f805460ff191660ff9081179091556040519081527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b565b6001600160a01b03811681146101aa575f5ffd5b50565b634e487b7160e01b5f52604160045260245ffd5b5f5f5f5f5f60a086880312156101d5575f5ffd5b85516101e081610196565b60208701519095506101f181610196565b604087015190945061020281610196565b606087015190935061021381610196565b60808701519092506001600160401b0381111561022e575f5ffd5b8601601f8101881361023e575f5ffd5b80516001600160401b03811115610257576102576101ad565b604051601f8201601f19908116603f011681016001600160401b0381118282101715610285576102856101ad565b6040528181528282016020018a101561029c575f5ffd5b8160208401602083015e5f602083830101528093505050509295509295909350565b602081525f82518060208401528060208501604085015e5f604082850101526040601f19601f83011684010191505092915050565b80516020808301519190811015610313575f198160200360031b1b821691505b50919050565b60805160a05160c05160e0516101005161247f6103955f395f610b7201525f81816102e601526117d701525f818161028701528181610a29015261112201525f81816103ee015281816107920152818161092201528181610c05015261107901525f81816103800152818161170b0152611a9b015261247f5ff3fe608060405234801561000f575f5ffd5b50600436106101d1575f3560e01c8063715018a6116100fe578063ca8aa7c71161009e578063d9a6729e1161006e578063d9a6729e1461044b578063dfbd9dfd1461045e578063f2fde38b14610471578063fabc1cbc14610484575f5ffd5b8063ca8aa7c7146103e9578063d09b978b14610410578063d504491114610425578063d6db9e2514610438575f5ffd5b80638da5cb5b116100d95780638da5cb5b146103a2578063ac505f4b146103b3578063b186a60e146103cb578063c4bffe2b146103d3575f5ffd5b8063715018a61461036057806375e4b53914610368578063886f11951461037b575f5ffd5b80633ec45c7e11610174578063595c6a6711610144578063595c6a67146103105780635ac86ab7146103185780635c975abb1461033b5780636c55a37f1461034d575f5ffd5b80633ec45c7e1461028257806341ee6d0e146102c15780634657e26a146102e157806354fd4d5014610308575f5ffd5b80631ca9142a116101af5780631ca9142a1461021057806321fa7fdc14610223578063277e1e621461024c57806336b200de1461025f575f5ffd5b806304e98be3146101d55780630f19aaef146101ea578063136439dd146101fd575b5f5ffd5b6101e86101e3366004611d72565b610497565b005b6101e86101f8366004611e0a565b6105db565b6101e861020b366004611e46565b610701565b6101e861021e366004611e73565b61073b565b610236610231366004611f4c565b61086b565b6040516102439190611f84565b60405180910390f35b6101e861025a366004611f92565b6108cb565b61027261026d366004611f4c565b610a09565b6040519015158152602001610243565b6102a97f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b039091168152602001610243565b6102d46102cf366004611fc5565b610a24565b604051610243919061200d565b6102a97f000000000000000000000000000000000000000000000000000000000000000081565b6102d4610b6b565b6101e8610b9b565b61027261032636600461201f565b606654600160ff9092169190911b9081161490565b6066545b604051908152602001610243565b6101e861035b366004611fc5565b610baf565b6101e8610dd2565b6102a9610376366004611f4c565b610de3565b6102a97f000000000000000000000000000000000000000000000000000000000000000081565b6033546001600160a01b03166102a9565b609e5460405163ffffffff9091168152602001610243565b61033f610e0f565b6103db610e1a565b60405161024392919061203f565b6102a97f000000000000000000000000000000000000000000000000000000000000000081565b610418610f30565b60405161024391906120c8565b6101e8610433366004612115565b611023565b6101e8610446366004612159565b611269565b610418610459366004612172565b61127d565b6101e861046c366004612192565b6113c7565b6101e861047f3660046121d1565b61146d565b6101e8610492366004611e46565b6114e3565b61049f611550565b60036104aa816115aa565b8382146104ca5760405163512509d360e11b815260040160405180910390fd5b5f5b848110156105d3575f8686838181106104e7576104e76121ec565b905060200201359050805f0361051057604051633d23e4d160e11b815260040160405180910390fd5b61054481868685818110610526576105266121ec565b905060200201602081019061053b91906121d1565b609b91906115d5565b610561576040516324bf631b60e11b815260040160405180910390fd5b7f7a0a76d85b582b17996dd7371a407aa7a79b870db8539247fba315c7b6beff6281868685818110610595576105956121ec565b90506020020160208101906105aa91906121d1565b604080519283526001600160a01b0390911660208301520160405180910390a1506001016104cc565b505050505050565b5f54610100900460ff16158080156105f957505f54600160ff909116105b806106125750303b15801561061257505f5460ff166001145b61067a5760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b60648201526084015b60405180910390fd5b5f805460ff19166001179055801561069b575f805461ff0019166101001790555b6106a4846115f4565b6106ad83611645565b6106b6826116b9565b80156106fb575f805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b50505050565b6107096116f6565b606654818116811461072e5760405163c61dca5d60e01b815260040160405180910390fd5b610737826116b9565b5050565b6001610746816115aa565b61075360208401846121d1565b61075c81611799565b6107795760405163932d94f760e01b815260040160405180910390fd5b6040516304c1b8eb60e31b815284906001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169063260dc758906107c7908490600401612231565b602060405180830381865afa1580156107e2573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610806919061223f565b61082357604051631fb1705560e21b815260040160405180910390fd5b8461083661026d36839003830183611f4c565b61085357604051634d2baea960e11b815260040160405180910390fd5b6105d361086536889003880188611f4c565b86611843565b604080518082019091525f8082526020820152609a5f61088a846118bd565b815260208082019290925260409081015f208151808301909252546001600160a01b0381168252600160a01b900463ffffffff169181019190915292915050565b60026108d6816115aa565b6108e360208401846121d1565b6108ec81611799565b6109095760405163932d94f760e01b815260040160405180910390fd5b6040516304c1b8eb60e31b815284906001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169063260dc75890610957908490600401612231565b602060405180830381865afa158015610972573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610996919061223f565b6109b357604051631fb1705560e21b815260040160405180910390fd5b846109c661026d36839003830183611f4c565b6109e357604051634d2baea960e11b815260040160405180910390fd5b6105d36109f536889003880188611f4c565b610a0436889003880188611f4c565b611920565b5f610a1e610a16836118bd565b6097906119e9565b92915050565b6060817f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316637cffe48c846040518263ffffffff1660e01b8152600401610a739190612231565b602060405180830381865afa158015610a8e573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610ab2919061225e565b610ac461023136869003860186611f4c565b610ad661037636879003870187611f4c565b6001600160a01b03166341ee6d0e866040518263ffffffff1660e01b8152600401610b019190612231565b5f60405180830381865afa158015610b1b573d5f5f3e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052610b42919081019061227c565b604051602001610b559493929190612324565b6040516020818303038152906040529050919050565b6060610b967f0000000000000000000000000000000000000000000000000000000000000000611a00565b905090565b610ba36116f6565b610bad5f196116b9565b565b5f610bb9816115aa565b610bc660208301836121d1565b610bcf81611799565b610bec5760405163932d94f760e01b815260040160405180910390fd5b6040516304c1b8eb60e31b815283906001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169063260dc75890610c3a908490600401612231565b602060405180830381865afa158015610c55573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610c79919061223f565b610c9657604051631fb1705560e21b815260040160405180910390fd5b83610ca961026d36839003830183611f4c565b610cc657604051634d2baea960e11b815260040160405180910390fd5b5f610cde610cd936889003880188611f4c565b6118bd565b5f818152609960205260409081902080546001600160a01b0319169055519091507fd7811913efd5d98fc7ea0d1fdd022b3d31987815360842d05b1d1cf55578d16a90610d2c908890612231565b60405180910390a15f818152609a60205260409081902080546001600160c01b0319169055517f210a1118a869246162804e2a7f21ef808ebd93f4be7ed512014fe29a7a8be02e90610d7f908890612231565b60405180910390a1610d92609782611a3d565b507f4ffdfdd59e9e1e3c301608788f78dd458e61cb8c045ca92b62a7b484c80824fb86604051610dc29190612231565b60405180910390a1505050505050565b610dda611550565b610bad5f6115f4565b5f60995f610df0846118bd565b815260208101919091526040015f20546001600160a01b031692915050565b5f610b966097611a48565b6060805f610e28609b611a51565b90505f8167ffffffffffffffff811115610e4457610e44611ea9565b604051908082528060200260200182016040528015610e6d578160200160208202803683370190505b5090505f8267ffffffffffffffff811115610e8a57610e8a611ea9565b604051908082528060200260200182016040528015610eb3578160200160208202803683370190505b5090505f5b83811015610f25575f80610ecd609b84611a5b565b9150915081858481518110610ee457610ee46121ec565b60200260200101818152505080848481518110610f0357610f036121ec565b6001600160a01b03909216602092830291909101909101525050600101610eb8565b509094909350915050565b60605f610f3d6097611a48565b90505f8167ffffffffffffffff811115610f5957610f59611ea9565b604051908082528060200260200182016040528015610f9d57816020015b604080518082019091525f8082526020820152815260200190600190039081610f775790505b5090505f5b8281101561101c575f610fb6609783611a78565b90505f610ff282604080518082019091525f80825260208201525060408051808201909152606082901c815263ffffffff909116602082015290565b905080848481518110611007576110076121ec565b60209081029190910101525050600101610fa2565b5092915050565b5f61102d816115aa565b61103a60208501856121d1565b61104381611799565b6110605760405163932d94f760e01b815260040160405180910390fd5b6040516304c1b8eb60e31b815285906001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169063260dc758906110ae908490600401612231565b602060405180830381865afa1580156110c9573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906110ed919061223f565b61110a57604051631fb1705560e21b815260040160405180910390fd5b5f604051631f3ff92360e21b81526001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001690637cffe48c90611157908a90600401612231565b602060405180830381865afa158015611172573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611196919061225e565b60028111156111a7576111a7612310565b036111c55760405163e57cacbd60e01b815260040160405180910390fd5b6111e26111da610cd936899003890189611f4c565b609790611a83565b6111ff57604051631883461560e01b815260040160405180910390fd5b7f4fb6efec7dd60036ce3a7af8d5c48425019daa0fb61eb471a966a7ac2c6fa6a68660405161122e9190612231565b60405180910390a161124861086536889003880188611f4c565b6105d361125a36889003880188611f4c565b610a0436879003870187611f4c565b611271611550565b61127a81611645565b50565b6060818311156112a05760405163561ce9bb60e01b815260040160405180910390fd5b6112aa6097611a48565b8211156112ca576040516302da361360e61b815260040160405180910390fd5b5f6112d58484612390565b90505f8167ffffffffffffffff8111156112f1576112f1611ea9565b60405190808252806020026020018201604052801561133557816020015b604080518082019091525f808252602082015281526020019060019003908161130f5790505b5090505f5b828110156113be575f61135861135083896123a3565b609790611a78565b90505f61139482604080518082019091525f80825260208201525060408051808201909152606082901c815263ffffffff909116602082015290565b9050808484815181106113a9576113a96121ec565b6020908102919091010152505060010161133a565b50949350505050565b6113cf611550565b60036113da816115aa565b5f5b828110156106fb575f8484838181106113f7576113f76121ec565b90506020020135905061141481609b611a8e90919063ffffffff16565b6114315760405163b3f92ba160e01b815260040160405180910390fd5b6040518181527f6824d36084ecf2cd819b137cb5d837cc6e73afce1e0e348c9fdecaa81d0341e59060200160405180910390a1506001016113dc565b611475611550565b6001600160a01b0381166114da5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610671565b61127a816115f4565b6114eb611a99565b606654801982198116146115125760405163c61dca5d60e01b815260040160405180910390fd5b606682905560405182815233907f3582d1828e26bf56bd801502bc021ac0bc8afb57c826e4986b45593c8fad389c9060200160405180910390a25050565b6033546001600160a01b03163314610bad5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610671565b606654600160ff83161b9081160361127a5760405163840a48d560e01b815260040160405180910390fd5b5f6115ea84846001600160a01b038516611b4a565b90505b9392505050565b603380546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a35050565b5f8163ffffffff161161166b576040516316d98e1b60e31b815260040160405180910390fd5b609e805463ffffffff191663ffffffff83169081179091556040519081527f4fbcd0cca70015b33db8af4aa4f2bd6fd6c1efa9460b8e2333f252c1467a63279060200160405180910390a150565b606681905560405181815233907fab40a374bc51de372200a8bc981af8c9ecdc08dfdaef0bb6e09f88f3c616ef3d9060200160405180910390a250565b60405163237dfb4760e11b81523360048201527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906346fbf68e90602401602060405180830381865afa158015611758573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061177c919061223f565b610bad57604051631d77d47760e21b815260040160405180910390fd5b604051631beb2b9760e31b81526001600160a01b0382811660048301523360248301523060448301525f80356001600160e01b0319166064840152917f00000000000000000000000000000000000000000000000000000000000000009091169063df595cb8906084016020604051808303815f875af115801561181f573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610a1e919061223f565b8060995f611850856118bd565b81526020019081526020015f205f6101000a8154816001600160a01b0302191690836001600160a01b031602179055507f7f7ccafd92d20fdb39dee184a0dce002a9da420ed0def461f2a027abc9b3f6df82826040516118b19291906123b6565b60405180910390a15050565b5f815f0151826020015163ffffffff1660405160200161190892919060609290921b6bffffffffffffffffffffffff1916825260a01b6001600160a01b031916601482015260200190565b604051602081830303815290604052610a1e906123dc565b602081015163ffffffff1615806119475750609e54602082015163ffffffff918216911610155b61196457604051632e46483160e11b815260040160405180910390fd5b80609a5f611971856118bd565b815260208082019290925260409081015f2083518154949093015163ffffffff16600160a01b026001600160c01b03199094166001600160a01b0390931692909217929092179055517f3147846ee526009000671c20380b856a633345691300f82585f90034715cf0e2906118b190849084906123ff565b5f81815260018301602052604081205415156115ed565b60605f611a0c83611b66565b6040805160208082528183019092529192505f91906020820181803683375050509182525060208101929092525090565b5f6115ed8383611b8d565b5f610a1e825490565b5f610a1e82611c70565b5f808080611a698686611c7a565b909450925050505b9250929050565b5f6115ed8383611ca3565b5f6115ed8383611cc9565b5f6115ed8383611d15565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663eab66d7a6040518163ffffffff1660e01b8152600401602060405180830381865afa158015611af5573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611b19919061241a565b6001600160a01b0316336001600160a01b031614610bad5760405163794821ff60e01b815260040160405180910390fd5b5f82815260028401602052604081208290556115ea8484611a83565b5f60ff8216601f811115610a1e57604051632cd44ac360e21b815260040160405180910390fd5b5f8181526001830160205260408120548015611c67575f611baf600183612390565b85549091505f90611bc290600190612390565b9050818114611c21575f865f018281548110611be057611be06121ec565b905f5260205f200154905080875f018481548110611c0057611c006121ec565b5f918252602080832090910192909255918252600188019052604090208390555b8554869080611c3257611c32612435565b600190038181905f5260205f20015f90559055856001015f8681526020019081526020015f205f905560019350505050610a1e565b5f915050610a1e565b5f610a1e82611a48565b5f8080611c878585611a78565b5f81815260029690960160205260409095205494959350505050565b5f825f018281548110611cb857611cb86121ec565b905f5260205f200154905092915050565b5f818152600183016020526040812054611d0e57508154600181810184555f848152602080822090930184905584548482528286019093526040902091909155610a1e565b505f610a1e565b5f81815260028301602052604081208190556115ed8383611a3d565b5f5f83601f840112611d41575f5ffd5b50813567ffffffffffffffff811115611d58575f5ffd5b6020830191508360208260051b8501011115611a71575f5ffd5b5f5f5f5f60408587031215611d85575f5ffd5b843567ffffffffffffffff811115611d9b575f5ffd5b611da787828801611d31565b909550935050602085013567ffffffffffffffff811115611dc6575f5ffd5b611dd287828801611d31565b95989497509550505050565b6001600160a01b038116811461127a575f5ffd5b803563ffffffff81168114611e05575f5ffd5b919050565b5f5f5f60608486031215611e1c575f5ffd5b8335611e2781611dde565b9250611e3560208501611df2565b929592945050506040919091013590565b5f60208284031215611e56575f5ffd5b5035919050565b5f60408284031215611e6d575f5ffd5b50919050565b5f5f60608385031215611e84575f5ffd5b611e8e8484611e5d565b91506040830135611e9e81611dde565b809150509250929050565b634e487b7160e01b5f52604160045260245ffd5b604051601f8201601f1916810167ffffffffffffffff81118282101715611ee657611ee6611ea9565b604052919050565b5f60408284031215611efe575f5ffd5b6040805190810167ffffffffffffffff81118282101715611f2157611f21611ea9565b6040529050808235611f3281611dde565b8152611f4060208401611df2565b60208201525092915050565b5f60408284031215611f5c575f5ffd5b6115ed8383611eee565b80516001600160a01b0316825260209081015163ffffffff16910152565b60408101610a1e8284611f66565b5f5f60808385031215611fa3575f5ffd5b611fad8484611e5d565b9150611fbc8460408501611e5d565b90509250929050565b5f60408284031215611fd5575f5ffd5b6115ed8383611e5d565b5f81518084528060208401602086015e5f602082860101526020601f19601f83011685010191505092915050565b602081525f6115ed6020830184611fdf565b5f6020828403121561202f575f5ffd5b813560ff811681146115ed575f5ffd5b604080825283519082018190525f9060208501906060840190835b8181101561207857835183526020938401939092019160010161205a565b5050838103602080860191909152855180835291810192508501905f5b818110156120bc5782516001600160a01b0316845260209384019390920191600101612095565b50919695505050505050565b602080825282518282018190525f918401906040840190835b8181101561210a576120f4838551611f66565b60209390930192604092909201916001016120e1565b509095945050505050565b5f5f5f60a08486031215612127575f5ffd5b6121318585611e5d565b9250604084013561214181611dde565b91506121508560608601611e5d565b90509250925092565b5f60208284031215612169575f5ffd5b6115ed82611df2565b5f5f60408385031215612183575f5ffd5b50508035926020909101359150565b5f5f602083850312156121a3575f5ffd5b823567ffffffffffffffff8111156121b9575f5ffd5b6121c585828601611d31565b90969095509350505050565b5f602082840312156121e1575f5ffd5b81356115ed81611dde565b634e487b7160e01b5f52603260045260245ffd5b803561220b81611dde565b6001600160a01b0316825263ffffffff61222760208301611df2565b1660208301525050565b60408101610a1e8284612200565b5f6020828403121561224f575f5ffd5b815180151581146115ed575f5ffd5b5f6020828403121561226e575f5ffd5b8151600381106115ed575f5ffd5b5f6020828403121561228c575f5ffd5b815167ffffffffffffffff8111156122a2575f5ffd5b8201601f810184136122b2575f5ffd5b805167ffffffffffffffff8111156122cc576122cc611ea9565b6122df601f8201601f1916602001611ebd565b8181528560208385010111156122f3575f5ffd5b8160208401602083015e5f91810160200191909152949350505050565b634e487b7160e01b5f52602160045260245ffd5b61232e8186612200565b5f6003851061234b57634e487b7160e01b5f52602160045260245ffd5b84604083015261235e6060830185611f66565b60c060a083015261237260c0830184611fdf565b9695505050505050565b634e487b7160e01b5f52601160045260245ffd5b81810381811115610a1e57610a1e61237c565b80820180821115610a1e57610a1e61237c565b606081016123c48285611f66565b6001600160a01b039290921660409190910152919050565b80516020808301519190811015611e6d575f1960209190910360031b1b16919050565b6080810161240d8285611f66565b6115ed6040830184611f66565b5f6020828403121561242a575f5ffd5b81516115ed81611dde565b634e487b7160e01b5f52603160045260245ffdfea26469706673582212204a66187c822cf8883196722425d6a199eb25caad0350f5c28fa5162b58fd508364736f6c634300081b0033",
}
⋮----
// 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, _version string) (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)
⋮----
// Version is a free data retrieval call binding the contract method 0x54fd4d50.
⋮----
// Solidity: function version() view returns(string)
func (_CrossChainRegistry *CrossChainRegistryCaller) Version(opts *bind.CallOpts) (string, 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: "0x610160604052348015610010575f5ffd5b5060405161606b38038061606b83398101604081905261002f916101d9565b808084898989878a6001600160a01b03811661005e576040516339b190bb60e11b815260040160405180910390fd5b6001600160a01b0390811660805293841660a05291831660c052821660e05263ffffffff16610100521661012052610095816100b0565b61014052506100a490506100f6565b50505050505050610364565b5f5f829050601f815111156100e3578260405163305a27a960e01b81526004016100da9190610309565b60405180910390fd5b80516100ee8261033e565b179392505050565b5f54610100900460ff161561015d5760405162461bcd60e51b815260206004820152602760248201527f496e697469616c697a61626c653a20636f6e747261637420697320696e697469604482015266616c697a696e6760c81b60648201526084016100da565b5f5460ff908116146101ac575f805460ff191660ff9081179091556040519081527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b565b6001600160a01b03811681146101c2575f5ffd5b50565b634e487b7160e01b5f52604160045260245ffd5b5f5f5f5f5f5f5f60e0888a0312156101ef575f5ffd5b87516101fa816101ae565b602089015190975061020b816101ae565b604089015190965061021c816101ae565b606089015190955061022d816101ae565b608089015190945061023e816101ae565b60a089015190935063ffffffff81168114610257575f5ffd5b60c08901519092506001600160401b03811115610272575f5ffd5b88015f601f82018b13610283575f5ffd5b81516001600160401b0381111561029c5761029c6101c5565b604051601f8201601f19908116603f011681016001600160401b03811182821017156102ca576102ca6101c5565b6040528181528382016020018d10156102e1575f5ffd5b8160208501602083015e5f602083830101528092508094505050505092959891949750929550565b602081525f82518060208401528060208501604085015e5f604082850101526040601f19601f83011684010191505092915050565b8051602080830151919081101561035e575f198160200360031b1b821691505b50919050565b60805160a05160c05160e051610100516101205161014051615c156104565f395f8181610fde0152613dc701525f8181610412015261317001525f81816107030152818161326f0152818161354101526136fa01525f818161075301528181610cf301528181610eb601528181611056015281816113af0152818161181101528181612480015261414501525f818161043901528181610e340152818161130e0152818161158201528181612d7101528181612f5201526133b501525f818161036f01528181610e02015281816114d6015261338f01525f81816105e201528181612b370152613e360152615c155ff3fe608060405234801561000f575f5ffd5b50600436106102b1575f3560e01c80636d70f7ae1161017b578063bb45fef2116100e4578063e4cc3f901161009e578063f698da2511610079578063f698da25146107ce578063fabc1cbc146107d6578063fd8aa88d146107e9578063fe4b84df146107fc575f5ffd5b8063e4cc3f9014610788578063eea9064b1461079b578063f0e0e676146107ae575f5ffd5b8063bb45fef2146106b9578063bfae3fd2146106e6578063c448feb8146106f9578063c978f7ac1461072d578063ca8aa7c71461074e578063da8be86414610775575f5ffd5b80639104c319116101355780639104c319146106175780639435bb431461063257806399f5371b14610645578063a178848414610665578063a33a343314610684578063b7f06ebe14610697575f5ffd5b80636d70f7ae1461057a5780636e1744481461058d578063778e55f3146105a057806378296ec5146105ca578063886f1195146105dd5780639004134714610604575f5ffd5b806354b7c96c1161021d5780635c975abb116101d75780635c975abb146104d45780635d975e88146104dc5780635dd68579146104fd57806360a0d1ce1461051e57806365da12641461053157806366d5ba9314610559575f5ffd5b806354b7c96c1461045b57806354fd4d501461046e578063595c6a6714610483578063597b36da1461048b5780635ac86ab71461049e5780635ae679a7146104c1575f5ffd5b806339b70e381161026e57806339b70e381461036a5780633c651cf2146103a95780633cdeb5e0146103bc5780633e28391d146103ea5780634657e26a1461040d5780634665bcda14610434575f5ffd5b806304a4f979146102b55780630b9f487a146102ef5780630dd8dd0214610302578063136439dd1461032257806325df922e146103375780632aa6d88814610357575b5f5ffd5b6102dc7f14bde674c9f64b2ad00eaaee4a8bed1fabef35c7507e3c5b9cfc9436909a2dad81565b6040519081526020015b60405180910390f35b6102dc6102fd366004614a7f565b61080f565b610315610310366004614b16565b610897565b6040516102e69190614b54565b610335610330366004614b8b565b610b09565b005b61034a610345366004614d20565b610b43565b6040516102e69190614dce565b610335610365366004614e30565b610ca3565b6103917f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b0390911681526020016102e6565b6103356103b7366004614e8e565b610df7565b6103916103ca366004614ed1565b6001600160a01b039081165f908152609960205260409020600101541690565b6103fd6103f8366004614ed1565b610f4a565b60405190151581526020016102e6565b6103917f000000000000000000000000000000000000000000000000000000000000000081565b6103917f000000000000000000000000000000000000000000000000000000000000000081565b610335610469366004614eec565b610f69565b610476610fd7565b6040516102e69190614f51565b610335611007565b6102dc61049936600461501f565b61101b565b6103fd6104ac366004615050565b606654600160ff9092169190911b9081161490565b6102dc6104cf366004615084565b61104a565b6066546102dc565b6104ef6104ea366004614b8b565b6111bc565b6040516102e69291906151b9565b61051061050b366004614ed1565b6111d9565b6040516102e692919061522b565b61033561052c366004615298565b611303565b61039161053f366004614ed1565b609a6020525f90815260409020546001600160a01b031681565b61056c610567366004614ed1565b6114ae565b6040516102e69291906152d7565b6103fd610588366004614ed1565b6117ae565b6102dc61059b366004614eec565b6117e6565b6102dc6105ae366004614eec565b609860209081525f928352604080842090915290825290205481565b6103356105d83660046152e9565b611890565b6103917f000000000000000000000000000000000000000000000000000000000000000081565b61034a610612366004615339565b611926565b61039173beac0eeeeeeeeeeeeeeeeeeeeeeeeeeeeeebeac081565b610335610640366004615385565b6119fc565b610658610653366004614b8b565b611ab7565b6040516102e69190615421565b6102dc610673366004614ed1565b609f6020525f908152604090205481565b610315610692366004615433565b611bd3565b6103fd6106a5366004614b8b565b609e6020525f908152604090205460ff1681565b6103fd6106c736600461551a565b609c60209081525f928352604080842090915290825290205460ff1681565b6102dc6106f4366004614eec565b611beb565b60405163ffffffff7f00000000000000000000000000000000000000000000000000000000000000001681526020016102e6565b61074061073b366004615339565b611c27565b6040516102e6929190615544565b6103917f000000000000000000000000000000000000000000000000000000000000000081565b610315610783366004614ed1565b611eb4565b610335610796366004615563565b611fdd565b6103356107a9366004615433565b612015565b6107c16107bc3660046155e1565b612080565b6040516102e6919061568e565b6102dc612125565b6103356107e4366004614b8b565b6121de565b6103156107f7366004614ed1565b61224c565b61033561080a366004614b8b565b61226f565b604080517f14bde674c9f64b2ad00eaaee4a8bed1fabef35c7507e3c5b9cfc9436909a2dad60208201526001600160a01b03808616928201929092528187166060820152908516608082015260a0810183905260c081018290525f9061088d9060e00160405160208183030381529060405280519060200120612380565b9695505050505050565b606060016108a4816123ae565b6108ac6123dc565b5f836001600160401b038111156108c5576108c5614ba2565b6040519080825280602002602001820160405280156108ee578160200160208202803683370190505b50335f908152609a60205260408120549192506001600160a01b03909116905b85811015610afa57868682818110610928576109286156a0565b905060200281019061093a91906156b4565b6109489060208101906156d2565b905087878381811061095c5761095c6156a0565b905060200281019061096e91906156b4565b61097890806156d2565b905014610998576040516343714afd60e01b815260040160405180910390fd5b5f610a0233848a8a868181106109b0576109b06156a0565b90506020028101906109c291906156b4565b6109cc90806156d2565b808060200260200160405190810160405280939291908181526020018383602002808284375f9201919091525061243592505050565b9050610ad433848a8a86818110610a1b57610a1b6156a0565b9050602002810190610a2d91906156b4565b610a3790806156d2565b808060200260200160405190810160405280939291908181526020018383602002808284375f920191909152508e92508d9150889050818110610a7c57610a7c6156a0565b9050602002810190610a8e91906156b4565b610a9c9060208101906156d2565b808060200260200160405190810160405280939291908181526020018383602002808284375f92019190915250889250612587915050565b848381518110610ae657610ae66156a0565b60209081029190910101525060010161090e565b5050600160c955949350505050565b610b11612b22565b6066548181168114610b365760405163c61dca5d60e01b815260040160405180910390fd5b610b3f82612bc5565b5050565b6001600160a01b038084165f908152609a60205260408120546060921690610b6c868387612435565b90505f85516001600160401b03811115610b8857610b88614ba2565b604051908082528060200260200182016040528015610bb1578160200160208202803683370190505b5090505f5b8651811015610c96576001600160a01b0388165f90815260a260205260408120885182908a9085908110610bec57610bec6156a0565b60200260200101516001600160a01b03166001600160a01b031681526020019081526020015f206040518060200160405290815f820154815250509050610c70878381518110610c3e57610c3e6156a0565b6020026020010151858481518110610c5857610c586156a0565b602002602001015183612c029092919063ffffffff16565b838381518110610c8257610c826156a0565b602090810291909101015250600101610bb6565b50925050505b9392505050565b610cab6123dc565b610cb433610f4a565b15610cd257604051633bf2b50360e11b815260040160405180910390fd5b604051632b6241f360e11b815233600482015263ffffffff841660248201527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906356c483e6906044015f604051808303815f87803b158015610d3c575f5ffd5b505af1158015610d4e573d5f5f3e3d5ffd5b50505050610d5c3385612c20565b610d663333612c82565b6040516001600160a01b038516815233907fa453db612af59e5521d6ab9284dc3e2d06af286eb1b1b7b771fce4716c19f2c19060200160405180910390a2336001600160a01b03167f02a919ed0e2acad1dd90f17ef2fa4ae5462ee1339170034a8531cca4b67080908383604051610ddf929190615717565b60405180910390a2610df1600160c955565b50505050565b336001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000161480610e565750336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016145b610e735760405163045206a560e21b815260040160405180910390fd5b610e7b6123dc565b6001600160a01b038481165f908152609a602052604080822054905163152667d960e31b8152908316600482018190528684166024830152927f0000000000000000000000000000000000000000000000000000000000000000169063a9333ec890604401602060405180830381865afa158015610efb573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610f1f9190615745565b90505f610f2d878784612f0b565b9050610f3d838888888886612fed565b505050610df1600160c955565b6001600160a01b039081165f908152609a602052604090205416151590565b81610f7381613132565b610f905760405163932d94f760e01b815260040160405180910390fd5b610f986123dc565b610fa1836117ae565b610fbe576040516325ec6c1f60e01b815260040160405180910390fd5b610fc88383612c20565b610fd2600160c955565b505050565b60606110027f00000000000000000000000000000000000000000000000000000000000000006131dc565b905090565b61100f612b22565b6110195f19612bc5565b565b5f8160405160200161102d9190615421565b604051602081830303815290604052805190602001209050919050565b5f336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614611094576040516323d871a560e01b815260040160405180910390fd5b61109c6123dc565b6001600160a01b038088165f9081526098602090815260408083209388168352929052908120546110da906001600160401b03808716908616613219565b90505f6110e989878787613231565b90506110f58183615774565b9250611103895f88856132ee565b604080516001600160a01b038881168252602082018690528b16917fdd611f4ef63f4385f1756c86ce1f1f389a9013ba6fa07daba8528291bc2d3c30910160405180910390a261115286613368565b6001600160a01b0316633fb99ca5898989876040518563ffffffff1660e01b81526004016111839493929190615787565b5f604051808303815f87803b15801561119a575f5ffd5b505af11580156111ac573d5f5f3e3d5ffd5b50505050505061088d600160c955565b6111c4614940565b60606111cf836133da565b9094909350915050565b6060805f6111e68461224c565b8051909150806001600160401b0381111561120357611203614ba2565b60405190808252806020026020018201604052801561123c57816020015b611229614940565b8152602001906001900390816112215790505b509350806001600160401b0381111561125757611257614ba2565b60405190808252806020026020018201604052801561128a57816020015b60608152602001906001900390816112755790505b5092505f5b818110156112fb576112b98382815181106112ac576112ac6156a0565b60200260200101516133da565b8683815181106112cb576112cb6156a0565b602002602001018684815181106112e4576112e46156a0565b60209081029190910101919091525260010161128f565b505050915091565b336001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000161461134c57604051633213a66160e21b815260040160405180910390fd5b6113546123dc565b61135d83610f4a565b15610fc8576001600160a01b038381165f908152609a602052604080822054905163152667d960e31b81529083166004820181905273beac0eeeeeeeeeeeeeeeeeeeeeeeeeeeeeebeac06024830152927f0000000000000000000000000000000000000000000000000000000000000000169063a9333ec890604401602060405180830381865afa1580156113f4573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906114189190615745565b6001600160a01b0386165f90815260a26020908152604080832073beac0eeeeeeeeeeeeeeeeeeeeeeeeeeeeeebeac084528252808320815192830190915254815291925061147e866114766001600160401b0380871690891661362d565b849190613641565b90506114a0848873beac0eeeeeeeeeeeeeeeeeeeeeeeeeeeeeebeac0846132ee565b50505050610fd2600160c955565b6040516394f649dd60e01b81526001600160a01b03828116600483015260609182915f9182917f000000000000000000000000000000000000000000000000000000000000000016906394f649dd906024015f60405180830381865afa15801561151a573d5f5f3e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526115419190810190615837565b60405163fe243a1760e01b81526001600160a01b03888116600483015273beac0eeeeeeeeeeeeeeeeeeeeeeeeeeeeeebeac060248301529294509092505f917f0000000000000000000000000000000000000000000000000000000000000000169063fe243a1790604401602060405180830381865afa1580156115c7573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906115eb91906158f2565b9050805f036115ff57509094909350915050565b5f8351600161160e9190615774565b6001600160401b0381111561162557611625614ba2565b60405190808252806020026020018201604052801561164e578160200160208202803683370190505b5090505f845160016116609190615774565b6001600160401b0381111561167757611677614ba2565b6040519080825280602002602001820160405280156116a0578160200160208202803683370190505b50905073beac0eeeeeeeeeeeeeeeeeeeeeeeeeeeeeebeac0828651815181106116cb576116cb6156a0565b60200260200101906001600160a01b031690816001600160a01b03168152505082818651815181106116ff576116ff6156a0565b60209081029190910101525f5b85518110156117a057858181518110611727576117276156a0565b6020026020010151838281518110611741576117416156a0565b60200260200101906001600160a01b031690816001600160a01b031681525050848181518110611773576117736156a0565b602002602001015182828151811061178d5761178d6156a0565b602090810291909101015260010161170c565b509097909650945050505050565b5f6001600160a01b038216158015906117e057506001600160a01b038083165f818152609a6020526040902054909116145b92915050565b60405163152667d960e31b81526001600160a01b03838116600483015282811660248301525f9182917f0000000000000000000000000000000000000000000000000000000000000000169063a9333ec890604401602060405180830381865afa158015611856573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061187a9190615745565b90506118888484835f613231565b949350505050565b8261189a81613132565b6118b75760405163932d94f760e01b815260040160405180910390fd5b6118c0846117ae565b6118dd576040516325ec6c1f60e01b815260040160405180910390fd5b836001600160a01b03167f02a919ed0e2acad1dd90f17ef2fa4ae5462ee1339170034a8531cca4b67080908484604051611918929190615717565b60405180910390a250505050565b60605f82516001600160401b0381111561194257611942614ba2565b60405190808252806020026020018201604052801561196b578160200160208202803683370190505b5090505f5b83518110156119f4576001600160a01b0385165f90815260986020526040812085519091908690849081106119a7576119a76156a0565b60200260200101516001600160a01b03166001600160a01b031681526020019081526020015f20548282815181106119e1576119e16156a0565b6020908102919091010152600101611970565b509392505050565b6002611a07816123ae565b611a0f6123dc565b855f5b81811015611aa257611a9a898983818110611a2f57611a2f6156a0565b9050602002810190611a419190615909565b611a4a9061591d565b888884818110611a5c57611a5c6156a0565b9050602002810190611a6e91906156d2565b888886818110611a8057611a806156a0565b9050602002016020810190611a959190615928565b61365f565b600101611a12565b5050611aae600160c955565b50505050505050565b611abf614940565b5f82815260a46020908152604091829020825160e08101845281546001600160a01b03908116825260018301548116828501526002830154168185015260038201546060820152600482015463ffffffff1660808201526005820180548551818602810186019096528086529194929360a08601939290830182828015611b6d57602002820191905f5260205f20905b81546001600160a01b03168152600190910190602001808311611b4f575b5050505050815260200160068201805480602002602001604051908101604052809291908181526020018280548015611bc357602002820191905f5260205f20905b815481526020019060010190808311611baf575b5050505050815250509050919050565b6060611bde33611eb4565b9050610c9c848484612015565b6001600160a01b038083165f90815260a260209081526040808320938516835292815282822083519182019093529154825290610c9c90613aa1565b60608082516001600160401b03811115611c4357611c43614ba2565b604051908082528060200260200182016040528015611c6c578160200160208202803683370190505b50915082516001600160401b03811115611c8857611c88614ba2565b604051908082528060200260200182016040528015611cb1578160200160208202803683370190505b506001600160a01b038086165f908152609a6020526040812054929350911690611cdc868387612435565b90505f5b8551811015611ea9575f611d0c878381518110611cff57611cff6156a0565b6020026020010151613368565b9050806001600160a01b031663fe243a1789898581518110611d3057611d306156a0565b60200260200101516040518363ffffffff1660e01b8152600401611d6a9291906001600160a01b0392831681529116602082015260400190565b602060405180830381865afa158015611d85573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611da991906158f2565b858381518110611dbb57611dbb6156a0565b6020026020010181815250505f60a25f8a6001600160a01b03166001600160a01b031681526020019081526020015f205f898581518110611dfe57611dfe6156a0565b60200260200101516001600160a01b03166001600160a01b031681526020019081526020015f206040518060200160405290815f820154815250509050611e82868481518110611e5057611e506156a0565b6020026020010151858581518110611e6a57611e6a6156a0565b6020026020010151836136419092919063ffffffff16565b878481518110611e9457611e946156a0565b60209081029190910101525050600101611ce0565b5050505b9250929050565b6060611ebe6123dc565b611ec782610f4a565b611ee45760405163a5c7c44560e01b815260040160405180910390fd5b611eed826117ae565b15611f0b576040516311ca333560e31b815260040160405180910390fd5b336001600160a01b03831614611fc3576001600160a01b038083165f908152609a602052604090205416611f3e81613132565b80611f6457506001600160a01b038181165f908152609960205260409020600101541633145b611f8157604051631e499a2360e11b815260040160405180910390fd5b806001600160a01b0316836001600160a01b03167ff0eddf07e6ea14f388b47e1e94a0f464ecbd9eed4171130e0fc0e99fb4030a8a60405160405180910390a3505b611fcc82613ac0565b9050611fd8600160c955565b919050565b6002611fe8816123ae565b611ff06123dc565b612004611ffc8661591d565b85858561365f565b61200e600160c955565b5050505050565b61201d6123dc565b61202633610f4a565b1561204457604051633bf2b50360e11b815260040160405180910390fd5b61204d836117ae565b61206a576040516325ec6c1f60e01b815260040160405180910390fd5b61207633848484613d00565b610fc83384612c82565b60605f83516001600160401b0381111561209c5761209c614ba2565b6040519080825280602002602001820160405280156120cf57816020015b60608152602001906001900390816120ba5790505b5090505f5b84518110156119f4576121008582815181106120f2576120f26156a0565b602002602001015185611926565b828281518110612112576121126156a0565b60209081029190910101526001016120d4565b60408051808201909152600a81526922b4b3b2b72630bcb2b960b11b6020909101525f7f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f7f71b625cfad44bac63b13dba07f2e1d6084ee04b6f8752101ece6126d584ee6ea612192613dbf565b805160209182012060408051928301949094529281019190915260608101919091524660808201523060a082015260c00160405160208183030381529060405280519060200120905090565b6121e6613e34565b6066548019821981161461220d5760405163c61dca5d60e01b815260040160405180910390fd5b606682905560405182815233907f3582d1828e26bf56bd801502bc021ac0bc8afb57c826e4986b45593c8fad389c906020015b60405180910390a25050565b6001600160a01b0381165f90815260a3602052604090206060906117e090613ee5565b5f54610100900460ff161580801561228d57505f54600160ff909116105b806122a65750303b1580156122a657505f5460ff166001145b61230e5760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b60648201526084015b60405180910390fd5b5f805460ff19166001179055801561232f575f805461ff0019166101001790555b61233882612bc5565b8015610b3f575f805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15050565b5f612389612125565b60405161190160f01b602082015260228101919091526042810183905260620161102d565b606654600160ff83161b908116036123d95760405163840a48d560e01b815260040160405180910390fd5b50565b600260c9540361242e5760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401612305565b600260c955565b60605f82516001600160401b0381111561245157612451614ba2565b60405190808252806020026020018201604052801561247a578160200160208202803683370190505b5090505f7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663547afb8786866040518363ffffffff1660e01b81526004016124cc929190615943565b5f60405180830381865afa1580156124e6573d5f5f3e3d5ffd5b505050506040513d5f823e601f3d908101601f1916820160405261250d9190810190615966565b90505f5b845181101561257c5761255787868381518110612530576125306156a0565b602002602001015184848151811061254a5761254a6156a0565b6020026020010151612f0b565b838281518110612569576125696156a0565b6020908102919091010152600101612511565b509095945050505050565b5f6001600160a01b0386166125af576040516339b190bb60e11b815260040160405180910390fd5b83515f036125d05760405163796cc52560e01b815260040160405180910390fd5b5f84516001600160401b038111156125ea576125ea614ba2565b604051908082528060200260200182016040528015612613578160200160208202803683370190505b5090505f85516001600160401b0381111561263057612630614ba2565b604051908082528060200260200182016040528015612659578160200160208202803683370190505b5090505f5b8651811015612955575f61267d888381518110611cff57611cff6156a0565b90505f60a25f8c6001600160a01b03166001600160a01b031681526020019081526020015f205f8a85815181106126b6576126b66156a0565b60200260200101516001600160a01b03166001600160a01b031681526020019081526020015f20905061272f8884815181106126f4576126f46156a0565b602002602001015188858151811061270e5761270e6156a0565b60209081029190910181015160408051928301905284548252909190613641565b848481518110612741576127416156a0565b602002602001018181525050612780888481518110612762576127626156a0565b60209081029190910181015160408051928301905283548252613ef1565b858481518110612792576127926156a0565b60209081029190910101526001600160a01b038a1615612827576127e98a8a85815181106127c2576127c26156a0565b60200260200101518786815181106127dc576127dc6156a0565b6020026020010151613f05565b6128278a8c8b8681518110612800576128006156a0565b602002602001015187878151811061281a5761281a6156a0565b60200260200101516132ee565b5f826001600160a01b031663724af4238d8c878151811061284a5761284a6156a0565b60200260200101518c8881518110612864576128646156a0565b60200260200101516040518463ffffffff1660e01b815260040161288a939291906159f5565b6020604051808303815f875af11580156128a6573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906128ca91906158f2565b9050805f03612947575f82557f8be932bac54561f27260f95463d9b8ab37e06b2842e5ee2404157cc13df6eb8f8c8b868151811061290a5761290a6156a0565b602002602001015161292f856040518060200160405290815f82015481525050613aa1565b60405161293e939291906159f5565b60405180910390a15b50505080600101905061265e565b506001600160a01b0388165f908152609f6020526040812080549182919061297c83615a19565b91905055505f6040518060e001604052808b6001600160a01b031681526020018a6001600160a01b031681526020018b6001600160a01b031681526020018381526020014363ffffffff1681526020018981526020018581525090505f6129e28261101b565b5f818152609e602090815260408083208054600160ff19909116811790915560a4835292819020865181546001600160a01b03199081166001600160a01b039283161783558885015195830180548216968316969096179095559187015160028201805490951692169190911790925560608501516003830155608085015160048301805463ffffffff191663ffffffff90921691909117905560a085015180519394508593612a989260058501920190614999565b5060c08201518051612ab49160068401916020909101906149fc565b5050506001600160a01b038b165f90815260a360205260409020612ad89082613f6f565b507f26b2aae26516e8719ef50ea2f6831a2efbd4e37dccdf0f6936b27bc08e793e30818386604051612b0c93929190615a31565b60405180910390a19a9950505050505050505050565b60405163237dfb4760e11b81523360048201527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906346fbf68e90602401602060405180830381865afa158015612b84573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612ba89190615a5b565b61101957604051631d77d47760e21b815260040160405180910390fd5b606681905560405181815233907fab40a374bc51de372200a8bc981af8c9ecdc08dfdaef0bb6e09f88f3c616ef3d9060200160405180910390a250565b5f61188882612c1a612c1387613aa1565b8690613f7a565b90613f7a565b6001600160a01b038281165f8181526099602090815260409182902060010180546001600160a01b0319169486169485179055905192835290917f773b54c04d756fcc5e678111f7d730de3be98192000799eee3d63716055a87c69101612240565b5f612c8c816123ae565b5f5f612c97856114ae565b915091505f612ca75f8685612435565b6001600160a01b038781165f818152609a602052604080822080546001600160a01b031916948b16948517905551939450919290917fc3ee9f2e5fda98e8066a1f745b2df9285f416fe98cf2559cd21484b3d874330491a35f5b8351811015611aae5773beac0eeeeeeeeeeeeeeeeeeeeeeeeeeeeeebeac06001600160a01b0316848281518110612d3a57612d3a6156a0565b60200260200101516001600160a01b031603612eaa5760405163a3d75e0960e01b81526001600160a01b0388811660048301525f917f00000000000000000000000000000000000000000000000000000000000000009091169063a3d75e0990602401602060405180830381865afa158015612db8573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612ddc9190615745565b90505f60a25f8a6001600160a01b03166001600160a01b031681526020019081526020015f205f878581518110612e1557612e156156a0565b60200260200101516001600160a01b03166001600160a01b031681526020019081526020015f206040518060200160405290815f820154815250509050612e89858481518110612e6757612e676156a0565b6020026020010151836001600160401b0316836136419092919063ffffffff16565b858481518110612e9b57612e9b6156a0565b60200260200101818152505050505b612f038688868481518110612ec157612ec16156a0565b60200260200101515f878681518110612edc57612edc6156a0565b6020026020010151878781518110612ef657612ef66156a0565b6020026020010151612fed565b600101612d01565b5f73beac0eeeeeeeeeeeeeeeeeeeeeeeeeeeeeebeabf196001600160a01b03841601612fdd5760405163a3d75e0960e01b81526001600160a01b0385811660048301525f917f00000000000000000000000000000000000000000000000000000000000000009091169063a3d75e0990602401602060405180830381865afa158015612f99573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612fbd9190615745565b9050612fd56001600160401b0384811690831661362d565b915050610c9c565b506001600160401b031692915050565b805f0361300d57604051630a33bc6960e21b815260040160405180910390fd5b811561312a576001600160a01b038086165f90815260a26020908152604080832093881683529290522061304381858585613f8e565b6040805160208101909152815481527f8be932bac54561f27260f95463d9b8ab37e06b2842e5ee2404157cc13df6eb8f908790879061308190613aa1565b604051613090939291906159f5565b60405180910390a16130a186610f4a565b15611aae576001600160a01b038088165f908152609860209081526040808320938916835292905290812080548592906130dc908490615774565b92505081905550866001600160a01b03167f1ec042c965e2edd7107b51188ee0f383e22e76179041ab3a9d18ff151405166c878786604051613120939291906159f5565b60405180910390a2505b505050505050565b604051631beb2b9760e31b81526001600160a01b0382811660048301523360248301523060448301525f80356001600160e01b0319166064840152917f00000000000000000000000000000000000000000000000000000000000000009091169063df595cb8906084016020604051808303815f875af11580156131b8573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906117e09190615a5b565b60605f6131e883614024565b6040805160208082528183019092529192505f91906020820181803683375050509182525060208101929092525090565b5f613227848385600161404b565b6118889085615a76565b6001600160a01b038085165f90815260a56020908152604080832093871683529290529081208190613262906140a6565b90505f6132c860016132947f000000000000000000000000000000000000000000000000000000000000000043615a89565b61329e9190615a89565b6001600160a01b03808a165f90815260a560209081526040808320938c16835292905220906140c0565b90505f6132d58284615a76565b90506132e28187876140dc565b98975050505050505050565b6001600160a01b038085165f90815260986020908152604080832093861683529290529081208054839290613324908490615a76565b92505081905550836001600160a01b03167f6909600037b75d7b4733aedd815442b5ec018a827751c832aaff64eba5d6d2dd848484604051611918939291906159f5565b5f6001600160a01b03821673beac0eeeeeeeeeeeeeeeeeeeeeeeeeeeeeebeac0146133b3577f00000000000000000000000000000000000000000000000000000000000000006117e0565b7f000000000000000000000000000000000000000000000000000000000000000092915050565b6133e2614940565b5f82815260a46020908152604091829020825160e08101845281546001600160a01b0390811682526001830154811682850152600283015416818501526003820154606082810191909152600483015463ffffffff1660808301526005830180548651818702810187019097528087529195929460a0860193929083018282801561349457602002820191905f5260205f20905b81546001600160a01b03168152600190910190602001808311613476575b50505050508152602001600682018054806020026020016040519081016040528092919081815260200182805480156134ea57602002820191905f5260205f20905b8154815260200190600101908083116134d6575b50505050508152505091508160a00151516001600160401b0381111561351257613512614ba2565b60405190808252806020026020018201604052801561353b578160200160208202803683370190505b5090505f7f0000000000000000000000000000000000000000000000000000000000000000836080015161356f9190615aa5565b90505f4363ffffffff168263ffffffff16106135a05761359b845f015185602001518660a00151612435565b6135b7565b6135b7845f015185602001518660a00151856140fa565b90505f5b8460a00151518110156112fb576136088560c0015182815181106135e1576135e16156a0565b60200260200101518383815181106135fb576135fb6156a0565b6020026020010151614228565b84828151811061361a5761361a6156a0565b60209081029190910101526001016135bb565b5f610c9c8383670de0b6b3a7640000614233565b5f6118888261365961365287613aa1565b869061362d565b9061362d565b60a0840151518214613684576040516343714afd60e01b815260040160405180910390fd5b83604001516001600160a01b0316336001600160a01b0316146136ba576040516316110d3560e21b815260040160405180910390fd5b5f6136c48561101b565b5f818152609e602052604090205490915060ff166136f5576040516387c9d21960e01b815260040160405180910390fd5b60605f7f000000000000000000000000000000000000000000000000000000000000000087608001516137289190615aa5565b90508063ffffffff164363ffffffff1611613756576040516378f67ae160e11b815260040160405180910390fd5b61376d875f015188602001518960a00151846140fa565b87516001600160a01b03165f90815260a360205260409020909250613793915083614318565b505f82815260a46020526040812080546001600160a01b031990811682556001820180548216905560028201805490911690556003810182905560048101805463ffffffff19169055906137ea6005830182614a35565b6137f7600683015f614a35565b50505f828152609e602052604090819020805460ff19169055517f1f40400889274ed07b24845e5054a87a0cab969eb1277aafe61ae352e7c32a00906138409084815260200190565b60405180910390a185516001600160a01b039081165f908152609a6020526040812054885160a08a0151919093169261387a918490612435565b90505f5b8860a0015151811015613a96575f6138a58a60a001518381518110611cff57611cff6156a0565b90505f6138db8b60c0015184815181106138c1576138c16156a0565b60200260200101518785815181106135fb576135fb6156a0565b9050805f036138eb575050613a8e565b87156139b957816001600160a01b0316632eae418c8c5f01518d60a00151868151811061391a5761391a6156a0565b60200260200101518d8d88818110613934576139346156a0565b90506020020160208101906139499190614ed1565b60405160e085901b6001600160e01b03191681526001600160a01b03938416600482015291831660248301529091166044820152606481018490526084015f604051808303815f87803b15801561399e575f5ffd5b505af11580156139b0573d5f5f3e3d5ffd5b50505050613a8b565b5f5f836001600160a01b03166350ff72258e5f01518f60a0015188815181106139e4576139e46156a0565b6020026020010151866040518463ffffffff1660e01b8152600401613a0b939291906159f5565b60408051808303815f875af1158015613a26573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190613a4a9190615ac1565b91509150613a88878e5f01518f60a001518881518110613a6c57613a6c6156a0565b602002602001015185858b8b81518110612ef657612ef66156a0565b50505b50505b60010161387e565b505050505050505050565b80515f9015613ab15781516117e0565b670de0b6b3a764000092915050565b60606001613acd816123ae565b6001600160a01b038084165f818152609a602052604080822080546001600160a01b0319811690915590519316928392917ffee30966a256b71e14bc0ebfc94315e28ef4a97a7131a9e2b7a310a73af4467691a35f5f613b2c866114ae565b9150915081515f03613b4057505050613cfa565b81516001600160401b03811115613b5957613b59614ba2565b604051908082528060200260200182016040528015613b82578160200160208202803683370190505b5094505f613b91878585612435565b90505f5b8351811015613cf4576040805160018082528183019092525f916020808301908036833750506040805160018082528183019092529293505f9291506020808301908036833750506040805160018082528183019092529293505f92915060208083019080368337019050509050868481518110613c1557613c156156a0565b6020026020010151835f81518110613c2f57613c2f6156a0565b60200260200101906001600160a01b031690816001600160a01b031681525050858481518110613c6157613c616156a0565b6020026020010151825f81518110613c7b57613c7b6156a0565b602002602001018181525050848481518110613c9957613c996156a0565b6020026020010151815f81518110613cb357613cb36156a0565b602002602001018181525050613ccc8b89858585612587565b8a8581518110613cde57613cde6156a0565b6020908102919091010152505050600101613b95565b50505050505b50919050565b6001600160a01b038084165f908152609960205260409020600101541680613d285750610df1565b6001600160a01b0381165f908152609c6020908152604080832085845290915290205460ff1615613d6c57604051630d4c4c9160e21b815260040160405180910390fd5b6001600160a01b0381165f908152609c602090815260408083208584528252909120805460ff1916600117905583015161200e908290613db390889088908490889061080f565b85516020870151614323565b60605f613deb7f00000000000000000000000000000000000000000000000000000000000000006131dc565b9050805f81518110613dff57613dff6156a0565b016020908101516040516001600160f81b03199091169181019190915260210160405160208183030381529060405291505090565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663eab66d7a6040518163ffffffff1660e01b8152600401602060405180830381865afa158015613e90573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190613eb49190615ae3565b6001600160a01b0316336001600160a01b0316146110195760405163794821ff60e01b815260040160405180910390fd5b60605f610c9c83614375565b5f610c9c613efe84613aa1565b839061362d565b6001600160a01b038084165f90815260a5602090815260408083209386168352929052908120613f34906140a6565b9050610df143613f448484615774565b6001600160a01b038088165f90815260a560209081526040808320938a1683529290522091906143ce565b5f610c9c83836143d9565b5f610c9c83670de0b6b3a764000084614233565b825f03613fba57604080516020810190915284548152613fb3908290612c1a90613aa1565b8455610df1565b6040805160208101909152845481525f90613fd6908584613641565b90505f613fe38483615774565b90505f613ffe84612c1a613ff7888a615774565b8590613f7a565b80885590505f819003611aae5760405163172cec7360e31b815260040160405180910390fd5b5f60ff8216601f8111156117e057604051632cd44ac360e21b815260040160405180910390fd5b5f5f614058868686614233565b9050600183600281111561406e5761406e615afe565b14801561408a57505f848061408557614085615b12565b868809115b1561409d5761409a600182615774565b90505b95945050505050565b5f6140b18282614425565b6001600160e01b031692915050565b5f6140cc83838361446a565b6001600160e01b03169392505050565b5f6118886140ea8385615b26565b85906001600160401b031661362d565b60605f83516001600160401b0381111561411657614116614ba2565b60405190808252806020026020018201604052801561413f578160200160208202803683370190505b5090505f7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166394d7d00c8787876040518463ffffffff1660e01b815260040161419393929190615b45565b5f60405180830381865afa1580156141ad573d5f5f3e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526141d49190810190615966565b90505f5b855181101561421c576141f788878381518110612530576125306156a0565b838281518110614209576142096156a0565b60209081029190910101526001016141d8565b50909695505050505050565b5f610c9c838361362d565b5f80805f19858709858702925082811083820303915050805f0361426a5783828161426057614260615b12565b0492505050610c9c565b8084116142b15760405162461bcd60e51b81526020600482015260156024820152744d6174683a206d756c446976206f766572666c6f7760581b6044820152606401612305565b5f8486880960026001871981018816978890046003810283188082028403028082028403028082028403028082028403028082028403029081029092039091025f889003889004909101858311909403939093029303949094049190911702949350505050565b5f610c9c83836144b3565b4281101561434457604051630819bdcd60e01b815260040160405180910390fd5b6143586001600160a01b0385168484614596565b610df157604051638baa579f60e01b815260040160405180910390fd5b6060815f018054806020026020016040519081016040528092919081815260200182805480156143c257602002820191905f5260205f20905b8154815260200190600101908083116143ae575b50505050509050919050565b610fd28383836145ea565b5f81815260018301602052604081205461441e57508154600181810184555f8481526020808220909301849055845484825282860190935260409020919091556117e0565b505f6117e0565b81545f9080156144625761444b8461443e600184615a76565b5f91825260209091200190565b5464010000000090046001600160e01b0316611888565b509092915050565b82545f908161447b868683856146f0565b905080156144a9576144928661443e600184615a76565b5464010000000090046001600160e01b031661088d565b5091949350505050565b5f818152600183016020526040812054801561458d575f6144d5600183615a76565b85549091505f906144e890600190615a76565b9050818114614547575f865f018281548110614506576145066156a0565b905f5260205f200154905080875f018481548110614526576145266156a0565b5f918252602080832090910192909255918252600188019052604090208390555b855486908061455857614558615b7e565b600190038181905f5260205f20015f90559055856001015f8681526020019081526020015f205f9055600193505050506117e0565b5f9150506117e0565b5f5f5f6145a38585614743565b90925090505f8160048111156145bb576145bb615afe565b1480156145d95750856001600160a01b0316826001600160a01b0316145b8061088d575061088d868686614782565b825480156146a2575f6146028561443e600185615a76565b60408051808201909152905463ffffffff8082168084526401000000009092046001600160e01b0316602084015291925090851610156146555760405163151b8e3f60e11b815260040160405180910390fd5b805163ffffffff8086169116036146a057826146768661443e600186615a76565b80546001600160e01b03929092166401000000000263ffffffff9092169190911790555050505050565b505b506040805180820190915263ffffffff92831681526001600160e01b03918216602080830191825285546001810187555f968752952091519051909216640100000000029190921617910155565b5f5b818310156119f4575f6147058484614869565b5f8781526020902090915063ffffffff86169082015463ffffffff16111561472f5780925061473d565b61473a816001615774565b93505b506146f2565b5f5f8251604103614777576020830151604084015160608501515f1a61476b87828585614883565b94509450505050611ead565b505f90506002611ead565b5f5f5f856001600160a01b0316631626ba7e60e01b86866040516024016147aa929190615b92565b60408051601f198184030181529181526020820180516001600160e01b03166001600160e01b03199094169390931790925290516147e89190615baa565b5f60405180830381855afa9150503d805f8114614820576040519150601f19603f3d011682016040523d82523d5f602084013e614825565b606091505b509150915081801561483957506020815110155b801561088d57508051630b135d3f60e11b9061485e90830160209081019084016158f2565b149695505050505050565b5f6148776002848418615bc0565b610c9c90848416615774565b5f807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a08311156148b857505f90506003614937565b604080515f8082526020820180845289905260ff881692820192909252606081018690526080810185905260019060a0016020604051602081039080840390855afa158015614909573d5f5f3e3d5ffd5b5050604051601f1901519150506001600160a01b038116614931575f60019250925050614937565b91505f90505b94509492505050565b6040518060e001604052805f6001600160a01b031681526020015f6001600160a01b031681526020015f6001600160a01b031681526020015f81526020015f63ffffffff16815260200160608152602001606081525090565b828054828255905f5260205f209081019282156149ec579160200282015b828111156149ec57825182546001600160a01b0319166001600160a01b039091161782556020909201916001909101906149b7565b506149f8929150614a4c565b5090565b828054828255905f5260205f209081019282156149ec579160200282015b828111156149ec578251825591602001919060010190614a1a565b5080545f8255905f5260205f20908101906123d991905b5b808211156149f8575f8155600101614a4d565b6001600160a01b03811681146123d9575f5ffd5b8035611fd881614a60565b5f5f5f5f5f60a08688031215614a93575f5ffd5b8535614a9e81614a60565b94506020860135614aae81614a60565b93506040860135614abe81614a60565b94979396509394606081013594506080013592915050565b5f5f83601f840112614ae6575f5ffd5b5081356001600160401b03811115614afc575f5ffd5b6020830191508360208260051b8501011115611ead575f5ffd5b5f5f60208385031215614b27575f5ffd5b82356001600160401b03811115614b3c575f5ffd5b614b4885828601614ad6565b90969095509350505050565b602080825282518282018190525f918401906040840190835b8181101561257c578351835260209384019390920191600101614b6d565b5f60208284031215614b9b575f5ffd5b5035919050565b634e487b7160e01b5f52604160045260245ffd5b60405160e081016001600160401b0381118282101715614bd857614bd8614ba2565b60405290565b604080519081016001600160401b0381118282101715614bd857614bd8614ba2565b604051601f8201601f191681016001600160401b0381118282101715614c2857614c28614ba2565b604052919050565b5f6001600160401b03821115614c4857614c48614ba2565b5060051b60200190565b5f82601f830112614c61575f5ffd5b8135614c74614c6f82614c30565b614c00565b8082825260208201915060208360051b860101925085831115614c95575f5ffd5b602085015b83811015614cbb578035614cad81614a60565b835260209283019201614c9a565b5095945050505050565b5f82601f830112614cd4575f5ffd5b8135614ce2614c6f82614c30565b8082825260208201915060208360051b860101925085831115614d03575f5ffd5b602085015b83811015614cbb578035835260209283019201614d08565b5f5f5f60608486031215614d32575f5ffd5b8335614d3d81614a60565b925060208401356001600160401b03811115614d57575f5ffd5b614d6386828701614c52565b92505060408401356001600160401b03811115614d7e575f5ffd5b614d8a86828701614cc5565b9150509250925092565b5f8151808452602084019350602083015f5b82811015614dc4578151865260209586019590910190600101614da6565b5093949350505050565b602081525f610c9c6020830184614d94565b803563ffffffff81168114611fd8575f5ffd5b5f5f83601f840112614e03575f5ffd5b5081356001600160401b03811115614e19575f5ffd5b602083019150836020828501011115611ead575f5ffd5b5f5f5f5f60608587031215614e43575f5ffd5b8435614e4e81614a60565b9350614e5c60208601614de0565b925060408501356001600160401b03811115614e76575f5ffd5b614e8287828801614df3565b95989497509550505050565b5f5f5f5f60808587031215614ea1575f5ffd5b8435614eac81614a60565b93506020850135614ebc81614a60565b93969395505050506040820135916060013590565b5f60208284031215614ee1575f5ffd5b8135610c9c81614a60565b5f5f60408385031215614efd575f5ffd5b8235614f0881614a60565b91506020830135614f1881614a60565b809150509250929050565b5f81518084528060208401602086015e5f602082860101526020601f19601f83011685010191505092915050565b602081525f610c9c6020830184614f23565b5f60e08284031215614f73575f5ffd5b614f7b614bb6565b9050614f8682614a74565b8152614f9460208301614a74565b6020820152614fa560408301614a74565b604082015260608281013590820152614fc060808301614de0565b608082015260a08201356001600160401b03811115614fdd575f5ffd5b614fe984828501614c52565b60a08301525060c08201356001600160401b03811115615007575f5ffd5b61501384828501614cc5565b60c08301525092915050565b5f6020828403121561502f575f5ffd5b81356001600160401b03811115615044575f5ffd5b61188884828501614f63565b5f60208284031215615060575f5ffd5b813560ff81168114610c9c575f5ffd5b6001600160401b03811681146123d9575f5ffd5b5f5f5f5f5f5f86880360e081121561509a575f5ffd5b87356150a581614a60565b96506040601f19820112156150b8575f5ffd5b506020870194506060870135935060808701356150d481614a60565b925060a08701356150e481615070565b915060c08701356150f481615070565b809150509295509295509295565b5f8151808452602084019350602083015f5b82811015614dc45781516001600160a01b0316865260209586019590910190600101615114565b80516001600160a01b03908116835260208083015182169084015260408083015190911690830152606080820151908301526080808201515f916151869085018263ffffffff169052565b5060a082015160e060a08501526151a060e0850182615102565b905060c083015184820360c086015261409d8282614d94565b604081525f6151cb604083018561513b565b828103602084015261409d8185614d94565b5f82825180855260208501945060208160051b830101602085015f5b8381101561421c57601f19858403018852615215838351614d94565b60209889019890935091909101906001016151f9565b5f604082016040835280855180835260608501915060608160051b8601019250602087015f5b8281101561528257605f1987860301845261526d85835161513b565b94506020938401939190910190600101615251565b50505050828103602084015261409d81856151dd565b5f5f5f606084860312156152aa575f5ffd5b83356152b581614a60565b92506020840135915060408401356152cc81615070565b809150509250925092565b604081525f6151cb6040830185615102565b5f5f5f604084860312156152fb575f5ffd5b833561530681614a60565b925060208401356001600160401b03811115615320575f5ffd5b61532c86828701614df3565b9497909650939450505050565b5f5f6040838503121561534a575f5ffd5b823561535581614a60565b915060208301356001600160401b0381111561536f575f5ffd5b61537b85828601614c52565b9150509250929050565b5f5f5f5f5f5f6060878903121561539a575f5ffd5b86356001600160401b038111156153af575f5ffd5b6153bb89828a01614ad6565b90975095505060208701356001600160401b038111156153d9575f5ffd5b6153e589828a01614ad6565b90955093505060408701356001600160401b03811115615403575f5ffd5b61540f89828a01614ad6565b979a9699509497509295939492505050565b602081525f610c9c602083018461513b565b5f5f5f60608486031215615445575f5ffd5b833561545081614a60565b925060208401356001600160401b0381111561546a575f5ffd5b84016040818703121561547b575f5ffd5b615483614bde565b81356001600160401b03811115615498575f5ffd5b8201601f810188136154a8575f5ffd5b80356001600160401b038111156154c1576154c1614ba2565b6154d4601f8201601f1916602001614c00565b8181528960208385010111156154e8575f5ffd5b816020840160208301375f60209282018301528352928301359282019290925293969395505050506040919091013590565b5f5f6040838503121561552b575f5ffd5b823561553681614a60565b946020939093013593505050565b604081525f6151cb6040830185614d94565b80151581146123d9575f5ffd5b5f5f5f5f60608587031215615576575f5ffd5b84356001600160401b0381111561558b575f5ffd5b850160e0818803121561559c575f5ffd5b935060208501356001600160401b038111156155b6575f5ffd5b6155c287828801614ad6565b90945092505060408501356155d681615556565b939692955090935050565b5f5f604083850312156155f2575f5ffd5b82356001600160401b03811115615607575f5ffd5b8301601f81018513615617575f5ffd5b8035615625614c6f82614c30565b8082825260208201915060208360051b850101925087831115615646575f5ffd5b6020840193505b8284101561567157833561566081614a60565b82526020938401939091019061564d565b945050505060208301356001600160401b0381111561536f575f5ffd5b602081525f610c9c60208301846151dd565b634e487b7160e01b5f52603260045260245ffd5b5f8235605e198336030181126156c8575f5ffd5b9190910192915050565b5f5f8335601e198436030181126156e7575f5ffd5b8301803591506001600160401b03821115615700575f5ffd5b6020019150600581901b3603821315611ead575f5ffd5b60208152816020820152818360408301375f818301604090810191909152601f909201601f19160101919050565b5f60208284031215615755575f5ffd5b8151610c9c81615070565b634e487b7160e01b5f52601160045260245ffd5b808201808211156117e0576117e0615760565b60a08101853561579681614a60565b6001600160a01b0316825263ffffffff6157b260208801614de0565b16602083015260408201949094526001600160a01b03929092166060830152608090910152919050565b5f82601f8301126157eb575f5ffd5b81516157f9614c6f82614c30565b8082825260208201915060208360051b86010192508583111561581a575f5ffd5b602085015b83811015614cbb57805183526020928301920161581f565b5f5f60408385031215615848575f5ffd5b82516001600160401b0381111561585d575f5ffd5b8301601f8101851361586d575f5ffd5b805161587b614c6f82614c30565b8082825260208201915060208360051b85010192508783111561589c575f5ffd5b6020840193505b828410156158c75783516158b681614a60565b8252602093840193909101906158a3565b8095505050505060208301516001600160401b038111156158e6575f5ffd5b61537b858286016157dc565b5f60208284031215615902575f5ffd5b5051919050565b5f823560de198336030181126156c8575f5ffd5b5f6117e03683614f63565b5f60208284031215615938575f5ffd5b8135610c9c81615556565b6001600160a01b03831681526040602082018190525f9061188890830184615102565b5f60208284031215615976575f5ffd5b81516001600160401b0381111561598b575f5ffd5b8201601f8101841361599b575f5ffd5b80516159a9614c6f82614c30565b8082825260208201915060208360051b8501019250868311156159ca575f5ffd5b6020840193505b8284101561088d5783516159e481615070565b8252602093840193909101906159d1565b6001600160a01b039384168152919092166020820152604081019190915260600190565b5f60018201615a2a57615a2a615760565b5060010190565b838152606060208201525f615a49606083018561513b565b828103604084015261088d8185614d94565b5f60208284031215615a6b575f5ffd5b8151610c9c81615556565b818103818111156117e0576117e0615760565b63ffffffff82811682821603908111156117e0576117e0615760565b63ffffffff81811683821601908111156117e0576117e0615760565b5f5f60408385031215615ad2575f5ffd5b505080516020909101519092909150565b5f60208284031215615af3575f5ffd5b8151610c9c81614a60565b634e487b7160e01b5f52602160045260245ffd5b634e487b7160e01b5f52601260045260245ffd5b6001600160401b0382811682821603908111156117e0576117e0615760565b6001600160a01b03841681526060602082018190525f90615b6890830185615102565b905063ffffffff83166040830152949350505050565b634e487b7160e01b5f52603160045260245ffd5b828152604060208201525f6118886040830184614f23565b5f82518060208501845e5f920191825250919050565b5f82615bda57634e487b7160e01b5f52601260045260245ffd5b50049056fea2646970667358221220cfab2ac68206c2bb7c3bde9ecb9d93609eac4e9fed888135fd6d461d388210b764736f6c634300081b0033",
}
⋮----
// 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\":\"function\",\"name\":\"version\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"string\",\"internalType\":\"string\"}],\"stateMutability\":\"view\"},{\"type\":\"event\",\"name\":\"DelegationApproverUpdated\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"newDelegationApprover\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"DepositScalingFactorUpdated\",\"inputs\":[{\"name\":\"staker\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"},{\"name\":\"strategy\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"contractIStrategy\"},{\"name\":\"newDepositScalingFactor\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"OperatorMetadataURIUpdated\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"metadataURI\",\"type\":\"string\",\"indexed\":false,\"internalType\":\"string\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"OperatorRegistered\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"delegationApprover\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"OperatorSharesDecreased\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"staker\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"},{\"name\":\"strategy\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"contractIStrategy\"},{\"name\":\"shares\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"OperatorSharesIncreased\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"staker\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"},{\"name\":\"strategy\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"contractIStrategy\"},{\"name\":\"shares\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"OperatorSharesSlashed\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"strategy\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"contractIStrategy\"},{\"name\":\"totalSlashedShares\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"SlashingWithdrawalCompleted\",\"inputs\":[{\"name\":\"withdrawalRoot\",\"type\":\"bytes32\",\"indexed\":false,\"internalType\":\"bytes32\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"SlashingWithdrawalQueued\",\"inputs\":[{\"name\":\"withdrawalRoot\",\"type\":\"bytes32\",\"indexed\":false,\"internalType\":\"bytes32\"},{\"name\":\"withdrawal\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structIDelegationManagerTypes.Withdrawal\",\"components\":[{\"name\":\"staker\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"delegatedTo\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"withdrawer\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"nonce\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"startBlock\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"strategies\",\"type\":\"address[]\",\"internalType\":\"contractIStrategy[]\"},{\"name\":\"scaledShares\",\"type\":\"uint256[]\",\"internalType\":\"uint256[]\"}]},{\"name\":\"sharesToWithdraw\",\"type\":\"uint256[]\",\"indexed\":false,\"internalType\":\"uint256[]\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"StakerDelegated\",\"inputs\":[{\"name\":\"staker\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"operator\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"StakerForceUndelegated\",\"inputs\":[{\"name\":\"staker\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"operator\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"StakerUndelegated\",\"inputs\":[{\"name\":\"staker\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"operator\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"error\",\"name\":\"ActivelyDelegated\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"CallerCannotUndelegate\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"FullySlashed\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InputArrayLengthMismatch\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InputArrayLengthZero\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidSignature\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"NotActivelyDelegated\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"OnlyAllocationManager\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"OnlyEigenPodManager\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"OnlyStrategyManagerOrEigenPodManager\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"OperatorNotRegistered\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"OperatorsCannotUndelegate\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"SaltSpent\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"SignatureExpired\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"WithdrawalDelayNotElapsed\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"WithdrawalNotQueued\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"WithdrawerNotCaller\",\"inputs\":[]}]",
}
⋮----
// DelegationManagerStorageABI is the input ABI used to generate the binding from.
// 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)
⋮----
// Version is a free data retrieval call binding the contract method 0x54fd4d50.
⋮----
// Solidity: function version() view returns(string)
func (_DelegationManagerStorage *DelegationManagerStorageCaller) Version(opts *bind.CallOpts) (string, error)
⋮----
// 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/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: "0x60c060405234801561000f575f5ffd5b5060405161231938038061231983398101604081905261002e9161016d565b6001600160a01b03821660805280806100468161005b565b60a0525061005490506100a1565b5050610297565b5f5f829050601f8151111561008e578260405163305a27a960e01b8152600401610085919061023c565b60405180910390fd5b805161009982610271565b179392505050565b5f54610100900460ff16156101085760405162461bcd60e51b815260206004820152602760248201527f496e697469616c697a61626c653a20636f6e747261637420697320696e697469604482015266616c697a696e6760c81b6064820152608401610085565b5f5460ff90811614610157575f805460ff191660ff9081179091556040519081527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b565b634e487b7160e01b5f52604160045260245ffd5b5f5f6040838503121561017e575f5ffd5b82516001600160a01b0381168114610194575f5ffd5b60208401519092506001600160401b038111156101af575f5ffd5b8301601f810185136101bf575f5ffd5b80516001600160401b038111156101d8576101d8610159565b604051601f8201601f19908116603f011681016001600160401b038111828210171561020657610206610159565b60405281815282820160200187101561021d575f5ffd5b8160208401602083015e5f602083830101528093505050509250929050565b602081525f82518060208401528060208501604085015e5f604082850101526040601f19601f83011684010191505092915050565b80516020808301519190811015610291575f198160200360031b1b821691505b50919050565b60805160a05161204c6102cd5f395f8181610342015261104601525f81816101ad015281816103760152610ee4015261204c5ff3fe608060405234801561000f575f5ffd5b5060043610610106575f3560e01c80637c85ac4c1161009e578063be86e0b21161006e578063be86e0b21461026e578063c0da24201461028f578063cd83a72b146102a2578063e49613fc146102c5578063f698da25146102e5575f5ffd5b80637c85ac4c146101fa5780637d1d1f5b1461021a57806380c7d3f31461023a578063848189201461025b575f5ffd5b80635ddb9b5b116100d95780635ddb9b5b1461016d5780636141879e1461019557806368d6e081146101a8578063702ca531146101e7575f5ffd5b8063184674341461010a57806323c2a3cb1461013057806354fd4d501461014357806356d482f514610158575b5f5ffd5b61011d61011836600461161c565b6102ed565b6040519081526020015b60405180910390f35b61011d61013e3660046116fc565b610308565b61014b61033b565b604051610127919061175c565b61016b6101663660046117cb565b61036b565b005b61018061017b36600461183d565b610582565b60405163ffffffff9091168152602001610127565b6101806101a336600461183d565b6105a8565b6101cf7f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b039091168152602001610127565b61014b6101f536600461161c565b6105ce565b61020d6102083660046116fc565b610665565b60405161012791906118ac565b61022d61022836600461190f565b6107c3565b6040516101279190611964565b61024d610248366004611986565b610986565b604051610127929190611a0a565b6101cf61026936600461183d565b6109a4565b61028161027c366004611a37565b6109cd565b604051610127929190611b1d565b61028161029d366004611b3f565b610a6d565b6102b56102b03660046116fc565b610b6f565b6040519015158152602001610127565b6102d86102d3366004611bb5565b610ba5565b6040516101279190611bf0565b61011d610c9e565b5f6102f883836105ce565b8051906020012090505b92915050565b5f5f61031384610d5e565b5f90815260046020908152604080832063ffffffff8716845290915290205491505092915050565b60606103667f0000000000000000000000000000000000000000000000000000000000000000610dc1565b905090565b336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146103b45760405163030c1b6b60e11b815260040160405180910390fd5b5f6103cc6103c73688900388018861183d565b610d5e565b5f8181526003602052604090205490915063ffffffff9081169086161161040657604051632f20889f60e01b815260040160405180910390fd5b5f81815260046020908152604080832063ffffffff8916845290915281208490555b8381101561048e5784848281811061044257610442611c02565b90506020028101906104549190611c16565b5f83815260056020908152604080832063ffffffff8b168452825280832085845290915290206104848282611c5f565b5050600101610428565b505f818152600360209081526040909120805463ffffffff191663ffffffff88161790556104be90830183611d62565b5f8281526001602090815260409182902080546001600160a01b0319166001600160a01b0394909416939093179092556104fd91908401908401611d7d565b5f828152600260209081526040808320805463ffffffff191663ffffffff958616179055600682528083209389168352929052819020805460ff19166001179055517f4f588da9ec57976194a79b5594f8f8782923d93013df2b9ed12fe125805011ef90610572908890889088908890611d96565b60405180910390a1505050505050565b5f5f61058d83610d5e565b5f9081526003602052604090205463ffffffff169392505050565b5f5f6105b383610d5e565b5f9081526002602052604090205463ffffffff169392505050565b604080517fda346acb3ce99e7c5132bf8cafb159ad8085970ebfdba78007ef0fe163063d1460208083019190915263ffffffff85168284015260608083018590528351808403820181526080909301909352815191012061062d610c9e565b60405161190160f01b602082015260228101919091526042810182905260620160405160208183030381529060405291505092915050565b60605f61067184610d5e565b5f81815260046020908152604080832063ffffffff8089168552925282205492935082166001600160401b038111156106ac576106ac611644565b6040519080825280602002602001820160405280156106f157816020015b604080518082019091525f8152606060208201528152602001906001900390816106ca5790505b5090505f5b8263ffffffff168110156107b9575f84815260056020908152604080832063ffffffff8a16845282528083208484528252918290208251808401845281546001600160a01b031681526001820180548551818602810186019096528086529194929385810193929083018282801561078b57602002820191905f5260205f20905b815481526020019060010190808311610777575b5050505050815250508282815181106107a6576107a6611c02565b60209081029190910101526001016106f6565b5095945050505050565b60605f6107d86103c73686900386018661183d565b5f81815260046020908152604080832063ffffffff881684529091529020549091508061081857604051631029081560e21b815260040160405180910390fd5b5f82815260056020908152604080832063ffffffff88168452825280832083805290915281206001015490816001600160401b0381111561085b5761085b611644565b604051908082528060200260200182016040528015610884578160200160208202803683370190505b5090505f5b8381101561097b575f85815260056020908152604080832063ffffffff8b16845282528083208484528252808320600101805482518185028101850190935280835291929091908301828280156108fd57602002820191905f5260205f20905b8154815260200190600101908083116108e9575b509394505f93505050505b81518110801561091757508481105b156109715781818151811061092e5761092e611c02565b602002602001015184828151811061094857610948611c02565b6020026020010181815161095c9190611ec9565b9052508061096981611edc565b915050610908565b5050600101610889565b509695505050505050565b6060805f5f6109958686610dfe565b909450925050505b9250929050565b5f5f6109af83610d5e565b5f908152600160205260409020546001600160a01b03169392505050565b5f60605f5f6109dc8787610dfe565b915091508451825114610a025760405163512509d360e11b815260040160405180910390fd5b5f5b8251811015610a5c57858181518110610a1f57610a1f611c02565b6020026020010151838281518110610a3957610a39611c02565b60200260200101511015610a5457505f93509150610a659050565b600101610a04565b50600193509150505b935093915050565b5f60605f5f610a7c8888610dfe565b90925090505f610a938961022860208b018b611d7d565b83519091508614610ab75760405163512509d360e11b815260040160405180910390fd5b5f5b8351811015610b5b575f612710898984818110610ad857610ad8611c02565b9050602002016020810190610aed9190611ef4565b61ffff16848481518110610b0357610b03611c02565b6020026020010151610b159190611c48565b610b1f9190611f29565b905080858381518110610b3457610b34611c02565b60200260200101511015610b52575f84965096505050505050610b66565b50600101610ab9565b506001945090925050505b94509492505050565b5f5f610b7a84610d5e565b5f90815260066020908152604080832063ffffffff8716845290915290205460ff1691505092915050565b604080518082019091525f8152606060208201525f610bc385610d5e565b5f81815260046020908152604080832063ffffffff891684529091529020549091508310610c0457604051634e23d03560e01b815260040160405180910390fd5b5f81815260056020908152604080832063ffffffff8816845282528083208684528252918290208251808401845281546001600160a01b0316815260018201805485518186028101860190965280865291949293858101939290830182828015610c8b57602002820191905f5260205f20905b815481526020019060010190808311610c77575b5050505050815250509150509392505050565b60408051808201909152600a81526922b4b3b2b72630bcb2b960b11b6020909101525f7f91ab3d17e3a50a9d89e63fd30b92be7f5336b03b287bb946787a83a9d62a27667f71b625cfad44bac63b13dba07f2e1d6084ee04b6f8752101ece6126d584ee6ea610d0b61103e565b8051602091820120604051610d43949392309101938452602084019290925260408301526001600160a01b0316606082015260800190565b60405160208183030381529060405280519060200120905090565b5f815f0151826020015163ffffffff16604051602001610da992919060609290921b6bffffffffffffffffffffffff1916825260a01b6001600160a01b031916601482015260200190565b60405160208183030381529060405261030290611f3c565b60605f610dcd836110b3565b6040805160208082528183019092529192505f91906020820181803683375050509182525060208101929092525090565b6060805f610e146103c73687900387018761183d565b5f8181526002602052604090205490915063ffffffff161580610e6a57505f8181526002602090815260409091205463ffffffff1690610e5690860186611d7d565b610e609190611f5f565b63ffffffff164211155b610e875760405163640fcd6b60e11b815260040160405180910390fd5b5f81815260066020908152604082209190610ea490870187611d7d565b63ffffffff16815260208101919091526040015f205460ff16610eda57604051630cad17b760e31b815260040160405180910390fd5b6001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000166364e1df84610f166020870187611d7d565b6040516001600160e01b031960e084901b16815263ffffffff919091166004820152602401602060405180830381865afa158015610f56573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610f7a9190611f7b565b610f9757604051631b14174b60e01b815260040160405180910390fd5b5f610fb2610fa86020870187611d7d565b86602001356102ed565b90505f610fff82610fc66040890189611f9a565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f920191909152506110da92505050565b90505f6110138861022860208a018a611d7d565b5190505f61102f8561102860208b018b611d7d565b85856112e1565b99929850919650505050505050565b60605f61106a7f0000000000000000000000000000000000000000000000000000000000000000610dc1565b9050805f8151811061107e5761107e611c02565b016020908101516040516001600160f81b03199091169181019190915260210160405160208183030381529060405291505090565b5f60ff8216601f81111561030257604051632cd44ac360e21b815260040160405180910390fd5b60605f82511180156110f75750604182516110f59190611fdc565b155b61111457604051634be6321b60e01b815260040160405180910390fd5b5f604183516111239190611f29565b9050806001600160401b0381111561113d5761113d611644565b604051908082528060200260200182016040528015611166578160200160208202803683370190505b5091505f5b818110156112d957604080516041808252608082019092525f916020820181803683370190505090505f5b60418110156112015785816111ac856041611c48565b6111b69190611ec9565b815181106111c6576111c6611c02565b602001015160f81c60f81b8282815181106111e3576111e3611c02565b60200101906001600160f81b03191690815f1a905350600101611196565b505f5f61120e888461150b565b90925090505f81600481111561122657611226611fef565b1461124457604051638baa579f60e01b815260040160405180910390fd5b831580611285575085611258600186612003565b8151811061126857611268611c02565b60200260200101516001600160a01b0316826001600160a01b0316115b6112a257604051630b550c5760e41b815260040160405180910390fd5b818685815181106112b5576112b5611c02565b6001600160a01b03929092166020928302919091019091015250505060010161116b565b505092915050565b5f84815260046020908152604080832063ffffffff87168452909152902054606090826001600160401b0381111561131b5761131b611644565b604051908082528060200260200182016040528015611344578160200160208202803683370190505b5091505f5b8451811015611501575f85828151811061136557611365611c02565b602002602001015190505f5f905061139860405180604001604052805f6001600160a01b03168152602001606081525090565b5f5b85811015611461575f8b815260056020908152604080832063ffffffff8e16845282528083208484528252918290208251808401845281546001600160a01b031681526001820180548551818602810186019096528086529194929385810193929083018282801561142957602002820191905f5260205f20905b815481526020019060010190808311611415575b5050505050815250509150836001600160a01b0316825f01516001600160a01b0316036114595760019250611461565b60010161139a565b50816114805760405163439cc0cd60e01b815260040160405180910390fd5b60208101515f5b81518110801561149657508881105b156114f0578181815181106114ad576114ad611c02565b60200260200101518882815181106114c7576114c7611c02565b602002602001018181516114db9190611ec9565b905250806114e881611edc565b915050611487565b505060019093019250611349915050565b5050949350505050565b5f5f825160410361153f576020830151604084015160608501515f1a6115338782858561154a565b9450945050505061099d565b505f9050600261099d565b5f807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a083111561157f57505f90506003610b66565b604080515f8082526020820180845289905260ff881692820192909252606081018690526080810185905260019060a0016020604051602081039080840390855afa1580156115d0573d5f5f3e3d5ffd5b5050604051601f1901519150506001600160a01b0381166115f8575f60019250925050610b66565b965f9650945050505050565b803563ffffffff81168114611617575f5ffd5b919050565b5f5f6040838503121561162d575f5ffd5b61163683611604565b946020939093013593505050565b634e487b7160e01b5f52604160045260245ffd5b604051601f8201601f191681016001600160401b038111828210171561168057611680611644565b604052919050565b6001600160a01b038116811461169c575f5ffd5b50565b5f604082840312156116af575f5ffd5b604080519081016001600160401b03811182821017156116d1576116d1611644565b60405290508082356116e281611688565b81526116f060208401611604565b60208201525092915050565b5f5f6060838503121561170d575f5ffd5b611717848461169f565b915061172560408401611604565b90509250929050565b5f81518084528060208401602086015e5f602082860101526020601f19601f83011685010191505092915050565b602081525f61176e602083018461172e565b9392505050565b5f60408284031215611785575f5ffd5b50919050565b5f5f83601f84011261179b575f5ffd5b5081356001600160401b038111156117b1575f5ffd5b6020830191508360208260051b850101111561099d575f5ffd5b5f5f5f5f5f60c086880312156117df575f5ffd5b6117e98787611775565b94506117f760408701611604565b935060608601356001600160401b03811115611811575f5ffd5b61181d8882890161178b565b909450925061183190508760808801611775565b90509295509295909350565b5f6040828403121561184d575f5ffd5b61176e838361169f565b80516001600160a01b03168252602080820151604082850181905281519085018190525f929190910190829060608601905b808310156107b95783518252602082019150602084019350600183019250611889565b5f602082016020835280845180835260408501915060408160051b8601019250602086015f5b8281101561190357603f198786030184526118ee858351611857565b945060209384019391909101906001016118d2565b50929695505050505050565b5f5f60608385031215611920575f5ffd5b6117178484611775565b5f8151808452602084019350602083015f5b8281101561195a57815186526020958601959091019060010161193c565b5093949350505050565b602081525f61176e602083018461192a565b5f60608284031215611785575f5ffd5b5f5f60608385031215611997575f5ffd5b6119a18484611775565b915060408301356001600160401b038111156119bb575f5ffd5b6119c785828601611976565b9150509250929050565b5f8151808452602084019350602083015f5b8281101561195a5781516001600160a01b03168652602095860195909101906001016119e3565b604081525f611a1c604083018561192a565b8281036020840152611a2e81856119d1565b95945050505050565b5f5f5f60808486031215611a49575f5ffd5b611a538585611775565b925060408401356001600160401b03811115611a6d575f5ffd5b611a7986828701611976565b92505060608401356001600160401b03811115611a94575f5ffd5b8401601f81018613611aa4575f5ffd5b80356001600160401b03811115611abd57611abd611644565b8060051b611acd60208201611658565b91825260208184018101929081019089841115611ae8575f5ffd5b6020850194505b83851015611b0e57843580835260209586019590935090910190611aef565b80955050505050509250925092565b8215158152604060208201525f611b3760408301846119d1565b949350505050565b5f5f5f5f60808587031215611b52575f5ffd5b611b5c8686611775565b935060408501356001600160401b03811115611b76575f5ffd5b611b8287828801611976565b93505060608501356001600160401b03811115611b9d575f5ffd5b611ba98782880161178b565b95989497509550505050565b5f5f5f60808486031215611bc7575f5ffd5b611bd1858561169f565b9250611bdf60408501611604565b929592945050506060919091013590565b602081525f61176e6020830184611857565b634e487b7160e01b5f52603260045260245ffd5b5f8235603e19833603018112611c2a575f5ffd5b9190910192915050565b634e487b7160e01b5f52601160045260245ffd5b808202811582820484141761030257610302611c34565b8135611c6a81611688565b81546001600160a01b0319166001600160a01b0391909116178155602082013536839003601e19018112611c9c575f5ffd5b820180356001600160401b03811115611cb3575f5ffd5b6020820191508060051b3603821315611cca575f5ffd5b600183016001600160401b03821115611ce557611ce5611644565b68010000000000000000821115611cfe57611cfe611644565b805482825580831015611d33575f828152602090208381019082015b80821015611d30575f8255600182019150611d1a565b50505b505f90815260208120905b82811015611d5a57833582820155602090930192600101611d3e565b505050505050565b5f60208284031215611d72575f5ffd5b813561176e81611688565b5f60208284031215611d8d575f5ffd5b61176e82611604565b5f608082018635611da681611688565b6001600160a01b0316835263ffffffff611dc260208901611604565b16602084015263ffffffff861660408401526080606084015283905260a0600584901b83018101908301855f603e1936839003015b87821015611eba57868503609f190184528235818112611e15575f5ffd5b89018035611e2281611688565b6001600160a01b03168652602081013536829003601e19018112611e44575f5ffd5b016020810190356001600160401b03811115611e5e575f5ffd5b8060051b803603831315611e70575f5ffd5b60406020890181905288018290526001600160fb1b03821115611e91575f5ffd5b808360608a01376060818901019750505050602083019250602084019350600182019150611df7565b50929998505050505050505050565b8082018082111561030257610302611c34565b5f60018201611eed57611eed611c34565b5060010190565b5f60208284031215611f04575f5ffd5b813561ffff8116811461176e575f5ffd5b634e487b7160e01b5f52601260045260245ffd5b5f82611f3757611f37611f15565b500490565b80516020808301519190811015611785575f1960209190910360031b1b16919050565b63ffffffff818116838216019081111561030257610302611c34565b5f60208284031215611f8b575f5ffd5b8151801515811461176e575f5ffd5b5f5f8335601e19843603018112611faf575f5ffd5b8301803591506001600160401b03821115611fc8575f5ffd5b60200191503681900382131561099d575f5ffd5b5f82611fea57611fea611f15565b500690565b634e487b7160e01b5f52602160045260245ffd5b8181038181111561030257610302611c3456fea2646970667358221220b463450b5f76e4b7a50ae3c7af542a84d37475543ab0a4b17fdfb90e74a3535e64736f6c634300081b0033",
}
⋮----
// 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: "0x60c060405234801561000f575f5ffd5b5060405161379b38038061379b83398101604081905261002e9161016a565b8061003881610058565b608052506001600160a01b03821660a05261005161009e565b5050610294565b5f5f829050601f8151111561008b578260405163305a27a960e01b81526004016100829190610239565b60405180910390fd5b80516100968261026e565b179392505050565b5f54610100900460ff16156101055760405162461bcd60e51b815260206004820152602760248201527f496e697469616c697a61626c653a20636f6e747261637420697320696e697469604482015266616c697a696e6760c81b6064820152608401610082565b5f5460ff90811614610154575f805460ff191660ff9081179091556040519081527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b565b634e487b7160e01b5f52604160045260245ffd5b5f5f6040838503121561017b575f5ffd5b82516001600160a01b0381168114610191575f5ffd5b60208401519092506001600160401b038111156101ac575f5ffd5b8301601f810185136101bc575f5ffd5b80516001600160401b038111156101d5576101d5610156565b604051601f8201601f19908116603f011681016001600160401b038111828210171561020357610203610156565b60405281815282820160200187101561021a575f5ffd5b8160208401602083015e5f602083830101528093505050509250929050565b602081525f82518060208401528060208501604085015e5f604082850101526040601f19601f83011684010191505092915050565b8051602080830151919081101561028e575f198160200360031b1b821691505b50919050565b60805160a0516134d16102ca5f395f818161034c01528181610852015281816114dd01526115fb01525f610a1401526134d15ff3fe608060405234801561000f575f5ffd5b5060043610610260575f3560e01c80637ecebe001161014b578063a9059cbb116100bf578063dd62ed3e11610084578063dd62ed3e146105cc578063de0e9a3e146105df578063ea598cb0146105f2578063eb415f4514610605578063f1127ed81461060d578063f2fde38b1461064a575f5ffd5b8063a9059cbb1461056d578063aad41a4114610580578063b8c2559414610593578063c3cda520146105a6578063d505accf146105b9575f5ffd5b806391ddadf41161011057806391ddadf41461050357806395d89b41146105225780639ab24eb01461052a5780639aec4bae1461053d578063a457c2d714610547578063a7d1195d1461055a575f5ffd5b80637ecebe001461049157806381b97161146104a457806384b0196e146104c45780638da5cb5b146104df5780638e539e8c146104f0575f5ffd5b80633a46b1a8116101e2578063587cde1e116101a7578063587cde1e146103d85780635c19a95c146104035780636fcfff451461041657806370a082311461043e578063715018a61461046657806378aa33ba1461046e575f5ffd5b80633a46b1a8146103345780633f4da4c6146103475780634bf5d7e91461038657806353957125146103b057806354fd4d50146103d0575f5ffd5b80631ffacdef116102285780631ffacdef146102e457806323b872dd146102f7578063313ce5671461030a5780633644e515146103195780633950935114610321575f5ffd5b80630455e6941461026457806306fdde031461029c578063095ea7b3146102b15780631249c58b146102c457806318160ddd146102ce575b5f5ffd5b610287610272366004612d08565b6101336020525f908152604090205460ff1681565b60405190151581526020015b60405180910390f35b6102a461065d565b6040516102939190612d4f565b6102876102bf366004612d61565b6106ed565b6102cc610706565b005b6102d661084f565b604051908152602001610293565b6102cc6102f2366004612d96565b6108d5565b610287610305366004612dcb565b61093d565b60405160128152602001610293565b6102d6610960565b61028761032f366004612d61565b610969565b6102d6610342366004612d61565b61098a565b61036e7f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b039091168152602001610293565b60408051808201909152600e81526d06d6f64653d74696d657374616d760941b60208201526102a4565b6102d66103be366004612d08565b6101306020525f908152604090205481565b6102a4610a0d565b61036e6103e6366004612d08565b6001600160a01b039081165f90815260fe60205260409020541690565b6102cc610411366004612d08565b610a38565b610429610424366004612d08565b610a45565b60405163ffffffff9091168152602001610293565b6102d661044c366004612d08565b6001600160a01b03165f9081526065602052604090205490565b6102cc610a66565b61028761047c366004612d08565b6101346020525f908152604090205460ff1681565b6102d661049f366004612d08565b610a79565b6102d66104b2366004612d08565b6101316020525f908152604090205481565b6104cc610a96565b6040516102939796959493929190612e05565b6033546001600160a01b031661036e565b6102d66104fe366004612e9b565b610b2f565b61050b610b96565b60405165ffffffffffff9091168152602001610293565b6102a4610ba0565b6102d6610538366004612d08565b610baf565b6102d66101325481565b610287610555366004612d61565b610c2c565b6102cc610568366004612f7a565b610ca6565b61028761057b366004612d61565b6110ba565b6102cc61058e3660046130bf565b6110c7565b6102cc6105a1366004612d96565b611197565b6102cc6105b436600461313b565b6111f7565b6102cc6105c736600461318f565b61132c565b6102d66105da3660046131f5565b61148d565b6102cc6105ed366004612e9b565b6114b7565b6102cc610600366004612e9b565b6115d9565b6102cc611700565b61062061061b366004613226565b6117c7565b60408051825163ffffffff1681526020928301516001600160e01b03169281019290925201610293565b6102cc610658366004612d08565b611848565b60606068805461066c90613258565b80601f016020809104026020016040519081016040528092919081815260200182805461069890613258565b80156106e35780601f106106ba576101008083540402835291602001916106e3565b820191905f5260205f20905b8154815290600101906020018083116106c657829003601f168201915b5050505050905090565b5f336106fa8185856118be565b60019150505b92915050565b335f908152610131602052604090205461077f5760405162461bcd60e51b815260206004820152602f60248201527f456967656e2e6d696e743a206d73672e73656e64657220686173206e6f206d6960448201526e6e74696e6720616c6c6f77616e636560881b60648201526084015b60405180910390fd5b335f908152610130602052604090205442116107f75760405162461bcd60e51b815260206004820152603160248201527f456967656e2e6d696e743a206d73672e73656e646572206973206e6f7420616c6044820152701b1bddd959081d1bc81b5a5b9d081e595d607a1b6064820152608401610776565b335f8181526101316020526040812080549190559061081690826119e1565b60405181815233907f0f6798a560793a54c3bcfe86a93cde1e73087d944c0ea20544137d4121396885906020015b60405180910390a250565b5f7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166318160ddd6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156108ac573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906108d0919061328a565b905090565b6108dd611a77565b6001600160a01b0382165f8181526101336020908152604091829020805460ff191685151590811790915591519182527fcf20b1ecb604b0e8888d579c64e8a3b10e590d45c1c2dddb393bed284362227191015b60405180910390a25050565b5f3361094a858285611ad1565b610955858585611b43565b506001949350505050565b5f6108d0611cfd565b5f336106fa81858561097b838361148d565b61098591906132b5565b6118be565b5f610993610b96565b65ffffffffffff1682106109e55760405162461bcd60e51b815260206004820152601960248201527804552433230566f7465733a20667574757265206c6f6f6b757603c1b6044820152606401610776565b6001600160a01b0383165f90815260ff60205260409020610a069083611d06565b9392505050565b60606108d07f0000000000000000000000000000000000000000000000000000000000000000611de7565b610a423382611e24565b50565b6001600160a01b0381165f90815260ff602052604081205461070090611e9d565b610a6e611a77565b610a775f611f05565b565b6001600160a01b0381165f90815260cb6020526040812054610700565b5f6060805f5f5f60606097545f5f1b148015610ab25750609854155b610af65760405162461bcd60e51b81526020600482015260156024820152741152540dcc4c8e88155b9a5b9a5d1a585b1a5e9959605a1b6044820152606401610776565b610afe611f56565b610b06611f65565b604080515f80825260208201909252600f60f81b9b939a50919850469750309650945092509050565b5f610b38610b96565b65ffffffffffff168210610b8a5760405162461bcd60e51b815260206004820152601960248201527804552433230566f7465733a20667574757265206c6f6f6b757603c1b6044820152606401610776565b61070061010083611d06565b5f6108d042611f74565b60606069805461066c90613258565b6001600160a01b0381165f90815260ff60205260408120548015610c1a576001600160a01b0383165f90815260ff6020526040902080545f198301908110610bf957610bf96132c8565b5f9182526020909120015464010000000090046001600160e01b0316610c1c565b5f5b6001600160e01b03169392505050565b5f3381610c39828661148d565b905083811015610c995760405162461bcd60e51b815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f77604482015264207a65726f60d81b6064820152608401610776565b61095582868684036118be565b5f54610100900460ff1615808015610cc457505f54600160ff909116105b80610cdd5750303b158015610cdd57505f5460ff166001145b610d405760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b6064820152608401610776565b5f805460ff191660011790558015610d61575f805461ff0019166101001790555b610d69611fda565b610dad6040518060400160405280600581526020016422b4b3b2b760d91b8152506040518060400160405280600581526020016422a4a3a2a760d91b815250612008565b610db685611f05565b610ddc6040518060400160405280600581526020016422a4a3a2a760d91b81525061203c565b8251845114610e635760405162461bcd60e51b815260206004820152604760248201527f456967656e2e696e697469616c697a653a206d696e7465727320616e64206d6960448201527f6e74696e67416c6c6f77616e636573206d757374206265207468652073616d65606482015266040d8cadccee8d60cb1b608482015260a401610776565b8151845114610eea5760405162461bcd60e51b815260206004820152604760248201527f456967656e2e696e697469616c697a653a206d696e7465727320616e64206d6960448201527f6e74416c6c6f776564416674657273206d757374206265207468652073616d65606482015266040d8cadccee8d60cb1b608482015260a401610776565b5f5b845181101561106757838181518110610f0757610f076132c8565b60200260200101516101315f878481518110610f2557610f256132c8565b60200260200101516001600160a01b03166001600160a01b031681526020019081526020015f2081905550828181518110610f6257610f626132c8565b60200260200101516101305f878481518110610f8057610f806132c8565b60200260200101516001600160a01b03166001600160a01b031681526020019081526020015f208190555060016101335f878481518110610fc357610fc36132c8565b60200260200101516001600160a01b03166001600160a01b031681526020019081526020015f205f6101000a81548160ff021916908315150217905550848181518110611012576110126132c8565b60200260200101516001600160a01b03167fcf20b1ecb604b0e8888d579c64e8a3b10e590d45c1c2dddb393bed28436222716001604051611057911515815260200190565b60405180910390a2600101610eec565b505f196101325580156110b3575f805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b5050505050565b5f336106fa818585611b43565b82811461113c5760405162461bcd60e51b815260206004820152603e60248201527f456967656e2e6d756c746973656e643a2072656365697665727320616e64206160448201527f6d6f756e7473206d757374206265207468652073616d65206c656e67746800006064820152608401610776565b5f5b838110156110b35761118f3386868481811061115c5761115c6132c8565b90506020020160208101906111719190612d08565b858585818110611183576111836132c8565b90506020020135611b43565b60010161113e565b61119f611a77565b6001600160a01b0382165f8181526101346020908152604091829020805460ff191685151590811790915591519182527f72a561d1af7409467dae4f1e9fc52590a9335a1dda17727e2b6aa8c4db35109b9101610931565b834211156112475760405162461bcd60e51b815260206004820152601d60248201527f4552433230566f7465733a207369676e617475726520657870697265640000006044820152606401610776565b604080517fe48329057bfd03d55e49b547132e39cffd9c1820ad7b9d4c5307691425d15adf60208201526001600160a01b0388169181019190915260608101869052608081018590525f906112c0906112b89060a00160405160208183030381529060405280519060200120612085565b8585856120b1565b90506112cb816120d7565b86146113195760405162461bcd60e51b815260206004820152601960248201527f4552433230566f7465733a20696e76616c6964206e6f6e6365000000000000006044820152606401610776565b6113238188611e24565b50505050505050565b8342111561137c5760405162461bcd60e51b815260206004820152601d60248201527f45524332305065726d69743a206578706972656420646561646c696e650000006044820152606401610776565b5f7f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c98888886113aa8c6120d7565b6040805160208101969096526001600160a01b0394851690860152929091166060840152608083015260a082015260c0810186905260e0016040516020818303038152906040528051906020012090505f61140482612085565b90505f611413828787876120b1565b9050896001600160a01b0316816001600160a01b0316146114765760405162461bcd60e51b815260206004820152601e60248201527f45524332305065726d69743a20696e76616c6964207369676e617475726500006044820152606401610776565b6114818a8a8a6118be565b50505050505050505050565b6001600160a01b039182165f90815260666020908152604080832093909416825291909152205490565b6114c133826120fe565b60405163a9059cbb60e01b8152336004820152602481018290527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03169063a9059cbb906044016020604051808303815f875af115801561152b573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061154f91906132dc565b6115a75760405162461bcd60e51b8152602060048201526024808201527f456967656e2e756e777261703a2062454947454e207472616e736665722066616044820152631a5b195960e21b6064820152608401610776565b60405181815233907f7f8146ca1ae17ad17561461ef221d97c8160bfddcae0edb68f53ce8dc5ce4af390602001610844565b6040516323b872dd60e01b8152336004820152306024820152604481018290527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906323b872dd906064016020604051808303815f875af1158015611649573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061166d91906132dc565b6116c45760405162461bcd60e51b815260206004820152602260248201527f456967656e2e777261703a2062454947454e207472616e73666572206661696c604482015261195960f21b6064820152608401610776565b6116ce33826119e1565b60405181815233907f2273a99739c31a37346636a3013c2cedebee7cd5b4c560faded39d298c1dd45c90602001610844565b611708611a77565b5f1961013254146117975760405162461bcd60e51b815260206004820152604d60248201527f456967656e2e64697361626c655472616e736665725265737472696374696f6e60448201527f733a207472616e73666572207265737472696374696f6e732061726520616c7260648201526c1958591e48191a5cd8589b1959609a1b608482015260a401610776565b5f6101328190556040517f2b18986d3ba809db2f13a5d7bf17f60d357b37d9cbb55dd71cbbac8dc4060f649190a1565b604080518082019091525f80825260208201526001600160a01b0383165f90815260ff60205260409020805463ffffffff8416908110611809576118096132c8565b5f9182526020918290206040805180820190915291015463ffffffff8116825264010000000090046001600160e01b0316918101919091529392505050565b611850611a77565b6001600160a01b0381166118b55760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610776565b610a4281611f05565b6001600160a01b0383166119205760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b6064820152608401610776565b6001600160a01b0382166119815760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b6064820152608401610776565b6001600160a01b038381165f8181526066602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b6119eb8282612117565b6001600160e01b036119fb61084f565b1115611a625760405162461bcd60e51b815260206004820152603060248201527f4552433230566f7465733a20746f74616c20737570706c79207269736b73206f60448201526f766572666c6f77696e6720766f74657360801b6064820152608401610776565b611a716101006121e8836121f3565b50505050565b6033546001600160a01b03163314610a775760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610776565b5f611adc848461148d565b90505f198114611a715781811015611b365760405162461bcd60e51b815260206004820152601d60248201527f45524332303a20696e73756666696369656e7420616c6c6f77616e63650000006044820152606401610776565b611a7184848484036118be565b6001600160a01b038316611ba75760405162461bcd60e51b815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604482015264647265737360d81b6064820152608401610776565b6001600160a01b038216611c095760405162461bcd60e51b815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201526265737360e81b6064820152608401610776565b611c1483838361235f565b6001600160a01b0383165f9081526065602052604090205481811015611c8b5760405162461bcd60e51b815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e7420657863656564732062604482015265616c616e636560d01b6064820152608401610776565b6001600160a01b038085165f8181526065602052604080822086860390559286168082529083902080548601905591517fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef90611cea9086815260200190565b60405180910390a3611a71848484612443565b5f6108d0612474565b81545f9081816005811115611d5d575f611d1f846124e7565b611d2990856132f7565b5f88815260209020909150869082015463ffffffff161115611d4d57809150611d5b565b611d588160016132b5565b92505b505b80821015611da8575f611d7083836125cb565b5f88815260209020909150869082015463ffffffff161115611d9457809150611da2565b611d9f8160016132b5565b92505b50611d5d565b8015611dd2575f8681526020902081015f19015464010000000090046001600160e01b0316611dd4565b5f5b6001600160e01b03169695505050505050565b60605f611df3836125e5565b6040805160208082528183019092529192505f91906020820181803683375050509182525060208101929092525090565b6001600160a01b038281165f81815260fe6020818152604080842080546065845282862054949093528787166001600160a01b03198416811790915590519190951694919391928592917f3134e8a2e6d97e929a7e54011ea5485d7d196dd5f0ba4d4ef95803e8e3fc257f9190a4611a7182848361260c565b5f63ffffffff821115611f015760405162461bcd60e51b815260206004820152602660248201527f53616665436173743a2076616c756520646f65736e27742066697420696e203360448201526532206269747360d01b6064820152608401610776565b5090565b603380546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a35050565b60606099805461066c90613258565b6060609a805461066c90613258565b5f65ffffffffffff821115611f015760405162461bcd60e51b815260206004820152602660248201527f53616665436173743a2076616c756520646f65736e27742066697420696e203460448201526538206269747360d01b6064820152608401610776565b5f54610100900460ff166120005760405162461bcd60e51b81526004016107769061330a565b610a77612746565b5f54610100900460ff1661202e5760405162461bcd60e51b81526004016107769061330a565b6120388282612775565b5050565b5f54610100900460ff166120625760405162461bcd60e51b81526004016107769061330a565b610a4281604051806040016040528060018152602001603160f81b8152506127b4565b5f610700612091611cfd565b8360405161190160f01b8152600281019290925260228201526042902090565b5f5f5f6120c087878787612801565b915091506120cd816128be565b5095945050505050565b6001600160a01b0381165f90815260cb602052604090208054600181018255905b50919050565b6121088282612a07565b611a71610100612b4a836121f3565b6001600160a01b03821661216d5760405162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f2061646472657373006044820152606401610776565b6121785f838361235f565b8060675f82825461218991906132b5565b90915550506001600160a01b0382165f818152606560209081526040808320805486019055518481527fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a36120385f8383612443565b5f610a0682846132b5565b82545f90819081811561223d575f8781526020902082015f190160408051808201909152905463ffffffff8116825264010000000090046001600160e01b03166020820152612251565b604080518082019091525f80825260208201525b905080602001516001600160e01b0316935061227184868863ffffffff16565b92505f821180156122995750612285610b96565b65ffffffffffff16815f015163ffffffff16145b156122dc576122a783612b55565b5f8881526020902083015f190180546001600160e01b03929092166401000000000263ffffffff909216919091179055612355565b8660405180604001604052806123006122f3610b96565b65ffffffffffff16611e9d565b63ffffffff16815260200161231486612b55565b6001600160e01b0390811690915282546001810184555f938452602093849020835194909301519091166401000000000263ffffffff909316929092179101555b5050935093915050565b61013254421161243e576001600160a01b038316158061238657506001600160a01b038216155b806123a957506001600160a01b0383165f908152610133602052604090205460ff165b806123cc57506001600160a01b0382165f908152610134602052604090205460ff165b61243e5760405162461bcd60e51b815260206004820152603a60248201527f456967656e2e5f6265666f7265546f6b656e5472616e736665723a2066726f6d60448201527f206f7220746f206d7573742062652077686974656c69737465640000000000006064820152608401610776565b505050565b6001600160a01b038381165f90815260fe602052604080822054858416835291205461243e9291821691168361260c565b5f7f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f61249e612bbd565b6124a6612c15565b60408051602081019490945283019190915260608201524660808201523060a082015260c00160405160208183030381529060405280519060200120905090565b5f815f036124f657505f919050565b5f600161250284612c45565b901c6001901b9050600181848161251b5761251b613355565b048201901c9050600181848161253357612533613355565b048201901c9050600181848161254b5761254b613355565b048201901c9050600181848161256357612563613355565b048201901c9050600181848161257b5761257b613355565b048201901c9050600181848161259357612593613355565b048201901c905060018184816125ab576125ab613355565b048201901c9050610a06818285816125c5576125c5613355565b04612cd8565b5f6125d96002848418613369565b610a06908484166132b5565b5f60ff8216601f81111561070057604051632cd44ac360e21b815260040160405180910390fd5b816001600160a01b0316836001600160a01b03161415801561262d57505f81115b1561243e576001600160a01b038316156126ba576001600160a01b0383165f90815260ff60205260408120819061266790612b4a856121f3565b91509150846001600160a01b03167fdec2bacdd2f05b59de34da9b523dff8be42e5e38e818c82fdb0bae774387a72483836040516126af929190918252602082015260400190565b60405180910390a250505b6001600160a01b0382161561243e576001600160a01b0382165f90815260ff6020526040812081906126ef906121e8856121f3565b91509150836001600160a01b03167fdec2bacdd2f05b59de34da9b523dff8be42e5e38e818c82fdb0bae774387a7248383604051612737929190918252602082015260400190565b60405180910390a25050505050565b5f54610100900460ff1661276c5760405162461bcd60e51b81526004016107769061330a565b610a7733611f05565b5f54610100900460ff1661279b5760405162461bcd60e51b81526004016107769061330a565b60686127a783826133cc565b50606961243e82826133cc565b5f54610100900460ff166127da5760405162461bcd60e51b81526004016107769061330a565b60996127e683826133cc565b50609a6127f382826133cc565b50505f609781905560985550565b5f807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a083111561283657505f905060036128b5565b604080515f8082526020820180845289905260ff881692820192909252606081018690526080810185905260019060a0016020604051602081039080840390855afa158015612887573d5f5f3e3d5ffd5b5050604051601f1901519150506001600160a01b0381166128af575f600192509250506128b5565b91505f90505b94509492505050565b5f8160048111156128d1576128d1613487565b036128d95750565b60018160048111156128ed576128ed613487565b0361293a5760405162461bcd60e51b815260206004820152601860248201527f45434453413a20696e76616c6964207369676e617475726500000000000000006044820152606401610776565b600281600481111561294e5761294e613487565b0361299b5760405162461bcd60e51b815260206004820152601f60248201527f45434453413a20696e76616c6964207369676e6174757265206c656e677468006044820152606401610776565b60038160048111156129af576129af613487565b03610a425760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202773272076616c604482015261756560f01b6064820152608401610776565b6001600160a01b038216612a675760405162461bcd60e51b815260206004820152602160248201527f45524332303a206275726e2066726f6d20746865207a65726f206164647265736044820152607360f81b6064820152608401610776565b612a72825f8361235f565b6001600160a01b0382165f9081526065602052604090205481811015612ae55760405162461bcd60e51b815260206004820152602260248201527f45524332303a206275726e20616d6f756e7420657863656564732062616c616e604482015261636560f01b6064820152608401610776565b6001600160a01b0383165f8181526065602090815260408083208686039055606780548790039055518581529192917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a361243e835f84612443565b5f610a0682846132f7565b5f6001600160e01b03821115611f015760405162461bcd60e51b815260206004820152602760248201527f53616665436173743a2076616c756520646f65736e27742066697420696e20326044820152663234206269747360c81b6064820152608401610776565b5f5f612bc7611f56565b805190915015612bde578051602090910120919050565b6097548015612bed5792915050565b7fc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a4709250505090565b5f5f612c1f611f65565b805190915015612c36578051602090910120919050565b6098548015612bed5792915050565b5f80608083901c15612c5957608092831c92015b604083901c15612c6b57604092831c92015b602083901c15612c7d57602092831c92015b601083901c15612c8f57601092831c92015b600883901c15612ca157600892831c92015b600483901c15612cb357600492831c92015b600283901c15612cc557600292831c92015b600183901c156107005760010192915050565b5f818310612ce65781610a06565b5090919050565b80356001600160a01b0381168114612d03575f5ffd5b919050565b5f60208284031215612d18575f5ffd5b610a0682612ced565b5f81518084528060208401602086015e5f602082860101526020601f19601f83011685010191505092915050565b602081525f610a066020830184612d21565b5f5f60408385031215612d72575f5ffd5b612d7b83612ced565b946020939093013593505050565b8015158114610a42575f5ffd5b5f5f60408385031215612da7575f5ffd5b612db083612ced565b91506020830135612dc081612d89565b809150509250929050565b5f5f5f60608486031215612ddd575f5ffd5b612de684612ced565b9250612df460208501612ced565b929592945050506040919091013590565b60ff60f81b8816815260e060208201525f612e2360e0830189612d21565b8281036040840152612e358189612d21565b606084018890526001600160a01b038716608085015260a0840186905283810360c0850152845180825260208087019350909101905f5b81811015612e8a578351835260209384019390920191600101612e6c565b50909b9a5050505050505050505050565b5f60208284031215612eab575f5ffd5b5035919050565b634e487b7160e01b5f52604160045260245ffd5b604051601f8201601f1916810167ffffffffffffffff81118282101715612eef57612eef612eb2565b604052919050565b5f67ffffffffffffffff821115612f1057612f10612eb2565b5060051b60200190565b5f82601f830112612f29575f5ffd5b8135612f3c612f3782612ef7565b612ec6565b8082825260208201915060208360051b860101925085831115612f5d575f5ffd5b602085015b838110156120cd578035835260209283019201612f62565b5f5f5f5f60808587031215612f8d575f5ffd5b612f9685612ced565b9350602085013567ffffffffffffffff811115612fb1575f5ffd5b8501601f81018713612fc1575f5ffd5b8035612fcf612f3782612ef7565b8082825260208201915060208360051b850101925089831115612ff0575f5ffd5b6020840193505b828410156130195761300884612ced565b825260209384019390910190612ff7565b9550505050604085013567ffffffffffffffff811115613037575f5ffd5b61304387828801612f1a565b925050606085013567ffffffffffffffff81111561305f575f5ffd5b61306b87828801612f1a565b91505092959194509250565b5f5f83601f840112613087575f5ffd5b50813567ffffffffffffffff81111561309e575f5ffd5b6020830191508360208260051b85010111156130b8575f5ffd5b9250929050565b5f5f5f5f604085870312156130d2575f5ffd5b843567ffffffffffffffff8111156130e8575f5ffd5b6130f487828801613077565b909550935050602085013567ffffffffffffffff811115613113575f5ffd5b61311f87828801613077565b95989497509550505050565b803560ff81168114612d03575f5ffd5b5f5f5f5f5f5f60c08789031215613150575f5ffd5b61315987612ced565b955060208701359450604087013593506131756060880161312b565b9598949750929560808101359460a0909101359350915050565b5f5f5f5f5f5f5f60e0888a0312156131a5575f5ffd5b6131ae88612ced565b96506131bc60208901612ced565b955060408801359450606088013593506131d86080890161312b565b9699959850939692959460a0840135945060c09093013592915050565b5f5f60408385031215613206575f5ffd5b61320f83612ced565b915061321d60208401612ced565b90509250929050565b5f5f60408385031215613237575f5ffd5b61324083612ced565b9150602083013563ffffffff81168114612dc0575f5ffd5b600181811c9082168061326c57607f821691505b6020821081036120f857634e487b7160e01b5f52602260045260245ffd5b5f6020828403121561329a575f5ffd5b5051919050565b634e487b7160e01b5f52601160045260245ffd5b80820180821115610700576107006132a1565b634e487b7160e01b5f52603260045260245ffd5b5f602082840312156132ec575f5ffd5b8151610a0681612d89565b81810381811115610700576107006132a1565b6020808252602b908201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960408201526a6e697469616c697a696e6760a81b606082015260800190565b634e487b7160e01b5f52601260045260245ffd5b5f8261338357634e487b7160e01b5f52601260045260245ffd5b500490565b601f82111561243e57805f5260205f20601f840160051c810160208510156133ad5750805b601f840160051c820191505b818110156110b3575f81556001016133b9565b815167ffffffffffffffff8111156133e6576133e6612eb2565b6133fa816133f48454613258565b84613388565b6020601f82116001811461342c575f83156134155750848201515b5f19600385901b1c1916600184901b1784556110b3565b5f84815260208120601f198516915b8281101561345b578785015182556020948501946001909201910161343b565b508482101561347857868401515f19600387901b60f8161c191681555b50505050600190811b01905550565b634e487b7160e01b5f52602160045260245ffdfea2646970667358221220a4af477d2fecb794e35b6ec5fa2d04e4b411a737cab2f1395a0bff02fd38ef1e64736f6c634300081b0033",
}
⋮----
// 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\"},{\"name\":\"_version\",\"type\":\"string\",\"internalType\":\"string\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"receive\",\"stateMutability\":\"payable\"},{\"type\":\"function\",\"name\":\"activeValidatorCount\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"checkpointBalanceExitedGwei\",\"inputs\":[{\"name\":\"\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"currentCheckpoint\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"tuple\",\"internalType\":\"structIEigenPodTypes.Checkpoint\",\"components\":[{\"name\":\"beaconBlockRoot\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"proofsRemaining\",\"type\":\"uint24\",\"internalType\":\"uint24\"},{\"name\":\"podBalanceGwei\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"balanceDeltasGwei\",\"type\":\"int64\",\"internalType\":\"int64\"},{\"name\":\"prevBeaconBalanceGwei\",\"type\":\"uint64\",\"internalType\":\"uint64\"}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"currentCheckpointTimestamp\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"eigenPodManager\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIEigenPodManager\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"ethPOS\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIETHPOSDeposit\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getConsolidationRequestFee\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getParentBlockRoot\",\"inputs\":[{\"name\":\"timestamp\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getWithdrawalRequestFee\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"initialize\",\"inputs\":[{\"name\":\"_podOwner\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"lastCheckpointTimestamp\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"podOwner\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"proofSubmitter\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"recoverTokens\",\"inputs\":[{\"name\":\"tokenList\",\"type\":\"address[]\",\"internalType\":\"contractIERC20[]\"},{\"name\":\"amountsToWithdraw\",\"type\":\"uint256[]\",\"internalType\":\"uint256[]\"},{\"name\":\"recipient\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"requestConsolidation\",\"inputs\":[{\"name\":\"requests\",\"type\":\"tuple[]\",\"internalType\":\"structIEigenPodTypes.ConsolidationRequest[]\",\"components\":[{\"name\":\"srcPubkey\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"targetPubkey\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]}],\"outputs\":[],\"stateMutability\":\"payable\"},{\"type\":\"function\",\"name\":\"requestWithdrawal\",\"inputs\":[{\"name\":\"requests\",\"type\":\"tuple[]\",\"internalType\":\"structIEigenPodTypes.WithdrawalRequest[]\",\"components\":[{\"name\":\"pubkey\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"amountGwei\",\"type\":\"uint64\",\"internalType\":\"uint64\"}]}],\"outputs\":[],\"stateMutability\":\"payable\"},{\"type\":\"function\",\"name\":\"setProofSubmitter\",\"inputs\":[{\"name\":\"newProofSubmitter\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"stake\",\"inputs\":[{\"name\":\"pubkey\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"signature\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"depositDataRoot\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[],\"stateMutability\":\"payable\"},{\"type\":\"function\",\"name\":\"startCheckpoint\",\"inputs\":[{\"name\":\"revertIfNoBalance\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"validatorPubkeyHashToInfo\",\"inputs\":[{\"name\":\"validatorPubkeyHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"tuple\",\"internalType\":\"structIEigenPodTypes.ValidatorInfo\",\"components\":[{\"name\":\"validatorIndex\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"restakedBalanceGwei\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"lastCheckpointedAt\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"status\",\"type\":\"uint8\",\"internalType\":\"enumIEigenPodTypes.VALIDATOR_STATUS\"}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"validatorPubkeyToInfo\",\"inputs\":[{\"name\":\"validatorPubkey\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[{\"name\":\"\",\"type\":\"tuple\",\"internalType\":\"structIEigenPodTypes.ValidatorInfo\",\"components\":[{\"name\":\"validatorIndex\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"restakedBalanceGwei\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"lastCheckpointedAt\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"status\",\"type\":\"uint8\",\"internalType\":\"enumIEigenPodTypes.VALIDATOR_STATUS\"}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"validatorStatus\",\"inputs\":[{\"name\":\"validatorPubkey\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint8\",\"internalType\":\"enumIEigenPodTypes.VALIDATOR_STATUS\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"validatorStatus\",\"inputs\":[{\"name\":\"pubkeyHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint8\",\"internalType\":\"enumIEigenPodTypes.VALIDATOR_STATUS\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"verifyCheckpointProofs\",\"inputs\":[{\"name\":\"balanceContainerProof\",\"type\":\"tuple\",\"internalType\":\"structBeaconChainProofs.BalanceContainerProof\",\"components\":[{\"name\":\"balanceContainerRoot\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"proof\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]},{\"name\":\"proofs\",\"type\":\"tuple[]\",\"internalType\":\"structBeaconChainProofs.BalanceProof[]\",\"components\":[{\"name\":\"pubkeyHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"balanceRoot\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"proof\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"verifyStaleBalance\",\"inputs\":[{\"name\":\"beaconTimestamp\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"stateRootProof\",\"type\":\"tuple\",\"internalType\":\"structBeaconChainProofs.StateRootProof\",\"components\":[{\"name\":\"beaconStateRoot\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"proof\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]},{\"name\":\"proof\",\"type\":\"tuple\",\"internalType\":\"structBeaconChainProofs.ValidatorProof\",\"components\":[{\"name\":\"validatorFields\",\"type\":\"bytes32[]\",\"internalType\":\"bytes32[]\"},{\"name\":\"proof\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"verifyWithdrawalCredentials\",\"inputs\":[{\"name\":\"beaconTimestamp\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"stateRootProof\",\"type\":\"tuple\",\"internalType\":\"structBeaconChainProofs.StateRootProof\",\"components\":[{\"name\":\"beaconStateRoot\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"proof\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]},{\"name\":\"validatorIndices\",\"type\":\"uint40[]\",\"internalType\":\"uint40[]\"},{\"name\":\"validatorFieldsProofs\",\"type\":\"bytes[]\",\"internalType\":\"bytes[]\"},{\"name\":\"validatorFields\",\"type\":\"bytes32[][]\",\"internalType\":\"bytes32[][]\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"version\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"string\",\"internalType\":\"string\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"withdrawRestakedBeaconChainETH\",\"inputs\":[{\"name\":\"recipient\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"amountWei\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"withdrawableRestakedExecutionLayerGwei\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"stateMutability\":\"view\"},{\"type\":\"event\",\"name\":\"CheckpointCreated\",\"inputs\":[{\"name\":\"checkpointTimestamp\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"},{\"name\":\"beaconBlockRoot\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"validatorCount\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"CheckpointFinalized\",\"inputs\":[{\"name\":\"checkpointTimestamp\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"},{\"name\":\"totalShareDeltaWei\",\"type\":\"int256\",\"indexed\":false,\"internalType\":\"int256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ConsolidationRequested\",\"inputs\":[{\"name\":\"sourcePubkeyHash\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"targetPubkeyHash\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"EigenPodStaked\",\"inputs\":[{\"name\":\"pubkeyHash\",\"type\":\"bytes32\",\"indexed\":false,\"internalType\":\"bytes32\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ExitRequested\",\"inputs\":[{\"name\":\"validatorPubkeyHash\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Initialized\",\"inputs\":[{\"name\":\"version\",\"type\":\"uint8\",\"indexed\":false,\"internalType\":\"uint8\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"NonBeaconChainETHReceived\",\"inputs\":[{\"name\":\"amountReceived\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ProofSubmitterUpdated\",\"inputs\":[{\"name\":\"prevProofSubmitter\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"},{\"name\":\"newProofSubmitter\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"RestakedBeaconChainETHWithdrawn\",\"inputs\":[{\"name\":\"recipient\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"SwitchToCompoundingRequested\",\"inputs\":[{\"name\":\"validatorPubkeyHash\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ValidatorBalanceUpdated\",\"inputs\":[{\"name\":\"pubkeyHash\",\"type\":\"bytes32\",\"indexed\":false,\"internalType\":\"bytes32\"},{\"name\":\"balanceTimestamp\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"},{\"name\":\"newValidatorBalanceGwei\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ValidatorCheckpointed\",\"inputs\":[{\"name\":\"checkpointTimestamp\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"},{\"name\":\"pubkeyHash\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ValidatorRestaked\",\"inputs\":[{\"name\":\"pubkeyHash\",\"type\":\"bytes32\",\"indexed\":false,\"internalType\":\"bytes32\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ValidatorWithdrawn\",\"inputs\":[{\"name\":\"checkpointTimestamp\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"},{\"name\":\"pubkeyHash\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"WithdrawalRequested\",\"inputs\":[{\"name\":\"validatorPubkeyHash\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"withdrawalAmountGwei\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"}],\"anonymous\":false},{\"type\":\"error\",\"name\":\"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\":\"InvalidShortString\",\"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\":\"StringTooLong\",\"inputs\":[{\"name\":\"str\",\"type\":\"string\",\"internalType\":\"string\"}]},{\"type\":\"error\",\"name\":\"TimestampOutOfRange\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ValidatorInactiveOnBeaconChain\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ValidatorIsExitingBeaconChain\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ValidatorNotActiveInPod\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ValidatorNotSlashedOnBeaconChain\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"WithdrawalCredentialsNotForEigenPod\",\"inputs\":[]}]",
	Bin: "0x60e060405234801561000f575f5ffd5b5060405161495a38038061495a83398101604081905261002e91610188565b806100388161005f565b608052506001600160a01b0380841660a052821660c0526100576100a5565b5050506102b9565b5f5f829050601f81511115610092578260405163305a27a960e01b8152600401610089919061025e565b60405180910390fd5b805161009d82610293565b179392505050565b5f54610100900460ff161561010c5760405162461bcd60e51b815260206004820152602760248201527f496e697469616c697a61626c653a20636f6e747261637420697320696e697469604482015266616c697a696e6760c81b6064820152608401610089565b5f5460ff9081161461015b575f805460ff191660ff9081179091556040519081527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b565b6001600160a01b0381168114610171575f5ffd5b50565b634e487b7160e01b5f52604160045260245ffd5b5f5f5f6060848603121561019a575f5ffd5b83516101a58161015d565b60208501519093506101b68161015d565b60408501519092506001600160401b038111156101d1575f5ffd5b8401601f810186136101e1575f5ffd5b80516001600160401b038111156101fa576101fa610174565b604051601f8201601f19908116603f011681016001600160401b038111828210171561022857610228610174565b60405281815282820160200188101561023f575f5ffd5b8160208401602083015e5f602083830101528093505050509250925092565b602081525f82518060208401528060208501604085015e5f604082850101526040601f19601f83011684010191505092915050565b805160208083015191908110156102b3575f198160200360031b1b821691505b50919050565b60805160a05160c0516146156103455f395f8181610329015281816106d40152818161077c01528181610a2a01528181610deb01528181610fe5015281816110f0015281816115f1015281816116980152818161192101528181611c6f01528181611da301528181612279015261318301525f818161057a015261170101525f61105101526146155ff3fe6080604052600436106101bd575f3560e01c80636691954e116100f2578063b522538a11610092578063d06d558711610062578063d06d55871461063f578063dda3346c1461065e578063ee94d67c1461067d578063f074ba621461069c575f5ffd5b8063b522538a146105ce578063c44e30dc146105ed578063c490744214610601578063c4d66de814610620575f5ffd5b80637439841f116100cd5780637439841f1461053457806374cdd7981461056957806388676cad1461059c5780639b4e4634146105bb575f5ffd5b80636691954e146104d65780636c0d2d5a146104e95780636fcd0e5314610508575f5ffd5b806342ecff2a1161015d57806352396a591161013857806352396a591461043657806354fd4d501461046a578063587533571461048b57806358eaee79146104aa575f5ffd5b806342ecff2a146102f25780634665bcda1461031857806347d283721461034b575f5ffd5b80632340e8d3116101985780632340e8d31461027a5780633474aa161461028f5780633f5fa57a146102c05780633f65cf19146102d3575f5ffd5b8063039157d2146101fb5780630b18ff661461021c5780631e51553314610258575f5ffd5b366101f7576040513481527f6fdd3dbdb173299608c0aa9f368735857c8842b581f8389238bf05bd04b3bf499060200160405180910390a1005b5f5ffd5b348015610206575f5ffd5b5061021a610215366004613abc565b6106bb565b005b348015610227575f5ffd5b5060335461023b906001600160a01b031681565b6040516001600160a01b0390911681526020015b60405180910390f35b348015610263575f5ffd5b5061026c6109f0565b60405190815260200161024f565b348015610285575f5ffd5b5061026c60395481565b34801561029a575f5ffd5b506034546001600160401b03165b6040516001600160401b03909116815260200161024f565b61021a6102ce366004613b77565b610a11565b3480156102de575f5ffd5b5061021a6102ed366004613bb5565b610d92565b3480156102fd575f5ffd5b50603a546102a890600160401b90046001600160401b031681565b348015610323575f5ffd5b5061023b7f000000000000000000000000000000000000000000000000000000000000000081565b348015610356575f5ffd5b506103db6040805160a0810182525f80825260208201819052918101829052606081018290526080810191909152506040805160a081018252603c548152603d5462ffffff811660208301526001600160401b0363010000008204811693830193909352600160581b810460070b6060830152600160981b9004909116608082015290565b60405161024f91905f60a0820190508251825262ffffff60208401511660208301526001600160401b036040840151166040830152606083015160070b60608301526001600160401b03608084015116608083015292915050565b348015610441575f5ffd5b506102a8610450366004613c8c565b603b6020525f90815260409020546001600160401b031681565b348015610475575f5ffd5b5061047e61104a565b60405161024f9190613cd5565b348015610496575f5ffd5b50603e5461023b906001600160a01b031681565b3480156104b5575f5ffd5b506104c96104c4366004613d24565b611075565b60405161024f9190613d8a565b61021a6104e4366004613b77565b6110d7565b3480156104f4575f5ffd5b5061026c610503366004613c8c565b6113df565b348015610513575f5ffd5b50610527610522366004613d98565b6114ed565b60405161024f9190613daf565b34801561053f575f5ffd5b506104c961054e366004613d98565b5f90815260366020526040902054600160c01b900460ff1690565b348015610574575f5ffd5b5061023b7f000000000000000000000000000000000000000000000000000000000000000081565b3480156105a7575f5ffd5b5061021a6105b6366004613e0f565b611598565b61021a6105c9366004613e2a565b61168d565b3480156105d9575f5ffd5b506105276105e8366004613d24565b61180b565b3480156105f8575f5ffd5b5061026c6118fa565b34801561060c575f5ffd5b5061021a61061b366004613ebf565b611916565b34801561062b575f5ffd5b5061021a61063a366004613ee9565b611a4d565b34801561064a575f5ffd5b5061021a610659366004613ee9565b611b97565b348015610669575f5ffd5b5061021a610678366004613fd4565b611c2b565b348015610688575f5ffd5b50603a546102a8906001600160401b031681565b3480156106a7575f5ffd5b5061021a6106b63660046140a6565b611d8a565b604051635ac86ab760e01b8152600660048201819052907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031690635ac86ab790602401602060405180830381865afa158015610721573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610745919061410d565b156107635760405163840a48d560e01b815260040160405180910390fd5b604051635ac86ab760e01b8152600860048201819052907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031690635ac86ab790602401602060405180830381865afa1580156107c9573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906107ed919061410d565b1561080b5760405163840a48d560e01b815260040160405180910390fd5b5f61084f6108198580614128565b808060200260200160405190810160405280939291908181526020018383602002808284375f9201919091525061218692505050565b5f818152603660209081526040808320815160808101835281546001600160401b038082168352600160401b8204811695830195909552600160801b8104909416928101929092529394509192906060830190600160c01b900460ff1660028111156108bd576108bd613d56565b60028111156108ce576108ce613d56565b81525050905080604001516001600160401b0316876001600160401b03161161090a576040516337e07ffd60e01b815260040160405180910390fd5b60018160600151600281111561092257610922613d56565b146109405760405163d49e19a760e01b815260040160405180910390fd5b61098361094d8680614128565b808060200260200160405190810160405280939291908181526020018383602002808284375f920191909152506121a892505050565b6109a05760405163161ce5ed60e31b815260040160405180910390fd5b6109b26109ac886113df565b876121d0565b6109de6109be88612275565b87356109ca8880614128565b6109d760208b018b61416d565b875161234c565b6109e75f612480565b50505050505050565b5f610a0c71bbddc7ce488642fb579f8b00f3a590007251612600565b905090565b604051635ac86ab760e01b8152600a60048201819052907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031690635ac86ab790602401602060405180830381865afa158015610a77573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610a9b919061410d565b15610ab95760405163840a48d560e01b815260040160405180910390fd5b6033546001600160a01b0316331480610adc5750603e546001600160a01b031633145b610af95760405163427a777960e01b815260040160405180910390fd5b5f610b026118fa565b90505f610b0f84836141c3565b905080341015610b325760405163356680b760e01b815260040160405180910390fd5b5f610b3d82346141da565b90505f5b85811015610d795736878783818110610b5c57610b5c6141ed565b9050602002810190610b6e9190614201565b90505f610bb7610b7e838061416d565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f9201919091525061268692505050565b905060015f82815260366020526040902054600160c01b900460ff166002811115610be457610be4613d56565b14610c025760405163d49e19a760e01b815260040160405180910390fd5b5f610c0d838061416d565b610c1d6040860160208701613c8c565b604051602001610c2f9392919061421f565b60405160208183030381529060405290505f710961ef480eb55e80d19ad83579a64c0070026001600160a01b03168883604051610c6c9190614257565b5f6040518083038185875af1925050503d805f8114610ca6576040519150601f19603f3d011682016040523d82523d5f602084013e610cab565b606091505b5050905080610ccd5760405163fc52d48360e01b815260040160405180910390fd5b610cdd6040850160208601613c8c565b6001600160401b03165f03610d1b5760405183907f60d8ca014d4765a2b8b389e25714cb1cef83b574222911a01d90c1bd69d2d320905f90a2610d69565b827f8b2737bb64ab2f2dc09552dfa1c250399e6a42c7ea9f0e1c658f5d65d708ec05610d4d6040870160208801613c8c565b6040516001600160401b03909116815260200160405180910390a25b505060019092019150610b419050565b508015610d8a57610d8a3382612717565b505050505050565b6033546001600160a01b0316331480610db55750603e546001600160a01b031633145b610dd25760405163427a777960e01b815260040160405180910390fd5b604051635ac86ab760e01b8152600260048201819052907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031690635ac86ab790602401602060405180830381865afa158015610e38573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610e5c919061410d565b15610e7a5760405163840a48d560e01b815260040160405180910390fd5b8584148015610e8857508382145b610ea5576040516343714afd60e01b815260040160405180910390fd5b603a546001600160401b03600160401b9091048116908a1611610edb576040516337e07ffd60e01b815260040160405180910390fd5b603a546001600160401b03908116908a1611610f0a576040516335e7f6b760e01b815260040160405180910390fd5b610f1c610f168a6113df565b896121d0565b5f805b87811015610fb557610fa18b8b358b8b85818110610f3f57610f3f6141ed565b9050602002016020810190610f549190614262565b8a8a86818110610f6657610f666141ed565b9050602002810190610f78919061416d565b8a8a88818110610f8a57610f8a6141ed565b9050602002810190610f9c9190614128565b61282c565b610fab9083614286565b9150600101610f1f565b5060335460405163a1ca780b60e01b81526001600160a01b0391821660048201525f6024820152604481018390527f00000000000000000000000000000000000000000000000000000000000000009091169063a1ca780b906064015f604051808303815f87803b158015611028575f5ffd5b505af115801561103a573d5f5f3e3d5ffd5b5050505050505050505050505050565b6060610a0c7f0000000000000000000000000000000000000000000000000000000000000000612d2d565b5f5f6110b584848080601f0160208091040260200160405190810160405280939291908181526020018383808284375f9201919091525061268692505050565b5f90815260366020526040902054600160c01b900460ff169150505b92915050565b604051635ac86ab760e01b8152600960048201819052907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031690635ac86ab790602401602060405180830381865afa15801561113d573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611161919061410d565b1561117f5760405163840a48d560e01b815260040160405180910390fd5b6033546001600160a01b03163314806111a25750603e546001600160a01b031633145b6111bf5760405163427a777960e01b815260040160405180910390fd5b5f6111c86109f0565b90505f6111d584836141c3565b9050803410156111f85760405163356680b760e01b815260040160405180910390fd5b5f61120382346141da565b90505f5b85811015610d795736878783818110611222576112226141ed565b90506020028101906112349190614201565b90505f611244610b7e838061416d565b90505f611257610b7e602085018561416d565b905060015f82815260366020526040902054600160c01b900460ff16600281111561128457611284613d56565b146112a25760405163d49e19a760e01b815260040160405180910390fd5b5f6112ad848061416d565b6112ba602087018761416d565b6040516020016112cd9493929190614299565b60405160208183030381529060405290505f71bbddc7ce488642fb579f8b00f3a5900072516001600160a01b0316898360405161130a9190614257565b5f6040518083038185875af1925050503d805f8114611344576040519150601f19603f3d011682016040523d82523d5f602084013e611349565b606091505b505090508061136b5760405163fc52d48360e01b815260040160405180910390fd5b8284036113a15760405184907fc97b965b92ae7fd20095fe8eb7b99f81f95f8c4adffb22a19116d8eb2846b016905f90a26113ce565b604051839085907f42f9c9db2ca443e9ec62f4588bd0c9b241065c02c2a8001ac164ae1282dc7b94905f90a35b505060019093019250611207915050565b5f6113ed611fff600c6141c3565b6114006001600160401b038416426141da565b1061141e57604051637944e66d60e11b815260040160405180910390fd5b604080516001600160401b03841660208201525f918291720f3df6d732807ef1319fb7b8bb8522d0beac02910160408051601f198184030181529082905261146591614257565b5f60405180830381855afa9150503d805f811461149d576040519150601f19603f3d011682016040523d82523d5f602084013e6114a2565b606091505b50915091508180156114b457505f8151115b6114d15760405163558ad0a360e01b815260040160405180910390fd5b808060200190518101906114e591906142b8565b949350505050565b611514604080516080810182525f8082526020820181905291810182905290606082015290565b5f82815260366020908152604091829020825160808101845281546001600160401b038082168352600160401b8204811694830194909452600160801b810490931693810193909352906060830190600160c01b900460ff16600281111561157e5761157e613d56565b600281111561158f5761158f613d56565b90525092915050565b6033546001600160a01b03163314806115bb5750603e546001600160a01b031633145b6115d85760405163427a777960e01b815260040160405180910390fd5b604051635ac86ab760e01b8152600660048201819052907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031690635ac86ab790602401602060405180830381865afa15801561163e573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611662919061410d565b156116805760405163840a48d560e01b815260040160405180910390fd5b61168982612480565b5050565b336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146116d657604051633213a66160e21b815260040160405180910390fd5b346801bc16d674ec800000146116ff5760405163049696b360e31b815260040160405180910390fd5b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663228951186801bc16d674ec8000008787611742612d6a565b8888886040518863ffffffff1660e01b8152600401611766969594939291906142f7565b5f604051808303818588803b15801561177d575f5ffd5b505af115801561178f573d5f5f3e3d5ffd5b50505050507fa01003766d3cd97cf2ade5429690bf5d206be7fb01ef9d3a0089ecf67bc112196117f386868080601f0160208091040260200160405190810160405280939291908181526020018383808284375f9201919091525061268692505050565b60405190815260200160405180910390a15050505050565b611832604080516080810182525f8082526020820181905291810182905290606082015290565b60365f61187385858080601f0160208091040260200160405190810160405280939291908181526020018383808284375f9201919091525061268692505050565b815260208082019290925260409081015f20815160808101835281546001600160401b038082168352600160401b8204811695830195909552600160801b81049094169281019290925290916060830190600160c01b900460ff1660028111156118df576118df613d56565b60028111156118f0576118f0613d56565b9052509392505050565b5f610a0c710961ef480eb55e80d19ad83579a64c007002612600565b336001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000161461195f57604051633213a66160e21b815260040160405180910390fd5b5f61196e633b9aca0083614359565b9050611987633b9aca006001600160401b0383166141c3565b6034549092506001600160401b0390811690821611156119ba576040516302c6f54760e21b815260040160405180910390fd5b603480548291905f906119d79084906001600160401b031661436c565b92506101000a8154816001600160401b0302191690836001600160401b03160217905550826001600160a01b03167f8947fd2ce07ef9cc302c4e8f0461015615d91ce851564839e91cc804c2f49d8e83604051611a3691815260200190565b60405180910390a2611a488383612717565b505050565b5f54610100900460ff1615808015611a6b57505f54600160ff909116105b80611a845750303b158015611a8457505f5460ff166001145b611aec5760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b60648201526084015b60405180910390fd5b5f805460ff191660011790558015611b0d575f805461ff0019166101001790555b6001600160a01b038216611b34576040516339b190bb60e11b815260040160405180910390fd5b603380546001600160a01b0319166001600160a01b0384161790558015611689575f805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15050565b6033546001600160a01b03163314611bc25760405163719f370360e11b815260040160405180910390fd5b603e54604080516001600160a01b03928316815291831660208301527ffb8129080a19d34dceac04ba253fc50304dc86c729bd63cdca4a969ad19a5eac910160405180910390a1603e80546001600160a01b0319166001600160a01b0392909216919091179055565b6033546001600160a01b03163314611c565760405163719f370360e11b815260040160405180910390fd5b604051635ac86ab760e01b8152600560048201819052907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031690635ac86ab790602401602060405180830381865afa158015611cbc573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611ce0919061410d565b15611cfe5760405163840a48d560e01b815260040160405180910390fd5b8251845114611d20576040516343714afd60e01b815260040160405180910390fd5b5f5b8451811015611d8357611d7b83858381518110611d4157611d416141ed565b6020026020010151878481518110611d5b57611d5b6141ed565b60200260200101516001600160a01b0316612d9a9092919063ffffffff16565b600101611d22565b5050505050565b604051635ac86ab760e01b8152600760048201819052907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031690635ac86ab790602401602060405180830381865afa158015611df0573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611e14919061410d565b15611e325760405163840a48d560e01b815260040160405180910390fd5b603a54600160401b90046001600160401b03165f819003611e6657604051631a544f4960e01b815260040160405180910390fd5b6040805160a081018252603c548152603d5462ffffff811660208301526001600160401b0363010000008204811693830193909352600160581b810460070b6060830152600160981b90049091166080820152611ecd611ec583612275565b825188612dec565b5f805b8581101561212d5736878783818110611eeb57611eeb6141ed565b9050602002810190611efd919061438b565b80355f908152603660209081526040808320815160808101835281546001600160401b038082168352600160401b8204811695830195909552600160801b8104909416928101929092529394509192906060830190600160c01b900460ff166002811115611f6d57611f6d613d56565b6002811115611f7e57611f7e613d56565b9052509050600181606001516002811115611f9b57611f9b613d56565b14611fa7575050612125565b856001600160401b031681604001516001600160401b031610611fcb575050612125565b5f8080611fdb848a8f3588612ead565b60208b0180519396509194509250611ff28261439f565b62ffffff1690525060808801805184919061200e9083906143bc565b6001600160401b031690525060608801805183919061202e9083906143db565b60070b90525061203e81886143bc565b85355f908152603660209081526040918290208751815492890151938901516001600160401b03908116600160801b0267ffffffffffffffff60801b19958216600160401b026001600160801b0319909516919092161792909217928316821781556060880151939a50879390929091839160ff60c01b1990911668ffffffffffffffffff60801b1990911617600160c01b8360028111156120e2576120e2613d56565b021790555050604051863591506001600160401b038b16907fe4866335761a51dcaff766448ab0af6064291ee5dc94e68492bb9cd757c1e350905f90a350505050505b600101611ed0565b506001600160401b038084165f908152603b6020526040812080548493919291612159918591166143bc565b92506101000a8154816001600160401b0302191690836001600160401b031602179055506109e782612fc3565b5f815f81518110612199576121996141ed565b60200260200101519050919050565b5f816003815181106121bc576121bc6141ed565b60200260200101515f5f1b14159050919050565b6121dc600360206141c3565b6121e9602083018361416d565b905014612209576040516313717da960e21b815260040160405180910390fd5b612258612219602083018361416d565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f92019190915250869250508435905060036131e3565b611689576040516309bde33960e01b815260040160405180910390fd5b5f5f7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316632704351a6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156122d3573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906122f7919061440a565b9050806001600160401b03165f03612322576040516341a02cc960e01b815260040160405180910390fd5b806001600160401b0316836001600160401b03161115612343576001612345565b5f5b9392505050565b6008841461236d5760405163200591bd60e01b815260040160405180910390fd5b5f61237788613218565b90508061238660286001614286565b6123909190614286565b61239b9060206141c3565b83146123ba576040516313717da960e21b815260040160405180910390fd5b5f6123f68787808060200260200160405190810160405280939291908181526020018383602002808284375f9201919091525061324092505050565b90505f64ffffffffff841661240d60286001614286565b600b901b17905061245786868080601f0160208091040260200160405190810160405280939291908181526020018383808284375f920191909152508d92508691508590506131e3565b612474576040516309bde33960e01b815260040160405180910390fd5b50505050505050505050565b603a54600160401b90046001600160401b0316156124b05760405162be9bc360e81b815260040160405180910390fd5b603a546001600160401b034281169116036124de576040516367db5b8b60e01b815260040160405180910390fd5b6034545f906001600160401b03166124fa633b9aca0047614359565b612504919061436c565b905081801561251a57506001600160401b038116155b15612538576040516332dea95960e21b815260040160405180910390fd5b5f6040518060a0016040528061254d426113df565b815260395462ffffff1660208201526001600160401b0380851660408301525f60608301819052608090920191909152603a805442909216600160401b026fffffffffffffffff00000000000000001990921691909117905590506125b181612fc3565b805160208083015160405162ffffff90911681526001600160401b034216917f575796133bbed337e5b39aa49a30dc2556a91e0c6c2af4b7b886ae77ebef1076910160405180910390a3505050565b5f5f5f836001600160a01b03166040515f60405180830381855afa9150503d805f8114612648576040519150601f19603f3d011682016040523d82523d5f602084013e61264d565b606091505b5091509150818015612660575080516020145b61267d5760405163c90158af60e01b815260040160405180910390fd5b6114e581614425565b5f81516030146126a957604051634f88323960e11b815260040160405180910390fd5b6040516002906126bf9084905f90602001614448565b60408051601f19818403018152908290526126d991614257565b602060405180830381855afa1580156126f4573d5f5f3e3d5ffd5b5050506040513d601f19601f820116820180604052508101906110d191906142b8565b804710156127675760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a20696e73756666696369656e742062616c616e63650000006044820152606401611ae3565b5f826001600160a01b0316826040515f6040518083038185875af1925050503d805f81146127b0576040519150601f19603f3d011682016040523d82523d5f602084013e6127b5565b606091505b5050905080611a485760405162461bcd60e51b815260206004820152603a60248201527f416464726573733a20756e61626c6520746f2073656e642076616c75652c207260448201527f6563697069656e74206d617920686176652072657665727465640000000000006064820152608401611ae3565b5f5f6128698484808060200260200160405190810160405280939291908181526020018383602002808284375f9201919091525061218692505050565b5f818152603660209081526040808320815160808101835281546001600160401b038082168352600160401b8204811695830195909552600160801b8104909416928101929092529394509192906060830190600160c01b900460ff1660028111156128d7576128d7613d56565b60028111156128e8576128e8613d56565b90525090505f8160600151600281111561290457612904613d56565b14612922576040516335e09e9d60e01b815260040160405180910390fd5b6001600160401b0380166129678686808060200260200160405190810160405280939291908181526020018383602002808284375f9201919091525061350e92505050565b6001600160401b03160361298e57604051631958236d60e21b815260040160405180910390fd5b6001600160401b0380166129d38686808060200260200160405190810160405280939291908181526020018383602002808284375f9201919091525061353292505050565b6001600160401b0316146129fa57604051632eade63760e01b815260040160405180910390fd5b612a02612d6a565b612a0b90614425565b612a468686808060200260200160405190810160405280939291908181526020018383602002808284375f9201919091525061354992505050565b1480612a9b5750612a5561355d565b612a5e90614425565b612a998686808060200260200160405190810160405280939291908181526020018383602002808284375f9201919091525061354992505050565b145b612ab857604051633772dd5360e11b815260040160405180910390fd5b5f612af48686808060200260200160405190810160405280939291908181526020018383602002808284375f9201919091525061357992505050565b9050612b0d612b028c612275565b8b88888c8c8f61234c565b60398054905f612b1c8361446c565b9091555050603a545f90600160401b90046001600160401b031615612b5357603a54600160401b90046001600160401b0316612b60565b603a546001600160401b03165b6040805160808101825264ffffffffff8d1681526001600160401b03858116602083015283169181019190915290915060608101600190525f858152603660209081526040918290208351815492850151938501516001600160401b03908116600160801b0267ffffffffffffffff60801b19958216600160401b026001600160801b031990951691909216179290921792831682178155606084015190929091839160ff60c01b1990911668ffffffffffffffffff60801b1990911617600160c01b836002811115612c3557612c35613d56565b021790555050603d8054849250601390612c60908490600160981b90046001600160401b03166143bc565b92506101000a8154816001600160401b0302191690836001600160401b031602179055507f101790c2993f6a4d962bd17c786126823ba1c4cf04ff4cccb2659d50fb20aee884604051612cb591815260200190565b60405180910390a1604080518581526001600160401b03838116602083015284168183015290517fcdae700d7241bc027168c53cf6f889763b0a2c88a65d77fc13a8a9fef0d8605f9181900360600190a1612d1d633b9aca006001600160401b0384166141c3565b9c9b505050505050505050505050565b60605f612d3983613590565b6040805160208082528183019092529192505f91906020820181803683375050509182525060208101929092525090565b604051606090612d8690600160f81b905f903090602001614484565b604051602081830303815290604052905090565b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b031663a9059cbb60e01b179052611a489084906135b7565b5f612df684613218565b9050612e03816003614286565b612e0e9060206141c3565b612e1b602084018461416d565b905014612e3b576040516313717da960e21b815260040160405180910390fd5b6003811b600c17612e90612e52602085018561416d565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f920191909152508892505086359050846131e3565b611d83576040516309bde33960e01b815260040160405180910390fd5b5f5f5f866020015192505f612ec686895f01518761368a565b9050836001600160401b0316816001600160401b031614612f3a57612eeb84826144c2565b60408051873581526001600160401b038a8116602083015284168183015290519194507fcdae700d7241bc027168c53cf6f889763b0a2c88a65d77fc13a8a9fef0d8605f919081900360600190a15b6001600160401b0380821660208a0181905290881660408a01525f03612fb85760398054905f612f69836144f1565b909155505060026060890152612f7e83614506565b6040519092508535906001600160401b038916907f5ce0aa04ae51d52da6e680fbe0336d2e2432f7c3dc2d4f3193204c57b9072107905f90a35b509450945094915050565b8051603c556020810151603d805460408401516060850151608086015162ffffff9095166affffffffffffffffffffff19909316831763010000006001600160401b0393841602176fffffffffffffffffffffffffffffffff60581b1916600160581b9183169190910267ffffffffffffffff60981b191617600160981b9190941602929092179055156130545750565b60808101516034545f91613070916001600160401b03166143bc565b90505f8260600151836040015161308791906143db565b60408401516034805492935090915f906130ab9084906001600160401b03166143bc565b82546101009290920a6001600160401b03818102199093169183160217909155603a8054600160401b810483166001600160801b03199091161790555f91506130fb90633b9aca009085166141c3565b90505f613110633b9aca00600785900b61452b565b603a546040518281529192506001600160401b0316907f525408c201bc1576eb44116f6478f1c2a54775b19a043bcfdc708364f74f8e449060200160405180910390a260335460405163a1ca780b60e01b81526001600160a01b03918216600482015260248101849052604481018390527f00000000000000000000000000000000000000000000000000000000000000009091169063a1ca780b906064015f604051808303815f87803b1580156131c6575f5ffd5b505af11580156131d8573d5f5f3e3d5ffd5b505050505050505050565b5f83613202576040516329e7276760e11b815260040160405180910390fd5b8361320e868585613768565b1495945050505050565b5f8082600181111561322c5761322c613d56565b146132385760066110d1565b600592915050565b5f60018251116132635760405163f8ef036760e01b815260040160405180910390fd5b61326d825161385b565b61328a5760405163f6558f5160e01b815260040160405180910390fd5b5f600283516132999190614359565b90505f816001600160401b038111156132b4576132b4613f04565b6040519080825280602002602001820160405280156132dd578160200160208202803683370190505b5090505f5b828110156133d7576002856132f783836141c3565b81518110613307576133076141ed565b60200260200101518683600261331d91906141c3565b613328906001614286565b81518110613338576133386141ed565b602002602001015160405160200161335a929190918252602082015260400190565b60408051601f198184030181529082905261337491614257565b602060405180830381855afa15801561338f573d5f5f3e3d5ffd5b5050506040513d601f19601f820116820180604052508101906133b291906142b8565b8282815181106133c4576133c46141ed565b60209081029190910101526001016132e2565b505b816001146134eb576133ec600283614359565b91505f5b828110156134e55760028261340583836141c3565b81518110613415576134156141ed565b60200260200101518383600261342b91906141c3565b613436906001614286565b81518110613446576134466141ed565b6020026020010151604051602001613468929190918252602082015260400190565b60408051601f198184030181529082905261348291614257565b602060405180830381855afa15801561349d573d5f5f3e3d5ffd5b5050506040513d601f19601f820116820180604052508101906134c091906142b8565b8282815181106134d2576134d26141ed565b60209081029190910101526001016133f0565b506133d9565b805f815181106134fd576134fd6141ed565b602002602001015192505050919050565b5f6110d182600581518110613525576135256141ed565b602002602001015161387a565b5f6110d182600681518110613525576135256141ed565b5f81600181518110612199576121996141ed565b604051606090612d8690600160f91b905f903090602001614484565b5f6110d182600281518110613525576135256141ed565b5f60ff8216601f8111156110d157604051632cd44ac360e21b815260040160405180910390fd5b5f61360b826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b03166138e19092919063ffffffff16565b905080515f148061362b57508080602001905181019061362b919061410d565b611a485760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b6064820152608401611ae3565b5f61369760266001614286565b6136a29060206141c3565b6136af604084018461416d565b9050146136cf576040516313717da960e21b815260040160405180910390fd5b5f6136db60048561455a565b64ffffffffff1690506137346136f4604085018561416d565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f9201919091525089925050506020860135846131e3565b613751576040516309bde33960e01b815260040160405180910390fd5b61375f8360200135856138ef565b95945050505050565b5f83515f141580156137855750602084516137839190614583565b155b6137a2576040516313717da960e21b815260040160405180910390fd5b604080516020808201909252848152905b85518111613832576137c6600285614583565b5f036137f85781515f528086015160205260208260405f60026107d05a03fa6137ed575f5ffd5b600284049350613820565b808601515f52815160205260208260405f60026107d05a03fa613819575f5ffd5b6002840493505b61382b602082614286565b90506137b3565b508215613852576040516363df817160e01b815260040160405180910390fd5b51949350505050565b5f81158015906110d157506138716001836141da565b82161592915050565b60f881901c60e882901c61ff00161760d882901c62ff0000161760c882901c63ff000000161764ff0000000060b883901c161765ff000000000060a883901c161766ff000000000000609883901c161767ff0000000000000060889290921c919091161790565b60606114e584845f8561391b565b5f806138fc600484614596565b6139079060406145bf565b64ffffffffff1690506114e584821b61387a565b60608247101561397c5760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6044820152651c8818d85b1b60d21b6064820152608401611ae3565b5f5f866001600160a01b031685876040516139979190614257565b5f6040518083038185875af1925050503d805f81146139d1576040519150601f19603f3d011682016040523d82523d5f602084013e6139d6565b606091505b50915091506139e7878383876139f2565b979650505050505050565b60608315613a605782515f03613a59576001600160a01b0385163b613a595760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401611ae3565b50816114e5565b6114e58383815115613a755781518083602001fd5b8060405162461bcd60e51b8152600401611ae39190613cd5565b6001600160401b0381168114613aa3575f5ffd5b50565b5f60408284031215613ab6575f5ffd5b50919050565b5f5f5f60608486031215613ace575f5ffd5b8335613ad981613a8f565b925060208401356001600160401b03811115613af3575f5ffd5b613aff86828701613aa6565b92505060408401356001600160401b03811115613b1a575f5ffd5b613b2686828701613aa6565b9150509250925092565b5f5f83601f840112613b40575f5ffd5b5081356001600160401b03811115613b56575f5ffd5b6020830191508360208260051b8501011115613b70575f5ffd5b9250929050565b5f5f60208385031215613b88575f5ffd5b82356001600160401b03811115613b9d575f5ffd5b613ba985828601613b30565b90969095509350505050565b5f5f5f5f5f5f5f5f60a0898b031215613bcc575f5ffd5b8835613bd781613a8f565b975060208901356001600160401b03811115613bf1575f5ffd5b613bfd8b828c01613aa6565b97505060408901356001600160401b03811115613c18575f5ffd5b613c248b828c01613b30565b90975095505060608901356001600160401b03811115613c42575f5ffd5b613c4e8b828c01613b30565b90955093505060808901356001600160401b03811115613c6c575f5ffd5b613c788b828c01613b30565b999c989b5096995094979396929594505050565b5f60208284031215613c9c575f5ffd5b813561234581613a8f565b5f81518084528060208401602086015e5f602082860101526020601f19601f83011685010191505092915050565b602081525f6123456020830184613ca7565b5f5f83601f840112613cf7575f5ffd5b5081356001600160401b03811115613d0d575f5ffd5b602083019150836020828501011115613b70575f5ffd5b5f5f60208385031215613d35575f5ffd5b82356001600160401b03811115613d4a575f5ffd5b613ba985828601613ce7565b634e487b7160e01b5f52602160045260245ffd5b60038110613d8657634e487b7160e01b5f52602160045260245ffd5b9052565b602081016110d18284613d6a565b5f60208284031215613da8575f5ffd5b5035919050565b5f6080820190506001600160401b0383511682526001600160401b0360208401511660208301526001600160401b0360408401511660408301526060830151613dfb6060840182613d6a565b5092915050565b8015158114613aa3575f5ffd5b5f60208284031215613e1f575f5ffd5b813561234581613e02565b5f5f5f5f5f60608688031215613e3e575f5ffd5b85356001600160401b03811115613e53575f5ffd5b613e5f88828901613ce7565b90965094505060208601356001600160401b03811115613e7d575f5ffd5b613e8988828901613ce7565b96999598509660400135949350505050565b6001600160a01b0381168114613aa3575f5ffd5b8035613eba81613e9b565b919050565b5f5f60408385031215613ed0575f5ffd5b8235613edb81613e9b565b946020939093013593505050565b5f60208284031215613ef9575f5ffd5b813561234581613e9b565b634e487b7160e01b5f52604160045260245ffd5b604051601f8201601f191681016001600160401b0381118282101715613f4057613f40613f04565b604052919050565b5f6001600160401b03821115613f6057613f60613f04565b5060051b60200190565b5f82601f830112613f79575f5ffd5b8135613f8c613f8782613f48565b613f18565b8082825260208201915060208360051b860101925085831115613fad575f5ffd5b602085015b83811015613fca578035835260209283019201613fb2565b5095945050505050565b5f5f5f60608486031215613fe6575f5ffd5b83356001600160401b03811115613ffb575f5ffd5b8401601f8101861361400b575f5ffd5b8035614019613f8782613f48565b8082825260208201915060208360051b85010192508883111561403a575f5ffd5b6020840193505b8284101561406557833561405481613e9b565b825260209384019390910190614041565b955050505060208401356001600160401b03811115614082575f5ffd5b61408e86828701613f6a565b92505061409d60408501613eaf565b90509250925092565b5f5f5f604084860312156140b8575f5ffd5b83356001600160401b038111156140cd575f5ffd5b6140d986828701613aa6565b93505060208401356001600160401b038111156140f4575f5ffd5b61410086828701613b30565b9497909650939450505050565b5f6020828403121561411d575f5ffd5b815161234581613e02565b5f5f8335601e1984360301811261413d575f5ffd5b8301803591506001600160401b03821115614156575f5ffd5b6020019150600581901b3603821315613b70575f5ffd5b5f5f8335601e19843603018112614182575f5ffd5b8301803591506001600160401b0382111561419b575f5ffd5b602001915036819003821315613b70575f5ffd5b634e487b7160e01b5f52601160045260245ffd5b80820281158282048414176110d1576110d16141af565b818103818111156110d1576110d16141af565b634e487b7160e01b5f52603260045260245ffd5b5f8235603e19833603018112614215575f5ffd5b9190910192915050565b8284823760c09190911b6001600160c01b0319169101908152600801919050565b5f81518060208401855e5f93019283525090919050565b5f6123458284614240565b5f60208284031215614272575f5ffd5b813564ffffffffff81168114612345575f5ffd5b808201808211156110d1576110d16141af565b838582375f8482015f8152838582375f93019283525090949350505050565b5f602082840312156142c8575f5ffd5b5051919050565b81835281816020850137505f828201602090810191909152601f909101601f19169091010190565b608081525f61430a60808301888a6142cf565b828103602084015261431c8188613ca7565b905082810360408401526143318186886142cf565b915050826060830152979650505050505050565b634e487b7160e01b5f52601260045260245ffd5b5f8261436757614367614345565b500490565b6001600160401b0382811682821603908111156110d1576110d16141af565b5f8235605e19833603018112614215575f5ffd5b5f62ffffff8216806143b3576143b36141af565b5f190192915050565b6001600160401b0381811683821601908111156110d1576110d16141af565b600781810b9083900b01677fffffffffffffff8113677fffffffffffffff19821217156110d1576110d16141af565b5f6020828403121561441a575f5ffd5b815161234581613a8f565b80516020808301519190811015613ab6575f1960209190910360031b1b16919050565b5f6144538285614240565b6001600160801b03199390931683525050601001919050565b5f6001820161447d5761447d6141af565b5060010190565b6001600160f81b03199390931683526001600160a81b031991909116600183015260601b6bffffffffffffffffffffffff1916600c82015260200190565b600782810b9082900b03677fffffffffffffff198112677fffffffffffffff821317156110d1576110d16141af565b5f816144ff576144ff6141af565b505f190190565b5f8160070b677fffffffffffffff198103614523576145236141af565b5f0392915050565b8082025f8212600160ff1b84141615614546576145466141af565b81810583148215176110d1576110d16141af565b5f64ffffffffff83168061457057614570614345565b8064ffffffffff84160491505092915050565b5f8261459157614591614345565b500690565b5f64ffffffffff8316806145ac576145ac614345565b8064ffffffffff84160691505092915050565b64ffffffffff8181168382160290811690818114613dfb57613dfb6141af56fea2646970667358221220905476a9bc91953440c84d770e9b89fddd5a8856c845405968955c8c2a0995e264736f6c634300081b0033",
}
⋮----
// 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, _version string) (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)
⋮----
// Version is a free data retrieval call binding the contract method 0x54fd4d50.
⋮----
// Solidity: function version() view returns(string)
func (_EigenPod *EigenPodCaller) Version(opts *bind.CallOpts) (string, error)
⋮----
// 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\"},{\"name\":\"_version\",\"type\":\"string\",\"internalType\":\"string\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"addShares\",\"inputs\":[{\"name\":\"staker\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"strategy\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"},{\"name\":\"shares\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"beaconChainETHStrategy\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"beaconChainSlashingFactor\",\"inputs\":[{\"name\":\"podOwner\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"burnableETHShares\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"createPod\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"delegationManager\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIDelegationManager\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"eigenPodBeacon\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIBeacon\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"ethPOS\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIETHPOSDeposit\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getPod\",\"inputs\":[{\"name\":\"podOwner\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIEigenPod\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"hasPod\",\"inputs\":[{\"name\":\"podOwner\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"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\":\"version\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"string\",\"internalType\":\"string\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"withdrawSharesAsTokens\",\"inputs\":[{\"name\":\"staker\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"strategy\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"},{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIERC20\"},{\"name\":\"shares\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"event\",\"name\":\"BeaconChainETHDeposited\",\"inputs\":[{\"name\":\"podOwner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"BeaconChainETHWithdrawalCompleted\",\"inputs\":[{\"name\":\"podOwner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"shares\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"nonce\",\"type\":\"uint96\",\"indexed\":false,\"internalType\":\"uint96\"},{\"name\":\"delegatedAddress\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"},{\"name\":\"withdrawer\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"},{\"name\":\"withdrawalRoot\",\"type\":\"bytes32\",\"indexed\":false,\"internalType\":\"bytes32\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"BeaconChainSlashingFactorDecreased\",\"inputs\":[{\"name\":\"staker\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"},{\"name\":\"prevBeaconChainSlashingFactor\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"},{\"name\":\"newBeaconChainSlashingFactor\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"BurnableETHSharesIncreased\",\"inputs\":[{\"name\":\"shares\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Initialized\",\"inputs\":[{\"name\":\"version\",\"type\":\"uint8\",\"indexed\":false,\"internalType\":\"uint8\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"NewTotalShares\",\"inputs\":[{\"name\":\"podOwner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"newTotalShares\",\"type\":\"int256\",\"indexed\":false,\"internalType\":\"int256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"OwnershipTransferred\",\"inputs\":[{\"name\":\"previousOwner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"newOwner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Paused\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"newPausedStatus\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"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\":\"InvalidShortString\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidStrategy\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"LegacyWithdrawalsNotCompleted\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"OnlyDelegationManager\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"OnlyEigenPod\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"OnlyPauser\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"OnlyProofTimestampSetter\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"OnlyUnpauser\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"SharesNegative\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"SharesNotMultipleOfGwei\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"StringTooLong\",\"inputs\":[{\"name\":\"str\",\"type\":\"string\",\"internalType\":\"string\"}]}]",
	Bin: "0x610120604052348015610010575f5ffd5b50604051612f01380380612f0183398101604081905261002f916101c2565b80858585856001600160a01b03811661005b576040516339b190bb60e11b815260040160405180910390fd5b6001600160a01b0390811660805292831660a05290821660c0521660e05261008281610099565b610100525061008f6100df565b505050505061031a565b5f5f829050601f815111156100cc578260405163305a27a960e01b81526004016100c391906102bf565b60405180910390fd5b80516100d7826102f4565b179392505050565b5f54610100900460ff16156101465760405162461bcd60e51b815260206004820152602760248201527f496e697469616c697a61626c653a20636f6e747261637420697320696e697469604482015266616c697a696e6760c81b60648201526084016100c3565b5f5460ff90811614610195575f805460ff191660ff9081179091556040519081527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b565b6001600160a01b03811681146101ab575f5ffd5b50565b634e487b7160e01b5f52604160045260245ffd5b5f5f5f5f5f60a086880312156101d6575f5ffd5b85516101e181610197565b60208701519095506101f281610197565b604087015190945061020381610197565b606087015190935061021481610197565b60808701519092506001600160401b0381111561022f575f5ffd5b8601601f8101881361023f575f5ffd5b80516001600160401b03811115610258576102586101ae565b604051601f8201601f19908116603f011681016001600160401b0381118282101715610286576102866101ae565b6040528181528282016020018a101561029d575f5ffd5b8160208401602083015e5f602083830101528093505050509295509295909350565b602081525f82518060208401528060208501604085015e5f604082850101526040601f19601f83011684010191505092915050565b80516020808301519190811015610314575f198160200360031b1b821691505b50919050565b60805160a05160c05160e05161010051612b6461039d5f395f610b2401525f818161060c0152818161077b015281816109d401528181610a7a01528181610c0501528181610f82015261103701525f818161028b015281816110cd015261186701525f61044b01525f8181610492015281816114950152611a840152612b645ff3fe6080604052600436106101f1575f3560e01c8063886f119511610108578063a6a509be1161009d578063f2fde38b1161006d578063f2fde38b1461062e578063f5d4fed31461064d578063f6848d2414610662578063fabc1cbc1461069b578063fe243a17146106ba575f5ffd5b8063a6a509be1461059c578063cd6dc687146105b1578063d48e8894146105d0578063ea4d3c9b146105fb575f5ffd5b80639ba06275116100d85780639ba062751461050b578063a1ca780b1461053f578063a38406a31461055e578063a3d75e091461057d575f5ffd5b8063886f1195146104815780638da5cb5b146104b45780639104c319146104d15780639b4e4634146104f8575f5ffd5b8063595c6a67116101895780635c975abb116101595780635c975abb146103e9578063715018a614610407578063724af4231461041b57806374cdd7981461043a57806384d810621461046d575f5ffd5b8063595c6a6714610358578063595edbcb1461036c5780635a26fbf41461038b5780635ac86ab7146103aa575f5ffd5b80632eae418c116101c45780632eae418c146102c55780633fb99ca5146102e457806350ff72251461030357806354fd4d5014610337575f5ffd5b80630d1e9de1146101f5578063136439dd146102165780632704351a14610235578063292b7b2b1461027a575b5f5ffd5b348015610200575f5ffd5b5061021461020f366004611d7e565b6106d9565b005b348015610221575f5ffd5b50610214610230366004611d99565b610736565b348015610240575f5ffd5b50609f5461025c90600160a01b900467ffffffffffffffff1681565b60405167ffffffffffffffff90911681526020015b60405180910390f35b348015610285575f5ffd5b506102ad7f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b039091168152602001610271565b3480156102d0575f5ffd5b506102146102df366004611db0565b610770565b3480156102ef575f5ffd5b506102146102fe366004611dfe565b6109c9565b34801561030e575f5ffd5b5061032261031d366004611e48565b610a6d565b60408051928352602083019190915201610271565b348015610342575f5ffd5b5061034b610b1d565b6040516102719190611e86565b348015610363575f5ffd5b50610214610b4d565b348015610377575f5ffd5b50609f546102ad906001600160a01b031681565b348015610396575f5ffd5b506102146103a5366004611ebb565b610b61565b3480156103b5575f5ffd5b506103d96103c4366004611ee2565b606654600160ff9092169190911b9081161490565b6040519015158152602001610271565b3480156103f4575f5ffd5b506066545b604051908152602001610271565b348015610412575f5ffd5b50610214610be8565b348015610426575f5ffd5b506103f9610435366004611e48565b610bf9565b348015610445575f5ffd5b506102ad7f000000000000000000000000000000000000000000000000000000000000000081565b348015610478575f5ffd5b506102ad610d3e565b34801561048c575f5ffd5b506102ad7f000000000000000000000000000000000000000000000000000000000000000081565b3480156104bf575f5ffd5b506033546001600160a01b03166102ad565b3480156104dc575f5ffd5b506102ad73beac0eeeeeeeeeeeeeeeeeeeeeeeeeeeeeebeac081565b610214610506366004611f40565b610da1565b348015610516575f5ffd5b506102ad610525366004611d7e565b60986020525f90815260409020546001600160a01b031681565b34801561054a575f5ffd5b50610214610559366004611fb3565b610e52565b348015610569575f5ffd5b506102ad610578366004611d7e565b611073565b348015610588575f5ffd5b5061025c610597366004611d7e565b611144565b3480156105a7575f5ffd5b506103f960995481565b3480156105bc575f5ffd5b506102146105cb366004611fe5565b6111a4565b3480156105db575f5ffd5b506103f96105ea366004611d7e565b609b6020525f908152604090205481565b348015610606575f5ffd5b506102ad7f000000000000000000000000000000000000000000000000000000000000000081565b348015610639575f5ffd5b50610214610648366004611d7e565b6112c0565b348015610658575f5ffd5b506103f9609e5481565b34801561066d575f5ffd5b506103d961067c366004611d7e565b6001600160a01b039081165f9081526098602052604090205416151590565b3480156106a6575f5ffd5b506102146106b5366004611d99565b611339565b3480156106c5575f5ffd5b506103f96106d436600461200f565b6113a6565b6106e1611426565b609f80546001600160a01b0319166001600160a01b0383169081179091556040519081527f7025c71a9fe60d709e71b377dc5f7c72c3e1d8539f8022574254e736ceca01e5906020015b60405180910390a150565b61073e611480565b60665481811681146107635760405163c61dca5d60e01b815260040160405180910390fd5b61076c82611523565b5050565b336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146107b95760405163f739589b60e01b815260040160405180910390fd5b6107c1611560565b6001600160a01b03831673beac0eeeeeeeeeeeeeeeeeeeeeeeeeeeeeebeac0146107fe57604051632711b74d60e11b815260040160405180910390fd5b6001600160a01b038416610825576040516339b190bb60e11b815260040160405180910390fd5b5f81136108455760405163ef147de160e01b815260040160405180910390fd5b6001600160a01b0384165f908152609b602052604081205490829082121561093f575f6108718361205a565b90505f8185111561088f5750806108888186612074565b9250610895565b505f9150835b5f6108a08286612087565b6001600160a01b038a165f818152609b60205260409081902083905551919250907f4e2b791dedccd9fb30141b088cabf5c14a8912b52f59375c95c010700b8c6193906108f09085815260200190565b60405180910390a2886001600160a01b03167fd4def76d6d2bed6f14d5cd9af73cc2913d618d00edde42432e81c09bfe0770988260405161093391815260200190565b60405180910390a25050505b80156109b7576001600160a01b038681165f81815260986020526040908190205490516362483a2160e11b81526004810192909252602482018490529091169063c4907442906044015b5f604051808303815f87803b1580156109a0575f5ffd5b505af11580156109b2573d5f5f3e3d5ffd5b505050505b50506109c3600160c955565b50505050565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614610a125760405163f739589b60e01b815260040160405180910390fd5b610a1a611560565b80609e5f828254610a2b91906120ae565b90915550506040518181527f1ed04b7fd262c0d9e50fa02957f32a81a151f03baaa367faeedc7521b001c4a49060200160405180910390a16109c3600160c955565b5f80336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614610ab85760405163f739589b60e01b815260040160405180910390fd5b610ac0611560565b6001600160a01b03841673beac0eeeeeeeeeeeeeeeeeeeeeeeeeeeeeebeac014610afd57604051632711b74d60e11b815260040160405180910390fd5b610b0785846115b9565b91509150610b15600160c955565b935093915050565b6060610b487f0000000000000000000000000000000000000000000000000000000000000000611700565b905090565b610b55611480565b610b5f5f19611523565b565b609f546001600160a01b03163314610b8c57604051630986113760e41b815260040160405180910390fd5b609f805467ffffffffffffffff60a01b1916600160a01b67ffffffffffffffff8416908102919091179091556040519081527f1bc8f042a52db3a437620dea4548f2031fb2a16dd8d3b0b854295528dd2cdd339060200161072b565b610bf0611426565b610b5f5f61173d565b5f336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614610c435760405163f739589b60e01b815260040160405180910390fd5b610c4b611560565b6001600160a01b03831673beac0eeeeeeeeeeeeeeeeeeeeeeeeeeeeeebeac014610c8857604051632711b74d60e11b815260040160405180910390fd5b5f610c928361178e565b6001600160a01b0386165f908152609b6020526040902054610cb491906120c1565b90505f811215610cd75760405163ef147de160e01b815260040160405180910390fd5b6001600160a01b0385165f818152609b602052604090819020839055517fd4def76d6d2bed6f14d5cd9af73cc2913d618d00edde42432e81c09bfe07709890610d239084815260200190565b60405180910390a29050610d37600160c955565b9392505050565b5f5f610d49816117f7565b610d51611560565b335f908152609860205260409020546001600160a01b031615610d875760405163031a852160e21b815260040160405180910390fd5b5f610d90611822565b925050610d9d600160c955565b5090565b5f610dab816117f7565b610db3611560565b335f908152609860205260409020546001600160a01b031680610ddb57610dd8611822565b90505b6040516326d3918d60e21b81526001600160a01b03821690639b4e4634903490610e11908b908b908b908b908b9060040161210f565b5f604051808303818588803b158015610e28575f5ffd5b505af1158015610e3a573d5f5f3e3d5ffd5b505050505050610e4a600160c955565b505050505050565b6001600160a01b038084165f908152609860205260409020548491163314610e8d576040516312e16d7160e11b815260040160405180910390fd5b610e95611560565b6001600160a01b038416610ebc576040516339b190bb60e11b815260040160405180910390fd5b610eca633b9aca008361215c565b15610ee8576040516347d072bb60e11b815260040160405180910390fd5b6001600160a01b0384165f908152609b602052604081205490811215610f2157604051634b692bcf60e01b815260040160405180910390fd5b5f831315610fe2575f5f610f3587866115b9565b604051631e328e7960e11b81526001600160a01b038a8116600483015273beac0eeeeeeeeeeeeeeeeeeeeeeeeeeeeeebeac0602483015260448201849052606482018390529294509092507f000000000000000000000000000000000000000000000000000000000000000090911690633c651cf2906084015f604051808303815f87803b158015610fc5575f5ffd5b505af1158015610fd7573d5f5f3e3d5ffd5b505050505050611068565b5f831215611068575f610ffe8686610ff98761205a565b61197d565b60405163305068e760e11b81526001600160a01b0388811660048301526024820185905267ffffffffffffffff831660448301529192507f0000000000000000000000000000000000000000000000000000000000000000909116906360a0d1ce90606401610989565b506109c3600160c955565b6001600160a01b038082165f908152609860205260408120549091168061113e5761113b836001600160a01b03165f1b60405180610940016040528061090e815260200161222161090e9139604080516001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000166020820152808201919091525f606082015260800160408051601f19818403018152908290526111209291602001612192565b60405160208183030381529060405280519060200120611a76565b90505b92915050565b6001600160a01b0381165f908152609d6020908152604080832081518083019092525460ff8116151580835261010090910467ffffffffffffffff16928201929092529061119a57670de0b6b3a7640000610d37565b6020015192915050565b5f54610100900460ff16158080156111c257505f54600160ff909116105b806111db5750303b1580156111db57505f5460ff166001145b6112435760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b60648201526084015b60405180910390fd5b5f805460ff191660011790558015611264575f805461ff0019166101001790555b61126d8361173d565b61127682611523565b80156112bb575f805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b505050565b6112c8611426565b6001600160a01b03811661132d5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b606482015260840161123a565b6113368161173d565b50565b611341611a82565b606654801982198116146113685760405163c61dca5d60e01b815260040160405180910390fd5b606682905560405182815233907f3582d1828e26bf56bd801502bc021ac0bc8afb57c826e4986b45593c8fad389c9060200160405180910390a25050565b5f6001600160a01b03821673beac0eeeeeeeeeeeeeeeeeeeeeeeeeeeeeebeac0146113e457604051632711b74d60e11b815260040160405180910390fd5b6001600160a01b0383165f908152609b60205260408120541261141e576001600160a01b0383165f908152609b602052604090205461113b565b505f92915050565b6033546001600160a01b03163314610b5f5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161123a565b60405163237dfb4760e11b81523360048201527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906346fbf68e90602401602060405180830381865afa1580156114e2573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061150691906121ae565b610b5f57604051631d77d47760e21b815260040160405180910390fd5b606681905560405181815233907fab40a374bc51de372200a8bc981af8c9ecdc08dfdaef0bb6e09f88f3c616ef3d9060200160405180910390a250565b600260c954036115b25760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604482015260640161123a565b600260c955565b5f806001600160a01b0384166115e2576040516339b190bb60e11b815260040160405180910390fd5b5f8312156116035760405163ef147de160e01b815260040160405180910390fd5b6001600160a01b0384165f908152609b602052604081205484916116278383612087565b6001600160a01b0388165f818152609b60205260409081902083905551919250907f4e2b791dedccd9fb30141b088cabf5c14a8912b52f59375c95c010700b8c6193906116779086815260200190565b60405180910390a2866001600160a01b03167fd4def76d6d2bed6f14d5cd9af73cc2913d618d00edde42432e81c09bfe077098826040516116ba91815260200190565b60405180910390a25f81136116d7575f5f945094505050506116f9565b5f8212156116ec575f945092506116f9915050565b5092508391506116f99050565b9250929050565b60605f61170c83611b33565b6040805160208082528183019092529192505f91906020820181803683375050509182525060208101929092525090565b603380546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a35050565b5f6001600160ff1b03821115610d9d5760405162461bcd60e51b815260206004820152602860248201527f53616665436173743a2076616c756520646f65736e27742066697420696e2061604482015267371034b73a191a9b60c11b606482015260840161123a565b606654600160ff83161b908116036113365760405163840a48d560e01b815260040160405180910390fd5b5f60995f8154611831906121cd565b9091555060408051610940810190915261090e8082525f916118ce91839133916122216020830139604080516001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000166020820152808201919091525f606082015260800160408051601f19818403018152908290526118ba9291602001612192565b604051602081830303815290604052611b5a565b60405163189acdbd60e31b81523360048201529091506001600160a01b0382169063c4d66de8906024015f604051808303815f87803b15801561190f575f5ffd5b505af1158015611921573d5f5f3e3d5ffd5b5050335f8181526098602052604080822080546001600160a01b0319166001600160a01b038816908117909155905192945092507f21c99d0db02213c32fff5b05cf0a718ab5f858802b91498f80d82270289d856a91a3919050565b5f806119898385612074565b90505f61199586611144565b90505f6119ad67ffffffffffffffff83168488611c5c565b90505f6119ba82846121e5565b6040805180820182526001815267ffffffffffffffff85811660208084018281526001600160a01b038f165f818152609d845287902095518654925168ffffffffffffffffff1990931690151568ffffffffffffffff001916176101009286169290920291909117909455845193845291881691830191909152918101919091529091507fb160ab8589bf47dc04ea11b50d46678d21590cea2ed3e454e7bd3e41510f98cf9060600160405180910390a1979650505050505050565b5f61113b838330611d41565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663eab66d7a6040518163ffffffff1660e01b8152600401602060405180830381865afa158015611ade573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611b029190612205565b6001600160a01b0316336001600160a01b031614610b5f5760405163794821ff60e01b815260040160405180910390fd5b5f60ff8216601f81111561113e57604051632cd44ac360e21b815260040160405180910390fd5b5f83471015611bab5760405162461bcd60e51b815260206004820152601d60248201527f437265617465323a20696e73756666696369656e742062616c616e6365000000604482015260640161123a565b81515f03611bfb5760405162461bcd60e51b815260206004820181905260248201527f437265617465323a2062797465636f6465206c656e677468206973207a65726f604482015260640161123a565b8282516020840186f590506001600160a01b038116610d375760405162461bcd60e51b815260206004820152601960248201527f437265617465323a204661696c6564206f6e206465706c6f7900000000000000604482015260640161123a565b5f80805f19858709858702925082811083820303915050805f03611c9357838281611c8957611c89612148565b0492505050610d37565b808411611cda5760405162461bcd60e51b81526020600482015260156024820152744d6174683a206d756c446976206f766572666c6f7760581b604482015260640161123a565b5f8486880960026001871981018816978890046003810283188082028403028082028403028082028403028082028403028082028403029081029092039091025f889003889004909101858311909403939093029303949094049190911702949350505050565b5f604051836040820152846020820152828152600b8101905060ff815360559020949350505050565b6001600160a01b0381168114611336575f5ffd5b5f60208284031215611d8e575f5ffd5b8135610d3781611d6a565b5f60208284031215611da9575f5ffd5b5035919050565b5f5f5f5f60808587031215611dc3575f5ffd5b8435611dce81611d6a565b93506020850135611dde81611d6a565b92506040850135611dee81611d6a565b9396929550929360600135925050565b5f5f5f5f84860360a0811215611e12575f5ffd5b6040811215611e1f575f5ffd5b50849350604084013592506060840135611e3881611d6a565b9396929550929360800135925050565b5f5f5f60608486031215611e5a575f5ffd5b8335611e6581611d6a565b92506020840135611e7581611d6a565b929592945050506040919091013590565b602081525f82518060208401528060208501604085015e5f604082850101526040601f19601f83011684010191505092915050565b5f60208284031215611ecb575f5ffd5b813567ffffffffffffffff81168114610d37575f5ffd5b5f60208284031215611ef2575f5ffd5b813560ff81168114610d37575f5ffd5b5f5f83601f840112611f12575f5ffd5b50813567ffffffffffffffff811115611f29575f5ffd5b6020830191508360208285010111156116f9575f5ffd5b5f5f5f5f5f60608688031215611f54575f5ffd5b853567ffffffffffffffff811115611f6a575f5ffd5b611f7688828901611f02565b909650945050602086013567ffffffffffffffff811115611f95575f5ffd5b611fa188828901611f02565b96999598509660400135949350505050565b5f5f5f60608486031215611fc5575f5ffd5b8335611fd081611d6a565b95602085013595506040909401359392505050565b5f5f60408385031215611ff6575f5ffd5b823561200181611d6a565b946020939093013593505050565b5f5f60408385031215612020575f5ffd5b823561202b81611d6a565b9150602083013561203b81611d6a565b809150509250929050565b634e487b7160e01b5f52601160045260245ffd5b5f600160ff1b820161206e5761206e612046565b505f0390565b8181038181111561113e5761113e612046565b8082018281125f8312801582168215821617156120a6576120a6612046565b505092915050565b8082018082111561113e5761113e612046565b8181035f8312801583831316838312821617156120e0576120e0612046565b5092915050565b81835281816020850137505f828201602090810191909152601f909101601f19169091010190565b606081525f6121226060830187896120e7565b82810360208401526121358186886120e7565b9150508260408301529695505050505050565b634e487b7160e01b5f52601260045260245ffd5b5f8261217657634e487b7160e01b5f52601260045260245ffd5b500790565b5f81518060208401855e5f93019283525090919050565b5f6121a66121a0838661217b565b8461217b565b949350505050565b5f602082840312156121be575f5ffd5b81518015158114610d37575f5ffd5b5f600182016121de576121de612046565b5060010190565b67ffffffffffffffff828116828216039081111561113e5761113e612046565b5f60208284031215612215575f5ffd5b8151610d3781611d6a56fe608060405260405161090e38038061090e83398101604081905261002291610460565b61002e82826000610035565b505061058a565b61003e83610100565b6040516001600160a01b038416907f1cf3b03a6cf19fa2baba4df148e9dcabedea7f8a5c07840e207e5c089be95d3e90600090a260008251118061007f5750805b156100fb576100f9836001600160a01b0316635c60da1b6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156100c5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906100e99190610520565b836102a360201b6100291760201c565b505b505050565b610113816102cf60201b6100551760201c565b6101725760405162461bcd60e51b815260206004820152602560248201527f455243313936373a206e657720626561636f6e206973206e6f74206120636f6e6044820152641d1c9858dd60da1b60648201526084015b60405180910390fd5b6101e6816001600160a01b0316635c60da1b6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156101b3573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906101d79190610520565b6102cf60201b6100551760201c565b61024b5760405162461bcd60e51b815260206004820152603060248201527f455243313936373a20626561636f6e20696d706c656d656e746174696f6e206960448201526f1cc81b9bdd08184818dbdb9d1c9858dd60821b6064820152608401610169565b806102827fa3f0ad74e5423aebfd80d3ef4346578335a9a72aeaee59ff6cb3582b35133d5060001b6102de60201b6100641760201c565b80546001600160a01b0319166001600160a01b039290921691909117905550565b60606102c883836040518060600160405280602781526020016108e7602791396102e1565b9392505050565b6001600160a01b03163b151590565b90565b6060600080856001600160a01b0316856040516102fe919061053b565b600060405180830381855af49150503d8060008114610339576040519150601f19603f3d011682016040523d82523d6000602084013e61033e565b606091505b5090925090506103508683838761035a565b9695505050505050565b606083156103c65782516103bf576001600160a01b0385163b6103bf5760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610169565b50816103d0565b6103d083836103d8565b949350505050565b8151156103e85781518083602001fd5b8060405162461bcd60e51b81526004016101699190610557565b80516001600160a01b038116811461041957600080fd5b919050565b634e487b7160e01b600052604160045260246000fd5b60005b8381101561044f578181015183820152602001610437565b838111156100f95750506000910152565b6000806040838503121561047357600080fd5b61047c83610402565b60208401519092506001600160401b038082111561049957600080fd5b818501915085601f8301126104ad57600080fd5b8151818111156104bf576104bf61041e565b604051601f8201601f19908116603f011681019083821181831017156104e7576104e761041e565b8160405282815288602084870101111561050057600080fd5b610511836020830160208801610434565b80955050505050509250929050565b60006020828403121561053257600080fd5b6102c882610402565b6000825161054d818460208701610434565b9190910192915050565b6020815260008251806020840152610576816040850160208701610434565b601f01601f19169190910160400192915050565b61034e806105996000396000f3fe60806040523661001357610011610017565b005b6100115b610027610022610067565b610100565b565b606061004e83836040518060600160405280602781526020016102f260279139610124565b9392505050565b6001600160a01b03163b151590565b90565b600061009a7fa3f0ad74e5423aebfd80d3ef4346578335a9a72aeaee59ff6cb3582b35133d50546001600160a01b031690565b6001600160a01b0316635c60da1b6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156100d7573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906100fb9190610249565b905090565b3660008037600080366000845af43d6000803e80801561011f573d6000f35b3d6000fd5b6060600080856001600160a01b03168560405161014191906102a2565b600060405180830381855af49150503d806000811461017c576040519150601f19603f3d011682016040523d82523d6000602084013e610181565b606091505b50915091506101928683838761019c565b9695505050505050565b6060831561020d578251610206576001600160a01b0385163b6102065760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e747261637400000060448201526064015b60405180910390fd5b5081610217565b610217838361021f565b949350505050565b81511561022f5781518083602001fd5b8060405162461bcd60e51b81526004016101fd91906102be565b60006020828403121561025b57600080fd5b81516001600160a01b038116811461004e57600080fd5b60005b8381101561028d578181015183820152602001610275565b8381111561029c576000848401525b50505050565b600082516102b4818460208701610272565b9190910192915050565b60208152600082518060208401526102dd816040850160208701610272565b601f01601f1916919091016040019291505056fe416464726573733a206c6f772d6c6576656c2064656c65676174652063616c6c206661696c6564a2646970667358221220d51e81d3bc5ed20a26aeb05dce7e825c503b2061aa78628027300c8d65b9d89a64736f6c634300080c0033416464726573733a206c6f772d6c6576656c2064656c65676174652063616c6c206661696c6564a26469706673582212200fdd61faaceeb328ec0077dd560195e8ab3b7f96c33b1a12a23d282e72308e9264736f6c634300081b0033",
}
⋮----
// 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, _version string) (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)
⋮----
// Version is a free data retrieval call binding the contract method 0x54fd4d50.
⋮----
// Solidity: function version() view returns(string)
func (_EigenPodManager *EigenPodManagerCaller) 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 (_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\":\"version\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"string\",\"internalType\":\"string\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"withdrawSharesAsTokens\",\"inputs\":[{\"name\":\"staker\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"strategy\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"},{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"contractIERC20\"},{\"name\":\"shares\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"event\",\"name\":\"BeaconChainETHDeposited\",\"inputs\":[{\"name\":\"podOwner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"BeaconChainETHWithdrawalCompleted\",\"inputs\":[{\"name\":\"podOwner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"shares\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"nonce\",\"type\":\"uint96\",\"indexed\":false,\"internalType\":\"uint96\"},{\"name\":\"delegatedAddress\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"},{\"name\":\"withdrawer\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"},{\"name\":\"withdrawalRoot\",\"type\":\"bytes32\",\"indexed\":false,\"internalType\":\"bytes32\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"BeaconChainSlashingFactorDecreased\",\"inputs\":[{\"name\":\"staker\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"},{\"name\":\"prevBeaconChainSlashingFactor\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"},{\"name\":\"newBeaconChainSlashingFactor\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"BurnableETHSharesIncreased\",\"inputs\":[{\"name\":\"shares\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"NewTotalShares\",\"inputs\":[{\"name\":\"podOwner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"newTotalShares\",\"type\":\"int256\",\"indexed\":false,\"internalType\":\"int256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Paused\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"newPausedStatus\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"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)
⋮----
// Version is a free data retrieval call binding the contract method 0x54fd4d50.
⋮----
// Solidity: function version() view returns(string)
func (_EigenPodManagerStorage *EigenPodManagerStorageCaller) 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 (_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\":\"version\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"string\",\"internalType\":\"string\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"withdrawRestakedBeaconChainETH\",\"inputs\":[{\"name\":\"recipient\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"withdrawableRestakedExecutionLayerGwei\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"stateMutability\":\"view\"},{\"type\":\"event\",\"name\":\"CheckpointCreated\",\"inputs\":[{\"name\":\"checkpointTimestamp\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"},{\"name\":\"beaconBlockRoot\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"validatorCount\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"CheckpointFinalized\",\"inputs\":[{\"name\":\"checkpointTimestamp\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"},{\"name\":\"totalShareDeltaWei\",\"type\":\"int256\",\"indexed\":false,\"internalType\":\"int256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ConsolidationRequested\",\"inputs\":[{\"name\":\"sourcePubkeyHash\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"targetPubkeyHash\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"EigenPodStaked\",\"inputs\":[{\"name\":\"pubkeyHash\",\"type\":\"bytes32\",\"indexed\":false,\"internalType\":\"bytes32\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ExitRequested\",\"inputs\":[{\"name\":\"validatorPubkeyHash\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"NonBeaconChainETHReceived\",\"inputs\":[{\"name\":\"amountReceived\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ProofSubmitterUpdated\",\"inputs\":[{\"name\":\"prevProofSubmitter\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"},{\"name\":\"newProofSubmitter\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"RestakedBeaconChainETHWithdrawn\",\"inputs\":[{\"name\":\"recipient\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"SwitchToCompoundingRequested\",\"inputs\":[{\"name\":\"validatorPubkeyHash\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ValidatorBalanceUpdated\",\"inputs\":[{\"name\":\"pubkeyHash\",\"type\":\"bytes32\",\"indexed\":false,\"internalType\":\"bytes32\"},{\"name\":\"balanceTimestamp\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"},{\"name\":\"newValidatorBalanceGwei\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ValidatorCheckpointed\",\"inputs\":[{\"name\":\"checkpointTimestamp\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"},{\"name\":\"pubkeyHash\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ValidatorRestaked\",\"inputs\":[{\"name\":\"pubkeyHash\",\"type\":\"bytes32\",\"indexed\":false,\"internalType\":\"bytes32\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ValidatorWithdrawn\",\"inputs\":[{\"name\":\"checkpointTimestamp\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"},{\"name\":\"pubkeyHash\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"WithdrawalRequested\",\"inputs\":[{\"name\":\"validatorPubkeyHash\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"withdrawalAmountGwei\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"}],\"anonymous\":false},{\"type\":\"error\",\"name\":\"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)
⋮----
// Version is a free data retrieval call binding the contract method 0x54fd4d50.
⋮----
// Solidity: function version() view returns(string)
func (_EigenPodStorage *EigenPodStorageCaller) Version(opts *bind.CallOpts) (string, error)
⋮----
// 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\"},{\"name\":\"_version\",\"type\":\"string\",\"internalType\":\"string\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"EIGEN\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIEigen\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"deposit\",\"inputs\":[{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"contractIERC20\"},{\"name\":\"amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"newShares\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"explanation\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"string\",\"internalType\":\"string\"}],\"stateMutability\":\"pure\"},{\"type\":\"function\",\"name\":\"initialize\",\"inputs\":[{\"name\":\"_EIGEN\",\"type\":\"address\",\"internalType\":\"contractIEigen\"},{\"name\":\"_bEIGEN\",\"type\":\"address\",\"internalType\":\"contractIERC20\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"initialize\",\"inputs\":[{\"name\":\"_underlyingToken\",\"type\":\"address\",\"internalType\":\"contractIERC20\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"pause\",\"inputs\":[{\"name\":\"newPausedStatus\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"pauseAll\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"paused\",\"inputs\":[{\"name\":\"index\",\"type\":\"uint8\",\"internalType\":\"uint8\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"paused\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"pauserRegistry\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIPauserRegistry\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"shares\",\"inputs\":[{\"name\":\"user\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"sharesToUnderlying\",\"inputs\":[{\"name\":\"amountShares\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"sharesToUnderlyingView\",\"inputs\":[{\"name\":\"amountShares\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"strategyManager\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIStrategyManager\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"totalShares\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"underlyingToShares\",\"inputs\":[{\"name\":\"amountUnderlying\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"underlyingToSharesView\",\"inputs\":[{\"name\":\"amountUnderlying\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"underlyingToken\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIERC20\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"unpause\",\"inputs\":[{\"name\":\"newPausedStatus\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"userUnderlying\",\"inputs\":[{\"name\":\"user\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"userUnderlyingView\",\"inputs\":[{\"name\":\"user\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"version\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"string\",\"internalType\":\"string\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"withdraw\",\"inputs\":[{\"name\":\"recipient\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"contractIERC20\"},{\"name\":\"amountShares\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"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\":\"InvalidShortString\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"MaxPerDepositExceedsMax\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"NewSharesZero\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"OnlyPauser\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"OnlyStrategyManager\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"OnlyUnderlyingToken\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"OnlyUnpauser\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"StringTooLong\",\"inputs\":[{\"name\":\"str\",\"type\":\"string\",\"internalType\":\"string\"}]},{\"type\":\"error\",\"name\":\"TotalSharesExceedsMax\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"WithdrawalAmountExceedsTotalDeposits\",\"inputs\":[]}]",
	Bin: "0x60e060405234801561000f575f5ffd5b5060405161181238038061181283398101604081905261002e916101bc565b82828280826001600160a01b03811661005a576040516339b190bb60e11b815260040160405180910390fd5b6001600160a01b031660805261006f81610093565b60a052506001600160a01b03831660c0526100886100d9565b5050505050506102ed565b5f5f829050601f815111156100c6578260405163305a27a960e01b81526004016100bd9190610292565b60405180910390fd5b80516100d1826102c7565b179392505050565b5f54610100900460ff16156101405760405162461bcd60e51b815260206004820152602760248201527f496e697469616c697a61626c653a20636f6e747261637420697320696e697469604482015266616c697a696e6760c81b60648201526084016100bd565b5f5460ff9081161461018f575f805460ff191660ff9081179091556040519081527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b565b6001600160a01b03811681146101a5575f5ffd5b50565b634e487b7160e01b5f52604160045260245ffd5b5f5f5f606084860312156101ce575f5ffd5b83516101d981610191565b60208501519093506101ea81610191565b60408501519092506001600160401b03811115610205575f5ffd5b8401601f81018613610215575f5ffd5b80516001600160401b0381111561022e5761022e6101a8565b604051601f8201601f19908116603f011681016001600160401b038111828210171561025c5761025c6101a8565b604052818152828201602001881015610273575f5ffd5b8160208401602083015e5f602083830101528093505050509250925092565b602081525f82518060208401528060208501604085015e5f604082850101526040601f19601f83011684010191505092915050565b805160208083015191908110156102e7575f198160200360031b1b821691505b50919050565b60805160a05160c0516114d861033a5f395f8181610196015281816103990152818161076101526107e301525f6105a401525f8181610274015281816109910152610eca01526114d85ff3fe608060405234801561000f575f5ffd5b5060043610610148575f3560e01c80637a8b2637116100bf578063ce7c2ac211610079578063ce7c2ac2146102d7578063d9caed12146102ea578063e3dae51c146102fd578063f3e7387514610310578063fabc1cbc14610323578063fdc371ce14610336575f5ffd5b80637a8b26371461025c578063886f11951461026f5780638c871019146102965780638f6a6240146102a9578063ab5921e1146102bc578063c4d66de8146102c4575f5ffd5b8063485cc95511610110578063485cc955146101e257806354fd4d50146101f5578063553ca5f81461020a578063595c6a671461021d5780635ac86ab7146102255780635c975abb14610254575f5ffd5b8063136439dd1461014c5780632495a5991461016157806339b70e38146101915780633a98ef39146101b857806347e7ef24146101cf575b5f5ffd5b61015f61015a3660046111cb565b610349565b005b603254610174906001600160a01b031681565b6040516001600160a01b0390911681526020015b60405180910390f35b6101747f000000000000000000000000000000000000000000000000000000000000000081565b6101c160335481565b604051908152602001610188565b6101c16101dd3660046111f6565b610383565b61015f6101f0366004611220565b6104b2565b6101fd61059d565b6040516101889190611257565b6101c161021836600461128c565b6105cd565b61015f6105e0565b6102446102333660046112bc565b6001805460ff9092161b9081161490565b6040519015158152602001610188565b6001546101c1565b6101c161026a3660046111cb565b6105f4565b6101747f000000000000000000000000000000000000000000000000000000000000000081565b6101c16102a43660046111cb565b61063d565b6101c16102b736600461128c565b610647565b6101fd610654565b61015f6102d236600461128c565b610674565b6101c16102e536600461128c565b61073a565b6101c16102f83660046112d7565b6107cc565b6101c161030b3660046111cb565b6108ce565b6101c161031e3660046111cb565b610905565b61015f6103313660046111cb565b61090f565b606454610174906001600160a01b031681565b61035161097c565b60015481811681146103765760405163c61dca5d60e01b815260040160405180910390fd5b61037f82610a1f565b5050565b5f5f61038e81610a5c565b336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146103d7576040516348da714f60e01b815260040160405180910390fd5b6103e18484610a92565b6033545f6103f16103e883611329565b90505f6103e86103ff610b4b565b6104099190611329565b90505f610416878361133c565b905080610423848961134f565b61042d9190611366565b9550855f0361044f57604051630c392ed360e11b815260040160405180910390fd5b6104598685611329565b60338190556f4b3b4ca85a86c47a098a223fffffffff101561048e57604051632f14e8a360e11b815260040160405180910390fd5b6104a7826103e86033546104a29190611329565b610bb5565b505050505092915050565b5f54610100900460ff16158080156104d057505f54600160ff909116105b806104e95750303b1580156104e957505f5460ff166001145b61050e5760405162461bcd60e51b815260040161050590611385565b60405180910390fd5b5f805460ff19166001179055801561052f575f805461ff0019166101001790555b606480546001600160a01b0319166001600160a01b03851617905561055382610c01565b8015610598575f805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b505050565b60606105c87f0000000000000000000000000000000000000000000000000000000000000000610d4c565b905090565b5f6105da61026a8361073a565b92915050565b6105e861097c565b6105f25f19610a1f565b565b5f5f6103e86033546106069190611329565b90505f6103e8610614610b4b565b61061e9190611329565b90508161062b858361134f565b6106359190611366565b949350505050565b5f6105da826108ce565b5f6105da61031e8361073a565b60606040518060800160405280604d8152602001611456604d9139905090565b5f54610100900460ff161580801561069257505f54600160ff909116105b806106ab5750303b1580156106ab57505f5460ff166001145b6106c75760405162461bcd60e51b815260040161050590611385565b5f805460ff1916600117905580156106e8575f805461ff0019166101001790555b6106f182610c01565b801561037f575f805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb3847402498906020015b60405180910390a15050565b60405163fe243a1760e01b81526001600160a01b0382811660048301523060248301525f917f00000000000000000000000000000000000000000000000000000000000000009091169063fe243a1790604401602060405180830381865afa1580156107a8573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906105da91906113d3565b5f60016107d881610a5c565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614610821576040516348da714f60e01b815260040160405180910390fd5b61082c858585610d89565b6033548084111561085057604051630b469df360e41b815260040160405180910390fd5b5f61085d6103e883611329565b90505f6103e861086b610b4b565b6108759190611329565b905081610882878361134f565b61088c9190611366565b9450610898868461133c565b6033556108b86108a8868361133c565b6103e86033546104a29190611329565b6108c3888887610dcf565b505050509392505050565b5f5f6103e86033546108e09190611329565b90505f6103e86108ee610b4b565b6108f89190611329565b90508061062b838661134f565b5f6105da826105f4565b610917610ec8565b6001548019821981161461093e5760405163c61dca5d60e01b815260040160405180910390fd5b600182905560405182815233907f3582d1828e26bf56bd801502bc021ac0bc8afb57c826e4986b45593c8fad389c9060200160405180910390a25050565b60405163237dfb4760e11b81523360048201527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906346fbf68e90602401602060405180830381865afa1580156109de573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610a0291906113ea565b6105f257604051631d77d47760e21b815260040160405180910390fd5b600181905560405181815233907fab40a374bc51de372200a8bc981af8c9ecdc08dfdaef0bb6e09f88f3c616ef3d9060200160405180910390a250565b610a71816001805460ff9092161b9081161490565b15610a8f5760405163840a48d560e01b815260040160405180910390fd5b50565b6032546001600160a01b0383811691161480610abb57506064546001600160a01b038381169116145b610ad857604051630312abdd60e61b815260040160405180910390fd5b6064546001600160a01b039081169083160361037f57606454604051636f074d1f60e11b8152600481018390526001600160a01b039091169063de0e9a3e906024015f604051808303815f87803b158015610b31575f5ffd5b505af1158015610b43573d5f5f3e3d5ffd5b505050505050565b6032546040516370a0823160e01b81523060048201525f916001600160a01b0316906370a0823190602401602060405180830381865afa158015610b91573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906105c891906113d3565b7fd2494f3479e5da49d386657c292c610b5b01df313d07c62eb0cfa49924a31be881610be984670de0b6b3a764000061134f565b610bf39190611366565b60405190815260200161072e565b5f54610100900460ff16610c6b5760405162461bcd60e51b815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201526a6e697469616c697a696e6760a81b6064820152608401610505565b603280546001600160a01b0319166001600160a01b038316179055610c8f5f610a1f565b7f1c540707b00eb5427b6b774fc799d756516a54aee108b64b327acc55af55750760325f9054906101000a90046001600160a01b0316826001600160a01b031663313ce5676040518163ffffffff1660e01b8152600401602060405180830381865afa158015610d01573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610d259190611409565b604080516001600160a01b03909316835260ff90911660208301520160405180910390a150565b60605f610d5883610f79565b6040805160208082528183019092529192505f91906020820181803683375050509182525060208101929092525090565b6032546001600160a01b0383811691161480610db257506064546001600160a01b038381169116145b61059857604051630312abdd60e61b815260040160405180910390fd5b6064546001600160a01b0390811690831603610eb45760325460405163095ea7b360e01b81526001600160a01b038481166004830152602482018490529091169063095ea7b3906044016020604051808303815f875af1158015610e35573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610e5991906113ea565b50606454604051630ea598cb60e41b8152600481018390526001600160a01b039091169063ea598cb0906024015f604051808303815f87803b158015610e9d575f5ffd5b505af1158015610eaf573d5f5f3e3d5ffd5b505050505b6105986001600160a01b0383168483610fa0565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663eab66d7a6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610f24573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610f489190611424565b6001600160a01b0316336001600160a01b0316146105f25760405163794821ff60e01b815260040160405180910390fd5b5f60ff8216601f8111156105da57604051632cd44ac360e21b815260040160405180910390fd5b604080516001600160a01b03848116602483015260448083018590528351808403909101815260649092018352602080830180516001600160e01b031663a9059cbb60e01b17905283518085019094528084527f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c656490840152610598928692915f9161102f9185169084906110ae565b905080515f148061104f57508080602001905181019061104f91906113ea565b6105985760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b6064820152608401610505565b606061063584845f85855f5f866001600160a01b031685876040516110d3919061143f565b5f6040518083038185875af1925050503d805f811461110d576040519150601f19603f3d011682016040523d82523d5f602084013e611112565b606091505b50915091506111238783838761112e565b979650505050505050565b6060831561119c5782515f03611195576001600160a01b0385163b6111955760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610505565b5081610635565b61063583838151156111b15781518083602001fd5b8060405162461bcd60e51b81526004016105059190611257565b5f602082840312156111db575f5ffd5b5035919050565b6001600160a01b0381168114610a8f575f5ffd5b5f5f60408385031215611207575f5ffd5b8235611212816111e2565b946020939093013593505050565b5f5f60408385031215611231575f5ffd5b823561123c816111e2565b9150602083013561124c816111e2565b809150509250929050565b602081525f82518060208401528060208501604085015e5f604082850101526040601f19601f83011684010191505092915050565b5f6020828403121561129c575f5ffd5b81356112a7816111e2565b9392505050565b60ff81168114610a8f575f5ffd5b5f602082840312156112cc575f5ffd5b81356112a7816112ae565b5f5f5f606084860312156112e9575f5ffd5b83356112f4816111e2565b92506020840135611304816111e2565b929592945050506040919091013590565b634e487b7160e01b5f52601160045260245ffd5b808201808211156105da576105da611315565b818103818111156105da576105da611315565b80820281158282048414176105da576105da611315565b5f8261138057634e487b7160e01b5f52601260045260245ffd5b500490565b6020808252602e908201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160408201526d191e481a5b9a5d1a585b1a5e995960921b606082015260800190565b5f602082840312156113e3575f5ffd5b5051919050565b5f602082840312156113fa575f5ffd5b815180151581146112a7575f5ffd5b5f60208284031215611419575f5ffd5b81516112a7816112ae565b5f60208284031215611434575f5ffd5b81516112a7816111e2565b5f82518060208501845e5f92019182525091905056fe4261736520537472617465677920696d706c656d656e746174696f6e20746f20696e68657269742066726f6d20666f72206d6f726520636f6d706c657820696d706c656d656e746174696f6e73a2646970667358221220c126ee3ed65facb14cfa4c4b374d2894a7baff78f9620a242b72eb3bfcaf3f8564736f6c634300081b0033",
}
⋮----
// 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, _version string) (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)
⋮----
// Version is a free data retrieval call binding the contract method 0x54fd4d50.
⋮----
// Solidity: function version() view returns(string)
func (_EigenStrategy *EigenStrategyCaller) Version(opts *bind.CallOpts) (string, error)
⋮----
// 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/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: "0x60556032600b8282823980515f1a607314602657634e487b7160e01b5f525f60045260245ffd5b305f52607381538281f3fe730000000000000000000000000000000000000000301460806040525f5ffdfea26469706673582212204ec75bb4eedbcfc4e0d885385a5d7631856fe4e8cc7c998d6111857c16d9e75164736f6c634300081b0033",
}
⋮----
// 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
}
⋮----
// 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\":\"DEALLOCATION_DELAY\",\"inputs\":[],\"outputs\":[{\"name\":\"delay\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"addStrategiesToOperatorSet\",\"inputs\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"operatorSetId\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"strategies\",\"type\":\"address[]\",\"internalType\":\"contractIStrategy[]\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"clearDeallocationQueue\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"strategies\",\"type\":\"address[]\",\"internalType\":\"contractIStrategy[]\"},{\"name\":\"numToClear\",\"type\":\"uint16[]\",\"internalType\":\"uint16[]\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"createOperatorSets\",\"inputs\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"params\",\"type\":\"tuple[]\",\"internalType\":\"structIAllocationManagerTypes.CreateSetParams[]\",\"components\":[{\"name\":\"operatorSetId\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"strategies\",\"type\":\"address[]\",\"internalType\":\"contractIStrategy[]\"}]}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"createRedistributingOperatorSets\",\"inputs\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"params\",\"type\":\"tuple[]\",\"internalType\":\"structIAllocationManagerTypes.CreateSetParams[]\",\"components\":[{\"name\":\"operatorSetId\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"strategies\",\"type\":\"address[]\",\"internalType\":\"contractIStrategy[]\"}]},{\"name\":\"redistributionRecipients\",\"type\":\"address[]\",\"internalType\":\"address[]\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"deregisterFromOperatorSets\",\"inputs\":[{\"name\":\"params\",\"type\":\"tuple\",\"internalType\":\"structIAllocationManagerTypes.DeregisterParams\",\"components\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"operatorSetIds\",\"type\":\"uint32[]\",\"internalType\":\"uint32[]\"}]}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"getAVSRegistrar\",\"inputs\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIAVSRegistrar\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getAllocatableMagnitude\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"strategy\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getAllocatedSets\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"tuple[]\",\"internalType\":\"structOperatorSet[]\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getAllocatedStake\",\"inputs\":[{\"name\":\"operatorSet\",\"type\":\"tuple\",\"internalType\":\"structOperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]},{\"name\":\"operators\",\"type\":\"address[]\",\"internalType\":\"address[]\"},{\"name\":\"strategies\",\"type\":\"address[]\",\"internalType\":\"contractIStrategy[]\"}],\"outputs\":[{\"name\":\"slashableStake\",\"type\":\"uint256[][]\",\"internalType\":\"uint256[][]\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getAllocatedStrategies\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"operatorSet\",\"type\":\"tuple\",\"internalType\":\"structOperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]}],\"outputs\":[{\"name\":\"\",\"type\":\"address[]\",\"internalType\":\"contractIStrategy[]\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getAllocation\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"operatorSet\",\"type\":\"tuple\",\"internalType\":\"structOperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]},{\"name\":\"strategy\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"}],\"outputs\":[{\"name\":\"\",\"type\":\"tuple\",\"internalType\":\"structIAllocationManagerTypes.Allocation\",\"components\":[{\"name\":\"currentMagnitude\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"pendingDiff\",\"type\":\"int128\",\"internalType\":\"int128\"},{\"name\":\"effectBlock\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getAllocationDelay\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"isSet\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"delay\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getAllocations\",\"inputs\":[{\"name\":\"operators\",\"type\":\"address[]\",\"internalType\":\"address[]\"},{\"name\":\"operatorSet\",\"type\":\"tuple\",\"internalType\":\"structOperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]},{\"name\":\"strategy\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"}],\"outputs\":[{\"name\":\"\",\"type\":\"tuple[]\",\"internalType\":\"structIAllocationManagerTypes.Allocation[]\",\"components\":[{\"name\":\"currentMagnitude\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"pendingDiff\",\"type\":\"int128\",\"internalType\":\"int128\"},{\"name\":\"effectBlock\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getEncumberedMagnitude\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"strategy\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getMaxMagnitude\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"strategy\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getMaxMagnitudes\",\"inputs\":[{\"name\":\"operators\",\"type\":\"address[]\",\"internalType\":\"address[]\"},{\"name\":\"strategy\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint64[]\",\"internalType\":\"uint64[]\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getMaxMagnitudes\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"strategies\",\"type\":\"address[]\",\"internalType\":\"contractIStrategy[]\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint64[]\",\"internalType\":\"uint64[]\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getMaxMagnitudesAtBlock\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"strategies\",\"type\":\"address[]\",\"internalType\":\"contractIStrategy[]\"},{\"name\":\"blockNumber\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint64[]\",\"internalType\":\"uint64[]\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getMemberCount\",\"inputs\":[{\"name\":\"operatorSet\",\"type\":\"tuple\",\"internalType\":\"structOperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getMembers\",\"inputs\":[{\"name\":\"operatorSet\",\"type\":\"tuple\",\"internalType\":\"structOperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]}],\"outputs\":[{\"name\":\"operators\",\"type\":\"address[]\",\"internalType\":\"address[]\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getMinimumSlashableStake\",\"inputs\":[{\"name\":\"operatorSet\",\"type\":\"tuple\",\"internalType\":\"structOperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]},{\"name\":\"operators\",\"type\":\"address[]\",\"internalType\":\"address[]\"},{\"name\":\"strategies\",\"type\":\"address[]\",\"internalType\":\"contractIStrategy[]\"},{\"name\":\"futureBlock\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"outputs\":[{\"name\":\"slashableStake\",\"type\":\"uint256[][]\",\"internalType\":\"uint256[][]\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getOperatorSetCount\",\"inputs\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getRedistributionRecipient\",\"inputs\":[{\"name\":\"operatorSet\",\"type\":\"tuple\",\"internalType\":\"structOperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]}],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getRegisteredSets\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"operatorSets\",\"type\":\"tuple[]\",\"internalType\":\"structOperatorSet[]\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getSlashCount\",\"inputs\":[{\"name\":\"operatorSet\",\"type\":\"tuple\",\"internalType\":\"structOperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getStrategiesInOperatorSet\",\"inputs\":[{\"name\":\"operatorSet\",\"type\":\"tuple\",\"internalType\":\"structOperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]}],\"outputs\":[{\"name\":\"strategies\",\"type\":\"address[]\",\"internalType\":\"contractIStrategy[]\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getStrategyAllocations\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"strategy\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"}],\"outputs\":[{\"name\":\"\",\"type\":\"tuple[]\",\"internalType\":\"structOperatorSet[]\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]},{\"name\":\"\",\"type\":\"tuple[]\",\"internalType\":\"structIAllocationManagerTypes.Allocation[]\",\"components\":[{\"name\":\"currentMagnitude\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"pendingDiff\",\"type\":\"int128\",\"internalType\":\"int128\"},{\"name\":\"effectBlock\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"initialize\",\"inputs\":[{\"name\":\"initialPausedStatus\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"isMemberOfOperatorSet\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"operatorSet\",\"type\":\"tuple\",\"internalType\":\"structOperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"isOperatorRedistributable\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"isOperatorSet\",\"inputs\":[{\"name\":\"operatorSet\",\"type\":\"tuple\",\"internalType\":\"structOperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"isOperatorSlashable\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"operatorSet\",\"type\":\"tuple\",\"internalType\":\"structOperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"isRedistributingOperatorSet\",\"inputs\":[{\"name\":\"operatorSet\",\"type\":\"tuple\",\"internalType\":\"structOperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"modifyAllocations\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"params\",\"type\":\"tuple[]\",\"internalType\":\"structIAllocationManagerTypes.AllocateParams[]\",\"components\":[{\"name\":\"operatorSet\",\"type\":\"tuple\",\"internalType\":\"structOperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]},{\"name\":\"strategies\",\"type\":\"address[]\",\"internalType\":\"contractIStrategy[]\"},{\"name\":\"newMagnitudes\",\"type\":\"uint64[]\",\"internalType\":\"uint64[]\"}]}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"registerForOperatorSets\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"params\",\"type\":\"tuple\",\"internalType\":\"structIAllocationManagerTypes.RegisterParams\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"operatorSetIds\",\"type\":\"uint32[]\",\"internalType\":\"uint32[]\"},{\"name\":\"data\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"removeStrategiesFromOperatorSet\",\"inputs\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"operatorSetId\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"strategies\",\"type\":\"address[]\",\"internalType\":\"contractIStrategy[]\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"setAVSRegistrar\",\"inputs\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"registrar\",\"type\":\"address\",\"internalType\":\"contractIAVSRegistrar\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"setAllocationDelay\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"delay\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"slashOperator\",\"inputs\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"params\",\"type\":\"tuple\",\"internalType\":\"structIAllocationManagerTypes.SlashingParams\",\"components\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"operatorSetId\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"strategies\",\"type\":\"address[]\",\"internalType\":\"contractIStrategy[]\"},{\"name\":\"wadsToSlash\",\"type\":\"uint256[]\",\"internalType\":\"uint256[]\"},{\"name\":\"description\",\"type\":\"string\",\"internalType\":\"string\"}]}],\"outputs\":[{\"name\":\"slashId\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"shares\",\"type\":\"uint256[]\",\"internalType\":\"uint256[]\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"updateAVSMetadataURI\",\"inputs\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"metadataURI\",\"type\":\"string\",\"internalType\":\"string\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"version\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"string\",\"internalType\":\"string\"}],\"stateMutability\":\"view\"},{\"type\":\"event\",\"name\":\"AVSMetadataURIUpdated\",\"inputs\":[{\"name\":\"avs\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"metadataURI\",\"type\":\"string\",\"indexed\":false,\"internalType\":\"string\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"AVSRegistrarSet\",\"inputs\":[{\"name\":\"avs\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"},{\"name\":\"registrar\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"contractIAVSRegistrar\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"AllocationDelaySet\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"},{\"name\":\"delay\",\"type\":\"uint32\",\"indexed\":false,\"internalType\":\"uint32\"},{\"name\":\"effectBlock\",\"type\":\"uint32\",\"indexed\":false,\"internalType\":\"uint32\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"AllocationUpdated\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"},{\"name\":\"operatorSet\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structOperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]},{\"name\":\"strategy\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"contractIStrategy\"},{\"name\":\"magnitude\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"},{\"name\":\"effectBlock\",\"type\":\"uint32\",\"indexed\":false,\"internalType\":\"uint32\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"EncumberedMagnitudeUpdated\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"},{\"name\":\"strategy\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"contractIStrategy\"},{\"name\":\"encumberedMagnitude\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"MaxMagnitudeUpdated\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"},{\"name\":\"strategy\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"contractIStrategy\"},{\"name\":\"maxMagnitude\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"OperatorAddedToOperatorSet\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"operatorSet\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structOperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"OperatorRemovedFromOperatorSet\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"operatorSet\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structOperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"OperatorSetCreated\",\"inputs\":[{\"name\":\"operatorSet\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structOperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"OperatorSlashed\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"},{\"name\":\"operatorSet\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structOperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]},{\"name\":\"strategies\",\"type\":\"address[]\",\"indexed\":false,\"internalType\":\"contractIStrategy[]\"},{\"name\":\"wadSlashed\",\"type\":\"uint256[]\",\"indexed\":false,\"internalType\":\"uint256[]\"},{\"name\":\"description\",\"type\":\"string\",\"indexed\":false,\"internalType\":\"string\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"RedistributionAddressSet\",\"inputs\":[{\"name\":\"operatorSet\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structOperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]},{\"name\":\"redistributionRecipient\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"StrategyAddedToOperatorSet\",\"inputs\":[{\"name\":\"operatorSet\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structOperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]},{\"name\":\"strategy\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"contractIStrategy\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"StrategyRemovedFromOperatorSet\",\"inputs\":[{\"name\":\"operatorSet\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structOperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]},{\"name\":\"strategy\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"contractIStrategy\"}],\"anonymous\":false},{\"type\":\"error\",\"name\":\"AlreadyMemberOfSet\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InputArrayLengthMismatch\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InsufficientMagnitude\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidAVSRegistrar\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidCaller\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidOperator\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidOperatorSet\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidRedistributionRecipient\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidStrategy\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidWadToSlash\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ModificationAlreadyPending\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"NonexistentAVSMetadata\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"NotMemberOfSet\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"OperatorNotSlashable\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"SameMagnitude\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"StrategiesMustBeInAscendingOrder\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"StrategyAlreadyInOperatorSet\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"StrategyNotInOperatorSet\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"UninitializedAllocationDelay\",\"inputs\":[]}]",
}
⋮----
// IAllocationManagerABI is the input ABI used to generate the binding from.
// 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
⋮----
// 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)
⋮----
var out []interface{}
⋮----
// 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)
⋮----
// 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)
⋮----
// 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)
⋮----
// Version is a free data retrieval call binding the contract method 0x54fd4d50.
⋮----
// Solidity: function version() view returns(string)
func (_IAllocationManager *IAllocationManagerCaller) Version(opts *bind.CallOpts) (string, error)
⋮----
// 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)
⋮----
// 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)
⋮----
// 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)
⋮----
// 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)
⋮----
// 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)
⋮----
// 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)
⋮----
// 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)
⋮----
// 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)
⋮----
// 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)
````

## 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\":\"function\",\"name\":\"version\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"string\",\"internalType\":\"string\"}],\"stateMutability\":\"view\"},{\"type\":\"event\",\"name\":\"AVSMetadataURIUpdated\",\"inputs\":[{\"name\":\"avs\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"metadataURI\",\"type\":\"string\",\"indexed\":false,\"internalType\":\"string\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"OperatorAVSRegistrationStatusUpdated\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"avs\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"status\",\"type\":\"uint8\",\"indexed\":false,\"internalType\":\"enumIAVSDirectoryTypes.OperatorAVSRegistrationStatus\"}],\"anonymous\":false},{\"type\":\"error\",\"name\":\"InvalidSignature\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"OperatorAlreadyRegisteredToAVS\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"OperatorNotRegisteredToAVS\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"OperatorNotRegisteredToEigenLayer\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"SaltSpent\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"SignatureExpired\",\"inputs\":[]}]",
}
⋮----
// IAVSDirectoryABI is the input ABI used to generate the binding from.
// 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)
⋮----
// Version is a free data retrieval call binding the contract method 0x54fd4d50.
⋮----
// Solidity: function version() view returns(string)
func (_IAVSDirectory *IAVSDirectoryCaller) Version(opts *bind.CallOpts) (string, error)
⋮----
// 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\":\"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)
⋮----
// 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\":\"function\",\"name\":\"version\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"string\",\"internalType\":\"string\"}],\"stateMutability\":\"view\"},{\"type\":\"event\",\"name\":\"DelegationApproverUpdated\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"newDelegationApprover\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"DepositScalingFactorUpdated\",\"inputs\":[{\"name\":\"staker\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"},{\"name\":\"strategy\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"contractIStrategy\"},{\"name\":\"newDepositScalingFactor\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"OperatorMetadataURIUpdated\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"metadataURI\",\"type\":\"string\",\"indexed\":false,\"internalType\":\"string\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"OperatorRegistered\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"delegationApprover\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"OperatorSharesDecreased\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"staker\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"},{\"name\":\"strategy\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"contractIStrategy\"},{\"name\":\"shares\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"OperatorSharesIncreased\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"staker\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"},{\"name\":\"strategy\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"contractIStrategy\"},{\"name\":\"shares\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"OperatorSharesSlashed\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"strategy\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"contractIStrategy\"},{\"name\":\"totalSlashedShares\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"SlashingWithdrawalCompleted\",\"inputs\":[{\"name\":\"withdrawalRoot\",\"type\":\"bytes32\",\"indexed\":false,\"internalType\":\"bytes32\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"SlashingWithdrawalQueued\",\"inputs\":[{\"name\":\"withdrawalRoot\",\"type\":\"bytes32\",\"indexed\":false,\"internalType\":\"bytes32\"},{\"name\":\"withdrawal\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structIDelegationManagerTypes.Withdrawal\",\"components\":[{\"name\":\"staker\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"delegatedTo\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"withdrawer\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"nonce\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"startBlock\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"strategies\",\"type\":\"address[]\",\"internalType\":\"contractIStrategy[]\"},{\"name\":\"scaledShares\",\"type\":\"uint256[]\",\"internalType\":\"uint256[]\"}]},{\"name\":\"sharesToWithdraw\",\"type\":\"uint256[]\",\"indexed\":false,\"internalType\":\"uint256[]\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"StakerDelegated\",\"inputs\":[{\"name\":\"staker\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"operator\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"StakerForceUndelegated\",\"inputs\":[{\"name\":\"staker\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"operator\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"StakerUndelegated\",\"inputs\":[{\"name\":\"staker\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"operator\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"error\",\"name\":\"ActivelyDelegated\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"CallerCannotUndelegate\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"FullySlashed\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InputArrayLengthMismatch\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InputArrayLengthZero\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidSignature\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"NotActivelyDelegated\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"OnlyAllocationManager\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"OnlyEigenPodManager\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"OnlyStrategyManagerOrEigenPodManager\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"OperatorNotRegistered\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"OperatorsCannotUndelegate\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"SaltSpent\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"SignatureExpired\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"WithdrawalDelayNotElapsed\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"WithdrawalNotQueued\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"WithdrawerNotCaller\",\"inputs\":[]}]",
}
⋮----
// IDelegationManagerABI is the input ABI used to generate the binding from.
// 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)
⋮----
// Version is a free data retrieval call binding the contract method 0x54fd4d50.
⋮----
// Solidity: function version() view returns(string)
func (_IDelegationManager *IDelegationManagerCaller) Version(opts *bind.CallOpts) (string, error)
⋮----
// 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/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\":\"version\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"string\",\"internalType\":\"string\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"withdrawRestakedBeaconChainETH\",\"inputs\":[{\"name\":\"recipient\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"withdrawableRestakedExecutionLayerGwei\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"stateMutability\":\"view\"},{\"type\":\"event\",\"name\":\"CheckpointCreated\",\"inputs\":[{\"name\":\"checkpointTimestamp\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"},{\"name\":\"beaconBlockRoot\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"validatorCount\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"CheckpointFinalized\",\"inputs\":[{\"name\":\"checkpointTimestamp\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"},{\"name\":\"totalShareDeltaWei\",\"type\":\"int256\",\"indexed\":false,\"internalType\":\"int256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ConsolidationRequested\",\"inputs\":[{\"name\":\"sourcePubkeyHash\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"targetPubkeyHash\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"EigenPodStaked\",\"inputs\":[{\"name\":\"pubkeyHash\",\"type\":\"bytes32\",\"indexed\":false,\"internalType\":\"bytes32\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ExitRequested\",\"inputs\":[{\"name\":\"validatorPubkeyHash\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"NonBeaconChainETHReceived\",\"inputs\":[{\"name\":\"amountReceived\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ProofSubmitterUpdated\",\"inputs\":[{\"name\":\"prevProofSubmitter\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"},{\"name\":\"newProofSubmitter\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"RestakedBeaconChainETHWithdrawn\",\"inputs\":[{\"name\":\"recipient\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"SwitchToCompoundingRequested\",\"inputs\":[{\"name\":\"validatorPubkeyHash\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ValidatorBalanceUpdated\",\"inputs\":[{\"name\":\"pubkeyHash\",\"type\":\"bytes32\",\"indexed\":false,\"internalType\":\"bytes32\"},{\"name\":\"balanceTimestamp\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"},{\"name\":\"newValidatorBalanceGwei\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ValidatorCheckpointed\",\"inputs\":[{\"name\":\"checkpointTimestamp\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"},{\"name\":\"pubkeyHash\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ValidatorRestaked\",\"inputs\":[{\"name\":\"pubkeyHash\",\"type\":\"bytes32\",\"indexed\":false,\"internalType\":\"bytes32\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ValidatorWithdrawn\",\"inputs\":[{\"name\":\"checkpointTimestamp\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"},{\"name\":\"pubkeyHash\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"WithdrawalRequested\",\"inputs\":[{\"name\":\"validatorPubkeyHash\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"withdrawalAmountGwei\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"}],\"anonymous\":false},{\"type\":\"error\",\"name\":\"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)
⋮----
// Version is a free data retrieval call binding the contract method 0x54fd4d50.
⋮----
// Solidity: function version() view returns(string)
func (_IEigenPod *IEigenPodCaller) Version(opts *bind.CallOpts) (string, error)
⋮----
// 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\":\"version\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"string\",\"internalType\":\"string\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"withdrawSharesAsTokens\",\"inputs\":[{\"name\":\"staker\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"strategy\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"},{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"contractIERC20\"},{\"name\":\"shares\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"event\",\"name\":\"BeaconChainETHDeposited\",\"inputs\":[{\"name\":\"podOwner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"BeaconChainETHWithdrawalCompleted\",\"inputs\":[{\"name\":\"podOwner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"shares\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"nonce\",\"type\":\"uint96\",\"indexed\":false,\"internalType\":\"uint96\"},{\"name\":\"delegatedAddress\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"},{\"name\":\"withdrawer\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"},{\"name\":\"withdrawalRoot\",\"type\":\"bytes32\",\"indexed\":false,\"internalType\":\"bytes32\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"BeaconChainSlashingFactorDecreased\",\"inputs\":[{\"name\":\"staker\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"},{\"name\":\"prevBeaconChainSlashingFactor\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"},{\"name\":\"newBeaconChainSlashingFactor\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"BurnableETHSharesIncreased\",\"inputs\":[{\"name\":\"shares\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"NewTotalShares\",\"inputs\":[{\"name\":\"podOwner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"newTotalShares\",\"type\":\"int256\",\"indexed\":false,\"internalType\":\"int256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Paused\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"newPausedStatus\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"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)
⋮----
// Version is a free data retrieval call binding the contract method 0x54fd4d50.
⋮----
// Solidity: function version() view returns(string)
func (_IEigenPodManager *IEigenPodManagerCaller) 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 (_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/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\":\"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\":\"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)
⋮----
// Version is a free data retrieval call binding the contract method 0x54fd4d50.
⋮----
// Solidity: function version() view returns(string)
func (_IKeyRegistrar *IKeyRegistrarCaller) 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 (_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\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"getAdmins\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"address[]\",\"internalType\":\"address[]\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getAppointeePermissions\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"appointee\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"address[]\",\"internalType\":\"address[]\"},{\"name\":\"\",\"type\":\"bytes4[]\",\"internalType\":\"bytes4[]\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"getAppointees\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"target\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"selector\",\"type\":\"bytes4\",\"internalType\":\"bytes4\"}],\"outputs\":[{\"name\":\"\",\"type\":\"address[]\",\"internalType\":\"address[]\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"getPendingAdmins\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"address[]\",\"internalType\":\"address[]\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"isAdmin\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"caller\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"isPendingAdmin\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"pendingAdmin\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"removeAdmin\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"admin\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"removeAppointee\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"appointee\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"target\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"selector\",\"type\":\"bytes4\",\"internalType\":\"bytes4\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"removePendingAdmin\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"admin\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"setAppointee\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"appointee\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"target\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"selector\",\"type\":\"bytes4\",\"internalType\":\"bytes4\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"version\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"string\",\"internalType\":\"string\"}],\"stateMutability\":\"view\"},{\"type\":\"event\",\"name\":\"AdminRemoved\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"admin\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"AdminSet\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"admin\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"AppointeeRemoved\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"appointee\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"target\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"},{\"name\":\"selector\",\"type\":\"bytes4\",\"indexed\":false,\"internalType\":\"bytes4\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"AppointeeSet\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"appointee\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"target\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"},{\"name\":\"selector\",\"type\":\"bytes4\",\"indexed\":false,\"internalType\":\"bytes4\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"PendingAdminAdded\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"admin\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"PendingAdminRemoved\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"admin\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"error\",\"name\":\"AdminAlreadyPending\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"AdminAlreadySet\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"AdminNotPending\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"AdminNotSet\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"AppointeeAlreadySet\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"AppointeeNotSet\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"CannotHaveZeroAdmins\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"NotAdmin\",\"inputs\":[]}]",
}
⋮----
// IPermissionControllerABI is the input ABI used to generate the binding from.
// 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
⋮----
// 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)
⋮----
var out []interface{}
⋮----
// 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)
⋮----
// Version is a free data retrieval call binding the contract method 0x54fd4d50.
⋮----
// Solidity: function version() view returns(string)
func (_IPermissionController *IPermissionControllerCaller) Version(opts *bind.CallOpts) (string, error)
⋮----
// 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)
⋮----
// CanCall is a paid mutator transaction binding the contract method 0xdf595cb8.
⋮----
// Solidity: function canCall(address account, address caller, address target, bytes4 selector) returns(bool)
func (_IPermissionController *IPermissionControllerTransactor) CanCall(opts *bind.TransactOpts, account common.Address, caller common.Address, target common.Address, selector [4]byte) (*types.Transaction, error)
⋮----
// GetAppointeePermissions is a paid mutator transaction binding the contract method 0x882a3b38.
⋮----
// Solidity: function getAppointeePermissions(address account, address appointee) returns(address[], bytes4[])
func (_IPermissionController *IPermissionControllerTransactor) GetAppointeePermissions(opts *bind.TransactOpts, account common.Address, appointee common.Address) (*types.Transaction, error)
⋮----
// GetAppointees is a paid mutator transaction binding the contract method 0xfddbdefd.
⋮----
// Solidity: function getAppointees(address account, address target, bytes4 selector) returns(address[])
func (_IPermissionController *IPermissionControllerTransactor) GetAppointees(opts *bind.TransactOpts, account common.Address, target common.Address, selector [4]byte) (*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/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\":\"createOperatorDirectedAVSRewardsSubmission\",\"inputs\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"operatorDirectedRewardsSubmissions\",\"type\":\"tuple[]\",\"internalType\":\"structIRewardsCoordinatorTypes.OperatorDirectedRewardsSubmission[]\",\"components\":[{\"name\":\"strategiesAndMultipliers\",\"type\":\"tuple[]\",\"internalType\":\"structIRewardsCoordinatorTypes.StrategyAndMultiplier[]\",\"components\":[{\"name\":\"strategy\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"},{\"name\":\"multiplier\",\"type\":\"uint96\",\"internalType\":\"uint96\"}]},{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"contractIERC20\"},{\"name\":\"operatorRewards\",\"type\":\"tuple[]\",\"internalType\":\"structIRewardsCoordinatorTypes.OperatorReward[]\",\"components\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]},{\"name\":\"startTimestamp\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"duration\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"description\",\"type\":\"string\",\"internalType\":\"string\"}]}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"createOperatorDirectedOperatorSetRewardsSubmission\",\"inputs\":[{\"name\":\"operatorSet\",\"type\":\"tuple\",\"internalType\":\"structOperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]},{\"name\":\"operatorDirectedRewardsSubmissions\",\"type\":\"tuple[]\",\"internalType\":\"structIRewardsCoordinatorTypes.OperatorDirectedRewardsSubmission[]\",\"components\":[{\"name\":\"strategiesAndMultipliers\",\"type\":\"tuple[]\",\"internalType\":\"structIRewardsCoordinatorTypes.StrategyAndMultiplier[]\",\"components\":[{\"name\":\"strategy\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"},{\"name\":\"multiplier\",\"type\":\"uint96\",\"internalType\":\"uint96\"}]},{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"contractIERC20\"},{\"name\":\"operatorRewards\",\"type\":\"tuple[]\",\"internalType\":\"structIRewardsCoordinatorTypes.OperatorReward[]\",\"components\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]},{\"name\":\"startTimestamp\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"duration\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"description\",\"type\":\"string\",\"internalType\":\"string\"}]}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"createRewardsForAllEarners\",\"inputs\":[{\"name\":\"rewardsSubmissions\",\"type\":\"tuple[]\",\"internalType\":\"structIRewardsCoordinatorTypes.RewardsSubmission[]\",\"components\":[{\"name\":\"strategiesAndMultipliers\",\"type\":\"tuple[]\",\"internalType\":\"structIRewardsCoordinatorTypes.StrategyAndMultiplier[]\",\"components\":[{\"name\":\"strategy\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"},{\"name\":\"multiplier\",\"type\":\"uint96\",\"internalType\":\"uint96\"}]},{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"contractIERC20\"},{\"name\":\"amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"startTimestamp\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"duration\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"createRewardsForAllSubmission\",\"inputs\":[{\"name\":\"rewardsSubmissions\",\"type\":\"tuple[]\",\"internalType\":\"structIRewardsCoordinatorTypes.RewardsSubmission[]\",\"components\":[{\"name\":\"strategiesAndMultipliers\",\"type\":\"tuple[]\",\"internalType\":\"structIRewardsCoordinatorTypes.StrategyAndMultiplier[]\",\"components\":[{\"name\":\"strategy\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"},{\"name\":\"multiplier\",\"type\":\"uint96\",\"internalType\":\"uint96\"}]},{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"contractIERC20\"},{\"name\":\"amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"startTimestamp\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"duration\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"cumulativeClaimed\",\"inputs\":[{\"name\":\"claimer\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"contractIERC20\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"currRewardsCalculationEndTimestamp\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"defaultOperatorSplitBips\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint16\",\"internalType\":\"uint16\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"disableRoot\",\"inputs\":[{\"name\":\"rootIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"getCurrentClaimableDistributionRoot\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"tuple\",\"internalType\":\"structIRewardsCoordinatorTypes.DistributionRoot\",\"components\":[{\"name\":\"root\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"rewardsCalculationEndTimestamp\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"activatedAt\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"disabled\",\"type\":\"bool\",\"internalType\":\"bool\"}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getCurrentDistributionRoot\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"tuple\",\"internalType\":\"structIRewardsCoordinatorTypes.DistributionRoot\",\"components\":[{\"name\":\"root\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"rewardsCalculationEndTimestamp\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"activatedAt\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"disabled\",\"type\":\"bool\",\"internalType\":\"bool\"}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getDistributionRootAtIndex\",\"inputs\":[{\"name\":\"index\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"tuple\",\"internalType\":\"structIRewardsCoordinatorTypes.DistributionRoot\",\"components\":[{\"name\":\"root\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"rewardsCalculationEndTimestamp\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"activatedAt\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"disabled\",\"type\":\"bool\",\"internalType\":\"bool\"}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getDistributionRootsLength\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getOperatorAVSSplit\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint16\",\"internalType\":\"uint16\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getOperatorPISplit\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint16\",\"internalType\":\"uint16\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getOperatorSetSplit\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"operatorSet\",\"type\":\"tuple\",\"internalType\":\"structOperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]}],\"outputs\":[{\"name\":\"\",\"type\":\"uint16\",\"internalType\":\"uint16\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getRootIndexFromHash\",\"inputs\":[{\"name\":\"rootHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"initialize\",\"inputs\":[{\"name\":\"initialOwner\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"initialPausedStatus\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"_rewardsUpdater\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"_activationDelay\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"_defaultSplitBips\",\"type\":\"uint16\",\"internalType\":\"uint16\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"processClaim\",\"inputs\":[{\"name\":\"claim\",\"type\":\"tuple\",\"internalType\":\"structIRewardsCoordinatorTypes.RewardsMerkleClaim\",\"components\":[{\"name\":\"rootIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"earnerIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"earnerTreeProof\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"earnerLeaf\",\"type\":\"tuple\",\"internalType\":\"structIRewardsCoordinatorTypes.EarnerTreeMerkleLeaf\",\"components\":[{\"name\":\"earner\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"earnerTokenRoot\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]},{\"name\":\"tokenIndices\",\"type\":\"uint32[]\",\"internalType\":\"uint32[]\"},{\"name\":\"tokenTreeProofs\",\"type\":\"bytes[]\",\"internalType\":\"bytes[]\"},{\"name\":\"tokenLeaves\",\"type\":\"tuple[]\",\"internalType\":\"structIRewardsCoordinatorTypes.TokenTreeMerkleLeaf[]\",\"components\":[{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"contractIERC20\"},{\"name\":\"cumulativeEarnings\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]}]},{\"name\":\"recipient\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"processClaims\",\"inputs\":[{\"name\":\"claims\",\"type\":\"tuple[]\",\"internalType\":\"structIRewardsCoordinatorTypes.RewardsMerkleClaim[]\",\"components\":[{\"name\":\"rootIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"earnerIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"earnerTreeProof\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"earnerLeaf\",\"type\":\"tuple\",\"internalType\":\"structIRewardsCoordinatorTypes.EarnerTreeMerkleLeaf\",\"components\":[{\"name\":\"earner\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"earnerTokenRoot\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]},{\"name\":\"tokenIndices\",\"type\":\"uint32[]\",\"internalType\":\"uint32[]\"},{\"name\":\"tokenTreeProofs\",\"type\":\"bytes[]\",\"internalType\":\"bytes[]\"},{\"name\":\"tokenLeaves\",\"type\":\"tuple[]\",\"internalType\":\"structIRewardsCoordinatorTypes.TokenTreeMerkleLeaf[]\",\"components\":[{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"contractIERC20\"},{\"name\":\"cumulativeEarnings\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]}]},{\"name\":\"recipient\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"rewardsUpdater\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"setActivationDelay\",\"inputs\":[{\"name\":\"_activationDelay\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"setClaimerFor\",\"inputs\":[{\"name\":\"claimer\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"setClaimerFor\",\"inputs\":[{\"name\":\"earner\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"claimer\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"setDefaultOperatorSplit\",\"inputs\":[{\"name\":\"split\",\"type\":\"uint16\",\"internalType\":\"uint16\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"setOperatorAVSSplit\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"split\",\"type\":\"uint16\",\"internalType\":\"uint16\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"setOperatorPISplit\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"split\",\"type\":\"uint16\",\"internalType\":\"uint16\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"setOperatorSetSplit\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"operatorSet\",\"type\":\"tuple\",\"internalType\":\"structOperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]},{\"name\":\"split\",\"type\":\"uint16\",\"internalType\":\"uint16\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"setRewardsForAllSubmitter\",\"inputs\":[{\"name\":\"_submitter\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"_newValue\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"setRewardsUpdater\",\"inputs\":[{\"name\":\"_rewardsUpdater\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"submitRoot\",\"inputs\":[{\"name\":\"root\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"rewardsCalculationEndTimestamp\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"version\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"string\",\"internalType\":\"string\"}],\"stateMutability\":\"view\"},{\"type\":\"event\",\"name\":\"AVSRewardsSubmissionCreated\",\"inputs\":[{\"name\":\"avs\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"submissionNonce\",\"type\":\"uint256\",\"indexed\":true,\"internalType\":\"uint256\"},{\"name\":\"rewardsSubmissionHash\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"rewardsSubmission\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structIRewardsCoordinatorTypes.RewardsSubmission\",\"components\":[{\"name\":\"strategiesAndMultipliers\",\"type\":\"tuple[]\",\"internalType\":\"structIRewardsCoordinatorTypes.StrategyAndMultiplier[]\",\"components\":[{\"name\":\"strategy\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"},{\"name\":\"multiplier\",\"type\":\"uint96\",\"internalType\":\"uint96\"}]},{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"contractIERC20\"},{\"name\":\"amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"startTimestamp\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"duration\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ActivationDelaySet\",\"inputs\":[{\"name\":\"oldActivationDelay\",\"type\":\"uint32\",\"indexed\":false,\"internalType\":\"uint32\"},{\"name\":\"newActivationDelay\",\"type\":\"uint32\",\"indexed\":false,\"internalType\":\"uint32\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ClaimerForSet\",\"inputs\":[{\"name\":\"earner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"oldClaimer\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"claimer\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"DefaultOperatorSplitBipsSet\",\"inputs\":[{\"name\":\"oldDefaultOperatorSplitBips\",\"type\":\"uint16\",\"indexed\":false,\"internalType\":\"uint16\"},{\"name\":\"newDefaultOperatorSplitBips\",\"type\":\"uint16\",\"indexed\":false,\"internalType\":\"uint16\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"DistributionRootDisabled\",\"inputs\":[{\"name\":\"rootIndex\",\"type\":\"uint32\",\"indexed\":true,\"internalType\":\"uint32\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"DistributionRootSubmitted\",\"inputs\":[{\"name\":\"rootIndex\",\"type\":\"uint32\",\"indexed\":true,\"internalType\":\"uint32\"},{\"name\":\"root\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"rewardsCalculationEndTimestamp\",\"type\":\"uint32\",\"indexed\":true,\"internalType\":\"uint32\"},{\"name\":\"activatedAt\",\"type\":\"uint32\",\"indexed\":false,\"internalType\":\"uint32\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"OperatorAVSSplitBipsSet\",\"inputs\":[{\"name\":\"caller\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"operator\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"avs\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"activatedAt\",\"type\":\"uint32\",\"indexed\":false,\"internalType\":\"uint32\"},{\"name\":\"oldOperatorAVSSplitBips\",\"type\":\"uint16\",\"indexed\":false,\"internalType\":\"uint16\"},{\"name\":\"newOperatorAVSSplitBips\",\"type\":\"uint16\",\"indexed\":false,\"internalType\":\"uint16\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"OperatorDirectedAVSRewardsSubmissionCreated\",\"inputs\":[{\"name\":\"caller\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"avs\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"operatorDirectedRewardsSubmissionHash\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"submissionNonce\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"operatorDirectedRewardsSubmission\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structIRewardsCoordinatorTypes.OperatorDirectedRewardsSubmission\",\"components\":[{\"name\":\"strategiesAndMultipliers\",\"type\":\"tuple[]\",\"internalType\":\"structIRewardsCoordinatorTypes.StrategyAndMultiplier[]\",\"components\":[{\"name\":\"strategy\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"},{\"name\":\"multiplier\",\"type\":\"uint96\",\"internalType\":\"uint96\"}]},{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"contractIERC20\"},{\"name\":\"operatorRewards\",\"type\":\"tuple[]\",\"internalType\":\"structIRewardsCoordinatorTypes.OperatorReward[]\",\"components\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]},{\"name\":\"startTimestamp\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"duration\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"description\",\"type\":\"string\",\"internalType\":\"string\"}]}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"OperatorDirectedOperatorSetRewardsSubmissionCreated\",\"inputs\":[{\"name\":\"caller\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"operatorDirectedRewardsSubmissionHash\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"operatorSet\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structOperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]},{\"name\":\"submissionNonce\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"operatorDirectedRewardsSubmission\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structIRewardsCoordinatorTypes.OperatorDirectedRewardsSubmission\",\"components\":[{\"name\":\"strategiesAndMultipliers\",\"type\":\"tuple[]\",\"internalType\":\"structIRewardsCoordinatorTypes.StrategyAndMultiplier[]\",\"components\":[{\"name\":\"strategy\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"},{\"name\":\"multiplier\",\"type\":\"uint96\",\"internalType\":\"uint96\"}]},{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"contractIERC20\"},{\"name\":\"operatorRewards\",\"type\":\"tuple[]\",\"internalType\":\"structIRewardsCoordinatorTypes.OperatorReward[]\",\"components\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]},{\"name\":\"startTimestamp\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"duration\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"description\",\"type\":\"string\",\"internalType\":\"string\"}]}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"OperatorPISplitBipsSet\",\"inputs\":[{\"name\":\"caller\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"operator\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"activatedAt\",\"type\":\"uint32\",\"indexed\":false,\"internalType\":\"uint32\"},{\"name\":\"oldOperatorPISplitBips\",\"type\":\"uint16\",\"indexed\":false,\"internalType\":\"uint16\"},{\"name\":\"newOperatorPISplitBips\",\"type\":\"uint16\",\"indexed\":false,\"internalType\":\"uint16\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"OperatorSetSplitBipsSet\",\"inputs\":[{\"name\":\"caller\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"operator\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"operatorSet\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structOperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]},{\"name\":\"activatedAt\",\"type\":\"uint32\",\"indexed\":false,\"internalType\":\"uint32\"},{\"name\":\"oldOperatorSetSplitBips\",\"type\":\"uint16\",\"indexed\":false,\"internalType\":\"uint16\"},{\"name\":\"newOperatorSetSplitBips\",\"type\":\"uint16\",\"indexed\":false,\"internalType\":\"uint16\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"RewardsClaimed\",\"inputs\":[{\"name\":\"root\",\"type\":\"bytes32\",\"indexed\":false,\"internalType\":\"bytes32\"},{\"name\":\"earner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"claimer\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"recipient\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"token\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"contractIERC20\"},{\"name\":\"claimedAmount\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"RewardsForAllSubmitterSet\",\"inputs\":[{\"name\":\"rewardsForAllSubmitter\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"oldValue\",\"type\":\"bool\",\"indexed\":true,\"internalType\":\"bool\"},{\"name\":\"newValue\",\"type\":\"bool\",\"indexed\":true,\"internalType\":\"bool\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"RewardsSubmissionForAllCreated\",\"inputs\":[{\"name\":\"submitter\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"submissionNonce\",\"type\":\"uint256\",\"indexed\":true,\"internalType\":\"uint256\"},{\"name\":\"rewardsSubmissionHash\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"rewardsSubmission\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structIRewardsCoordinatorTypes.RewardsSubmission\",\"components\":[{\"name\":\"strategiesAndMultipliers\",\"type\":\"tuple[]\",\"internalType\":\"structIRewardsCoordinatorTypes.StrategyAndMultiplier[]\",\"components\":[{\"name\":\"strategy\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"},{\"name\":\"multiplier\",\"type\":\"uint96\",\"internalType\":\"uint96\"}]},{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"contractIERC20\"},{\"name\":\"amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"startTimestamp\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"duration\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"RewardsSubmissionForAllEarnersCreated\",\"inputs\":[{\"name\":\"tokenHopper\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"submissionNonce\",\"type\":\"uint256\",\"indexed\":true,\"internalType\":\"uint256\"},{\"name\":\"rewardsSubmissionHash\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"rewardsSubmission\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structIRewardsCoordinatorTypes.RewardsSubmission\",\"components\":[{\"name\":\"strategiesAndMultipliers\",\"type\":\"tuple[]\",\"internalType\":\"structIRewardsCoordinatorTypes.StrategyAndMultiplier[]\",\"components\":[{\"name\":\"strategy\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"},{\"name\":\"multiplier\",\"type\":\"uint96\",\"internalType\":\"uint96\"}]},{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"contractIERC20\"},{\"name\":\"amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"startTimestamp\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"duration\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"RewardsUpdaterSet\",\"inputs\":[{\"name\":\"oldRewardsUpdater\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"newRewardsUpdater\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"error\",\"name\":\"AmountExceedsMax\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"AmountIsZero\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"DurationExceedsMax\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"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)
⋮----
// Version is a free data retrieval call binding the contract method 0x54fd4d50.
⋮----
// Solidity: function version() view returns(string)
func (_IRewardsCoordinator *IRewardsCoordinatorCaller) Version(opts *bind.CallOpts) (string, error)
⋮----
// 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)
⋮----
// 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)
⋮----
// 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 0xf6efbb59.
⋮----
// Solidity: function initialize(address initialOwner, uint256 initialPausedStatus, address _rewardsUpdater, uint32 _activationDelay, uint16 _defaultSplitBips) returns()
func (_IRewardsCoordinator *IRewardsCoordinatorTransactor) Initialize(opts *bind.TransactOpts, initialOwner common.Address, initialPausedStatus *big.Int, _rewardsUpdater common.Address, _activationDelay uint32, _defaultSplitBips uint16) (*types.Transaction, error)
⋮----
// 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)
⋮----
// 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)
⋮----
// 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)
⋮----
// 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)
⋮----
// 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{}
⋮----
var oldValueRule []interface{}
⋮----
var newValueRule []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)
⋮----
var submitterRule []interface{}
⋮----
// 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)
````

## 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\":\"function\",\"name\":\"version\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"string\",\"internalType\":\"string\"}],\"stateMutability\":\"view\"},{\"type\":\"error\",\"name\":\"InvalidSignature\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"SignatureExpired\",\"inputs\":[]}]",
}
⋮----
// ISignatureUtilsMixinABI is the input ABI used to generate the binding from.
// Deprecated: Use ISignatureUtilsMixinMetaData.ABI instead.
var ISignatureUtilsMixinABI = ISignatureUtilsMixinMetaData.ABI
⋮----
// ISignatureUtilsMixin is an auto generated Go binding around an Ethereum contract.
type ISignatureUtilsMixin struct {
	ISignatureUtilsMixinCaller     // Read-only binding to the contract
	ISignatureUtilsMixinTransactor // Write-only binding to the contract
	ISignatureUtilsMixinFilterer   // Log filterer for contract events
}
⋮----
ISignatureUtilsMixinCaller     // 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{}
⋮----
// Version is a free data retrieval call binding the contract method 0x54fd4d50.
⋮----
// Solidity: function version() view returns(string)
func (_ISignatureUtilsMixin *ISignatureUtilsMixinCaller) Version(opts *bind.CallOpts) (string, error)
````

## 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\":\"deposit\",\"inputs\":[{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"contractIERC20\"},{\"name\":\"amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"explanation\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"string\",\"internalType\":\"string\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"shares\",\"inputs\":[{\"name\":\"user\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"sharesToUnderlying\",\"inputs\":[{\"name\":\"amountShares\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"sharesToUnderlyingView\",\"inputs\":[{\"name\":\"amountShares\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"totalShares\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"underlyingToShares\",\"inputs\":[{\"name\":\"amountUnderlying\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"underlyingToSharesView\",\"inputs\":[{\"name\":\"amountUnderlying\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"underlyingToken\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIERC20\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"userUnderlying\",\"inputs\":[{\"name\":\"user\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"userUnderlyingView\",\"inputs\":[{\"name\":\"user\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"version\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"string\",\"internalType\":\"string\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"withdraw\",\"inputs\":[{\"name\":\"recipient\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"contractIERC20\"},{\"name\":\"amountShares\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"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)
⋮----
// Version is a free data retrieval call binding the contract method 0x54fd4d50.
⋮----
// Solidity: function version() view returns(string)
func (_IStrategy *IStrategyCaller) Version(opts *bind.CallOpts) (string, error)
⋮----
// 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
)
⋮----
// IStrategyFactoryMetaData contains all meta data concerning the IStrategyFactory contract.
var IStrategyFactoryMetaData = &bind.MetaData{
	ABI: "[{\"type\":\"function\",\"name\":\"deployNewStrategy\",\"inputs\":[{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"contractIERC20\"}],\"outputs\":[{\"name\":\"newStrategy\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"deployedStrategies\",\"inputs\":[{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"contractIERC20\"}],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"removeStrategiesFromWhitelist\",\"inputs\":[{\"name\":\"strategiesToRemoveFromWhitelist\",\"type\":\"address[]\",\"internalType\":\"contractIStrategy[]\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"strategyBeacon\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIBeacon\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"version\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"string\",\"internalType\":\"string\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"whitelistStrategies\",\"inputs\":[{\"name\":\"strategiesToWhitelist\",\"type\":\"address[]\",\"internalType\":\"contractIStrategy[]\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"event\",\"name\":\"StrategyBeaconModified\",\"inputs\":[{\"name\":\"previousBeacon\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"contractIBeacon\"},{\"name\":\"newBeacon\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"contractIBeacon\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"StrategySetForToken\",\"inputs\":[{\"name\":\"token\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"contractIERC20\"},{\"name\":\"strategy\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"contractIStrategy\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"TokenBlacklisted\",\"inputs\":[{\"name\":\"token\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"contractIERC20\"}],\"anonymous\":false},{\"type\":\"error\",\"name\":\"AlreadyBlacklisted\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"BlacklistedToken\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"StrategyAlreadyExists\",\"inputs\":[]}]",
}
⋮----
// IStrategyFactoryABI is the input ABI used to generate the binding from.
// 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{}
⋮----
// 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)
⋮----
// Version is a free data retrieval call binding the contract method 0x54fd4d50.
⋮----
// Solidity: function version() view returns(string)
func (_IStrategyFactory *IStrategyFactoryCaller) Version(opts *bind.CallOpts) (string, error)
⋮----
// 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)
⋮----
// IStrategyFactoryStrategyBeaconModifiedIterator is returned from FilterStrategyBeaconModified and is used to iterate over the raw logs and unpacked data for StrategyBeaconModified events raised by the IStrategyFactory contract.
type IStrategyFactoryStrategyBeaconModifiedIterator struct {
	Event *IStrategyFactoryStrategyBeaconModified // Event containing the contract specifics and raw log

	contract *bind.BoundContract // Generic contract to use for unpacking event data
	event    string              // Event name to use for unpacking event data

	logs chan types.Log        // Log channel receiving the found contract events
	sub  ethereum.Subscription // Subscription for errors, completion and termination
	done bool                  // Whether the subscription completed delivering logs
	fail error                 // Occurred error to stop iteration
}
⋮----
Event *IStrategyFactoryStrategyBeaconModified // Event containing the contract specifics and raw log
⋮----
contract *bind.BoundContract // Generic contract to use for unpacking event data
event    string              // Event name to use for unpacking event data
⋮----
logs chan types.Log        // Log channel receiving the found contract events
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 *IStrategyFactoryStrategyBeaconModifiedIterator) 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 *IStrategyFactoryStrategyBeaconModifiedIterator) Error() error
⋮----
// Close terminates the iteration process, releasing any pending underlying
// resources.
func (it *IStrategyFactoryStrategyBeaconModifiedIterator) Close() error
⋮----
// IStrategyFactoryStrategyBeaconModified represents a StrategyBeaconModified event raised by the IStrategyFactory contract.
type IStrategyFactoryStrategyBeaconModified struct {
	PreviousBeacon common.Address
	NewBeacon      common.Address
	Raw            types.Log // Blockchain specific contextual infos
}
⋮----
Raw            types.Log // Blockchain specific contextual infos
⋮----
// FilterStrategyBeaconModified is a free log retrieval operation binding the contract event 0xe21755962a7d7e100b59b9c3e4d4b54085b146313719955efb6a7a25c5c7feee.
⋮----
// Solidity: event StrategyBeaconModified(address previousBeacon, address newBeacon)
func (_IStrategyFactory *IStrategyFactoryFilterer) FilterStrategyBeaconModified(opts *bind.FilterOpts) (*IStrategyFactoryStrategyBeaconModifiedIterator, error)
⋮----
// WatchStrategyBeaconModified is a free log subscription operation binding the contract event 0xe21755962a7d7e100b59b9c3e4d4b54085b146313719955efb6a7a25c5c7feee.
⋮----
func (_IStrategyFactory *IStrategyFactoryFilterer) WatchStrategyBeaconModified(opts *bind.WatchOpts, sink chan<- *IStrategyFactoryStrategyBeaconModified) (event.Subscription, error)
⋮----
// New log arrived, parse the event and forward to the user
⋮----
// ParseStrategyBeaconModified is a log parse operation binding the contract event 0xe21755962a7d7e100b59b9c3e4d4b54085b146313719955efb6a7a25c5c7feee.
⋮----
func (_IStrategyFactory *IStrategyFactoryFilterer) ParseStrategyBeaconModified(log types.Log) (*IStrategyFactoryStrategyBeaconModified, 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\":\"version\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"string\",\"internalType\":\"string\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"withdrawSharesAsTokens\",\"inputs\":[{\"name\":\"staker\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"strategy\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"},{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"contractIERC20\"},{\"name\":\"shares\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"event\",\"name\":\"BurnOrRedistributableSharesDecreased\",\"inputs\":[{\"name\":\"operatorSet\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structOperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]},{\"name\":\"slashId\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"strategy\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"contractIStrategy\"},{\"name\":\"shares\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"BurnOrRedistributableSharesIncreased\",\"inputs\":[{\"name\":\"operatorSet\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structOperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]},{\"name\":\"slashId\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"strategy\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"contractIStrategy\"},{\"name\":\"shares\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"BurnableSharesDecreased\",\"inputs\":[{\"name\":\"strategy\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"contractIStrategy\"},{\"name\":\"shares\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Deposit\",\"inputs\":[{\"name\":\"staker\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"},{\"name\":\"strategy\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"contractIStrategy\"},{\"name\":\"shares\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"StrategyAddedToDepositWhitelist\",\"inputs\":[{\"name\":\"strategy\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"contractIStrategy\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"StrategyRemovedFromDepositWhitelist\",\"inputs\":[{\"name\":\"strategy\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"contractIStrategy\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"StrategyWhitelisterChanged\",\"inputs\":[{\"name\":\"previousAddress\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"},{\"name\":\"newAddress\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"error\",\"name\":\"MaxStrategiesExceeded\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"OnlyDelegationManager\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"OnlyStrategyWhitelister\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"SharesAmountTooHigh\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"SharesAmountZero\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"StakerAddressZero\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"StrategyAlreadyInSlash\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"StrategyNotFound\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"StrategyNotWhitelisted\",\"inputs\":[]}]",
}
⋮----
// IStrategyManagerABI is the input ABI used to generate the binding from.
// 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)
⋮----
// Version is a free data retrieval call binding the contract method 0x54fd4d50.
⋮----
// Solidity: function version() view returns(string)
func (_IStrategyManager *IStrategyManagerCaller) Version(opts *bind.CallOpts) (string, error)
⋮----
// 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: "0x60e060405234801561000f575f5ffd5b5060405161314a38038061314a83398101604081905261002e916100cb565b6001600160a01b03808316608052831660a052808061004c8161005a565b60c052506101fc9350505050565b5f5f829050601f8151111561008d578260405163305a27a960e01b815260040161008491906101a1565b60405180910390fd5b8051610098826101d6565b179392505050565b6001600160a01b03811681146100b4575f5ffd5b50565b634e487b7160e01b5f52604160045260245ffd5b5f5f5f606084860312156100dd575f5ffd5b83516100e8816100a0565b60208501519093506100f9816100a0565b60408501519092506001600160401b03811115610114575f5ffd5b8401601f81018613610124575f5ffd5b80516001600160401b0381111561013d5761013d6100b7565b604051601f8201601f19908116603f011681016001600160401b038111828210171561016b5761016b6100b7565b604052818152828201602001881015610182575f5ffd5b8160208401602083015e5f602083830101528093505050509250925092565b602081525f82518060208401528060208501604085015e5f604082850101526040601f19601f83011684010191505092915050565b805160208083015191908110156101f6575f198160200360031b1b821691505b50919050565b60805160a05160c051612f0f61023b5f395f81816103fa01526116f001525f8181610195015261129f01525f818161033b015261061d0152612f0f5ff3fe608060405234801561000f575f5ffd5b5060043610610127575f3560e01c8063aa165c30116100a9578063d9f12db21161006e578063d9f12db214610370578063dab42d7e14610383578063ea0d8149146103a5578063ea194e2e146103b8578063f698da25146103cb575f5ffd5b8063aa165c30146102d9578063b05c8f6d146102ec578063bd30a0b914610313578063ca8aa7c714610336578063d40cda161461035d575f5ffd5b80637690e395116100ef5780637690e3951461023e5780637cffe48c146102515780638256909c1461027157806387ab86f4146102a35780639a43e3fb146102b8575f5ffd5b8063166aa1271461012b5780633b32a7bd146101655780634657e26a1461019057806350435add146101b757806354fd4d5014610236575b5f5ffd5b6101527f991b0a3376ce87f8ecc5d70962279ac09cdce934e8b5b9683e73c8ff087c7f8181565b6040519081526020015b60405180910390f35b61017861017336600461259c565b6103d3565b6040516001600160a01b03909116815260200161015c565b6101787f000000000000000000000000000000000000000000000000000000000000000081565b6102296101c536600461261d565b8151602080840151835180519083015185840151805190850151604080519687019790975295850193909352606084810192909252608084015260a083019190915260c082019290925260e001604051602081830303815290604052905092915050565b60405161015c91906126c8565b6102296103f3565b61015261024c366004612718565b610423565b61026461025f366004612776565b6104cb565b60405161015c91906127c4565b61028461027f3660046127d2565b6104f1565b604080516001600160a01b03909316835290151560208301520161015c565b6102b66102b1366004612878565b6105df565b005b6102cb6102c636600461259c565b6108f0565b60405161015c9291906128c3565b6102296102e736600461259c565b610ad8565b6101527fda86e76deaed01641f80ff5f72c372a038fa5182697aeb967e8b1f9819d58d8181565b61032661032136600461259c565b610c15565b604051901515815260200161015c565b6101787f000000000000000000000000000000000000000000000000000000000000000081565b6102b661036b366004612900565b610c52565b61015261037e366004612991565b610dc3565b6103266103913660046129d2565b5f9081526002602052604090205460ff1690565b6102b66103b33660046129e9565b610e5c565b6101526103c636600461259c565b610f9f565b6101526110c7565b5f6103de8383610ad8565b6103e790612a22565b60601c90505b92915050565b606061041e7f0000000000000000000000000000000000000000000000000000000000000000611180565b905090565b5f5f7fda86e76deaed01641f80ff5f72c372a038fa5182697aeb967e8b1f9819d58d8186865f015187602001518787604051610460929190612a7a565b6040805191829003822060208301969096526001600160a01b039485169082015292909116606083015263ffffffff16608082015260a081019190915260c0016040516020818303038152906040528051906020012090506104c1816111bd565b9695505050505050565b5f60015f6104d884611203565b815260208101919091526040015f205460ff1692915050565b5f5f5f60015f61050087611203565b815260208101919091526040015f9081205460ff169150600182600281111561052b5761052b612790565b0361053d5750835160208501206105ae565b600282600281111561055157610551612790565b03610595575f5f8680602001905181019061056c9190612a89565b60408051808201825283815260209081019283525f9384529151909152902092506105ae915050565b60405163fdea7c0960e01b815260040160405180910390fd5b5f818152600360205260409020546001600160a01b0316806105d08882610c15565b945094505050505b9250929050565b816105e981611261565b6106065760405163932d94f760e01b815260040160405180910390fd5b6040516309a961f360e11b81526001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001690631352c3e6906106549086908690600401612aab565b602060405180830381865afa15801561066f573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906106939190612ae1565b15828490916106e057604051631070287960e01b815282516001600160a01b03908116600483015260209093015163ffffffff166024820152911660448201526064015b60405180910390fd5b50505f60015f6106ef85611203565b815260208101919091526040015f9081205460ff16915081600281111561071857610718612790565b0361073657604051635cd3106d60e11b815260040160405180910390fd5b5f5f5f61074286611203565b815260208082019290925260409081015f9081206001600160a01b038916825283528190208151808301909252805460ff1615158252600181018054929391929184019161078f90612b00565b80601f01602080910402602001604051908101604052809291908181526020018280546107bb90612b00565b80156108065780601f106107dd57610100808354040283529160200191610806565b820191905f5260205f20905b8154815290600101906020018083116107e957829003601f168201915b5050505050815250509050805f01518486909161085c57604051632e40e18760e01b815282516001600160a01b03908116600483015260209093015163ffffffff166024820152911660448201526064016106d7565b50505f5f61086986611203565b815260208082019290925260409081015f9081206001600160a01b03891682529092528120805460ff19168155906108a460018301826123a1565b5050846001600160a01b03167f28d3c3cee49478ec6fd219cfd685cd15cd01d95cabf69b4b7b57f9eaa3eb644285846040516108e1929190612b38565b60405180910390a25050505050565b604080518082019091525f808252602082015261090b6123db565b5f60015f61091887611203565b815260208101919091526040015f205460ff169050600281600281111561094157610941612790565b1461095f5760405163fdea7c0960e01b815260040160405180910390fd5b5f5f5f61096b88611203565b815260208082019290925260409081015f9081206001600160a01b038916825283528190208151808301909252805460ff161515825260018101805492939192918401916109b890612b00565b80601f01602080910402602001604051908101604052809291908181526020018280546109e490612b00565b8015610a2f5780601f10610a0657610100808354040283529160200191610a2f565b820191905f5260205f20905b815481529060010190602001808311610a1257829003601f168201915b5050505050815250509050805f0151610a845750506040805180820182525f808252602080830182905283518085018552828152808201929092528351808501909452828452830191909152925090506105d8565b5f5f5f5f8460200151806020019051810190610aa09190612baa565b604080518082018252948552602080860194909452805180820190915291825291810191909152909b909a5098505050505050505050565b60605f60015f610ae786611203565b815260208101919091526040015f205460ff1690506001816002811115610b1057610b10612790565b14610b2e5760405163fdea7c0960e01b815260040160405180910390fd5b5f5f5f610b3a87611203565b815260208082019290925260409081015f9081206001600160a01b038816825283528190208151808301909252805460ff16151582526001810180549293919291840191610b8790612b00565b80601f0160208091040260200160405190810160405280929190818152602001828054610bb390612b00565b8015610bfe5780601f10610bd557610100808354040283529160200191610bfe565b820191905f5260205f20905b815481529060010190602001808311610be157829003601f168201915b505050919092525050506020015195945050505050565b5f5f5f610c2185611203565b815260208082019290925260409081015f9081206001600160a01b038616825290925290205460ff16905092915050565b85610c5c81611261565b610c795760405163932d94f760e01b815260040160405180910390fd5b5f60015f610c8689611203565b815260208101919091526040015f9081205460ff169150816002811115610caf57610caf612790565b03610ccd57604051635cd3106d60e11b815260040160405180910390fd5b5f5f610cd889611203565b815260208082019290925260409081015f9081206001600160a01b038c16825290925290205460ff1615610d1f576040516342ee68b560e01b815260040160405180910390fd5b6001816002811115610d3357610d33612790565b03610d4b57610d4687898888888861130b565b610d72565b6002816002811115610d5f57610d5f612790565b0361059557610d4687898888888861146c565b876001600160a01b03167f1201ce0c5e577111bce91e907fd99cb183da5edc1e3fb650ca40769e4e9176dd88838989604051610db19493929190612bf0565b60405180910390a25050505050505050565b81516020808401516040515f938493610e30937f991b0a3376ce87f8ecc5d70962279ac09cdce934e8b5b9683e73c8ff087c7f81938a93928991019485526001600160a01b039384166020860152918316604085015263ffffffff16606084015216608082015260a00190565b604051602081830303815290604052805190602001209050610e51816111bd565b9150505b9392505050565b8151610e6781611261565b610e845760405163932d94f760e01b815260040160405180910390fd5b6001826002811115610e9857610e98612790565b1480610eb557506002826002811115610eb357610eb3612790565b145b610ed25760405163fdea7c0960e01b815260040160405180910390fd5b5f60015f610edf86611203565b815260208101919091526040015f9081205460ff169150816002811115610f0857610f08612790565b14610f25576040516281f09f60e01b815260040160405180910390fd5b8260015f610f3287611203565b815260208101919091526040015f20805460ff19166001836002811115610f5b57610f5b612790565b02179055507fb2266cb118e57095fcdbedb24dabd9fc9f5127e2dbedf62ce6ee71696fb8b6e78484604051610f91929190612b38565b60405180910390a150505050565b5f5f5f5f610fac86611203565b815260208082019290925260409081015f9081206001600160a01b038716825283528190208151808301909252805460ff16151582526001810180549293919291840191610ff990612b00565b80601f016020809104026020016040519081016040528092919081815260200182805461102590612b00565b80156110705780601f1061104757610100808354040283529160200191611070565b820191905f5260205f20905b81548152906001019060200180831161105357829003601f168201915b50505050508152505090505f60015f61108887611203565b815260208101919091526040015f2054825160ff90911691506110b057505f91506103ed9050565b6110be826020015182611667565b95945050505050565b60408051808201909152600a81526922b4b3b2b72630bcb2b960b11b6020909101525f7f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f7f71b625cfad44bac63b13dba07f2e1d6084ee04b6f8752101ece6126d584ee6ea6111346116e8565b805160209182012060408051928301949094529281019190915260608101919091524660808201523060a082015260c00160405160208183030381529060405280519060200120905090565b60605f61118c8361175d565b6040805160208082528183019092529192505f91906020820181803683375050509182525060208101929092525090565b5f6111c66110c7565b60405161190160f01b6020820152602281019190915260428101839052606201604051602081830303815290604052805190602001209050919050565b5f815f0151826020015163ffffffff1660405160200161124992919060609290921b6001600160601b031916825260a01b6001600160a01b031916601482015260200190565b6040516020818303038152906040526103ed90612c4d565b604051631beb2b9760e31b81526001600160a01b0382811660048301523360248301523060448301525f80356001600160e01b0319166064840152917f00000000000000000000000000000000000000000000000000000000000000009091169063df595cb8906084016020604051808303815f875af11580156112e7573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906103ed9190612ae1565b6014831461132c5760405163d109118160e01b815260040160405180910390fd5b5f6113378486612c70565b60601c90508061135a57604051634935505f60e01b815260040160405180910390fd5b5f61139c86868080601f0160208091040260200160405190810160405280939291908181526020018383808284375f9201919091525060019250611667915050565b5f8181526002602052604090205490915060ff16156113ce57604051630c7bc20160e11b815260040160405180910390fd5b5f6113da888a85610dc3565b905061141f838287878080601f0160208091040260200160405190810160405280939291908181526020018383808284375f920191909152505f199250611784915050565b611461898989898080601f0160208091040260200160405190810160405280939291908181526020018383808284375f920191909152508892506117dc915050565b505050505050505050565b60c0831461148d5760405163d109118160e01b815260040160405180910390fd5b604081146114ae57604051638baa579f60e01b815260040160405180910390fd5b604080518082019091525f80825260208201526114c96123db565b5f8080806114d9898b018b612cae565b93509350935093506040518060400160405280858152602001848152509550835f148015611505575082155b1561152357604051634935505f60e01b815260040160405180910390fd5b60408051808201909152918252602082015292505f91506115489050888a8989610423565b90505f8061155886880188612ce8565b604080518082019091528281526020810182905291935091505f611580858389898580611889565b915050806115a157604051638baa579f60e01b815260040160405180910390fd5b5f6115e38c8c8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f9201919091525060029250611667915050565b5f8181526002602052604090205490915060ff161561161557604051630c7bc20160e11b815260040160405180910390fd5b6116578e8e8e8e8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f920191909152508792506117dc915050565b5050505050505050505050505050565b5f600182600281111561167c5761167c612790565b0361168e5750815160208301206103ed565b60028260028111156116a2576116a2612790565b03610595575f5f848060200190518101906116bd9190612baa565b505060408051808201825283815260209081019283525f9384529151909152902092506103ed915050565b60605f6117147f0000000000000000000000000000000000000000000000000000000000000000611180565b9050805f8151811061172857611728612a66565b016020908101516040516001600160f81b03199091169181019190915260210160405160208183030381529060405291505090565b5f60ff8216601f8111156103ed57604051632cd44ac360e21b815260040160405180910390fd5b428110156117a557604051630819bdcd60e01b815260040160405180910390fd5b6117b96001600160a01b0385168484611951565b6117d657604051638baa579f60e01b815260040160405180910390fd5b50505050565b6040805180820190915260018152602081018390525f806117fc87611203565b815260208082019290925260409081015f9081206001600160a01b03881682528352208251815460ff19169015151781559082015160018201906118409082612d54565b5050505f908152600260209081526040808320805460ff191660011790556003909152902080546001600160a01b039093166001600160a01b0319909316929092179091555050565b5f5f5f611895896119a5565b90505f6118a48a89898c611a2f565b90505f6118bb6118b48a84611ada565b8b90611b4a565b90505f6118fd6118f6846118f06040805180820182525f80825260209182015281518083019092526001825260029082015290565b90611ada565b8590611b4a565b905087156119225761191982611911611bbe565b838c8b611c7e565b96509450611942565b6119358261192e611bbe565b838c611e92565b9550851561194257600194505b50505050965096945050505050565b5f5f5f61195e85856120c9565b90925090505f81600481111561197657611976612790565b1480156119945750856001600160a01b0316826001600160a01b0316145b806104c157506104c1868686612108565b604080518082019091525f80825260208201525f80806119d25f516020612eba5f395f51905f5286612e0f565b90505b6119de816121ef565b90935091505f516020612eba5f395f51905f528283098303611a16576040805180820190915290815260208101919091529392505050565b5f516020612eba5f395f51905f526001820890506119d5565b8251602080850151845180519083015186840151805190850151875188870151604080519889018e90528801989098526060870195909552608086019390935260a085019190915260c084015260e08301526101008201526101208101919091525f907f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000019061014001604051602081830303815290604052805190602001205f1c6110be9190612e0f565b604080518082019091525f8082526020820152611af5612400565b835181526020808501519082015260408082018490525f908360608460076107d05a03fa90508080611b2357fe5b5080611b4257604051632319df1960e11b815260040160405180910390fd5b505092915050565b604080518082019091525f8082526020820152611b6561241e565b835181526020808501518183015283516040808401919091529084015160608301525f908360808460066107d05a03fa90508080611b9f57fe5b5080611b425760405163d4b68fd760e01b815260040160405180910390fd5b611bc66123db565b50604080516080810182527f198e9393920d483a7260bfb731fb5d25f1aa493335a9e71297e485b7aef312c28183019081527f1800deef121f1e76426a00665e5c4479674322d4f75edadd46debd5cd992f6ed6060830152815281518083019092527f275dc4a288d1afb3cbb1ac09187524c7db36395df7be3b99e673b13a075a65ec82527f1d9befcd05a5323e6da4d435f3b617cdb3af83285c2df711ef39c01571827f9d60208381019190915281019190915290565b6040805180820182528681526020808201869052825180840190935286835282018490525f91829190611caf61243c565b5f5b6002811015611e66575f611cc6826006612e42565b9050848260028110611cda57611cda612a66565b60200201515183611ceb835f612e59565b600c8110611cfb57611cfb612a66565b6020020152848260028110611d1257611d12612a66565b60200201516020015183826001611d299190612e59565b600c8110611d3957611d39612a66565b6020020152838260028110611d5057611d50612a66565b6020020151515183611d63836002612e59565b600c8110611d7357611d73612a66565b6020020152838260028110611d8a57611d8a612a66565b6020020151516001602002015183611da3836003612e59565b600c8110611db357611db3612a66565b6020020152838260028110611dca57611dca612a66565b6020020151602001515f60028110611de457611de4612a66565b602002015183611df5836004612e59565b600c8110611e0557611e05612a66565b6020020152838260028110611e1c57611e1c612a66565b602002015160200151600160028110611e3757611e37612a66565b602002015183611e48836005612e59565b600c8110611e5857611e58612a66565b602002015250600101611cb1565b50611e6f61245b565b5f6020826101808560088cfa9151919c9115159b50909950505050505050505050565b6040805180820182528581526020808201859052825180840190935285835282018390525f91611ec061243c565b5f5b6002811015612077575f611ed7826006612e42565b9050848260028110611eeb57611eeb612a66565b60200201515183611efc835f612e59565b600c8110611f0c57611f0c612a66565b6020020152848260028110611f2357611f23612a66565b60200201516020015183826001611f3a9190612e59565b600c8110611f4a57611f4a612a66565b6020020152838260028110611f6157611f61612a66565b6020020151515183611f74836002612e59565b600c8110611f8457611f84612a66565b6020020152838260028110611f9b57611f9b612a66565b6020020151516001602002015183611fb4836003612e59565b600c8110611fc457611fc4612a66565b6020020152838260028110611fdb57611fdb612a66565b6020020151602001515f60028110611ff557611ff5612a66565b602002015183612006836004612e59565b600c811061201657612016612a66565b602002015283826002811061202d5761202d612a66565b60200201516020015160016002811061204857612048612a66565b602002015183612059836005612e59565b600c811061206957612069612a66565b602002015250600101611ec2565b5061208061245b565b5f6020826101808560086107d05a03fa9050808061209a57fe5b50806120b9576040516324ccc79360e21b815260040160405180910390fd5b5051151598975050505050505050565b5f5f82516041036120fd576020830151604084015160608501515f1a6120f18782858561226b565b945094505050506105d8565b505f905060026105d8565b5f5f5f856001600160a01b0316631626ba7e60e01b8686604051602401612130929190612e6c565b60408051601f198184030181529181526020820180516001600160e01b03166001600160e01b031990941693909317909252905161216e9190612e8c565b5f60405180830381855afa9150503d805f81146121a6576040519150601f19603f3d011682016040523d82523d5f602084013e6121ab565b606091505b50915091508180156121bf57506020815110155b80156104c157508051630b135d3f60e11b906121e49083016020908101908401612ea2565b149695505050505050565b5f80805f516020612eba5f395f51905f5260035f516020612eba5f395f51905f52865f516020612eba5f395f51905f52888909090890505f61225f827f0c19139cb84c680a6e14116da060561765e05aa45a1c72a34f082305b61f3f525f516020612eba5f395f51905f52612328565b91959194509092505050565b5f807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a08311156122a057505f9050600361231f565b604080515f8082526020820180845289905260ff881692820192909252606081018690526080810185905260019060a0016020604051602081039080840390855afa1580156122f1573d5f5f3e3d5ffd5b5050604051601f1901519150506001600160a01b038116612319575f6001925092505061231f565b91505f90505b94509492505050565b5f5f61233261245b565b61233a612479565b602080825281810181905260408201819052606082018890526080820187905260a082018690528260c08360056107d05a03fa9250828061237757fe5b50826123965760405163d51edae360e01b815260040160405180910390fd5b505195945050505050565b5080546123ad90612b00565b5f825580601f106123bc575050565b601f0160209004905f5260205f20908101906123d89190612497565b50565b60405180604001604052806123ee6124af565b81526020016123fb6124af565b905290565b60405180606001604052806003906020820280368337509192915050565b60405180608001604052806004906020820280368337509192915050565b604051806101800160405280600c906020820280368337509192915050565b60405180602001604052806001906020820280368337509192915050565b6040518060c001604052806006906020820280368337509192915050565b5b808211156124ab575f8155600101612498565b5090565b60405180604001604052806002906020820280368337509192915050565b634e487b7160e01b5f52604160045260245ffd5b6040805190810167ffffffffffffffff81118282101715612504576125046124cd565b60405290565b604051601f8201601f1916810167ffffffffffffffff81118282101715612533576125336124cd565b604052919050565b80356001600160a01b0381168114612551575f5ffd5b919050565b5f60408284031215612566575f5ffd5b61256e6124e1565b90506125798261253b565b8152602082013563ffffffff81168114612591575f5ffd5b602082015292915050565b5f5f606083850312156125ad575f5ffd5b6125b78484612556565b91506125c56040840161253b565b90509250929050565b5f82601f8301126125dd575f5ffd5b6125e7604061250a565b8060408401858111156125f8575f5ffd5b845b818110156126125780358452602093840193016125fa565b509095945050505050565b5f5f82840360c081121561262f575f5ffd5b604081121561263c575f5ffd5b6126446124e1565b843581526020808601359082015292506080603f1982011215612665575f5ffd5b5061266e6124e1565b61267b85604086016125ce565b815261268a85608086016125ce565b6020820152809150509250929050565b5f81518084528060208401602086015e5f602082860101526020601f19601f83011685010191505092915050565b602081525f610e55602083018461269a565b5f5f83601f8401126126ea575f5ffd5b50813567ffffffffffffffff811115612701575f5ffd5b6020830191508360208285010111156105d8575f5ffd5b5f5f5f5f6080858703121561272b575f5ffd5b6127348561253b565b93506127438660208701612556565b9250606085013567ffffffffffffffff81111561275e575f5ffd5b61276a878288016126da565b95989497509550505050565b5f60408284031215612786575f5ffd5b610e558383612556565b634e487b7160e01b5f52602160045260245ffd5b600381106127c057634e487b7160e01b5f52602160045260245ffd5b9052565b602081016103ed82846127a4565b5f5f606083850312156127e3575f5ffd5b6127ed8484612556565b9150604083013567ffffffffffffffff811115612808575f5ffd5b8301601f81018513612818575f5ffd5b803567ffffffffffffffff811115612832576128326124cd565b612845601f8201601f191660200161250a565b818152866020838501011115612859575f5ffd5b816020840160208301375f602083830101528093505050509250929050565b5f5f60608385031215612889575f5ffd5b6128928361253b565b91506125c58460208501612556565b805f5b60028110156117d65781518452602093840193909101906001016128a4565b5f60c08201905083518252602084015160208301526128e66040830184516128a1565b60208301516128f860808401826128a1565b509392505050565b5f5f5f5f5f5f60a08789031215612915575f5ffd5b61291e8761253b565b955061292d8860208901612556565b9450606087013567ffffffffffffffff811115612948575f5ffd5b61295489828a016126da565b909550935050608087013567ffffffffffffffff811115612973575f5ffd5b61297f89828a016126da565b979a9699509497509295939492505050565b5f5f5f608084860312156129a3575f5ffd5b6129ac8461253b565b92506129bb8560208601612556565b91506129c96060850161253b565b90509250925092565b5f602082840312156129e2575f5ffd5b5035919050565b5f5f606083850312156129fa575f5ffd5b612a048484612556565b9150604083013560038110612a17575f5ffd5b809150509250929050565b805160208201516001600160601b0319811691906014821015612a5f576001600160601b03196001600160601b03198360140360031b1b82161692505b5050919050565b634e487b7160e01b5f52603260045260245ffd5b818382375f9101908152919050565b5f5f60408385031215612a9a575f5ffd5b505080516020909101519092909150565b6001600160a01b038316815260608101610e55602083018480516001600160a01b0316825260209081015163ffffffff16910152565b5f60208284031215612af1575f5ffd5b81518015158114610e55575f5ffd5b600181811c90821680612b1457607f821691505b602082108103612b3257634e487b7160e01b5f52602260045260245ffd5b50919050565b82516001600160a01b0316815260208084015163ffffffff169082015260608101610e5560408301846127a4565b5f82601f830112612b75575f5ffd5b612b7f604061250a565b806040840185811115612b90575f5ffd5b845b81811015612612578051845260209384019301612b92565b5f5f5f5f60c08587031215612bbd575f5ffd5b845160208601519094509250612bd68660408701612b66565b9150612be58660808701612b66565b905092959194509250565b84516001600160a01b0316815260208086015163ffffffff1690820152612c1a60408201856127a4565b60806060820152816080820152818360a08301375f81830160a090810191909152601f909201601f191601019392505050565b80516020808301519190811015612b32575f1960209190910360031b1b16919050565b80356001600160601b03198116906014841015612ca7576001600160601b03196001600160601b03198560140360031b1b82161691505b5092915050565b5f5f5f5f60c08587031215612cc1575f5ffd5b8435935060208501359250612cd986604087016125ce565b9150612be586608087016125ce565b5f5f60408385031215612cf9575f5ffd5b50508035926020909101359150565b601f821115612d4f57805f5260205f20601f840160051c81016020851015612d2d5750805b601f840160051c820191505b81811015612d4c575f8155600101612d39565b50505b505050565b815167ffffffffffffffff811115612d6e57612d6e6124cd565b612d8281612d7c8454612b00565b84612d08565b6020601f821160018114612db4575f8315612d9d5750848201515b5f19600385901b1c1916600184901b178455612d4c565b5f84815260208120601f198516915b82811015612de35787850151825560209485019460019092019101612dc3565b5084821015612e0057868401515f19600387901b60f8161c191681555b50505050600190811b01905550565b5f82612e2957634e487b7160e01b5f52601260045260245ffd5b500690565b634e487b7160e01b5f52601160045260245ffd5b80820281158282048414176103ed576103ed612e2e565b808201808211156103ed576103ed612e2e565b828152604060208201525f612e84604083018461269a565b949350505050565b5f82518060208501845e5f920191825250919050565b5f60208284031215612eb2575f5ffd5b505191905056fe30644e72e131a029b85045b68181585d97816a916871ca8d3c208c16d87cfd47a26469706673582212201df3a560128f27a0612f2f095e7e575dd271a835148632603757c72234c7b14364736f6c634300081b0033",
}
⋮----
// 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\":\"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\":\"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)
⋮----
// Version is a free data retrieval call binding the contract method 0x54fd4d50.
⋮----
// Solidity: function version() view returns(string)
func (_KeyRegistrarStorage *KeyRegistrarStorageCaller) 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 (_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: "0x60556032600b8282823980515f1a607314602657634e487b7160e01b5f525f60045260245ffd5b305f52607381538281f3fe730000000000000000000000000000000000000000301460806040525f5ffdfea26469706673582212207533eb554d661aa14ef6c353843c60b9f3700f9a67001c1733f0924af8e48fbc64736f6c634300081b0033",
}
⋮----
// 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: "0x60556032600b8282823980515f1a607314602657634e487b7160e01b5f525f60045260245ffd5b305f52607381538281f3fe730000000000000000000000000000000000000000301460806040525f5ffdfea26469706673582212200d41c40979a555029104dbf8f0150fa995e0afa0623de87526ee70333455ae7f64736f6c634300081b0033",
}
⋮----
// 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\"},{\"name\":\"_version\",\"type\":\"string\",\"internalType\":\"string\"}],\"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\":\"function\",\"name\":\"version\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"string\",\"internalType\":\"string\"}],\"stateMutability\":\"view\"},{\"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\":\"InvalidShortString\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"OnlyPauser\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"OnlyUnpauser\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"StringTooLong\",\"inputs\":[{\"name\":\"str\",\"type\":\"string\",\"internalType\":\"string\"}]},{\"type\":\"error\",\"name\":\"TableUpdateForPastTimestamp\",\"inputs\":[]}]",
	Bin: "0x610100604052348015610010575f5ffd5b50604051612e6a380380612e6a83398101604081905261002f916101b9565b808484846001600160a01b03811661005a576040516339b190bb60e11b815260040160405180910390fd5b6001600160a01b0390811660805291821660a0521660c05261007b81610090565b60e052506100876100d6565b505050506102fe565b5f5f829050601f815111156100c3578260405163305a27a960e01b81526004016100ba91906102a3565b60405180910390fd5b80516100ce826102d8565b179392505050565b5f54610100900460ff161561013d5760405162461bcd60e51b815260206004820152602760248201527f496e697469616c697a61626c653a20636f6e747261637420697320696e697469604482015266616c697a696e6760c81b60648201526084016100ba565b5f5460ff9081161461018c575f805460ff191660ff9081179091556040519081527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b565b6001600160a01b03811681146101a2575f5ffd5b50565b634e487b7160e01b5f52604160045260245ffd5b5f5f5f5f608085870312156101cc575f5ffd5b84516101d78161018e565b60208601519094506101e88161018e565b60408601519093506101f98161018e565b60608601519092506001600160401b03811115610214575f5ffd5b8501601f81018713610224575f5ffd5b80516001600160401b0381111561023d5761023d6101a5565b604051601f8201601f19908116603f011681016001600160401b038111828210171561026b5761026b6101a5565b604052818152828201602001891015610282575f5ffd5b8160208401602083015e5f6020838301015280935050505092959194509250565b602081525f82518060208401528060208501604085015e5f604082850101526040601f19601f83011684010191505092915050565b805160208083015191908110156102f8575f198160200360031b1b821691505b50919050565b60805160a05160c05160e051612aec61037e5f395f610a1301525f81816105b501528181610aad0152610e6d01525f818161061c0152818161094101528181610a6d01528181610b1901528181610dc8015281816111420152818161142b01526114dd01525f818161053c0152818161160901526118f50152612aec5ff3fe608060405234801561000f575f5ffd5b5060043610610255575f3560e01c80636f728c5011610140578063ad0f9582116100bf578063c3be1e3311610084578063c3be1e3314610672578063c5916a3914610685578063eaaed9d5146106aa578063f2fde38b146106bd578063fabc1cbc146106d0578063fd967f47146106e3575f5ffd5b8063ad0f9582146105b0578063b0cb3a24146105d7578063b8c1430614610617578063c252aa221461063e578063c3621f0a1461065f575f5ffd5b80638da5cb5b116101055780638da5cb5b1461055e5780639ea947781461056f5780639f7e206f14610582578063a2c902f514610595578063a2f2e24d1461059d575f5ffd5b80636f728c50146104f5578063715018a6146105205780637551ba3414610528578063790961ea14610530578063886f119514610537575f5ffd5b806331a599d2116101d757806354fd4d501161019c57806354fd4d5014610470578063595c6a67146104855780635ac86ab71461048d5780635c975abb146104b0578063612abcb0146104b857806364e1df84146104c0575f5ffd5b806331a599d2146103ea5780633ef6cd7a1461040f578063401c370f146104365780634624e6a314610449578063538a37901461045d575f5ffd5b80631e2ca2601161021d5780631e2ca260146103125780632370356c1461035b57806323b7b5b21461036e57806328522d791461039657806330ef41b4146103b8575f5ffd5b806306f5187514610259578063121409ea1461026e578063136439dd1461028d578063193b79f3146102a05780631bdc0deb146102dd575b5f5ffd5b61026c610267366004611b4f565b6106ec565b005b610276608e81565b60405160ff90911681526020015b60405180910390f35b61026c61029b366004611bc5565b6108c6565b6102c86102ae366004611bed565b63ffffffff9081165f908152609b60205260409020541690565b60405163ffffffff9091168152602001610284565b6103047fcefe99cb2e240b5f07de5cd472a75fc6e345370b73588ab161cb25c4a259a86981565b604051908152602001610284565b6040805180820182525f80825260209182015281518083019092526098546001600160a01b0381168352600160a01b900463ffffffff16908201525b6040516102849190611c26565b61026c610369366004611c34565b610900565b6102c861037c366004611bed565b63ffffffff9081165f908152609a60205260409020541690565b60975462010000900463ffffffff165f90815260996020526040902054610304565b6103da6103c6366004611bc5565b5f908152609c602052604090205460ff1690565b6040519015158152602001610284565b60975462010000900463ffffffff9081165f908152609a6020526040902054166102c8565b6103047f4491f5ee91595f938885ef73c9a1fa8a6d14ff9b9dab4aa24b8802bbb9bfc1cc81565b610304610444366004611c4d565b610914565b60975462010000900463ffffffff166102c8565b61030461046b366004611d3c565b6109bd565b610478610a0c565b6040516102849190611e34565b61026c610a3c565b6103da61049b366004611e69565b606654600160ff9092169190911b9081161490565b606654610304565b6102c8600181565b6103da6104ce366004611bed565b63ffffffff165f908152609960209081526040808320548352609c90915290205460ff1690565b610508610503366004611e97565b610a50565b6040516001600160a01b039091168152602001610284565b61026c610aef565b6102c8610b00565b6102c85f81565b6105087f000000000000000000000000000000000000000000000000000000000000000081565b6033546001600160a01b0316610508565b61026c61057d366004611ef4565b610b8e565b61026c610590366004611f8f565b610ede565b610276607581565b6103046105ab366004611fda565b610ef0565b6105087f000000000000000000000000000000000000000000000000000000000000000081565b6040805180820182525f8082526020918201528151808301909252609d546001600160a01b0381168352600160a01b900463ffffffff169082015261034e565b6105087f000000000000000000000000000000000000000000000000000000000000000081565b60975461064c9061ffff1681565b60405161ffff9091168152602001610284565b61026c61066d366004611bc5565b610f26565b610304610680366004611c4d565b610fdb565b610304610693366004611bed565b63ffffffff165f9081526099602052604090205490565b61026c6106b8366004612018565b611043565b61026c6106cb366004612084565b611292565b61026c6106de366004611bc5565b611308565b61064c61271081565b5f54610100900460ff161580801561070a57505f54600160ff909116105b806107235750303b15801561072357505f5460ff166001145b61078b5760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b60648201526084015b60405180910390fd5b5f805460ff1916600117905580156107ac575f805461ff0019166101001790555b6107b586611375565b6107be856113c6565b609d80546001600160c01b031916301790556107da8483611403565b6107e383611583565b7fcefe99cb2e240b5f07de5cd472a75fc6e345370b73588ab161cb25c4a259a8697fbb86fbc034f4e382929974bcd8419ed626b0ea647f962d89ba2fb6bd28785ab98190555f52609c6020527f38353ab40115e4013d688e07cff5857dde443bd05e72c49fcb5e684a9bb9efc4805460ff19166001179055609780544263ffffffff16620100000265ffffffff00001990911617905580156108be575f805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b505050505050565b6108ce6115f4565b60665481811681146108f35760405163c61dca5d60e01b815260040160405180910390fd5b6108fc826113c6565b5050565b610908611697565b61091181611583565b50565b5f5f610921858585610fdb565b6040516306119d0d60e21b815260016004820152602481018290529091507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031690631846743490604401602060405180830381865afa15801561098e573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906109b2919061209f565b9150505b9392505050565b5f6075826040516020016109d191906120f0565b60408051601f19818403018152908290526109ef929160200161211d565b604051602081830303815290604052805190602001209050919050565b6060610a377f00000000000000000000000000000000000000000000000000000000000000006116f1565b905090565b610a446115f4565b610a4e5f196113c6565b565b5f6002826002811115610a6557610a65612146565b03610a9157507f0000000000000000000000000000000000000000000000000000000000000000919050565b6001826002811115610aa557610aa5612146565b03610ad157507f0000000000000000000000000000000000000000000000000000000000000000919050565b60405163fdea7c0960e01b815260040160405180910390fd5b919050565b610af7611697565b610a4e5f611375565b604051635ddb9b5b60e01b81525f906001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001690635ddb9b5b90610b4f9060989060040161215a565b602060405180830381865afa158015610b6a573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610a379190612181565b6001610b998161172e565b610ba1611759565b5f5f5f5f610baf87876117b2565b5f8f8152609c60205260409020549397509195509350915060ff16610be75760405163504570e360e01b815260040160405180910390fd5b604080518082019091526098546001600160a01b0381168252600160a01b900463ffffffff166020820152610c1b906117f9565b610c24856117f9565b03610c4257604051631fb1705560e21b815260040160405180910390fd5b610c4b83610a50565b6001600160a01b031663cd83a72b858e6040518363ffffffff1660e01b8152600401610c7892919061219c565b602060405180830381865afa158015610c93573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610cb791906121bd565b15610cc55750505050610eca565b610cce83610a50565b6001600160a01b0316635ddb9b5b856040518263ffffffff1660e01b8152600401610cf99190611c26565b602060405180830381865afa158015610d14573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610d389190612181565b63ffffffff168c63ffffffff1611610d635760405163207617df60e01b815260040160405180910390fd5b63ffffffff8c165f908152609960205260409020548b14610d975760405163639d09b560e11b815260040160405180910390fd5b610dad8b8b8b8b610da88c8c610ef0565b61185c565b6002836002811115610dc157610dc1612146565b03610e52577f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316636738c40b858e610e00856118c1565b866040518563ffffffff1660e01b8152600401610e2094939291906121dc565b5f604051808303815f87803b158015610e37575f5ffd5b505af1158015610e49573d5f5f3e3d5ffd5b50505050610ec5565b6001836002811115610e6657610e66612146565b03610ad1577f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166356d482f5858e610ea5856118dd565b866040518563ffffffff1660e01b8152600401610e20949392919061225d565b505050505b610ed4600160c955565b5050505050505050565b610ee6611697565b6108fc8282611403565b5f608e8383604051602001610f0793929190612302565b6040516020818303038152906040528051906020012090505b92915050565b610f2e6115f4565b5f818152609c602052604090205460ff16610f5c5760405163504570e360e01b815260040160405180910390fd5b7fcefe99cb2e240b5f07de5cd472a75fc6e345370b73588ab161cb25c4a259a8698103610f9c576040516319920afd60e11b815260040160405180910390fd5b5f818152609c6020526040808220805460ff191690555182917f8bd43de1250f58fe6ec9a78671a8b78dba70f0018656d157a3aeaabec389df3491a250565b604080517f4491f5ee91595f938885ef73c9a1fa8a6d14ff9b9dab4aa24b8802bbb9bfc1cc602082015290810184905263ffffffff8084166060830152821660808201525f9060a0016040516020818303038152906040528051906020012090509392505050565b5f61104d8161172e565b611055611759565b428363ffffffff16111561107c57604051635a119db560e11b815260040160405180910390fd5b60975463ffffffff620100009091048116908416116110ae5760405163037fa86b60e31b815260040160405180910390fd5b6110b9848484610fdb565b8560200135146110dc57604051638b56642d60e01b815260040160405180910390fd5b6040805160018082528183019092525f91602080830190803683375050609754825192935061ffff16918391505f9061111757611117612329565b61ffff90921660209283029190910190910152604051625f5e5d60e21b81525f906001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169063017d79749061117c906098908b90879060040161245b565b6020604051808303815f875af1158015611198573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906111bc91906121bd565b9050806111dc57604051633042041f60e21b815260040160405180910390fd5b6097805463ffffffff80881662010000810265ffffffff000019909316929092179092555f818152609a602090815260408083208054958a1663ffffffff1996871681179091558352609b825280832080549095168417909455828252609981528382208a9055898252609c9052828120805460ff19166001179055915188927f010dcbe0d1e019c93357711f7bb6287d543b7ff7de74f29df3fb5ecceec8d36991a3505061128b600160c955565b5050505050565b61129a611697565b6001600160a01b0381166112ff5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610782565b61091181611375565b6113106118f3565b606654801982198116146113375760405163c61dca5d60e01b815260040160405180910390fd5b606682905560405182815233907f3582d1828e26bf56bd801502bc021ac0bc8afb57c826e4986b45593c8fad389c9060200160405180910390a25050565b603380546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a35050565b606681905560405181815233907fab40a374bc51de372200a8bc981af8c9ecdc08dfdaef0bb6e09f88f3c616ef3d9060200160405180910390a250565b81609861141082826125e8565b5050604051635ddb9b5b60e01b81525f906001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001690635ddb9b5b90611460908690600401612679565b602060405180830381865afa15801561147b573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061149f9190612181565b905063ffffffff8116156114c657604051636446f91760e01b815260040160405180910390fd5b604051636738c40b60e01b81526001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001690636738c40b9061151a9086906001908790609d90600401612687565b5f604051808303815f87803b158015611531575f5ffd5b505af1158015611543573d5f5f3e3d5ffd5b505050507f3463431b09dfd43dec7349f8f24acfa753fe4cf40a26235402d213373df15856836040516115769190612679565b60405180910390a1505050565b61271061ffff821611156115aa576040516307336f0360e11b815260040160405180910390fd5b6097805461ffff191661ffff83169081179091556040519081527ff5d1836df8fcd7c1e54047e94ac8773d2855395603e2ef9ba5f5f16905f225929060200160405180910390a150565b60405163237dfb4760e11b81523360048201527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906346fbf68e90602401602060405180830381865afa158015611656573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061167a91906121bd565b610a4e57604051631d77d47760e21b815260040160405180910390fd5b6033546001600160a01b03163314610a4e5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610782565b60605f6116fd836119a4565b6040805160208082528183019092529192505f91906020820181803683375050509182525060208101929092525090565b606654600160ff83161b908116036109115760405163840a48d560e01b815260040160405180910390fd5b600260c954036117ab5760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401610782565b600260c955565b604080518082019091525f8082526020820152604080518082019091525f808252602082018190529060606117e985870187612760565b9299919850965090945092505050565b5f815f0151826020015163ffffffff1660405160200161184492919060609290921b6bffffffffffffffffffffffff1916825260a01b6001600160a01b031916601482015260200190565b604051602081830303815290604052610f2090612825565b6118a483838080601f0160208091040260200160405190810160405280939291908181526020018383808284375f920191909152508992508591505063ffffffff88166119cb565b61128b5760405163afa42ca760e01b815260040160405180910390fd5b6118c9611ac5565b81806020019051810190610f2091906128ad565b606081806020019051810190610f20919061295c565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663eab66d7a6040518163ffffffff1660e01b8152600401602060405180830381865afa15801561194f573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906119739190612a5d565b6001600160a01b0316336001600160a01b031614610a4e5760405163794821ff60e01b815260040160405180910390fd5b5f60ff8216601f811115610f2057604051632cd44ac360e21b815260040160405180910390fd5b5f836119ea576040516329e7276760e11b815260040160405180910390fd5b836119f6868585611a00565b1495945050505050565b5f83515f03611a105750816109b6565b60208451611a1e9190612a78565b15611a3c576040516313717da960e21b815260040160405180910390fd5b8260205b85518111611a9d57611a53600285612a78565b5f03611a7457815f528086015160205260405f209150600284049350611a8b565b808601515f528160205260405f2091506002840493505b611a96602082612a97565b9050611a40565b508215611abd576040516363df817160e01b815260040160405180910390fd5b949350505050565b60405180608001604052805f81526020015f8152602001611af760405180604001604052805f81526020015f81525090565b8152602001606081525090565b6001600160a01b0381168114610911575f5ffd5b5f60408284031215611b28575f5ffd5b50919050565b803561ffff81168114610aea575f5ffd5b5f60a08284031215611b28575f5ffd5b5f5f5f5f5f60c08688031215611b63575f5ffd5b8535611b6e81611b04565b945060208601359350611b848760408801611b18565b9250611b9260808701611b2e565b915060a08601356001600160401b03811115611bac575f5ffd5b611bb888828901611b3f565b9150509295509295909350565b5f60208284031215611bd5575f5ffd5b5035919050565b63ffffffff81168114610911575f5ffd5b5f60208284031215611bfd575f5ffd5b81356109b681611bdc565b80516001600160a01b0316825260209081015163ffffffff16910152565b60408101610f208284611c08565b5f60208284031215611c44575f5ffd5b6109b682611b2e565b5f5f5f60608486031215611c5f575f5ffd5b833592506020840135611c7181611bdc565b91506040840135611c8181611bdc565b809150509250925092565b634e487b7160e01b5f52604160045260245ffd5b604080519081016001600160401b0381118282101715611cc257611cc2611c8c565b60405290565b604051608081016001600160401b0381118282101715611cc257611cc2611c8c565b604051601f8201601f191681016001600160401b0381118282101715611d1257611d12611c8c565b604052919050565b5f6001600160401b03821115611d3257611d32611c8c565b5060051b60200190565b5f60208284031215611d4c575f5ffd5b81356001600160401b03811115611d61575f5ffd5b82018084036060811215611d73575f5ffd5b611d7b611ca0565b6040821215611d88575f5ffd5b611d90611ca0565b83358152602080850135908201528152604083013591506001600160401b03821115611dba575f5ffd5b818301925085601f840112611dcd575f5ffd5b82359150611de2611ddd83611d1a565b611cea565b8083825260208201915060208460051b860101935087841115611e03575f5ffd5b6020850194505b83851015611e25578435825260209485019490910190611e0a565b60208301525095945050505050565b602081525f82518060208401528060208501604085015e5f604082850101526040601f19601f83011684010191505092915050565b5f60208284031215611e79575f5ffd5b813560ff811681146109b6575f5ffd5b803560038110610aea575f5ffd5b5f60208284031215611ea7575f5ffd5b6109b682611e89565b5f5f83601f840112611ec0575f5ffd5b5081356001600160401b03811115611ed6575f5ffd5b602083019150836020828501011115611eed575f5ffd5b9250929050565b5f5f5f5f5f5f5f60a0888a031215611f0a575f5ffd5b8735611f1581611bdc565b9650602088013595506040880135611f2c81611bdc565b945060608801356001600160401b03811115611f46575f5ffd5b611f528a828b01611eb0565b90955093505060808801356001600160401b03811115611f70575f5ffd5b611f7c8a828b01611eb0565b989b979a50959850939692959293505050565b5f5f60608385031215611fa0575f5ffd5b611faa8484611b18565b915060408301356001600160401b03811115611fc4575f5ffd5b611fd085828601611b3f565b9150509250929050565b5f5f60208385031215611feb575f5ffd5b82356001600160401b03811115612000575f5ffd5b61200c85828601611eb0565b90969095509350505050565b5f5f5f5f6080858703121561202b575f5ffd5b84356001600160401b03811115612040575f5ffd5b85016101208188031215612052575f5ffd5b935060208501359250604085013561206981611bdc565b9150606085013561207981611bdc565b939692955090935050565b5f60208284031215612094575f5ffd5b81356109b681611b04565b5f602082840312156120af575f5ffd5b5051919050565b5f8151808452602084019350602083015f5b828110156120e65781518652602095860195909101906001016120c8565b5093949350505050565b60208082528251805183830152015160408201525f6020830151606080840152611abd60808401826120b6565b60ff60f81b8360f81b1681525f82518060208501600185015e5f92016001019182525092915050565b634e487b7160e01b5f52602160045260245ffd5b60408101610f208284546001600160a01b038116825260a01c63ffffffff16602090910152565b5f60208284031215612191575f5ffd5b81516109b681611bdc565b606081016121aa8285611c08565b63ffffffff831660408301529392505050565b5f602082840312156121cd575f5ffd5b815180151581146109b6575f5ffd5b6121e68186611c08565b63ffffffff8416604082015260c06060820152825160c0820152602083015160e08201525f604084015161222861010084018280518252602090810151910152565b50606084015160a06101408401526122446101608401826120b6565b9150506122546080830184611c08565b95945050505050565b5f60c0820161226c8388611c08565b63ffffffff8616604084015260c0606084015280855180835260e08501915060e08160051b8601019250602087015f5b828110156122ed5786850360df19018452815180516001600160a01b031686526020908101516040918701829052906122d7908701826120b6565b955050602093840193919091019060010161229c565b50505050809150506122546080830184611c08565b60f884901b6001600160f81b0319168152818360018301375f910160010190815292915050565b634e487b7160e01b5f52603260045260245ffd5b5f5f8335601e19843603018112612352575f5ffd5b83016020810192503590506001600160401b03811115612370575f5ffd5b8060051b3603821315611eed575f5ffd5b81835281816020850137505f828201602090810191909152601f909101601f19169091010190565b5f8235605e198336030181126123bd575f5ffd5b90910192915050565b8183525f6001600160fb1b038311156123dd575f5ffd5b8260051b80836020870137939093016020019392505050565b80358252602080820135908301525f612412604083018361233d565b606060408601526122546060860182846123c6565b5f8151808452602084019350602083015f5b828110156120e657815161ffff16865260209586019590910190600101612439565b61247e8185546001600160a01b038116825260a01c63ffffffff16602090910152565b608060408201525f6101a08201843561249681611bdc565b63ffffffff166080840152602085013560a0840152604085013560c0840152606085013560e0840152604060808601610100850137604060c086016101408501376124e561010086018661233d565b610120610180860152828184526101c0860190506101c08260051b8701019350825f5b838110156125c7578786036101bf1901835261252482866123a9565b803561252f81611bdc565b63ffffffff168752602081013536829003601e1901811261254e575f5ffd5b81016020810190356001600160401b03811115612569575f5ffd5b803603821315612577575f5ffd5b606060208a015261258c60608a018284612381565b91505061259c60408301836123a9565b915087810360408901526125b081836123f6565b975050506020928301929190910190600101612508565b505050505082810360608401526125de8185612427565b9695505050505050565b81356125f381611b04565b81546001600160a01b031981166001600160a01b03929092169182178355602084013561261f81611bdc565b6001600160c01b03199190911690911760a09190911b63ffffffff60a01b1617905550565b803561264f81611b04565b6001600160a01b03168252602081013561266881611bdc565b63ffffffff81166020840152505050565b60408101610f208284612644565b6126918186612644565b63ffffffff841660408281019190915260c06060808401829052853591840191909152602085013560e0840152908401356101008301528301356101208201525f6126df608085018561233d565b60a06101408501526126f6610160850182846123c6565b925050506122546080830184546001600160a01b038116825260a01c63ffffffff16602090910152565b5f60408284031215612730575f5ffd5b612738611ca0565b9050813561274581611b04565b8152602082013561275581611bdc565b602082015292915050565b5f5f5f5f60c08587031215612773575f5ffd5b61277d8686612720565b935061278b60408601611e89565b925061279a8660608701612720565b915060a08501356001600160401b038111156127b4575f5ffd5b8501601f810187136127c4575f5ffd5b80356001600160401b038111156127dd576127dd611c8c565b6127f0601f8201601f1916602001611cea565b818152886020838501011115612804575f5ffd5b816020840160208301375f6020838301015280935050505092959194509250565b80516020808301519190811015611b28575f1960209190910360031b1b16919050565b5f82601f830112612857575f5ffd5b8151612865611ddd82611d1a565b8082825260208201915060208360051b860101925085831115612886575f5ffd5b602085015b838110156128a357805183526020928301920161288b565b5095945050505050565b5f602082840312156128bd575f5ffd5b81516001600160401b038111156128d2575f5ffd5b820180840360a08112156128e4575f5ffd5b6128ec611cc8565b82518152602080840151908201526040603f198301121561290b575f5ffd5b612913611ca0565b604084810151825260608501516020830152820152608083015191506001600160401b03821115612942575f5ffd5b61294e86838501612848565b606082015295945050505050565b5f6020828403121561296c575f5ffd5b81516001600160401b03811115612981575f5ffd5b8201601f81018413612991575f5ffd5b805161299f611ddd82611d1a565b8082825260208201915060208360051b8501019250868311156129c0575f5ffd5b602084015b83811015612a525780516001600160401b038111156129e2575f5ffd5b85016040818a03601f190112156129f7575f5ffd5b6129ff611ca0565b6020820151612a0d81611b04565b815260408201516001600160401b03811115612a27575f5ffd5b612a368b602083860101612848565b60208301525080855250506020830192506020810190506129c5565b509695505050505050565b5f60208284031215612a6d575f5ffd5b81516109b681611b04565b5f82612a9257634e487b7160e01b5f52601260045260245ffd5b500690565b80820180821115610f2057634e487b7160e01b5f52601160045260245ffdfea2646970667358221220d811a65e6f7cd306cf4457908b23cea348ef78435edf74128c0f860fd70b5dc364736f6c634300081b0033",
}
⋮----
// 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, _version string) (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)
⋮----
// Version is a free data retrieval call binding the contract method 0x54fd4d50.
⋮----
// Solidity: function version() view returns(string)
func (_OperatorTableUpdater *OperatorTableUpdaterCaller) Version(opts *bind.CallOpts) (string, 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: "0x608060405234801561000f575f5ffd5b506040516105c83803806105c883398101604081905261002e916101c2565b5f5b825181101561006b5761006383828151811061004e5761004e61029e565b6020026020010151600161007c60201b60201c565b600101610030565b5061007581610103565b50506102b2565b6001600160a01b0382166100a3576040516339b190bb60e11b815260040160405180910390fd5b6001600160a01b0382165f8181526020818152604091829020805460ff19168515159081179091558251938452908301527f65d3a1fd4c13f05cba164f80d03ce90fb4b5e21946bfc3ab7dbd434c2d0b9152910160405180910390a15050565b6001600160a01b03811661012a576040516339b190bb60e11b815260040160405180910390fd5b600154604080516001600160a01b03928316815291831660208301527f06b4167a2528887a1e97a366eefe8549bfbf1ea3e6ac81cb2564a934d20e8892910160405180910390a1600180546001600160a01b0319166001600160a01b0392909216919091179055565b634e487b7160e01b5f52604160045260245ffd5b80516001600160a01b03811681146101bd575f5ffd5b919050565b5f5f604083850312156101d3575f5ffd5b82516001600160401b038111156101e8575f5ffd5b8301601f810185136101f8575f5ffd5b80516001600160401b0381111561021157610211610193565b604051600582901b90603f8201601f191681016001600160401b038111828210171561023f5761023f610193565b60405291825260208184018101929081018884111561025c575f5ffd5b6020850194505b8385101561028257610274856101a7565b815260209485019401610263565b50945061029592505050602084016101a7565b90509250929050565b634e487b7160e01b5f52603260045260245ffd5b610309806102bf5f395ff3fe608060405234801561000f575f5ffd5b506004361061004a575f3560e01c806346fbf68e1461004e5780638568520614610085578063ce5484281461009a578063eab66d7a146100ad575b5f5ffd5b61007061005c36600461027a565b5f6020819052908152604090205460ff1681565b60405190151581526020015b60405180910390f35b61009861009336600461029a565b6100d8565b005b6100986100a836600461027a565b610111565b6001546100c0906001600160a01b031681565b6040516001600160a01b03909116815260200161007c565b6001546001600160a01b031633146101035760405163794821ff60e01b815260040160405180910390fd5b61010d8282610148565b5050565b6001546001600160a01b0316331461013c5760405163794821ff60e01b815260040160405180910390fd5b610145816101cf565b50565b6001600160a01b03821661016f576040516339b190bb60e11b815260040160405180910390fd5b6001600160a01b0382165f8181526020818152604091829020805460ff19168515159081179091558251938452908301527f65d3a1fd4c13f05cba164f80d03ce90fb4b5e21946bfc3ab7dbd434c2d0b9152910160405180910390a15050565b6001600160a01b0381166101f6576040516339b190bb60e11b815260040160405180910390fd5b600154604080516001600160a01b03928316815291831660208301527f06b4167a2528887a1e97a366eefe8549bfbf1ea3e6ac81cb2564a934d20e8892910160405180910390a1600180546001600160a01b0319166001600160a01b0392909216919091179055565b80356001600160a01b0381168114610275575f5ffd5b919050565b5f6020828403121561028a575f5ffd5b6102938261025f565b9392505050565b5f5f604083850312156102ab575f5ffd5b6102b48361025f565b9150602083013580151581146102c8575f5ffd5b80915050925092905056fea2646970667358221220912d9aab30be938dab3ebca2aa9bf6b6198fb6a29afd7dcf21e3a0efc0574d9c64736f6c634300081b0033",
}
⋮----
// 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\":[{\"name\":\"_version\",\"type\":\"string\",\"internalType\":\"string\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"acceptAdmin\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"addPendingAdmin\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"admin\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"canCall\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"caller\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"target\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"selector\",\"type\":\"bytes4\",\"internalType\":\"bytes4\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getAdmins\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"address[]\",\"internalType\":\"address[]\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getAppointeePermissions\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"appointee\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"address[]\",\"internalType\":\"address[]\"},{\"name\":\"\",\"type\":\"bytes4[]\",\"internalType\":\"bytes4[]\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getAppointees\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"target\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"selector\",\"type\":\"bytes4\",\"internalType\":\"bytes4\"}],\"outputs\":[{\"name\":\"\",\"type\":\"address[]\",\"internalType\":\"address[]\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getPendingAdmins\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"address[]\",\"internalType\":\"address[]\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"isAdmin\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"caller\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"isPendingAdmin\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"pendingAdmin\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"removeAdmin\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"admin\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"removeAppointee\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"appointee\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"target\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"selector\",\"type\":\"bytes4\",\"internalType\":\"bytes4\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"removePendingAdmin\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"admin\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"setAppointee\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"appointee\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"target\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"selector\",\"type\":\"bytes4\",\"internalType\":\"bytes4\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"version\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"string\",\"internalType\":\"string\"}],\"stateMutability\":\"view\"},{\"type\":\"event\",\"name\":\"AdminRemoved\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"admin\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"AdminSet\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"admin\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"AppointeeRemoved\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"appointee\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"target\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"},{\"name\":\"selector\",\"type\":\"bytes4\",\"indexed\":false,\"internalType\":\"bytes4\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"AppointeeSet\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"appointee\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"target\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"},{\"name\":\"selector\",\"type\":\"bytes4\",\"indexed\":false,\"internalType\":\"bytes4\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Initialized\",\"inputs\":[{\"name\":\"version\",\"type\":\"uint8\",\"indexed\":false,\"internalType\":\"uint8\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"PendingAdminAdded\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"admin\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"PendingAdminRemoved\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"admin\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"error\",\"name\":\"AdminAlreadyPending\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"AdminAlreadySet\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"AdminNotPending\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"AdminNotSet\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"AppointeeAlreadySet\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"AppointeeNotSet\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"CannotHaveZeroAdmins\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidShortString\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"NotAdmin\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"StringTooLong\",\"inputs\":[{\"name\":\"str\",\"type\":\"string\",\"internalType\":\"string\"}]}]",
	Bin: "0x60a060405234801561000f575f5ffd5b506040516112b73803806112b783398101604081905261002e9161015c565b806100388161004a565b60805250610044610090565b50610267565b5f5f829050601f8151111561007d578260405163305a27a960e01b8152600401610074919061020c565b60405180910390fd5b805161008882610241565b179392505050565b5f54610100900460ff16156100f75760405162461bcd60e51b815260206004820152602760248201527f496e697469616c697a61626c653a20636f6e747261637420697320696e697469604482015266616c697a696e6760c81b6064820152608401610074565b5f5460ff90811614610146575f805460ff191660ff9081179091556040519081527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b565b634e487b7160e01b5f52604160045260245ffd5b5f6020828403121561016c575f5ffd5b81516001600160401b03811115610181575f5ffd5b8201601f81018413610191575f5ffd5b80516001600160401b038111156101aa576101aa610148565b604051601f8201601f19908116603f011681016001600160401b03811182821017156101d8576101d8610148565b6040528181528282016020018610156101ef575f5ffd5b8160208401602083015e5f91810160200191909152949350505050565b602081525f82518060208401528060208501604085015e5f604082850101526040601f19601f83011684010191505092915050565b80516020808301519190811015610261575f198160200360031b1b821691505b50919050565b60805161103861027f5f395f6104d101526110385ff3fe608060405234801561000f575f5ffd5b50600436106100e5575f3560e01c80639100674511610088578063ad8aca7711610063578063ad8aca77146101df578063df595cb8146101f2578063eb5a4e8714610205578063fddbdefd14610218575f5ffd5b80639100674514610196578063950d806e146101b9578063ad5f2210146101cc575f5ffd5b806354fd4d50116100c357806354fd4d5014610124578063628806ef146101425780636bddfa1f14610155578063882a3b3814610175575f5ffd5b806306641201146100e9578063268959e5146100fe5780634f906cf914610111575b5f5ffd5b6100fc6100f7366004610dbd565b61022b565b005b6100fc61010c366004610e0e565b61034c565b6100fc61011f366004610e0e565b610427565b61012c6104ca565b6040516101399190610e3f565b60405180910390f35b6100fc610150366004610e74565b6104fa565b610168610163366004610e74565b610588565b6040516101399190610ed0565b610188610183366004610e0e565b6105b1565b604051610139929190610ee2565b6101a96101a4366004610e0e565b610712565b6040519015158152602001610139565b6100fc6101c7366004610dbd565b610782565b6101686101da366004610e74565b610893565b6101a96101ed366004610e0e565b610939565b6101a9610200366004610dbd565b61095a565b6100fc610213366004610e0e565b6109af565b610168610226366004610f44565b610a7d565b836102368133610712565b61025357604051637bfa4b9f60e01b815260040160405180910390fd5b6001600160a01b0385165f908152600160205260408120906102758585610abb565b6001600160a01b0387165f908152600484016020526040902090915061029b9082610ae8565b6102b85760405163262118cd60e01b815260040160405180910390fd5b6001600160a01b0386165f90815260048301602052604090206102db9082610aff565b505f81815260058301602052604090206102f59087610b0a565b50856001600160a01b0316876001600160a01b03167f18242326b6b862126970679759169f01f646bd55ec5bfcab85ba9f337a74e0c6878760405161033b929190610f84565b60405180910390a350505050505050565b816103578133610712565b61037457604051637bfa4b9f60e01b815260040160405180910390fd5b6001600160a01b0383165f9081526001602081905260409091206002019061039b82610b1e565b116103b9576040516310ce892b60e31b815260040160405180910390fd5b6103c38184610b0a565b6103e057604051630716d81b60e51b815260040160405180910390fd5b6040516001600160a01b0384811682528516907fdb9d5d31320daf5bc7181d565b6da4d12e30f0f4d5aa324a992426c14a1d19ce906020015b60405180910390a250505050565b816104328133610712565b61044f57604051637bfa4b9f60e01b815260040160405180910390fd5b6001600160a01b0383165f9081526001602052604090206104708184610b0a565b61048d5760405163bed8295f60e01b815260040160405180910390fd5b6040516001600160a01b0384811682528516907fd706ed7ae044d795b49e54c9f519f663053951011985f663a862cd9ee72a9ac790602001610419565b60606104f57f0000000000000000000000000000000000000000000000000000000000000000610b27565b905090565b6001600160a01b0381165f90815260016020526040902061051b8133610b0a565b6105385760405163bed8295f60e01b815260040160405180910390fd5b6105456002820133610b64565b506040513381526001600160a01b038316907fbf265e8326285a2747e33e54d5945f7111f2b5edb826eb8c08d4677779b3ff979060200160405180910390a25050565b6001600160a01b0381165f9081526001602052604090206060906105ab90610b78565b92915050565b6001600160a01b038083165f9081526001602090815260408083209385168352600490930190529081206060918291906105ea82610b1e565b90505f8167ffffffffffffffff81111561060657610606610fa7565b60405190808252806020026020018201604052801561062f578160200160208202803683370190505b5090505f8267ffffffffffffffff81111561064c5761064c610fa7565b604051908082528060200260200182016040528015610675578160200160208202803683370190505b5090505f5b83811015610704576106a861068f8683610b84565b606081901c9160a09190911b6001600160e01b03191690565b8483815181106106ba576106ba610fbb565b602002602001018484815181106106d3576106d3610fbb565b6001600160e01b0319909316602093840291909101909201919091526001600160a01b03909116905260010161067a565b509097909650945050505050565b6001600160a01b0382165f90815260016020526040812061073590600201610b1e565b5f0361075757816001600160a01b0316836001600160a01b03161490506105ab565b6001600160a01b0383165f90815260016020526040902061077b9060020183610b8f565b9392505050565b8361078d8133610712565b6107aa57604051637bfa4b9f60e01b815260040160405180910390fd5b6001600160a01b0385165f908152600160205260408120906107cc8585610abb565b6001600160a01b0387165f90815260048401602052604090209091506107f29082610ae8565b156108105760405163ad8efeb760e01b815260040160405180910390fd5b6001600160a01b0386165f90815260048301602052604090206108339082610bb0565b505f818152600583016020526040902061084d9087610b64565b50856001600160a01b0316876001600160a01b03167f037f03a2ad6b967df4a01779b6d2b4c85950df83925d9e31362b519422fc0169878760405161033b929190610f84565b6001600160a01b0381165f9081526001602052604090206060906108b990600201610b1e565b5f03610911576040805160018082528183019092525f916020808301908036833701905050905082815f815181106108f3576108f3610fbb565b6001600160a01b039092166020928302919091019091015292915050565b6001600160a01b0382165f9081526001602052604090206105ab90600201610b78565b919050565b6001600160a01b0382165f90815260016020526040812061077b9083610b8f565b5f6109658585610712565b806109a657506109a66109788484610abb565b6001600160a01b038088165f908152600160209081526040808320938a168352600490930190522090610ae8565b95945050505050565b816109ba8133610712565b6109d757604051637bfa4b9f60e01b815260040160405180910390fd5b6001600160a01b0383165f9081526001602052604090206109fb6002820184610b8f565b15610a195760405163130160e560e31b815260040160405180910390fd5b610a238184610b64565b610a40576040516319abede360e11b815260040160405180910390fd5b6040516001600160a01b0384811682528516907fb14b9a3d448c5b04f0e5b087b6f5193390db7955482a6ffb841e7b3ba61a460c90602001610419565b60605f610a8a8484610abb565b6001600160a01b0386165f90815260016020908152604080832084845260050190915290209091506109a690610b78565b60609190911b6bffffffffffffffffffffffff191660a09190911c6bffffffff0000000000000000161790565b5f818152600183016020526040812054151561077b565b5f61077b8383610bbb565b5f61077b836001600160a01b038416610bbb565b5f6105ab825490565b60605f610b3383610c9e565b6040805160208082528183019092529192505f91906020820181803683375050509182525060208101929092525090565b5f61077b836001600160a01b038416610cc5565b60605f61077b83610d11565b5f61077b8383610d6a565b6001600160a01b0381165f908152600183016020526040812054151561077b565b5f61077b8383610cc5565b5f8181526001830160205260408120548015610c95575f610bdd600183610fcf565b85549091505f90610bf090600190610fcf565b9050818114610c4f575f865f018281548110610c0e57610c0e610fbb565b905f5260205f200154905080875f018481548110610c2e57610c2e610fbb565b5f918252602080832090910192909255918252600188019052604090208390555b8554869080610c6057610c60610fee565b600190038181905f5260205f20015f90559055856001015f8681526020019081526020015f205f9055600193505050506105ab565b5f9150506105ab565b5f60ff8216601f8111156105ab57604051632cd44ac360e21b815260040160405180910390fd5b5f818152600183016020526040812054610d0a57508154600181810184555f8481526020808220909301849055845484825282860190935260409020919091556105ab565b505f6105ab565b6060815f01805480602002602001604051908101604052809291908181526020018280548015610d5e57602002820191905f5260205f20905b815481526020019060010190808311610d4a575b50505050509050919050565b5f825f018281548110610d7f57610d7f610fbb565b905f5260205f200154905092915050565b80356001600160a01b0381168114610934575f5ffd5b80356001600160e01b031981168114610934575f5ffd5b5f5f5f5f60808587031215610dd0575f5ffd5b610dd985610d90565b9350610de760208601610d90565b9250610df560408601610d90565b9150610e0360608601610da6565b905092959194509250565b5f5f60408385031215610e1f575f5ffd5b610e2883610d90565b9150610e3660208401610d90565b90509250929050565b602081525f82518060208401528060208501604085015e5f604082850101526040601f19601f83011684010191505092915050565b5f60208284031215610e84575f5ffd5b61077b82610d90565b5f8151808452602084019350602083015f5b82811015610ec65781516001600160a01b0316865260209586019590910190600101610e9f565b5093949350505050565b602081525f61077b6020830184610e8d565b604081525f610ef46040830185610e8d565b82810360208401528084518083526020830191506020860192505f5b81811015610f385783516001600160e01b031916835260209384019390920191600101610f10565b50909695505050505050565b5f5f5f60608486031215610f56575f5ffd5b610f5f84610d90565b9250610f6d60208501610d90565b9150610f7b60408501610da6565b90509250925092565b6001600160a01b039290921682526001600160e01b031916602082015260400190565b634e487b7160e01b5f52604160045260245ffd5b634e487b7160e01b5f52603260045260245ffd5b818103818111156105ab57634e487b7160e01b5f52601160045260245ffd5b634e487b7160e01b5f52603160045260245ffdfea26469706673582212200bfef99c3a205d60791c555845f86aa8d73ec426628fe8d9ce32ca87c87a311f64736f6c634300081b0033",
}
⋮----
// 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, _version string) (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)
⋮----
// Version is a free data retrieval call binding the contract method 0x54fd4d50.
⋮----
// Solidity: function version() view returns(string)
func (_PermissionController *PermissionControllerCaller) Version(opts *bind.CallOpts) (string, error)
⋮----
// 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\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"getAdmins\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"address[]\",\"internalType\":\"address[]\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getAppointeePermissions\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"appointee\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"address[]\",\"internalType\":\"address[]\"},{\"name\":\"\",\"type\":\"bytes4[]\",\"internalType\":\"bytes4[]\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"getAppointees\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"target\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"selector\",\"type\":\"bytes4\",\"internalType\":\"bytes4\"}],\"outputs\":[{\"name\":\"\",\"type\":\"address[]\",\"internalType\":\"address[]\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"getPendingAdmins\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"address[]\",\"internalType\":\"address[]\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"isAdmin\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"caller\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"isPendingAdmin\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"pendingAdmin\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"removeAdmin\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"admin\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"removeAppointee\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"appointee\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"target\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"selector\",\"type\":\"bytes4\",\"internalType\":\"bytes4\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"removePendingAdmin\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"admin\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"setAppointee\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"appointee\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"target\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"selector\",\"type\":\"bytes4\",\"internalType\":\"bytes4\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"version\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"string\",\"internalType\":\"string\"}],\"stateMutability\":\"view\"},{\"type\":\"event\",\"name\":\"AdminRemoved\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"admin\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"AdminSet\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"admin\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"AppointeeRemoved\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"appointee\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"target\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"},{\"name\":\"selector\",\"type\":\"bytes4\",\"indexed\":false,\"internalType\":\"bytes4\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"AppointeeSet\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"appointee\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"target\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"},{\"name\":\"selector\",\"type\":\"bytes4\",\"indexed\":false,\"internalType\":\"bytes4\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"PendingAdminAdded\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"admin\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"PendingAdminRemoved\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"admin\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"error\",\"name\":\"AdminAlreadyPending\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"AdminAlreadySet\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"AdminNotPending\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"AdminNotSet\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"AppointeeAlreadySet\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"AppointeeNotSet\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"CannotHaveZeroAdmins\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"NotAdmin\",\"inputs\":[]}]",
}
⋮----
// PermissionControllerStorageABI is the input ABI used to generate the binding from.
// 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
⋮----
// 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)
⋮----
var out []interface{}
⋮----
// 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)
⋮----
// Version is a free data retrieval call binding the contract method 0x54fd4d50.
⋮----
// Solidity: function version() view returns(string)
func (_PermissionControllerStorage *PermissionControllerStorageCaller) Version(opts *bind.CallOpts) (string, error)
⋮----
// 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)
⋮----
// CanCall is a paid mutator transaction binding the contract method 0xdf595cb8.
⋮----
// Solidity: function canCall(address account, address caller, address target, bytes4 selector) returns(bool)
func (_PermissionControllerStorage *PermissionControllerStorageTransactor) CanCall(opts *bind.TransactOpts, account common.Address, caller common.Address, target common.Address, selector [4]byte) (*types.Transaction, error)
⋮----
// GetAppointeePermissions is a paid mutator transaction binding the contract method 0x882a3b38.
⋮----
// Solidity: function getAppointeePermissions(address account, address appointee) returns(address[], bytes4[])
func (_PermissionControllerStorage *PermissionControllerStorageTransactor) GetAppointeePermissions(opts *bind.TransactOpts, account common.Address, appointee common.Address) (*types.Transaction, error)
⋮----
// GetAppointees is a paid mutator transaction binding the contract method 0xfddbdefd.
⋮----
// Solidity: function getAppointees(address account, address target, bytes4 selector) returns(address[])
func (_PermissionControllerStorage *PermissionControllerStorageTransactor) GetAppointees(opts *bind.TransactOpts, account common.Address, target common.Address, selector [4]byte) (*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/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\"},{\"name\":\"_version\",\"type\":\"string\",\"internalType\":\"string\"}],\"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\":\"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\":\"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\":\"InvalidShortString\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidUpgradeByTime\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"MustPublishMetadataURI\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"NoReleases\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"StringTooLong\",\"inputs\":[{\"name\":\"str\",\"type\":\"string\",\"internalType\":\"string\"}]}]",
	Bin: "0x60c060405234801561000f575f5ffd5b5060405161168938038061168983398101604081905261002e9161016a565b6001600160a01b0382166080528061004581610058565b60a0525061005161009e565b5050610294565b5f5f829050601f8151111561008b578260405163305a27a960e01b81526004016100829190610239565b60405180910390fd5b80516100968261026e565b179392505050565b5f54610100900460ff16156101055760405162461bcd60e51b815260206004820152602760248201527f496e697469616c697a61626c653a20636f6e747261637420697320696e697469604482015266616c697a696e6760c81b6064820152608401610082565b5f5460ff90811614610154575f805460ff191660ff9081179091556040519081527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b565b634e487b7160e01b5f52604160045260245ffd5b5f5f6040838503121561017b575f5ffd5b82516001600160a01b0381168114610191575f5ffd5b60208401519092506001600160401b038111156101ac575f5ffd5b8301601f810185136101bc575f5ffd5b80516001600160401b038111156101d5576101d5610156565b604051601f8201601f19908116603f011681016001600160401b038111828210171561020357610203610156565b60405281815282820160200187101561021a575f5ffd5b8160208401602083015e5f602083830101528093505050509250929050565b602081525f82518060208401528060208501604085015e5f604082850101526040601f19601f83011684010191505092915050565b8051602080830151919081101561028e575f198160200360031b1b821691505b50919050565b60805160a0516113ce6102bb5f395f61047101525f818160cd01526109ae01526113ce5ff3fe608060405234801561000f575f5ffd5b506004361061009b575f3560e01c806366f409f71161006357806366f409f7146101545780637c09ea8214610175578063a9e0ed6814610188578063b053b56d146101b0578063d30eeb88146101c3575f5ffd5b80633acab5fc1461009f5780634657e26a146100c85780634840a67c14610107578063517e40681461011c57806354fd4d501461013f575b5f5ffd5b6100b26100ad366004610b2b565b6101e4565b6040516100bf9190610c17565b60405180910390f35b6100ef7f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b0390911681526020016100bf565b61011a610115366004610c46565b610348565b005b61012f61012a366004610b2b565b610428565b60405190151581526020016100bf565b61014761046a565b6040516100bf9190610cc5565b610167610162366004610cd7565b61049a565b6040519081526020016100bf565b610167610183366004610cf1565b6104bd565b61019b610196366004610cd7565b610636565b60405163ffffffff90911681526020016100bf565b6101476101be366004610cd7565b6106bc565b6101d66101d1366004610cd7565b610765565b6040516100bf929190610d3d565b60408051808201909152606081525f602082015260015f6102048561090d565b81526020019081526020015f20828154811061022257610222610d5d565b905f5260205f2090600202016040518060400160405290815f8201805480602002602001604051908101604052809291908181526020015f905b82821015610325578382905f5260205f2090600202016040518060400160405290815f820154815260200160018201805461029690610d71565b80601f01602080910402602001604051908101604052809291908181526020018280546102c290610d71565b801561030d5780601f106102e45761010080835404028352916020019161030d565b820191905f5260205f20905b8154815290600101906020018083116102f057829003601f168201915b5050505050815250508152602001906001019061025c565b505050908252506001919091015463ffffffff1660209091015290505b92915050565b6103556020840184610da3565b61035e81610970565b61037b5760405163932d94f760e01b815260040160405180910390fd5b5f82900361039c57604051630eec403f60e41b815260040160405180910390fd5b828260025f6103b86103b3368a90038a018a610cd7565b61090d565b81526020019081526020015f2091826103d2929190610e13565b50836040516103e19190610ecd565b60405180910390207f209e95fbe8dd14c5e1fbf791ee0a83234f45f20cb85504c7068d5ca0d6224588848460405161041a929190610f2c565b60405180910390a250505050565b5f5f6104338461049a565b90505f811161045557604051637a31a0a160e11b815260040160405180910390fd5b610460600182610f53565b9092149392505050565b60606104957f0000000000000000000000000000000000000000000000000000000000000000610a1a565b905090565b5f60015f6104a78461090d565b815260208101919091526040015f205492915050565b5f6104cb6020840184610da3565b6104d481610970565b6104f15760405163932d94f760e01b815260040160405180910390fd5b5f6001816105076103b336899003890189610cd7565b81526020019081526020015f20905060025f61052d878036038101906103b39190610cd7565b81526020019081526020015f20805461054590610d71565b90505f036105665760405163413e6e5760e11b815260040160405180910390fd5b6105766040850160208601610f66565b63ffffffff16158061059d5750426105946040860160208701610f66565b63ffffffff1610155b6105ba5760405163325ec75f60e01b815260040160405180910390fd5b80546001810182555f82815260209020909350849060028502016105de82826110a4565b505082856040516105ef9190610ecd565b60405180910390207f2decd15222f7c4a8c3d4d2e14dcfdc5a0b52eb2d4b81796bfd010ee5cd972fd386604051610626919061122f565b60405180910390a3505092915050565b5f5f60015f6106448561090d565b81526020019081526020015f2090505f81805490501161067757604051637a31a0a160e11b815260040160405180910390fd5b80545f9061068790600190610f53565b905081818154811061069b5761069b610d5d565b5f91825260209091206001600290920201015463ffffffff16949350505050565b606060025f6106ca8461090d565b81526020019081526020015f2080546106e290610d71565b80601f016020809104026020016040519081016040528092919081815260200182805461070e90610d71565b80156107595780601f1061073057610100808354040283529160200191610759565b820191905f5260205f20905b81548152906001019060200180831161073c57829003601f168201915b50505050509050919050565b60408051808201909152606081525f60208201819052905f60015f6107898661090d565b81526020019081526020015f2090505f8180549050116107bc57604051637a31a0a160e11b815260040160405180910390fd5b80545f906107cc90600190610f53565b9050808282815481106107e1576107e1610d5d565b905f5260205f209060020201806040518060400160405290815f8201805480602002602001604051908101604052809291908181526020015f905b828210156108e5578382905f5260205f2090600202016040518060400160405290815f820154815260200160018201805461085690610d71565b80601f016020809104026020016040519081016040528092919081815260200182805461088290610d71565b80156108cd5780601f106108a4576101008083540402835291602001916108cd565b820191905f5260205f20905b8154815290600101906020018083116108b057829003601f168201915b5050505050815250508152602001906001019061081c565b505050908252506001919091015463ffffffff16602090910152919791965090945050505050565b5f815f0151826020015163ffffffff1660405160200161095892919060609290921b6bffffffffffffffffffffffff1916825260a01b6001600160a01b031916601482015260200190565b60405160208183030381529060405261034290611356565b604051631beb2b9760e31b81526001600160a01b0382811660048301523360248301523060448301525f80356001600160e01b0319166064840152917f00000000000000000000000000000000000000000000000000000000000000009091169063df595cb8906084016020604051808303815f875af11580156109f6573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906103429190611379565b60605f610a2683610a57565b6040805160208082528183019092529192505f91906020820181803683375050509182525060208101929092525090565b5f60ff8216601f81111561034257604051632cd44ac360e21b815260040160405180910390fd5b634e487b7160e01b5f52604160045260245ffd5b80356001600160a01b0381168114610aa8575f5ffd5b919050565b63ffffffff81168114610abe575f5ffd5b50565b8035610aa881610aad565b5f60408284031215610adc575f5ffd5b6040516040810181811067ffffffffffffffff82111715610aff57610aff610a7e565b604052905080610b0e83610a92565b81526020830135610b1e81610aad565b6020919091015292915050565b5f5f60608385031215610b3c575f5ffd5b610b468484610acc565b946040939093013593505050565b5f81518084528060208401602086015e5f602082860101526020601f19601f83011685010191505092915050565b5f6040830182516040855281815180845260608701915060608160051b88010193506020830192505f5b81811015610bf457605f198886030183528351805186526020810151905060406020870152610bde6040870182610b54565b9550506020938401939290920191600101610bac565b505050506020830151610c0f602086018263ffffffff169052565b509392505050565b602081525f610c296020830184610b82565b9392505050565b5f60408284031215610c40575f5ffd5b50919050565b5f5f5f60608486031215610c58575f5ffd5b610c628585610c30565b9250604084013567ffffffffffffffff811115610c7d575f5ffd5b8401601f81018613610c8d575f5ffd5b803567ffffffffffffffff811115610ca3575f5ffd5b866020828401011115610cb4575f5ffd5b939660209190910195509293505050565b602081525f610c296020830184610b54565b5f60408284031215610ce7575f5ffd5b610c298383610acc565b5f5f60608385031215610d02575f5ffd5b610d0c8484610c30565b9150604083013567ffffffffffffffff811115610d27575f5ffd5b610d3385828601610c30565b9150509250929050565b828152604060208201525f610d556040830184610b82565b949350505050565b634e487b7160e01b5f52603260045260245ffd5b600181811c90821680610d8557607f821691505b602082108103610c4057634e487b7160e01b5f52602260045260245ffd5b5f60208284031215610db3575f5ffd5b610c2982610a92565b5b81811015610dd0575f8155600101610dbd565b5050565b601f821115610e0e57805f5260205f20601f840160051c81016020851015610df95750805b610e0b601f850160051c830182610dbc565b50505b505050565b67ffffffffffffffff831115610e2b57610e2b610a7e565b610e3f83610e398354610d71565b83610dd4565b5f601f841160018114610e70575f8515610e595750838201355b5f19600387901b1c1916600186901b178355610e0b565b5f83815260208120601f198716915b82811015610e9f5786850135825560209485019460019092019101610e7f565b5086821015610ebb575f1960f88860031b161c19848701351681555b505060018560011b0183555050505050565b6001600160a01b03610ede83610a92565b1681525f6020830135610ef081610aad565b63ffffffff16602083015250604001919050565b81835281816020850137505f828201602090810191909152601f909101601f19169091010190565b602081525f610d55602083018486610f04565b634e487b7160e01b5f52601160045260245ffd5b8181038181111561034257610342610f3f565b5f60208284031215610f76575f5ffd5b8135610c2981610aad565b5f8235603e19833603018112610f95575f5ffd5b9190910192915050565b81358155600181016020830135601e19843603018112610fbd575f5ffd5b8301803567ffffffffffffffff81118015610fd6575f5ffd5b813603602084011315610fe7575f5ffd5b5f905050610fff81610ff98554610d71565b85610dd4565b5f601f821160018114611033575f831561101c5750838201602001355b5f19600385901b1c1916600184901b17855561108f565b5f85815260208120601f198516915b8281101561106457602085880181013583559485019460019092019101611042565b5084821015611083575f1960f88660031b161c19602085880101351681555b505060018360011b0185555b50505050505050565b5f813561034281610aad565b8135601e198336030181126110b7575f5ffd5b8201803567ffffffffffffffff8111156110cf575f5ffd5b6020820191508060051b36038213156110e6575f5ffd5b680100000000000000008111156110ff576110ff610a7e565b8254818455808210156111c3576001600160ff1b038116811461112457611124610f3f565b6001600160ff1b038216821461113c5761113c610f3f565b835f5260205f208160011b81018360011b820191505b808210156111c0575f825560018201805461116c90610d71565b80156111b357601f811160018114611186575f83556111b1565b5f838152602090206111a3601f840160051c820160018301610dbc565b505f83815260208120818555555b505b5050600282019150611152565b50505b505f8381526020812083915b83811015611200576111ea6111e48487610f81565b83610f9f565b60209290920191600291909101906001016111cf565b5050505050610dd061121460208401611098565b6001830163ffffffff821663ffffffff198254161781555050565b602081525f606082018335601e1985360301811261124b575f5ffd5b840180356020820167ffffffffffffffff821115611267575f5ffd5b8160051b803603821315611279575f5ffd5b604060208801529382905260809386018401935f908701605e1936869003015b8483101561133357888703607f1901825283358181126112b7575f5ffd5b860160208101358852604081013536829003603e190181126112d7575f5ffd5b0160408101906020013567ffffffffffffffff8111156112f5575f5ffd5b803603821315611303575f5ffd5b604060208a015261131860408a018284610f04565b98505050602084019350602082019150600183019250611299565b50505050505061134560208501610ac1565b63ffffffff81166040850152610c0f565b80516020808301519190811015610c40575f1960209190910360031b1b16919050565b5f60208284031215611389575f5ffd5b81518015158114610c29575f5ffdfea2646970667358221220052ed1bd5390ae538172254ad9b8c5cdcbd68a93cd2964671194cfb528248f4264736f6c634300081b0033",
}
⋮----
// 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, _version string) (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)
⋮----
// Version is a free data retrieval call binding the contract method 0x54fd4d50.
⋮----
// Solidity: function version() view returns(string)
func (_ReleaseManager *ReleaseManagerCaller) Version(opts *bind.CallOpts) (string, 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
	PauserRegistry             common.Address
	PermissionController       common.Address
	CALCULATIONINTERVALSECONDS uint32
	MAXREWARDSDURATION         uint32
	MAXRETROACTIVELENGTH       uint32
	MAXFUTURELENGTH            uint32
	GENESISREWARDSTIMESTAMP    uint32
	Version                    string
}
⋮----
// IRewardsCoordinatorTypesRewardsMerkleClaim is an auto generated low-level Go binding around an user-defined struct.
type IRewardsCoordinatorTypesRewardsMerkleClaim struct {
	RootIndex       uint32
	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\":\"pauserRegistry\",\"type\":\"address\",\"internalType\":\"contractIPauserRegistry\"},{\"name\":\"permissionController\",\"type\":\"address\",\"internalType\":\"contractIPermissionController\"},{\"name\":\"CALCULATION_INTERVAL_SECONDS\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"MAX_REWARDS_DURATION\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"MAX_RETROACTIVE_LENGTH\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"MAX_FUTURE_LENGTH\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"GENESIS_REWARDS_TIMESTAMP\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"version\",\"type\":\"string\",\"internalType\":\"string\"}]}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"CALCULATION_INTERVAL_SECONDS\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"GENESIS_REWARDS_TIMESTAMP\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"MAX_FUTURE_LENGTH\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"MAX_RETROACTIVE_LENGTH\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"MAX_REWARDS_DURATION\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"activationDelay\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"allocationManager\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIAllocationManager\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"beaconChainETHStrategy\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"calculateEarnerLeafHash\",\"inputs\":[{\"name\":\"leaf\",\"type\":\"tuple\",\"internalType\":\"structIRewardsCoordinatorTypes.EarnerTreeMerkleLeaf\",\"components\":[{\"name\":\"earner\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"earnerTokenRoot\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"pure\"},{\"type\":\"function\",\"name\":\"calculateTokenLeafHash\",\"inputs\":[{\"name\":\"leaf\",\"type\":\"tuple\",\"internalType\":\"structIRewardsCoordinatorTypes.TokenTreeMerkleLeaf\",\"components\":[{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"contractIERC20\"},{\"name\":\"cumulativeEarnings\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"pure\"},{\"type\":\"function\",\"name\":\"checkClaim\",\"inputs\":[{\"name\":\"claim\",\"type\":\"tuple\",\"internalType\":\"structIRewardsCoordinatorTypes.RewardsMerkleClaim\",\"components\":[{\"name\":\"rootIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"earnerIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"earnerTreeProof\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"earnerLeaf\",\"type\":\"tuple\",\"internalType\":\"structIRewardsCoordinatorTypes.EarnerTreeMerkleLeaf\",\"components\":[{\"name\":\"earner\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"earnerTokenRoot\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]},{\"name\":\"tokenIndices\",\"type\":\"uint32[]\",\"internalType\":\"uint32[]\"},{\"name\":\"tokenTreeProofs\",\"type\":\"bytes[]\",\"internalType\":\"bytes[]\"},{\"name\":\"tokenLeaves\",\"type\":\"tuple[]\",\"internalType\":\"structIRewardsCoordinatorTypes.TokenTreeMerkleLeaf[]\",\"components\":[{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"contractIERC20\"},{\"name\":\"cumulativeEarnings\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]}]}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"claimerFor\",\"inputs\":[{\"name\":\"earner\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"claimer\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"createAVSRewardsSubmission\",\"inputs\":[{\"name\":\"rewardsSubmissions\",\"type\":\"tuple[]\",\"internalType\":\"structIRewardsCoordinatorTypes.RewardsSubmission[]\",\"components\":[{\"name\":\"strategiesAndMultipliers\",\"type\":\"tuple[]\",\"internalType\":\"structIRewardsCoordinatorTypes.StrategyAndMultiplier[]\",\"components\":[{\"name\":\"strategy\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"},{\"name\":\"multiplier\",\"type\":\"uint96\",\"internalType\":\"uint96\"}]},{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"contractIERC20\"},{\"name\":\"amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"startTimestamp\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"duration\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"createOperatorDirectedAVSRewardsSubmission\",\"inputs\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"operatorDirectedRewardsSubmissions\",\"type\":\"tuple[]\",\"internalType\":\"structIRewardsCoordinatorTypes.OperatorDirectedRewardsSubmission[]\",\"components\":[{\"name\":\"strategiesAndMultipliers\",\"type\":\"tuple[]\",\"internalType\":\"structIRewardsCoordinatorTypes.StrategyAndMultiplier[]\",\"components\":[{\"name\":\"strategy\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"},{\"name\":\"multiplier\",\"type\":\"uint96\",\"internalType\":\"uint96\"}]},{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"contractIERC20\"},{\"name\":\"operatorRewards\",\"type\":\"tuple[]\",\"internalType\":\"structIRewardsCoordinatorTypes.OperatorReward[]\",\"components\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]},{\"name\":\"startTimestamp\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"duration\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"description\",\"type\":\"string\",\"internalType\":\"string\"}]}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"createOperatorDirectedOperatorSetRewardsSubmission\",\"inputs\":[{\"name\":\"operatorSet\",\"type\":\"tuple\",\"internalType\":\"structOperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]},{\"name\":\"operatorDirectedRewardsSubmissions\",\"type\":\"tuple[]\",\"internalType\":\"structIRewardsCoordinatorTypes.OperatorDirectedRewardsSubmission[]\",\"components\":[{\"name\":\"strategiesAndMultipliers\",\"type\":\"tuple[]\",\"internalType\":\"structIRewardsCoordinatorTypes.StrategyAndMultiplier[]\",\"components\":[{\"name\":\"strategy\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"},{\"name\":\"multiplier\",\"type\":\"uint96\",\"internalType\":\"uint96\"}]},{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"contractIERC20\"},{\"name\":\"operatorRewards\",\"type\":\"tuple[]\",\"internalType\":\"structIRewardsCoordinatorTypes.OperatorReward[]\",\"components\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]},{\"name\":\"startTimestamp\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"duration\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"description\",\"type\":\"string\",\"internalType\":\"string\"}]}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"createRewardsForAllEarners\",\"inputs\":[{\"name\":\"rewardsSubmissions\",\"type\":\"tuple[]\",\"internalType\":\"structIRewardsCoordinatorTypes.RewardsSubmission[]\",\"components\":[{\"name\":\"strategiesAndMultipliers\",\"type\":\"tuple[]\",\"internalType\":\"structIRewardsCoordinatorTypes.StrategyAndMultiplier[]\",\"components\":[{\"name\":\"strategy\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"},{\"name\":\"multiplier\",\"type\":\"uint96\",\"internalType\":\"uint96\"}]},{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"contractIERC20\"},{\"name\":\"amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"startTimestamp\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"duration\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"createRewardsForAllSubmission\",\"inputs\":[{\"name\":\"rewardsSubmissions\",\"type\":\"tuple[]\",\"internalType\":\"structIRewardsCoordinatorTypes.RewardsSubmission[]\",\"components\":[{\"name\":\"strategiesAndMultipliers\",\"type\":\"tuple[]\",\"internalType\":\"structIRewardsCoordinatorTypes.StrategyAndMultiplier[]\",\"components\":[{\"name\":\"strategy\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"},{\"name\":\"multiplier\",\"type\":\"uint96\",\"internalType\":\"uint96\"}]},{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"contractIERC20\"},{\"name\":\"amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"startTimestamp\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"duration\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"cumulativeClaimed\",\"inputs\":[{\"name\":\"earner\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"contractIERC20\"}],\"outputs\":[{\"name\":\"totalClaimed\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"currRewardsCalculationEndTimestamp\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"defaultOperatorSplitBips\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint16\",\"internalType\":\"uint16\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"delegationManager\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIDelegationManager\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"disableRoot\",\"inputs\":[{\"name\":\"rootIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"getCurrentClaimableDistributionRoot\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"tuple\",\"internalType\":\"structIRewardsCoordinatorTypes.DistributionRoot\",\"components\":[{\"name\":\"root\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"rewardsCalculationEndTimestamp\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"activatedAt\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"disabled\",\"type\":\"bool\",\"internalType\":\"bool\"}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getCurrentDistributionRoot\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"tuple\",\"internalType\":\"structIRewardsCoordinatorTypes.DistributionRoot\",\"components\":[{\"name\":\"root\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"rewardsCalculationEndTimestamp\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"activatedAt\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"disabled\",\"type\":\"bool\",\"internalType\":\"bool\"}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getDistributionRootAtIndex\",\"inputs\":[{\"name\":\"index\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"tuple\",\"internalType\":\"structIRewardsCoordinatorTypes.DistributionRoot\",\"components\":[{\"name\":\"root\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"rewardsCalculationEndTimestamp\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"activatedAt\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"disabled\",\"type\":\"bool\",\"internalType\":\"bool\"}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getDistributionRootsLength\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getOperatorAVSSplit\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint16\",\"internalType\":\"uint16\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getOperatorPISplit\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint16\",\"internalType\":\"uint16\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getOperatorSetSplit\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"operatorSet\",\"type\":\"tuple\",\"internalType\":\"structOperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]}],\"outputs\":[{\"name\":\"\",\"type\":\"uint16\",\"internalType\":\"uint16\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getRootIndexFromHash\",\"inputs\":[{\"name\":\"rootHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"initialize\",\"inputs\":[{\"name\":\"initialOwner\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"initialPausedStatus\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"_rewardsUpdater\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"_activationDelay\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"_defaultSplitBips\",\"type\":\"uint16\",\"internalType\":\"uint16\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"isAVSRewardsSubmissionHash\",\"inputs\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"hash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"valid\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"isOperatorDirectedAVSRewardsSubmissionHash\",\"inputs\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"hash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"valid\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"isOperatorDirectedOperatorSetRewardsSubmissionHash\",\"inputs\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"hash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"valid\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"isRewardsForAllSubmitter\",\"inputs\":[{\"name\":\"submitter\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"valid\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"isRewardsSubmissionForAllEarnersHash\",\"inputs\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"hash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"valid\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"isRewardsSubmissionForAllHash\",\"inputs\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"hash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"valid\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"owner\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"pause\",\"inputs\":[{\"name\":\"newPausedStatus\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"pauseAll\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"paused\",\"inputs\":[{\"name\":\"index\",\"type\":\"uint8\",\"internalType\":\"uint8\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"paused\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"pauserRegistry\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIPauserRegistry\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"permissionController\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIPermissionController\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"processClaim\",\"inputs\":[{\"name\":\"claim\",\"type\":\"tuple\",\"internalType\":\"structIRewardsCoordinatorTypes.RewardsMerkleClaim\",\"components\":[{\"name\":\"rootIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"earnerIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"earnerTreeProof\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"earnerLeaf\",\"type\":\"tuple\",\"internalType\":\"structIRewardsCoordinatorTypes.EarnerTreeMerkleLeaf\",\"components\":[{\"name\":\"earner\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"earnerTokenRoot\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]},{\"name\":\"tokenIndices\",\"type\":\"uint32[]\",\"internalType\":\"uint32[]\"},{\"name\":\"tokenTreeProofs\",\"type\":\"bytes[]\",\"internalType\":\"bytes[]\"},{\"name\":\"tokenLeaves\",\"type\":\"tuple[]\",\"internalType\":\"structIRewardsCoordinatorTypes.TokenTreeMerkleLeaf[]\",\"components\":[{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"contractIERC20\"},{\"name\":\"cumulativeEarnings\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]}]},{\"name\":\"recipient\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"processClaims\",\"inputs\":[{\"name\":\"claims\",\"type\":\"tuple[]\",\"internalType\":\"structIRewardsCoordinatorTypes.RewardsMerkleClaim[]\",\"components\":[{\"name\":\"rootIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"earnerIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"earnerTreeProof\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"earnerLeaf\",\"type\":\"tuple\",\"internalType\":\"structIRewardsCoordinatorTypes.EarnerTreeMerkleLeaf\",\"components\":[{\"name\":\"earner\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"earnerTokenRoot\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]},{\"name\":\"tokenIndices\",\"type\":\"uint32[]\",\"internalType\":\"uint32[]\"},{\"name\":\"tokenTreeProofs\",\"type\":\"bytes[]\",\"internalType\":\"bytes[]\"},{\"name\":\"tokenLeaves\",\"type\":\"tuple[]\",\"internalType\":\"structIRewardsCoordinatorTypes.TokenTreeMerkleLeaf[]\",\"components\":[{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"contractIERC20\"},{\"name\":\"cumulativeEarnings\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]}]},{\"name\":\"recipient\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"renounceOwnership\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"rewardsUpdater\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"setActivationDelay\",\"inputs\":[{\"name\":\"_activationDelay\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"setClaimerFor\",\"inputs\":[{\"name\":\"claimer\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"setClaimerFor\",\"inputs\":[{\"name\":\"earner\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"claimer\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"setDefaultOperatorSplit\",\"inputs\":[{\"name\":\"split\",\"type\":\"uint16\",\"internalType\":\"uint16\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"setOperatorAVSSplit\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"split\",\"type\":\"uint16\",\"internalType\":\"uint16\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"setOperatorPISplit\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"split\",\"type\":\"uint16\",\"internalType\":\"uint16\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"setOperatorSetSplit\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"operatorSet\",\"type\":\"tuple\",\"internalType\":\"structOperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]},{\"name\":\"split\",\"type\":\"uint16\",\"internalType\":\"uint16\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"setRewardsForAllSubmitter\",\"inputs\":[{\"name\":\"_submitter\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"_newValue\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"setRewardsUpdater\",\"inputs\":[{\"name\":\"_rewardsUpdater\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"strategyManager\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIStrategyManager\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"submissionNonce\",\"inputs\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"nonce\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"submitRoot\",\"inputs\":[{\"name\":\"root\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"rewardsCalculationEndTimestamp\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"transferOwnership\",\"inputs\":[{\"name\":\"newOwner\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"unpause\",\"inputs\":[{\"name\":\"newPausedStatus\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"version\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"string\",\"internalType\":\"string\"}],\"stateMutability\":\"view\"},{\"type\":\"event\",\"name\":\"AVSRewardsSubmissionCreated\",\"inputs\":[{\"name\":\"avs\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"submissionNonce\",\"type\":\"uint256\",\"indexed\":true,\"internalType\":\"uint256\"},{\"name\":\"rewardsSubmissionHash\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"rewardsSubmission\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structIRewardsCoordinatorTypes.RewardsSubmission\",\"components\":[{\"name\":\"strategiesAndMultipliers\",\"type\":\"tuple[]\",\"internalType\":\"structIRewardsCoordinatorTypes.StrategyAndMultiplier[]\",\"components\":[{\"name\":\"strategy\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"},{\"name\":\"multiplier\",\"type\":\"uint96\",\"internalType\":\"uint96\"}]},{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"contractIERC20\"},{\"name\":\"amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"startTimestamp\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"duration\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ActivationDelaySet\",\"inputs\":[{\"name\":\"oldActivationDelay\",\"type\":\"uint32\",\"indexed\":false,\"internalType\":\"uint32\"},{\"name\":\"newActivationDelay\",\"type\":\"uint32\",\"indexed\":false,\"internalType\":\"uint32\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ClaimerForSet\",\"inputs\":[{\"name\":\"earner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"oldClaimer\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"claimer\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"DefaultOperatorSplitBipsSet\",\"inputs\":[{\"name\":\"oldDefaultOperatorSplitBips\",\"type\":\"uint16\",\"indexed\":false,\"internalType\":\"uint16\"},{\"name\":\"newDefaultOperatorSplitBips\",\"type\":\"uint16\",\"indexed\":false,\"internalType\":\"uint16\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"DistributionRootDisabled\",\"inputs\":[{\"name\":\"rootIndex\",\"type\":\"uint32\",\"indexed\":true,\"internalType\":\"uint32\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"DistributionRootSubmitted\",\"inputs\":[{\"name\":\"rootIndex\",\"type\":\"uint32\",\"indexed\":true,\"internalType\":\"uint32\"},{\"name\":\"root\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"rewardsCalculationEndTimestamp\",\"type\":\"uint32\",\"indexed\":true,\"internalType\":\"uint32\"},{\"name\":\"activatedAt\",\"type\":\"uint32\",\"indexed\":false,\"internalType\":\"uint32\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Initialized\",\"inputs\":[{\"name\":\"version\",\"type\":\"uint8\",\"indexed\":false,\"internalType\":\"uint8\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"OperatorAVSSplitBipsSet\",\"inputs\":[{\"name\":\"caller\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"operator\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"avs\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"activatedAt\",\"type\":\"uint32\",\"indexed\":false,\"internalType\":\"uint32\"},{\"name\":\"oldOperatorAVSSplitBips\",\"type\":\"uint16\",\"indexed\":false,\"internalType\":\"uint16\"},{\"name\":\"newOperatorAVSSplitBips\",\"type\":\"uint16\",\"indexed\":false,\"internalType\":\"uint16\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"OperatorDirectedAVSRewardsSubmissionCreated\",\"inputs\":[{\"name\":\"caller\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"avs\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"operatorDirectedRewardsSubmissionHash\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"submissionNonce\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"operatorDirectedRewardsSubmission\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structIRewardsCoordinatorTypes.OperatorDirectedRewardsSubmission\",\"components\":[{\"name\":\"strategiesAndMultipliers\",\"type\":\"tuple[]\",\"internalType\":\"structIRewardsCoordinatorTypes.StrategyAndMultiplier[]\",\"components\":[{\"name\":\"strategy\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"},{\"name\":\"multiplier\",\"type\":\"uint96\",\"internalType\":\"uint96\"}]},{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"contractIERC20\"},{\"name\":\"operatorRewards\",\"type\":\"tuple[]\",\"internalType\":\"structIRewardsCoordinatorTypes.OperatorReward[]\",\"components\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]},{\"name\":\"startTimestamp\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"duration\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"description\",\"type\":\"string\",\"internalType\":\"string\"}]}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"OperatorDirectedOperatorSetRewardsSubmissionCreated\",\"inputs\":[{\"name\":\"caller\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"operatorDirectedRewardsSubmissionHash\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"operatorSet\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structOperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]},{\"name\":\"submissionNonce\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"operatorDirectedRewardsSubmission\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structIRewardsCoordinatorTypes.OperatorDirectedRewardsSubmission\",\"components\":[{\"name\":\"strategiesAndMultipliers\",\"type\":\"tuple[]\",\"internalType\":\"structIRewardsCoordinatorTypes.StrategyAndMultiplier[]\",\"components\":[{\"name\":\"strategy\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"},{\"name\":\"multiplier\",\"type\":\"uint96\",\"internalType\":\"uint96\"}]},{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"contractIERC20\"},{\"name\":\"operatorRewards\",\"type\":\"tuple[]\",\"internalType\":\"structIRewardsCoordinatorTypes.OperatorReward[]\",\"components\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]},{\"name\":\"startTimestamp\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"duration\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"description\",\"type\":\"string\",\"internalType\":\"string\"}]}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"OperatorPISplitBipsSet\",\"inputs\":[{\"name\":\"caller\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"operator\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"activatedAt\",\"type\":\"uint32\",\"indexed\":false,\"internalType\":\"uint32\"},{\"name\":\"oldOperatorPISplitBips\",\"type\":\"uint16\",\"indexed\":false,\"internalType\":\"uint16\"},{\"name\":\"newOperatorPISplitBips\",\"type\":\"uint16\",\"indexed\":false,\"internalType\":\"uint16\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"OperatorSetSplitBipsSet\",\"inputs\":[{\"name\":\"caller\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"operator\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"operatorSet\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structOperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]},{\"name\":\"activatedAt\",\"type\":\"uint32\",\"indexed\":false,\"internalType\":\"uint32\"},{\"name\":\"oldOperatorSetSplitBips\",\"type\":\"uint16\",\"indexed\":false,\"internalType\":\"uint16\"},{\"name\":\"newOperatorSetSplitBips\",\"type\":\"uint16\",\"indexed\":false,\"internalType\":\"uint16\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"OwnershipTransferred\",\"inputs\":[{\"name\":\"previousOwner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"newOwner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Paused\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"newPausedStatus\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"RewardsClaimed\",\"inputs\":[{\"name\":\"root\",\"type\":\"bytes32\",\"indexed\":false,\"internalType\":\"bytes32\"},{\"name\":\"earner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"claimer\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"recipient\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"token\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"contractIERC20\"},{\"name\":\"claimedAmount\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"RewardsForAllSubmitterSet\",\"inputs\":[{\"name\":\"rewardsForAllSubmitter\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"oldValue\",\"type\":\"bool\",\"indexed\":true,\"internalType\":\"bool\"},{\"name\":\"newValue\",\"type\":\"bool\",\"indexed\":true,\"internalType\":\"bool\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"RewardsSubmissionForAllCreated\",\"inputs\":[{\"name\":\"submitter\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"submissionNonce\",\"type\":\"uint256\",\"indexed\":true,\"internalType\":\"uint256\"},{\"name\":\"rewardsSubmissionHash\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"rewardsSubmission\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structIRewardsCoordinatorTypes.RewardsSubmission\",\"components\":[{\"name\":\"strategiesAndMultipliers\",\"type\":\"tuple[]\",\"internalType\":\"structIRewardsCoordinatorTypes.StrategyAndMultiplier[]\",\"components\":[{\"name\":\"strategy\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"},{\"name\":\"multiplier\",\"type\":\"uint96\",\"internalType\":\"uint96\"}]},{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"contractIERC20\"},{\"name\":\"amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"startTimestamp\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"duration\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"RewardsSubmissionForAllEarnersCreated\",\"inputs\":[{\"name\":\"tokenHopper\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"submissionNonce\",\"type\":\"uint256\",\"indexed\":true,\"internalType\":\"uint256\"},{\"name\":\"rewardsSubmissionHash\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"rewardsSubmission\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structIRewardsCoordinatorTypes.RewardsSubmission\",\"components\":[{\"name\":\"strategiesAndMultipliers\",\"type\":\"tuple[]\",\"internalType\":\"structIRewardsCoordinatorTypes.StrategyAndMultiplier[]\",\"components\":[{\"name\":\"strategy\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"},{\"name\":\"multiplier\",\"type\":\"uint96\",\"internalType\":\"uint96\"}]},{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"contractIERC20\"},{\"name\":\"amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"startTimestamp\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"duration\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"RewardsUpdaterSet\",\"inputs\":[{\"name\":\"oldRewardsUpdater\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"newRewardsUpdater\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Unpaused\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"newPausedStatus\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"error\",\"name\":\"AmountExceedsMax\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"AmountIsZero\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"CurrentlyPaused\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"DurationExceedsMax\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"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\":\"InvalidShortString\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidStartTimestampRemainder\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidTokenLeafIndex\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"NewRootMustBeForNewCalculatedPeriod\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"OnlyPauser\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"OnlyUnpauser\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"OperatorsNotInAscendingOrder\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"PreviousSplitPending\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"RewardsEndTimestampNotElapsed\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"RootAlreadyActivated\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"RootDisabled\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"RootNotActivated\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"SplitExceedsMax\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"StartTimestampTooFarInFuture\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"StartTimestampTooFarInPast\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"StrategiesNotInAscendingOrder\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"StrategyNotWhitelisted\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"StringTooLong\",\"inputs\":[{\"name\":\"str\",\"type\":\"string\",\"internalType\":\"string\"}]},{\"type\":\"error\",\"name\":\"SubmissionNotRetroactive\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"UnauthorizedCaller\",\"inputs\":[]}]",
	Bin: "0x6101e0604052348015610010575f5ffd5b50604051614bd4380380614bd483398101604081905261002f9161034a565b610140810151608082015182516020840151604085015160a086015160c087015160e08801516101008901516101208a015160608b01516001600160a01b03811661008d576040516339b190bb60e11b815260040160405180910390fd5b6001600160a01b03166080526100a38582610465565b63ffffffff16156100c757604051630e06bd3160e01b815260040160405180910390fd5b6100d46201518086610465565b63ffffffff16156100f85760405163223c7b3960e11b815260040160405180910390fd5b6001600160a01b0397881660a05295871660c05293861660e05263ffffffff9283166101005290821661012052811661014052908116610160521661018052166101a05261014581610158565b6101c0525061015261019e565b506104f3565b5f5f829050601f8151111561018b578260405163305a27a960e01b81526004016101829190610498565b60405180910390fd5b8051610196826104cd565b179392505050565b5f54610100900460ff16156102055760405162461bcd60e51b815260206004820152602760248201527f496e697469616c697a61626c653a20636f6e747261637420697320696e697469604482015266616c697a696e6760c81b6064820152608401610182565b5f5460ff90811614610254575f805460ff191660ff9081179091556040519081527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b565b634e487b7160e01b5f52604160045260245ffd5b60405161016081016001600160401b038111828210171561028d5761028d610256565b60405290565b80516001600160a01b03811681146102a9575f5ffd5b919050565b805163ffffffff811681146102a9575f5ffd5b5f82601f8301126102d0575f5ffd5b81516001600160401b038111156102e9576102e9610256565b604051601f8201601f19908116603f011681016001600160401b038111828210171561031757610317610256565b60405281815283820160200185101561032e575f5ffd5b8160208501602083015e5f918101602001919091529392505050565b5f6020828403121561035a575f5ffd5b81516001600160401b0381111561036f575f5ffd5b82016101608185031215610381575f5ffd5b61038961026a565b61039282610293565b81526103a060208301610293565b60208201526103b160408301610293565b60408201526103c260608301610293565b60608201526103d360808301610293565b60808201526103e460a083016102ae565b60a08201526103f560c083016102ae565b60c082015261040660e083016102ae565b60e082015261041861010083016102ae565b61010082015261042b61012083016102ae565b6101208201526101408201516001600160401b0381111561044a575f5ffd5b610456868285016102c1565b61014083015250949350505050565b5f63ffffffff83168061048657634e487b7160e01b5f52601260045260245ffd5b8063ffffffff84160691505092915050565b602081525f82518060208401528060208501604085015e5f604082850101526040601f19601f83011684010191505092915050565b805160208083015191908110156104ed575f198160200360031b1b821691505b50919050565b60805160a05160c05160e05161010051610120516101405161016051610180516101a0516101c0516146066105ce5f395f61138701525f81816105f001526124b301525f81816104a4015261341101525f81816103f3015261299801525f818161055201526133cf01525f818161087e01526132b901525f81816107bf01528181613309015261337d01525f81816108d201528181610adc01528181611bff0152611e8c01525f818161057901526134ac01525f81816109450152611b6f01525f81816107510152818161283d01526131ea01526146065ff3fe608060405234801561000f575f5ffd5b50600436106103b3575f3560e01c8063886f1195116101f5578063de02e50311610114578063f6efbb59116100a9578063fabc1cbc11610079578063fabc1cbc14610a33578063fbf1e2c114610a46578063fce36c7d14610a59578063ff9f6cce14610a6c575f5ffd5b8063f6efbb59146109e7578063f74e8eac146109fa578063f8cd844814610a0d578063f96abf2e14610a20575f5ffd5b8063ed71e6a2116100e4578063ed71e6a214610967578063f22cef8514610994578063f2f07ab4146109a7578063f2fde38b146109d4575f5ffd5b8063de02e50314610907578063e063f81f1461091a578063e810ce211461092d578063ea4d3c9b14610940575f5ffd5b8063a50a1d9c1161018a578063bf21a8aa1161015a578063bf21a8aa14610879578063c46db606146108a0578063ca8aa7c7146108cd578063dcbb03b3146108f4575f5ffd5b8063a50a1d9c14610807578063aebd8bae1461081a578063b3dbb0e014610847578063bb7e451f1461085a575f5ffd5b80639cb9a5fa116101c55780639cb9a5fa146107a75780639d45c281146107ba5780639de4b35f146107e1578063a0169ddd146107f4575f5ffd5b8063886f11951461074c5780638da5cb5b146107735780639104c319146107845780639be3d4e41461079f575f5ffd5b80634596021c116102e15780635c975abb11610276578063715018a611610246578063715018a6146106ff5780637b8f8b0514610707578063863cb9a91461070f578063865c695314610722575f5ffd5b80635c975abb146106a25780635e9d8348146106aa57806363f6a798146106bd5780636d21117e146106d2575f5ffd5b806354fd4d50116102b157806354fd4d501461064f57806358baaa3e14610664578063595c6a67146106775780635ac86ab71461067f575f5ffd5b80634596021c146105d85780634657e26a146105eb5780634b943960146106125780634d18cc3514610638575f5ffd5b8063149bc8721161035757806339b70e381161032757806339b70e38146105745780633a8c07861461059b5780633ccc861d146105b25780633efe1db6146105c5575f5ffd5b8063149bc872146104d95780632b9f64a4146104fa57806336af41fa1461053a57806337838ed01461054d575f5ffd5b80630e9a53cf116103925780630e9a53cf1461043f5780630eb383451461048c578063131433b41461049f578063136439dd146104c6575f5ffd5b806218572c146103b757806304a0c502146103ee5780630ca298991461042a575b5f5ffd5b6103d96103c5366004613a33565b60d16020525f908152604090205460ff1681565b60405190151581526020015b60405180910390f35b6104157f000000000000000000000000000000000000000000000000000000000000000081565b60405163ffffffff90911681526020016103e5565b61043d610438366004613aab565b610a7f565b005b610447610d25565b6040516103e591905f6080820190508251825263ffffffff602084015116602083015263ffffffff604084015116604083015260608301511515606083015292915050565b61043d61049a366004613b07565b610e25565b6104157f000000000000000000000000000000000000000000000000000000000000000081565b61043d6104d4366004613b3e565b610ea5565b6104ec6104e7366004613b55565b610edf565b6040519081526020016103e5565b610522610508366004613a33565b60cc6020525f90815260409020546001600160a01b031681565b6040516001600160a01b0390911681526020016103e5565b61043d610548366004613b6f565b610f54565b6104157f000000000000000000000000000000000000000000000000000000000000000081565b6105227f000000000000000000000000000000000000000000000000000000000000000081565b60cb5461041590600160a01b900463ffffffff1681565b61043d6105c0366004613bbe565b6110c5565b61043d6105d3366004613c14565b6110ec565b61043d6105e6366004613c3e565b6112c2565b6105227f000000000000000000000000000000000000000000000000000000000000000081565b610625610620366004613a33565b611325565b60405161ffff90911681526020016103e5565b60cb5461041590600160c01b900463ffffffff1681565b610657611380565b6040516103e59190613c90565b61043d610672366004613cc5565b6113b0565b61043d6113c4565b6103d961068d366004613cde565b606654600160ff9092169190911b9081161490565b6066546104ec565b6103d96106b8366004613cfe565b6113d8565b60cb5461062590600160e01b900461ffff1681565b6103d96106e0366004613d2f565b60cf60209081525f928352604080842090915290825290205460ff1681565b61043d611463565b60ca546104ec565b61043d61071d366004613a33565b611474565b6104ec610730366004613d59565b60cd60209081525f928352604080842090915290825290205481565b6105227f000000000000000000000000000000000000000000000000000000000000000081565b6033546001600160a01b0316610522565b61052273beac0eeeeeeeeeeeeeeeeeeeeeeeeeeeeeebeac081565b610447611485565b61043d6107b5366004613d85565b611521565b6104157f000000000000000000000000000000000000000000000000000000000000000081565b6106256107ef366004613dbc565b61169c565b61043d610802366004613a33565b61171f565b61043d610815366004613df8565b61172a565b6103d9610828366004613d2f565b60d260209081525f928352604080842090915290825290205460ff1681565b61043d610855366004613e11565b61173b565b6104ec610868366004613a33565b60ce6020525f908152604090205481565b6104157f000000000000000000000000000000000000000000000000000000000000000081565b6103d96108ae366004613d2f565b60d060209081525f928352604080842090915290825290205460ff1681565b6105227f000000000000000000000000000000000000000000000000000000000000000081565b61043d610902366004613e3b565b611866565b610447610915366004613b3e565b6119b3565b610625610928366004613d59565b611a43565b61041561093b366004613b3e565b611aa8565b6105227f000000000000000000000000000000000000000000000000000000000000000081565b6103d9610975366004613d2f565b60d360209081525f928352604080842090915290825290205460ff1681565b61043d6109a2366004613d59565b611b29565b6103d96109b5366004613d2f565b60d760209081525f928352604080842090915290825290205460ff1681565b61043d6109e2366004613a33565b611c93565b61043d6109f5366004613e7f565b611d0e565b61043d610a08366004613edd565b611e43565b6104ec610a1b366004613b55565b61200a565b61043d610a2e366004613cc5565b61201a565b61043d610a41366004613b3e565b61214b565b60cb54610522906001600160a01b031681565b61043d610a67366004613b6f565b6121b8565b61043d610a7a366004613b6f565b6122e9565b6009610a8a8161244a565b610a976020850185613a33565b610aa081612475565b610abd5760405163932d94f760e01b815260040160405180910390fd5b610ac561251f565b6040516304c1b8eb60e31b81526001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169063260dc75890610b11908890600401613f48565b602060405180830381865afa158015610b2c573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610b509190613f56565b610b6d57604051631fb1705560e21b815260040160405180910390fd5b5f5b83811015610d135736858583818110610b8a57610b8a613f71565b9050602002810190610b9c9190613f85565b90505f60ce81610baf60208b018b613a33565b6001600160a01b031681526020808201929092526040015f90812054925090610bda908a018a613a33565b8284604051602001610bee939291906141ad565b6040516020818303038152906040528051906020012090505f610c1084612578565b9050600160d75f610c2460208e018e613a33565b6001600160a01b0316815260208082019290925260409081015f9081208682529092529020805460ff1916911515919091179055610c638360016141f0565b60ce5f610c7360208e018e613a33565b6001600160a01b03166001600160a01b031681526020019081526020015f208190555081336001600160a01b03167ffff0759ccb371dfb5691798724e70b4fa61cb3bfe730a33ac19fb86a48efc7568c8688604051610cd493929190614203565b60405180910390a3610d03333083610cf26040890160208a01613a33565b6001600160a01b0316929190612763565b505060019092019150610b6f9050565b50610d1e6001609755565b5050505050565b604080516080810182525f80825260208201819052918101829052606081019190915260ca545b8015610dfd575f60ca610d60600184614228565b81548110610d7057610d70613f71565b5f91825260209182902060408051608081018252600293909302909101805483526001015463ffffffff80821694840194909452600160201b810490931690820152600160401b90910460ff161580156060830181905291925090610ddf5750806040015163ffffffff164210155b15610dea5792915050565b5080610df58161423b565b915050610d4c565b5050604080516080810182525f80825260208201819052918101829052606081019190915290565b610e2d6127ce565b6001600160a01b0382165f81815260d1602052604080822054905160ff9091169284151592841515927f4de6293e668df1398422e1def12118052c1539a03cbfedc145895d48d7685f1c9190a4506001600160a01b03919091165f90815260d160205260409020805460ff1916911515919091179055565b610ead612828565b6066548181168114610ed25760405163c61dca5d60e01b815260040160405180910390fd5b610edb826128cb565b5050565b5f80610eee6020840184613a33565b8360200135604051602001610f379392919060f89390931b6001600160f81b031916835260609190911b6bffffffffffffffffffffffff19166001830152601582015260350190565b604051602081830303815290604052805190602001209050919050565b6001610f5f8161244a565b335f90815260d1602052604090205460ff16610f8e57604051635c427cd960e01b815260040160405180910390fd5b610f9661251f565b5f5b828110156110b55736848483818110610fb357610fb3613f71565b9050602002810190610fc59190614250565b335f81815260ce60209081526040808320549051949550939192610fef92909185918791016142e2565b60405160208183030381529060405280519060200120905061101083612908565b335f90815260d0602090815260408083208484529091529020805460ff191660019081179091556110429083906141f0565b335f81815260ce602052604090819020929092559051829184917f51088b8c89628df3a8174002c2a034d0152fce6af8415d651b2a4734bf27048290611089908890614308565b60405180910390a46110aa333060408601803590610cf29060208901613a33565b505050600101610f98565b506110c06001609755565b505050565b60026110d08161244a565b6110d861251f565b6110e283836129f3565b6110c06001609755565b60036110f78161244a565b60cb546001600160a01b0316331461112257604051635c427cd960e01b815260040160405180910390fd5b60cb5463ffffffff600160c01b90910481169083161161115557604051631ca7e50b60e21b815260040160405180910390fd5b428263ffffffff161061117b576040516306957c9160e11b815260040160405180910390fd5b60ca5460cb545f9061119a90600160a01b900463ffffffff164261431a565b6040805160808101825287815263ffffffff87811660208084018281528684168587018181525f6060880181815260ca8054600181018255925297517f42d72674974f694b5f5159593243114d38a5c39c89d6b62fee061ff523240ee160029092029182015592517f42d72674974f694b5f5159593243114d38a5c39c89d6b62fee061ff523240ee290930180549151975193871667ffffffffffffffff1990921691909117600160201b978716979097029690961760ff60401b1916600160401b921515929092029190911790945560cb805463ffffffff60c01b1916600160c01b840217905593519283529394508892908616917fecd866c3c158fa00bf34d803d5f6023000b57080bcb48af004c2b4b46b3afd08910160405180910390a45050505050565b60026112cd8161244a565b6112d561251f565b5f5b838110156113145761130c8585838181106112f4576112f4613f71565b90506020028101906113069190614336565b846129f3565b6001016112d7565b5061131f6001609755565b50505050565b6001600160a01b0381165f90815260d5602090815260408083208151606081018352905461ffff80821683526201000082041693820193909352600160201b90920463ffffffff169082015261137a90612c7b565b92915050565b60606113ab7f0000000000000000000000000000000000000000000000000000000000000000612ceb565b905090565b6113b86127ce565b6113c181612d28565b50565b6113cc612828565b6113d65f196128cb565b565b5f61145b8260ca6113ec6020830183613cc5565b63ffffffff168154811061140257611402613f71565b5f91825260209182902060408051608081018252600293909302909101805483526001015463ffffffff80821694840194909452600160201b810490931690820152600160401b90910460ff1615156060820152612d99565b506001919050565b61146b6127ce565b6113d65f612f3c565b61147c6127ce565b6113c181612f8d565b604080516080810182525f80825260208201819052918101829052606081019190915260ca80546114b890600190614228565b815481106114c8576114c8613f71565b5f91825260209182902060408051608081018252600293909302909101805483526001015463ffffffff80821694840194909452600160201b810490931690820152600160401b90910460ff1615156060820152919050565b600561152c8161244a565b8361153681612475565b6115535760405163932d94f760e01b815260040160405180910390fd5b61155b61251f565b5f5b83811015610d13573685858381811061157857611578613f71565b905060200281019061158a9190613f85565b6001600160a01b0388165f90815260ce60209081526040808320549051939450926115bb918b9185918791016141ad565b6040516020818303038152906040528051906020012090505f6115dd84612578565b6001600160a01b038b165f90815260d3602090815260408083208684529091529020805460ff1916600190811790915590915061161b9084906141f0565b6001600160a01b038b165f81815260ce60205260409081902092909255905183919033907ffc8888bffd711da60bc5092b33f677d81896fe80ecc677b84cfab8184462b6e09061166e9088908a9061434a565b60405180910390a461168c333083610cf26040890160208a01613a33565b50506001909201915061155d9050565b6001600160a01b0382165f90815260d66020526040812061171890826116cf6116ca36879003870187614362565b612fe8565b815260208082019290925260409081015f208151606081018352905461ffff80821683526201000082041693820193909352600160201b90920463ffffffff1690820152612c7b565b9392505050565b33610edb818361304b565b6117326127ce565b6113c1816130ae565b60076117468161244a565b8261175081612475565b61176d5760405163932d94f760e01b815260040160405180910390fd5b60cb545f9061178990600160a01b900463ffffffff164261431a565b6001600160a01b0386165f90815260d5602090815260408083208151606081018352905461ffff80821683526201000082041693820193909352600160201b90920463ffffffff1690820152919250906117e290612c7b565b6001600160a01b0387165f90815260d560205260409020909150611807908684613119565b6040805163ffffffff8416815261ffff838116602083015287168183015290516001600160a01b0388169133917fd1e028bd664486a46ad26040e999cd2d22e1e9a094ee6afe19fcf64678f16f749181900360600190a3505050505050565b60066118718161244a565b8361187b81612475565b6118985760405163932d94f760e01b815260040160405180910390fd5b60cb545f906118b490600160a01b900463ffffffff164261431a565b6001600160a01b038781165f90815260d460209081526040808320938a1683529281528282208351606081018552905461ffff80821683526201000082041692820192909252600160201b90910463ffffffff169281019290925291925061191b90612c7b565b6001600160a01b038089165f90815260d460209081526040808320938b1683529290522090915061194d908684613119565b6040805163ffffffff8416815261ffff838116602083015287168183015290516001600160a01b0388811692908a169133917f48e198b6ae357e529204ee53a8e514c470ff77d9cc8e4f7207f8b5d490ae6934919081900360600190a450505050505050565b604080516080810182525f80825260208201819052918101829052606081019190915260ca82815481106119e9576119e9613f71565b5f91825260209182902060408051608081018252600293909302909101805483526001015463ffffffff80821694840194909452600160201b810490931690820152600160401b90910460ff161515606082015292915050565b6001600160a01b038281165f90815260d46020908152604080832093851683529281528282208351606081018552905461ffff80821683526201000082041692820192909252600160201b90910463ffffffff16928101929092529061171890612c7b565b60ca545f905b63ffffffff811615611b0f578260ca611ac86001846143ca565b63ffffffff1681548110611ade57611ade613f71565b905f5260205f2090600202015f015403611afd576117186001826143ca565b80611b07816143e6565b915050611aae565b5060405163504570e360e01b815260040160405180910390fd5b81611b3381612475565b611b505760405163932d94f760e01b815260040160405180910390fd5b6040516336b87bd760e11b81526001600160a01b0384811660048301527f00000000000000000000000000000000000000000000000000000000000000001690636d70f7ae90602401602060405180830381865afa158015611bb4573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611bd89190613f56565b80611c6c575060405163ba1a84e560e01b81526001600160a01b0384811660048301525f917f00000000000000000000000000000000000000000000000000000000000000009091169063ba1a84e590602401602060405180830381865afa158015611c46573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611c6a9190614404565b115b611c895760405163fb494ea160e01b815260040160405180910390fd5b6110c0838361304b565b611c9b6127ce565b6001600160a01b038116611d055760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084015b60405180910390fd5b6113c181612f3c565b5f54610100900460ff1615808015611d2c57505f54600160ff909116105b80611d455750303b158015611d4557505f5460ff166001145b611da85760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b6064820152608401611cfc565b5f805460ff191660011790558015611dc9575f805461ff0019166101001790555b611dd2856128cb565b611ddb86612f3c565b611de484612f8d565b611ded83612d28565b611df6826130ae565b8015611e3b575f805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b505050505050565b6008611e4e8161244a565b83611e5881612475565b611e755760405163932d94f760e01b815260040160405180910390fd5b6040516304c1b8eb60e31b81526001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169063260dc75890611ec1908790600401613f48565b602060405180830381865afa158015611edc573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611f009190613f56565b611f1d57604051631fb1705560e21b815260040160405180910390fd5b60cb545f90611f3990600160a01b900463ffffffff164261431a565b6001600160a01b0387165f90815260d66020526040812091925090611f6b90826116cf6116ca368b90038b018b614362565b6001600160a01b0388165f90815260d660205260408120919250611fb09190611f9c6116ca368b90038b018b614362565b81526020019081526020015f208684613119565b866001600160a01b0316336001600160a01b03167f14918b3834ab6752eb2e1b489b6663a67810efb5f56f3944a97ede8ecf1fd9f18885858a604051611ff9949392919061441b565b60405180910390a350505050505050565b5f6001610eee6020840184613a33565b60036120258161244a565b60cb546001600160a01b0316331461205057604051635c427cd960e01b815260040160405180910390fd5b60ca5463ffffffff831610612078576040516394a8d38960e01b815260040160405180910390fd5b5f60ca8363ffffffff168154811061209257612092613f71565b905f5260205f20906002020190508060010160089054906101000a900460ff16156120d057604051631b14174b60e01b815260040160405180910390fd5b6001810154600160201b900463ffffffff16421061210157604051630c36f66560e21b815260040160405180910390fd5b60018101805460ff60401b1916600160401b17905560405163ffffffff8416907fd850e6e5dfa497b72661fa73df2923464eaed9dc2ff1d3cb82bccbfeabe5c41e905f90a2505050565b6121536131e8565b6066548019821981161461217a5760405163c61dca5d60e01b815260040160405180910390fd5b606682905560405182815233907f3582d1828e26bf56bd801502bc021ac0bc8afb57c826e4986b45593c8fad389c9060200160405180910390a25050565b5f6121c28161244a565b6121ca61251f565b5f5b828110156110b557368484838181106121e7576121e7613f71565b90506020028101906121f99190614250565b335f81815260ce6020908152604080832054905194955093919261222392909185918791016142e2565b60405160208183030381529060405280519060200120905061224483612908565b335f90815260cf602090815260408083208484529091529020805460ff191660019081179091556122769083906141f0565b335f81815260ce602052604090819020929092559051829184917f450a367a380c4e339e5ae7340c8464ef27af7781ad9945cfe8abd828f89e6281906122bd908890614308565b60405180910390a46122de333060408601803590610cf29060208901613a33565b5050506001016121cc565b60046122f48161244a565b335f90815260d1602052604090205460ff1661232357604051635c427cd960e01b815260040160405180910390fd5b61232b61251f565b5f5b828110156110b5573684848381811061234857612348613f71565b905060200281019061235a9190614250565b335f81815260ce6020908152604080832054905194955093919261238492909185918791016142e2565b6040516020818303038152906040528051906020012090506123a583612908565b335f90815260d2602090815260408083208484529091529020805460ff191660019081179091556123d79083906141f0565b335f81815260ce602052604090819020929092559051829184917f5251b6fdefcb5d81144e735f69ea4c695fd43b0289ca53dc075033f5fc80068b9061241e908890614308565b60405180910390a461243f333060408601803590610cf29060208901613a33565b50505060010161232d565b606654600160ff83161b908116036113c15760405163840a48d560e01b815260040160405180910390fd5b604051631beb2b9760e31b81526001600160a01b0382811660048301523360248301523060448301525f80356001600160e01b0319166064840152917f00000000000000000000000000000000000000000000000000000000000000009091169063df595cb8906084016020604051808303815f875af11580156124fb573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061137a9190613f56565b6002609754036125715760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401611cfc565b6002609755565b5f6125ab612586838061444f565b6125966080860160608701613cc5565b6125a660a0870160808801613cc5565b613299565b5f6125b9604084018461444f565b9050116125d95760405163796cc52560e01b815260040160405180910390fd5b426125ea60a0840160808501613cc5565b6125fa6080850160608601613cc5565b612604919061431a565b63ffffffff16106126285760405163150358a160e21b815260040160405180910390fd5b5f80805b612639604086018661444f565b905081101561272a5736612650604087018761444f565b8381811061266057612660613f71565b6040029190910191505f90506126796020830183613a33565b6001600160a01b0316036126a057604051630863a45360e11b815260040160405180910390fd5b6126ad6020820182613a33565b6001600160a01b0316836001600160a01b0316106126de576040516310fb47f160e31b815260040160405180910390fd5b5f816020013511612702576040516310eb483f60e21b815260040160405180910390fd5b61270f6020820182613a33565b925061271f6020820135856141f0565b93505060010161262c565b506f4b3b4ca85a86c47a098a223fffffffff82111561275c5760405163070b5a6f60e21b815260040160405180910390fd5b5092915050565b6040516001600160a01b038085166024830152831660448201526064810182905261131f9085906323b872dd60e01b906084015b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b031990931692909217909152613597565b6033546001600160a01b031633146113d65760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401611cfc565b60405163237dfb4760e11b81523360048201527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906346fbf68e90602401602060405180830381865afa15801561288a573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906128ae9190613f56565b6113d657604051631d77d47760e21b815260040160405180910390fd5b606681905560405181815233907fab40a374bc51de372200a8bc981af8c9ecdc08dfdaef0bb6e09f88f3c616ef3d9060200160405180910390a250565b612935612915828061444f565b6129256080850160608601613cc5565b6125a660a0860160808701613cc5565b5f816040013511612959576040516310eb483f60e21b815260040160405180910390fd5b6f4b3b4ca85a86c47a098a223fffffffff8160400135111561298e5760405163070b5a6f60e21b815260040160405180910390fd5b6129be63ffffffff7f000000000000000000000000000000000000000000000000000000000000000016426141f0565b6129ce6080830160608401613cc5565b63ffffffff1611156113c157604051637ee2b44360e01b815260040160405180910390fd5b5f60ca612a036020850185613cc5565b63ffffffff1681548110612a1957612a19613f71565b5f91825260209182902060408051608081018252600293909302909101805483526001015463ffffffff80821694840194909452600160201b810490931690820152600160401b90910460ff16151560608201529050612a798382612d99565b5f612a8a6080850160608601613a33565b6001600160a01b038082165f90815260cc60205260409020549192501680612aaf5750805b336001600160a01b03821614612ad857604051635c427cd960e01b815260040160405180910390fd5b5f5b612ae760a0870187614494565b9050811015611e3b5736612afe60e088018861444f565b83818110612b0e57612b0e613f71565b6001600160a01b0387165f90815260cd602090815260408083209302949094019450929091508290612b4290850185613a33565b6001600160a01b03166001600160a01b031681526020019081526020015f2054905080826020013511612b885760405163aa385e8160e01b815260040160405180910390fd5b5f612b97826020850135614228565b6001600160a01b0387165f90815260cd60209081526040822092935085018035929190612bc49087613a33565b6001600160a01b031681526020808201929092526040015f2091909155612c059089908390612bf590870187613a33565b6001600160a01b0316919061366a565b86516001600160a01b03808a1691878216918916907f9543dbd55580842586a951f0386e24d68a5df99ae29e3b216588b45fd684ce3190612c496020890189613a33565b604080519283526001600160a01b039091166020830152810186905260600160405180910390a4505050600101612ada565b5f816040015163ffffffff165f1480612cad5750815161ffff908116148015612cad5750816040015163ffffffff1642105b15612cc557505060cb54600160e01b900461ffff1690565b816040015163ffffffff16421015612cde57815161137a565b506020015190565b919050565b60605f612cf78361369a565b6040805160208082528183019092529192505f91906020820181803683375050509182525060208101929092525090565b60cb546040805163ffffffff600160a01b9093048316815291831660208301527faf557c6c02c208794817a705609cfa935f827312a1adfdd26494b6b95dd2b4b3910160405180910390a160cb805463ffffffff909216600160a01b0263ffffffff60a01b19909216919091179055565b806060015115612dbc57604051631b14174b60e01b815260040160405180910390fd5b806040015163ffffffff16421015612de757604051631437a2bb60e31b815260040160405180910390fd5b612df460c0830183614494565b9050612e0360a0840184614494565b905014612e23576040516343714afd60e01b815260040160405180910390fd5b612e3060e083018361444f565b9050612e3f60c0840184614494565b905014612e5f576040516343714afd60e01b815260040160405180910390fd5b8051612e8b90612e756040850160208601613cc5565b612e8260408601866144d9565b866060016136c1565b5f5b612e9a60a0840184614494565b90508110156110c057612f346080840135612eb860a0860186614494565b84818110612ec857612ec8613f71565b9050602002016020810190612edd9190613cc5565b612eea60c0870187614494565b85818110612efa57612efa613f71565b9050602002810190612f0c91906144d9565b612f1960e089018961444f565b87818110612f2957612f29613f71565b905060400201613765565b600101612e8d565b603380546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a35050565b60cb546040516001600160a01b038084169216907f237b82f438d75fc568ebab484b75b01d9287b9e98b490b7c23221623b6705dbb905f90a360cb80546001600160a01b0319166001600160a01b0392909216919091179055565b5f815f0151826020015163ffffffff1660405160200161303392919060609290921b6bffffffffffffffffffffffff1916825260a01b6001600160a01b031916601482015260200190565b60405160208183030381529060405261137a9061451b565b6001600160a01b038083165f81815260cc602052604080822080548686166001600160a01b0319821681179092559151919094169392849290917fbab947934d42e0ad206f25c9cab18b5bb6ae144acfb00f40b4e3aa59590ca3129190a4505050565b60cb546040805161ffff600160e01b9093048316815291831660208301527fe6cd4edfdcc1f6d130ab35f73d72378f3a642944fb4ee5bd84b7807a81ea1c4e910160405180910390a160cb805461ffff909216600160e01b0261ffff60e01b19909216919091179055565b61271061ffff831611156131405760405163891c63df60e01b815260040160405180910390fd5b8254600160201b900463ffffffff16421161316e57604051637b1e25c560e01b815260040160405180910390fd5b8254600160201b900463ffffffff165f0361319557825461ffff191661ffff1783556131ac565b825462010000810461ffff1661ffff199091161783555b825463ffffffff909116600160201b0267ffffffff000000001961ffff90931662010000029290921667ffffffffffff00001990911617179055565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663eab66d7a6040518163ffffffff1660e01b8152600401602060405180830381865afa158015613244573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190613268919061453e565b6001600160a01b0316336001600160a01b0316146113d65760405163794821ff60e01b815260040160405180910390fd5b826132b75760405163796cc52560e01b815260040160405180910390fd5b7f000000000000000000000000000000000000000000000000000000000000000063ffffffff168163ffffffff16111561330457604051630dd0b9f560e21b815260040160405180910390fd5b61332e7f00000000000000000000000000000000000000000000000000000000000000008261456d565b63ffffffff16156133525760405163ee66470560e01b815260040160405180910390fd5b5f8163ffffffff16116133785760405163cb3f434d60e01b815260040160405180910390fd5b6133a27f00000000000000000000000000000000000000000000000000000000000000008361456d565b63ffffffff16156133c657604051633c1a94f160e21b815260040160405180910390fd5b8163ffffffff167f000000000000000000000000000000000000000000000000000000000000000063ffffffff16426133ff9190614228565b1115801561343957508163ffffffff167f000000000000000000000000000000000000000000000000000000000000000063ffffffff1611155b6134565760405163041aa75760e11b815260040160405180910390fd5b5f805b84811015611e3b575f86868381811061347457613474613f71565b61348a9260206040909202019081019150613a33565b60405163198f077960e21b81526001600160a01b0380831660048301529192507f00000000000000000000000000000000000000000000000000000000000000009091169063663c1de490602401602060405180830381865afa1580156134f3573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906135179190613f56565b8061353e57506001600160a01b03811673beac0eeeeeeeeeeeeeeeeeeeeeeeeeeeeeebeac0145b61355b57604051632efd965160e11b815260040160405180910390fd5b806001600160a01b0316836001600160a01b03161061358d5760405163dfad9ca160e01b815260040160405180910390fd5b9150600101613459565b5f6135eb826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b03166137a39092919063ffffffff16565b905080515f148061360b57508080602001905181019061360b9190613f56565b6110c05760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b6064820152608401611cfc565b6040516001600160a01b0383166024820152604481018290526110c090849063a9059cbb60e01b90606401612797565b5f60ff8216601f81111561137a57604051632cd44ac360e21b815260040160405180910390fd5b6136cc602083614594565b6001901b8463ffffffff16106136f45760405162c6c39d60e71b815260040160405180910390fd5b5f6136fe82610edf565b905061374884848080601f0160208091040260200160405190810160405280939291908181526020018383808284375f920191909152508a92508591505063ffffffff89166137b9565b611e3b576040516369ca16c960e01b815260040160405180910390fd5b613770602083614594565b6001901b8463ffffffff16106137995760405163054ff4df60e51b815260040160405180910390fd5b5f6136fe8261200a565b60606137b184845f856137ee565b949350505050565b5f836137d8576040516329e7276760e11b815260040160405180910390fd5b836137e48685856138c5565b1495945050505050565b60608247101561384f5760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6044820152651c8818d85b1b60d21b6064820152608401611cfc565b5f5f866001600160a01b0316858760405161386a91906145a7565b5f6040518083038185875af1925050503d805f81146138a4576040519150601f19603f3d011682016040523d82523d5f602084013e6138a9565b606091505b50915091506138ba87838387613982565b979650505050505050565b5f83515f036138d5575081611718565b602084516138e391906145bd565b15613901576040516313717da960e21b815260040160405180910390fd5b8260205b85518111613962576139186002856145bd565b5f0361393957815f528086015160205260405f209150600284049350613950565b808601515f528160205260405f2091506002840493505b61395b6020826141f0565b9050613905565b5082156137b1576040516363df817160e01b815260040160405180910390fd5b606083156139f05782515f036139e9576001600160a01b0385163b6139e95760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401611cfc565b50816137b1565b6137b18383815115613a055781518083602001fd5b8060405162461bcd60e51b8152600401611cfc9190613c90565b6001600160a01b03811681146113c1575f5ffd5b5f60208284031215613a43575f5ffd5b813561171881613a1f565b5f60408284031215613a5e575f5ffd5b50919050565b5f5f83601f840112613a74575f5ffd5b5081356001600160401b03811115613a8a575f5ffd5b6020830191508360208260051b8501011115613aa4575f5ffd5b9250929050565b5f5f5f60608486031215613abd575f5ffd5b613ac78585613a4e565b925060408401356001600160401b03811115613ae1575f5ffd5b613aed86828701613a64565b9497909650939450505050565b80151581146113c1575f5ffd5b5f5f60408385031215613b18575f5ffd5b8235613b2381613a1f565b91506020830135613b3381613afa565b809150509250929050565b5f60208284031215613b4e575f5ffd5b5035919050565b5f60408284031215613b65575f5ffd5b6117188383613a4e565b5f5f60208385031215613b80575f5ffd5b82356001600160401b03811115613b95575f5ffd5b613ba185828601613a64565b90969095509350505050565b5f6101008284031215613a5e575f5ffd5b5f5f60408385031215613bcf575f5ffd5b82356001600160401b03811115613be4575f5ffd5b613bf085828601613bad565b9250506020830135613b3381613a1f565b803563ffffffff81168114612ce6575f5ffd5b5f5f60408385031215613c25575f5ffd5b82359150613c3560208401613c01565b90509250929050565b5f5f5f60408486031215613c50575f5ffd5b83356001600160401b03811115613c65575f5ffd5b613c7186828701613a64565b9094509250506020840135613c8581613a1f565b809150509250925092565b602081525f82518060208401528060208501604085015e5f604082850101526040601f19601f83011684010191505092915050565b5f60208284031215613cd5575f5ffd5b61171882613c01565b5f60208284031215613cee575f5ffd5b813560ff81168114611718575f5ffd5b5f60208284031215613d0e575f5ffd5b81356001600160401b03811115613d23575f5ffd5b6137b184828501613bad565b5f5f60408385031215613d40575f5ffd5b8235613d4b81613a1f565b946020939093013593505050565b5f5f60408385031215613d6a575f5ffd5b8235613d7581613a1f565b91506020830135613b3381613a1f565b5f5f5f60408486031215613d97575f5ffd5b8335613da281613a1f565b925060208401356001600160401b03811115613ae1575f5ffd5b5f5f60608385031215613dcd575f5ffd5b8235613dd881613a1f565b9150613c358460208501613a4e565b803561ffff81168114612ce6575f5ffd5b5f60208284031215613e08575f5ffd5b61171882613de7565b5f5f60408385031215613e22575f5ffd5b8235613e2d81613a1f565b9150613c3560208401613de7565b5f5f5f60608486031215613e4d575f5ffd5b8335613e5881613a1f565b92506020840135613e6881613a1f565b9150613e7660408501613de7565b90509250925092565b5f5f5f5f5f60a08688031215613e93575f5ffd5b8535613e9e81613a1f565b9450602086013593506040860135613eb581613a1f565b9250613ec360608701613c01565b9150613ed160808701613de7565b90509295509295909350565b5f5f5f60808486031215613eef575f5ffd5b8335613efa81613a1f565b9250613f098560208601613a4e565b9150613e7660608501613de7565b8035613f2281613a1f565b6001600160a01b0316825263ffffffff613f3e60208301613c01565b1660208301525050565b6040810161137a8284613f17565b5f60208284031215613f66575f5ffd5b815161171881613afa565b634e487b7160e01b5f52603260045260245ffd5b5f823560be19833603018112613f99575f5ffd5b9190910192915050565b5f5f8335601e19843603018112613fb8575f5ffd5b83016020810192503590506001600160401b03811115613fd6575f5ffd5b8060061b3603821315613aa4575f5ffd5b8183526020830192505f815f5b8481101561404a57813561400781613a1f565b6001600160a01b0316865260208201356bffffffffffffffffffffffff8116808214614031575f5ffd5b6020880152506040958601959190910190600101613ff4565b5093949350505050565b5f5f8335601e19843603018112614069575f5ffd5b83016020810192503590506001600160401b03811115614087575f5ffd5b803603821315613aa4575f5ffd5b81835281816020850137505f828201602090810191909152601f909101601f19169091010190565b5f6140c88283613fa3565b60c085526140da60c086018284613fe7565b91505060208301356140eb81613a1f565b6001600160a01b031660208501526141066040840184613fa3565b858303604087015280835290915f91906020015b8183101561415557833561412d81613a1f565b6001600160a01b0316815260208481013590820152604093840193600193909301920161411a565b61416160608701613c01565b63ffffffff81166060890152935061417b60808701613c01565b63ffffffff81166080890152935061419660a0870187614054565b9450925086810360a08801526138ba818585614095565b60018060a01b0384168152826020820152606060408201525f6141d360608301846140bd565b95945050505050565b634e487b7160e01b5f52601160045260245ffd5b8082018082111561137a5761137a6141dc565b61420d8185613f17565b826040820152608060608201525f6141d360808301846140bd565b8181038181111561137a5761137a6141dc565b5f81614249576142496141dc565b505f190190565b5f8235609e19833603018112613f99575f5ffd5b5f61426f8283613fa3565b60a0855261428160a086018284613fe7565b915050602083013561429281613a1f565b6001600160a01b031660208501526040838101359085015263ffffffff6142bb60608501613c01565b16606085015263ffffffff6142d260808501613c01565b1660808501528091505092915050565b60018060a01b0384168152826020820152606060408201525f6141d36060830184614264565b602081525f6117186020830184614264565b63ffffffff818116838216019081111561137a5761137a6141dc565b5f823560fe19833603018112613f99575f5ffd5b828152604060208201525f6137b160408301846140bd565b5f6040828403128015614373575f5ffd5b50604080519081016001600160401b03811182821017156143a257634e487b7160e01b5f52604160045260245ffd5b60405282356143b081613a1f565b81526143be60208401613c01565b60208201529392505050565b63ffffffff828116828216039081111561137a5761137a6141dc565b5f63ffffffff8216806143fb576143fb6141dc565b5f190192915050565b5f60208284031215614414575f5ffd5b5051919050565b60a081016144298287613f17565b63ffffffff94909416604082015261ffff92831660608201529116608090910152919050565b5f5f8335601e19843603018112614464575f5ffd5b8301803591506001600160401b0382111561447d575f5ffd5b6020019150600681901b3603821315613aa4575f5ffd5b5f5f8335601e198436030181126144a9575f5ffd5b8301803591506001600160401b038211156144c2575f5ffd5b6020019150600581901b3603821315613aa4575f5ffd5b5f5f8335601e198436030181126144ee575f5ffd5b8301803591506001600160401b03821115614507575f5ffd5b602001915036819003821315613aa4575f5ffd5b80516020808301519190811015613a5e575f1960209190910360031b1b16919050565b5f6020828403121561454e575f5ffd5b815161171881613a1f565b634e487b7160e01b5f52601260045260245ffd5b5f63ffffffff83168061458257614582614559565b8063ffffffff84160691505092915050565b5f826145a2576145a2614559565b500490565b5f82518060208501845e5f920191825250919050565b5f826145cb576145cb614559565b50069056fea264697066735822122017addec35ab3e2f446827c6467eb8cd1dc85fee1e287a978c43f77213e5cdd0d64736f6c634300081b0033",
}
⋮----
// 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)
⋮----
// 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)
⋮----
// 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)
⋮----
// 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)
⋮----
// Version is a free data retrieval call binding the contract method 0x54fd4d50.
⋮----
// Solidity: function version() view returns(string)
func (_RewardsCoordinator *RewardsCoordinatorCaller) Version(opts *bind.CallOpts) (string, error)
⋮----
// 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)
⋮----
// 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)
⋮----
// 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 0xf6efbb59.
⋮----
// Solidity: function initialize(address initialOwner, uint256 initialPausedStatus, address _rewardsUpdater, uint32 _activationDelay, uint16 _defaultSplitBips) returns()
func (_RewardsCoordinator *RewardsCoordinatorTransactor) Initialize(opts *bind.TransactOpts, initialOwner common.Address, initialPausedStatus *big.Int, _rewardsUpdater common.Address, _activationDelay uint32, _defaultSplitBips uint16) (*types.Transaction, error)
⋮----
// 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)
⋮----
// 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)
⋮----
// 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)
⋮----
// 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)
⋮----
// 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
}
⋮----
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{}
⋮----
var oldValueRule []interface{}
⋮----
var newValueRule []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)
⋮----
var submitterRule []interface{}
⋮----
// 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)
⋮----
// 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\":\"createOperatorDirectedAVSRewardsSubmission\",\"inputs\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"operatorDirectedRewardsSubmissions\",\"type\":\"tuple[]\",\"internalType\":\"structIRewardsCoordinatorTypes.OperatorDirectedRewardsSubmission[]\",\"components\":[{\"name\":\"strategiesAndMultipliers\",\"type\":\"tuple[]\",\"internalType\":\"structIRewardsCoordinatorTypes.StrategyAndMultiplier[]\",\"components\":[{\"name\":\"strategy\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"},{\"name\":\"multiplier\",\"type\":\"uint96\",\"internalType\":\"uint96\"}]},{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"contractIERC20\"},{\"name\":\"operatorRewards\",\"type\":\"tuple[]\",\"internalType\":\"structIRewardsCoordinatorTypes.OperatorReward[]\",\"components\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]},{\"name\":\"startTimestamp\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"duration\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"description\",\"type\":\"string\",\"internalType\":\"string\"}]}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"createOperatorDirectedOperatorSetRewardsSubmission\",\"inputs\":[{\"name\":\"operatorSet\",\"type\":\"tuple\",\"internalType\":\"structOperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]},{\"name\":\"operatorDirectedRewardsSubmissions\",\"type\":\"tuple[]\",\"internalType\":\"structIRewardsCoordinatorTypes.OperatorDirectedRewardsSubmission[]\",\"components\":[{\"name\":\"strategiesAndMultipliers\",\"type\":\"tuple[]\",\"internalType\":\"structIRewardsCoordinatorTypes.StrategyAndMultiplier[]\",\"components\":[{\"name\":\"strategy\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"},{\"name\":\"multiplier\",\"type\":\"uint96\",\"internalType\":\"uint96\"}]},{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"contractIERC20\"},{\"name\":\"operatorRewards\",\"type\":\"tuple[]\",\"internalType\":\"structIRewardsCoordinatorTypes.OperatorReward[]\",\"components\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]},{\"name\":\"startTimestamp\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"duration\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"description\",\"type\":\"string\",\"internalType\":\"string\"}]}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"createRewardsForAllEarners\",\"inputs\":[{\"name\":\"rewardsSubmissions\",\"type\":\"tuple[]\",\"internalType\":\"structIRewardsCoordinatorTypes.RewardsSubmission[]\",\"components\":[{\"name\":\"strategiesAndMultipliers\",\"type\":\"tuple[]\",\"internalType\":\"structIRewardsCoordinatorTypes.StrategyAndMultiplier[]\",\"components\":[{\"name\":\"strategy\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"},{\"name\":\"multiplier\",\"type\":\"uint96\",\"internalType\":\"uint96\"}]},{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"contractIERC20\"},{\"name\":\"amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"startTimestamp\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"duration\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"createRewardsForAllSubmission\",\"inputs\":[{\"name\":\"rewardsSubmissions\",\"type\":\"tuple[]\",\"internalType\":\"structIRewardsCoordinatorTypes.RewardsSubmission[]\",\"components\":[{\"name\":\"strategiesAndMultipliers\",\"type\":\"tuple[]\",\"internalType\":\"structIRewardsCoordinatorTypes.StrategyAndMultiplier[]\",\"components\":[{\"name\":\"strategy\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"},{\"name\":\"multiplier\",\"type\":\"uint96\",\"internalType\":\"uint96\"}]},{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"contractIERC20\"},{\"name\":\"amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"startTimestamp\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"duration\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"cumulativeClaimed\",\"inputs\":[{\"name\":\"earner\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"contractIERC20\"}],\"outputs\":[{\"name\":\"totalClaimed\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"currRewardsCalculationEndTimestamp\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"defaultOperatorSplitBips\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint16\",\"internalType\":\"uint16\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"delegationManager\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIDelegationManager\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"disableRoot\",\"inputs\":[{\"name\":\"rootIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"getCurrentClaimableDistributionRoot\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"tuple\",\"internalType\":\"structIRewardsCoordinatorTypes.DistributionRoot\",\"components\":[{\"name\":\"root\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"rewardsCalculationEndTimestamp\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"activatedAt\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"disabled\",\"type\":\"bool\",\"internalType\":\"bool\"}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getCurrentDistributionRoot\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"tuple\",\"internalType\":\"structIRewardsCoordinatorTypes.DistributionRoot\",\"components\":[{\"name\":\"root\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"rewardsCalculationEndTimestamp\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"activatedAt\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"disabled\",\"type\":\"bool\",\"internalType\":\"bool\"}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getDistributionRootAtIndex\",\"inputs\":[{\"name\":\"index\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"tuple\",\"internalType\":\"structIRewardsCoordinatorTypes.DistributionRoot\",\"components\":[{\"name\":\"root\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"rewardsCalculationEndTimestamp\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"activatedAt\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"disabled\",\"type\":\"bool\",\"internalType\":\"bool\"}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getDistributionRootsLength\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getOperatorAVSSplit\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint16\",\"internalType\":\"uint16\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getOperatorPISplit\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint16\",\"internalType\":\"uint16\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getOperatorSetSplit\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"operatorSet\",\"type\":\"tuple\",\"internalType\":\"structOperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]}],\"outputs\":[{\"name\":\"\",\"type\":\"uint16\",\"internalType\":\"uint16\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getRootIndexFromHash\",\"inputs\":[{\"name\":\"rootHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"initialize\",\"inputs\":[{\"name\":\"initialOwner\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"initialPausedStatus\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"_rewardsUpdater\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"_activationDelay\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"_defaultSplitBips\",\"type\":\"uint16\",\"internalType\":\"uint16\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"isAVSRewardsSubmissionHash\",\"inputs\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"hash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"valid\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"isOperatorDirectedAVSRewardsSubmissionHash\",\"inputs\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"hash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"valid\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"isOperatorDirectedOperatorSetRewardsSubmissionHash\",\"inputs\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"hash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"valid\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"isRewardsForAllSubmitter\",\"inputs\":[{\"name\":\"submitter\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"valid\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"isRewardsSubmissionForAllEarnersHash\",\"inputs\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"hash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"valid\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"isRewardsSubmissionForAllHash\",\"inputs\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"hash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"valid\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"processClaim\",\"inputs\":[{\"name\":\"claim\",\"type\":\"tuple\",\"internalType\":\"structIRewardsCoordinatorTypes.RewardsMerkleClaim\",\"components\":[{\"name\":\"rootIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"earnerIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"earnerTreeProof\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"earnerLeaf\",\"type\":\"tuple\",\"internalType\":\"structIRewardsCoordinatorTypes.EarnerTreeMerkleLeaf\",\"components\":[{\"name\":\"earner\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"earnerTokenRoot\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]},{\"name\":\"tokenIndices\",\"type\":\"uint32[]\",\"internalType\":\"uint32[]\"},{\"name\":\"tokenTreeProofs\",\"type\":\"bytes[]\",\"internalType\":\"bytes[]\"},{\"name\":\"tokenLeaves\",\"type\":\"tuple[]\",\"internalType\":\"structIRewardsCoordinatorTypes.TokenTreeMerkleLeaf[]\",\"components\":[{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"contractIERC20\"},{\"name\":\"cumulativeEarnings\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]}]},{\"name\":\"recipient\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"processClaims\",\"inputs\":[{\"name\":\"claims\",\"type\":\"tuple[]\",\"internalType\":\"structIRewardsCoordinatorTypes.RewardsMerkleClaim[]\",\"components\":[{\"name\":\"rootIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"earnerIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"earnerTreeProof\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"earnerLeaf\",\"type\":\"tuple\",\"internalType\":\"structIRewardsCoordinatorTypes.EarnerTreeMerkleLeaf\",\"components\":[{\"name\":\"earner\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"earnerTokenRoot\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]},{\"name\":\"tokenIndices\",\"type\":\"uint32[]\",\"internalType\":\"uint32[]\"},{\"name\":\"tokenTreeProofs\",\"type\":\"bytes[]\",\"internalType\":\"bytes[]\"},{\"name\":\"tokenLeaves\",\"type\":\"tuple[]\",\"internalType\":\"structIRewardsCoordinatorTypes.TokenTreeMerkleLeaf[]\",\"components\":[{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"contractIERC20\"},{\"name\":\"cumulativeEarnings\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]}]},{\"name\":\"recipient\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"rewardsUpdater\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"setActivationDelay\",\"inputs\":[{\"name\":\"_activationDelay\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"setClaimerFor\",\"inputs\":[{\"name\":\"claimer\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"setClaimerFor\",\"inputs\":[{\"name\":\"earner\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"claimer\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"setDefaultOperatorSplit\",\"inputs\":[{\"name\":\"split\",\"type\":\"uint16\",\"internalType\":\"uint16\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"setOperatorAVSSplit\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"split\",\"type\":\"uint16\",\"internalType\":\"uint16\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"setOperatorPISplit\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"split\",\"type\":\"uint16\",\"internalType\":\"uint16\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"setOperatorSetSplit\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"operatorSet\",\"type\":\"tuple\",\"internalType\":\"structOperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]},{\"name\":\"split\",\"type\":\"uint16\",\"internalType\":\"uint16\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"setRewardsForAllSubmitter\",\"inputs\":[{\"name\":\"_submitter\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"_newValue\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"setRewardsUpdater\",\"inputs\":[{\"name\":\"_rewardsUpdater\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"strategyManager\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIStrategyManager\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"submissionNonce\",\"inputs\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"nonce\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"submitRoot\",\"inputs\":[{\"name\":\"root\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"rewardsCalculationEndTimestamp\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"version\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"string\",\"internalType\":\"string\"}],\"stateMutability\":\"view\"},{\"type\":\"event\",\"name\":\"AVSRewardsSubmissionCreated\",\"inputs\":[{\"name\":\"avs\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"submissionNonce\",\"type\":\"uint256\",\"indexed\":true,\"internalType\":\"uint256\"},{\"name\":\"rewardsSubmissionHash\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"rewardsSubmission\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structIRewardsCoordinatorTypes.RewardsSubmission\",\"components\":[{\"name\":\"strategiesAndMultipliers\",\"type\":\"tuple[]\",\"internalType\":\"structIRewardsCoordinatorTypes.StrategyAndMultiplier[]\",\"components\":[{\"name\":\"strategy\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"},{\"name\":\"multiplier\",\"type\":\"uint96\",\"internalType\":\"uint96\"}]},{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"contractIERC20\"},{\"name\":\"amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"startTimestamp\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"duration\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ActivationDelaySet\",\"inputs\":[{\"name\":\"oldActivationDelay\",\"type\":\"uint32\",\"indexed\":false,\"internalType\":\"uint32\"},{\"name\":\"newActivationDelay\",\"type\":\"uint32\",\"indexed\":false,\"internalType\":\"uint32\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ClaimerForSet\",\"inputs\":[{\"name\":\"earner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"oldClaimer\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"claimer\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"DefaultOperatorSplitBipsSet\",\"inputs\":[{\"name\":\"oldDefaultOperatorSplitBips\",\"type\":\"uint16\",\"indexed\":false,\"internalType\":\"uint16\"},{\"name\":\"newDefaultOperatorSplitBips\",\"type\":\"uint16\",\"indexed\":false,\"internalType\":\"uint16\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"DistributionRootDisabled\",\"inputs\":[{\"name\":\"rootIndex\",\"type\":\"uint32\",\"indexed\":true,\"internalType\":\"uint32\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"DistributionRootSubmitted\",\"inputs\":[{\"name\":\"rootIndex\",\"type\":\"uint32\",\"indexed\":true,\"internalType\":\"uint32\"},{\"name\":\"root\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"rewardsCalculationEndTimestamp\",\"type\":\"uint32\",\"indexed\":true,\"internalType\":\"uint32\"},{\"name\":\"activatedAt\",\"type\":\"uint32\",\"indexed\":false,\"internalType\":\"uint32\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"OperatorAVSSplitBipsSet\",\"inputs\":[{\"name\":\"caller\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"operator\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"avs\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"activatedAt\",\"type\":\"uint32\",\"indexed\":false,\"internalType\":\"uint32\"},{\"name\":\"oldOperatorAVSSplitBips\",\"type\":\"uint16\",\"indexed\":false,\"internalType\":\"uint16\"},{\"name\":\"newOperatorAVSSplitBips\",\"type\":\"uint16\",\"indexed\":false,\"internalType\":\"uint16\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"OperatorDirectedAVSRewardsSubmissionCreated\",\"inputs\":[{\"name\":\"caller\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"avs\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"operatorDirectedRewardsSubmissionHash\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"submissionNonce\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"operatorDirectedRewardsSubmission\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structIRewardsCoordinatorTypes.OperatorDirectedRewardsSubmission\",\"components\":[{\"name\":\"strategiesAndMultipliers\",\"type\":\"tuple[]\",\"internalType\":\"structIRewardsCoordinatorTypes.StrategyAndMultiplier[]\",\"components\":[{\"name\":\"strategy\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"},{\"name\":\"multiplier\",\"type\":\"uint96\",\"internalType\":\"uint96\"}]},{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"contractIERC20\"},{\"name\":\"operatorRewards\",\"type\":\"tuple[]\",\"internalType\":\"structIRewardsCoordinatorTypes.OperatorReward[]\",\"components\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]},{\"name\":\"startTimestamp\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"duration\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"description\",\"type\":\"string\",\"internalType\":\"string\"}]}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"OperatorDirectedOperatorSetRewardsSubmissionCreated\",\"inputs\":[{\"name\":\"caller\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"operatorDirectedRewardsSubmissionHash\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"operatorSet\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structOperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]},{\"name\":\"submissionNonce\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"operatorDirectedRewardsSubmission\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structIRewardsCoordinatorTypes.OperatorDirectedRewardsSubmission\",\"components\":[{\"name\":\"strategiesAndMultipliers\",\"type\":\"tuple[]\",\"internalType\":\"structIRewardsCoordinatorTypes.StrategyAndMultiplier[]\",\"components\":[{\"name\":\"strategy\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"},{\"name\":\"multiplier\",\"type\":\"uint96\",\"internalType\":\"uint96\"}]},{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"contractIERC20\"},{\"name\":\"operatorRewards\",\"type\":\"tuple[]\",\"internalType\":\"structIRewardsCoordinatorTypes.OperatorReward[]\",\"components\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]},{\"name\":\"startTimestamp\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"duration\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"description\",\"type\":\"string\",\"internalType\":\"string\"}]}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"OperatorPISplitBipsSet\",\"inputs\":[{\"name\":\"caller\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"operator\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"activatedAt\",\"type\":\"uint32\",\"indexed\":false,\"internalType\":\"uint32\"},{\"name\":\"oldOperatorPISplitBips\",\"type\":\"uint16\",\"indexed\":false,\"internalType\":\"uint16\"},{\"name\":\"newOperatorPISplitBips\",\"type\":\"uint16\",\"indexed\":false,\"internalType\":\"uint16\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"OperatorSetSplitBipsSet\",\"inputs\":[{\"name\":\"caller\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"operator\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"operatorSet\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structOperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]},{\"name\":\"activatedAt\",\"type\":\"uint32\",\"indexed\":false,\"internalType\":\"uint32\"},{\"name\":\"oldOperatorSetSplitBips\",\"type\":\"uint16\",\"indexed\":false,\"internalType\":\"uint16\"},{\"name\":\"newOperatorSetSplitBips\",\"type\":\"uint16\",\"indexed\":false,\"internalType\":\"uint16\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"RewardsClaimed\",\"inputs\":[{\"name\":\"root\",\"type\":\"bytes32\",\"indexed\":false,\"internalType\":\"bytes32\"},{\"name\":\"earner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"claimer\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"recipient\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"token\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"contractIERC20\"},{\"name\":\"claimedAmount\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"RewardsForAllSubmitterSet\",\"inputs\":[{\"name\":\"rewardsForAllSubmitter\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"oldValue\",\"type\":\"bool\",\"indexed\":true,\"internalType\":\"bool\"},{\"name\":\"newValue\",\"type\":\"bool\",\"indexed\":true,\"internalType\":\"bool\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"RewardsSubmissionForAllCreated\",\"inputs\":[{\"name\":\"submitter\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"submissionNonce\",\"type\":\"uint256\",\"indexed\":true,\"internalType\":\"uint256\"},{\"name\":\"rewardsSubmissionHash\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"rewardsSubmission\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structIRewardsCoordinatorTypes.RewardsSubmission\",\"components\":[{\"name\":\"strategiesAndMultipliers\",\"type\":\"tuple[]\",\"internalType\":\"structIRewardsCoordinatorTypes.StrategyAndMultiplier[]\",\"components\":[{\"name\":\"strategy\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"},{\"name\":\"multiplier\",\"type\":\"uint96\",\"internalType\":\"uint96\"}]},{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"contractIERC20\"},{\"name\":\"amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"startTimestamp\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"duration\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"RewardsSubmissionForAllEarnersCreated\",\"inputs\":[{\"name\":\"tokenHopper\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"submissionNonce\",\"type\":\"uint256\",\"indexed\":true,\"internalType\":\"uint256\"},{\"name\":\"rewardsSubmissionHash\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"rewardsSubmission\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structIRewardsCoordinatorTypes.RewardsSubmission\",\"components\":[{\"name\":\"strategiesAndMultipliers\",\"type\":\"tuple[]\",\"internalType\":\"structIRewardsCoordinatorTypes.StrategyAndMultiplier[]\",\"components\":[{\"name\":\"strategy\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"},{\"name\":\"multiplier\",\"type\":\"uint96\",\"internalType\":\"uint96\"}]},{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"contractIERC20\"},{\"name\":\"amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"startTimestamp\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"duration\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"RewardsUpdaterSet\",\"inputs\":[{\"name\":\"oldRewardsUpdater\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"newRewardsUpdater\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"error\",\"name\":\"AmountExceedsMax\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"AmountIsZero\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"DurationExceedsMax\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"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)
⋮----
// 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)
⋮----
// 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)
⋮----
// 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)
⋮----
// Version is a free data retrieval call binding the contract method 0x54fd4d50.
⋮----
// Solidity: function version() view returns(string)
func (_RewardsCoordinatorStorage *RewardsCoordinatorStorageCaller) Version(opts *bind.CallOpts) (string, error)
⋮----
// 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)
⋮----
// 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)
⋮----
// 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 0xf6efbb59.
⋮----
// Solidity: function initialize(address initialOwner, uint256 initialPausedStatus, address _rewardsUpdater, uint32 _activationDelay, uint16 _defaultSplitBips) returns()
func (_RewardsCoordinatorStorage *RewardsCoordinatorStorageTransactor) Initialize(opts *bind.TransactOpts, initialOwner common.Address, initialPausedStatus *big.Int, _rewardsUpdater common.Address, _activationDelay uint32, _defaultSplitBips uint16) (*types.Transaction, error)
⋮----
// 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)
⋮----
// 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)
⋮----
// 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)
⋮----
// 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)
⋮----
// 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{}
⋮----
var oldValueRule []interface{}
⋮----
var newValueRule []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)
⋮----
var submitterRule []interface{}
⋮----
// 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)
````

## 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: "0x60556032600b8282823980515f1a607314602657634e487b7160e01b5f525f60045260245ffd5b305f52607381538281f3fe730000000000000000000000000000000000000000301460806040525f5ffdfea2646970667358221220f72f70aa8e98e23dccc085223312b847e8da4498d9bcea40a5f6461473b053e664736f6c634300081b0033",
}
⋮----
// 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/Snapshots/binding.go
````go
// Code generated - DO NOT EDIT.
// This file is a generated binding and any manual changes will be lost.
⋮----
package Snapshots
⋮----
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
)
⋮----
// SnapshotsMetaData contains all meta data concerning the Snapshots contract.
var SnapshotsMetaData = &bind.MetaData{
	ABI: "[{\"type\":\"error\",\"name\":\"InvalidSnapshotOrdering\",\"inputs\":[]}]",
	Bin: "0x60556032600b8282823980515f1a607314602657634e487b7160e01b5f525f60045260245ffd5b305f52607381538281f3fe730000000000000000000000000000000000000000301460806040525f5ffdfea2646970667358221220934dbea011a7b5c1af5e2494d9913302461af4e355aef9fdb16d2f4d46ac097964736f6c634300081b0033",
}
⋮----
// SnapshotsABI is the input ABI used to generate the binding from.
// Deprecated: Use SnapshotsMetaData.ABI instead.
var SnapshotsABI = SnapshotsMetaData.ABI
⋮----
// SnapshotsBin is the compiled bytecode used for deploying new contracts.
// Deprecated: Use SnapshotsMetaData.Bin instead.
var SnapshotsBin = SnapshotsMetaData.Bin
⋮----
// DeploySnapshots deploys a new Ethereum contract, binding an instance of Snapshots to it.
func DeploySnapshots(auth *bind.TransactOpts, backend bind.ContractBackend) (common.Address, *types.Transaction, *Snapshots, error)
⋮----
// Snapshots is an auto generated Go binding around an Ethereum contract.
type Snapshots struct {
	SnapshotsCaller     // Read-only binding to the contract
	SnapshotsTransactor // Write-only binding to the contract
	SnapshotsFilterer   // Log filterer for contract events
}
⋮----
SnapshotsCaller     // Read-only binding to the contract
SnapshotsTransactor // Write-only binding to the contract
SnapshotsFilterer   // Log filterer for contract events
⋮----
// SnapshotsCaller is an auto generated read-only Go binding around an Ethereum contract.
type SnapshotsCaller struct {
	contract *bind.BoundContract // Generic contract wrapper for the low level calls
}
⋮----
contract *bind.BoundContract // Generic contract wrapper for the low level calls
⋮----
// SnapshotsTransactor is an auto generated write-only Go binding around an Ethereum contract.
type SnapshotsTransactor struct {
	contract *bind.BoundContract // Generic contract wrapper for the low level calls
}
⋮----
// SnapshotsFilterer is an auto generated log filtering Go binding around an Ethereum contract events.
type SnapshotsFilterer struct {
	contract *bind.BoundContract // Generic contract wrapper for the low level calls
}
⋮----
// SnapshotsSession is an auto generated Go binding around an Ethereum contract,
// with pre-set call and transact options.
type SnapshotsSession struct {
	Contract     *Snapshots        // 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     *Snapshots        // 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
⋮----
// SnapshotsCallerSession is an auto generated read-only Go binding around an Ethereum contract,
// with pre-set call options.
type SnapshotsCallerSession struct {
	Contract *SnapshotsCaller // Generic contract caller binding to set the session for
	CallOpts bind.CallOpts    // Call options to use throughout this session
}
⋮----
Contract *SnapshotsCaller // Generic contract caller binding to set the session for
CallOpts bind.CallOpts    // Call options to use throughout this session
⋮----
// SnapshotsTransactorSession is an auto generated write-only Go binding around an Ethereum contract,
// with pre-set transact options.
type SnapshotsTransactorSession struct {
	Contract     *SnapshotsTransactor // Generic contract transactor binding to set the session for
	TransactOpts bind.TransactOpts    // Transaction auth options to use throughout this session
}
⋮----
Contract     *SnapshotsTransactor // Generic contract transactor binding to set the session for
TransactOpts bind.TransactOpts    // Transaction auth options to use throughout this session
⋮----
// SnapshotsRaw is an auto generated low-level Go binding around an Ethereum contract.
type SnapshotsRaw struct {
	Contract *Snapshots // Generic contract binding to access the raw methods on
}
⋮----
Contract *Snapshots // Generic contract binding to access the raw methods on
⋮----
// SnapshotsCallerRaw is an auto generated low-level read-only Go binding around an Ethereum contract.
type SnapshotsCallerRaw struct {
	Contract *SnapshotsCaller // Generic read-only contract binding to access the raw methods on
}
⋮----
Contract *SnapshotsCaller // Generic read-only contract binding to access the raw methods on
⋮----
// SnapshotsTransactorRaw is an auto generated low-level write-only Go binding around an Ethereum contract.
type SnapshotsTransactorRaw struct {
	Contract *SnapshotsTransactor // Generic write-only contract binding to access the raw methods on
}
⋮----
Contract *SnapshotsTransactor // Generic write-only contract binding to access the raw methods on
⋮----
// NewSnapshots creates a new instance of Snapshots, bound to a specific deployed contract.
func NewSnapshots(address common.Address, backend bind.ContractBackend) (*Snapshots, error)
⋮----
// NewSnapshotsCaller creates a new read-only instance of Snapshots, bound to a specific deployed contract.
func NewSnapshotsCaller(address common.Address, caller bind.ContractCaller) (*SnapshotsCaller, error)
⋮----
// NewSnapshotsTransactor creates a new write-only instance of Snapshots, bound to a specific deployed contract.
func NewSnapshotsTransactor(address common.Address, transactor bind.ContractTransactor) (*SnapshotsTransactor, error)
⋮----
// NewSnapshotsFilterer creates a new log filterer instance of Snapshots, bound to a specific deployed contract.
func NewSnapshotsFilterer(address common.Address, filterer bind.ContractFilterer) (*SnapshotsFilterer, error)
⋮----
// bindSnapshots binds a generic wrapper to an already deployed contract.
func bindSnapshots(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 (_Snapshots *SnapshotsRaw) 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 (_Snapshots *SnapshotsRaw) Transfer(opts *bind.TransactOpts) (*types.Transaction, error)
⋮----
// Transact invokes the (paid) contract method with params as input values.
func (_Snapshots *SnapshotsRaw) Transact(opts *bind.TransactOpts, method string, params ...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\"},{\"name\":\"_version\",\"type\":\"string\",\"internalType\":\"string\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"deposit\",\"inputs\":[{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"contractIERC20\"},{\"name\":\"amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"newShares\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"explanation\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"string\",\"internalType\":\"string\"}],\"stateMutability\":\"pure\"},{\"type\":\"function\",\"name\":\"initialize\",\"inputs\":[{\"name\":\"_underlyingToken\",\"type\":\"address\",\"internalType\":\"contractIERC20\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"pause\",\"inputs\":[{\"name\":\"newPausedStatus\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"pauseAll\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"paused\",\"inputs\":[{\"name\":\"index\",\"type\":\"uint8\",\"internalType\":\"uint8\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"paused\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"pauserRegistry\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIPauserRegistry\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"shares\",\"inputs\":[{\"name\":\"user\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"sharesToUnderlying\",\"inputs\":[{\"name\":\"amountShares\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"sharesToUnderlyingView\",\"inputs\":[{\"name\":\"amountShares\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"strategyManager\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIStrategyManager\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"totalShares\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"underlyingToShares\",\"inputs\":[{\"name\":\"amountUnderlying\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"underlyingToSharesView\",\"inputs\":[{\"name\":\"amountUnderlying\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"underlyingToken\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIERC20\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"unpause\",\"inputs\":[{\"name\":\"newPausedStatus\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"userUnderlying\",\"inputs\":[{\"name\":\"user\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"userUnderlyingView\",\"inputs\":[{\"name\":\"user\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"version\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"string\",\"internalType\":\"string\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"withdraw\",\"inputs\":[{\"name\":\"recipient\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"contractIERC20\"},{\"name\":\"amountShares\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"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\":\"InvalidShortString\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"MaxPerDepositExceedsMax\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"NewSharesZero\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"OnlyPauser\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"OnlyStrategyManager\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"OnlyUnderlyingToken\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"OnlyUnpauser\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"StringTooLong\",\"inputs\":[{\"name\":\"str\",\"type\":\"string\",\"internalType\":\"string\"}]},{\"type\":\"error\",\"name\":\"TotalSharesExceedsMax\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"WithdrawalAmountExceedsTotalDeposits\",\"inputs\":[]}]",
	Bin: "0x60e060405234801561000f575f5ffd5b5060405161152938038061152983398101604081905261002e916101b6565b80826001600160a01b038116610057576040516339b190bb60e11b815260040160405180910390fd5b6001600160a01b031660805261006c8161008d565b60a052506001600160a01b03831660c0526100856100d3565b5050506102e7565b5f5f829050601f815111156100c0578260405163305a27a960e01b81526004016100b7919061028c565b60405180910390fd5b80516100cb826102c1565b179392505050565b5f54610100900460ff161561013a5760405162461bcd60e51b815260206004820152602760248201527f496e697469616c697a61626c653a20636f6e747261637420697320696e697469604482015266616c697a696e6760c81b60648201526084016100b7565b5f5460ff90811614610189575f805460ff191660ff9081179091556040519081527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b565b6001600160a01b038116811461019f575f5ffd5b50565b634e487b7160e01b5f52604160045260245ffd5b5f5f5f606084860312156101c8575f5ffd5b83516101d38161018b565b60208501519093506101e48161018b565b60408501519092506001600160401b038111156101ff575f5ffd5b8401601f8101861361020f575f5ffd5b80516001600160401b03811115610228576102286101a2565b604051601f8201601f19908116603f011681016001600160401b0381118282101715610256576102566101a2565b60405281815282820160200188101561026d575f5ffd5b8160208401602083015e5f602083830101528093505050509250925092565b602081525f82518060208401528060208501604085015e5f604082850101526040601f19601f83011684010191505092915050565b805160208083015191908110156102e1575f198160200360031b1b821691505b50919050565b60805160a05160c0516111f56103345f395f81816101800152818161035d01528181610686015261070801525f61047d01525f818161024b015281816108b60152610c6c01526111f55ff3fe608060405234801561000f575f5ffd5b5060043610610132575f3560e01c80637a8b2637116100b4578063c4d66de811610079578063c4d66de81461029b578063ce7c2ac2146102ae578063d9caed12146102c1578063e3dae51c146102d4578063f3e73875146102e7578063fabc1cbc146102fa575f5ffd5b80637a8b263714610233578063886f1195146102465780638c8710191461026d5780638f6a624014610280578063ab5921e114610293575f5ffd5b806354fd4d50116100fa57806354fd4d50146101cc578063553ca5f8146101e1578063595c6a67146101f45780635ac86ab7146101fc5780635c975abb1461022b575f5ffd5b8063136439dd146101365780632495a5991461014b57806339b70e381461017b5780633a98ef39146101a257806347e7ef24146101b9575b5f5ffd5b610149610144366004610f6d565b61030d565b005b60325461015e906001600160a01b031681565b6040516001600160a01b0390911681526020015b60405180910390f35b61015e7f000000000000000000000000000000000000000000000000000000000000000081565b6101ab60335481565b604051908152602001610172565b6101ab6101c7366004610f98565b610347565b6101d4610476565b6040516101729190610fc2565b6101ab6101ef366004610ff7565b6104a6565b6101496104b9565b61021b61020a366004611027565b6001805460ff9092161b9081161490565b6040519015158152602001610172565b6001546101ab565b6101ab610241366004610f6d565b6104cd565b61015e7f000000000000000000000000000000000000000000000000000000000000000081565b6101ab61027b366004610f6d565b610516565b6101ab61028e366004610ff7565b610520565b6101d461052d565b6101496102a9366004610ff7565b61054d565b6101ab6102bc366004610ff7565b61065f565b6101ab6102cf366004611042565b6106f1565b6101ab6102e2366004610f6d565b6107f3565b6101ab6102f5366004610f6d565b61082a565b610149610308366004610f6d565b610834565b6103156108a1565b600154818116811461033a5760405163c61dca5d60e01b815260040160405180910390fd5b61034382610944565b5050565b5f5f61035281610981565b336001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000161461039b576040516348da714f60e01b815260040160405180910390fd5b6103a584846109b7565b6033545f6103b56103e883611094565b90505f6103e86103c36109e5565b6103cd9190611094565b90505f6103da87836110a7565b9050806103e784896110ba565b6103f191906110d1565b9550855f0361041357604051630c392ed360e11b815260040160405180910390fd5b61041d8685611094565b60338190556f4b3b4ca85a86c47a098a223fffffffff101561045257604051632f14e8a360e11b815260040160405180910390fd5b61046b826103e86033546104669190611094565b610a4f565b505050505092915050565b60606104a17f0000000000000000000000000000000000000000000000000000000000000000610a9b565b905090565b5f6104b36102418361065f565b92915050565b6104c16108a1565b6104cb5f19610944565b565b5f5f6103e86033546104df9190611094565b90505f6103e86104ed6109e5565b6104f79190611094565b90508161050485836110ba565b61050e91906110d1565b949350505050565b5f6104b3826107f3565b5f6104b36102f58361065f565b60606040518060800160405280604d8152602001611173604d9139905090565b5f54610100900460ff161580801561056b57505f54600160ff909116105b806105845750303b15801561058457505f5460ff166001145b6105ec5760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b60648201526084015b60405180910390fd5b5f805460ff19166001179055801561060d575f805461ff0019166101001790555b61061682610ad8565b8015610343575f805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb3847402498906020015b60405180910390a15050565b60405163fe243a1760e01b81526001600160a01b0382811660048301523060248301525f917f00000000000000000000000000000000000000000000000000000000000000009091169063fe243a1790604401602060405180830381865afa1580156106cd573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906104b391906110f0565b5f60016106fd81610981565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614610746576040516348da714f60e01b815260040160405180910390fd5b610751858585610c23565b6033548084111561077557604051630b469df360e41b815260040160405180910390fd5b5f6107826103e883611094565b90505f6103e86107906109e5565b61079a9190611094565b9050816107a787836110ba565b6107b191906110d1565b94506107bd86846110a7565b6033556107dd6107cd86836110a7565b6103e86033546104669190611094565b6107e8888887610c56565b505050509392505050565b5f5f6103e86033546108059190611094565b90505f6103e86108136109e5565b61081d9190611094565b90508061050483866110ba565b5f6104b3826104cd565b61083c610c6a565b600154801982198116146108635760405163c61dca5d60e01b815260040160405180910390fd5b600182905560405182815233907f3582d1828e26bf56bd801502bc021ac0bc8afb57c826e4986b45593c8fad389c9060200160405180910390a25050565b60405163237dfb4760e11b81523360048201527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906346fbf68e90602401602060405180830381865afa158015610903573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906109279190611107565b6104cb57604051631d77d47760e21b815260040160405180910390fd5b600181905560405181815233907fab40a374bc51de372200a8bc981af8c9ecdc08dfdaef0bb6e09f88f3c616ef3d9060200160405180910390a250565b610996816001805460ff9092161b9081161490565b156109b45760405163840a48d560e01b815260040160405180910390fd5b50565b6032546001600160a01b0383811691161461034357604051630312abdd60e61b815260040160405180910390fd5b6032546040516370a0823160e01b81523060048201525f916001600160a01b0316906370a0823190602401602060405180830381865afa158015610a2b573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906104a191906110f0565b7fd2494f3479e5da49d386657c292c610b5b01df313d07c62eb0cfa49924a31be881610a8384670de0b6b3a76400006110ba565b610a8d91906110d1565b604051908152602001610653565b60605f610aa783610d1b565b6040805160208082528183019092529192505f91906020820181803683375050509182525060208101929092525090565b5f54610100900460ff16610b425760405162461bcd60e51b815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201526a6e697469616c697a696e6760a81b60648201526084016105e3565b603280546001600160a01b0319166001600160a01b038316179055610b665f610944565b7f1c540707b00eb5427b6b774fc799d756516a54aee108b64b327acc55af55750760325f9054906101000a90046001600160a01b0316826001600160a01b031663313ce5676040518163ffffffff1660e01b8152600401602060405180830381865afa158015610bd8573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610bfc9190611126565b604080516001600160a01b03909316835260ff90911660208301520160405180910390a150565b6032546001600160a01b03838116911614610c5157604051630312abdd60e61b815260040160405180910390fd5b505050565b610c516001600160a01b0383168483610d42565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663eab66d7a6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610cc6573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610cea9190611141565b6001600160a01b0316336001600160a01b0316146104cb5760405163794821ff60e01b815260040160405180910390fd5b5f60ff8216601f8111156104b357604051632cd44ac360e21b815260040160405180910390fd5b604080516001600160a01b03848116602483015260448083018590528351808403909101815260649092018352602080830180516001600160e01b031663a9059cbb60e01b17905283518085019094528084527f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c656490840152610c51928692915f91610dd1918516908490610e50565b905080515f1480610df1575080806020019051810190610df19190611107565b610c515760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b60648201526084016105e3565b606061050e84845f85855f5f866001600160a01b03168587604051610e75919061115c565b5f6040518083038185875af1925050503d805f8114610eaf576040519150601f19603f3d011682016040523d82523d5f602084013e610eb4565b606091505b5091509150610ec587838387610ed0565b979650505050505050565b60608315610f3e5782515f03610f37576001600160a01b0385163b610f375760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e747261637400000060448201526064016105e3565b508161050e565b61050e8383815115610f535781518083602001fd5b8060405162461bcd60e51b81526004016105e39190610fc2565b5f60208284031215610f7d575f5ffd5b5035919050565b6001600160a01b03811681146109b4575f5ffd5b5f5f60408385031215610fa9575f5ffd5b8235610fb481610f84565b946020939093013593505050565b602081525f82518060208401528060208501604085015e5f604082850101526040601f19601f83011684010191505092915050565b5f60208284031215611007575f5ffd5b813561101281610f84565b9392505050565b60ff811681146109b4575f5ffd5b5f60208284031215611037575f5ffd5b813561101281611019565b5f5f5f60608486031215611054575f5ffd5b833561105f81610f84565b9250602084013561106f81610f84565b929592945050506040919091013590565b634e487b7160e01b5f52601160045260245ffd5b808201808211156104b3576104b3611080565b818103818111156104b3576104b3611080565b80820281158282048414176104b3576104b3611080565b5f826110eb57634e487b7160e01b5f52601260045260245ffd5b500490565b5f60208284031215611100575f5ffd5b5051919050565b5f60208284031215611117575f5ffd5b81518015158114611012575f5ffd5b5f60208284031215611136575f5ffd5b815161101281611019565b5f60208284031215611151575f5ffd5b815161101281610f84565b5f82518060208501845e5f92019182525091905056fe4261736520537472617465677920696d706c656d656e746174696f6e20746f20696e68657269742066726f6d20666f72206d6f726520636f6d706c657820696d706c656d656e746174696f6e73a2646970667358221220df3168aa618b503f49bfdd657dd79d216edd2d18d519b2d5bf302619d0cab6c264736f6c634300081b0033",
}
⋮----
// 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, _version string) (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)
⋮----
// Version is a free data retrieval call binding the contract method 0x54fd4d50.
⋮----
// Solidity: function version() view returns(string)
func (_StrategyBase *StrategyBaseCaller) Version(opts *bind.CallOpts) (string, error)
⋮----
// 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\"},{\"name\":\"_version\",\"type\":\"string\",\"internalType\":\"string\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"deposit\",\"inputs\":[{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"contractIERC20\"},{\"name\":\"amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"newShares\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"explanation\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"string\",\"internalType\":\"string\"}],\"stateMutability\":\"pure\"},{\"type\":\"function\",\"name\":\"getTVLLimits\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"initialize\",\"inputs\":[{\"name\":\"_maxPerDeposit\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"_maxTotalDeposits\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"_underlyingToken\",\"type\":\"address\",\"internalType\":\"contractIERC20\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"initialize\",\"inputs\":[{\"name\":\"_underlyingToken\",\"type\":\"address\",\"internalType\":\"contractIERC20\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"maxPerDeposit\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"maxTotalDeposits\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"pause\",\"inputs\":[{\"name\":\"newPausedStatus\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"pauseAll\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"paused\",\"inputs\":[{\"name\":\"index\",\"type\":\"uint8\",\"internalType\":\"uint8\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"paused\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"pauserRegistry\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIPauserRegistry\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"setTVLLimits\",\"inputs\":[{\"name\":\"newMaxPerDeposit\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"newMaxTotalDeposits\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"shares\",\"inputs\":[{\"name\":\"user\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"sharesToUnderlying\",\"inputs\":[{\"name\":\"amountShares\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"sharesToUnderlyingView\",\"inputs\":[{\"name\":\"amountShares\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"strategyManager\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIStrategyManager\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"totalShares\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"underlyingToShares\",\"inputs\":[{\"name\":\"amountUnderlying\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"underlyingToSharesView\",\"inputs\":[{\"name\":\"amountUnderlying\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"underlyingToken\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIERC20\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"unpause\",\"inputs\":[{\"name\":\"newPausedStatus\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"userUnderlying\",\"inputs\":[{\"name\":\"user\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"userUnderlyingView\",\"inputs\":[{\"name\":\"user\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"version\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"string\",\"internalType\":\"string\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"withdraw\",\"inputs\":[{\"name\":\"recipient\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"contractIERC20\"},{\"name\":\"amountShares\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"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\":\"InvalidShortString\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"MaxPerDepositExceedsMax\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"NewSharesZero\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"OnlyPauser\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"OnlyStrategyManager\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"OnlyUnderlyingToken\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"OnlyUnpauser\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"StringTooLong\",\"inputs\":[{\"name\":\"str\",\"type\":\"string\",\"internalType\":\"string\"}]},{\"type\":\"error\",\"name\":\"TotalSharesExceedsMax\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"WithdrawalAmountExceedsTotalDeposits\",\"inputs\":[]}]",
	Bin: "0x60e060405234801561000f575f5ffd5b5060405161181738038061181783398101604081905261002e916101bc565b82828280826001600160a01b03811661005a576040516339b190bb60e11b815260040160405180910390fd5b6001600160a01b031660805261006f81610093565b60a052506001600160a01b03831660c0526100886100d9565b5050505050506102ed565b5f5f829050601f815111156100c6578260405163305a27a960e01b81526004016100bd9190610292565b60405180910390fd5b80516100d1826102c7565b179392505050565b5f54610100900460ff16156101405760405162461bcd60e51b815260206004820152602760248201527f496e697469616c697a61626c653a20636f6e747261637420697320696e697469604482015266616c697a696e6760c81b60648201526084016100bd565b5f5460ff9081161461018f575f805460ff191660ff9081179091556040519081527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b565b6001600160a01b03811681146101a5575f5ffd5b50565b634e487b7160e01b5f52604160045260245ffd5b5f5f5f606084860312156101ce575f5ffd5b83516101d981610191565b60208501519093506101ea81610191565b60408501519092506001600160401b03811115610205575f5ffd5b8401601f81018613610215575f5ffd5b80516001600160401b0381111561022e5761022e6101a8565b604051601f8201601f19908116603f011681016001600160401b038111828210171561025c5761025c6101a8565b604052818152828201602001881015610273575f5ffd5b8160208401602083015e5f602083830101528093505050509250925092565b602081525f82518060208401528060208501604085015e5f604082850101526040601f19601f83011684010191505092915050565b805160208083015191908110156102e7575f198160200360031b1b821691505b50919050565b60805160a05160c0516114dd61033a5f395f81816101e801528181610417015281816107cf015261085101525f61053701525f81816102c5015281816109ec0152610b5401526114dd5ff3fe608060405234801561000f575f5ffd5b5060043610610187575f3560e01c80637a8b2637116100d9578063c4d66de811610093578063df6fadc11161006e578063df6fadc114610361578063e3dae51c1461037c578063f3e738751461038f578063fabc1cbc146103a2575f5ffd5b8063c4d66de814610328578063ce7c2ac21461033b578063d9caed121461034e575f5ffd5b80637a8b2637146102ad578063886f1195146102c05780638c871019146102e75780638f6a6240146102fa578063a6ab36f21461030d578063ab5921e114610320575f5ffd5b806347e7ef2411610144578063595c6a671161011f578063595c6a67146102655780635ac86ab71461026d5780635c975abb1461029c57806361b01b5d146102a4575f5ffd5b806347e7ef241461022a57806354fd4d501461023d578063553ca5f814610252575f5ffd5b806311c70c9d1461018b578063136439dd146101a05780632495a599146101b357806339b70e38146101e35780633a98ef391461020a57806343fe08b014610221575b5f5ffd5b61019e6101993660046111b1565b6103b5565b005b61019e6101ae3660046111d1565b6103cb565b6032546101c6906001600160a01b031681565b6040516001600160a01b0390911681526020015b60405180910390f35b6101c67f000000000000000000000000000000000000000000000000000000000000000081565b61021360335481565b6040519081526020016101da565b61021360645481565b6102136102383660046111fc565b610401565b610245610530565b6040516101da9190611226565b61021361026036600461125b565b610560565b61019e610573565b61028c61027b36600461128b565b6001805460ff9092161b9081161490565b60405190151581526020016101da565b600154610213565b61021360655481565b6102136102bb3660046111d1565b610587565b6101c67f000000000000000000000000000000000000000000000000000000000000000081565b6102136102f53660046111d1565b6105d0565b61021361030836600461125b565b6105da565b61019e61031b3660046112a6565b6105e7565b6102456106c2565b61019e61033636600461125b565b6106e2565b61021361034936600461125b565b6107a8565b61021361035c3660046112dc565b61083a565b606454606554604080519283526020830191909152016101da565b61021361038a3660046111d1565b61093c565b61021361039d3660046111d1565b610973565b61019e6103b03660046111d1565b61097d565b6103bd6109ea565b6103c78282610a9b565b5050565b6103d3610b3f565b60015481811681146103f85760405163c61dca5d60e01b815260040160405180910390fd5b6103c782610be2565b5f5f61040c81610c1f565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614610455576040516348da714f60e01b815260040160405180910390fd5b61045f8484610c55565b6033545f61046f6103e88361132e565b90505f6103e861047d610cac565b610487919061132e565b90505f6104948783611341565b9050806104a18489611354565b6104ab919061136b565b9550855f036104cd57604051630c392ed360e11b815260040160405180910390fd5b6104d7868561132e565b60338190556f4b3b4ca85a86c47a098a223fffffffff101561050c57604051632f14e8a360e11b815260040160405180910390fd5b610525826103e8603354610520919061132e565b610d16565b505050505092915050565b606061055b7f0000000000000000000000000000000000000000000000000000000000000000610d62565b905090565b5f61056d6102bb836107a8565b92915050565b61057b610b3f565b6105855f19610be2565b565b5f5f6103e8603354610599919061132e565b90505f6103e86105a7610cac565b6105b1919061132e565b9050816105be8583611354565b6105c8919061136b565b949350505050565b5f61056d8261093c565b5f61056d61039d836107a8565b5f54610100900460ff161580801561060557505f54600160ff909116105b8061061e5750303b15801561061e57505f5460ff166001145b6106435760405162461bcd60e51b815260040161063a9061138a565b60405180910390fd5b5f805460ff191660011790558015610664575f805461ff0019166101001790555b61066e8484610a9b565b61067782610d9f565b80156106bc575f805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b50505050565b60606040518060800160405280604d815260200161145b604d9139905090565b5f54610100900460ff161580801561070057505f54600160ff909116105b806107195750303b15801561071957505f5460ff166001145b6107355760405162461bcd60e51b815260040161063a9061138a565b5f805460ff191660011790558015610756575f805461ff0019166101001790555b61075f82610d9f565b80156103c7575f805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb3847402498906020015b60405180910390a15050565b60405163fe243a1760e01b81526001600160a01b0382811660048301523060248301525f917f00000000000000000000000000000000000000000000000000000000000000009091169063fe243a1790604401602060405180830381865afa158015610816573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061056d91906113d8565b5f600161084681610c1f565b336001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000161461088f576040516348da714f60e01b815260040160405180910390fd5b61089a858585610eea565b603354808411156108be57604051630b469df360e41b815260040160405180910390fd5b5f6108cb6103e88361132e565b90505f6103e86108d9610cac565b6108e3919061132e565b9050816108f08783611354565b6108fa919061136b565b94506109068684611341565b6033556109266109168683611341565b6103e8603354610520919061132e565b610931888887610f1d565b505050509392505050565b5f5f6103e860335461094e919061132e565b90505f6103e861095c610cac565b610966919061132e565b9050806105be8386611354565b5f61056d82610587565b6109856109ea565b600154801982198116146109ac5760405163c61dca5d60e01b815260040160405180910390fd5b600182905560405182815233907f3582d1828e26bf56bd801502bc021ac0bc8afb57c826e4986b45593c8fad389c9060200160405180910390a25050565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663eab66d7a6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610a46573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610a6a91906113ef565b6001600160a01b0316336001600160a01b0316146105855760405163794821ff60e01b815260040160405180910390fd5b60645460408051918252602082018490527ff97ed4e083acac67830025ecbc756d8fe847cdbdca4cee3fe1e128e98b54ecb5910160405180910390a160655460408051918252602082018390527f6ab181e0440bfbf4bacdf2e99674735ce6638005490688c5f994f5399353e452910160405180910390a180821115610b345760405163052b07b760e21b815260040160405180910390fd5b606491909155606555565b60405163237dfb4760e11b81523360048201527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906346fbf68e90602401602060405180830381865afa158015610ba1573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610bc5919061140a565b61058557604051631d77d47760e21b815260040160405180910390fd5b600181905560405181815233907fab40a374bc51de372200a8bc981af8c9ecdc08dfdaef0bb6e09f88f3c616ef3d9060200160405180910390a250565b610c34816001805460ff9092161b9081161490565b15610c525760405163840a48d560e01b815260040160405180910390fd5b50565b606454811115610c785760405163052b07b760e21b815260040160405180910390fd5b606554610c83610cac565b1115610ca25760405163d86bae6760e01b815260040160405180910390fd5b6103c78282610f31565b6032546040516370a0823160e01b81523060048201525f916001600160a01b0316906370a0823190602401602060405180830381865afa158015610cf2573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061055b91906113d8565b7fd2494f3479e5da49d386657c292c610b5b01df313d07c62eb0cfa49924a31be881610d4a84670de0b6b3a7640000611354565b610d54919061136b565b60405190815260200161079c565b60605f610d6e83610f5f565b6040805160208082528183019092529192505f91906020820181803683375050509182525060208101929092525090565b5f54610100900460ff16610e095760405162461bcd60e51b815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201526a6e697469616c697a696e6760a81b606482015260840161063a565b603280546001600160a01b0319166001600160a01b038316179055610e2d5f610be2565b7f1c540707b00eb5427b6b774fc799d756516a54aee108b64b327acc55af55750760325f9054906101000a90046001600160a01b0316826001600160a01b031663313ce5676040518163ffffffff1660e01b8152600401602060405180830381865afa158015610e9f573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610ec39190611429565b604080516001600160a01b03909316835260ff90911660208301520160405180910390a150565b6032546001600160a01b03838116911614610f1857604051630312abdd60e61b815260040160405180910390fd5b505050565b610f186001600160a01b0383168483610f86565b6032546001600160a01b038381169116146103c757604051630312abdd60e61b815260040160405180910390fd5b5f60ff8216601f81111561056d57604051632cd44ac360e21b815260040160405180910390fd5b604080516001600160a01b03848116602483015260448083018590528351808403909101815260649092018352602080830180516001600160e01b031663a9059cbb60e01b17905283518085019094528084527f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c656490840152610f18928692915f91611015918516908490611094565b905080515f1480611035575080806020019051810190611035919061140a565b610f185760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b606482015260840161063a565b60606105c884845f85855f5f866001600160a01b031685876040516110b99190611444565b5f6040518083038185875af1925050503d805f81146110f3576040519150601f19603f3d011682016040523d82523d5f602084013e6110f8565b606091505b509150915061110987838387611114565b979650505050505050565b606083156111825782515f0361117b576001600160a01b0385163b61117b5760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604482015260640161063a565b50816105c8565b6105c883838151156111975781518083602001fd5b8060405162461bcd60e51b815260040161063a9190611226565b5f5f604083850312156111c2575f5ffd5b50508035926020909101359150565b5f602082840312156111e1575f5ffd5b5035919050565b6001600160a01b0381168114610c52575f5ffd5b5f5f6040838503121561120d575f5ffd5b8235611218816111e8565b946020939093013593505050565b602081525f82518060208401528060208501604085015e5f604082850101526040601f19601f83011684010191505092915050565b5f6020828403121561126b575f5ffd5b8135611276816111e8565b9392505050565b60ff81168114610c52575f5ffd5b5f6020828403121561129b575f5ffd5b81356112768161127d565b5f5f5f606084860312156112b8575f5ffd5b833592506020840135915060408401356112d1816111e8565b809150509250925092565b5f5f5f606084860312156112ee575f5ffd5b83356112f9816111e8565b92506020840135611309816111e8565b929592945050506040919091013590565b634e487b7160e01b5f52601160045260245ffd5b8082018082111561056d5761056d61131a565b8181038181111561056d5761056d61131a565b808202811582820484141761056d5761056d61131a565b5f8261138557634e487b7160e01b5f52601260045260245ffd5b500490565b6020808252602e908201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160408201526d191e481a5b9a5d1a585b1a5e995960921b606082015260800190565b5f602082840312156113e8575f5ffd5b5051919050565b5f602082840312156113ff575f5ffd5b8151611276816111e8565b5f6020828403121561141a575f5ffd5b81518015158114611276575f5ffd5b5f60208284031215611439575f5ffd5b81516112768161127d565b5f82518060208501845e5f92019182525091905056fe4261736520537472617465677920696d706c656d656e746174696f6e20746f20696e68657269742066726f6d20666f72206d6f726520636f6d706c657820696d706c656d656e746174696f6e73a2646970667358221220b558327578c1929fb73bd404f32b72dd0129feaf61c7fcbe12bfa239d47edc6c64736f6c634300081b0033",
}
⋮----
// 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, _version string) (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)
⋮----
// Version is a free data retrieval call binding the contract method 0x54fd4d50.
⋮----
// Solidity: function version() view returns(string)
func (_StrategyBaseTVLLimits *StrategyBaseTVLLimitsCaller) Version(opts *bind.CallOpts) (string, error)
⋮----
// 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
)
⋮----
// 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\":\"_version\",\"type\":\"string\",\"internalType\":\"string\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"blacklistTokens\",\"inputs\":[{\"name\":\"tokens\",\"type\":\"address[]\",\"internalType\":\"contractIERC20[]\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"deployNewStrategy\",\"inputs\":[{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"contractIERC20\"}],\"outputs\":[{\"name\":\"newStrategy\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"deployedStrategies\",\"inputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIERC20\"}],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"initialize\",\"inputs\":[{\"name\":\"_initialOwner\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"_initialPausedStatus\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"_strategyBeacon\",\"type\":\"address\",\"internalType\":\"contractIBeacon\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"isBlacklisted\",\"inputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIERC20\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"owner\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"pause\",\"inputs\":[{\"name\":\"newPausedStatus\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"pauseAll\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"paused\",\"inputs\":[{\"name\":\"index\",\"type\":\"uint8\",\"internalType\":\"uint8\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"paused\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"pauserRegistry\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIPauserRegistry\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"removeStrategiesFromWhitelist\",\"inputs\":[{\"name\":\"strategiesToRemoveFromWhitelist\",\"type\":\"address[]\",\"internalType\":\"contractIStrategy[]\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"renounceOwnership\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"strategyBeacon\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIBeacon\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"strategyManager\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIStrategyManager\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"transferOwnership\",\"inputs\":[{\"name\":\"newOwner\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"unpause\",\"inputs\":[{\"name\":\"newPausedStatus\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"version\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"string\",\"internalType\":\"string\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"whitelistStrategies\",\"inputs\":[{\"name\":\"strategiesToWhitelist\",\"type\":\"address[]\",\"internalType\":\"contractIStrategy[]\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"event\",\"name\":\"Initialized\",\"inputs\":[{\"name\":\"version\",\"type\":\"uint8\",\"indexed\":false,\"internalType\":\"uint8\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"OwnershipTransferred\",\"inputs\":[{\"name\":\"previousOwner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"newOwner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Paused\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"newPausedStatus\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"StrategyBeaconModified\",\"inputs\":[{\"name\":\"previousBeacon\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"contractIBeacon\"},{\"name\":\"newBeacon\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"contractIBeacon\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"StrategySetForToken\",\"inputs\":[{\"name\":\"token\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"contractIERC20\"},{\"name\":\"strategy\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"contractIStrategy\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"TokenBlacklisted\",\"inputs\":[{\"name\":\"token\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"contractIERC20\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Unpaused\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"newPausedStatus\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"error\",\"name\":\"AlreadyBlacklisted\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"BlacklistedToken\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"CurrentlyPaused\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InputAddressZero\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidNewPausedStatus\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidShortString\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"OnlyPauser\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"OnlyUnpauser\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"StrategyAlreadyExists\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"StringTooLong\",\"inputs\":[{\"name\":\"str\",\"type\":\"string\",\"internalType\":\"string\"}]}]",
	Bin: "0x60e060405234801561000f575f5ffd5b50604051611b26380380611b2683398101604081905261002e916101b9565b80826001600160a01b038116610057576040516339b190bb60e11b815260040160405180910390fd5b6001600160a01b031660805261006c8161008d565b60a052506001600160a01b03831660c0526100856100d3565b5050506102ea565b5f5f829050601f815111156100c0578260405163305a27a960e01b81526004016100b7919061028f565b60405180910390fd5b80516100cb826102c4565b179392505050565b603354610100900460ff161561013b5760405162461bcd60e51b815260206004820152602760248201527f496e697469616c697a61626c653a20636f6e747261637420697320696e697469604482015266616c697a696e6760c81b60648201526084016100b7565b60335460ff9081161461018c576033805460ff191660ff9081179091556040519081527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b565b6001600160a01b03811681146101a2575f5ffd5b50565b634e487b7160e01b5f52604160045260245ffd5b5f5f5f606084860312156101cb575f5ffd5b83516101d68161018e565b60208501519093506101e78161018e565b60408501519092506001600160401b03811115610202575f5ffd5b8401601f81018613610212575f5ffd5b80516001600160401b0381111561022b5761022b6101a5565b604051601f8201601f19908116603f011681016001600160401b0381118282101715610259576102596101a5565b604052818152828201602001881015610270575f5ffd5b8160208401602083015e5f602083830101528093505050509250925092565b602081525f82518060208401528060208501604085015e5f604082850101526040601f19601f83011684010191505092915050565b805160208083015191908110156102e4575f198160200360031b1b821691505b50919050565b60805160a05160c0516117e861033e5f395f818161014d0152818161055a01528181610764015281816108010152610a9901525f6105ca01525f818161023501528181610ae50152610d9601526117e85ff3fe608060405234801561000f575f5ffd5b506004361061011c575f3560e01c8063715018a6116100a9578063f0062d9a1161006e578063f0062d9a1461028e578063f2fde38b146102a0578063fabc1cbc146102b3578063fe38b32d146102c6578063fe575a87146102d9575f5ffd5b8063715018a614610228578063886f1195146102305780638da5cb5b14610257578063b768ebc914610268578063c350a1b51461027b575f5ffd5b8063581dfd65116100ef578063581dfd65146101a1578063595c6a67146101c95780635ac86ab7146101d15780635c975abb146102045780636b9b622914610215575f5ffd5b8063136439dd1461012057806323103c411461013557806339b70e381461014857806354fd4d501461018c575b5f5ffd5b61013361012e366004610e7f565b6102fb565b005b610133610143366004610ede565b610335565b61016f7f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b0390911681526020015b60405180910390f35b6101946105c3565b6040516101839190610f4b565b61016f6101af366004610f78565b60016020525f90815260409020546001600160a01b031681565b6101336105f3565b6101f46101df366004610f93565b609954600160ff9092169190911b9081161490565b6040519015158152602001610183565b609954604051908152602001610183565b61016f610223366004610f78565b610607565b6101336107d1565b61016f7f000000000000000000000000000000000000000000000000000000000000000081565b6066546001600160a01b031661016f565b610133610276366004610ede565b6107e2565b610133610289366004610fb3565b610869565b5f5461016f906001600160a01b031681565b6101336102ae366004610f78565b610994565b6101336102c1366004610e7f565b610a0d565b6101336102d4366004610ede565b610a7a565b6101f46102e7366004610f78565b60026020525f908152604090205460ff1681565b610303610ad0565b60995481811681146103285760405163c61dca5d60e01b815260040160405180910390fd5b61033182610b73565b5050565b61033d610bb0565b5f8167ffffffffffffffff81111561035757610357610ff2565b604051908082528060200260200182016040528015610380578160200160208202803683370190505b5090505f805b838110156105395760025f8686848181106103a3576103a3611006565b90506020020160208101906103b89190610f78565b6001600160a01b0316815260208101919091526040015f205460ff16156103f25760405163f53de75f60e01b815260040160405180910390fd5b600160025f87878581811061040957610409611006565b905060200201602081019061041e9190610f78565b6001600160a01b0316815260208101919091526040015f20805460ff19169115159190911790557f75519c51f39873ec0e27dd3bbc09549e4865a113f505393fb9eab5898f6418b385858381811061047857610478611006565b905060200201602081019061048d9190610f78565b6040516001600160a01b03909116815260200160405180910390a15f60015f8787858181106104be576104be611006565b90506020020160208101906104d39190610f78565b6001600160a01b03908116825260208201929092526040015f20541690508015610530578084848151811061050a5761050a611006565b6001600160a01b03909216602092830291909101909101528261052c8161101a565b9350505b50600101610386565b5080825280156105bd576040516316bb16b760e31b81526001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169063b5d8b5b89061058f90859060040161103e565b5f604051808303815f87803b1580156105a6575f5ffd5b505af11580156105b8573d5f5f3e3d5ffd5b505050505b50505050565b60606105ee7f0000000000000000000000000000000000000000000000000000000000000000610c0a565b905090565b6105fb610ad0565b6106055f19610b73565b565b5f5f61061281610c47565b6001600160a01b0383165f9081526002602052604090205460ff161561064b5760405163091867bd60e11b815260040160405180910390fd5b6001600160a01b038381165f9081526001602052604090205416156106835760405163c45546f760e01b815260040160405180910390fd5b5f8054604080516001600160a01b0387811660248084019190915283518084039091018152604490920183526020820180516001600160e01b031663189acdbd60e31b17905291519190921691906106da90610e72565b6106e5929190611089565b604051809103905ff0801580156106fe573d5f5f3e3d5ffd5b50905061070b8482610c72565b6040805160018082528183019092525f916020808301908036833701905050905081815f8151811061073f5761073f611006565b6001600160a01b039283166020918202929092010152604051632ef047f960e11b81527f000000000000000000000000000000000000000000000000000000000000000090911690635de08ff29061079b90849060040161103e565b5f604051808303815f87803b1580156107b2575f5ffd5b505af11580156107c4573d5f5f3e3d5ffd5b5093979650505050505050565b6107d9610bb0565b6106055f610cdc565b6107ea610bb0565b604051632ef047f960e11b81526001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001690635de08ff29061083890859085906004016110b4565b5f604051808303815f87803b15801561084f575f5ffd5b505af1158015610861573d5f5f3e3d5ffd5b505050505050565b603354610100900460ff16158080156108895750603354600160ff909116105b806108a35750303b1580156108a3575060335460ff166001145b61090b5760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b60648201526084015b60405180910390fd5b6033805460ff19166001179055801561092e576033805461ff0019166101001790555b61093784610cdc565b61094083610b73565b61094982610d2d565b80156105bd576033805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a150505050565b61099c610bb0565b6001600160a01b038116610a015760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610902565b610a0a81610cdc565b50565b610a15610d94565b60995480198219811614610a3c5760405163c61dca5d60e01b815260040160405180910390fd5b609982905560405182815233907f3582d1828e26bf56bd801502bc021ac0bc8afb57c826e4986b45593c8fad389c9060200160405180910390a25050565b610a82610bb0565b6040516316bb16b760e31b81526001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169063b5d8b5b89061083890859085906004016110b4565b60405163237dfb4760e11b81523360048201527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906346fbf68e90602401602060405180830381865afa158015610b32573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610b569190611100565b61060557604051631d77d47760e21b815260040160405180910390fd5b609981905560405181815233907fab40a374bc51de372200a8bc981af8c9ecdc08dfdaef0bb6e09f88f3c616ef3d9060200160405180910390a250565b6066546001600160a01b031633146106055760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610902565b60605f610c1683610e45565b6040805160208082528183019092529192505f91906020820181803683375050509182525060208101929092525090565b609954600160ff83161b90811603610a0a5760405163840a48d560e01b815260040160405180910390fd5b6001600160a01b038281165f8181526001602090815260409182902080546001600160a01b031916948616948517905581519283528201929092527f6852a55230ef089d785bce7ffbf757985de34026df90a87d7b4a6e56f95d251f910160405180910390a15050565b606680546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a35050565b5f54604080516001600160a01b03928316815291831660208301527fe21755962a7d7e100b59b9c3e4d4b54085b146313719955efb6a7a25c5c7feee910160405180910390a15f80546001600160a01b0319166001600160a01b0392909216919091179055565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663eab66d7a6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610df0573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610e14919061111f565b6001600160a01b0316336001600160a01b0316146106055760405163794821ff60e01b815260040160405180910390fd5b5f60ff8216601f811115610e6c57604051632cd44ac360e21b815260040160405180910390fd5b92915050565b6106788061113b83390190565b5f60208284031215610e8f575f5ffd5b5035919050565b5f5f83601f840112610ea6575f5ffd5b50813567ffffffffffffffff811115610ebd575f5ffd5b6020830191508360208260051b8501011115610ed7575f5ffd5b9250929050565b5f5f60208385031215610eef575f5ffd5b823567ffffffffffffffff811115610f05575f5ffd5b610f1185828601610e96565b90969095509350505050565b5f81518084528060208401602086015e5f602082860101526020601f19601f83011685010191505092915050565b602081525f610f5d6020830184610f1d565b9392505050565b6001600160a01b0381168114610a0a575f5ffd5b5f60208284031215610f88575f5ffd5b8135610f5d81610f64565b5f60208284031215610fa3575f5ffd5b813560ff81168114610f5d575f5ffd5b5f5f5f60608486031215610fc5575f5ffd5b8335610fd081610f64565b9250602084013591506040840135610fe781610f64565b809150509250925092565b634e487b7160e01b5f52604160045260245ffd5b634e487b7160e01b5f52603260045260245ffd5b5f6001820161103757634e487b7160e01b5f52601160045260245ffd5b5060010190565b602080825282518282018190525f918401906040840190835b8181101561107e5783516001600160a01b0316835260209384019390920191600101611057565b509095945050505050565b6001600160a01b03831681526040602082018190525f906110ac90830184610f1d565b949350505050565b602080825281018290525f8360408301825b858110156110f65782356110d981610f64565b6001600160a01b03168252602092830192909101906001016110c6565b5095945050505050565b5f60208284031215611110575f5ffd5b81518015158114610f5d575f5ffd5b5f6020828403121561112f575f5ffd5b8151610f5d81610f6456fe6080604052604051610678380380610678833981016040819052610022916103ed565b61002d82825f610034565b5050610513565b61003d836100f1565b6040516001600160a01b038416907f1cf3b03a6cf19fa2baba4df148e9dcabedea7f8a5c07840e207e5c089be95d3e905f90a25f8251118061007c5750805b156100ec576100ea836001600160a01b0316635c60da1b6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156100c0573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906100e491906104af565b83610273565b505b505050565b6001600160a01b0381163b61015b5760405162461bcd60e51b815260206004820152602560248201527f455243313936373a206e657720626561636f6e206973206e6f74206120636f6e6044820152641d1c9858dd60da1b60648201526084015b60405180910390fd5b6101cd816001600160a01b0316635c60da1b6040518163ffffffff1660e01b8152600401602060405180830381865afa15801561019a573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906101be91906104af565b6001600160a01b03163b151590565b6102325760405162461bcd60e51b815260206004820152603060248201527f455243313936373a20626561636f6e20696d706c656d656e746174696f6e206960448201526f1cc81b9bdd08184818dbdb9d1c9858dd60821b6064820152608401610152565b7fa3f0ad74e5423aebfd80d3ef4346578335a9a72aeaee59ff6cb3582b35133d5080546001600160a01b0319166001600160a01b0392909216919091179055565b606061029883836040518060600160405280602781526020016106516027913961029f565b9392505050565b60605f5f856001600160a01b0316856040516102bb91906104c8565b5f60405180830381855af49150503d805f81146102f3576040519150601f19603f3d011682016040523d82523d5f602084013e6102f8565b606091505b50909250905061030a86838387610314565b9695505050505050565b606083156103825782515f0361037b576001600160a01b0385163b61037b5760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610152565b508161038c565b61038c8383610394565b949350505050565b8151156103a45781518083602001fd5b8060405162461bcd60e51b815260040161015291906104de565b80516001600160a01b03811681146103d4575f5ffd5b919050565b634e487b7160e01b5f52604160045260245ffd5b5f5f604083850312156103fe575f5ffd5b610407836103be565b60208401519092506001600160401b03811115610422575f5ffd5b8301601f81018513610432575f5ffd5b80516001600160401b0381111561044b5761044b6103d9565b604051601f8201601f19908116603f011681016001600160401b0381118282101715610479576104796103d9565b604052818152828201602001871015610490575f5ffd5b8160208401602083015e5f602083830101528093505050509250929050565b5f602082840312156104bf575f5ffd5b610298826103be565b5f82518060208501845e5f920191825250919050565b602081525f82518060208401528060208501604085015e5f604082850101526040601f19601f83011684010191505092915050565b610131806105205f395ff3fe608060405236601057600e6013565b005b600e5b601f601b6021565b60b3565b565b5f60527fa3f0ad74e5423aebfd80d3ef4346578335a9a72aeaee59ff6cb3582b35133d50546001600160a01b031690565b6001600160a01b0316635c60da1b6040518163ffffffff1660e01b8152600401602060405180830381865afa158015608c573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019060ae919060d0565b905090565b365f5f375f5f365f845af43d5f5f3e80801560cc573d5ff35b3d5ffd5b5f6020828403121560df575f5ffd5b81516001600160a01b038116811460f4575f5ffd5b939250505056fea26469706673582212207573e4acc6548d8cd1e28bdca26daa72e4f1b0a60bbb765db580a0b95e2b21b464736f6c634300081b0033416464726573733a206c6f772d6c6576656c2064656c65676174652063616c6c206661696c6564a2646970667358221220262fd104eb8b8a554925cbc9fef53ed1f9cfdafce722bb6068ca57d6666e337c64736f6c634300081b0033",
}
⋮----
// 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, _version string) (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{}
⋮----
// 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)
⋮----
// Version is a free data retrieval call binding the contract method 0x54fd4d50.
⋮----
// Solidity: function version() view returns(string)
func (_StrategyFactory *StrategyFactoryCaller) Version(opts *bind.CallOpts) (string, error)
⋮----
// 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)
⋮----
// 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 0xc350a1b5.
⋮----
// Solidity: function initialize(address _initialOwner, uint256 _initialPausedStatus, address _strategyBeacon) returns()
func (_StrategyFactory *StrategyFactoryTransactor) Initialize(opts *bind.TransactOpts, _initialOwner common.Address, _initialPausedStatus *big.Int, _strategyBeacon common.Address) (*types.Transaction, error)
⋮----
// 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)
⋮----
// 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
⋮----
contract *bind.BoundContract // Generic contract to use for unpacking event data
event    string              // Event name to use for unpacking event data
⋮----
logs chan types.Log        // Log channel receiving the found contract events
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 *StrategyFactoryInitializedIterator) 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 *StrategyFactoryInitializedIterator) Error() error
⋮----
// Close terminates the iteration process, releasing any pending underlying
// resources.
func (it *StrategyFactoryInitializedIterator) Close() error
⋮----
// 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)
⋮----
// New log arrived, parse the event and forward to the user
⋮----
// 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
}
⋮----
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)
⋮----
// StrategyFactoryStrategyBeaconModifiedIterator is returned from FilterStrategyBeaconModified and is used to iterate over the raw logs and unpacked data for StrategyBeaconModified events raised by the StrategyFactory contract.
type StrategyFactoryStrategyBeaconModifiedIterator struct {
	Event *StrategyFactoryStrategyBeaconModified // Event containing the contract specifics and raw log

	contract *bind.BoundContract // Generic contract to use for unpacking event data
	event    string              // Event name to use for unpacking event data

	logs chan types.Log        // Log channel receiving the found contract events
	sub  ethereum.Subscription // Subscription for errors, completion and termination
	done bool                  // Whether the subscription completed delivering logs
	fail error                 // Occurred error to stop iteration
}
⋮----
Event *StrategyFactoryStrategyBeaconModified // Event containing the contract specifics and raw log
⋮----
// StrategyFactoryStrategyBeaconModified represents a StrategyBeaconModified event raised by the StrategyFactory contract.
type StrategyFactoryStrategyBeaconModified struct {
	PreviousBeacon common.Address
	NewBeacon      common.Address
	Raw            types.Log // Blockchain specific contextual infos
}
⋮----
Raw            types.Log // Blockchain specific contextual infos
⋮----
// FilterStrategyBeaconModified is a free log retrieval operation binding the contract event 0xe21755962a7d7e100b59b9c3e4d4b54085b146313719955efb6a7a25c5c7feee.
⋮----
// Solidity: event StrategyBeaconModified(address previousBeacon, address newBeacon)
func (_StrategyFactory *StrategyFactoryFilterer) FilterStrategyBeaconModified(opts *bind.FilterOpts) (*StrategyFactoryStrategyBeaconModifiedIterator, error)
⋮----
// WatchStrategyBeaconModified is a free log subscription operation binding the contract event 0xe21755962a7d7e100b59b9c3e4d4b54085b146313719955efb6a7a25c5c7feee.
⋮----
func (_StrategyFactory *StrategyFactoryFilterer) WatchStrategyBeaconModified(opts *bind.WatchOpts, sink chan<- *StrategyFactoryStrategyBeaconModified) (event.Subscription, error)
⋮----
// ParseStrategyBeaconModified is a log parse operation binding the contract event 0xe21755962a7d7e100b59b9c3e4d4b54085b146313719955efb6a7a25c5c7feee.
⋮----
func (_StrategyFactory *StrategyFactoryFilterer) ParseStrategyBeaconModified(log types.Log) (*StrategyFactoryStrategyBeaconModified, 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
)
⋮----
// StrategyFactoryStorageMetaData contains all meta data concerning the StrategyFactoryStorage contract.
var StrategyFactoryStorageMetaData = &bind.MetaData{
	ABI: "[{\"type\":\"function\",\"name\":\"deployNewStrategy\",\"inputs\":[{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"contractIERC20\"}],\"outputs\":[{\"name\":\"newStrategy\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"deployedStrategies\",\"inputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIERC20\"}],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"isBlacklisted\",\"inputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIERC20\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"removeStrategiesFromWhitelist\",\"inputs\":[{\"name\":\"strategiesToRemoveFromWhitelist\",\"type\":\"address[]\",\"internalType\":\"contractIStrategy[]\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"strategyBeacon\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIBeacon\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"version\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"string\",\"internalType\":\"string\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"whitelistStrategies\",\"inputs\":[{\"name\":\"strategiesToWhitelist\",\"type\":\"address[]\",\"internalType\":\"contractIStrategy[]\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"event\",\"name\":\"StrategyBeaconModified\",\"inputs\":[{\"name\":\"previousBeacon\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"contractIBeacon\"},{\"name\":\"newBeacon\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"contractIBeacon\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"StrategySetForToken\",\"inputs\":[{\"name\":\"token\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"contractIERC20\"},{\"name\":\"strategy\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"contractIStrategy\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"TokenBlacklisted\",\"inputs\":[{\"name\":\"token\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"contractIERC20\"}],\"anonymous\":false},{\"type\":\"error\",\"name\":\"AlreadyBlacklisted\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"BlacklistedToken\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"StrategyAlreadyExists\",\"inputs\":[]}]",
}
⋮----
// StrategyFactoryStorageABI is the input ABI used to generate the binding from.
// 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{}
⋮----
// 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)
⋮----
// Version is a free data retrieval call binding the contract method 0x54fd4d50.
⋮----
// Solidity: function version() view returns(string)
func (_StrategyFactoryStorage *StrategyFactoryStorageCaller) Version(opts *bind.CallOpts) (string, error)
⋮----
// 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)
⋮----
// StrategyFactoryStorageStrategyBeaconModifiedIterator is returned from FilterStrategyBeaconModified and is used to iterate over the raw logs and unpacked data for StrategyBeaconModified events raised by the StrategyFactoryStorage contract.
type StrategyFactoryStorageStrategyBeaconModifiedIterator struct {
	Event *StrategyFactoryStorageStrategyBeaconModified // Event containing the contract specifics and raw log

	contract *bind.BoundContract // Generic contract to use for unpacking event data
	event    string              // Event name to use for unpacking event data

	logs chan types.Log        // Log channel receiving the found contract events
	sub  ethereum.Subscription // Subscription for errors, completion and termination
	done bool                  // Whether the subscription completed delivering logs
	fail error                 // Occurred error to stop iteration
}
⋮----
Event *StrategyFactoryStorageStrategyBeaconModified // Event containing the contract specifics and raw log
⋮----
contract *bind.BoundContract // Generic contract to use for unpacking event data
event    string              // Event name to use for unpacking event data
⋮----
logs chan types.Log        // Log channel receiving the found contract events
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 *StrategyFactoryStorageStrategyBeaconModifiedIterator) 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 *StrategyFactoryStorageStrategyBeaconModifiedIterator) Error() error
⋮----
// Close terminates the iteration process, releasing any pending underlying
// resources.
func (it *StrategyFactoryStorageStrategyBeaconModifiedIterator) Close() error
⋮----
// StrategyFactoryStorageStrategyBeaconModified represents a StrategyBeaconModified event raised by the StrategyFactoryStorage contract.
type StrategyFactoryStorageStrategyBeaconModified struct {
	PreviousBeacon common.Address
	NewBeacon      common.Address
	Raw            types.Log // Blockchain specific contextual infos
}
⋮----
Raw            types.Log // Blockchain specific contextual infos
⋮----
// FilterStrategyBeaconModified is a free log retrieval operation binding the contract event 0xe21755962a7d7e100b59b9c3e4d4b54085b146313719955efb6a7a25c5c7feee.
⋮----
// Solidity: event StrategyBeaconModified(address previousBeacon, address newBeacon)
func (_StrategyFactoryStorage *StrategyFactoryStorageFilterer) FilterStrategyBeaconModified(opts *bind.FilterOpts) (*StrategyFactoryStorageStrategyBeaconModifiedIterator, error)
⋮----
// WatchStrategyBeaconModified is a free log subscription operation binding the contract event 0xe21755962a7d7e100b59b9c3e4d4b54085b146313719955efb6a7a25c5c7feee.
⋮----
func (_StrategyFactoryStorage *StrategyFactoryStorageFilterer) WatchStrategyBeaconModified(opts *bind.WatchOpts, sink chan<- *StrategyFactoryStorageStrategyBeaconModified) (event.Subscription, error)
⋮----
// New log arrived, parse the event and forward to the user
⋮----
// ParseStrategyBeaconModified is a log parse operation binding the contract event 0xe21755962a7d7e100b59b9c3e4d4b54085b146313719955efb6a7a25c5c7feee.
⋮----
func (_StrategyFactoryStorage *StrategyFactoryStorageFilterer) ParseStrategyBeaconModified(log types.Log) (*StrategyFactoryStorageStrategyBeaconModified, 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: "0x610100604052348015610010575f5ffd5b506040516139d73803806139d783398101604081905261002f916101bc565b80808585856001600160a01b03811661005b576040516339b190bb60e11b815260040160405180910390fd5b6001600160a01b0390811660805291821660a0521660c05261007c81610093565b60e0525061008a90506100d9565b50505050610301565b5f5f829050601f815111156100c6578260405163305a27a960e01b81526004016100bd91906102a6565b60405180910390fd5b80516100d1826102db565b179392505050565b5f54610100900460ff16156101405760405162461bcd60e51b815260206004820152602760248201527f496e697469616c697a61626c653a20636f6e747261637420697320696e697469604482015266616c697a696e6760c81b60648201526084016100bd565b5f5460ff9081161461018f575f805460ff191660ff9081179091556040519081527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b565b6001600160a01b03811681146101a5575f5ffd5b50565b634e487b7160e01b5f52604160045260245ffd5b5f5f5f5f608085870312156101cf575f5ffd5b84516101da81610191565b60208601519094506101eb81610191565b60408601519093506101fc81610191565b60608601519092506001600160401b03811115610217575f5ffd5b8501601f81018713610227575f5ffd5b80516001600160401b03811115610240576102406101a8565b604051601f8201601f19908116603f011681016001600160401b038111828210171561026e5761026e6101a8565b604052818152828201602001891015610285575f5ffd5b8160208401602083015e5f6020838301015280935050505092959194509250565b602081525f82518060208401528060208501604085015e5f604082850101526040601f19601f83011684010191505092915050565b805160208083015191908110156102fb575f198160200360031b1b821691505b50919050565b60805160a05160c05160e05161365d61037a5f395f81816110a8015261247401525f81816105fa015281816108c101528181610da30152818161103a0152818161125501526120a901525f81816105a001528181610815015261141a01525f81816104b601528181611aaa01526124e3015261365d5ff3fe608060405234801561000f575f5ffd5b506004361061026b575f3560e01c80637ecebe001161014b578063ca8aa7c7116100bf578063f2fde38b11610084578063f2fde38b1461062f578063f3b4a00014610642578063f698da251461064c578063fabc1cbc14610654578063fd98042314610667578063fe243a171461067a575f5ffd5b8063ca8aa7c71461059b578063cbc2bd62146105c2578063de44acb6146105d5578063df5cf723146105f5578063e7a050aa1461061c575f5ffd5b80638da5cb5b116101105780638da5cb5b1461052b57806394f649dd1461053c578063967fc0d21461054f5780639ac01d6114610562578063b5d8b5b814610575578063c665670214610588575f5ffd5b80637ecebe001461047f578063829fca731461049e578063886f1195146104b157806388c10299146104f05780638b8aac3c14610503575f5ffd5b806350ff7225116101e25780635de08ff2116101a75780635de08ff2146103fc578063663c1de41461040f578063715018a614610431578063724af4231461043957806376fb162b1461044c5780637def15641461045f575f5ffd5b806350ff72251461037c57806354fd4d50146103a4578063595c6a67146103b95780635ac86ab7146103c15780635c975abb146103f4575f5ffd5b806332e89ace1161023357806332e89ace146102f157806336a8c500146103045780633f292b081461031a5780633fb99ca51461032f57806348825e94146103425780634b6d5d6e14610369575f5ffd5b8063136439dd1461026f5780631794bb3c146102845780632d44def6146102975780632eae418c146102bd57806331f8fb4c146102d0575b5f5ffd5b61028261027d366004612e33565b6106a4565b005b610282610292366004612e5e565b6106de565b6102aa6102a5366004612eb2565b610804565b6040519081526020015b60405180910390f35b6102826102cb366004612ef0565b6108b6565b6102e36102de366004612f3e565b610982565b6040516102b4929190612fda565b6102aa6102ff36600461304b565b610b10565b61030c610b95565b6040516102b4929190613125565b610322610cb0565b6040516102b4919061317b565b61028261033d3660046131d8565b610d98565b6102aa7f4337f82d142e41f2a8c10547cd8c859bddb92262a61058e77842e24d9dea922481565b61028261037736600461321c565b610ee0565b61038f61038a366004612e5e565b61102d565b604080519283526020830191909152016102b4565b6103ac6110a1565b6040516102b49190613265565b6102826110d1565b6103e46103cf366004613277565b609854600160ff9092169190911b9081161490565b60405190151581526020016102b4565b6098546102aa565b61028261040a366004613297565b6110e5565b6103e461041d36600461321c565b60d16020525f908152604090205460ff1681565b610282611238565b6102aa610447366004612e5e565b611249565b6102aa61045a366004612eb2565b6112a6565b61047261046d366004613306565b6112f5565b6040516102b49190613320565b6102aa61048d36600461321c565b60ca6020525f908152604090205481565b6102aa6104ac366004612f3e565b611327565b6104d87f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b0390911681526020016102b4565b6104726104fe366004612f3e565b611361565b6102aa61051136600461321c565b6001600160a01b03165f90815260ce602052604090205490565b6033546001600160a01b03166104d8565b6102e361054a36600461321c565b611498565b60cb546104d8906001600160a01b031681565b6102aa610570366004613332565b61160f565b610282610583366004613297565b6116a0565b61028261059636600461321c565b6117e7565b6104d87f000000000000000000000000000000000000000000000000000000000000000081565b6104d86105d0366004613393565b61180a565b6105e86105e336600461321c565b61183e565b6040516102b491906133bd565b6104d87f000000000000000000000000000000000000000000000000000000000000000081565b6102aa61062a366004612e5e565b6118b1565b61028261063d36600461321c565b6118e4565b6104d8620e16e481565b6102aa61195a565b610282610662366004612e33565b611a13565b6102aa61067536600461321c565b611a80565b6102aa6106883660046133cf565b60cd60209081525f928352604080842090915290825290205481565b6106ac611a95565b60985481811681146106d15760405163c61dca5d60e01b815260040160405180910390fd5b6106da82611b38565b5050565b5f54610100900460ff16158080156106fc57505f54600160ff909116105b806107155750303b15801561071557505f5460ff166001145b61077d5760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b60648201526084015b60405180910390fd5b5f805460ff19166001179055801561079e575f805461ff0019166101001790555b6107a782611b38565b6107b084611b75565b6107b983611bc6565b80156107fe575f805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b50505050565b5f61080d611c2f565b6108a38484847f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316630f3df50e896040518263ffffffff1660e01b815260040161085f919061344f565b602060405180830381865afa15801561087a573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061089e919061345d565b611c88565b90506108af6001606555565b9392505050565b336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146108ff5760405163f739589b60e01b815260040160405180910390fd5b610907611c2f565b604051636ce5768960e11b81526001600160a01b0384169063d9caed129061093790879086908690600401613478565b6020604051808303815f875af1158015610953573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610977919061349c565b506107fe6001606555565b6060805f60d7816109a061099b368990038901896134b3565b611e90565b81526020019081526020015f205f8581526020019081526020015f2090505f6109c882611ef3565b90505f81516001600160401b038111156109e4576109e4613007565b604051908082528060200260200182016040528015610a0d578160200160208202803683370190505b5090505f82516001600160401b03811115610a2a57610a2a613007565b604051908082528060200260200182016040528015610a53578160200160208202803683370190505b5090505f5b8351811015610b0057838181518110610a7357610a7361350f565b6020026020010151838281518110610a8d57610a8d61350f565b60200260200101906001600160a01b031690816001600160a01b031681525050610ad9848281518110610ac257610ac261350f565b602002602001015186611eff90919063ffffffff16565b9050828281518110610aed57610aed61350f565b6020908102919091010152600101610a58565b50909450925050505b9250929050565b5f5f610b1b81611f23565b610b23611c2f565b6001600160a01b0385165f90815260ca6020526040902054610b5486610b4d818c8c8c878c61160f565b8688611f4e565b6001600160a01b0386165f90815260ca60205260409020600182019055610b7d868a8a8a611fa0565b925050610b8a6001606555565b509695505050505050565b6060805f610ba360d461210d565b90505f816001600160401b03811115610bbe57610bbe613007565b604051908082528060200260200182016040528015610be7578160200160208202803683370190505b5090505f826001600160401b03811115610c0357610c03613007565b604051908082528060200260200182016040528015610c2c578160200160208202803683370190505b5090505f5b83811015610ca5575f5f610c4660d484612117565b9150915081858481518110610c5d57610c5d61350f565b60200260200101906001600160a01b031690816001600160a01b03168152505080848481518110610c9057610c9061350f565b60209081029190910101525050600101610c31565b509094909350915050565b60605f610cbd60d8612125565b90505f816001600160401b03811115610cd857610cd8613007565b604051908082528060200260200182016040528015610d1c57816020015b604080518082019091525f8082526020820152815260200190600190039081610cf65790505b5090505f5b82811015610d9157610d6c610d3760d88361212e565b604080518082019091525f80825260208201525060408051808201909152606082901c815263ffffffff909116602082015290565b828281518110610d7e57610d7e61350f565b6020908102919091010152600101610d21565b5092915050565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614610de15760405163f739589b60e01b815260040160405180910390fd5b610de9611c2f565b5f60d781610dff61099b368990038901896134b3565b815260208082019290925260409081015f90812087825290925290209050610e28818484612139565b610e455760405163ca354fa360e01b815260040160405180910390fd5b610e62610e5a61099b368890038801886134b3565b60d89061214e565b50610e978460da5f610e7c61099b368b90038b018b6134b3565b81526020019081526020015f2061214e90919063ffffffff16565b507f5f5209798bbac45a16d2dc3bc67319fab26ee00153916d6f07b69f8a134a1e8b85858585604051610ecd9493929190613523565b60405180910390a1506107fe6001606555565b610ee8611c2f565b5f610ef460d483611eff565b915050610f0260d483612159565b50604080516001600160a01b0384168152602081018390527fd9d082c3ec4f3a3ffa55c324939a06407f5fbcb87d5e0ce3b9508c92c84ed839910160405180910390a1801561101f57816001600160a01b031663d9caed12620e16e4846001600160a01b0316632495a5996040518163ffffffff1660e01b8152600401602060405180830381865afa158015610f9a573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610fbe919061345d565b846040518463ffffffff1660e01b8152600401610fdd93929190613478565b6020604051808303815f875af1158015610ff9573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061101d919061349c565b505b5061102a6001606555565b50565b5f80336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146110785760405163f739589b60e01b815260040160405180910390fd5b611080611c2f565b61108b85858561216d565b915091506110996001606555565b935093915050565b60606110cc7f00000000000000000000000000000000000000000000000000000000000000006122d5565b905090565b6110d9611a95565b6110e35f19611b38565b565b60cb546001600160a01b03163314611110576040516320ba3ff960e21b815260040160405180910390fd5b611118611c2f565b805f5b8181101561122c5760d15f8585848181106111385761113861350f565b905060200201602081019061114d919061321c565b6001600160a01b0316815260208101919091526040015f205460ff1661122457600160d15f8686858181106111845761118461350f565b9050602002016020810190611199919061321c565b6001600160a01b0316815260208101919091526040015f20805460ff19169115159190911790557f0c35b17d91c96eb2751cd456e1252f42a386e524ef9ff26ecc9950859fdc04fe8484838181106111f3576111f361350f565b9050602002016020810190611208919061321c565b6040516001600160a01b03909116815260200160405180910390a15b60010161111b565b50506106da6001606555565b611240612312565b6110e35f611b75565b5f336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146112935760405163f739589b60e01b815260040160405180910390fd5b61129b611c2f565b6108a384848461236c565b5f806112eb8360d7836112c161099b368b90038b018b6134b3565b81526020019081526020015f205f8781526020019081526020015f20611eff90919063ffffffff16565b9695505050505050565b606061132160da5f61130f61099b368790038701876134b3565b81526020019081526020015f2061241a565b92915050565b5f6108af60d78261134061099b368890038801886134b3565b81526020019081526020015f205f8481526020019081526020015f2061210d565b606061136b611c2f565b5f6113a560d78261138461099b368990038901896134b3565b81526020019081526020015f205f8581526020019081526020015f20611ef3565b80519091505f816001600160401b038111156113c3576113c3613007565b6040519080825280602002602001820160405280156113ec578160200160208202803683370190505b5090505f5b828110156114895761146487878684815181106114105761141061350f565b60200260200101517f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316630f3df50e8c6040518263ffffffff1660e01b815260040161085f919061344f565b8282815181106114765761147661350f565b60209081029190910101526001016113f1565b50925050506113216001606555565b6001600160a01b0381165f90815260ce6020526040812054606091829190816001600160401b038111156114ce576114ce613007565b6040519080825280602002602001820160405280156114f7578160200160208202803683370190505b5090505f5b82811015611585576001600160a01b0386165f90815260cd6020908152604080832060ce909252822080549192918490811061153a5761153a61350f565b5f9182526020808320909101546001600160a01b0316835282019290925260400190205482518390839081106115725761157261350f565b60209081029190910101526001016114fc565b5060ce5f866001600160a01b03166001600160a01b031681526020019081526020015f2081818054806020026020016040519081016040528092919081815260200182805480156115fd57602002820191905f5260205f20905b81546001600160a01b031681526001909101906020018083116115df575b50505050509150935093505050915091565b604080517f4337f82d142e41f2a8c10547cd8c859bddb92262a61058e77842e24d9dea922460208201526001600160a01b03808916928201929092528187166060820152908516608082015260a0810184905260c0810183905260e081018290525f90611695906101000160405160208183030381529060405280519060200120612426565b979650505050505050565b60cb546001600160a01b031633146116cb576040516320ba3ff960e21b815260040160405180910390fd5b6116d3611c2f565b805f5b8181101561122c5760d15f8585848181106116f3576116f361350f565b9050602002016020810190611708919061321c565b6001600160a01b0316815260208101919091526040015f205460ff16156117df575f60d15f86868581811061173f5761173f61350f565b9050602002016020810190611754919061321c565b6001600160a01b0316815260208101919091526040015f20805460ff19169115159190911790557f4074413b4b443e4e58019f2855a8765113358c7c72e39509c6af45fc0f5ba0308484838181106117ae576117ae61350f565b90506020020160208101906117c3919061321c565b6040516001600160a01b03909116815260200160405180910390a15b6001016116d6565b6117ef612312565b6117f7611c2f565b61180081611bc6565b61102a6001606555565b60ce602052815f5260405f208181548110611823575f80fd5b5f918252602090912001546001600160a01b03169150829050565b6001600160a01b0381165f90815260ce60209081526040918290208054835181840281018401909452808452606093928301828280156118a557602002820191905f5260205f20905b81546001600160a01b03168152600190910190602001808311611887575b50505050509050919050565b5f5f6118bc81611f23565b6118c4611c2f565b6118d033868686611fa0565b91506118dc6001606555565b509392505050565b6118ec612312565b6001600160a01b0381166119515760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610774565b61102a81611b75565b60408051808201909152600a81526922b4b3b2b72630bcb2b960b11b6020909101525f7f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f7f71b625cfad44bac63b13dba07f2e1d6084ee04b6f8752101ece6126d584ee6ea6119c761246c565b805160209182012060408051928301949094529281019190915260608101919091524660808201523060a082015260c00160405160208183030381529060405280519060200120905090565b611a1b6124e1565b60985480198219811614611a425760405163c61dca5d60e01b815260040160405180910390fd5b609882905560405182815233907f3582d1828e26bf56bd801502bc021ac0bc8afb57c826e4986b45593c8fad389c9060200160405180910390a25050565b5f5f611a8d60d484611eff565b949350505050565b60405163237dfb4760e11b81523360048201527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906346fbf68e90602401602060405180830381865afa158015611af7573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611b1b9190613555565b6110e357604051631d77d47760e21b815260040160405180910390fd5b609881905560405181815233907fab40a374bc51de372200a8bc981af8c9ecdc08dfdaef0bb6e09f88f3c616ef3d9060200160405180910390a250565b603380546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a35050565b60cb54604080516001600160a01b03928316815291831660208301527f4264275e593955ff9d6146a51a4525f6ddace2e81db9391abcc9d1ca48047d29910160405180910390a160cb80546001600160a01b0319166001600160a01b0392909216919091179055565b600260655403611c815760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401610774565b6002606555565b5f8060d781611c9f61099b368a90038a018a6134b3565b815260208082019290925260409081015f90812088825290925281209150611cc78286611eff565b9150611cd590508286612159565b505f8115611dec57856001600160a01b031663d9caed1286886001600160a01b0316632495a5996040518163ffffffff1660e01b8152600401602060405180830381865afa158015611d29573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611d4d919061345d565b856040518463ffffffff1660e01b8152600401611d6c93929190613478565b6020604051808303815f875af1158015611d88573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611dac919061349c565b90507fe6413aa0c789e437b0a06bf64b20926584f066c79a2d8b80a759c85472f7b0af88888885604051611de39493929190613523565b60405180910390a15b5f611df684611ef3565b519050805f03611e8457611e348860da5f611e1961099b368f90038f018f6134b3565b81526020019081526020015f2061259290919063ffffffff16565b50611e5f60da5f611e4d61099b368e90038e018e6134b3565b81526020019081526020015f20612125565b5f03611e8457611e82611e7a61099b368c90038c018c6134b3565b60d890612592565b505b50979650505050505050565b5f815f0151826020015163ffffffff16604051602001611edb92919060609290921b6bffffffffffffffffffffffff1916825260a01b6001600160a01b031916601482015260200190565b60405160208183030381529060405261132190613574565b60605f6108af8361259d565b5f808080611f16866001600160a01b0387166125a8565b9097909650945050505050565b609854600160ff83161b9081160361102a5760405163840a48d560e01b815260040160405180910390fd5b42811015611f6f57604051630819bdcd60e01b815260040160405180910390fd5b611f836001600160a01b03851684846125e0565b6107fe57604051638baa579f60e01b815260040160405180910390fd5b6001600160a01b0383165f90815260d16020526040812054849060ff16611fda57604051632efd965160e11b815260040160405180910390fd5b611fef6001600160a01b038516338786612634565b6040516311f9fbc960e21b81526001600160a01b038581166004830152602482018590528616906347e7ef24906044016020604051808303815f875af115801561203b573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061205f919061349c565b91505f5f61206e88888661216d565b604051631e328e7960e11b81526001600160a01b038b811660048301528a8116602483015260448201849052606482018390529294509092507f000000000000000000000000000000000000000000000000000000000000000090911690633c651cf2906084015f604051808303815f87803b1580156120ec575f5ffd5b505af11580156120fe573d5f5f3e3d5ffd5b50505050505050949350505050565b5f6113218261268c565b5f808080611f168686612696565b5f611321825490565b5f6108af83836126bf565b5f611a8d846001600160a01b038516846126e5565b5f6108af8383612701565b5f6108af836001600160a01b03841661274d565b5f806001600160a01b038516612196576040516316f2ccc960e01b815260040160405180910390fd5b825f036121b6576040516342061b2560e11b815260040160405180910390fd5b6001600160a01b038086165f90815260cd602090815260408083209388168352929052908120549081900361225c576001600160a01b0386165f90815260ce60209081526040909120541061221e576040516301a1443960e31b815260040160405180910390fd5b6001600160a01b038681165f90815260ce602090815260408220805460018101825590835291200180546001600160a01b0319169187169190911790555b61226684826135ab565b6001600160a01b038088165f90815260cd60209081526040808320938a16835292905281902091909155517f5548c837ab068cf56a2c2479df0882a4922fd203edb7517321831d95078c5f62906122c290889088908890613478565b60405180910390a1959294509192505050565b60605f6122e183612769565b6040805160208082528183019092529192505f91906020820181803683375050509182525060208101929092525090565b6033546001600160a01b031633146110e35760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610774565b5f815f0361238d576040516342061b2560e11b815260040160405180910390fd5b6001600160a01b038085165f90815260cd6020908152604080832093871683529290522054808311156123d357604051634b18b19360e01b815260040160405180910390fd5b6123dd83826135be565b6001600160a01b038087165f90815260cd602090815260408083209389168352929052908120829055909150819003611a8d57611a8d8585612790565b60605f6108af8361290e565b5f61242f61195a565b60405161190160f01b6020820152602281019190915260428101839052606201604051602081830303815290604052805190602001209050919050565b60605f6124987f00000000000000000000000000000000000000000000000000000000000000006122d5565b9050805f815181106124ac576124ac61350f565b016020908101516040516001600160f81b03199091169181019190915260210160405160208183030381529060405291505090565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663eab66d7a6040518163ffffffff1660e01b8152600401602060405180830381865afa15801561253d573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612561919061345d565b6001600160a01b0316336001600160a01b0316146110e35760405163794821ff60e01b815260040160405180910390fd5b5f6108af8383612966565b60606113218261241a565b5f8181526002830160205260408120548190806125d5576125c98585612a49565b92505f9150610b099050565b600192509050610b09565b5f5f5f6125ed8585612a54565b90925090505f816004811115612605576126056135d1565b1480156126235750856001600160a01b0316826001600160a01b0316145b806112eb57506112eb868686612a93565b6107fe846323b872dd60e01b85858560405160240161265593929190613478565b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b031990931692909217909152612b7a565b5f61132182612125565b5f80806126a3858561212e565b5f81815260029690960160205260409095205494959350505050565b5f825f0182815481106126d4576126d461350f565b905f5260205f200154905092915050565b5f8281526002840160205260408120829055611a8d848461214e565b5f81815260018301602052604081205461274657508154600181810184555f848152602080822090930184905584548482528286019093526040902091909155611321565b505f611321565b5f81815260028301602052604081208190556108af8383612592565b5f60ff8216601f81111561132157604051632cd44ac360e21b815260040160405180910390fd5b6001600160a01b0382165f90815260ce6020526040812054905b818110156128a2576001600160a01b038481165f90815260ce60205260409020805491851691839081106127e0576127e061350f565b5f918252602090912001546001600160a01b03160361289a576001600160a01b0384165f90815260ce60205260409020805461281e906001906135be565b8154811061282e5761282e61350f565b5f9182526020808320909101546001600160a01b03878116845260ce909252604090922080549190921691908390811061286a5761286a61350f565b905f5260205f20015f6101000a8154816001600160a01b0302191690836001600160a01b031602179055506128a2565b6001016127aa565b8181036128c257604051632df15a4160e11b815260040160405180910390fd5b6001600160a01b0384165f90815260ce602052604090208054806128e8576128e86135e5565b5f8281526020902081015f1990810180546001600160a01b031916905501905550505050565b6060815f018054806020026020016040519081016040528092919081815260200182805480156118a557602002820191905f5260205f20905b8154815260200190600101908083116129475750505050509050919050565b5f8181526001830160205260408120548015612a40575f6129886001836135be565b85549091505f9061299b906001906135be565b90508181146129fa575f865f0182815481106129b9576129b961350f565b905f5260205f200154905080875f0184815481106129d9576129d961350f565b5f918252602080832090910192909255918252600188019052604090208390555b8554869080612a0b57612a0b6135e5565b600190038181905f5260205f20015f90559055856001015f8681526020019081526020015f205f905560019350505050611321565b5f915050611321565b5f6108af8383612c52565b5f5f8251604103612a88576020830151604084015160608501515f1a612a7c87828585612c69565b94509450505050610b09565b505f90506002610b09565b5f5f5f856001600160a01b0316631626ba7e60e01b8686604051602401612abb9291906135f9565b60408051601f198184030181529181526020820180516001600160e01b03166001600160e01b0319909416939093179092529051612af99190613611565b5f60405180830381855afa9150503d805f8114612b31576040519150601f19603f3d011682016040523d82523d5f602084013e612b36565b606091505b5091509150818015612b4a57506020815110155b80156112eb57508051630b135d3f60e11b90612b6f908301602090810190840161349c565b149695505050505050565b5f612bce826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b0316612d269092919063ffffffff16565b905080515f1480612bee575080806020019051810190612bee9190613555565b612c4d5760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b6064820152608401610774565b505050565b5f81815260018301602052604081205415156108af565b5f807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a0831115612c9e57505f90506003612d1d565b604080515f8082526020820180845289905260ff881692820192909252606081018690526080810185905260019060a0016020604051602081039080840390855afa158015612cef573d5f5f3e3d5ffd5b5050604051601f1901519150506001600160a01b038116612d17575f60019250925050612d1d565b91505f90505b94509492505050565b6060611a8d84845f85855f5f866001600160a01b03168587604051612d4b9190613611565b5f6040518083038185875af1925050503d805f8114612d85576040519150601f19603f3d011682016040523d82523d5f602084013e612d8a565b606091505b50915091506116958783838760608315612e045782515f03612dfd576001600160a01b0385163b612dfd5760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610774565b5081611a8d565b611a8d8383815115612e195781518083602001fd5b8060405162461bcd60e51b81526004016107749190613265565b5f60208284031215612e43575f5ffd5b5035919050565b6001600160a01b038116811461102a575f5ffd5b5f5f5f60608486031215612e70575f5ffd5b8335612e7b81612e4a565b92506020840135612e8b81612e4a565b929592945050506040919091013590565b5f60408284031215612eac575f5ffd5b50919050565b5f5f5f60808486031215612ec4575f5ffd5b612ece8585612e9c565b9250604084013591506060840135612ee581612e4a565b809150509250925092565b5f5f5f5f60808587031215612f03575f5ffd5b8435612f0e81612e4a565b93506020850135612f1e81612e4a565b92506040850135612f2e81612e4a565b9396929550929360600135925050565b5f5f60608385031215612f4f575f5ffd5b612f598484612e9c565b946040939093013593505050565b5f8151808452602084019350602083015f5b82811015612fa05781516001600160a01b0316865260209586019590910190600101612f79565b5093949350505050565b5f8151808452602084019350602083015f5b82811015612fa0578151865260209586019590910190600101612fbc565b604081525f612fec6040830185612f67565b8281036020840152612ffe8185612faa565b95945050505050565b634e487b7160e01b5f52604160045260245ffd5b604051601f8201601f191681016001600160401b038111828210171561304357613043613007565b604052919050565b5f5f5f5f5f5f60c08789031215613060575f5ffd5b863561306b81612e4a565b9550602087013561307b81612e4a565b945060408701359350606087013561309281612e4a565b92506080870135915060a08701356001600160401b038111156130b3575f5ffd5b8701601f810189136130c3575f5ffd5b80356001600160401b038111156130dc576130dc613007565b6130ef601f8201601f191660200161301b565b8181528a6020838501011115613103575f5ffd5b816020840160208301375f602083830101528093505050509295509295509295565b604080825283519082018190525f9060208501906060840190835b818110156131675783516001600160a01b0316835260209384019390920191600101613140565b505083810360208501526112eb8186612faa565b602080825282518282018190525f918401906040840190835b818110156131cd57835180516001600160a01b0316845260209081015163ffffffff168185015290930192604090920191600101613194565b509095945050505050565b5f5f5f5f60a085870312156131eb575f5ffd5b6131f58686612e9c565b935060408501359250606085013561320c81612e4a565b9396929550929360800135925050565b5f6020828403121561322c575f5ffd5b81356108af81612e4a565b5f81518084528060208401602086015e5f602082860101526020601f19601f83011685010191505092915050565b602081525f6108af6020830184613237565b5f60208284031215613287575f5ffd5b813560ff811681146108af575f5ffd5b5f5f602083850312156132a8575f5ffd5b82356001600160401b038111156132bd575f5ffd5b8301601f810185136132cd575f5ffd5b80356001600160401b038111156132e2575f5ffd5b8560208260051b84010111156132f6575f5ffd5b6020919091019590945092505050565b5f60408284031215613316575f5ffd5b6108af8383612e9c565b602081525f6108af6020830184612faa565b5f5f5f5f5f5f60c08789031215613347575f5ffd5b863561335281612e4a565b9550602087013561336281612e4a565b9450604087013561337281612e4a565b959894975094956060810135955060808101359460a0909101359350915050565b5f5f604083850312156133a4575f5ffd5b82356133af81612e4a565b946020939093013593505050565b602081525f6108af6020830184612f67565b5f5f604083850312156133e0575f5ffd5b82356133eb81612e4a565b915060208301356133fb81612e4a565b809150509250929050565b803563ffffffff81168114613419575f5ffd5b919050565b803561342981612e4a565b6001600160a01b0316825263ffffffff61344560208301613406565b1660208301525050565b60408101611321828461341e565b5f6020828403121561346d575f5ffd5b81516108af81612e4a565b6001600160a01b039384168152919092166020820152604081019190915260600190565b5f602082840312156134ac575f5ffd5b5051919050565b5f60408284031280156134c4575f5ffd5b50604080519081016001600160401b03811182821017156134e7576134e7613007565b60405282356134f581612e4a565b815261350360208401613406565b60208201529392505050565b634e487b7160e01b5f52603260045260245ffd5b60a08101613531828761341e565b60408201949094526001600160a01b03929092166060830152608090910152919050565b5f60208284031215613565575f5ffd5b815180151581146108af575f5ffd5b80516020808301519190811015612eac575f1960209190910360031b1b16919050565b634e487b7160e01b5f52601160045260245ffd5b8082018082111561132157611321613597565b8181038181111561132157611321613597565b634e487b7160e01b5f52602160045260245ffd5b634e487b7160e01b5f52603160045260245ffd5b828152604060208201525f611a8d6040830184613237565b5f82518060208501845e5f92019182525091905056fea26469706673582212200ff9eede575454cb6fa0ed8d668d35008dfe530f8c5e03454b93576133b1c85164736f6c634300081b0033",
}
⋮----
// 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\":\"version\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"string\",\"internalType\":\"string\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"withdrawSharesAsTokens\",\"inputs\":[{\"name\":\"staker\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"strategy\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"},{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"contractIERC20\"},{\"name\":\"shares\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"event\",\"name\":\"BurnOrRedistributableSharesDecreased\",\"inputs\":[{\"name\":\"operatorSet\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structOperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]},{\"name\":\"slashId\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"strategy\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"contractIStrategy\"},{\"name\":\"shares\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"BurnOrRedistributableSharesIncreased\",\"inputs\":[{\"name\":\"operatorSet\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structOperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]},{\"name\":\"slashId\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"strategy\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"contractIStrategy\"},{\"name\":\"shares\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"BurnableSharesDecreased\",\"inputs\":[{\"name\":\"strategy\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"contractIStrategy\"},{\"name\":\"shares\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Deposit\",\"inputs\":[{\"name\":\"staker\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"},{\"name\":\"strategy\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"contractIStrategy\"},{\"name\":\"shares\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"StrategyAddedToDepositWhitelist\",\"inputs\":[{\"name\":\"strategy\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"contractIStrategy\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"StrategyRemovedFromDepositWhitelist\",\"inputs\":[{\"name\":\"strategy\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"contractIStrategy\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"StrategyWhitelisterChanged\",\"inputs\":[{\"name\":\"previousAddress\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"},{\"name\":\"newAddress\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"error\",\"name\":\"MaxStrategiesExceeded\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"OnlyDelegationManager\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"OnlyStrategyWhitelister\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"SharesAmountTooHigh\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"SharesAmountZero\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"StakerAddressZero\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"StrategyAlreadyInSlash\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"StrategyNotFound\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"StrategyNotWhitelisted\",\"inputs\":[]}]",
}
⋮----
// StrategyManagerStorageABI is the input ABI used to generate the binding from.
// 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)
⋮----
// Version is a free data retrieval call binding the contract method 0x54fd4d50.
⋮----
// Solidity: function version() view returns(string)
func (_StrategyManagerStorage *StrategyManagerStorageCaller) Version(opts *bind.CallOpts) (string, error)
⋮----
// 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\"},{\"name\":\"_version\",\"type\":\"string\",\"internalType\":\"string\"}],\"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\":\"function\",\"name\":\"version\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"string\",\"internalType\":\"string\"}],\"stateMutability\":\"view\"},{\"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\":\"InvalidShortString\",\"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\":\"StringTooLong\",\"inputs\":[{\"name\":\"str\",\"type\":\"string\",\"internalType\":\"string\"}]},{\"type\":\"error\",\"name\":\"TaskSLAExceedsMaximum\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ThresholdNotMet\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"TimestampAtCreation\",\"inputs\":[]}]",
	Bin: "0x610100604052348015610010575f5ffd5b50604051615d1b380380615d1b83398101604081905261002f9161019b565b6001600160a01b03808516608052831660a0526001600160601b03821660c052806100598161006e565b60e052506100656100b4565b505050506102e6565b5f5f829050601f815111156100a1578260405163305a27a960e01b8152600401610098919061028b565b60405180910390fd5b80516100ac826102c0565b179392505050565b5f54610100900460ff161561011b5760405162461bcd60e51b815260206004820152602760248201527f496e697469616c697a61626c653a20636f6e747261637420697320696e697469604482015266616c697a696e6760c81b6064820152608401610098565b5f5460ff9081161461016a575f805460ff191660ff9081179091556040519081527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b565b80516001600160a01b0381168114610182575f5ffd5b919050565b634e487b7160e01b5f52604160045260245ffd5b5f5f5f5f608085870312156101ae575f5ffd5b6101b78561016c565b93506101c56020860161016c565b60408601519093506001600160601b03811681146101e1575f5ffd5b60608601519092506001600160401b038111156101fc575f5ffd5b8501601f8101871361020c575f5ffd5b80516001600160401b0381111561022557610225610187565b604051601f8201601f19908116603f011681016001600160401b038111828210171561025357610253610187565b60405281815282820160200189101561026a575f5ffd5b8160208401602083015e5f6020838301015280935050505092959194509250565b602081525f82518060208401528060208501604085015e5f604082850101526040601f19601f83011684010191505092915050565b805160208083015191908110156102e0575f198160200360031b1b821691505b50919050565b60805160a05160c05160e0516159d161034a5f395f611ae301525f81816103670152612f2001525f818161027f0152818161328f015281816138a10152613ac401525f81816103cc0152818161324f015281816137cf01526139f101526159d15ff3fe608060405234801561000f575f5ffd5b506004361061016d575f3560e01c80636373ea69116100d9578063a5fabc8111610093578063f2fde38b1161006e578063f2fde38b146103a1578063f741e81a146103b4578063f7424fc9146103c7578063fa2c0b37146103ee575f5ffd5b8063a5fabc811461033c578063b86941661461034f578063d3e043aa14610362575f5ffd5b80636373ea69146102bc578063678fbdb3146102dd5780636bf6fad5146102f0578063708c0db914610310578063715018a6146103235780638da5cb5b1461032b575f5ffd5b8063468c07a01161012a578063468c07a01461023257806349acd884146102475780634ad52e021461025a57806354743ad21461027a57806354fd4d50146102a157806362fee037146102a9575f5ffd5b80631270a892146101715780631a20c5051461019a5780631ae370eb146101cb5780631fb66f5d146101de5780632bf6cc79146101ff57806337eaa1041461021f575b5f5ffd5b61018461017f366004614271565b610420565b6040516101919190614326565b60405180910390f35b609b546101b3906201000090046001600160a01b031681565b6040516001600160a01b039091168152602001610191565b6101846101d9366004614583565b610449565b6101f16101ec3660046146c2565b61045c565b604051908152602001610191565b61021261020d366004614737565b610e05565b6040516101919190614776565b6101f161022d366004614784565b6112b1565b6102456102403660046147d6565b6112e4565b005b6102456102553660046147fe565b6112f8565b61026d610268366004614737565b611543565b604051610191919061491a565b6101b37f000000000000000000000000000000000000000000000000000000000000000081565b610184611adc565b6101846102b7366004614737565b611b0c565b609b546102ca9061ffff1681565b60405161ffff9091168152602001610191565b6102456102eb366004614a65565b612009565b6103036102fe366004614a80565b61201a565b6040516101919190614a9a565b61024561031e366004614aac565b61222e565b61024561235f565b6033546001600160a01b03166101b3565b61024561034a366004614af4565b612372565b61024561035d366004614737565b612c50565b6103897f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160601b039091168152602001610191565b6102456103af366004614a65565b612e82565b6102456103c2366004614be6565b612ef8565b6101b37f000000000000000000000000000000000000000000000000000000000000000081565b6104106103fc366004614737565b60996020525f908152604090205460ff1681565b6040519015158152602001610191565b6060816040516020016104339190614d11565b6040516020818303038152906040529050919050565b6060816040516020016104339190614e95565b5f61046561312d565b5f8260400151511161048a57604051636b1a1b6960e11b815260040160405180910390fd5b60995f61049a8460200151613186565b815260208101919091526040015f205460ff166104ca5760405163c292b29760e01b815260040160405180910390fd5b5f609a5f6104db8560200151613186565b815260208082019290925260409081015f20815160e08101835281546001600160a01b038082168352600160a01b918290046001600160601b03169583019590955260018301549485169382019390935292909160608401910460ff1660028111156105495761054961474e565b600281111561055a5761055a61474e565b815260028201546001600160a01b0316602082015260408051808201825260038401805492909301929091829060ff16600181111561059b5761059b61474e565b60018111156105ac576105ac61474e565b81526020016001820180546105c090614ea7565b80601f01602080910402602001604051908101604052809291908181526020018280546105ec90614ea7565b80156106375780601f1061060e57610100808354040283529160200191610637565b820191905f5260205f20905b81548152906001019060200180831161061a57829003601f168201915b505050505081525050815260200160058201805461065490614ea7565b80601f016020809104026020016040519081016040528092919081815260200182805461068090614ea7565b80156106cb5780601f106106a2576101008083540402835291602001916106cb565b820191905f5260205f20905b8154815290600101906020018083116106ae57829003601f168201915b50505050508152505090506106df816131e9565b6106fc576040516314b0a41d60e11b815260040160405180910390fd5b5f61070a8260600151613232565b90505f816001600160a01b0316635ddb9b5b86602001516040518263ffffffff1660e01b815260040161073d9190614efd565b602060405180830381865afa158015610758573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061077c9190614f0b565b90505f826001600160a01b0316636141879e87602001516040518263ffffffff1660e01b81526004016107af9190614efd565b602060405180830381865afa1580156107ca573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906107ee9190614f0b565b905063ffffffff8116158061082a57506108088183614f3a565b63ffffffff1684602001516001600160601b0316426108279190614f56565b11155b6108475760405163640fcd6b60e11b815260040160405180910390fd5b508251604051630a3fc61360e31b81526001600160a01b03909116906351fe3098906108799033908990600401614fa4565b5f6040518083038186803b15801561088f575f5ffd5b505afa1580156108a1573d5f5f3e3d5ffd5b50508451604051637036693f60e11b81525f93506001600160a01b03909116915063e06cd27e906108d6908990600401614fc7565b602060405180830381865afa1580156108f1573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906109159190614fd9565b90505f6097543046896040516020016109319493929190614ff4565b60405160208183030381529060405280519060200120905060975460016109589190614f56565b609755604080516101c0810190915233815260208101610977426132cc565b6001600160601b03908116825260208a81018051516001600160a01b039081168386015292871660408501528b5190921660608401529051015163ffffffff166080820152609b5461ffff1660a082015260c001600181525f602080830182905263ffffffff80881660408086019190915260608086018c90528d8201516080808801919091528251808601845286815260a0808901919091528351808701855287815260c09889015289875260988652958390208851958901516001600160601b03908116600160a01b9081026001600160a01b03988916178355948a0151938a0151168402928616929092176001830155870151600282018054968901519789015161ffff16600160c01b0261ffff60c01b19989095169093026001600160c01b0319909616941693909317939093179384168117835560e0850151919391929160ff60d01b1990911662ffffff60c01b1990911617600160d01b836003811115610ae657610ae661474e565b02179055506101008201516002808301805461012086015163ffffffff16600160e01b026001600160e01b03941515600160d81b02949094166001600160d81b039091161792909217909155610140830151805160208201516001600160601b0316600160a01b9081026001600160a01b0392831617600386019081556040840151600487018054919094166001600160a01b031982168117855560608601519596929594936001600160a81b031990921617918490811115610bab57610bab61474e565b021790555060808201516002820180546001600160a01b0319166001600160a01b0390921691909117905560a08201518051600383018054909190829060ff191660018381811115610bff57610bff61474e565b021790555060208201516001820190610c189082615075565b50505060c08201516005820190610c2f9082615075565b5050506101608201516009820190610c479082615075565b50610180820151600a820190610c5d9082615075565b506101a0820151600b820190610c739082615075565b50505060408501516001600160a01b031615801590610c9a57505f826001600160601b0316115b15610d155760808501516001600160a01b0316610cca57604051633480121760e21b815260040160405180910390fd5b86516001600160a01b0316610cf257604051633480121760e21b815260040160405180910390fd5b6040850151610d15906001600160a01b031633306001600160601b038616613337565b8451604051629c5c4560e41b8152600481018390526001600160a01b03909116906309c5c450906024015f604051808303815f87803b158015610d56575f5ffd5b505af1158015610d68573d5f5f3e3d5ffd5b5050505086602001515f01516001600160a01b031681336001600160a01b03167f33add0b01e02278be5459fbfa3274aee699ec47f4ee7236b59e7a2c8b5000c268a6020015160200151878c5f0151888c602001516001600160601b031642610dd19190614f56565b8f60400151604051610de89695949392919061512f565b60405180910390a4945050505050610e006001606555565b919050565b5f81815260986020908152604080832081516101c08101835281546001600160a01b038082168352600160a01b918290046001600160601b03908116968401969096526001840154808216958401959095529381900490941660608201526002820154928316608082015292820463ffffffff1660a0840152600160c01b820461ffff1660c084015283929160e0830190600160d01b900460ff166003811115610eb157610eb161474e565b6003811115610ec257610ec261474e565b8152600282810154600160d81b810460ff9081161515602080860191909152600160e01b90920463ffffffff16604080860191909152805160e0810182526003870180546001600160a01b038082168452600160a01b918290046001600160601b03169684019690965260048901549586169383019390935260609687019691959094918601939290910490911690811115610f6057610f6061474e565b6002811115610f7157610f7161474e565b815260028201546001600160a01b0316602082015260408051808201825260038401805492909301929091829060ff166001811115610fb257610fb261474e565b6001811115610fc357610fc361474e565b8152602001600182018054610fd790614ea7565b80601f016020809104026020016040519081016040528092919081815260200182805461100390614ea7565b801561104e5780601f106110255761010080835404028352916020019161104e565b820191905f5260205f20905b81548152906001019060200180831161103157829003601f168201915b505050505081525050815260200160058201805461106b90614ea7565b80601f016020809104026020016040519081016040528092919081815260200182805461109790614ea7565b80156110e25780601f106110b9576101008083540402835291602001916110e2565b820191905f5260205f20905b8154815290600101906020018083116110c557829003601f168201915b50505050508152505081526020016009820180546110ff90614ea7565b80601f016020809104026020016040519081016040528092919081815260200182805461112b90614ea7565b80156111765780601f1061114d57610100808354040283529160200191611176565b820191905f5260205f20905b81548152906001019060200180831161115957829003601f168201915b50505050508152602001600a8201805461118f90614ea7565b80601f01602080910402602001604051908101604052809291908181526020018280546111bb90614ea7565b80156112065780601f106111dd57610100808354040283529160200191611206565b820191905f5260205f20905b8154815290600101906020018083116111e957829003601f168201915b50505050508152602001600b8201805461121f90614ea7565b80601f016020809104026020016040519081016040528092919081815260200182805461124b90614ea7565b80156112965780601f1061126d57610100808354040283529160200191611296565b820191905f5260205f20905b81548152906001019060200180831161127957829003601f168201915b50505050508152505090506112aa816133a9565b9392505050565b5f82826040516020016112c5929190615188565b6040516020818303038152906040528051906020012090505b92915050565b6112ec613404565b6112f58161345e565b50565b5f609a5f61130585613186565b815260208082019290925260409081015f20815160e08101835281546001600160a01b038082168352600160a01b918290046001600160601b03169583019590955260018301549485169382019390935292909160608401910460ff1660028111156113735761137361474e565b60028111156113845761138461474e565b815260028201546001600160a01b0316602082015260408051808201825260038401805492909301929091829060ff1660018111156113c5576113c561474e565b60018111156113d6576113d661474e565b81526020016001820180546113ea90614ea7565b80601f016020809104026020016040519081016040528092919081815260200182805461141690614ea7565b80156114615780601f1061143857610100808354040283529160200191611461565b820191905f5260205f20905b81548152906001019060200180831161144457829003601f168201915b505050505081525050815260200160058201805461147e90614ea7565b80601f01602080910402602001604051908101604052809291908181526020018280546114aa90614ea7565b80156114f55780601f106114cc576101008083540402835291602001916114f5565b820191905f5260205f20905b8154815290600101906020018083116114d857829003601f168201915b5050505050815250509050611509816131e9565b611526576040516314b0a41d60e11b815260040160405180910390fd5b6115348382606001516134cf565b61153e8383613570565b505050565b61154b614051565b5f82815260986020908152604080832081516101c08101835281546001600160a01b038082168352600160a01b918290046001600160601b03908116968401969096526001840154808216958401959095529381900490941660608201526002820154928316608082015292820463ffffffff1660a0840152600160c01b820461ffff1660c08401529060e0830190600160d01b900460ff1660038111156115f5576115f561474e565b60038111156116065761160661474e565b8152600282810154600160d81b810460ff9081161515602080860191909152600160e01b90920463ffffffff16604080860191909152805160e0810182526003870180546001600160a01b038082168452600160a01b918290046001600160601b031696840196909652600489015495861693830193909352606096870196919590949186019392909104909116908111156116a4576116a461474e565b60028111156116b5576116b561474e565b815260028201546001600160a01b0316602082015260408051808201825260038401805492909301929091829060ff1660018111156116f6576116f661474e565b60018111156117075761170761474e565b815260200160018201805461171b90614ea7565b80601f016020809104026020016040519081016040528092919081815260200182805461174790614ea7565b80156117925780601f1061176957610100808354040283529160200191611792565b820191905f5260205f20905b81548152906001019060200180831161177557829003601f168201915b50505050508152505081526020016005820180546117af90614ea7565b80601f01602080910402602001604051908101604052809291908181526020018280546117db90614ea7565b80156118265780601f106117fd57610100808354040283529160200191611826565b820191905f5260205f20905b81548152906001019060200180831161180957829003601f168201915b505050505081525050815260200160098201805461184390614ea7565b80601f016020809104026020016040519081016040528092919081815260200182805461186f90614ea7565b80156118ba5780601f10611891576101008083540402835291602001916118ba565b820191905f5260205f20905b81548152906001019060200180831161189d57829003601f168201915b50505050508152602001600a820180546118d390614ea7565b80601f01602080910402602001604051908101604052809291908181526020018280546118ff90614ea7565b801561194a5780601f106119215761010080835404028352916020019161194a565b820191905f5260205f20905b81548152906001019060200180831161192d57829003601f168201915b50505050508152602001600b8201805461196390614ea7565b80601f016020809104026020016040519081016040528092919081815260200182805461198f90614ea7565b80156119da5780601f106119b1576101008083540402835291602001916119da565b820191905f5260205f20905b8154815290600101906020018083116119bd57829003601f168201915b5050505050815250509050604051806101c00160405280825f01516001600160a01b0316815260200182602001516001600160601b0316815260200182604001516001600160a01b0316815260200182606001516001600160601b0316815260200182608001516001600160a01b031681526020018260a0015163ffffffff1681526020018260c0015161ffff168152602001611a76836133a9565b6003811115611a8757611a8761474e565b81526020018261010001511515815260200182610120015163ffffffff168152602001826101400151815260200182610160015181526020018261018001518152602001826101a00151815250915050919050565b6060611b077f0000000000000000000000000000000000000000000000000000000000000000613601565b905090565b5f81815260986020908152604080832081516101c08101835281546001600160a01b038082168352600160a01b918290046001600160601b0390811696840196909652600184015480821695840195909552938190049094166060808301919091526002830154938416608083015293830463ffffffff1660a0820152600160c01b830461ffff1660c08201529293929160e0830190600160d01b900460ff166003811115611bbd57611bbd61474e565b6003811115611bce57611bce61474e565b8152600282810154600160d81b810460ff9081161515602080860191909152600160e01b90920463ffffffff16604080860191909152805160e0810182526003870180546001600160a01b038082168452600160a01b918290046001600160601b03169684019690965260048901549586169383019390935260609687019691959094918601939290910490911690811115611c6c57611c6c61474e565b6002811115611c7d57611c7d61474e565b815260028201546001600160a01b0316602082015260408051808201825260038401805492909301929091829060ff166001811115611cbe57611cbe61474e565b6001811115611ccf57611ccf61474e565b8152602001600182018054611ce390614ea7565b80601f0160208091040260200160405190810160405280929190818152602001828054611d0f90614ea7565b8015611d5a5780601f10611d3157610100808354040283529160200191611d5a565b820191905f5260205f20905b815481529060010190602001808311611d3d57829003601f168201915b5050505050815250508152602001600582018054611d7790614ea7565b80601f0160208091040260200160405190810160405280929190818152602001828054611da390614ea7565b8015611dee5780601f10611dc557610100808354040283529160200191611dee565b820191905f5260205f20905b815481529060010190602001808311611dd157829003601f168201915b5050505050815250508152602001600982018054611e0b90614ea7565b80601f0160208091040260200160405190810160405280929190818152602001828054611e3790614ea7565b8015611e825780601f10611e5957610100808354040283529160200191611e82565b820191905f5260205f20905b815481529060010190602001808311611e6557829003601f168201915b50505050508152602001600a82018054611e9b90614ea7565b80601f0160208091040260200160405190810160405280929190818152602001828054611ec790614ea7565b8015611f125780601f10611ee957610100808354040283529160200191611f12565b820191905f5260205f20905b815481529060010190602001808311611ef557829003601f168201915b50505050508152602001600b82018054611f2b90614ea7565b80601f0160208091040260200160405190810160405280929190818152602001828054611f5790614ea7565b8015611fa25780601f10611f7957610100808354040283529160200191611fa2565b820191905f5260205f20905b815481529060010190602001808311611f8557829003601f168201915b50505050508152505090505f611fb7826133a9565b90506002816003811115611fcd57611fcd61474e565b146002829091611ffb57604051634091b18960e11b8152600401611ff29291906151a0565b60405180910390fd5b5050506101a0015192915050565b612011613404565b6112f58161363e565b6120226140c4565b609a5f61202e84613186565b815260208082019290925260409081015f20815160e08101835281546001600160a01b038082168352600160a01b918290046001600160601b03169583019590955260018301549485169382019390935292909160608401910460ff16600281111561209c5761209c61474e565b60028111156120ad576120ad61474e565b815260028201546001600160a01b0316602082015260408051808201825260038401805492909301929091829060ff1660018111156120ee576120ee61474e565b60018111156120ff576120ff61474e565b815260200160018201805461211390614ea7565b80601f016020809104026020016040519081016040528092919081815260200182805461213f90614ea7565b801561218a5780601f106121615761010080835404028352916020019161218a565b820191905f5260205f20905b81548152906001019060200180831161216d57829003601f168201915b50505050508152505081526020016005820180546121a790614ea7565b80601f01602080910402602001604051908101604052809291908181526020018280546121d390614ea7565b801561221e5780601f106121f55761010080835404028352916020019161221e565b820191905f5260205f20905b81548152906001019060200180831161220157829003601f168201915b5050505050815250509050919050565b5f54610100900460ff161580801561224c57505f54600160ff909116105b806122655750303b15801561226557505f5460ff166001145b6122c85760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b6064820152608401611ff2565b5f805460ff1916600117905580156122e9575f805461ff0019166101001790555b6122f16136b8565b6122f96136e6565b61230284613714565b61230b8361345e565b6123148261363e565b8015612359575f805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b50505050565b612367613404565b6123705f613714565b565b61237a61312d565b5f83815260986020908152604080832081516101c08101835281546001600160a01b038082168352600160a01b918290046001600160601b03908116968401969096526001840154808216958401959095529381900490941660608201526002820154928316608082015292820463ffffffff1660a0840152600160c01b820461ffff1660c0840152929161281e91849060e0830190600160d01b900460ff16600381111561242b5761242b61474e565b600381111561243c5761243c61474e565b8152600282810154600160d81b810460ff9081161515602080860191909152600160e01b90920463ffffffff16604080860191909152805160e0810182526003870180546001600160a01b038082168452600160a01b918290046001600160601b031696840196909652600489015495861693830193909352606096870196919590949186019392909104909116908111156124da576124da61474e565b60028111156124eb576124eb61474e565b815260028201546001600160a01b0316602082015260408051808201825260038401805492909301929091829060ff16600181111561252c5761252c61474e565b600181111561253d5761253d61474e565b815260200160018201805461255190614ea7565b80601f016020809104026020016040519081016040528092919081815260200182805461257d90614ea7565b80156125c85780601f1061259f576101008083540402835291602001916125c8565b820191905f5260205f20905b8154815290600101906020018083116125ab57829003601f168201915b50505050508152505081526020016005820180546125e590614ea7565b80601f016020809104026020016040519081016040528092919081815260200182805461261190614ea7565b801561265c5780601f106126335761010080835404028352916020019161265c565b820191905f5260205f20905b81548152906001019060200180831161263f57829003601f168201915b505050505081525050815260200160098201805461267990614ea7565b80601f01602080910402602001604051908101604052809291908181526020018280546126a590614ea7565b80156126f05780601f106126c7576101008083540402835291602001916126f0565b820191905f5260205f20905b8154815290600101906020018083116126d357829003601f168201915b50505050508152602001600a8201805461270990614ea7565b80601f016020809104026020016040519081016040528092919081815260200182805461273590614ea7565b80156127805780601f1061275757610100808354040283529160200191612780565b820191905f5260205f20905b81548152906001019060200180831161276357829003601f168201915b50505050508152602001600b8201805461279990614ea7565b80601f01602080910402602001604051908101604052809291908181526020018280546127c590614ea7565b80156128105780601f106127e757610100808354040283529160200191612810565b820191905f5260205f20905b8154815290600101906020018083116127f357829003601f168201915b5050505050815250506133a9565b905060018160038111156128345761283461474e565b14600182909161285957604051634091b18960e11b8152600401611ff29291906151a0565b50508154600160a01b90046001600160601b0316421161288c5760405163015a4b7560e51b815260040160405180910390fd5b600382015460405163ba33565d60e01b81526001600160a01b039091169063ba33565d906128c49033908990899089906004016151bb565b5f6040518083038186803b1580156128da575f5ffd5b505afa1580156128ec573d5f5f3e3d5ffd5b50506040805180820182526001808701546001600160a01b03168252600287015463ffffffff600160a01b9182900416602084015260048801548451808601909552600689018054949750612a28965060ff929091048216949390928492919091169081111561295e5761295e61474e565b600181111561296f5761296f61474e565b815260200160018201805461298390614ea7565b80601f01602080910402602001604051908101604052809291908181526020018280546129af90614ea7565b80156129fa5780601f106129d1576101008083540402835291602001916129fa565b820191905f5260205f20905b8154815290600101906020018083116129dd57829003601f168201915b5050509190925250505060028601548490600160e01b900463ffffffff16612a228b8a6112b1565b8a613765565b60028301805460ff60d01b1916600160d11b179055600a8301612a4b8682615075565b50600b8301612a5a8582615075565b5060048301546001600160a01b031615801590612a8a57506001830154600160a01b90046001600160601b031615155b15612b7957600283015460018401545f91612ad99161271091612aca91600160c01b90910461ffff16906001600160601b03600160a01b909104166151f3565b612ad4919061520a565b6132cc565b90506001600160601b03811615612b1957609b546004850154612b19916001600160a01b039182169162010000909104166001600160601b038416613b87565b60018401545f90612b3b908390600160a01b90046001600160601b0316615229565b90506001600160601b03811615612b765760058501546004860154612b76916001600160a01b0391821691166001600160601b038416613b87565b50505b6003830154604051637041233f60e11b8152336004820152602481018890526001600160a01b039091169063e082467e906044015f604051808303815f87803b158015612bc4575f5ffd5b505af1158015612bd6573d5f5f3e3d5ffd5b505050600184015460028501546040516001600160a01b039092169250889133917f659f23b2e7edf490e5fd6561c5148691ed0375ed7ddd3ab1bcfcfdbec4f209a991612c3b9163ffffffff600160a01b9091041690600a8a0190600b8b01906152c7565b60405180910390a450505061153e6001606555565b612c5861312d565b5f81815260986020526040902060028101546001600160a01b03163314612c92576040516370f43cb760e01b815260040160405180910390fd5b6002810154600160d81b900460ff1615612cbf57604051633e3d786960e01b815260040160405180910390fd5b604080516101c08101825282546001600160a01b038082168352600160a01b918290046001600160601b03908116602085015260018601548083169585019590955293829004909316606083015260028401549283166080830152820463ffffffff1660a0820152600160c01b820461ffff1660c08201525f91612d609190849060e0830190600160d01b900460ff16600381111561242b5761242b61474e565b90506003816003811115612d7657612d7661474e565b146003829091612d9b57604051634091b18960e11b8152600401611ff29291906151a0565b505060028201805460ff60d81b1916600160d81b17905560048201546001600160a01b031615801590612de157506001820154600160a01b90046001600160601b031615155b15612e1d57600282015460018301546004840154612e1d926001600160a01b0391821692911690600160a01b90046001600160601b0316613b87565b60028201546001830154604051600160a01b9091046001600160601b0316815284916001600160a01b0316907fe3ed40d31808582f7a92a30beacc0ec788d5091407ec6c10c1b999b3f317aea39060200160405180910390a350506112f56001606555565b612e8a613404565b6001600160a01b038116612eef5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401611ff2565b6112f581613714565b612f01816131e9565b612f1e576040516314b0a41d60e11b815260040160405180910390fd5b7f00000000000000000000000000000000000000000000000000000000000000006001600160601b031681602001516001600160601b03161115612f755760405163a7cf966560e01b815260040160405180910390fd5b612f828160a00151613bb7565b612f908282606001516134cf565b80609a5f612f9d85613186565b815260208082019290925260409081015f208351928401516001600160601b0316600160a01b9081026001600160a01b0394851617825591840151600182018054919094166001600160a01b03198216811785556060860151929492936001600160a81b0319909216179083600281111561301a5761301a61474e565b021790555060808201516002820180546001600160a01b0319166001600160a01b0390921691909117905560a08201518051600383018054909190829060ff19166001838181111561306e5761306e61474e565b0217905550602082015160018201906130879082615075565b50505060c0820151600582019061309e9082615075565b50905050816020015163ffffffff16825f01516001600160a01b0316336001600160a01b03167f7cd76abd4025a20959a1b20f7c1536e3894a0735cd8de0215dde803ddea7f2d2846040516130f39190614a9a565b60405180910390a460995f61310784613186565b815260208101919091526040015f205460ff1661312957613129826001613570565b5050565b60026065540361317f5760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401611ff2565b6002606555565b5f815f0151826020015163ffffffff166040516020016131d192919060609290921b6bffffffffffffffffffffffff1916825260a01b6001600160a01b031916601482015260200190565b6040516020818303038152906040526112de906152f7565b5f80826060015160028111156132015761320161474e565b14158015613218575081516001600160a01b031615155b80156112de575050602001516001600160601b0316151590565b5f60028260028111156132475761324761474e565b0361327357507f0000000000000000000000000000000000000000000000000000000000000000919050565b60018260028111156132875761328761474e565b036132b357507f0000000000000000000000000000000000000000000000000000000000000000919050565b60405163fdea7c0960e01b815260040160405180910390fd5b5f6001600160601b038211156133335760405162461bcd60e51b815260206004820152602660248201527f53616665436173743a2076616c756520646f65736e27742066697420696e203960448201526536206269747360d01b6064820152608401611ff2565b5090565b6040516001600160a01b03808516602483015283166044820152606481018290526123599085906323b872dd60e01b906084015b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b031990931692909217909152613c76565b6001606555565b5f60018260e0015160038111156133c2576133c261474e565b1480156133ef57508161014001516020015182602001516133e3919061531a565b6001600160601b031642115b156133fc57506003919050565b5060e0015190565b6033546001600160a01b031633146123705760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401611ff2565b61271061ffff8216111561348557604051630601f69760e01b815260040160405180910390fd5b609b805461ffff191661ffff83169081179091556040519081527f886b2cfcb151fd8b19ed902cc88f4a06dd9fe351a4a9ab93f33fe84abc157edf9060200160405180910390a150565b5f6134d982613232565b6040516304240c4960e51b815290915033906001600160a01b0383169063848189209061350a908790600401614efd565b602060405180830381865afa158015613525573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906135499190615339565b6001600160a01b03161461153e576040516342ecfee960e11b815260040160405180910390fd5b8060995f61357d85613186565b81526020019081526020015f205f6101000a81548160ff021916908315150217905550816020015163ffffffff16825f01516001600160a01b0316336001600160a01b03167f48b63f21a1eb9dd6880e196de6d7db3fbd0c282b74f1298dcb4cf53472298f39846040516135f5911515815260200190565b60405180910390a45050565b60605f61360d83613d49565b6040805160208082528183019092529192505f91906020820181803683375050509182525060208101929092525090565b6001600160a01b03811661366557604051630863a45360e11b815260040160405180910390fd5b609b805462010000600160b01b031916620100006001600160a01b038416908102919091179091556040517f262aa27c244f6f0088cb3092548a0adcaddedf459070a9ccab2dc6a07abe701d905f90a250565b5f54610100900460ff166136de5760405162461bcd60e51b8152600401611ff290615354565b612370613d70565b5f54610100900460ff1661370c5760405162461bcd60e51b8152600401611ff290615354565b612370613d9f565b603380546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a35050565b5f855160018111156137795761377961474e565b036139215760028660028111156137925761379261474e565b0361384f575f818060200190518101906137ac91906155ff565b90506137b9818585613dc5565b6040516280b71560e41b81526001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169063080b71509061380690889085906004016156d1565b5f604051808303815f875af1158015613821573d5f5f3e3d5ffd5b505050506040513d5f823e601f3d908101601f1916820160405261384891908101906156f0565b5050613b7f565b60018660028111156138635761386361474e565b036132b3575f8180602001905181019061387d9190615721565b905061388a818585613e4f565b6040516380c7d3f360e01b81526001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016906380c7d3f3906138d8908890859060040161579a565b5f60405180830381865afa1580156138f2573d5f5f3e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052613919919081019061581d565b505050613b7f565b6001855160018111156139365761393661474e565b03613b66575f85602001518060200190518101906139549190615876565b6040805160018082528183019092529192505f91906020808301908036833701905050905081815f8151811061398c5761398c615891565b61ffff909216602092830291909101909101525f60028960028111156139b4576139b461474e565b03613a72575f848060200190518101906139ce91906155ff565b90506139db818888613dc5565b604051625f5e5d60e21b81526001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169063017d797490613a2a908b90859088906004016158e3565b6020604051808303815f875af1158015613a46573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190613a6a9190615914565b915050613b48565b6001896002811115613a8657613a8661474e565b036132b3575f84806020019051810190613aa09190615721565b9050613aad818888613e4f565b604051630606d12160e51b81526001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169063c0da242090613afd908b908590889060040161592f565b5f60405180830381865afa158015613b17573d5f5f3e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052613b3e919081019061594e565b509150613b489050565b80613919576040516359fa4a9360e01b815260040160405180910390fd5b6040516347d3772160e11b815260040160405180910390fd5b505050505050565b6040516001600160a01b03831660248201526044810182905261153e90849063a9059cbb60e01b9060640161336b565b5f81516001811115613bcb57613bcb61474e565b03613bf457602081015151156112f557604051631501e04760e21b815260040160405180910390fd5b600181516001811115613c0957613c0961474e565b03613b6657806020015151602014613c3457604051631501e04760e21b815260040160405180910390fd5b5f8160200151806020019051810190613c4d9190615876565b905061271061ffff8216111561312957604051631501e04760e21b815260040160405180910390fd5b5f613cca826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b0316613ec79092919063ffffffff16565b905080515f1480613cea575080806020019051810190613cea9190615914565b61153e5760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b6064820152608401611ff2565b5f60ff8216601f8111156112de57604051632cd44ac360e21b815260040160405180910390fd5b5f54610100900460ff16613d965760405162461bcd60e51b8152600401611ff290615354565b61237033613714565b5f54610100900460ff166133a25760405162461bcd60e51b8152600401611ff290615354565b8163ffffffff16835f015163ffffffff1614613df457604051634534032960e01b815260040160405180910390fd5b80836020015114613e1857604051638b56642d60e01b815260040160405180910390fd5b604083015151158015613e315750604083015160200151155b1561153e57604051637a8a1dbd60e11b815260040160405180910390fd5b8163ffffffff16835f015163ffffffff1614613e7e57604051634534032960e01b815260040160405180910390fd5b80836020015114613ea257604051638b56642d60e01b815260040160405180910390fd5b5f8360400151511161153e57604051637a8a1dbd60e11b815260040160405180910390fd5b6060613ed584845f85613edd565b949350505050565b606082471015613f3e5760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6044820152651c8818d85b1b60d21b6064820152608401611ff2565b5f5f866001600160a01b03168587604051613f599190615985565b5f6040518083038185875af1925050503d805f8114613f93576040519150601f19603f3d011682016040523d82523d5f602084013e613f98565b606091505b5091509150613fa987838387613fb4565b979650505050505050565b606083156140225782515f0361401b576001600160a01b0385163b61401b5760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401611ff2565b5081613ed5565b613ed583838151156140375781518083602001fd5b8060405162461bcd60e51b8152600401611ff29190614326565b604080516101c0810182525f80825260208201819052918101829052606081018290526080810182905260a0810182905260c081018290529060e082019081525f6020820181905260408201526060016140a96140c4565b81526020016060815260200160608152602001606081525090565b6040805160e0810182525f8082526020820181905291810182905290606082019081525f60208201526040016140f8614105565b8152602001606081525090565b60408051808201909152805f6140f8565b634e487b7160e01b5f52604160045260245ffd5b604051606081016001600160401b038111828210171561414c5761414c614116565b60405290565b604080519081016001600160401b038111828210171561414c5761414c614116565b60405160a081016001600160401b038111828210171561414c5761414c614116565b60405160e081016001600160401b038111828210171561414c5761414c614116565b604051601f8201601f191681016001600160401b03811182821017156141e0576141e0614116565b604052919050565b63ffffffff811681146112f5575f5ffd5b5f6001600160401b0382111561421157614211614116565b50601f01601f191660200190565b5f82601f83011261422e575f5ffd5b813561424161423c826141f9565b6141b8565b818152846020838601011115614255575f5ffd5b816020850160208301375f918101602001919091529392505050565b5f60208284031215614281575f5ffd5b81356001600160401b03811115614296575f5ffd5b8201606081850312156142a7575f5ffd5b6142af61412a565b81356142ba816141e8565b81526020828101359082015260408201356001600160401b038111156142de575f5ffd5b6142ea8682850161421f565b604083015250949350505050565b5f81518084528060208401602086015e5f602082860101526020601f19601f83011685010191505092915050565b602081525f6112aa60208301846142f8565b5f60408284031215614348575f5ffd5b614350614152565b823581526020928301359281019290925250919050565b5f82601f830112614376575f5ffd5b61438060406141b8565b806040840185811115614391575f5ffd5b845b818110156143ab578035845260209384019301614393565b509095945050505050565b5f6001600160401b038211156143ce576143ce614116565b5060051b60200190565b5f82601f8301126143e7575f5ffd5b81356143f561423c826143b6565b8082825260208201915060208360051b860101925085831115614416575f5ffd5b602085015b838110156145795780356001600160401b03811115614438575f5ffd5b86016060818903601f1901121561444d575f5ffd5b61445561412a565b6020820135614463816141e8565b815260408201356001600160401b0381111561447d575f5ffd5b61448c8a60208386010161421f565b60208301525060608201356001600160401b038111156144aa575f5ffd5b6020818401019250506060828a0312156144c2575f5ffd5b6144ca614152565b6144d48a84614338565b815260408301356001600160401b038111156144ee575f5ffd5b80840193505089601f840112614502575f5ffd5b823561451061423c826143b6565b8082825260208201915060208360051b87010192508c831115614531575f5ffd5b6020860195505b82861015614553578535825260209586019590910190614538565b80602085015250505080604083015250808552505060208301925060208101905061441b565b5095945050505050565b5f60208284031215614593575f5ffd5b81356001600160401b038111156145a8575f5ffd5b82018084036101208112156145bb575f5ffd5b6145c3614174565b82356145ce816141e8565b8152602083810135908201526145e78660408501614338565b60408201526080607f19830112156145fd575f5ffd5b614605614152565b91506146148660808501614367565b82526146238660c08501614367565b602083015281606082015261010083013591506001600160401b03821115614649575f5ffd5b614655868385016143d8565b608082015295945050505050565b6001600160a01b03811681146112f5575f5ffd5b8035610e0081614663565b5f60408284031215614692575f5ffd5b61469a614152565b905081356146a781614663565b815260208201356146b7816141e8565b602082015292915050565b5f602082840312156146d2575f5ffd5b81356001600160401b038111156146e7575f5ffd5b8201608081850312156146f8575f5ffd5b61470061412a565b813561470b81614663565b815261471a8560208401614682565b602082015260608201356001600160401b038111156142de575f5ffd5b5f60208284031215614747575f5ffd5b5035919050565b634e487b7160e01b5f52602160045260245ffd5b600481106147725761477261474e565b9052565b602081016112de8284614762565b5f5f60408385031215614795575f5ffd5b8235915060208301356001600160401b038111156147b1575f5ffd5b6147bd8582860161421f565b9150509250929050565b61ffff811681146112f5575f5ffd5b5f602082840312156147e6575f5ffd5b81356112aa816147c7565b80151581146112f5575f5ffd5b5f5f6060838503121561480f575f5ffd5b6148198484614682565b91506040830135614829816147f1565b809150509250929050565b600381106147725761477261474e565b5f8151600281106148575761485761474e565b80845250602082015160406020850152613ed560408501826142f8565b80516001600160a01b031682526020808201516001600160601b0316908301526040808201515f916148b0908501826001600160a01b03169052565b5060608201516148c36060850182614834565b5060808201516148de60808501826001600160a01b03169052565b5060a082015160e060a08501526148f860e0850182614844565b905060c083015184820360c086015261491182826142f8565b95945050505050565b602081526149346020820183516001600160a01b03169052565b5f602083015161494f60408401826001600160601b03169052565b5060408301516001600160a01b03811660608401525060608301516001600160601b03811660808401525060808301516001600160a01b03811660a08401525060a083015163ffffffff811660c08401525060c083015161ffff811660e08401525060e08301516149c4610100840182614762565b506101008301518015156101208401525061012083015163ffffffff8116610140840152506101408301516101c0610160840152614a066101e0840182614874565b9050610160840151601f1984830301610180850152614a2582826142f8565b915050610180840151601f19848303016101a0850152614a4582826142f8565b9150506101a0840151601f19848303016101c085015261491182826142f8565b5f60208284031215614a75575f5ffd5b81356112aa81614663565b5f60408284031215614a90575f5ffd5b6112aa8383614682565b602081525f6112aa6020830184614874565b5f5f5f60608486031215614abe575f5ffd5b8335614ac981614663565b92506020840135614ad9816147c7565b91506040840135614ae981614663565b809150509250925092565b5f5f5f60608486031215614b06575f5ffd5b8335925060208401356001600160401b03811115614b22575f5ffd5b614b2e8682870161421f565b92505060408401356001600160401b03811115614b49575f5ffd5b614b558682870161421f565b9150509250925092565b6001600160601b03811681146112f5575f5ffd5b8035610e0081614b5f565b803560038110610e00575f5ffd5b5f60408284031215614b9c575f5ffd5b614ba4614152565b9050813560028110614bb4575f5ffd5b815260208201356001600160401b03811115614bce575f5ffd5b614bda8482850161421f565b60208301525092915050565b5f5f60608385031215614bf7575f5ffd5b614c018484614682565b915060408301356001600160401b03811115614c1b575f5ffd5b830160e08186031215614c2c575f5ffd5b614c34614196565b614c3d82614677565b8152614c4b60208301614b73565b6020820152614c5c60408301614677565b6040820152614c6d60608301614b7e565b6060820152614c7e60808301614677565b608082015260a08201356001600160401b03811115614c9b575f5ffd5b614ca787828501614b8c565b60a08301525060c08201356001600160401b03811115614cc5575f5ffd5b614cd18782850161421f565b60c08301525080925050509250929050565b63ffffffff8151168252602081015160208301525f604082015160606040850152613ed560608501826142f8565b602081525f6112aa6020830184614ce3565b805f5b6002811015612359578151845260209384019390910190600101614d26565b5f610120830163ffffffff8351168452602083015160208501526040830151614d7b604086018280518252602090810151910152565b506060830151614d8f608086018251614d23565b60200151614da060c0860182614d23565b506080830151610120610100860152818151808452610140870191506101408160051b88010193506020830192505f5b81811015614e895761013f19888603018352835163ffffffff8151168652602081015160606020880152614e0760608801826142f8565b905060408201519150868103604088015260608101614e3182845180518252602090810151910152565b6020928301516060604084015280518083529301925f92608001905b80841015614e705784518252602082019150602085019450600184019350614e4d565b5097505050602094850194939093019250600101614dd0565b50929695505050505050565b602081525f6112aa6020830184614d45565b600181811c90821680614ebb57607f821691505b602082108103614ed957634e487b7160e01b5f52602260045260245ffd5b50919050565b80516001600160a01b0316825260209081015163ffffffff16910152565b604081016112de8284614edf565b5f60208284031215614f1b575f5ffd5b81516112aa816141e8565b634e487b7160e01b5f52601160045260245ffd5b63ffffffff81811683821601908111156112de576112de614f26565b808201808211156112de576112de614f26565b80516001600160a01b031682526020808201515f91614f8a90850182614edf565b50604082015160806060850152613ed560808501826142f8565b6001600160a01b03831681526040602082018190525f90613ed590830184614f69565b602081525f6112aa6020830184614f69565b5f60208284031215614fe9575f5ffd5b81516112aa81614b5f565b84815260018060a01b0384166020820152826040820152608060608201525f6150206080830184614f69565b9695505050505050565b601f82111561153e57805f5260205f20601f840160051c8101602085101561504f5750805b601f840160051c820191505b8181101561506e575f815560010161505b565b5050505050565b81516001600160401b0381111561508e5761508e614116565b6150a28161509c8454614ea7565b8461502a565b6020601f8211600181146150d4575f83156150bd5750848201515b5f19600385901b1c1916600184901b17845561506e565b5f84815260208120601f198516915b8281101561510357878501518255602094850194600190920191016150e3565b508482101561512057868401515f19600387901b60f8161c191681555b50505050600190811b01905550565b63ffffffff8716815263ffffffff8616602082015260018060a01b03851660408201526001600160601b038416606082015282608082015260c060a08201525f61517c60c08301846142f8565b98975050505050505050565b828152604060208201525f613ed560408301846142f8565b604081016151ae8285614762565b6112aa6020830184614762565b60018060a01b0385168152836020820152608060408201525f6151e160808301856142f8565b8281036060840152613fa981856142f8565b80820281158282048414176112de576112de614f26565b5f8261522457634e487b7160e01b5f52601260045260245ffd5b500490565b6001600160601b0382811682821603908111156112de576112de614f26565b5f815461525481614ea7565b80855260018216801561526e576001811461528a576152be565b60ff1983166020870152602082151560051b87010193506152be565b845f5260205f205f5b838110156152b55781546020828a010152600182019150602081019050615293565b87016020019450505b50505092915050565b63ffffffff84168152606060208201525f6152e56060830185615248565b82810360408401526150208185615248565b80516020808301519190811015614ed9575f1960209190910360031b1b16919050565b6001600160601b0381811683821601908111156112de576112de614f26565b5f60208284031215615349575f5ffd5b81516112aa81614663565b6020808252602b908201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960408201526a6e697469616c697a696e6760a81b606082015260800190565b5f604082840312156153af575f5ffd5b6153b7614152565b825181526020928301519281019290925250919050565b5f82601f8301126153dd575f5ffd5b6153e760406141b8565b8060408401858111156153f8575f5ffd5b845b818110156143ab5780518452602093840193016153fa565b5f82601f830112615421575f5ffd5b815161542f61423c826141f9565b818152846020838601011115615443575f5ffd5b8160208501602083015e5f918101602001919091529392505050565b5f82601f83011261546e575f5ffd5b815161547c61423c826143b6565b8082825260208201915060208360051b86010192508583111561549d575f5ffd5b602085015b838110156145795780518352602092830192016154a2565b5f82601f8301126154c9575f5ffd5b81516154d761423c826143b6565b8082825260208201915060208360051b8601019250858311156154f8575f5ffd5b602085015b838110156145795780516001600160401b0381111561551a575f5ffd5b86016060818903601f1901121561552f575f5ffd5b61553761412a565b6020820151615545816141e8565b815260408201516001600160401b0381111561555f575f5ffd5b61556e8a602083860101615412565b60208301525060608201516001600160401b0381111561558c575f5ffd5b6020818401019250506060828a0312156155a4575f5ffd5b6155ac614152565b6155b68a8461539f565b815260408301516001600160401b038111156155d0575f5ffd5b6155dc8b82860161545f565b6020830152508060408301525080855250506020830192506020810190506154fd565b5f6020828403121561560f575f5ffd5b81516001600160401b03811115615624575f5ffd5b8201808403610120811215615637575f5ffd5b61563f614174565b825161564a816141e8565b815260208381015190820152615663866040850161539f565b60408201526080607f1983011215615679575f5ffd5b615681614152565b915061569086608085016153ce565b825261569f8660c085016153ce565b602083015281606082015261010083015191506001600160401b038211156156c5575f5ffd5b614655868385016154ba565b6156db8184614edf565b606060408201525f613ed56060830184614d45565b5f60208284031215615700575f5ffd5b81516001600160401b03811115615715575f5ffd5b613ed58482850161545f565b5f60208284031215615731575f5ffd5b81516001600160401b03811115615746575f5ffd5b820160608185031215615757575f5ffd5b61575f61412a565b815161576a816141e8565b81526020828101519082015260408201516001600160401b0381111561578e575f5ffd5b6142ea86828501615412565b6157a48184614edf565b606060408201525f613ed56060830184614ce3565b5f82601f8301126157c8575f5ffd5b81516157d661423c826143b6565b8082825260208201915060208360051b8601019250858311156157f7575f5ffd5b602085015b8381101561457957805161580f81614663565b8352602092830192016157fc565b5f5f6040838503121561582e575f5ffd5b82516001600160401b03811115615843575f5ffd5b61584f8582860161545f565b92505060208301516001600160401b0381111561586a575f5ffd5b6147bd858286016157b9565b5f60208284031215615886575f5ffd5b81516112aa816147c7565b634e487b7160e01b5f52603260045260245ffd5b5f8151808452602084019350602083015f5b828110156158d957815161ffff168652602095860195909101906001016158b7565b5093949350505050565b6158ed8185614edf565b608060408201525f6159026080830185614d45565b828103606084015261502081856158a5565b5f60208284031215615924575f5ffd5b81516112aa816147f1565b6159398185614edf565b608060408201525f6159026080830185614ce3565b5f5f6040838503121561595f575f5ffd5b825161596a816147f1565b60208401519092506001600160401b0381111561586a575f5ffd5b5f82518060208501845e5f92019182525091905056fea264697066735822122087a33e96bb18d315da5eb2d201267bafd53f2ecbea51efb506024fee8eb59c7f64736f6c634300081b0033",
}
⋮----
// 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, _version string) (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)
⋮----
// Version is a free data retrieval call binding the contract method 0x54fd4d50.
⋮----
// Solidity: function version() view returns(string)
func (_TaskMailbox *TaskMailboxCaller) Version(opts *bind.CallOpts) (string, 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
  },
  "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
  },
  "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
    },
    "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
  },
  "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/holesky.json
````json
{
    "config": {
        "environment": {
            "chainid": 17000,
            "lastUpdated": "v0.4.2-mainnet-pepe",
            "name": "testnet-holesky"
        },
        "params": {
            "ethPOS": "0x4242424242424242424242424242424242424242",
            "EIGENPOD_GENESIS_TIME": 1695902400,
            "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,
            "GLOBAL_OPERATOR_COMMISSION_BIPS": 1000
        }
    },
    "deployment": {
        "admin": {
            "communityMultisig": "0xCb8d2f9e55Bc7B1FA9d089f9aC80C583D2BDD5F7",
            "executorMultisig": "0x28Ade60640fdBDb2609D8d8734D1b5cBeFc0C348",
            "operationsMultisig": "0xfaEF7338b7490b9E272d80A1a39f4657cAf2b97d",
            "pauserMultisig": "0x53410249ec7d3a3F9F1ba3912D50D6A3Df6d10A7",
            "pauserRegistry": "0x85Ef7299F8311B25642679edBF02B62FA2212F06",
            "proxyAdmin": "0xDB023566064246399b4AE851197a97729C93A6cf",
            "timelock": "0xcF19CE0561052a7A7Ff21156730285997B350A7D"
        },
        "core": {
            "avsDirectory": {
                "proxy": "0x055733000064333CaDDbC92763c58BF0192fFeBf",
                "impl": "0xEF5BA995Bc7722fd1e163edF8Dc09375de3d3e3a",
                "pendingImpl": "0x0000000000000000000000000000000000000000"
            },
            "delegationManager": {
                "proxy": "0xA44151489861Fe9e3055d95adC98FbD462B948e7",
                "impl": "0x83f8F8f0BB125F7870F6bfCf76853f874C330D76",
                "pendingImpl": "0x0000000000000000000000000000000000000000"
            },
            "rewardsCoordinator": {
                "proxy": "0xAcc1fb458a1317E886dB376Fc8141540537E68fE",
                "impl": "0x1a17df4170099577b79038fd310f3ff62f79752e",
                "pendingImpl": "0x0000000000000000000000000000000000000000"
            },
            "slasher": {
                "proxy": "0xcAe751b75833ef09627549868A04E32679386e7C",
                "impl": "0x99715D255E34a39bE9943b82F281CA734bcF345A",
                "pendingImpl": "0x0000000000000000000000000000000000000000"
            },
            "strategyManager": {
                "proxy": "0xdfB5f6CE42aAA7830E94ECFCcAd411beF4d4D5b6",
                "impl": "0x59f766A603C53f3AC8Be43bBe158c1519b193a18",
                "pendingImpl": "0x0000000000000000000000000000000000000000"
            }
        },
        "pods": {
            "delayedWithdrawalRouter": {
                "proxy": "0x642c646053eaf2254f088e9019ACD73d9AE0FA32",
                "impl": "0xcE8b8D99773a718423F8040a6e52c06a4ce63407",
                "pendingImpl": "0x0000000000000000000000000000000000000000"
            },
            "eigenPod": {
                "beacon": "0x7261C2bd75a7ACE1762f6d7FAe8F63215581832D",
                "impl": "0x10ad7e30e3F52076C8462D573530f4461377319c",
                "pendingImpl": "0x0000000000000000000000000000000000000000"
            },
            "eigenPodManager": {
                "proxy": "0x30770d7E3e71112d7A6b7259542D1f680a70e315",
                "impl": "0x91A6525a4a843F5a5B633905300c33F79413CCc5",
                "pendingImpl": "0x0000000000000000000000000000000000000000"
            }
        },
        "strategies": {
            "strategyFactory": {
                "proxy": "0x9c01252B580efD11a05C00Aa42Dd3ac1Ec52DF6d",
                "impl": "0x5E699de7bFc4DD2A5E72EB5a2Ca99651EfdD51CB",
                "pendingImpl": "0x0000000000000000000000000000000000000000"
            },
            "strategyBeacon": {
                "beacon": "0xd3c6C6BA4E40dB9288c6a2077e5635344F8aFA4F",
                "impl": "0xb637caeedfCBf88e0d019E7AE4691b554c994A1e",
                "pendingImpl": "0x0000000000000000000000000000000000000000"
            },
            "preLongtailStrats": {
                "impl": "0xFb83e1D133D0157775eC4F19Ff81478Df1103305",
                "addrs": [
                    "0x80528D6e9A2BAbFc766965E0E26d5aB08D9CFaF9",
                    "0x3A8fBdf9e77DFc25d09741f51d3E181b25d0c4E0",
                    "0x7D704507b76571a51d9caE8AdDAbBFd0ba0e63d3",
                    "0x31B6F59e1627cEfC9fA174aD03859fC337666af7",
                    "0x70EB4D3c164a6B4A5f908D4FBb5a9cAfFb66bAB6",
                    "0x9281ff96637710Cd9A5CAcce9c6FAD8C9F54631c",
                    "0x05037A81BD7B4C9E0F7B430f1F2A22c31a2FD943",
                    "0x46281E3B7fDcACdBa44CADf069a94a588Fd4C6Ef",
                    "0xaccc5A86732BE85b5012e8614AF237801636F8e5",
                    "0x7673a47463F80c6a3553Db9E54c8cDcd5313d0ac",
                    "0xAD76D205564f955A9c18103C4422D1Cd94016899",
                    "0x78dBcbEF8fF94eC7F631c23d38d197744a323868"
                ]
            }
        },
        "token": {
            "bEIGEN": {
                "proxy": "0x275cCf9Be51f4a6C94aBa6114cdf2a4c45B9cb27",
                "impl": "0x4500927874Ad41538c1bEF2F5278E7a86DF6bce8",
                "pendingImpl": "0x0000000000000000000000000000000000000000",
                "proxyAdmin": "0x67482666771e82c9a73bb9e9a22b2b597f448bbf"
            },
            "EIGEN": {
                "proxy": "0x3B78576F7D6837500bA3De27A60c7f594934027E",
                "impl": "0x083bC9e0DCF2C3e13E24686e5202232995578c5a",
                "pendingImpl": "0x0000000000000000000000000000000000000000",
                "proxyAdmin": "0x67482666771e82c9a73bb9e9a22b2b597f448bbf"
            },
            "eigenStrategy": {
                "proxy": "0x43252609bff8a13dFe5e057097f2f45A24387a84",
                "impl": "0x94650e09a471CEF96e7966cabf26718FBf352697",
                "pendingImpl": "0x0000000000000000000000000000000000000000"
            }
        }
    }
}
````

## 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/preprod.json
````json
{
    "config": {
        "environment": {
            "chainid": 17000,
            "lastUpdated": "v0.4.2-mainnet-pepe",
            "name": "preprod-holesky"
        },
        "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": {
                "proxy": "0x141d6995556135D4997b2ff72EB443Be300353bC",
                "impl": "0x357978adC03375BD6a3605DE055fABb84695d79A",
                "pendingImpl": "0x0000000000000000000000000000000000000000"
            },
            "delegationManager": {
                "proxy": "0x75dfE5B44C2E530568001400D3f704bC8AE350CC",
                "impl": "0x56E88cb4f0136fC27D95499dE4BE2acf47946Fa1",
                "pendingImpl": "0x0000000000000000000000000000000000000000"
            },
            "rewardsCoordinator": {
                "proxy": "0xb22Ef643e1E067c994019A4C19e403253C05c2B0",
                "impl": "0x7523b42b081C30fA245AA4039c645e36746fC400",
                "pendingImpl": "0x0000000000000000000000000000000000000000"
            },
            "slasher": {
                "proxy": "0x12699471dF8dca329C76D72823B1b79d55709384",
                "impl": "0x9460fCe11E1e0365419fa860599903B4E5097cf0",
                "pendingImpl": "0x0000000000000000000000000000000000000000"
            },
            "strategyManager": {
                "proxy": "0xF9fbF2e35D8803273E214c99BF15174139f4E67a",
                "impl": "0x1a26B23a004C512350d7Dd89056655A80b850199",
                "pendingImpl": "0x0000000000000000000000000000000000000000"
            }
        },
        "pods": {
            "delayedWithdrawalRouter": {
                "proxy": "0xC4BC46a87A67a531eCF7f74338E1FA79533334Fa",
                "impl": "0x0011FA2c512063C495f77296Af8d195F33A8Dd38",
                "pendingImpl": "0x0000000000000000000000000000000000000000"
            },
            "eigenPod": {
                "beacon": "0x92Cc4a800A1513E85C481dDDf3A06C6921211eaC",
                "impl": "0x8Da4b953cbFb715624D98C0D2b4a7978462eFd38",
                "pendingImpl": "0x0000000000000000000000000000000000000000"
            },
            "eigenPodManager": {
                "proxy": "0xB8d8952f572e67B11e43bC21250967772fa883Ff",
                "impl": "0x10EBa780CCd9E5e9FFBe529C25046c076Be91048",
                "pendingImpl": "0x0000000000000000000000000000000000000000"
            }
        },
        "strategies": {
            "strategyFactory": {
                "proxy": "0xad4A89E3cA9b3dc25AABe0aa7d72E61D2Ec66052",
                "impl": "0x7a9478c0AcB819d7c235FbE2a6E13ee1D2fCD862",
                "pendingImpl": "0x0000000000000000000000000000000000000000"
            },
            "strategyBeacon": {
                "beacon": "0xf2c2AcA859C685895E60ca7A14274365b64c0c2a",
                "impl": "0xd648792F932FbabcCC80Cd376812074434412685",
                "pendingImpl": "0x0000000000000000000000000000000000000000"
            },
            "preLongtailStrats": {
                "impl": "0x62450517EfA1CE60d79801daf8f95973865e8D40",
                "addrs": [
                    "0x6e5d5060b33ca2090a78e9cb74fe207453b30e49",
                    "0xf6a09ae03d7760aecf1626ce7df0f113bec2d9bd",
                    "0x7fa77c321bf66e42eabc9b10129304f7f90c5585",
                    "0x24da526f9e465c4fb6bae41e226df8aa5b34eac7",
                    "0x6dc6ce589f852f96ac86cb160ab0b15b9f56dedd",
                    "0x3c28437e610fb099cc3d6de4d9c707dfacd308ae",
                    "0x7b6257f5caf7311b36f7416133a8499c68a83c3a",
                    "0xc86382179500e8ed3e686fc4a99ed9ec72df3f56",
                    "0x3cb1fd19cfb178c1098f2fc1e11090a0642b2314",
                    "0x87f6c7d24b109919eb38295e3f8298425e6331d9",
                    "0x5c8b55722f421556a2aafb7a3ea63d4c3e514312",
                    "0xd523267698c81a372191136e477fdebfa33d9fb4",
                    "0xdccf401fd121d8c542e96bc1d0078884422afad2"
                ]
            }
        },
        "token": {
            "bEIGEN": {
                "proxy": "0xA72942289a043874249E60469F68f08B8c6ECCe8",
                "impl": "0xd5FdabDac3d8ACeAB7BFfDDFA18877A4c5D5Aa82",
                "pendingImpl": "0x0000000000000000000000000000000000000000",
                "proxyAdmin": "0x1BEF05C7303d44e0E2FCD2A19d993eDEd4c51b5B"
            },
            "EIGEN": {
                "proxy": "0xD58f6844f79eB1fbd9f7091d05f7cb30d3363926",
                "impl": "0x95a7431400F362F3647a69535C5666cA0133CAA0",
                "pendingImpl": "0x0000000000000000000000000000000000000000",
                "proxyAdmin": "0x1BEF05C7303d44e0E2FCD2A19d993eDEd4c51b5B"
            },
            "eigenStrategy": {
                "proxy": "0xdcCF401fD121d8C542E96BC1d0078884422aFAD2",
                "impl": "0x59D13E7Fb0bC0e57c1fc6594ff701592A6e4dD2B",
                "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/permissions/PermissionController.sol";
import "../../../src/contracts/strategies/StrategyBaseTVLLimits.sol";
import "../../../src/contracts/strategies/StrategyFactory.sol";
import "../../../src/contracts/strategies/StrategyBase.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.
⋮----
// Deploy strategyFactory & base
// Create base strategy implementation
⋮----
// Create a proxy beacon for base strategy implementation
⋮----
// Strategy Factory, upgrade and initialized
⋮----
0, // initial paused status
⋮----
// 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/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
⋮----
// Third, upgrade the proxy contracts to use the correct implementation contracts and initialize them.
⋮----
// 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(string memory network, uint256 xCoord, uint256 yCoord) public {
// 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(string memory a, string memory b) internal pure returns (bool) {
⋮----
/// @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(string memory network, string memory salt) public {
/**
         *
         *                     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(Operator memory operator, string memory network) internal {
⋮----
// 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(string memory a, string memory b) internal pure returns (bool) {
⋮----
/// @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/update-generator/1-updateGenerator.s.sol
````
// SPDX-License-Identifier: BUSL-1.1
⋮----
import "../../releases/Env.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.7.0-v1.8.0-multichain-hourglass-combined/configs/mainnet.toml
````toml
globalRootConfirmationThreshold = 10000

[generator]
avs = "0xbe1685c81aa44ff9fb319dd389addd9374383e90"
id = 0

[generatorInfo]
numOperators = 1
operatorInfoTreeRoot = "0xe2c9149bfefbe015c58bf88873e52d93d34e2df8004535dcefbfca6c843779cd"
totalWeights = [1]

[generatorInfo.aggregatePubkey]
X = "8280017164165799357918870140210684221488553883939915125708733499123157732584"
Y = "14097679998808871693719250285544207136113257358514904577646642777851609871621"
````

## File: script/releases/v1.7.0-v1.8.0-multichain-hourglass-combined/configs/preprod.toml
````toml
globalRootConfirmationThreshold = 10000

[generator]
avs = "0x6d609cd2812bda02a75dcaba7daafe4b20ff5608"
id = 0

[generatorInfo]
numOperators = 1
operatorInfoTreeRoot = "0x182ad7ebe0285e35fa1399b25265a3a7cf00bfbbee655c49c6e4a92eca8dc238"
totalWeights = [1]

[generatorInfo.aggregatePubkey]
X = "2042332002447099671531219542053413553870364054171581230613284707326971991329"
Y = "4639211015708589911886198513998028007753137288206720998730367358833045516171"
````

## File: script/releases/v1.7.0-v1.8.0-multichain-hourglass-combined/configs/README.md
````markdown
# Global Confirmer Set Generation

The `globalConfirmerRootSet`, also known as 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/releases/v1.7.0-v1.8.0-multichain-hourglass-combined/configs/testnet.toml
````toml
globalRootConfirmationThreshold = 10000

[generator]
avs = "0xb094ba769b4976dc37fc689a76675f31bc4923b0"
id = 0

[generatorInfo]
numOperators = 1
operatorInfoTreeRoot = "0x182ad7ebe0285e35fa1399b25265a3a7cf00bfbbee655c49c6e4a92eca8dc238"
totalWeights = [1]

[generatorInfo.aggregatePubkey]
X = "2042332002447099671531219542053413553870364054171581230613284707326971991329"
Y = "4639211015708589911886198513998028007753137288206720998730367358833045516171"
````

## File: script/releases/v1.7.0-v1.8.0-multichain-hourglass-combined/1-deploySourceChain.s.sol
````
// SPDX-License-Identifier: BUSL-1.1
⋮----
import {EOADeployer} from "zeus-templates/templates/EOADeployer.sol";
import "../Env.sol";
⋮----
/**
 * Purpose: use an EOA to deploy all of the new source chain contracts for this upgrade.
 */
contract DeploySourceChain is EOADeployer {
⋮----
/// forgefmt: disable-next-item
function _runAsEOA() internal override {
// If we're not on a source chain or we're on a version that already has these contracts deployed, we don't need to deploy any contracts
⋮----
// Deploy KeyRegistrar implementation
⋮----
// Deploy KeyRegistrar proxy
⋮----
_data: "" // No initialization needed for KeyRegistrar
⋮----
// Deploy CrossChainRegistry implementation
⋮----
// Deploy CrossChainRegistry proxy
⋮----
Env.opsMultisig(), // initialOwner
⋮----
// Deploy ReleaseManager implementation
⋮----
// Deploy ReleaseManager proxy
⋮----
_data: "" // No initialize function for ReleaseManager
⋮----
function testScript() public virtual {
⋮----
// Set the mode to EOA so we can deploy the contracts
⋮----
/// @dev Validate that storage variables are set correctly
function _validateStorage() internal view {
// Validate KeyRegistrar
⋮----
// Validate CrossChainRegistry
⋮----
// Validate ReleaseManager
⋮----
/// @dev Ensure each deployed TUP/beacon is owned by the proxyAdmin/executorMultisig
function _validateProxyAdmins() internal view {
⋮----
/// @dev Validate the immutables set in the new implementation constructors
function _validateImplConstructors() internal view {
⋮----
/// KeyRegistrar
⋮----
/// CrossChainRegistry
⋮----
/// ReleaseManager
⋮----
/// @dev Call initialize on all deployed implementations to ensure initializers are disabled
function _validateImplsInitialized() internal {
⋮----
function _validateProxyConstructors() internal view {
⋮----
function _validateProxiesInitialized() internal {
⋮----
// ReleaseManager and KeyRegistrar don't have initialize functions
⋮----
function _assertTrue(bool b, string memory err) private pure {
⋮----
function _assertFalse(bool b, string memory err) private pure {
⋮----
/// @dev Check if the version is already deployed
function _isAlreadyDeployedSourceChain() internal view returns (bool) {
````

## File: script/releases/v1.7.0-v1.8.0-multichain-hourglass-combined/2-deployDestinationChainProxies.s.sol
````
// SPDX-License-Identifier: BUSL-1.1
⋮----
import "@openzeppelin/contracts/proxy/transparent/TransparentUpgradeableProxy.sol";
import {MultisigBuilder} from "zeus-templates/templates/MultisigBuilder.sol";
import {CrosschainDeployLib} from "script/releases/CrosschainDeployLib.sol";
import "../Env.sol";
⋮----
/**
 * Purpose: Deploy proxy contracts for the destination chain using a multisig. Deploys the following contracts:
 * - Empty contract
 * Multichain:
 * - OperatorTableUpdater
 * - ECDSACertificateVerifier
 * - BN254CertificateVerifier
 * Hourglass:
 * - TaskMailbox
 */
contract DeployDestinationChainProxies is MultisigBuilder {
⋮----
/// forgefmt: disable-next-item
function _runAsMultisig() internal virtual override {
// If we're not on a destination chain or we're on a version that already has these contracts deployed, we don't need to deploy any contracts
⋮----
// We don't use the prank modifier here, since we have to write to the env
⋮----
// 1. Deploy empty contract
⋮----
// 2. Deploy the proxies pointing to an empty contract
⋮----
// OperatorTableUpdater
⋮----
// ECDSACertificateVerifier
⋮----
// BN254CertificateVerifier
⋮----
// TaskMailbox
⋮----
// Stop pranking
⋮----
// Save all the contracts to the env
⋮----
function testScript() public virtual {
⋮----
/// @dev Validate that proxies are owned by the multichain deployer multisig (temporarily)
function _validateProxyAdminIsMultisig() internal view {
⋮----
/// @dev Validate that the expected proxy address is deployed
function _validateExpectedProxyAddress() internal view {
⋮----
/// @dev We have to use the slot directly since _getProxyAdmin expects the caller to be the actual proxy admin
function _getProxyAdminBySlot(
⋮----
/// @dev Check if the proxies are deployed by checking if the empty contract is deployed
function _areProxiesDeployed() internal view returns (bool) {
⋮----
// If the empty contract is deployed, then the proxies are deployed
⋮----
/// @dev Add the contracts to the env
function _addContractsToEnv() internal {
⋮----
/// @dev Compute the expected proxy address for a given name and empty contract
function _computeExpectedProxyAddress(string memory name, address emptyContract) internal view returns (address) {
⋮----
/// @dev Check if the version is already deployed
function _isAlreadyDeployed() internal view returns (bool) {
````

## File: script/releases/v1.7.0-v1.8.0-multichain-hourglass-combined/3-deployDestinationChainImpls.s.sol
````
// SPDX-License-Identifier: BUSL-1.1
⋮----
import {EOADeployer} from "zeus-templates/templates/EOADeployer.sol";
import {DeployDestinationChainProxies} from "./2-deployDestinationChainProxies.s.sol";
import {CrosschainDeployLib} from "script/releases/CrosschainDeployLib.sol";
import "src/contracts/interfaces/IOperatorTableCalculator.sol";
import "../Env.sol";
⋮----
/**
 * Purpose: Deploy implementation contracts for the destination chain using an EOA.
 * Multichain:
 * - OperatorTableUpdater
 * - ECDSACertificateVerifier
 * - BN254CertificateVerifier
 * Hourglass:
 * - TaskMailbox
 */
contract DeployDestinationChainImpls is EOADeployer, DeployDestinationChainProxies {
⋮----
function _runAsEOA() internal override {
// If we're not on a destination chain or we're on a version that already has these contracts deployed, we don't need to deploy any contracts
⋮----
// Deploy the implementations
⋮----
// OperatorTableUpdater
⋮----
// ECDSACertificateVerifier
⋮----
// BN254CertificateVerifier
⋮----
// TaskMailbox
⋮----
function testScript() public virtual override {
⋮----
// 1. Deploy destination chain proxies
// Only deploy the proxies if they haven't been deployed yet
/// @dev This is needed in the production environment tests since this step would fail if the proxies are already deployed
⋮----
_unsafeResetHasPranked(); // reset hasPranked so we can use it in the execute()
⋮----
// Since the proxies are already deployed, we need to update the env with the proper addresses
⋮----
// 2. Deploy destination chain impls
⋮----
// Validate the destination chain
⋮----
/// @dev Validate the immutables set in the new implementation constructors
function _validateImplConstructors() internal view {
⋮----
/// OperatorTableUpdater
⋮----
/// ECDSACertificateVerifier
⋮----
/// BN254CertificateVerifier
⋮----
/// TaskMailbox
⋮----
/// @dev Call initialize on all deployed implementations to ensure initializers are disabled
function _validateImplsInitialized() internal {
⋮----
/// OperatorTableUpdater - dummy parameters
⋮----
address(0), // owner
0, // initial paused status
dummyOperatorSet, // generator
0, // globalRootConfirmationThreshold
dummyBN254Info // generatorInfo
⋮----
0, // feeSplit
address(0) // feeSplitCollector
⋮----
// ECDSACertificateVerifier and BN254CertificateVerifier don't have initialize functions
⋮----
function _validateVersion() internal view {
````

## File: script/releases/v1.7.0-v1.8.0-multichain-hourglass-combined/4-instantiateDestinationChainProxies.s.sol
````
// SPDX-License-Identifier: BUSL-1.1
⋮----
import {MultisigBuilder} from "zeus-templates/templates/MultisigBuilder.sol";
import {DeployDestinationChainProxies} from "./2-deployDestinationChainProxies.s.sol";
import {DeployDestinationChainImpls} from "./3-deployDestinationChainImpls.s.sol";
import {CrosschainDeployLib} from "script/releases/CrosschainDeployLib.sol";
import "../Env.sol";
⋮----
import "src/contracts/interfaces/ICrossChainRegistry.sol";
import "src/contracts/interfaces/IOperatorTableCalculator.sol";
import "src/contracts/libraries/OperatorSetLib.sol";
import "src/contracts/libraries/BN254.sol";
⋮----
// For TOML parsing
import {stdToml} from "forge-std/StdToml.sol";
⋮----
/**
 * Purpose: Upgrade proxies to point to implementations and transfer control to ProxyAdmin.
 */
contract InstantiateDestinationChainProxies is DeployDestinationChainImpls {
⋮----
/// forgefmt: disable-next-item
function _runAsMultisig() internal override prank(Env.multichainDeployerMultisig()) {
// If we're not on a destination chain or we're on a version that already has these contracts deployed, we don't need to do anything
⋮----
// Upgrade the proxies to point to the actual implementations
// ECDSACertificateVerifier
⋮----
// BN254CertificateVerifier
⋮----
// OperatorTableUpdater - we also initialize this contract
⋮----
0, // initial paused status
⋮----
// TaskMailbox - we also initialize this contract
⋮----
// Transfer proxy admin ownership
⋮----
function testScript() public virtual override {
⋮----
// 1. Deploy the destination chain contracts
// If proxies are not deployed, deploy them
⋮----
_unsafeResetHasPranked(); // reset hasPranked so we can use it in the execute()
⋮----
// Since the proxies are already deployed, we need to update the env with the proper addresses
⋮----
// 2. Deploy the destination chain impls
_mode = OperationalMode.EOA; // Set to EOA mode so we can deploy the impls in the EOA script
⋮----
// 3. Instantiate the destination chain proxies
⋮----
// 4. Validate the destination chain
⋮----
/// @dev Validate that storage variables are set correctly
function _validateStorage() internal view {
// Validate OperatorTableUpdater
⋮----
// Checks on the generator
⋮----
_getGeneratorAddress(), // The generator is set to the ops multisig of the *source* chain, hence we cannot use Env.opsMultisig().
⋮----
0, // The generator is set to 0 on initialization
⋮----
// latestReferenceTimestamp is set to block.timestamp during initialization
⋮----
// Check the global root confirmation threshold is 10000
⋮----
// Validate ECDSACertificateVerifier
⋮----
// Validate BN254CertificateVerifier
⋮----
// Check the generator info
⋮----
address(Env.proxy.operatorTableUpdater()), // OperatorTableUpdater is the owner of the generator
⋮----
// Validate TaskMailbox
⋮----
/// @dev Ensure each deployed TUP/beacon is owned by the proxyAdmin/executorMultisig
function _validateProxyAdmins() internal view {
⋮----
function _validateProxyConstructors() internal view {
/// OperatorTableUpdater
⋮----
/// ECDSACertificateVerifier
⋮----
/// BN254CertificateVerifier
⋮----
/// TaskMailbox
⋮----
function _validateProxiesInitialized() internal {
⋮----
/// OperatorTableUpdater - dummy parameters
⋮----
address(0), // owner
⋮----
dummyOperatorSet, // generator
0, // globalRootConfirmationThreshold
dummyBN254Info // generatorInfo
⋮----
0, // feeSplit
address(0) // feeSplitCollector
⋮----
// ECDSACertificateVerifier and BN254CertificateVerifier don't have initialize functions
⋮----
function _assertTrue(bool b, string memory err) private pure {
⋮----
function _assertFalse(bool b, string memory err) private pure {
⋮----
// In order to not clutter the Zeus Env, we define our operator table updater init params here
function _getTableUpdaterInitParams() internal view returns (OperatorTableUpdaterInitParams memory) {
⋮----
// NOTE: For testnet-holesky and testnet-hoodi, the operator table updater is not used
⋮----
function _getGeneratorAddress() internal view returns (address generatorAddress) {
⋮----
function _parseToml(
⋮----
// Read the TOML file
⋮----
// Parse globalRootConfirmationThreshold
⋮----
// Parse generator
⋮----
// Parse generatorInfo
⋮----
// Define TaskMailbox initialization parameters
function _getTaskMailboxInitParams() internal view returns (TaskMailboxInitParams memory) {
⋮----
initParams.feeSplit = 0; // 0% fee split initially
initParams.feeSplitCollector = Env.opsMultisig(); // Initially set to opsMultisig
````

## File: script/releases/v1.7.0-v1.8.0-multichain-hourglass-combined/5-configureCrossChainRegistry.s.sol
````
// SPDX-License-Identifier: BUSL-1.1
⋮----
import {DeploySourceChain} from "./1-deploySourceChain.s.sol";
import {CrosschainDeployLib} from "script/releases/CrosschainDeployLib.sol";
import {DeployDestinationChainProxies} from "./2-deployDestinationChainProxies.s.sol";
import "../Env.sol";
⋮----
/**
 * Purpose: Call the cross chain registry to configure chainIDs
 */
contract ConfigureCrossChainRegistry is DeploySourceChain, DeployDestinationChainProxies {
⋮----
function _runAsMultisig() internal override prank(Env.opsMultisig()) {
// If we're not on a source chain or we're on a version that already has these contracts deployed, we don't need to run this
⋮----
// Update the call to the cross chain registry based on the environment
⋮----
function testScript() public virtual override(DeploySourceChain, DeployDestinationChainProxies) {
⋮----
// Deploy source chain
_mode = OperationalMode.EOA; // Set to EOA mode so we can deploy the impls in the EOA script
⋮----
// Deploy destination chain
⋮----
_unsafeResetHasPranked(); // reset hasPranked so we can use it in the execute()
⋮----
// Since the proxies are already deployed, we need to update the env with the proper addresses
⋮----
// Configure the registry
⋮----
// Validate the registry
⋮----
function _validateRegistry() internal view {
⋮----
// Preprod should have 1 chain: current chain
⋮----
// Testnet should have 2 chains: sepolia and base-sepolia
⋮----
// Check both chains are present (order may vary)
⋮----
// Mainnet should have 2 chains: mainnet and base
⋮----
/// @dev On preprod, the source and destination chains are the same
function _callPreprod(
⋮----
function _callTestnet(
⋮----
chainIDs[0] = block.chainid; // sepolia
⋮----
chainIDs[1] = 84_532; // base-sepolia
⋮----
function _callMainnet(
⋮----
chainIDs[0] = block.chainid; // mainnet
⋮----
chainIDs[1] = 8453; // base
````

## File: script/releases/v1.7.0-v1.8.0-multichain-hourglass-combined/upgrade.json
````json
{
    "name": "multichain-v1.7.0",
    "from": ">=1.6.0 <1.7.0",
    "to": "1.8.1",
    "phases": [
        {
            "type": "eoa",
            "filename": "1-deploySourceChain.s.sol"
        },
        {
            "type": "multisig",
            "filename": "2-deployDestinationChainProxies.s.sol"
        },
        {
            "type": "eoa",
            "filename": "3-deployDestinationChainImpls.s.sol"
        },
        {
            "type": "multisig",
            "filename": "4-instantiateDestinationChainProxies.s.sol"
        },
        {
            "type": "multisig",
            "filename": "5-configureCrossChainRegistry.s.sol"
        }
    ]
}
````

## File: script/releases/v1.8.1-hourglass-testnet-replay-fix/1-deployTaskMailboxImpl.s.sol
````
// SPDX-License-Identifier: BUSL-1.1
⋮----
import {EOADeployer} from "zeus-templates/templates/EOADeployer.sol";
import "../Env.sol";
⋮----
/**
 * @title DeployTaskMailboxImpl
 * @notice Deploy new TaskMailbox implementation with task replay fix for destination chains.
 *         This fixes a vulnerability where certificates could be replayed across different tasks
 *         directed at the same operator set by including the taskHash in the messageHash.
 */
contract DeployTaskMailboxImpl is EOADeployer {
⋮----
/// forgefmt: disable-next-item
function _runAsEOA() internal override {
// If we're not on a destination chain and not on version 1.8.0, we don't need to deploy any contracts
⋮----
// Deploy TaskMailbox implementation with the replay fix
⋮----
function testScript() public virtual {
⋮----
// Deploy the new TaskMailbox implementation
⋮----
/// @dev Validate that the new TaskMailbox impl address is distinct from the current one
function _validateNewImplAddress() internal view {
⋮----
/// @dev Validate that the TaskMailbox proxy is still owned by the correct ProxyAdmin
function _validateProxyAdmin() internal view {
⋮----
/// @dev Validate the immutables set in the new TaskMailbox implementation constructor
function _validateImplConstructor() internal view {
⋮----
// Validate version
⋮----
// Validate certificate verifiers
⋮----
// Validate MAX_TASK_SLA
⋮----
/// @dev Validate that the new implementation cannot be initialized (should revert)
function _validateImplInitialized() internal {
⋮----
address(0), // owner
0, // feeSplit
address(0) // feeSplitCollector
⋮----
/// @dev Validate the version is correctly set
function _validateVersion() internal view {
````

## File: script/releases/v1.8.1-hourglass-testnet-replay-fix/2-queueTaskMailboxUpgrade.s.sol
````
// SPDX-License-Identifier: BUSL-1.1
⋮----
import {DeployTaskMailboxImpl} from "./1-deployTaskMailboxImpl.s.sol";
import "../Env.sol";
⋮----
import {MultisigBuilder} from "zeus-templates/templates/MultisigBuilder.sol";
import {MultisigCall, Encode} from "zeus-templates/utils/Encode.sol";
⋮----
import {TimelockController} from "@openzeppelin/contracts/governance/TimelockController.sol";
⋮----
/**
 * @title QueueTaskMailboxUpgrade
 * @notice Queue the TaskMailbox upgrade transaction in the Timelock via the Operations Multisig.
 *         This queues the upgrade to fix the task replay vulnerability.
 */
contract QueueTaskMailboxUpgrade is MultisigBuilder, DeployTaskMailboxImpl {
⋮----
function _runAsMultisig() internal virtual override prank(Env.opsMultisig()) {
⋮----
/// @dev Get the calldata to be sent from the timelock to the executor
function _getCalldataToExecutor() internal returns (bytes memory) {
/// forgefmt: disable-next-item
⋮----
function testScript() public virtual override {
⋮----
// Deploy the new TaskMailbox implementation first
⋮----
// Check that the upgrade does not exist in the timelock
⋮----
// Queue the upgrade
⋮----
// Check that the upgrade has been added to the timelock
⋮----
// Validate that the TaskMailbox proxy still points to the old implementation
````

## File: script/releases/v1.8.1-hourglass-testnet-replay-fix/3-executeTaskMailboxUpgrade.s.sol
````
// SPDX-License-Identifier: BUSL-1.1
⋮----
import "../Env.sol";
import {QueueTaskMailboxUpgrade} from "./2-queueTaskMailboxUpgrade.s.sol";
import {Encode} from "zeus-templates/utils/Encode.sol";
⋮----
/**
 * @title ExecuteTaskMailboxUpgrade
 * @notice Execute the queued TaskMailbox upgrade after the timelock delay.
 *         This completes the upgrade to fix the task replay vulnerability where certificates
 *         could be replayed across different tasks directed at the same operator set.
 */
contract ExecuteTaskMailboxUpgrade is QueueTaskMailboxUpgrade {
⋮----
function _runAsMultisig() internal override prank(Env.protocolCouncilMultisig()) {
⋮----
function testScript() public virtual override {
⋮----
// 1 - Deploy. The new TaskMailbox implementation has been deployed
⋮----
// 2 - Queue. Check that the operation IS ready
⋮----
_unsafeResetHasPranked(); // reset hasPranked so we can use it again
⋮----
// 3 - Warp past the timelock delay
⋮----
// 4 - Execute the upgrade
⋮----
// 5 - Validate the upgrade was successful
⋮----
/// @dev Validate that the TaskMailbox proxy now points to the new implementation
function _validateUpgradeComplete() internal view {
⋮----
/// @dev Validate the proxy's constructor values through the proxy
function _validateProxyConstructor() internal view {
⋮----
// Validate version
⋮----
// Validate certificate verifiers
⋮----
// Validate MAX_TASK_SLA
⋮----
/// @dev Validate that the proxy cannot be re-initialized
function _validateProxyInitialized() internal {
⋮----
address(0), // owner
0, // feeSplit
address(0) // feeSplitCollector
⋮----
/// @dev Validate that the new getMessageHash function works correctly
function _validateGetMessageHash() internal view {
⋮----
// Test the new getMessageHash function with sample data
⋮----
// The new implementation should compute messageHash as keccak256(abi.encode(taskHash, result))
⋮----
// Verify that different tasks with same result produce different message hashes
````

## File: script/releases/v1.8.1-hourglass-testnet-replay-fix/upgrade.json
````json
{
    "name": "hourglass-testnet-replay-fix-v1.8.1",
    "from": "1.8.0",
    "to": "1.8.1",
    "phases": [
        {
            "type": "eoa",
            "filename": "1-deployTaskMailboxImpl.s.sol"
        },
        {
            "type": "multisig",
            "filename": "2-queueTaskMailboxUpgrade.s.sol"
        },
        {
            "type": "multisig",
            "filename": "3-executeTaskMailboxUpgrade.s.sol"
        }
    ]
}
````

## File: script/releases/CrosschainDeployLib.sol
````
// SPDX-License-Identifier: BUSL-1.1
⋮----
import "@openzeppelin/contracts/proxy/transparent/TransparentUpgradeableProxy.sol";
import "src/test/mocks/EmptyContract.sol";
⋮----
/// @dev https://github.com/pcaversaccio/createx/tree/main
⋮----
interface ICreateX {
function deployCreate2(bytes32 salt, bytes memory initCode) external payable returns (address newContract);
function computeCreate2Address(
⋮----
/// -----------------------------------------------------------------------
/// 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 = type(EmptyContract).creationCode.deployCrosschain(deployer);
     * address proxy = emptyContract.deployCrosschainProxy(deployer, 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(address deployer, bytes memory initCode, string memory name) private returns (address) {
⋮----
/// 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(address deployer, string memory name) internal pure returns (bytes32) {
⋮----
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(
⋮----
/*
     * @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/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";
⋮----
/// permissions/
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";
⋮----
/// 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 multichainDeployerMultisig() 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 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) {
⋮----
/**
     * core/
     */
function allocationManager(
⋮----
function avsDirectory(
⋮----
function delegationManager(
⋮----
function rewardsCoordinator(
⋮----
function strategyManager(
⋮----
function releaseManager(
⋮----
/**
     * permissions/
     */
function pauserRegistry(
⋮----
function permissionController(
⋮----
function keyRegistrar(
⋮----
/**
     * pods/
     */
function eigenPod(
⋮----
function eigenPodManager(
⋮----
/**
     * strategies/
     */
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(DeployedInstance, uint256 i) internal view returns (StrategyBaseTVLLimits) {
⋮----
function strategyBaseTVLLimits(
⋮----
function strategyFactory(
⋮----
/**
     * token/
     */
function eigen(
⋮----
function beigen(
⋮----
/**
     * multichain/
     */
function emptyContract(
⋮----
function crossChainRegistry(
⋮----
function operatorTableUpdater(
⋮----
function ecdsaCertificateVerifier(
⋮----
function bn254CertificateVerifier(
⋮----
function taskMailbox(
⋮----
/**
     * Helpers
     */
function _deployedInstance(string memory name, uint256 idx) private view returns (address) {
⋮----
function _deployedInstanceCount(
⋮----
function _deployedProxy(
⋮----
function _deployedBeacon(
⋮----
function _deployedImpl(
⋮----
function _envAddress(
⋮----
function _envU256(
⋮----
function _envU64(
⋮----
function _envU32(
⋮----
function _envU16(
⋮----
function _envBool(
⋮----
function _string(
⋮----
/**
     * Test Helpers
     */
⋮----
/// @dev Query and return `proxyAdmin.getProxyImplementation(proxy)`
function _getProxyImpl(
⋮----
/// @dev Query and return `proxyAdmin.getProxyAdmin(proxy)`
function _getProxyAdmin(
⋮----
function _strEq(string memory a, string memory b) internal pure 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/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(string memory configFile, address strategy, address token, uint256 amount) public {
// 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(string memory configFile, address operator, string memory metadataURI) public {
// 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(address operator, address avsIdentifier, uint32[] calldata operatorSetIds) external {}
⋮----
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(string memory configFile, address strategy, address token, uint256 amount) public {
// 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/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/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";
⋮----
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
⋮----
/// 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
⋮----
// 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
⋮----
// 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");
⋮----
// On holesky, for ease of whitelisting we set to executorMultisig
⋮----
//     strategyManager.strategyWhitelister(), executorMultisig,
//     "strategyManager: strategyWhitelister 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: snapshots/Integration_ALM_Multi.json
````json
{
  "gasUsed": "47579"
}
````

## 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 {SemVerMixin} from "../../mixins/SemVerMixin.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
⋮----
/**
     * @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
     * @param _version The semantic version of the contract
     */
⋮----
/**
     * @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(address _owner, uint16 _feeSplit, address _feeSplitCollector) external initializer {
⋮----
/**
     *
     *                         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(OperatorSet memory operatorSet, bool isRegistered) external {
⋮----
// 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(bytes32 taskHash, bytes memory executorCert, bytes memory result) external nonReentrant {
⋮----
// 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(OperatorSet memory operatorSet, bool isRegistered) internal {
⋮----
/**
     * @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
     * @param operatorTableReferenceTimestamp The expected reference timestamp
     * @param messageHash The expected message hash
     */
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(bytes32 taskHash, bytes memory result) public pure returns (bytes32) {
````

## 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/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/PermissionControllerMixin.sol";
import "../mixins/SemVerMixin.sol";
import "../permissions/Pausable.sol";
import "../libraries/SlashingLib.sol";
import "../libraries/OperatorSetLib.sol";
import "./AllocationManagerStorage.sol";
⋮----
contract AllocationManager is
⋮----
/**
     *
     *                         INITIALIZING FUNCTIONS
     *
     */
⋮----
/**
     * @dev Initializes the DelegationManager address, the deallocation delay, and the allocation configuration delay.
     */
⋮----
/// @inheritdoc IAllocationManager
function initialize(
⋮----
function slashOperator(
⋮----
// Check that the operator set exists and the operator is registered to it
⋮----
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(address operator, uint32 delay) external {
⋮----
function setAVSRegistrar(address avs, IAVSRegistrar registrar) external checkCanCall(avs) {
// Check that the registrar is correctly configured to prevent an AVSRegistrar contract
// from being used with the wrong AVS
⋮----
function updateAVSMetadataURI(address avs, string calldata metadataURI) external checkCanCall(avs) {
⋮----
function createOperatorSets(address avs, CreateSetParams[] calldata params) external checkCanCall(avs) {
⋮----
function createRedistributingOperatorSets(
⋮----
function addStrategiesToOperatorSet(
⋮----
function removeStrategiesFromOperatorSet(
⋮----
/**
     *
     *                         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.
     */
function _createOperatorSet(
⋮----
// Create the operator set, ensuring it does not already exist.
⋮----
/**
     * @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(address operator, IStrategy strategy, uint16 numToClear) internal {
⋮----
// 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.
     */
function _setAllocationDelay(address operator, uint32 delay) internal {
⋮----
// If there is a pending delay that can be applied now, set it
⋮----
/// @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.
⋮----
/**
     * @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`
⋮----
function _updateMaxMagnitude(address operator, IStrategy strategy, uint64 newMaxMagnitude) internal {
⋮----
function _calcDelta(uint64 currentMagnitude, uint64 newMagnitude) internal pure returns (int128) {
⋮----
/// @dev Use safe casting when downcasting to uint64
function _addInt128(uint64 a, int128 b) internal pure returns (uint64) {
⋮----
/**
     * @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
     *
     */
⋮----
function getOperatorSetCount(
⋮----
function getAllocatedSets(
⋮----
function getAllocatedStrategies(
⋮----
function getAllocation(
⋮----
function getAllocations(
⋮----
function getStrategyAllocations(
⋮----
function getEncumberedMagnitude(address operator, IStrategy strategy) external view returns (uint64) {
⋮----
function getAllocatableMagnitude(address operator, IStrategy strategy) external view returns (uint64) {
⋮----
/// @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.
⋮----
// 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(address operator, IStrategy strategy) public view returns (uint64) {
⋮----
function getMaxMagnitudes(
⋮----
function getMaxMagnitudes(address[] memory operators, IStrategy strategy) external view returns (uint64[] memory) {
⋮----
function getMaxMagnitudesAtBlock(
⋮----
function getAllocationDelay(
⋮----
// If there is a pending delay that can be applied, apply it
⋮----
function getRegisteredSets(
⋮----
function isMemberOfOperatorSet(address operator, OperatorSet memory operatorSet) public view returns (bool) {
⋮----
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(address operator, OperatorSet memory operatorSet) public view returns (bool) {
⋮----
// 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
````

## File: src/contracts/core/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 "../interfaces/IDelegationManager.sol";
import {Snapshots} from "../libraries/Snapshots.sol";
⋮----
abstract contract AllocationManagerStorage is IAllocationManager {
⋮----
// 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 alloaction delay modifications take effect.
⋮----
// 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`
⋮----
// 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/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 "./AVSDirectoryStorage.sol";
⋮----
contract AVSDirectory is
⋮----
/**
     *
     *                         INITIALIZING FUNCTIONS
     *
     */
⋮----
/**
     * @dev Initializes the immutable addresses of the strategy manager, delegationManager,
     * and eigenpodManager contracts
     */
⋮----
/// @inheritdoc IAVSDirectory
function initialize(address initialOwner, uint256 initialPausedStatus) external initializer {
⋮----
/**
     *
     *                    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/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/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 "./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(address operator, string calldata metadataURI) external checkCanCall(operator) {
⋮----
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(address operator, address newDelegationApprover) internal {
⋮----
/**
     * @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(address staker, address operator) internal onlyWhenNotPaused(PAUSED_NEW_DELEGATION) {
// 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.
     * @dev Assumes the following is checked before calling this function:
     *          1) the `staker` is currently delegated to an operator
     *          2) the `staker` is not an operator themselves
     * Ensures that:
     *          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(
⋮----
// 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.
⋮----
/// @dev Add to the cumulative withdrawn scaled shares from an operator for a given strategy
function _addQueuedSlashableShares(address operator, IStrategy strategy, uint256 scaledShares) internal {
⋮----
/// @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(address staker, IStrategy strategy) external view returns (uint256) {
⋮----
function getOperatorShares(
⋮----
function getOperatorsShares(
⋮----
function getSlashableSharesInQueue(address operator, IStrategy strategy) public view returns (uint256) {
⋮----
// 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/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/ReleaseManager.sol
````
// SPDX-License-Identifier: BUSL-1.1
⋮----
import "@openzeppelin-upgrades/contracts/proxy/utils/Initializable.sol";
import "../mixins/PermissionControllerMixin.sol";
import "../mixins/SemVerMixin.sol";
import "./ReleaseManagerStorage.sol";
⋮----
contract ReleaseManager is Initializable, ReleaseManagerStorage, PermissionControllerMixin, SemVerMixin {
⋮----
/**
     *
     *                         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(OperatorSet memory operatorSet, uint256 releaseId) external view returns (Release memory) {
⋮----
function getLatestRelease(
⋮----
function getLatestUpgradeByTime(
⋮----
function isValidRelease(OperatorSet memory operatorSet, uint256 releaseId) external view returns (bool) {
⋮----
function getMetadataURI(
````

## File: src/contracts/core/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/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 "./RewardsCoordinatorStorage.sol";
import "../mixins/PermissionControllerMixin.sol";
import "../mixins/SemVerMixin.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() {
⋮----
/// @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 createAVSRewardsSubmission(
⋮----
function createRewardsForAllSubmission(
⋮----
function createRewardsForAllEarners(
⋮----
function createOperatorDirectedAVSRewardsSubmission(
⋮----
function createOperatorDirectedOperatorSetRewardsSubmission(
⋮----
function processClaim(
⋮----
function processClaims(
⋮----
function submitRoot(
⋮----
function disableRoot(
⋮----
function setClaimerFor(
⋮----
function setClaimerFor(address earner, address claimer) external checkCanCall(earner) {
// Require that the earner is an operator or AVS
⋮----
function setActivationDelay(
⋮----
function setDefaultOperatorSplit(
⋮----
function setOperatorAVSSplit(
⋮----
function setOperatorPISplit(
⋮----
function setOperatorSetSplit(
⋮----
function setRewardsUpdater(
⋮----
function setRewardsForAllSubmitter(address _submitter, bool _newValue) external onlyOwner {
⋮----
/**
     *
     *                         INTERNAL FUNCTIONS
     *
     */
⋮----
/**
     * @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(RewardsMerkleClaim calldata claim, address recipient) internal {
⋮----
// 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(address earner, address claimer) internal {
⋮----
/**
     * @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(OperatorSplit storage operatorSplit, uint16 split, uint32 activatedAt) internal {
⋮----
// If the operator split has not been initialized yet, set the old split to `type(uint16).max` as a flag.
⋮----
/**
     * @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 total amount to be transferred from the avs to the contract.
     */
function _validateOperatorDirectedRewardsSubmission(
⋮----
function _checkClaim(RewardsMerkleClaim calldata claim, DistributionRoot memory root) internal view {
⋮----
// 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.
     * @param operatorSplit The split struct for an Operator
     * @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.
⋮----
/**
     *
     *                         VIEW FUNCTIONS
     *
     */
⋮----
function calculateEarnerLeafHash(
⋮----
function calculateTokenLeafHash(
⋮----
function checkClaim(
⋮----
function getOperatorAVSSplit(address operator, address avs) external view returns (uint16) {
⋮----
function getOperatorPISplit(
⋮----
function getOperatorSetSplit(address operator, OperatorSet calldata operatorSet) external view returns (uint16) {
⋮----
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/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
⋮----
/// @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 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 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
⋮----
// Immutables
⋮----
/// @notice The DelegationManager contract for EigenLayer
⋮----
/// @notice The StrategyManager contract for EigenLayer
⋮----
/// @notice The AllocationManager 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.
⋮----
// 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/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 "./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(address staker, IStrategy strategy, uint256 shares) internal returns (uint256, uint256) {
// sanity checks on inputs
⋮----
// 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
⋮----
// 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(address staker, IStrategy strategy) internal {
//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/core/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/interfaces/IAllocationManager.sol
````
// SPDX-License-Identifier: BUSL-1.1
⋮----
import {OperatorSet} from "../libraries/OperatorSetLib.sol";
import "./IPauserRegistry.sol";
import "./IStrategy.sol";
import "./IAVSRegistrar.sol";
import "./ISemVerMixin.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.
⋮----
/// 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.
⋮----
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 Struct containing allocation delay metadata for a given operator.
     * @param delay Current allocation delay
     * @param isSet Whether the operator has initially set an allocation delay. Note that this could be false but the
     * block.number >= effectBlock in which we consider their delay to be configured and active.
     * @param pendingDelay The delay that will take effect after `effectBlock`
     * @param effectBlock The block number after which a pending delay will take effect
     */
⋮----
/**
     * @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
     */
⋮----
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'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 IAllocationManager is IAllocationManagerErrors, IAllocationManagerEvents, ISemVerMixin {
/**
     * @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(address operator, AllocateParams[] calldata params) external;
⋮----
/**
     * @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(address operator, RegisterParams calldata params) external;
⋮----
/**
     * @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
     */
function setAllocationDelay(address operator, uint32 delay) external;
⋮----
/**
     * @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;
⋮----
/**
     *  @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;
⋮----
/**
     * @notice Allows an AVS to create new operator sets, defining strategies that the operator set uses
     */
function createOperatorSets(address avs, CreateSetParams[] calldata params) external;
⋮----
/**
     * @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.
     */
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(address avs, uint32 operatorSetId, IStrategy[] calldata strategies) external;
⋮----
/**
     * @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(
⋮----
/**
     *
     *                         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 operator the operator to query
     * @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 operator the operator to query
     * @param operatorSet the operator set to query
     * @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
     * @param operatorSet the operator set to query
     * @param strategy the strategy 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.
     * @param operator the operator to query
     * @param strategy the strategy to query
     * @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 operator the operator to query
     * @param strategy the strategy to get allocatable magnitude for
     * @return currently allocated magnitude
     */
function getEncumberedMagnitude(address operator, IStrategy strategy) external view returns (uint64);
⋮----
/**
     * @notice For a strategy, get the amount of magnitude not currently allocated to any operator set
     * @param operator the operator to query
     * @param strategy the strategy to get allocatable magnitude for
     * @return magnitude available to be allocated to an operator set
     */
function getAllocatableMagnitude(address operator, IStrategy strategy) external view 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
     * the operator is slashed. This value acts as a cap on the max magnitude of the operator.
     * @param operator the operator to query
     * @param strategy the strategy to get the max magnitude for
     * @return the max magnitude for the strategy
     */
function getMaxMagnitude(address operator, IStrategy strategy) external view 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
     * the operator is slashed. This value acts as a cap on the max magnitude of the operator.
     * @param operator the operator to query
     * @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
     * @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 operators the operators to query
     * @param strategy the strategy to get the max magnitudes for
     * @return the max magnitudes for each operator
     */
⋮----
/**
     * @notice Returns the maximum magnitude an operator can allocate for the given strategies
     * at a given block number
     * @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 operator the operator to query
     * @param strategies the strategies to get the max magnitudes for
     * @param blockNumber the blockNumber at which to check the max magnitudes
     * @return the max magnitudes for each strategy
     */
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 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 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 operator The operator to query
     * @param operatorSet The operator set to query
     */
function isMemberOfOperatorSet(address operator, OperatorSet memory operatorSet) external view returns (bool);
⋮----
/**
     * @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.
     * @param operatorSet The operatorSet to query.
     */
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 operatorSet the operator set to query
     * @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 operatorSet the operator set to query
     * @param operators the operators to query
     * @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(address operator, OperatorSet memory operatorSet) external view returns (bool);
⋮----
/**
     * @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.
     * @param operatorSet The Operator Set to query.
     * @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.
     * @param operatorSet The operator set to query.
     * @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(
````

## 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(address initialOwner, uint256 initialPausedStatus) external;
⋮----
/**
     *  @notice Called by an AVS to emit an `AVSMetadataURIUpdated` event indicating the information has updated.
     *
     *  @param metadataURI The URI for metadata associated with an AVS.
     *
     *  @dev Note that the `metadataURI` is *never stored* and is only emitted in the `AVSMetadataURIUpdated` event.
     */
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.
     *
     *  @dev Only used by legacy M2 AVSs that have not integrated with operator sets.
     */
function deregisterOperatorFromAVS(
⋮----
/**
     *
     *                         VIEW FUNCTIONS
     *
     */
function operatorSaltIsSpent(address operator, bytes32 salt) external view returns (bool);
⋮----
/**
     *  @notice Calculates the digest hash to be signed by an operator to register with an AVS.
     *
     *  @param operator The account registering as an operator.
     *  @param avs The AVS the operator is registering 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(address operator, address avs, uint32[] calldata operatorSetIds) external;
⋮----
/**
     * @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(address caller, ITaskMailboxTypes.TaskParams memory taskParams) external view;
⋮----
/**
     * @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 taskHash Unique identifier of the task
     * @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
     * @param taskHash Unique identifier of the task
     * @dev This function can be used to perform additional validation or update AVS-specific state
     */
function handlePostTaskResultSubmission(address caller, bytes32 taskHash) external;
⋮----
/**
     * @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(address from, bool isAllowedFrom) external;
⋮----
/**
     * @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(address to, bool isAllowedTo) external;
⋮----
/**
     * @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(address minterAddress, bool newStatus) external;
⋮----
/**
     * @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(address to, uint256 amount) external;
⋮----
/**
     * @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);
````

## 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
     * @dev This value is set by the AVS in the `CrossChainRegistry` and transported by the multichain protocol when the operator table is updated
     */
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
     * @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(
````

## 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.
     *        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`
     */
⋮----
/**
     * @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:
     *      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
     * @dev Reverts for:
     *      - 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 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
     * @dev Reverts for:
     *      - 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
     *      - ArrayLengthMismatch: signedStakes length does not equal totalStakeProportionThresholds length
     */
function verifyCertificateProportion(
⋮----
/**
     * @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
     * @dev Reverts for:
     *      - 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
     *      - 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
     * @param referenceTimestamp The reference timestamp
     * @param operatorIndex The operator index
     * @return Whether the operator is cached
     * @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
     */
function isNonsignerCached(
⋮----
/**
     * @notice Get operator set info for a timestamp
     * @param operatorSet The operator set
     * @param referenceTimestamp The reference 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 referenceTimestamp The reference timestamp
     * @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
     * @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(
⋮----
/**
     * @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(
⋮----
/**
     * @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;
⋮----
/**
     * @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;
⋮----
/**
     * @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(
⋮----
/**
     * @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
     * @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
     * @return An array of operatorSets with active generationReservations
     * @dev Reverts for:
     *      - 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
     * @dev You should check if an operatorSet has an active generation reservation prior to calling this method
     * @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 You should check if an operatorSet has an active generation reservation prior to calling this method
     * @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(address operator, address newDelegationApprover) external;
⋮----
/**
     * @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;
⋮----
/**
     * @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(address _delegationApprover, bytes32 salt) external view returns (bool);
⋮----
/// @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
     * @param strategies the strategies 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. Note that the *actual* slashable amount could be less than this value as this doesn't account
     * for amounts that have already been slashed. This assumes that none of the shares have been slashed.
     * @param operator the operator to get shares for
     * @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
     */
function getSlashableSharesInQueue(address operator, IStrategy strategy) external view returns (uint256);
⋮----
/**
     * @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(address staker, IStrategy strategy) external view returns (uint256);
⋮----
/**
     * @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/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:
     *      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(
⋮----
/**
     * @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(
⋮----
/**
     * @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(
⋮----
/**
     * @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 operatorSet The operator set
     * @param referenceTimestamp The reference timestamp
     * @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`
     * @dev Reverts for:
     *      - 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 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
     * @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
     * @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(
````

## 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(address from, bool isAllowedFrom) external;
⋮----
/**
     * @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(address to, bool isAllowedTo) external;
⋮----
/**
     * @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 "./ISemVerMixin.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, ISemVerMixin {
/// @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(bytes calldata pubkey, bytes calldata signature, bytes32 depositDataRoot) external payable;
⋮----
/**
     * @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(address recipient, uint256 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(
⋮----
/**
     * @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 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 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(IERC20[] memory tokenList, uint256[] memory amountsToWithdraw, address recipient) external;
⋮----
/// @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";
import "./ISemVerMixin.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(bytes calldata pubkey, bytes calldata signature, bytes32 depositDataRoot) external payable;
⋮----
/**
     * @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/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";
import "./ISemVerMixin.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, ISemVerMixin {
/**
     * @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;
⋮----
/**
     * @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
     *      - 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
     * @dev Emits the following events:
     *      - 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
     * @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;
⋮----
/**
     * @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(OperatorSet memory operatorSet, address operator) external view returns (bool);
⋮----
/**
     * @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
     * @param operator Address of the operator
     * @return g1Point The BN254 G1 public key
     * @return g2Point The BN254 G2 public key
     * @dev Reverts for:
     *      - 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
     * @param operatorSet The operator set to get the key for
     * @param operator Address of the operator
     * @return pubkey The ECDSA public key in bytes format
     * @dev Reverts for:
     *      - InvalidCurveType: The operatorSet is not configured for ECDSA
     * @dev Returns 0x0 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 getECDSAKey(OperatorSet memory operatorSet, address operator) external view returns (bytes memory);
⋮----
/**
     * @notice Gets the ECDSA public key for an operator with a specific operator set
     * @param operatorSet The operator set to get the key for
     * @param operator Address of the operator
     * @return pubkey The ECDSA public key in address format
     * @dev Reverts for:
     *      - InvalidCurveType: The operatorSet is not configured for ECDSA
     * @dev Returns 0x0 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 getECDSAAddress(OperatorSet memory operatorSet, address operator) external view returns (address);
⋮----
/**
     * @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
     * @param operator Address of the operator
     * @return keyHash The key hash
     */
function getKeyHash(OperatorSet memory operatorSet, address operator) external view returns (bytes32);
⋮----
/**
     * @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
     * @dev Reverts for:
     *      - 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 operator The operator address
     * @param operatorSet The operator set
     * @param keyData The BN254 key data
     * @return The message hash for signing
     */
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.
     * @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 operatorSet 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
     */
⋮----
/// @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.
     * @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
     * @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
     * @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
     */
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
     * @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(
⋮----
/**
     * @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) external;
⋮----
/**
     * @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
     * @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
     * @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(
⋮----
/**
     * @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
     * @param referenceTimestamp the reference timestamp
     * @param referenceBlockNumber the reference block number
     * @return The message hash for a global table root
     */
function getGlobalTableUpdateMessageHash(
⋮----
/**
     * @notice Get the signable digest for confirming a global table root update
     * @param globalTableRoot the global table root
     * @param referenceTimestamp the reference timestamp used when computing the message hash
     * @param referenceBlockNumber the reference block number
     * @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
     * @param globalTableRoot the 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
     * @param referenceTimestamp the reference timestamp
     * @return The validity status of the global table root
     */
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.
     * @param newPausedStatus represents the new value for `_paused` to take, which means it may flip several bits at once.
     * @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
⋮----
import "./ISemVerMixin.sol";
⋮----
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, ISemVerMixin {
/**
     * @notice Sets a pending admin for an account.
     * @param account The account to set the pending admin for.
     * @param admin The address to set as pending admin.
     * @dev The pending admin must accept the role before becoming an active admin.
     * @dev Multiple admins can be set for a single account.
     */
function addPendingAdmin(address account, address admin) external;
⋮----
/**
     * @notice Removes a pending admin from an account before they have accepted the role.
     * @param account The account to remove the pending admin from.
     * @param admin The pending admin address to remove.
     * @dev Only an existing admin of the account can remove a pending admin.
     */
function removePendingAdmin(address account, address admin) external;
⋮----
/**
     * @notice 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(address account, address admin) external;
⋮----
/**
     * @notice Sets an appointee who can call specific functions on behalf of an account.
     * @param account The account to set the appointee for.
     * @param appointee The address to be given permission.
     * @param target The contract address the appointee can interact with.
     * @param selector The function selector the appointee can call.
     * @dev Only an admin of the account can set appointees.
     */
function setAppointee(address account, address appointee, address target, bytes4 selector) external;
⋮----
/**
     * @notice Removes an appointee's permission to call a specific function.
     * @param account The account to remove the appointee from.
     * @param appointee The appointee address to remove.
     * @param target The contract address to remove permissions for.
     * @param selector The function selector to remove permissions for.
     * @dev Only an admin of the account can remove appointees.
     */
function removeAppointee(address account, address appointee, address target, bytes4 selector) external;
⋮----
/**
     * @notice Checks if a given address is an admin of an account.
     * @param account The account to check admin status for.
     * @param caller The address to check.
     * @dev If the account has no admins, returns true only if the caller is the account itself.
     * @return Returns true if the caller is an admin, false otherwise.
     */
function isAdmin(address account, address caller) external view returns (bool);
⋮----
/**
     * @notice Checks if an address is currently a pending admin for an account.
     * @param account The account to check pending admin status for.
     * @param pendingAdmin The address to check.
     * @return Returns true if the address is a pending admin, false otherwise.
     */
function isPendingAdmin(address account, address pendingAdmin) external view returns (bool);
⋮----
/**
     * @notice 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(address account, address caller, address target, bytes4 selector) external returns (bool);
⋮----
/**
     * @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(address account, address target, bytes4 selector) external returns (address[] memory);
````

## 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(OperatorSet calldata operatorSet, string calldata metadataURI) external;
⋮----
/**
     *
     *                         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(OperatorSet memory operatorSet, uint256 releaseId) external view returns (Release memory);
⋮----
/// @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(OperatorSet memory operatorSet, uint256 releaseId) external view returns (bool);
⋮----
/// @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 "./ISemVerMixin.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
     *         <-----MAX_RETROACTIVE_LENGTH-----> t (block.timestamp) <---MAX_FUTURE_LENGTH--->
     *         <------------------------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 operatorDirectedRewardsSubmissionHash Keccak256 hash of (`avs`, `submissionNonce` and `operatorDirectedRewardsSubmission`).
     * @param operatorSet The operatorSet on behalf of which the operator-directed rewards are being submitted.
     * @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 OperatorDirectedOperatorSetRewardsSubmissionCreated(
⋮----
/// @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 operator The operator on behalf of which the split is being set.
     * @param activatedAt The timestamp at which the split will be activated.
     * @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 operator The operator on behalf of which the split is being set.
     * @param operatorSet The operatorSet for which the split is being set.
     * @param activatedAt The timestamp at which the split will be activated.
     * @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(
⋮----
/**
 * @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, ISemVerMixin {
/**
     * @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 an AVS, to be split amongst the
     * set of stakers delegated to operators who are registered to the `avs`
     * @param rewardsSubmissions The rewards submissions being created
     * @dev Expected to be called by the ServiceManager of the AVS on behalf of which the submission is being made
     * @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 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.
     * @param rewardsSubmissions The rewards submissions being created
     */
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 the token hopper contract from the Eigen Foundation
     * @param rewardsSubmissions The rewards submissions being created
     */
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 Expected to be called by the ServiceManager of the AVS on behalf 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 The `RewardsCoordinator` contract needs a token approval of sum of all `operatorRewards` in the `operatorDirectedRewardsSubmissions`, before calling this function.
     * @dev Strategies must be in ascending order of addresses to check for duplicates
     * @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
     * @param operatorDirectedRewardsSubmissions The operator-directed rewards submissions being created
     * @dev Expected to be called by the AVS that created the operator set
     * @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 The `RewardsCoordinator` contract needs a token approval of sum of all `operatorRewards` in the `operatorDirectedRewardsSubmissions`, before calling this function
     * @dev Strategies must be in ascending order of addresses to check for duplicates
     * @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 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(RewardsMerkleClaim calldata claim, address recipient) external;
⋮----
/**
     * @notice Batch 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 claims The RewardsMerkleClaims 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.
     * @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(RewardsMerkleClaim[] calldata claims, address recipient) external;
⋮----
/**
     * @notice Creates a new distribution root. activatedAt is set to block.timestamp + activationDelay
     * @param root The merkle root of the distribution
     * @param rewardsCalculationEndTimestamp The timestamp until which rewards have been calculated
     * @dev Only callable by the rewardsUpdater
     */
function submitRoot(bytes32 root, uint32 rewardsCalculationEndTimestamp) external;
⋮----
/**
     * @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
     * @param claimer The address of the entity that can call `processClaim` on behalf of the earner
     * @dev Only callable by operators or AVSs. We define an AVS that has created at least one
     *      operatorSet in the `AllocationManager`
     */
function setClaimerFor(address earner, address claimer) external;
⋮----
/**
     * @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 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(address operator, address avs, uint16 split) external;
⋮----
/**
     * @notice Sets the split for a specific operator for Programmatic Incentives.
     * @param operator The operator on behalf of which the split is being set.
     * @param split The split for the operator for Programmatic Incentives 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 setOperatorPISplit(address operator, uint16 split) external;
⋮----
/**
     * @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.
     * @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 setOperatorSetSplit(address operator, OperatorSet calldata operatorSet, uint16 split) external;
⋮----
/**
     * @notice Sets the permissioned `rewardsUpdater` address which can post new roots
     * @dev Only callable by the contract owner
     * @param _rewardsUpdater The address of the new rewardsUpdater
     */
function setRewardsUpdater(
⋮----
/**
     * @notice Sets the permissioned `rewardsForAllSubmitter` address which can submit createRewardsForAllSubmission
     * @dev Only callable by the contract owner
     * @param _submitter The address of the rewardsForAllSubmitter
     * @param _newValue The new value for isRewardsForAllSubmitter
     */
function setRewardsForAllSubmitter(address _submitter, bool _newValue) external;
⋮----
/**
     *
     *                         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(address claimer, IERC20 token) external view returns (uint256);
⋮----
/// @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(address operator, address avs) external view returns (uint16);
⋮----
/// @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(address operator, OperatorSet calldata operatorSet) external view returns (uint16);
⋮----
/// @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(address staker, IStrategy strategy, uint256 shares) external returns (uint256, uint256);
⋮----
/// @notice Used by the DelegationManager to convert deposit shares to tokens and send them to a staker
⋮----
/// @dev token is not validated when talking to the EigenPodManager
function withdrawSharesAsTokens(address staker, IStrategy strategy, IERC20 token, uint256 shares) external;
⋮----
/// @notice Returns the current shares of `user` in `strategy`
⋮----
/// @dev returns 0 if the user has negative shares
function stakerDepositShares(address user, IStrategy strategy) external view returns (uint256 depositShares);
⋮----
/**
     * @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
⋮----
import "./ISemVerMixin.sol";
⋮----
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, ISemVerMixin {
/// @notice Computes the EIP-712 domain separator used for signature validation.
/// @dev The domain separator is computed according to EIP-712 specification, using:
///      - The hardcoded name "EigenLayer"
///      - The contract's version string
///      - The current chain ID
///      - This contract's address
/// @return The 32-byte domain separator hash used in EIP-712 structured data signing.
/// @dev See https://eips.ethereum.org/EIPS/eip-712#definition-of-domainseparator.
function domainSeparator() external view returns (bytes32);
````

## File: src/contracts/interfaces/IStrategy.sol
````
// SPDX-License-Identifier: BUSL-1.1
⋮----
import "@openzeppelin/contracts/token/ERC20/IERC20.sol";
import "../libraries/SlashingLib.sol";
import "./ISemVerMixin.sol";
⋮----
interface IStrategyErrors {
/// @dev Thrown when called by an account that is not strategy manager.
⋮----
/// @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, ISemVerMixin {
/**
     * @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(IERC20 token, uint256 amount) external returns (uint256);
⋮----
/**
     * @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.
     * @return amountOut is the amount of tokens being transferred out.
     */
function withdraw(address recipient, IERC20 token, uint256 amountShares) external returns (uint256);
⋮----
/**
     * @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.
     * @dev Implementation for these functions in particular may vary significantly for different strategies
     */
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 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 `sharesToUnderlying`, this function guarantees no 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 sharesToUnderlyingView(
⋮----
/**
     * @notice Used to convert an amount of underlying tokens to the equivalent amount of shares in this strategy.
     * @notice In contrast to `underlyingToShares`, this function guarantees no 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.
     * @dev Implementation for these functions in particular may vary significantly for different strategies
     */
function underlyingToSharesView(
⋮----
/**
     * @notice convenience function for fetching the current underlying value of all of the `user`'s shares in
     * 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 "./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 is ISemVerMixin {
/// @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 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 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 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 when the `strategyBeacon` is changed
event StrategyBeaconModified(IBeacon previousBeacon, IBeacon newBeacon);
⋮----
/// @notice Emitted whenever a slot is set in the `tokenStrategy` mapping
event StrategySetForToken(IERC20 token, IStrategy strategy);
````

## File: src/contracts/interfaces/IStrategyManager.sol
````
// SPDX-License-Identifier: BUSL-1.1
⋮----
import "./IStrategy.sol";
import "./IShareManager.sol";
import "./IDelegationManager.sol";
import "./IEigenPodManager.sol";
import "./ISemVerMixin.sol";
⋮----
interface IStrategyManagerErrors {
/// @dev Thrown when total strategies deployed exceeds max.
⋮----
/// @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, ISemVerMixin {
/**
     * @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 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(
⋮----
/**
     * @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.
     * @param operatorSet The operator set to burn shares in.
     * @param slashId The slash ID to burn shares in.
     * @param strategy The strategy to burn shares in.
     * @return The amount of tokens transferred to the 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 operatorSet The operator set to burn or redistribute shares in.
     * @param slashId The slash ID to burn or redistribute shares in.
     * @param strategy The strategy to get the shares for.
     * @return The shares for the given strategy for the given slashId.
     * @dev This function will return revert if the shares have already been sent to the redistribution recipient.
     */
⋮----
/**
     * @notice Returns the number of strategies that have NOT been sent to the redistribution recipient for a given slashId.
     * @param operatorSet The operator set to burn or redistribute shares in.
     * @param slashId The slash ID to burn or redistribute shares in.
     * @return The number of strategies for the given slashId.
     */
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(address user, IStrategy strategy) external view returns (uint256 shares);
⋮----
/// @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
     *
     * @dev This function will be deprecated in a release after redistribution
     * 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 payload Task payload
     * @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 executorOperatorSetId ID of the executor operator set
     * @param config The task configuration for the executor operator set
     */
event ExecutorOperatorSetTaskConfigSet(
⋮----
/**
     * @notice Emitted when a new task is created
     * @param creator Address that created the task
     * @param taskHash Unique identifier of the task
     * @param avs Address of the AVS handling the task
     * @param executorOperatorSetId ID of the executor operator set
     * @param operatorTableReferenceTimestamp Reference timestamp of the operator table
     * @param refundCollector Address to receive refunds
     * @param avsFee Fee paid to the AVS
     * @param taskDeadline Timestamp by which the task must be completed
     * @param payload Task payload
     */
event TaskCreated(
⋮----
/**
     * @notice Emitted when a task is verified
     * @param aggregator Address that submitted the verification
     * @param taskHash Unique identifier of the task
     * @param avs Address of the AVS handling the task
     * @param executorOperatorSetId ID of the executor operator set
     * @param executorCert Executor certificate
     * @param result Task execution result data
     */
event TaskVerified(
⋮----
/**
     * @notice Emitted when a task fee is refunded
     * @param refundCollector Address that received the refund
     * @param taskHash Unique identifier of the task
     * @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(address owner, uint16 feeSplit, address feeSplitCollector) external;
⋮----
/**
     * @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(OperatorSet memory operatorSet, bool isRegistered) external;
⋮----
/**
     * @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 taskHash Unique identifier of the task
     * @param executorCert Certificate proving the validity of the result
     * @param result Task execution result data
     */
function submitResult(bytes32 taskHash, bytes memory executorCert, bytes memory result) external;
⋮----
/**
     * @notice Refunds the fee for an expired task
     * @param taskHash Unique identifier of the 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
     * @dev Only callable by the owner
     */
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
     * @param taskHash Unique identifier of the task
     * @return Complete task information
     */
function getTaskInfo(
⋮----
/**
     * @notice Gets the current status of a task
     * @param taskHash Unique identifier of the task
     * @return Current status of the task
     */
function getTaskStatus(
⋮----
/**
     * @notice Gets the result of a verified task
     * @param taskHash Unique identifier of the 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
     * @param cert The certificate to get the bytes of
     * @return The bytes of the certificate
     */
function getECDSACertificateBytes(
⋮----
/**
     * @notice Gets the message hash for a task that needs to be signed by operators
     * @param taskHash Unique identifier of the task
     * @param result Task execution result data
     * @return The message hash for the task that needs to be signed by operators
     */
function getMessageHash(bytes32 taskHash, bytes memory result) external pure returns (bytes32);
⋮----
/**
     * @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(bytes32 beaconBlockRoot, StateRootProof calldata proof) internal view {
⋮----
/// 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(bytes32 balanceRoot, uint40 validatorIndex) internal pure returns (uint64) {
⋮----
/// @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(G1Point memory p1, G1Point memory p2) internal view returns (G1Point memory r) {
⋮----
// 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(BN254.G1Point memory p, uint16 s) internal view returns (BN254.G1Point memory) {
⋮----
// 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(G1Point memory p, uint256 s) internal view returns (G1Point memory r) {
⋮----
/**
     *  @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(uint256 _base, uint256 _exponent, uint256 _modulus) internal view returns (uint256 retval) {
⋮----
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 pubkeyG1 The G1 component of the public key
     * @param pubkeyG2 The G2 component of the public key
     * @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`.
     * @param proof The proof of inclusion for the leaf
     * @param leaf The leaf to verify
     * @param index The index of the leaf in the Merkle tree
     * @return The rebuilt hash
     * @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).
     * @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
⋮----
/**
     * @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 0 or not a multiple of 32.
     *      - InvalidIndex: index is not 0 at conclusion of computation (implying outside the max index for the tree).
     */
function verifyInclusionSha256(
⋮----
/**
     * @notice Returns the rebuilt hash obtained by traversing a Merkle tree up
     * from `leaf` using `proof`.
     * @param proof The proof of inclusion for the leaf
     * @param leaf The leaf to verify
     * @param index The index of the leaf in the Merkle tree
     * @return The rebuilt hash
     * @dev Reverts for:
     *      - InvalidProofLength: proof.length is 0 or not a multiple of 32.
     *      - InvalidIndex: index is not 0 at conclusion of computation (implying outside the max index for the tree).
     * @dev The tree is built assuming `leaf` is the 0 indexed `index`'th leaf from the bottom left of the tree.
     */
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.
     * @dev Reverts for:
     *      - 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
     * @param leaves the leaves of the Merkle tree
     * @return The computed Merkle root of the tree.
     * @dev Reverts for:
     *      - 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 leaves the leaves of the Merkle tree
     * @param index the index of the leaf to get the proof for
     * @return proof The computed Merkle proof for the leaf at index.
     * @dev Reverts for:
     *      - InvalidIndex: index is outside the max index for the tree.
     */
function getProofKeccak(bytes32[] memory leaves, uint256 index) internal pure returns (bytes memory proof) {
⋮----
// 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
     * @param leaves the leaves of the Merkle tree
     * @param index the index of the leaf to get the proof for
     * @return proof The computed Merkle proof for the leaf at index.
     * @dev Reverts for:
     *      - NotEnoughLeaves: leaves.length is less than 2.
     * @dev Unlike the Keccak version, this function does not allow a single-leaf proof.
     */
function getProofSha256(bytes32[] memory leaves, uint256 index) internal pure returns (bytes memory proof) {
⋮----
/**
     * @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(uint256 x, uint256 y) internal pure returns (uint256) {
⋮----
function divWad(uint256 x, uint256 y) internal pure returns (uint256) {
⋮----
/**
     * @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(uint256 x, uint256 y) internal pure returns (uint256) {
⋮----
// GETTERS
⋮----
function scalingFactor(
⋮----
function scaleForQueueWithdrawal(
⋮----
function scaleForCompleteWithdrawal(uint256 scaledShares, uint256 slashingFactor) internal pure returns (uint256) {
⋮----
/**
     * @notice Scales shares according to the difference in an operator's magnitude before and
     * after being slashed. This is used to calculate the number of slashable shares in the
     * withdrawal queue.
     * NOTE: max magnitude is guaranteed to only ever decrease.
     */
function scaleForBurning(
⋮----
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(
⋮----
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(DefaultWadHistory storage self, uint32 key, uint64 value) internal {
⋮----
/**
     * @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.
     */
function push(DefaultZeroHistory storage self, uint32 key, uint256 value) internal {
⋮----
/**
     * @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(DefaultWadHistory storage self, uint32 key) internal view returns (uint64) {
⋮----
/**
     * @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.
     */
function upperLookup(DefaultZeroHistory storage self, uint32 key) internal view returns (uint256) {
⋮----
/**
     * @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(Snapshot[] storage self, uint32 key, uint224 value) private {
⋮----
// 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(Snapshot[] storage snapshots, uint224 defaultValue) private view returns (uint224) {
⋮----
/**
     * @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(Snapshot[] storage self, uint256 pos) private pure returns (Snapshot storage result) {
````

## 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)
     * @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.
     *
     * 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)
     * @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.
     *
     * 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 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 Checks if the caller (msg.sender) can call on behalf of an account.
modifier checkCanCall(
⋮----
/**
     * @notice Checks if the caller is allowed to call a function on behalf of an account.
     * @param account the account to check
     * @dev `msg.sender` is the caller to check that can call the function on behalf of `account`.
     * @dev Returns a bool, instead of reverting
     */
function _checkCanCall(
````

## 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/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/SemVerMixin.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
⋮----
/**
     * @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
     * @param _version The semantic version of the contract
     */
⋮----
/**
     *
     *                         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(bytes32 operatorSetKey, uint32 referenceTimestamp) internal view {
// 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 operatorSetKey The operator set key
     * @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 ctx The verification context
     * @param cert The certificate containing the signature to verify
     */
function _verifySignature(VerificationContext memory ctx, BN254Certificate memory cert) internal view {
// 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 operatorSetKey The operator set key
     * @param referenceTimestamp The reference timestamp
     * @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(uint32 referenceTimestamp, bytes32 messageHash) public pure returns (bytes32) {
````

## 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 "../mixins/SemVerMixin.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
     * @param _version The semantic version of the contract
     */
⋮----
/**
     * @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(OperatorSet memory operatorSet, OperatorSetConfig memory config) internal {
⋮----
/**
     * @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(uint32 referenceTimestamp, bytes32 messageHash) public view returns (bytes32) {
````

## 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/SemVerMixin.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(OperatorSet calldata generator, BN254OperatorSetInfo calldata generatorInfo) internal {
// 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(address operator, OperatorSet memory operatorSet) external checkCanCall(operator) {
// 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 operatorSet The operator set to register the key for
     * @param operator Address of the operator
     * @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 pubkey The public key data
     * @param curveType The curve type (ECDSA or BN254)
     * @return keyHash The key hash
     */
function _getKeyHashForKeyData(bytes memory pubkey, CurveType curveType) internal pure returns (bytes32) {
⋮----
/**
     *
     *                         VIEW FUNCTIONS
     *
     */
⋮----
function isRegistered(OperatorSet memory operatorSet, address operator) public view returns (bool) {
⋮----
function getOperatorSetCurveType(
⋮----
function getBN254Key(
⋮----
// Validate operator set curve type
⋮----
// Create default values for an empty key
⋮----
function getECDSAKey(OperatorSet memory operatorSet, address operator) public view returns (bytes memory) {
⋮----
return keyInfo.keyData; // Returns the 20-byte address as bytes
⋮----
function getECDSAAddress(OperatorSet memory operatorSet, address operator) external view returns (address) {
⋮----
function isKeyGloballyRegistered(
⋮----
function getKeyHash(OperatorSet memory operatorSet, address operator) external view returns (bytes32) {
⋮----
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(address newPauser, bool canPause) external onlyUnpauser {
⋮----
/// @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(address pauser, bool canPause) internal {
⋮----
function _setUnpauser(
````

## File: src/contracts/permissions/PermissionController.sol
````
// SPDX-License-Identifier: BUSL-1.1
⋮----
import "@openzeppelin-upgrades/contracts/proxy/utils/Initializable.sol";
import "../mixins/SemVerMixin.sol";
import "./PermissionControllerStorage.sol";
⋮----
contract PermissionController is Initializable, SemVerMixin, PermissionControllerStorage {
⋮----
modifier onlyAdmin(
⋮----
/**
     *
     *                         INITIALIZING FUNCTIONS
     *
     */
⋮----
/**
     *
     *                         EXTERNAL FUNCTIONS
     *
     */
⋮----
/// @inheritdoc IPermissionController
function addPendingAdmin(address account, address admin) external onlyAdmin(account) {
⋮----
// 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(address account, address admin) external onlyAdmin(account) {
⋮----
// 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(address account, address admin) external onlyAdmin(account) {
⋮----
// 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(address target, bytes4 selector) internal pure returns (bytes32) {
// 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(address account, address caller) public view returns (bool) {
⋮----
// 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(address account, address pendingAdmin) external view returns (bool) {
⋮----
function getAdmins(
⋮----
function getPendingAdmins(
⋮----
function canCall(address account, address caller, address target, bytes4 selector) external view returns (bool) {
⋮----
function getAppointeePermissions(
⋮----
function getAppointees(address account, address target, bytes4 selector) external view returns (address[] memory) {
````

## 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 "../mixins/SemVerMixin.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
⋮----
/**
     *
     *                            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(address recipient, uint256 amountWei) external onlyEigenPodManager {
⋮----
// 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 "../mixins/SemVerMixin.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(address initialOwner, uint256 _initPausedStatus) external initializer {
⋮----
/// @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(address staker, uint256 shares) internal returns (uint256, uint256) {
⋮----
// 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(address user, IStrategy strategy) public view returns (uint256 depositShares) {
⋮----
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/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(IEigen _EIGEN, IERC20 _bEIGEN) public virtual initializer {
⋮----
/**
     * @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(IERC20 token, uint256 amount) internal virtual override {
⋮----
// 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 token token to be withdrawn, can be either EIGEN or bEIGEN. If EIGEN, then bEIGEN is wrapped into EIGEN
     * @param amountToSend amount of tokens to transfer
     */
function _afterWithdrawal(address recipient, IERC20 token, uint256 amountToSend) internal virtual override {
⋮----
// 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 "../mixins/SemVerMixin.sol";
import "@openzeppelin/contracts/token/ERC20/IERC20.sol";
import "@openzeppelin/contracts/token/ERC20/extensions/IERC20Metadata.sol";
import "@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol";
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, SemVerMixin {
⋮----
/**
     * @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
     * Constant value chosen to reasonably reduce attempted share inflation by the first depositor, while still
     * incurring reasonably small losses to depositors
     */
⋮----
/**
     * @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(
⋮----
// call hook to allow for any pre-deposit logic
⋮----
// 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
     * @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.
     */
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 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(address recipient, IERC20 token, uint256 amountToSend) internal virtual {
⋮----
/// @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(uint256 virtualTokenBalance, uint256 virtualTotalShares) internal {
// 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(uint256 newMaxPerDeposit, uint256 newMaxTotalDeposits) external onlyUnpauser {
⋮----
/// @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(uint256 newMaxPerDeposit, uint256 newMaxTotalDeposits) internal {
⋮----
/**
     * @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(IERC20 token, uint256 amount) internal virtual override {
⋮----
/**
     * @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 "../mixins/SemVerMixin.sol";
import "./StrategyFactoryStorage.sol";
import "./StrategyBase.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, SemVerMixin {
⋮----
/// @notice EigenLayer's StrategyManager 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 Owner-only function to pass through a call to `StrategyManager.removeStrategiesFromDepositWhitelist`
     */
function removeStrategiesFromWhitelist(
⋮----
function _setStrategyForToken(IERC20 token, IStrategy strategy) internal {
⋮----
function _setStrategyBeacon(
````

## 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 {
/// @notice Upgradeable beacon which new Strategies deployed by this contract point to
⋮----
/// @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
⋮----
/**
     * @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/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(address minterAddress, bool newStatus) external onlyOwner {
⋮----
/**
     * @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(address to, uint256 amount) external {
⋮----
/**
     * @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(address from, bool isAllowedFrom) external onlyOwner {
⋮----
/**
     * @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(address to, bool isAllowedTo) external onlyOwner {
⋮----
/**
     * @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(address from, bool isAllowedFrom) internal {
⋮----
function _setAllowedTo(address to, bool isAllowedTo) internal {
⋮----
/**
     * @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(address from, address to, uint256 amount) internal override {
// 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(address from, bool isAllowedFrom) external onlyOwner {
⋮----
/**
     * @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(address to, bool isAllowedTo) external onlyOwner {
⋮----
/**
     * @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(address[] calldata receivers, uint256[] calldata amounts) public {
⋮----
/**
     * @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(address from, address to, uint256 amount) internal override {
// 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) {
````

## 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 validatorIndex the index of the proven validator
     * @param beaconStateRoot is the beacon chain state root to be proven against.
     * @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 beaconStateRoot is the beacon chain state root to be proven against.
     * @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.
     * @param maxNumberOfWithdrawalsToClaim Used to limit the maximum number of withdrawals to loop through claiming.
     */
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
     * @dev Note that the `metadataURI` is *never stored * and is only emitted in the `OperatorMetadataURIUpdated` event
     */
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
     * in this case to save on complexity + gas costs
     */
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 staker The address to increase the delegated shares for their operator.
     * @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.
     * @dev Callable only by the StrategyManager or EigenPodManager.
     */
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,
     * up to a maximum of `MAX_WITHDRAWAL_DELAY_BLOCKS`. Minimum value is 0 (i.e. no delay enforced).
     */
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 staker The signing staker
     * @param _stakerNonce The nonce of the staker. In practice we use the staker's current nonce, stored at `stakerNonce[staker]`
     * @param operator The operator who is being delegated to
     * @param expiry The desired expiry time of the staker's signature
     */
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 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 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
 * @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 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);
⋮----
/**
     * @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 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 validatorIndex is the index of the validator being proven, refer to consensus specs
     * @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
     * @param validatorFields are the fields of the "Validator Container", refer to consensus specs
     * @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
     * @param beaconChainETHStrategyIndex is the index of the beaconChainETHStrategy for the pod owner for the callback to
     *        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)
     * @dev Reverts if `shares` is not a whole Gwei amount
     */
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
     * @dev Reverts if `shares` is not a whole Gwei amount
     */
function withdrawSharesAsTokens(address podOwner, address destination, uint shares) external;
⋮----
/**
 * @notice DEPRECATED INTERFACE at commit hash https://github.com/Layr-Labs/eigenlayer-contracts/tree/0139d6213927c0a7812578899ddd3dda58051928
 * @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_DeprecatedM1 is IPausable {
/**
     * @notice Creates an EigenPod for the sender.
     * @dev Function will revert if the `msg.sender` already has an EigenPod.
     */
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).
     * @dev Callable only by the podOwner's EigenPod contract.
     */
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.
     * @dev Callable only by the podOwner's EigenPod contract.
     */
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 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
     * @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
     * @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 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
 * @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_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.
     */
⋮----
/**
     * @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 depositor
     * @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.
     */
⋮----
/**
     * @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
     * @dev Only callable by EigenPodManager.
     */
function recordOvercommittedBeaconChainETH(address overcommittedPodOwner, uint beaconChainETHStrategyIndex, uint amount) external;
⋮----
/**
     * @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 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 depositor
     * @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
     * @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 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 on behalf of a staker that is 'frozen' (this function will revert if the `staker` 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 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.
     * @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 Array-ified version of `completeQueuedWithdrawal`
     * @dev middlewareTimesIndex should be calculated off chain before calling this function by finding the first index that satisfies `slasher.canWithdraw`
     */
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 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 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
     * 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
     */
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);
⋮----
/**
     * @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;
⋮----
/// @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
⋮----
/**
     * Test sequence following _init()
     * 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
⋮----
/**
     * Test sequence following _init()
     * 4. fully slash operator on opSet again to 0 magnitude
     * 5. undelegate
     * 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)
⋮----
/**
     * Test sequence following _init()
     * 4. fully slash operator on opSet again to 0 magnitude
     * 5. undelegate
     * 6. complete withdrawals as tokens(although amount 0 from fully slashed operator)
     * 7. redeposit (start new validators and verifywc)
     * This is testing when an operator is fully slashed with 0 magnitude, the staker can still undelegate,
     * 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
⋮----
/**
     * Test sequence following _init()
     * 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) {
⋮----
/**
     *
     *                    VERIFY -> START -> COMPLETE CHECKPOINT
     *                          (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) {
⋮----
/**
     *
     *                    VERIFY -> START -> COMPLETE CHECKPOINT
     *                          (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) {
⋮----
/**
     *
     *                    VERIFY -> START -> COMPLETE CHECKPOINT
     *                          (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) {
⋮----
/**
     *
     *                    VERIFY -> START -> COMPLETE CHECKPOINT
     *                          (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
⋮----
/**
     *
     *                    VERIFY -> START -> COMPLETE CHECKPOINT
     *                          (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/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/Redistribution.t.sol
````
// SPDX-License-Identifier: BUSL-1.1
⋮----
import "src/test/integration/UpgradeTest.t.sol";
⋮----
contract Integration_Upgrade_Redistribution_Base is UpgradeTest {
⋮----
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
/// 6. Operator is randomly slashed by the operatorSet
function _init() internal override {
⋮----
// 1. Deposit Into Strategies
⋮----
// 2. Delegate to an operator
⋮----
// 3. Create an operator set and register an operator.
⋮----
// 4. Operator allocates to operator set
⋮----
// 5. Operator registers for operator set
⋮----
// 6. Operator is randomly slashed by the operatorSet
⋮----
contract Integration_Upgrade_Redistribution is Integration_Upgrade_Redistribution_Base {
function testFuzz_upgrade_burn(uint24 r) public rand(r) {
// 1. Upgrade contracts
⋮----
// 2. Burn shares
⋮----
// Assert that there are no strategies with burned shares
⋮----
function testFuzz_burn_update_operatorSet(uint24 r) public rand(r) {
// 1. Burn shares
⋮----
// 2. Upgrade contracts
````

## 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
⋮----
/// 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 is IntegrationDeployer {
function test_SameAddressEveryChain() public {
// Skip if we're not on a fork test profile
⋮----
// Test empty contract deployment
⋮----
// Test proxy deployment
⋮----
// Test address prediction
````

## 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/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
     * @dev Covers key registration, table generation, cross-chain transport simulation,
     *      table updates, and certificate verification
     */
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
 * @dev These tests assume the following:
 * - 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/tests/Upgrade_Setup.t.sol
````
// SPDX-License-Identifier: BUSL-1.1
⋮----
import "src/test/integration/IntegrationChecks.t.sol";
⋮----
contract IntegrationMainnetFork_UpgradeSetup is IntegrationCheckUtils {
// /// @notice Test upgrade setup is correct
// /// forge-config: default.fuzz.runs = 1
// function test_mainnet_upgrade_setup(uint24 _random) public {
//     _configRand({
//         _randomSeed: _random,
//         _assetTypes: HOLDS_LST | HOLDS_ETH | HOLDS_ALL,
//         _userTypes: DEFAULT | ALT_METHODS
//     });
⋮----
//     // 1. Check proper state pre-upgrade
//     _verifyContractPointers();
//     _verifyImplementations();
//     _verifyContractsInitialized(false);
//     _verifyInitializationParams();
⋮----
//     // 2. Upgrade mainnet contracts
//     _upgradeEigenLayerContracts();
//     _parseInitialDeploymentParams("script/configs/mainnet/M2_mainnet_upgrade.config.json");
⋮----
//     // 2. Verify upgrade setup
⋮----
// }
⋮----
// function test_holesky_upgrade_setup(uint24 _random) public {
⋮----
//         _userTypes: DEFAULT | ALT_METHODS,
//         _forkTypes: HOLESKY
⋮----
//     // // 1. Check proper state pre-upgrade
//     // _verifyContractPointers();
//     // _verifyImplementations();
//     // _verifyContractsInitialized(true);
//     // _verifyInitializationParams();
⋮----
//     // 2. Upgrade holesky contracts
⋮----
//     _parseInitialDeploymentParams("script/configs/holesky/M2_deploy_from_scratch.holesky.config.json");
⋮----
//     // 3. Verify upgrade setup
⋮----
//     _verifyContractsInitialized(true);
⋮----
/// @notice Ensure contracts point at each other correctly via constructors
/// override to remove ethPOSDeposit contract check
function _verifyContractPointers() internal view virtual override {
// AVSDirectory
⋮----
// DelegationManager
⋮----
// StrategyManager
⋮----
// EPM
````

## 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 createRedistributingOperatorSets(IStrategy[][] memory strategies, address[] memory redistributionRecipients)
⋮----
function createOperatorSet(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 {
⋮----
/// 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 {
````

## 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 (AllocationManager);
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)
⋮----
function completeWithdrawalAsTokens(Withdrawal memory withdrawal) public virtual createSnapshot returns (IERC20[] memory) {
⋮----
function completeWithdrawalsAsShares(Withdrawal[] memory withdrawals)
⋮----
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 (AllocationManager) {
⋮----
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) {
⋮----
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(
⋮----
/**
     *
     *                 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
⋮----
/**
         * 2. The delta in shares is given by:
         * (originalWithdrawableShares * operatorMag) + extraValidatorShares - (depositShares * operatorMag * BCSF * dsf)
         */
⋮----
/**
         * 3. The attributable avs slashed shares should decrease by a factor of the BCSF
         * 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(User staker, Withdrawal memory, /*withdrawal*/ string memory err) internal {
⋮----
/**
     *
     *                      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_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 _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) {
````

## 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)
⋮----
/// 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
````

## 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/StrategyManager.sol";
import "src/contracts/strategies/StrategyFactory.sol";
import "src/contracts/strategies/StrategyBase.sol";
import "src/contracts/strategies/StrategyBaseTVLLimits.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/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 = 22_514_370; // Post Pectra Compatibility 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
⋮----
// Matching parameters to testnet
⋮----
// 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 {
⋮----
// 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 new implementation contracts and upgrade all proxies to point to them
_deployProxies(); // deploy proxies (if undeployed)
⋮----
function _deployProxies() public {
⋮----
// multichain
⋮----
/// Deploy an implementation contract for each contract in the system
function _deployImplementations() public {
⋮----
// 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
⋮----
// Upgrade All deployed strategy contracts to new base strategy
⋮----
// Upgrade existing strategy
⋮----
// Key Registrar
⋮----
function _initializeProxies() public noTracing {
⋮----
/// @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)
⋮----
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/libraries/Snapshots.sol";
import "src/contracts/libraries/OperatorSetLib.sol";
import "@openzeppelin/contracts/utils/structs/EnumerableSet.sol";
⋮----
contract AllocationManagerMock is Test {
⋮----
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 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 {
````

## 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/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
     * @param referenceTimestamp The reference timestamp to validate
     */
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(uint newMinWithdrawalDelayBlocks) external {}
⋮----
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 undelegate(address staker) external returns (bytes32[] memory withdrawalRoot) {
⋮----
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/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.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * 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.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * Emits a {Transfer} event.
     */
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.
     *
     * Requirements:
     *
     * - `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`.
     *
     * Requirements:
     *
     * - `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.
     *
     * Requirements:
     *
     * - `spender` cannot be the zero address.
     */
function increaseAllowance(address spender, uint addedValue) public virtual returns (bool) {
⋮----
/**
     * @dev Atomically decreases 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.
     *
     * Requirements:
     *
     * - `spender` cannot be the zero address.
     * - `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.
     *
     * Emits a {Transfer} event.
     *
     * Requirements:
     *
     * - `from` cannot be the zero address.
     * - `to` cannot be the zero address.
     * - `from` must have a balance of at least `amount`.
     */
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.
     *
     * Requirements:
     *
     * - `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.
     *
     * Requirements:
     *
     * - `account` cannot be 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.
     *
     * Requirements:
     *
     * - `owner` cannot be the zero address.
     * - `spender` 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
     * minting and burning.
     *
     * Calling conditions:
     *
     * - when `from` and `to` are both non-zero, `amount` of ``from``'s tokens
     * 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.
     * - `from` and `to` are never both zero.
     *
     * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].
     */
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
     * allowance.
     *
     * See {ERC20-_burn} and {ERC20-allowance}.
     *
     * Requirements:
     *
     * - the caller must have allowance for ``accounts``'s tokens of at least
     * `amount`.
     */
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(address, /*to*/ uint amount) public virtual {
⋮----
/**
     * @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.
     *
     * Requirements:
     *
     * - `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`.
     *
     * Requirements:
     *
     * - `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.
     *
     * Requirements:
     *
     * - `from` cannot be the zero address.
     * - `to` cannot be the zero address.
     * - `from` must have a balance of at least `amount`.
     */
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.
     *
     * Requirements:
     *
     * - `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.
     *
     * Requirements:
     *
     * - `account` cannot be 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.
     *
     * Requirements:
     *
     * - `owner` cannot be the zero address.
     * - `spender` 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
     * minting and burning.
     *
     * Calling conditions:
     *
     * - when `from` and `to` are both non-zero, `amount` of ``from``'s tokens
     * 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.
     * - `from` and `to` are never both zero.
     *
     * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].
     */
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*/ ) external pure returns (bool) {
````

## 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(address, /*caller*/ ITaskMailboxTypes.TaskParams memory /*taskParams*/ ) external view {
//TODO: Implement
⋮----
function handlePostTaskCreation(bytes32 /*taskHash*/ ) external {
⋮----
function validatePreTaskResultSubmission(address, /*caller*/ bytes32, /*taskHash*/ bytes memory, /*cert*/ bytes memory /*result*/ )
⋮----
function handlePostTaskResultSubmission(address, /*caller*/ bytes32 /*taskHash*/ ) external {
⋮----
function calculateTaskFee(ITaskMailboxTypes.TaskParams memory /*taskParams*/ ) external view returns (uint96) {
````

## 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 memory, /*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*/ ) external pure returns (address) {
⋮----
function getLatestReferenceTimestamp(OperatorSet memory /*operatorSet*/ ) external pure returns (uint32) {
⋮----
function getOperatorSetOwner(OperatorSet memory operatorSet) external view returns (address) {
// Return the configured owner, or the AVS address by default
⋮----
function latestReferenceTimestamp(OperatorSet memory /*operatorSet*/ ) external view returns (uint32) {
⋮----
function maxOperatorTableStaleness(OperatorSet memory /*operatorSet*/ ) external view returns (uint32) {
⋮----
function trySignatureVerification(
bytes32, /*msgHash*/
BN254.G1Point memory, /*aggPubkey*/
BN254.G2Point memory, /*apkG2*/
BN254.G1Point memory /*signature*/
⋮----
function getNonsignerOperatorInfo(OperatorSet memory, /*operatorSet*/ uint32, /*referenceTimestamp*/ uint /*operatorIndex*/ )
⋮----
function isNonsignerCached(OperatorSet memory, /*operatorSet*/ uint32, /*referenceTimestamp*/ uint /*operatorIndex*/ )
⋮----
function getOperatorSetInfo(OperatorSet memory, /*operatorSet*/ uint32 /*referenceTimestamp*/ )
⋮----
function isReferenceTimestampSet(OperatorSet memory, uint32) external pure returns (bool) {
⋮----
function getTotalStakeWeights(OperatorSet memory, /*operatorSet*/ uint32 /*referenceTimestamp*/ )
⋮----
function getOperatorCount(OperatorSet memory, /*operatorSet*/ uint32 /*referenceTimestamp*/ ) external pure returns (uint) {
⋮----
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 memory, /*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*/ ) external pure returns (address) {
⋮----
function getLatestReferenceTimestamp(OperatorSet memory /*operatorSet*/ ) external pure returns (uint32) {
⋮----
function getOperatorSetOwner(OperatorSet memory operatorSet) external view returns (address) {
// Return the configured owner, or the AVS address by default
⋮----
function latestReferenceTimestamp(OperatorSet memory /*operatorSet*/ ) external pure returns (uint32) {
⋮----
function maxOperatorTableStaleness(OperatorSet memory /*operatorSet*/ ) external pure returns (uint32) {
⋮----
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(OperatorSet memory, /*operatorSet*/ uint32, /*referenceTimestamp*/ uint /*operatorIndex*/ )
⋮----
function isNonsignerCached(OperatorSet memory, /*operatorSet*/ uint32, /*referenceTimestamp*/ uint /*operatorIndex*/ )
⋮----
function getOperatorSetInfo(OperatorSet memory, /*operatorSet*/ uint32 /*referenceTimestamp*/ )
⋮----
function isReferenceTimestampSet(OperatorSet memory, uint32) external pure returns (bool) {
⋮----
function getTotalStakeWeights(OperatorSet memory, /*operatorSet*/ uint32 /*referenceTimestamp*/ )
⋮----
function getOperatorCount(OperatorSet memory, /*operatorSet*/ uint32 /*referenceTimestamp*/ ) external pure returns (uint) {
⋮----
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 calldata, /*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*/ ) external pure returns (address) {
⋮----
function getLatestReferenceTimestamp(OperatorSet memory /*operatorSet*/ ) external pure returns (uint32) {
⋮----
function getOperatorSetOwner(OperatorSet memory operatorSet) external view returns (address) {
// Return the configured owner, or the AVS address by default
⋮----
function latestReferenceTimestamp(OperatorSet memory /*operatorSet*/ ) external view returns (uint32) {
⋮----
function maxOperatorTableStaleness(OperatorSet memory /*operatorSet*/ ) external view returns (uint32) {
⋮----
function getCachedSignerList(OperatorSet calldata, /*operatorSet*/ uint32 /*referenceTimestamp*/ )
⋮----
function getOperatorInfos(OperatorSet calldata, /*operatorSet*/ uint32 /*referenceTimestamp*/ )
⋮----
function getOperatorInfo(OperatorSet calldata, /*operatorSet*/ uint32, /*referenceTimestamp*/ uint /*operatorIndex*/ )
⋮----
function getOperatorCount(OperatorSet memory, /*operatorSet*/ uint32 /*referenceTimestamp*/ ) external pure returns (uint) {
⋮----
function getTotalStakes(OperatorSet calldata, /*operatorSet*/ uint32 /*referenceTimestamp*/ ) external pure returns (uint[] memory) {
⋮----
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 calldata, /*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*/ ) external pure returns (address) {
⋮----
function getLatestReferenceTimestamp(OperatorSet memory /*operatorSet*/ ) external pure returns (uint32) {
⋮----
function getOperatorSetOwner(OperatorSet memory operatorSet) external view returns (address) {
// Return the configured owner, or the AVS address by default
⋮----
function latestReferenceTimestamp(OperatorSet memory /*operatorSet*/ ) external pure returns (uint32) {
⋮----
function maxOperatorTableStaleness(OperatorSet memory /*operatorSet*/ ) external pure returns (uint32) {
⋮----
function getCachedSignerList(OperatorSet calldata, /*operatorSet*/ uint32 /*referenceTimestamp*/ )
⋮----
function getOperatorInfos(OperatorSet calldata, /*operatorSet*/ uint32 /*referenceTimestamp*/ )
⋮----
function getOperatorInfo(OperatorSet calldata, /*operatorSet*/ uint32, /*referenceTimestamp*/ uint /*operatorIndex*/ )
⋮----
function getOperatorCount(OperatorSet memory, /*operatorSet*/ uint32 /*referenceTimestamp*/ ) external pure returns (uint) {
⋮----
function getTotalStakes(OperatorSet calldata, /*operatorSet*/ uint32 /*referenceTimestamp*/ ) external pure returns (uint[] memory) {
⋮----
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/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*/ ) external view returns (uint) {
⋮----
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*/ ) external pure {}
⋮----
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/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)
⋮----
/**
     * Get expected post slash storage values
     * Assumes that:
     * 1. WAD is max before slash
     */
⋮----
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)
⋮----
// 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%
     * Validates:
     * 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:
     * 1. Events are emitted
     * 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.
     *
     * Asserts that:
     * 1. Events are emitted
     * 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
     * Asserts that:
     * 1. Events are emitted, including for deallocation
     * 2. Encumbered mag is updated
     * 3. Max mag is updated
     * 4. Calculations for `getAllocatableMagnitude` and `getAllocation` are correct
     * 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
     * Validates:
     * 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
     * Asserts that:
     * 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.
     * Validates:
     * 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
⋮----
contract AllocationManagerUnitTests_ModifyAllocations is AllocationManagerUnitTests {
⋮----
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.
⋮----
/**
     * @notice Regression tests for the bugfix where pending modifications were checked by
     * require(allocation.pendingDiff == 0, ModificationAlreadyPending());
     * which would overwrite the effectBlock, pendingDiff if a pendingDiff
     * of a deallocation was slashed to become 0.
     *
     * This test checks that the deallocationQueue is ascending ordered by effectBlocks
     */
function test_modifyAllocations_PendingDiffZero_CheckOrderedDeallocationQueue() public {
// Step 1: Register the operator to multiple operator sets
⋮----
// 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
⋮----
/**
     * @notice Regression tests for the bugfix where pending modifications were checked by
     * require(allocation.pendingDiff == 0, ModificationAlreadyPending());
     * which would overwrite the effectBlock, pendingDiff if a pendingDiff
     * of a deallocation was slashed to become 0.
     *
     * This test checks that the deallocationQueue is ascending ordered by effectBlocks
     * In this case the new modifyAllocations call is an allocation
     * where the effectBlock is increased and the deallocationQueue is unordered as well because the operator
     * allocationDelay configured to be long enough.
     */
function test_modifyAllocations_PendingDiffZero_Allocation() public {
⋮----
// Step 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.
     * Validates:
     * 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
     * Validates:
     * 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
     * Validates:
     * 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
     * Validates:
     * 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
     * Validates that:
     * 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.
     * Validates that:
     * 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
     * Validates:
     * 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
     * Validates:
     * 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) {
⋮----
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 testFuzz_createOperatorSets_Correctness(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_ZeroAddress(Randomness r) public rand(r) {
⋮----
function testRevert_createRedistributingOperatorSets_InvalidRedistributionRecipient(Randomness r) public rand(r) {
⋮----
function testFuzz_createRedistributingOperatorSets_Correctness(Randomness r) public rand(r) {
⋮----
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 {
⋮----
/**
     * Allocates half of magnitude for a single strategy to an operatorSet. Then allocates again. Slashes 50%
     * 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
⋮----
/**
     * Allocates to `firstMod` magnitude and then deallocate to `secondMod` magnitude
     * 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
     */
⋮----
/**
     * Allocates to `firstMod` magnitude and then deallocate to `secondMod` magnitude
     * 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)
````

## 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
     * Assumptions:
     * - operator is already a registered operator.
     * - 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
     * Assumptions:
     * - operator is already a registered operator.
     * - 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`
     * The set parameters should match the desired parameters (correct storage update)
     * 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)
⋮----
/**
     * @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`. `staker` holds beaconChainETHStrategy Shares
     * 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
     * - 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
⋮----
/**
     * @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)
     * but it should revert as the strategy has been fully slashed for the operator.
     * Assertion checks
     * - 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
⋮----
/**
     * @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)
     * but it should revert as the beaconChainStrategy has been fully slashed for the operator.
     * The function should pass with any `operatorSignature` input (since it should be unused)
     * Assertion checks
     * - beaconChainETHStrategy shares are unchanged 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_BeaconChainStrategyShares(
⋮----
// Set the operators magnitude for native restaking to be 0
⋮----
/**
     * @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)
     * and the strategy has already been slashed for the operator.
     * 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
     * - That the staker withdrawableShares is <= operatorShares (less due to rounding from non-WAD maxMagnitude)
     */
function testFuzz_OperatorWhoAcceptsAllStakers_AlreadySlashed_StrategyManagerShares(Randomness r) public rand(r) {
⋮----
// Expected staker scaling factor
⋮----
/**
     * @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)
     * and the strategy has already been slashed for the operator. `staker` holds beaconChainETHStrategy Shares
     * 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
     * - That the staker withdrawableShares is <= operatorShares (less due to rounding from non-WAD maxMagnitude)
     */
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
⋮----
/**
     * @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)
     * 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.
     * Assertion Checks
     * - Properly emitted events from `delegateTo`
     * - depositShares incremented for staker correctly
     * - withdrawableShares are correct
     * - depositScalingFactor is updated correctly
     * - operatorShares increase by withdrawableShares amount
     * - defaultOperator is an operator, staker is delegated to defaultOperator, staker is not an operator
     * - That the staker withdrawableShares is <= operatorShares (less due to rounding from non-WAD maxMagnitude)
     */
function testFuzz_OperatorWhoAcceptsAllStakers_AlreadySlashedAVSAndBeaconChain_beaconChainStrategyShares(Randomness r) public rand(r) {
⋮----
/**
     * @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`
     * Similar to tests above but now with staker who has both EigenPod and StrategyManager shares.
     * Assertion Checks for strategyMock and beaconChainETHStrategy
     * - 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
     * - That the staker withdrawableShares is <= operatorShares (less due to rounding from non-WAD maxMagnitude)
     */
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`
     * Similar to tests above but now with staker who has both EigenPod and StrategyManager shares.
     * The operator has been slashed prior to deposit for both strategies.
     * Assertion Checks for strategyMock and beaconChainETHStrategy
     * - 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, 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)
     * via the `staker` calling `DelegationManager.delegateTo`
     * 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
⋮----
/**
     * @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)
     * via the `staker` calling `DelegationManager.delegateTo`
     * 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)
     * Operator shares should increase by the amount of shares delegated
     * 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_StrategyManagerShares(Randomness r) public rand(r) {
⋮----
/**
     * @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)
     * via the `staker` calling `DelegationManager.delegateTo`
     * 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)
     * Operator beaconShares should increase by the amount of shares delegated if beaconShares > 0
     * 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_BeaconChainStrategyShares(Randomness r) public rand(r) {
⋮----
/**
     * @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)
     * via the `staker` calling `DelegationManager.delegateTo`
     * 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)
     * Operator beaconshares should increase by the amount of beaconShares delegated if beaconShares > 0
     * Operator strategy manager shares should icnrease by amount of shares
     * 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_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
⋮----
/**
     * @notice delegateTo test with operator's delegationApprover address set to a contract address
     * 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
⋮----
/**
     * @notice delegateTo test with operator's delegationApprover address set to a contract address that
     * 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
     * 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_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
⋮----
/**
     * @notice Verifies that `DelegationManager.increaseDelegatedShares` reverts when operator slashed 100% for a strategy
     * 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) {
⋮----
/**
     * @notice Verifies that `DelegationManager.increaseDelegatedShares` properly increases the delegated `shares` that the operator
     * who the `staker` is delegated to has in the strategy
     * @dev Checks that there is no change if the staker is not delegated
     */
function testFuzz_increaseDelegatedShares_slashedOperator(Randomness r) public rand(r) {
⋮----
// 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
     * 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_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 Verifies that the `undelegate` function properly queues a withdrawal for all shares of the staker
     * @notice The operator should have its shares slashed prior to the staker's deposit
     */
function testFuzz_undelegate_preSlashedOperator(Randomness r) public rand(r) {
⋮----
// 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
⋮----
/**
     * @notice Verifies that `DelegationManager.queueWithdrawals` properly queues a withdrawal for the `withdrawer`
     * from the `strategy` for the `sharesAmount`. Operator is slashed prior to the staker's deposit
     * - 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_preSlashedOperator(Randomness r) public rand(r) {
⋮----
// Slash the operator
⋮----
// Deposit for staker & delegate
⋮----
/**
     * @notice Verifies that `DelegationManager.queueWithdrawals` properly queues a withdrawal for the `withdrawer`
     * from the `strategy` for the `sharesAmount`. Operator is slashed while the staker is deposited
     * - 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_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
     * - Checks that event was emitted with correct withdrawalRoot and withdrawal
     */
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
⋮----
/**
     * @notice Verifies that `DelegationManager.queueWithdrawals` properly queues a withdrawal for the `withdrawer`
     * 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 staker is delegated to the operator
     * - 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
     * - Checks that event was emitted with correct withdrawalRoot and withdrawal
     */
function testFuzz_queueWithdrawal_MultipleStrats_nonSlashedOperator(Randomness r) public rand(r) {
⋮----
// Before queueWithdrawal state values
⋮----
// Post queueWithdrawal state values
⋮----
/**
     * @notice Verifies that `DelegationManager.queueWithdrawals` properly queues a withdrawal for the `withdrawer`
     * with multiple strategies and sharesAmounts. Operator has random maxMagnitudes for each strategy.
     * Depending on number of strategies randomized, deposits sharesAmounts into each strategy for the staker and delegates to operator.
     * For each strategy,
     * - Asserts that staker is delegated to the operator
     * - Asserts that shares for delegatedTo operator are decreased by `depositAmount`
     * - Asserts that staker cumulativeWithdrawalsQueued nonce is incremented
     * - Checks that event was emitted with correct withdrawalRoot and withdrawal
     */
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
⋮----
/**
     * @notice Verifies that `DelegationManager.queueWithdrawals` properly queues a withdrawal for the `withdrawer`
     * with multiple strategies and sharesAmounts. Operator has random maxMagnitudes for each strategy.
     * Depending on number of strategies randomized, deposits sharesAmounts into each strategy for the staker and delegates to operator.
     * After depositing, the operator gets slashed for each of the strategies and has new maxMagnitudes set.
     * For each strategy,
     * - Asserts that staker is delegated to the operator
     * - Asserts that shares for delegatedTo operator are decreased by `depositAmount`
     * - Asserts that staker cumulativeWithdrawalsQueued nonce is incremented
     * - Checks that event was emitted with correct withdrawalRoot and withdrawal
     */
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) {
⋮----
/**
     * @notice Verifies that `DelegationManager.completeQueuedWithdrawal` properly completes a queued withdrawal for the `withdrawer`
     * for a single strategy. Withdraws as tokens so there are no operator shares increase.
     * - Asserts that the withdrawalRoot is True before `completeQueuedWithdrawal` and False after
     * - 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
⋮----
/**
     * @notice Verifies that `DelegationManager.completeQueuedWithdrawal` properly completes a queued withdrawal for the `withdrawer`
     * for the BeaconChainStrategy. Withdraws as tokens so there are no operator shares increase.
     * - Asserts that the withdrawalRoot is True before `completeQueuedWithdrawal` and False after
     * - Asserts operatorShares is decreased after staker 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 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
⋮----
/**
     * @notice Verifies that `DelegationManager.completeQueuedWithdrawal` properly completes a queued withdrawal for the `withdrawer`
     * for the BeaconChainStrategy. Withdraws as tokens so there are no operator shares increase.
     * - Asserts that the withdrawalRoot is True before `completeQueuedWithdrawal` and False after
     * - Asserts operatorShares is decreased after staker is slashed and 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 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
⋮----
/**
     * @notice Verifies that `DelegationManager.completeQueuedWithdrawal` properly completes a queued withdrawal for the `withdrawer`
     * for a single strategy. Withdraws as shares so if the withdrawer is delegated, operator shares increase. In the test case, this only
     * happens if staker and withdrawer are fuzzed the same address (i.e. staker == withdrawer)
     * - Asserts that the withdrawalRoot is True before `completeQueuedWithdrawal` and False after
     * - Asserts if staker == withdrawer, operatorShares increase, otherwise operatorShares are unchanged
     * - Checks that event `WithdrawalCompleted` is emitted with withdrawalRoot
     */
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 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
⋮----
/**
     * @notice Fuzzed tests
     * Single staker with fuzzed starting shares and magnitude.
     * Slash 100 magnitude and fuzz deposit amount for 100 iterations.
     */
⋮----
function testFuzz_slashDepositRepeatedly_randDeposits(Randomness r) public rand(r) {
⋮----
/**
     * @notice Fuzzed tests
     * 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
⋮----
/**
     * @notice Fuzzed tests
     * For 500 stakers, deposit `shares` amount and delegate to the operator. After each staker delegates,
     * 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/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
     * @return signerPrivKeys Array of signer private keys
     */
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
     * @param numSigners Number of signers
     * @param numNonSigners Number of non-signers
     * @return operators Array of operator infos
     * @return operatorSetConfig Operator set configuration
     * @return referenceTimestamp Reference timestamp
     * @return nonSignerIndices Array of non-signer indices
     * @return signerPrivKeys Array of signer private keys
     */
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
⋮----
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
⋮----
abi.encodeWithSelector(EigenPodManager.initialize.selector, initialOwner, 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 {
⋮----
eigenPodManager.initialize(initialOwner, 0 /*initialPausedStatus*/ );
⋮----
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
⋮----
function testFuzz_withdrawRestakedBeaconChainETH(uint rand, uint randAmountWei) public {
⋮----
// ensure valid fuzzed wei amounts
⋮----
function testFuzz_withdrawRestakedBeaconChainETH_AmountGweiNotDivisibleByGwei(uint rand, uint randAmountWei) public {
⋮----
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 Holesky
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/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
⋮----
// 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/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
⋮----
// 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_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)
⋮----
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) {
⋮----
// Set UAM
⋮----
// Testing that the split has been initialized for the first time.
function testFuzz_setOperatorAVSSplitFirstTime(address operator, address avs, uint16 split)
⋮----
// 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
     * - correct event emitted
     * - submission nonce incrementation by numSubmissions, and rewards submission hashes being set in storage.
     * - rewards submission hash being set in storage
     * - token balances before and after of avs and rewardsCoordinator
     */
function testFuzz_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
⋮----
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
⋮----
/**
     * @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 RewardsForAllSubmitter and rewardsCoordinator
     */
function testFuzz_createRewardsForAllSubmission_SingleSubmission(uint startTimestamp, uint duration, uint amount) public {
⋮----
/**
     * @notice test multiple rewards submissions asserting for the following
     * - correct event emitted
     * - submission nonce incrementation by numSubmissions, and rewards submission hashes being set in storage.
     * - rewards submission hash being set in storage
     * - token balances before and after of createRewardsForAllSubmission submitter and rewardsCoordinator
     */
function testFuzz_createRewardsForAllSubmission_MultipleSubmissions(FuzzAVSRewardsSubmission memory param, uint numSubmissions)
⋮----
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)
⋮----
// 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)
⋮----
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
     * - 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_createOperatorDirectedAVSRewardsSubmission_SingleSubmission_UAM(address avs, uint startTimestamp, uint duration)
⋮----
/**
     * @notice test a multiple 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_createOperatorDirectedAVSRewardsSubmission_MultipleSubmissions(
⋮----
contract RewardsCoordinatorUnitTests_createOperatorDirectedOperatorSetRewardsSubmission is RewardsCoordinatorUnitTests {
⋮----
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_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)
⋮----
// 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/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
     * Constant value chosen to reasonably reduce attempted share inflation by the first depositor, while still
     * incurring reasonably small losses to depositors
     */
⋮----
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/test/utils/EigenLayerUnitTestSetup.sol";
import "../../contracts/permissions/PauserRegistry.sol";
⋮----
/**
 * @notice Unit testing of the StrategyFactory contract.
 * Contracts tested: StrategyFactory
 */
contract StrategyFactoryUnitTests is EigenLayerUnitTestSetup {
// Contract under test
⋮----
// Contract dependencies
⋮----
/// @notice Emitted when the `strategyBeacon` is changed
event StrategyBeaconModified(IBeacon previousBeacon, IBeacon newBeacon);
⋮----
/// @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 {
⋮----
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_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/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 {
⋮----
abi.encodeWithSelector(StrategyManager.initialize.selector, initialOwner, initialOwner, 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)
⋮----
/**
     * @notice testing removeDepositShares() function with 3 strategies deposited.
     * Removing Shares could result in removing from staker strategy list if depositAmounts[i] == sharesAmounts[i].
     * Only callable by DelegationManager
     */
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
     * higher than depositAmount
     */
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
     * @param taskHash The task hash
     * @param result The result data to create certificate for
     * @param referenceTimestamp The reference timestamp
     * @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
⋮----
// Check version before upgrade
⋮----
// Upgrade proxy to new implementation
⋮----
// Check version after upgrade
⋮----
// 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.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/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() {
⋮----
modifier noLogging() {
⋮----
/// 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 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_HOLESKY=""
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

*.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: 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.27'
    # If enabled, treats Solidity compiler warnings as errors, preventing artifact generation if warnings are present.
    deny_warnings = true 
    # 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"
    ]

    # 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
    # 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"
    # Whether or not to wrap comments at line_length
    wrap_comments = 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}"
    holesky = "${RPC_HOLESKY}"
````

## 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


### Environment Networks

Before diving into maintenance details, it's important to understand our environment network structure.

| Environment | Environment Network | Definition and Practices |
|-------------|---------------------|--------------------------|
| **mainnet** | mainnet-ethereum | - Production environment on Ethereum mainnet<br>- Single canonical mainnet instance in foreseeable future<br>- External facing with highest security requirements |
| **testnet** | testnet-holesky<br>testnet-sepolia<br>testnet-hoodi | - Test environments on Ethereum testnets (holesky, sepolia, etc.)<br>- Multiple testnet environments may exist simultaneously<br>- External facing, long-lived environments for both internal and external developers<br>- Used for integration testing, AVS onboarding, and community engagement |
| **preprod** | preprod-holesky<br>preprod-sepolia<br>preprod-hoodi | - Pre-production environments on Ethereum testnets<br>- Multiple preprod environments may exist simultaneously<br>- Internal facing for development team use<br>- Used for feature verification before promoting to testnet<br>- Provides safe environment for testing breaking changes |

For more details on our testing infrastructure strategy, see our blog post: [The Future of EigenLayer Testing: New & Improved Testnets & Tooling Coming Soon](https://www.blog.eigenlayer.xyz/the-future-of-eigenlayer-testing-new-and-improved-testnets-tooling-coming-soon/)


### 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`, `holesky`, `sepolia`, `hoodi`, and `base sepolia` are on the below versions:

| Environment | Version | Core Protocol Deployed | Supports Native Restaking | Supports Multichain |
| -------- | -------- | -------- | -------- | -------- | 
| Mainnet Ethereum | [`v1.8.1`](https://github.com/Layr-Labs/eigenlayer-contracts/releases/tag/v1.8.1) | 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 Holesky | [`v1.8.1`](https://github.com/Layr-Labs/eigenlayer-contracts/releases/tag/v1.8.1) | Yes | Yes | No |
| Testnet Sepolia | [`v1.8.1`](https://github.com/Layr-Labs/eigenlayer-contracts/releases/tag/v1.8.1) | Yes | No | Yes (source & destination) |
| Testnet Hoodi | [`v1.8.0`](https://github.com/Layr-Labs/eigenlayer-contracts/releases/tag/v1.8.0) | Yes | Yes | No |
| Testnet Base Sepolia | [`v1.8.1`](https://github.com/Layr-Labs/eigenlayer-contracts/releases/tag/v1.8.1) | 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.6.0/src/contracts/core/StrategyManager.sol) | [`0x858646372CC42E1A627fcE94aa7A7033e7CF075A`](https://etherscan.io/address/0x858646372CC42E1A627fcE94aa7A7033e7CF075A) | [`0x46ae...d123`](https://etherscan.io/address/0x46aefd30415be99e20169eE7046F65784B46d123) | 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.3.0/src/contracts/core/RewardsCoordinator.sol) | [`0x7750d328b314EfFa365A0402CcfD489B80B0adda`](https://etherscan.io/address/0x7750d328b314EfFa365A0402CcfD489B80B0adda) | [`0xa505...0aB`](https://etherscan.io/address/0xa505c0116aD65071F0130061F94745b7853220aB) | 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) |

###### 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) | [`0x5e4C39Ad7A3E881585e383dB9827EB4811f6F647`](https://etherscan.io/address/0x5e4C39Ad7A3E881585e383dB9827EB4811f6F647) | [`0x1b97...c66`](https://etherscan.io/address/0x1b97d8F963179C0e17E5F3d85cdfd9a31A49bc66) | 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.6.0/src/contracts/strategies/StrategyBase.sol) | [`0x0ed6703C298d28aE0878d1b28e88cA87F9662fE9`](https://etherscan.io/address/0x0ed6703c298d28ae0878d1b28e88ca87f9662fe9) | [`0xD4d1...E5B`](https://etherscan.io/address/0xD4d1746142642Db4c1ab17b03B9c58baac913E5B) | - 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.6.0/src/contracts/strategies/StrategyBaseTVLLimits.sol) | [`0x54945180dB7943c0ed0FEE7EdaB2Bd24620256bc`](https://etherscan.io/address/0x54945180dB7943c0ed0FEE7EdaB2Bd24620256bc) | [`0x62F7...f4E0`](https://etherscan.io/address/0x62F7226Fb9d615590EadB539713b250fB2fdf4E0) | 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.6.0/src/contracts/strategies/StrategyBaseTVLLimits.sol) | [`0x93c4b944D05dfe6df7645A86cd2206016c51564D`](https://etherscan.io/address/0x93c4b944D05dfe6df7645A86cd2206016c51564D) | [`0x62F7...f4E0`](https://etherscan.io/address/0x62F7226Fb9d615590EadB539713b250fB2fdf4E0) | 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.6.0/src/contracts/strategies/StrategyBaseTVLLimits.sol) | [`0x1BeE69b7dFFfA4E2d53C2a2Df135C388AD25dCD2`](https://etherscan.io/address/0x1BeE69b7dFFfA4E2d53C2a2Df135C388AD25dCD2) | [`0x62F7...f4E0`](https://etherscan.io/address/0x62F7226Fb9d615590EadB539713b250fB2fdf4E0) | 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.6.0/src/contracts/strategies/StrategyBaseTVLLimits.sol) | [`0x9d7eD45EE2E8FC5482fa2428f15C971e6369011d`](https://etherscan.io/address/0x9d7eD45EE2E8FC5482fa2428f15C971e6369011d) | [`0x62F7...f4E0`](https://etherscan.io/address/0x62F7226Fb9d615590EadB539713b250fB2fdf4E0) | 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.6.0/src/contracts/strategies/StrategyBaseTVLLimits.sol) | [`0x13760F50a9d7377e4F20CB8CF9e4c26586c658ff`](https://etherscan.io/address/0x13760F50a9d7377e4F20CB8CF9e4c26586c658ff) | [`0x62F7...f4E0`](https://etherscan.io/address/0x62F7226Fb9d615590EadB539713b250fB2fdf4E0) | 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.6.0/src/contracts/strategies/StrategyBaseTVLLimits.sol) | [`0xa4C637e0F704745D182e4D38cAb7E7485321d059`](https://etherscan.io/address/0xa4C637e0F704745D182e4D38cAb7E7485321d059) | [`0x62F7...f4E0`](https://etherscan.io/address/0x62F7226Fb9d615590EadB539713b250fB2fdf4E0) | 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.6.0/src/contracts/strategies/StrategyBaseTVLLimits.sol) | [`0x57ba429517c3473B6d34CA9aCd56c0e735b94c02`](https://etherscan.io/address/0x57ba429517c3473B6d34CA9aCd56c0e735b94c02) | [`0x62F7...f4E0`](https://etherscan.io/address/0x62F7226Fb9d615590EadB539713b250fB2fdf4E0) | 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.6.0/src/contracts/strategies/StrategyBaseTVLLimits.sol) | [`0x0Fe4F44beE93503346A3Ac9EE5A26b130a5796d6`](https://etherscan.io/address/0x0Fe4F44beE93503346A3Ac9EE5A26b130a5796d6) | [`0x62F7...f4E0`](https://etherscan.io/address/0x62F7226Fb9d615590EadB539713b250fB2fdf4E0) | 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.6.0/src/contracts/strategies/StrategyBaseTVLLimits.sol) | [`0x7CA911E83dabf90C90dD3De5411a10F1A6112184`](https://etherscan.io/address/0x7CA911E83dabf90C90dD3De5411a10F1A6112184) | [`0x62F7...f4E0`](https://etherscan.io/address/0x62F7226Fb9d615590EadB539713b250fB2fdf4E0) | 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.6.0/src/contracts/strategies/StrategyBaseTVLLimits.sol) | [`0x8CA7A5d6f3acd3A7A8bC468a8CD0FB14B6BD28b6`](https://etherscan.io/address/0x8CA7A5d6f3acd3A7A8bC468a8CD0FB14B6BD28b6) | [`0x62F7...f4E0`](https://etherscan.io/address/0x62F7226Fb9d615590EadB539713b250fB2fdf4E0) | 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.6.0/src/contracts/strategies/StrategyBaseTVLLimits.sol) | [`0xAe60d8180437b5C34bB956822ac2710972584473`](https://etherscan.io/address/0xAe60d8180437b5C34bB956822ac2710972584473) | [`0x62F7...f4E0`](https://etherscan.io/address/0x62F7226Fb9d615590EadB539713b250fB2fdf4E0) | 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.6.0/src/contracts/strategies/StrategyBaseTVLLimits.sol) | [`0x298aFB19A105D59E74658C4C334Ff360BadE6dd2`](https://etherscan.io/address/0x298aFB19A105D59E74658C4C334Ff360BadE6dd2) | [`0x62F7...f4E0`](https://etherscan.io/address/0x62F7226Fb9d615590EadB539713b250fB2fdf4E0) | 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.6.0/src/contracts/strategies/EigenStrategy.sol) | [`0xaCB55C530Acdb2849e6d4f36992Cd8c9D50ED8F7`](https://etherscan.io/address/0xaCB55C530Acdb2849e6d4f36992Cd8c9D50ED8F7) | [`0x530f...6be`](https://etherscan.io/address/0x530fDB7AdF7d489DF49c27e3d3512c0dD64886be) | 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 Holesky</summary>


You can view the deployed contract addresses below, or check out the code itself on the [`testnet-holesky`](https://github.com/Layr-Labs/eigenlayer-contracts/tree/testnet-holesky) branch.

###### Core

| Name | Proxy | Implementation | Notes |
| -------- | -------- | -------- | -------- |
| [`DelegationManager`](https://github.com/Layr-Labs/eigenlayer-contracts/blob/v1.5.0/src/contracts/core/DelegationManager.sol) | [`0xA44151489861Fe9e3055d95adC98FbD462B948e7`](https://holesky.etherscan.io/address/0xA44151489861Fe9e3055d95adC98FbD462B948e7) | [`0x39F2...b0CF4`](https://holesky.etherscan.io/address/0x39F23a044Ea7DB60b5392b964F2f9261B93b0CF4) | 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.5.0/src/contracts/core/StrategyManager.sol) | [`0xdfB5f6CE42aAA7830E94ECFCcAd411beF4d4D5b6`](https://holesky.etherscan.io/address/0xdfB5f6CE42aAA7830E94ECFCcAd411beF4d4D5b6) | [`0x4870...21a04`](https://holesky.etherscan.io/address/0x4870B0BbDD8360E49A15987B16590Ef917c21a04) | 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.5.0/src/contracts/pods/EigenPodManager.sol) | [`0x30770d7E3e71112d7A6b7259542D1f680a70e315`](https://holesky.etherscan.io/address/0x30770d7E3e71112d7A6b7259542D1f680a70e315) | [`0xf889...23AA`](https://holesky.etherscan.io/address/0xf889B045cdE04c9CB22FF0Ead6C66a72f3cb23AA) | 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.4.2/src/contracts/core/AVSDirectory.sol) | [`0x055733000064333CaDDbC92763c58BF0192fFeBf`](https://holesky.etherscan.io/address/0x055733000064333CaDDbC92763c58BF0192fFeBf) | [`0x331e...2506`](https://holesky.etherscan.io/address/0x331e3Bd9cf69562f6F9ade72BD3D9f271f1B2506) | 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.4.2/src/contracts/core/RewardsCoordinator.sol) | [`0xAcc1fb458a1317E886dB376Fc8141540537E68fE`](https://holesky.etherscan.io/address/0xAcc1fb458a1317E886dB376Fc8141540537E68fE) | [`0x4087...d41`](https://holesky.etherscan.io/address/0x40873dddA165258E1c5aE487f4842dac3946Ad41) | Proxy: [`TUP@4.7.1`](https://github.com/OpenZeppelin/openzeppelin-contracts/blob/v4.7.1/contracts/proxy/transparent/TransparentUpgradeableProxy.sol) |
| [`AllocationManager`](https://github.com/Layr-Labs/eigenlayer-contracts/blob/v1.5.0/src/contracts/core/AllocationManager.sol) | [`0x78469728304326CBc65f8f95FA756B0B73164462`](https://holesky.etherscan.io/address/0x78469728304326CBc65f8f95FA756B0B73164462) | [`0x45A1...A591`](https://holesky.etherscan.io/address/0x45A1bb44e2d8d2475185d0bcE480ce2e55c4A591) | 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.4.2/src/contracts/permissions/PermissionController.sol) | [`0x598cb226B591155F767dA17AfE7A2241a68C5C10`](https://holesky.etherscan.io/address/0x598cb226B591155F767dA17AfE7A2241a68C5C10) | [`0x7ab0...a2b9`](https://holesky.etherscan.io/address/0x7ab0ebd25d5ffe7527600ca5b2858c1a3faba2b9#code) | 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.2/src/contracts/strategies/StrategyFactory.sol) | [`0x9c01252B580efD11a05C00Aa42Dd3ac1Ec52DF6d`](https://holesky.etherscan.io/address/0x9c01252B580efD11a05C00Aa42Dd3ac1Ec52DF6d) | [`0x84aa...a7d`](https://holesky.etherscan.io/address/0x84aaD0F753b84Cd68F36Ff207DDfA0f2865b1a7d) | 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.5.0/src/contracts/strategies/StrategyBase.sol) | [`0xd3c6C6BA4E40dB9288c6a2077e5635344F8aFA4F`](https://holesky.etherscan.io/address/0xd3c6C6BA4E40dB9288c6a2077e5635344F8aFA4F) | [`0x62cd...B86d`](https://holesky.etherscan.io/address/0x62cda01F3FbaB32FEe9E08094D9766D77566B86d) | - 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 (stETH)`](https://github.com/Layr-Labs/eigenlayer-contracts/blob/v1.5.0/src/contracts/strategies/StrategyBaseTVLLimits.sol) | [`0x7D704507b76571a51d9caE8AdDAbBFd0ba0e63d3`](https://holesky.etherscan.io/address/0x7D704507b76571a51d9caE8AdDAbBFd0ba0e63d3) | [`0x332b...B518`](https://holesky.etherscan.io/address/0x332b384D7100bc8A6D1d1B99fa5D60834ac4B518) | 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.5.0/src/contracts/strategies/StrategyBaseTVLLimits.sol) | [`0x3A8fBdf9e77DFc25d09741f51d3E181b25d0c4E0`](https://holesky.etherscan.io/address/0x3A8fBdf9e77DFc25d09741f51d3E181b25d0c4E0) | [`0x332b...B518`](https://holesky.etherscan.io/address/0x332b384D7100bc8A6D1d1B99fa5D60834ac4B518) | Proxy: [`TUP@4.7.1`](https://github.com/OpenZeppelin/openzeppelin-contracts/blob/v4.7.1/contracts/proxy/transparent/TransparentUpgradeableProxy.sol) |
| [`StrategyBase (WETH)`](https://github.com/Layr-Labs/eigenlayer-contracts/blob/v1.5.0/src/contracts/strategies/StrategyBaseTVLLimits.sol) | [`0x80528D6e9A2BAbFc766965E0E26d5aB08D9CFaF9`](https://holesky.etherscan.io/address/0x80528D6e9A2BAbFc766965E0E26d5aB08D9CFaF9) | [`0x332b...B518`](https://holesky.etherscan.io/address/0x332b384D7100bc8A6D1d1B99fa5D60834ac4B518) | 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.5.0/src/contracts/strategies/StrategyBaseTVLLimits.sol) | [`0x05037A81BD7B4C9E0F7B430f1F2A22c31a2FD943`](https://holesky.etherscan.io/address/0x05037A81BD7B4C9E0F7B430f1F2A22c31a2FD943) | [`0x332b...B518`](https://holesky.etherscan.io/address/0x332b384D7100bc8A6D1d1B99fa5D60834ac4B518) | 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.5.0/src/contracts/strategies/StrategyBaseTVLLimits.sol) | [`0x9281ff96637710Cd9A5CAcce9c6FAD8C9F54631c`](https://holesky.etherscan.io/address/0x9281ff96637710Cd9A5CAcce9c6FAD8C9F54631c) | [`0x332b...B518`](https://holesky.etherscan.io/address/0x332b384D7100bc8A6D1d1B99fa5D60834ac4B518) | 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.5.0/src/contracts/strategies/StrategyBaseTVLLimits.sol) | [`0x31B6F59e1627cEfC9fA174aD03859fC337666af7`](https://holesky.etherscan.io/address/0x31B6F59e1627cEfC9fA174aD03859fC337666af7) | [`0x332b...B518`](https://holesky.etherscan.io/address/0x332b384D7100bc8A6D1d1B99fa5D60834ac4B518) | 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.5.0/src/contracts/strategies/StrategyBaseTVLLimits.sol) | [`0x46281E3B7fDcACdBa44CADf069a94a588Fd4C6Ef`](https://holesky.etherscan.io/address/0x46281E3B7fDcACdBa44CADf069a94a588Fd4C6Ef) | [`0x332b...B518`](https://holesky.etherscan.io/address/0x332b384D7100bc8A6D1d1B99fa5D60834ac4B518) | Proxy: [`TUP@4.7.1`](https://github.com/OpenZeppelin/openzeppelin-contracts/blob/v4.7.1/contracts/proxy/transparent/TransparentUpgradeableProxy.sol) |
| [`StrategyBase (cbETH)`](https://github.com/Layr-Labs/eigenlayer-contracts/blob/v1.5.0/src/contracts/strategies/StrategyBaseTVLLimits.sol) | [`0x70EB4D3c164a6B4A5f908D4FBb5a9cAfFb66bAB6`](https://holesky.etherscan.io/address/0x70EB4D3c164a6B4A5f908D4FBb5a9cAfFb66bAB6) | [`0x332b...B518`](https://holesky.etherscan.io/address/0x332b384D7100bc8A6D1d1B99fa5D60834ac4B518) | 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.5.0/src/contracts/strategies/StrategyBaseTVLLimits.sol) | [`0xaccc5A86732BE85b5012e8614AF237801636F8e5`](https://holesky.etherscan.io/address/0xaccc5A86732BE85b5012e8614AF237801636F8e5) | [`0x332b...B518`](https://holesky.etherscan.io/address/0x332b384D7100bc8A6D1d1B99fa5D60834ac4B518) | 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.5.0/src/contracts/strategies/StrategyBaseTVLLimits.sol) | [`0x7673a47463F80c6a3553Db9E54c8cDcd5313d0ac`](https://holesky.etherscan.io/address/0x7673a47463F80c6a3553Db9E54c8cDcd5313d0ac) | [`0x332b...B518`](https://holesky.etherscan.io/address/0x332b384D7100bc8A6D1d1B99fa5D60834ac4B518) | Proxy: [`TUP@4.7.1`](https://github.com/OpenZeppelin/openzeppelin-contracts/blob/v4.7.1/contracts/proxy/transparent/TransparentUpgradeableProxy.sol) |
| [`StrategyBase (reALT)`](https://github.com/Layr-Labs/eigenlayer-contracts/blob/v1.5.0/src/contracts/strategies/StrategyBaseTVLLimits.sol) | [`0xAD76D205564f955A9c18103C4422D1Cd94016899`](https://holesky.etherscan.io/address/0xAD76D205564f955A9c18103C4422D1Cd94016899) | [`0x332b...B518`](https://holesky.etherscan.io/address/0x332b384D7100bc8A6D1d1B99fa5D60834ac4B518) | Proxy: [`TUP@4.7.1`](https://github.com/OpenZeppelin/openzeppelin-contracts/blob/v4.7.1/contracts/proxy/transparent/TransparentUpgradeableProxy.sol) |
| [`StrategyBase (EO)`](https://github.com/Layr-Labs/eigenlayer-contracts/blob/v1.5.0/src/contracts/strategies/StrategyBaseTVLLimits.sol) | [`0x78dBcbEF8fF94eC7F631c23d38d197744a323868`](https://holesky.etherscan.io/address/0x78dBcbEF8fF94eC7F631c23d38d197744a323868) | [`0x332b...B518`](https://holesky.etherscan.io/address/0x332b384D7100bc8A6D1d1B99fa5D60834ac4B518) | 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.5.0/src/contracts/strategies/EigenStrategy.sol) | [`0x43252609bff8a13dFe5e057097f2f45A24387a84`](https://holesky.etherscan.io/address/0x43252609bff8a13dFe5e057097f2f45A24387a84) | [`0xd673...2b99`](https://holesky.etherscan.io/address/0xd673a9Ee9DD278aED0705161b9D264e3F2296b99) | Proxy: [`TUP@4.7.1`](https://github.com/OpenZeppelin/openzeppelin-contracts/blob/v4.7.1/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) | [`0x7261C2bd75a7ACE1762f6d7FAe8F63215581832D`](https://holesky.etherscan.io/address/0x7261C2bd75a7ACE1762f6d7FAe8F63215581832D) | [`0x2742...0aD9`](https://holesky.etherscan.io/address/0x2742bd43b254f0199Bb5020CB477Ff9Ad3A80aD9) | - 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) | [`0x3B78576F7D7230049bE2c915629b31122C3FbF88`](https://holesky.etherscan.io/address/0x3B78576F7D7230049bE2c915629b31122C3FbF88) | [`0xfF1e...68F0`](https://holesky.etherscan.io/address/0xfF1e23C37EC543684cf866785c0626c2Ac7468F0) | 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.4.2/src/contracts/token/BackingEigen.sol) | [`0x275cCf9Be51f4a6C94aBa6114cdf2a4c45B9cb27`](https://holesky.etherscan.io/address/0x275cCf9Be51f4a6C94aBa6114cdf2a4c45B9cb27) | [`0x05ad...E05c`](https://holesky.etherscan.io/address/0x05adA1C66DdDD7c36705bC23a4d50dBa72E4E05c) | 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.2/src/contracts/permissions/PauserRegistry.sol) | - | [`0x41Db...ec1D`](https://holesky.etherscan.io/address/0x41Dbe7BbacA97D986FCF6f5203b98Ec02412ec1D) | |
| [`OZ: TimelockController`](https://github.com/OpenZeppelin/openzeppelin-contracts/blob/release-v4.7/contracts/governance/TimelockController.sol) | - | [`0x5e83c7d195318A5acf46B29E5810DdC323b2F6fD`](https://holesky.etherscan.io/address/0x5e83c7d195318A5acf46B29E5810DdC323b2F6fD) | |
| [`OZ: Proxy Admin`](https://github.com/OpenZeppelin/openzeppelin-contracts/blob/v4.7.1/contracts/proxy/transparent/ProxyAdmin.sol) | - | [`0xDB023566064246399b4AE851197a97729C93A6cf`](https://holesky.etherscan.io/address/0xDB023566064246399b4AE851197a97729C93A6cf) | |
| [`Pauser Multisig`](https://github.com/safe-global/safe-contracts/blob/v1.3.0/contracts/GnosisSafe.sol) | [`0x53410249ec7d3a3F9F1ba3912D50D6A3Df6d10A7`](https://holesky.etherscan.io/address/0x53410249ec7d3a3F9F1ba3912D50D6A3Df6d10A7) | [`0xd9db...9552`](https://holesky.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) | [`0xCb8d2f9e55Bc7B1FA9d089f9aC80C583D2BDD5F7`](https://holesky.etherscan.io/address/0xCb8d2f9e55Bc7B1FA9d089f9aC80C583D2BDD5F7) | [`0xd9db...9552`](https://holesky.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) | [`0x28Ade60640fdBDb2609D8d8734D1b5cBeFc0C348`](https://holesky.etherscan.io/address/0x28Ade60640fdBDb2609D8d8734D1b5cBeFc0C348) | [`0xd9db...9552`](https://holesky.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) | [`0xfaEF7338b7490b9E272d80A1a39f4657cAf2b97d`](https://holesky.etherscan.io/address/0xfaEF7338b7490b9E272d80A1a39f4657cAf2b97d) | [`0xd9db...9552`](https://holesky.etherscan.io/address/0xd9db270c1b5e3bd161e8c8503c55ceabee709552) | Proxy: [`Gnosis@1.3.0`](https://github.com/safe-global/safe-contracts/blob/v1.3.0/contracts/proxies/GnosisSafeProxy.sol) |

</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 Holesky | 
| [`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://holesky.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://holesky.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://holesky.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://holesky.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"
}
````
